diff --git a/beszel-agent/Makefile b/beszel-agent/Makefile
index 63c130686..47d850017 100644
--- a/beszel-agent/Makefile
+++ b/beszel-agent/Makefile
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=beszel
-PKG_VERSION:=0.21.1
-PKG_RELEASE:=14
+PKG_VERSION:=0.21.2
+PKG_RELEASE:=15
PKG_SOURCE:=beszel-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/henrygd/beszel/tar.gz/v$(PKG_VERSION)?
diff --git a/luci-app-3ginfo-lite/LICENSE b/luci-app-3ginfo-lite/LICENSE
deleted file mode 100644
index f288702d2..000000000
--- a/luci-app-3ginfo-lite/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/luci-app-3ginfo-lite/Makefile b/luci-app-3ginfo-lite/Makefile
deleted file mode 100644
index 69606117a..000000000
--- a/luci-app-3ginfo-lite/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Copyright 2021-2025 Rafał Wabik - IceG - From eko.one.pl forum
-#
-# Licensed to the GNU General Public License v3.0.
-#
-
-include $(TOPDIR)/rules.mk
-
-LUCI_TITLE:=LuCI JS Support for 3ginfo-lite
-LUCI_DESCRIPTION:=LuCI JS interface for the 3ginfo-lite. The package allows you to view the parameters of the mobile internet connection.
-LUCI_DEPENDS:=+sms-tool +comgt +kmod-usb-serial-option
-
-PKG_NAME:=luci-app-3ginfo-lite
-PKG_VERSION:=1.0.76
-PKG_RELEASE:=1
-PKG_MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
-
-include $(TOPDIR)/feeds/luci/luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0-20.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0-20.png
deleted file mode 100644
index 5af4a3761..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0-20.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0.png
deleted file mode 100644
index a67a40bd7..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-0.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-20-40.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-20-40.png
deleted file mode 100644
index eaaa3d396..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-20-40.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-40-60.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-40-60.png
deleted file mode 100644
index 13aed1b97..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-40-60.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-60-80.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-60-80.png
deleted file mode 100644
index 306db1243..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-60-80.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-80-100.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-80-100.png
deleted file mode 100644
index c8b9c2376..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/3ginfo-80-100.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/ctime.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/ctime.png
deleted file mode 100644
index 7220b3d59..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/ctime.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/sim1m.png b/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/sim1m.png
deleted file mode 100644
index e8e0ea330..000000000
Binary files a/luci-app-3ginfo-lite/htdocs/luci-static/resources/icons/sim1m.png and /dev/null differ
diff --git a/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js b/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js
deleted file mode 100644
index 2fb8e779d..000000000
--- a/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-'require form';
-'require fs';
-'require view';
-'require uci';
-'require ui';
-'require tools.widgets as widgets'
-
-/*
- Copyright 2021-2024 Rafał Wabik - IceG - From eko.one.pl forum
-
- Licensed to the GNU General Public License v3.0.
-*/
-
-return view.extend({
- load: function() {
- return fs.list('/dev').then(function(devs) {
- return devs.filter(function(dev) {
- return dev.name.match(/^ttyUSB/) || dev.name.match(/^cdc-wdm/) || dev.name.match(/^ttyACM/) || dev.name.match(/^mhi_/) || dev.name.match(/^wwan/);
- });
- });
- },
-
- render: function(devs) {
- var m, s, o;
- m = new form.Map('3ginfo', _('Configuration 3ginfo-lite'), _('Configuration panel for the 3ginfo-lite application.'));
-
- s = m.section(form.TypedSection, '3ginfo', '', null);
- s.anonymous = true;
-
-/* Old config
- o = s.option(widgets.DeviceSelect, 'network', _('Interface'),
- _('Network interface for Internet access.')
- );
- o.noaliases = false;
- o.default = 'wan';
- o.rmempty = false;
-*/
-
- o = s.option(widgets.NetworkSelect, 'network', _('Interface'),
- _('Network interface for Internet access.')
- );
- o.exclude = s.section;
- o.nocreate = true;
- o.rmempty = false;
- o.default = 'wan';
-
- o = s.option(form.Value, 'device',
- _('IP adress / Port for communication with the modem'),
- _("Select the appropriate settings. \
- Traditional modem. \
- Select one of the available ttyUSBX ports. \
- HiLink modem. \
- Enter the IP address 192.168.X.X under which the modem is available."));
- devs.sort((a, b) => a.name > b.name);
- devs.forEach(dev => o.value('/dev/' + dev.name));
- o.placeholder = _('Please select a port');
- o.rmempty = true;
-
- s = m.section(form.TypedSection, '3ginfo', null);
- s.anonymous = true;
- s.addremove = false;
-
- s.tab('bts1', _('BTS search settings'));
- s.anonymous = true;
-
- o = s.taboption('bts1', form.DummyValue, '_dummy');
- o.rawhtml = true;
- o.default = '
' +
- _('Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location.') +
- '
2. The correct installation of the SIM card in the modem.
\
- 3. Port for communication with the modem.
')), 'info');
- }
- else {
- if (json.connt == '' || json.connt == '-') {
- ui.addNotification(null, E('p', _('There is a problem reading connection data. \
-
Please check: \
-
1. Connection of the modem to the internet, the correctness of the entered APN. Some modems need to force the APN on the modem using at commands to connect to internet.
\
- 2. Check that the correct interface assigned to the modem is selected. The default name of the interface in the package is wan.
Traditional "
-"modem. Select one of the available ttyUSBX "
-"ports.
HiLink modem. Enter the IP address "
-"192.168.X.X under which the modem is available."
-msgstr ""
-"Passende Einstellung wählen.
Traditionelles "
-"modem. Einen der verfügbaren ttyUSBX"
-"Port wählen.
MHiLink Modem. IP-Adresse wie"
-"192.168.X.X angeben, unter der das Modem erreichbar ist."
-
-msgid "Very good"
-msgstr "Sehr gut"
-
-msgid "Good"
-msgstr "Gut"
-
-msgid "Weak"
-msgstr "Schwach"
-
-msgid "Very weak"
-msgstr "Sehr schwach"
-
-msgid "Excellent"
-msgstr "Exzellent"
-
-msgid "Good"
-msgstr "Gut"
-
-msgid "Mid cell"
-msgstr "Zellmitte"
-
-msgid "Cell edge"
-msgstr "Zellrand"
-
-msgid "SIM status"
-msgstr "SIM-Status"
-
-msgid "Not registered"
-msgstr "Nicht registriert"
-
-msgid "Registered"
-msgstr "Registriert"
-
-msgid "Registered (roaming)"
-msgstr "Registriert (roaming)"
-
-msgid "Searching.."
-msgstr "Suche.."
-
-msgid "Registering denied"
-msgstr "Registrierung abgelehnt"
-
-msgid "Waiting to read data from the modem..."
-msgstr "Daten des Modems werden gelesen..."
-
-msgid "Waiting for connection data..."
-msgstr "Auf Datenverbindung warten..."
-
-msgid "BTS Search"
-msgstr "BTS-Suche"
-
-msgid "Search"
-msgstr "Suche"
-
-msgid "Search BTS using Cell ID"
-msgstr "BTS-Suche mit der Cell ID"
-
-msgid "Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location."
-msgstr "Hinweis: Um eine BTS-Suchmaschine einzustellen muss nur eine Webseite für den aktuellen Standort angegeben werden."
-
-msgid "BTS search settings"
-msgstr "Einstellungen BTS-Suche"
-
-msgid "Website to search for BTS"
-msgstr "Webseite für BTS-Suche"
-
-msgid "Select a website for searching."
-msgstr "Webseite für dir Suche auswählen."
-
-msgid "SIM Slot"
-msgstr "SIM-Slot"
diff --git a/luci-app-3ginfo-lite/po/it/3ginfo.po b/luci-app-3ginfo-lite/po/it/3ginfo.po
deleted file mode 100644
index 157d8fcc0..000000000
--- a/luci-app-3ginfo-lite/po/it/3ginfo.po
+++ /dev/null
@@ -1,167 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "Information about 3G/4G/5G connection"
-msgstr "Informazioni sulla connessione 3G/4G/5G"
-
-msgid "More information about the 3ginfo on the %seko.one.pl forum%s."
-msgstr "Ulteriori informazioni su 3ginfo sul %sforum eko.one.pl%s."
-
-msgid "eko.one.pl forum"
-msgstr "forum eko.one.pl"
-
-msgid "Details"
-msgstr "Dettagli"
-
-msgid "USB debug information"
-msgstr "Informazioni di debug USB"
-
-msgid "Configuration"
-msgstr "Configurazione"
-
-msgid "General Information"
-msgstr "Informazioni generali"
-
-msgid "Modem Information"
-msgstr "Informazioni sul modem"
-
-msgid "Cell / Signal Information"
-msgstr "Informazioni sulla cella / segnale"
-
-msgid "Technology"
-msgstr "Tecnologia"
-
-msgid "Operator"
-msgstr "Operatore"
-
-msgid "Signal strength"
-msgstr "Potenza segnale"
-
-msgid "Connection statistics"
-msgstr "Statistiche di connessione"
-
-msgid "Modem type"
-msgstr "Tipo di modem"
-
-msgid "Additional information"
-msgstr "Informazioni aggiuntive"
-
-msgid "Revision / Firmware"
-msgstr "Revisione / Firmware"
-
-msgid "IP adress / Communication Port"
-msgstr "Indirizzo IP / Porta di comunicazione"
-
-msgid "Chip Temperature"
-msgstr "Temperatura del chip"
-
-msgid "Configuration 3ginfo-lite"
-msgstr "Configurazione 3ginfo-lite"
-
-msgid "Configuration panel for the 3ginfo-lite application."
-msgstr "Pannello di configurazione per l'applicazione 3ginfo-lite."
-
-msgid "Network"
-msgstr "Rete"
-
-msgid "IP adress / Port for communication with the modem"
-msgstr "Indirizzo IP / Porta per la comunicazione con il modem"
-
-msgid "Protocol"
-msgstr "Protocollo"
-
-msgid ""
-"Select the appropriate settings.
Traditional "
-"modem. Select one of the available ttyUSBX "
-"ports.
HiLink modem. Enter the IP address "
-"192.168.X.X under which the modem is available."
-msgstr ""
-"Seleziona le impostazioni appropriate.
Modem "
-"tradizionale. Seleziona una delle porte ttyUSBX "
-"disponibili.
Modem HiLink. Inserisci l'indirizzo IP "
-"192.168.X.X sotto il quale il modem è disponibile."
-
-msgid "Very good"
-msgstr "Molto buono"
-
-msgid "Good"
-msgstr "Buono"
-
-msgid "Weak"
-msgstr "Debole"
-
-msgid "Very weak"
-msgstr "Molto debole"
-
-msgid "Excellent"
-msgstr "Eccellente"
-
-msgid "Good"
-msgstr "Buono"
-
-msgid "Mid cell"
-msgstr "Cella media"
-
-msgid "Cell edge"
-msgstr "Margine della cella"
-
-msgid "SIM status"
-msgstr "Stato SIM"
-
-msgid "Not registered"
-msgstr "Non registrato"
-
-msgid "Registered"
-msgstr "Registrato"
-
-msgid "Registered (roaming)"
-msgstr "Registrato (in roaming)"
-
-msgid "Searching.."
-msgstr "Ricerca.."
-
-msgid "Registering denied"
-msgstr "Registrazione negata"
-
-msgid "Waiting to read data from the modem..."
-msgstr "In attesa di leggere i dati dal modem..."
-
-msgid "Waiting for connection data..."
-msgstr "In attesa dei dati di connessione..."
-
-msgid "BTS Search"
-msgstr "Ricerca BTS"
-
-msgid "Search"
-msgstr "Cerca"
-
-msgid "Search BTS using Cell ID"
-msgstr "Cerca la BTS utilizzando l'ID della cella"
-
-msgid "Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location."
-msgstr "Suggerimento: Per configurare un motore di ricerca BTS, devi solo selezionare il sito web dedicato alla tua posizione."
-
-msgid "BTS search settings"
-msgstr "Impostazioni di ricerca BTS"
-
-msgid "Website to search for BTS"
-msgstr "Sito web per cercare BTS"
-
-msgid "Select a website for searching."
-msgstr "Seleziona un sito web per la ricerca."
-
-msgid "SIM Slot"
-msgstr "Slot SIM"
-
-msgid "Customizing the appearance of the package"
-msgstr "Personalizzazione dell'aspetto del pacchetto"
-
-msgid "Hint: The settings below allow you to customize the appearance of the progress bars."
-msgstr "Suggerimento: Le impostazioni qui sotto ti consentono di personalizzare l'aspetto delle barre di avanzamento."
-
-msgid "The width of the progress bars"
-msgstr "Larghezza delle barre di avanzamento"
-
-msgid "Select the width of the progress bars."
-msgstr "Seleziona la larghezza delle barre di avanzamento."
-
diff --git a/luci-app-3ginfo-lite/po/pl/3ginfo.po b/luci-app-3ginfo-lite/po/pl/3ginfo.po
deleted file mode 100644
index e19bd0d4c..000000000
--- a/luci-app-3ginfo-lite/po/pl/3ginfo.po
+++ /dev/null
@@ -1,223 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "Information about 3G/4G/5G connection"
-msgstr "Informacja o statusie połączenia 3G/4G/5G"
-
-msgid "More information about the 3ginfo on the %seko.one.pl forum%s."
-msgstr "Więcej informacji o 3ginfo na %sforum eko.one.pl%s."
-
-msgid "eko.one.pl forum"
-msgstr "forum eko.one.pl"
-
-msgid "Details"
-msgstr "Szczegóły"
-
-msgid "USB debug information"
-msgstr "Debugowanie portu USB"
-
-msgid "Configuration"
-msgstr "Konfiguracja"
-
-msgid "General Information"
-msgstr "Informacje ogólne"
-
-msgid "Modem Information"
-msgstr "Informacje o modemie"
-
-msgid "Cell / Signal Information"
-msgstr "Informacje o sieci / sygnale"
-
-msgid "Technology"
-msgstr "Technologia"
-
-msgid "Operator"
-msgstr "Operator"
-
-msgid "Signal strength"
-msgstr "Siła sygnału"
-
-msgid "Connection statistics"
-msgstr "Statystyki połączenia"
-
-msgid "Modem type"
-msgstr "Typ modemu"
-
-msgid "Additional information"
-msgstr "Informacje dodatkowe"
-
-msgid "Revision / Firmware"
-msgstr "Rewizja / Wersja firmware"
-
-msgid "IP adress / Communication Port"
-msgstr "Adres IP / Port do komunikacji"
-
-msgid "Chip Temperature"
-msgstr "Temperatura układu"
-
-msgid "Configuration 3ginfo-lite"
-msgstr "Konfiguracja 3ginfo-lite"
-
-msgid "Configuration panel for the 3ginfo-lite application."
-msgstr "Panel konfiguracyjny dla aplikacji 3ginfo-lite."
-
-msgid "Network"
-msgstr "Sieć"
-
-msgid "IP adress / Port for communication with the modem"
-msgstr "Adres IP / Port do komunikacji z modemem"
-
-msgid "Protocol"
-msgstr "Protokół"
-
-msgid ""
-"Select the appropriate settings.
Traditional "
-"modem. Select one of the available ttyUSBX "
-"ports.
HiLink modem. Enter the IP address "
-"192.168.X.X under which the modem is available."
-msgstr ""
-"Wybierz odpowiednie ustawienia.
Tradycyjny "
-"modem. Wybierz jeden z dostępnych portów "
-"ttyUSBX.
Modem typu HiLink. Wprowadź adres IP "
-"192.168.X.X pod którym dostępny jest modem."
-
-msgid "Very good"
-msgstr "Bardzo dobry"
-
-msgid "Good"
-msgstr "Dobry"
-
-msgid "Weak"
-msgstr "Słaby"
-
-msgid "Very weak"
-msgstr "Bardzo słaby"
-
-msgid "Excellent"
-msgstr "Doskonały"
-
-msgid "Good"
-msgstr "Dobry"
-
-msgid "Mid cell"
-msgstr "Średni zasięg"
-
-msgid "Cell edge"
-msgstr "Na krawędzi zasięgu"
-
-msgid "SIM status"
-msgstr "Status karty SIM"
-
-msgid "Not registered"
-msgstr "Nie zalogowana do sieci"
-
-msgid "Registered"
-msgstr "Zalogowana do sieci"
-
-msgid "Registered (roaming)"
-msgstr "Zalogowana do sieci (roaming)"
-
-msgid "Registered, only SMS"
-msgstr "Zalogowana do sieci, tylko SMS"
-
-msgid "Registered (roaming), only SMS"
-msgstr "Zalogowana do sieci (roaming), tylko SMS"
-
-msgid "Searching.."
-msgstr "Wyszukiwanie.."
-
-msgid "Registering denied"
-msgstr "Odmowa zalogowana do sieci"
-
-msgid "Waiting to read data from the modem..."
-msgstr "Oczekiwanie na odczyt danych z modemu..."
-
-msgid "Waiting for connection data..."
-msgstr "Oczekiwanie na dane połączenia..."
-
-msgid "BTS Search"
-msgstr "Lokalizacja stacji bazowej"
-
-msgid "Search"
-msgstr "Szukaj"
-
-msgid "Search BTS using Cell ID"
-msgstr "Wyszukaj BTS po Cell ID"
-
-msgid "Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location."
-msgstr "Wskazówka: Aby skonfigurować wyszukiwarkę BTS, wystarczy wybrać stronę odpowiednią dla swojej lokalizacji."
-
-msgid "BTS search settings"
-msgstr "Ustawienia wyszukiwania stacji bazowej"
-
-msgid "Website to search for BTS"
-msgstr "Strona do wyszukiwania BTS"
-
-msgid "Select a website for searching."
-msgstr "Wybierz stronę internetową służącą do wyszukiwania."
-
-msgid "SIM Slot"
-msgstr "Slot SIM"
-
-msgid "Problem with registering to the network, check the SIM card."
-msgstr "Problem z rejestracją do sieci, sprawdź kartę SIM."
-
-msgid "SIM PIN required"
-msgstr "Wymagany jest kod PIN dla karty SIM"
-
-msgid "SIM PUK required"
-msgstr "Wymagany jest kod PUK dla karty SIM"
-
-msgid "SIM failure"
-msgstr "Awaria karty SIM"
-
-msgid "SIM busy"
-msgstr "Karta SIM jest zajęta"
-
-msgid "SIM wrong"
-msgstr "Nieprawidłowa karta SIM"
-
-msgid "SIM PIN2 required"
-msgstr "Wymagany jest kod PIN2 dla karty SIM"
-
-msgid "SIM PUK2 required"
-msgstr "Wymagany jest kod PUK2 dla karty SIM"
-
-msgid ""
-"There is a problem reading data from the modem.
Please "
-"check:
1. Modem availability in the system.
2. The correct "
-"installation of the SIM card in the modem.
3. Port for communication with the modem.
"
-msgstr ""
-"Wystąpił problem z odczytem danych z modemu.
Proszę "
-"sprawdzić:
1. Dostępność modemu w systemie.
2. Poprawność "
-"montażu karty SIM w modemie.
3. Port do komunikacji z modemem.
"
-
-msgid ""
-"There is a problem reading connection data.
Please "
-"check:
1. Connection of the modem to the internet, the correctness of the entered APN. Some modems need to force the APN on the modem using at commands "
-"to connect to internet.
2. Check that the correct interface assigned to the modem is selected. The default name of the interface in the package is wan.
"
-msgstr ""
-"Wystąpił problem z odczytem danych połączenia.
Proszę "
-"sprawdzić:
1. Połączenie modemu z internetem, poprawność wprowadzonego APN. Niektóre modemy wymagają wymuszenia APN w modemie za pomocą komend at, aby "
-"połączyć się z internetem.
2. Sprawdź, czy wybrany został właściwy interfejs przypisany do modemu. Domyślną nazwą interfejsu w pakiecie jest wan.
"
-
-msgid "Defined modems"
-msgstr "Zdefiniowane modemy"
-
-msgid "Interface for selecting user defined modems."
-msgstr "Interfejs wyboru modemów zdefiniowanych przez użytkownika."
-
-msgid "Modem selection menu"
-msgstr "Menu wyboru modemu"
-
-msgid "SIM card menu"
-msgstr "Menu karty SIM"
-
-msgid "Information read from the SIM card and device."
-msgstr "Informacje odczytane z karty SIM oraz z urządzenia."
-
-msgid "Hint"
-msgstr "Podpowiedź"
-
-msgid "CLICK ME TO SEE NEW MENU"
-msgstr "KLIKNIJ MNIE, ABY ZOBACZYĆ NOWE MENU"
diff --git a/luci-app-3ginfo-lite/po/pl/luci-app-3ginfo-lite.po b/luci-app-3ginfo-lite/po/pl/luci-app-3ginfo-lite.po
deleted file mode 100644
index b98d012fd..000000000
--- a/luci-app-3ginfo-lite/po/pl/luci-app-3ginfo-lite.po
+++ /dev/null
@@ -1,247 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "Information about 3G/4G/5G connection"
-msgstr "Informacja o statusie połączenia 3G/4G/5G"
-
-msgid "More information about the 3ginfo on the %seko.one.pl forum%s."
-msgstr "Więcej informacji o 3ginfo na %sforum eko.one.pl%s."
-
-msgid "eko.one.pl forum"
-msgstr "forum eko.one.pl"
-
-msgid "Details"
-msgstr "Szczegóły"
-
-msgid "Configuration"
-msgstr "Konfiguracja"
-
-msgid "General Information"
-msgstr "Informacje ogólne"
-
-msgid "Modem Information"
-msgstr "Informacje o modemie"
-
-msgid "Cell / Signal Information"
-msgstr "Informacje o sieci / sygnale"
-
-msgid "Technology"
-msgstr "Technologia"
-
-msgid "Operator"
-msgstr "Operator"
-
-msgid "Signal strength"
-msgstr "Siła sygnału"
-
-msgid "Connection statistics"
-msgstr "Statystyki połączenia"
-
-msgid "Modem type"
-msgstr "Typ modemu"
-
-msgid "Additional information"
-msgstr "Informacje dodatkowe"
-
-msgid "Revision / Firmware"
-msgstr "Rewizja / Wersja firmware"
-
-msgid "IP adress / Communication Port"
-msgstr "Adres IP / Port do komunikacji"
-
-msgid "Chip Temperature"
-msgstr "Temperatura układu"
-
-msgid "Configuration 3ginfo-lite"
-msgstr "Konfiguracja 3ginfo-lite"
-
-msgid "Configuration panel for the 3ginfo-lite application."
-msgstr "Panel konfiguracyjny dla aplikacji 3ginfo-lite."
-
-msgid "Network"
-msgstr "Sieć"
-
-msgid "IP adress / Port for communication with the modem"
-msgstr "Adres IP / Port do komunikacji z modemem"
-
-msgid "Protocol"
-msgstr "Protokół"
-
-msgid ""
-"Select the appropriate settings.
Traditional "
-"modem. Select one of the available ttyUSBX "
-"ports.
HiLink modem. Enter the IP address "
-"192.168.X.X under which the modem is available."
-msgstr ""
-"Wybierz odpowiednie ustawienia.
Tradycyjny "
-"modem. Wybierz jeden z dostępnych portów "
-"ttyUSBX.
Modem typu HiLink. Wprowadź adres IP "
-"192.168.X.X pod którym dostępny jest modem."
-
-msgid "Very good"
-msgstr "Bardzo dobry"
-
-msgid "Good"
-msgstr "Dobry"
-
-msgid "Weak"
-msgstr "Słaby"
-
-msgid "Very weak"
-msgstr "Bardzo słaby"
-
-msgid "Excellent"
-msgstr "Doskonały"
-
-msgid "Good"
-msgstr "Dobry"
-
-msgid "Mid cell"
-msgstr "Średni zasięg"
-
-msgid "Cell edge"
-msgstr "Na krawędzi zasięgu"
-
-msgid "SIM status"
-msgstr "Status karty SIM"
-
-msgid "Not registered"
-msgstr "Nie zalogowana do sieci"
-
-msgid "Registered"
-msgstr "Zalogowana do sieci"
-
-msgid "Registered (roaming)"
-msgstr "Zalogowana do sieci (roaming)"
-
-msgid "Registered, only SMS"
-msgstr "Zalogowana do sieci, tylko SMS"
-
-msgid "Registered (roaming), only SMS"
-msgstr "Zalogowana do sieci (roaming), tylko SMS"
-
-msgid "Searching.."
-msgstr "Wyszukiwanie.."
-
-msgid "Registering denied"
-msgstr "Odmowa zalogowana do sieci"
-
-msgid "Waiting to read data from the modem..."
-msgstr "Oczekiwanie na odczyt danych z modemu..."
-
-msgid "Waiting for connection data..."
-msgstr "Oczekiwanie na dane połączenia..."
-
-msgid "BTS Search"
-msgstr "Lokalizacja stacji bazowej"
-
-msgid "Search"
-msgstr "Szukaj"
-
-msgid "Search BTS using Cell ID"
-msgstr "Wyszukaj BTS po Cell ID"
-
-msgid "Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location."
-msgstr "Wskazówka: Aby skonfigurować wyszukiwarkę BTS, wystarczy wybrać stronę odpowiednią dla swojej lokalizacji."
-
-msgid "BTS search settings"
-msgstr "Ustawienia wyszukiwania stacji bazowej"
-
-msgid "Website to search for BTS"
-msgstr "Strona do wyszukiwania BTS"
-
-msgid "Select a website for searching."
-msgstr "Wybierz stronę internetową służącą do wyszukiwania."
-
-msgid "SIM Slot"
-msgstr "Slot SIM"
-
-msgid "Problem with registering to the network, check the SIM card."
-msgstr "Problem z rejestracją do sieci, sprawdź kartę SIM."
-
-msgid "SIM PIN required"
-msgstr "Wymagany jest kod PIN dla karty SIM"
-
-msgid "SIM PUK required"
-msgstr "Wymagany jest kod PUK dla karty SIM"
-
-msgid "SIM failure"
-msgstr "Awaria karty SIM"
-
-msgid "SIM busy"
-msgstr "Karta SIM jest zajęta"
-
-msgid "SIM wrong"
-msgstr "Nieprawidłowa karta SIM"
-
-msgid "SIM PIN2 required"
-msgstr "Wymagany jest kod PIN2 dla karty SIM"
-
-msgid "SIM PUK2 required"
-msgstr "Wymagany jest kod PUK2 dla karty SIM"
-
-msgid ""
-"There is a problem reading data from the modem.
Please "
-"check:
1. Modem availability in the system.
2. The correct "
-"installation of the SIM card in the modem.
3. Port for communication with the modem.
"
-msgstr ""
-"Wystąpił problem z odczytem danych z modemu.
Proszę "
-"sprawdzić:
1. Dostępność modemu w systemie.
2. Poprawność "
-"montażu karty SIM w modemie.
3. Port do komunikacji z modemem.
"
-
-msgid ""
-"There is a problem reading connection data.
Please "
-"check:
1. Connection of the modem to the internet, the correctness of the entered APN. Some modems need to force the APN on the modem using at commands "
-"to connect to internet.
2. Check that the correct interface assigned to the modem is selected. The default name of the interface in the package is wan.
"
-msgstr ""
-"Wystąpił problem z odczytem danych połączenia.
Proszę "
-"sprawdzić:
1. Połączenie modemu z internetem, poprawność wprowadzonego APN. Niektóre modemy wymagają wymuszenia APN w modemie za pomocą komend at, aby "
-"połączyć się z internetem.
2. Sprawdź, czy wybrany został właściwy interfejs przypisany do modemu. Domyślną nazwą interfejsu w pakiecie jest wan.
"
-
-msgid "Defined modems"
-msgstr "Zdefiniowane modemy"
-
-msgid "Interface for selecting user defined modems."
-msgstr "Interfejs wyboru modemów zdefiniowanych przez użytkownika."
-
-msgid "Modem selection menu"
-msgstr "Menu wyboru modemu"
-
-msgid "SIM card menu"
-msgstr "Menu karty SIM"
-
-msgid "Information read from the SIM card and device."
-msgstr "Informacje odczytane z karty SIM oraz z urządzenia."
-
-msgid "Hint"
-msgstr "Podpowiedź"
-
-msgid "CLICK ME TO SEE NEW MENU"
-msgstr "KLIKNIJ MNIE, ABY ZOBACZYĆ NOWE MENU"
-
-msgid "Diagnostics"
-msgstr "Diagnostyka"
-
-msgid "Execution of various commands to check the availability of the modem and eliminate errors in the data collected by the scripts."
-msgstr "Wykonywanie różnych poleceń sprawdzających dostępność modemu i eliminujących błędy w danych zbieranych przez skrypty."
-
-msgid "USB debug information"
-msgstr "Debugowanie portu USB"
-
-msgid "Show devices"
-msgstr "Pokaż urządzenia"
-
-msgid "Check availability of ttyX ports."
-msgstr "Sprawdź dostępność portów ttyX."
-
-msgid "Check data read by the 3ginfo scripts."
-msgstr "Sprawdź dane odczytywane przez skrypty 3ginfo."
-
-msgid "Debug"
-msgstr "Debugowanie"
-
-msgid "Clear"
-msgstr "Wyczyść"
-
-msgid "Download"
-msgstr "Pobierz"
diff --git a/luci-app-3ginfo-lite/po/ru/3ginfo.po b/luci-app-3ginfo-lite/po/ru/3ginfo.po
deleted file mode 100644
index bf344aec1..000000000
--- a/luci-app-3ginfo-lite/po/ru/3ginfo.po
+++ /dev/null
@@ -1,223 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "Information about 3G/4G/5G connection"
-msgstr "Информация о статусе соединения 3G/4G/5G"
-
-msgid "More information about the 3ginfo on the %seko.one.pl forum%s."
-msgstr "Вся информация о 3ginfo на %sforum eko.one.pl%s."
-
-msgid "eko.one.pl forum"
-msgstr "форум eko.one.pl"
-
-msgid "Details"
-msgstr "Подробности"
-
-msgid "USB debug information"
-msgstr "Отладка порта USB"
-
-msgid "Configuration"
-msgstr "Конфигурация"
-
-msgid "General Information"
-msgstr "Общая информация"
-
-msgid "Modem Information"
-msgstr "Информация о модеме"
-
-msgid "Cell / Signal Information"
-msgstr "Информация о соте / сигнале"
-
-msgid "Technology"
-msgstr "Технология"
-
-msgid "Operator"
-msgstr "Оператор"
-
-msgid "Signal strength"
-msgstr "Качество сигнала"
-
-msgid "Connection statistics"
-msgstr "Статистика соединения"
-
-msgid "Modem type"
-msgstr "Тип модема"
-
-msgid "Additional information"
-msgstr "Дополнительная информация"
-
-msgid "Revision / Firmware"
-msgstr "Ревизия / Прошивка"
-
-msgid "IP adress / Communication Port"
-msgstr "Адрес IP / Порт связи"
-
-msgid "Chip Temperature"
-msgstr "Температура чипа"
-
-msgid "Configuration 3ginfo-lite"
-msgstr "Конфигурация 3ginfo-lite"
-
-msgid "Configuration panel for the 3ginfo-lite application."
-msgstr "Панель конфигурации приложения 3ginfo-lite."
-
-msgid "Network"
-msgstr "Сеть"
-
-msgid "IP adress / Port for communication with the modem"
-msgstr "IP-адрес / Порт связи с модемом"
-
-msgid "Protocol"
-msgstr "Протокол"
-
-msgid ""
-"Select the appropriate settings.
Traditional "
-"modem. Select one of the available ttyUSBX "
-"ports.
HiLink modem. Enter the IP address "
-"192.168.X.X under which the modem is available."
-msgstr ""
-"Выберите соответствующие настройки.
Обычный "
-"модем. Выберите один из доступных портов "
-"ttyUSBX.
Модем типа HiLink. Введите IP-адрес "
-"192.168.X.X под которым доступен модем."
-
-msgid "Very good"
-msgstr "Очень хороший"
-
-msgid "Good"
-msgstr "Хороший"
-
-msgid "Weak"
-msgstr "Слабый"
-
-msgid "Very weak"
-msgstr "Очень слабый"
-
-msgid "Excellent"
-msgstr "Отлично"
-
-msgid "Good"
-msgstr "Хорошо"
-
-msgid "Mid cell"
-msgstr "Удовлетворительно"
-
-msgid "Cell edge"
-msgstr "На грани"
-
-msgid "SIM status"
-msgstr "Статус SIM-карты"
-
-msgid "Not registered"
-msgstr "Не зарегистрирован в сети"
-
-msgid "Registered"
-msgstr "Зарегистрирован в сети"
-
-msgid "Registered (roaming)"
-msgstr "Зарегистрирован в другой сети (роуминг)"
-
-msgid "Registered, only SMS"
-msgstr "Зарегистрирован в сети, только SMS"
-
-msgid "Registered (roaming), only SMS"
-msgstr "Зарегистрирован в другой сети (роуминг), только SMS"
-
-msgid "Searching.."
-msgstr "Поиск.."
-
-msgid "Registering denied"
-msgstr "Отказано в регистрации в сети"
-
-msgid "Waiting to read data from the modem..."
-msgstr "Ожидание считывания данных с модема..."
-
-msgid "Waiting for connection data..."
-msgstr "Ожидание данных для соединения..."
-
-msgid "BTS Search"
-msgstr "Поиск базовой станции"
-
-msgid "Search"
-msgstr "Поиск"
-
-msgid "Search BTS using Cell ID"
-msgstr "Поиск базовой станции по Cell ID"
-
-msgid "Hint: To set up a BTS search engine, all you have to do is select the dedicated website for your location."
-msgstr "Совет: Чтобы настроить поиск базовой станции, просто выберите сайт, соответствующий вашему местоположению."
-
-msgid "BTS search settings"
-msgstr "Настройки поиска базовой станции"
-
-msgid "Website to search for BTS"
-msgstr "Сайт для поиска базовой станции"
-
-msgid "Select a website for searching."
-msgstr "Выберите сайт для поиска."
-
-msgid "SIM Slot"
-msgstr "Слот SIM"
-
-msgid "Problem with registering to the network, check the SIM card."
-msgstr "Проблема с регистрацией в сети оператора, проверьте SIM-карту."
-
-msgid "SIM PIN required"
-msgstr "Требуется код PUK2 для SIM-карты"
-
-msgid "SIM PUK required"
-msgstr "Требуется код PUK для SIM-карты"
-
-msgid "SIM failure"
-msgstr "Сбой SIM-карты"
-
-msgid "SIM busy"
-msgstr "SIM-карта занята"
-
-msgid "SIM wrong"
-msgstr "Некорректная SIM-карта"
-
-msgid "SIM PIN2 required"
-msgstr "Требуется код PIN2 для SIM-карты"
-
-msgid "SIM PUK2 required"
-msgstr "Требуется код PUK2 для SIM-карты"
-
-msgid ""
-"There is a problem reading data from the modem.
Please "
-"check:
1. Modem availability in the system.
2. The correct "
-"installation of the SIM card in the modem.
3. Port for communication with the modem.
"
-msgstr ""
-"Возникла проблема со считыванием данных с модема.
Пожалуйста "
-"проверьте:
1. Наличие модема в системе.
2. Правильность "
-"установки SIM-карты в модем.
3. Правильно указан порт для связи с модемом.
"
-
-msgid ""
-"There is a problem reading connection data.
Please "
-"check:
1. Connection of the modem to the internet, the correctness of the entered APN. Some modems need to force the APN on the modem using at commands "
-"to connect to internet.
2. Check that the correct interface assigned to the modem is selected. The default name of the interface in the package is wan.
"
-msgstr ""
-"При чтении данных о соединении возникла проблема.
Пожалуйста "
-"проверьте:
1. Подключение модема к Интернету, правильность введенного APN. Некоторые модемы требуют ввести APN на модеме с помощью AT команд, чтобы "
-"подключиться к Интернету.
2. Убедитесь, что выбран правильный интерфейс, назначенный модему. По умолчанию в комплекте поставки используется имя интерфейса wan.
1. Connection of the modem to the internet, the correctness of the "
-"entered APN. Some modems need to force the APN on the modem using at "
-"commands to connect to internet.
2. Check that the correct "
-"interface assigned to the modem is selected. The default name of the "
-"interface in the package is wan.
"
-msgstr ""
-"读取连接数据时出现问题。
请检查:
1. 模块是否已经"
-"连接到互联网,输入的 APN 是否正确。某些模块需要使用 AT 命令强制在模块上设置 "
-"APN 才能连接到互联网。
2. 检查是否选择了正确的接口。默认接口名称为 "
-"wan。
"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:513
-msgid ""
-"There is a problem reading data from the modem.
Please check:"
-"
1. Modem availability in the system.
2. The correct "
-"installation of the SIM card in the modem.
3. Port for "
-"communication with the modem.
"
-msgstr ""
-"读取模块数据时出现问题。
请检查:
1. 系统中模块是"
-"否可用。
2. 模块中 SIM 卡是否正确安装。
3. 与模块通信的端口。"
-"
"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdebug.js:89
-msgid "USB debug information"
-msgstr "USB 调试信息"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:28
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:60
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:93
-msgid "Very good"
-msgstr "非常好"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:43
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:75
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:108
-msgid "Very weak"
-msgstr "非常弱"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:579
-msgid "Waiting for connection data..."
-msgstr "等待连接数据..."
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:537
-msgid "Waiting to read data from the modem..."
-msgstr "等待从模块读取数据..."
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:38
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:70
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:103
-msgid "Weak"
-msgstr "弱"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js:73
-msgid "Website to search for BTS"
-msgstr "用于搜索基站的网站"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js:76
-msgid "btsearch.pl"
-msgstr "btsearch.pl"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gconfig.js:77
-msgid "lteitaly.it"
-msgstr "lteitaly.it"
-
-#: applications/luci-app-3ginfo-lite/htdocs/luci-static/resources/view/modem/3gdetail.js:955
-msgid "☰"
-msgstr "☰"
diff --git a/luci-app-3ginfo-lite/root/etc/config/3ginfo b/luci-app-3ginfo-lite/root/etc/config/3ginfo
deleted file mode 100644
index f47d38513..000000000
--- a/luci-app-3ginfo-lite/root/etc/config/3ginfo
+++ /dev/null
@@ -1,4 +0,0 @@
-
-config 3ginfo
- option device ''
- option website 'http://www.btsearch.pl/szukaj.php?mode=std&search='
diff --git a/luci-app-3ginfo-lite/root/etc/uci-defaults/set_3ginfo_port.sh b/luci-app-3ginfo-lite/root/etc/uci-defaults/set_3ginfo_port.sh
deleted file mode 100644
index d3fd50d84..000000000
--- a/luci-app-3ginfo-lite/root/etc/uci-defaults/set_3ginfo_port.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-# Copyright 2020-2024 Rafał Wabik (IceG) - From eko.one.pl forum
-# MIT License
-
-chmod +x /usr/share/3ginfo-lite/3ginfo.sh 2>&1 &
-chmod +x /usr/share/3ginfo-lite/detect.sh 2>&1 &
-chmod +x /usr/share/3ginfo-lite/check.gcom 2>&1 &
-chmod +x /usr/share/3ginfo-lite/info.gcom 2>&1 &
-chmod +x /usr/share/3ginfo-lite/vendorproduct.gcom 2>&1 &
-chmod +x /usr/share/3ginfo-lite/modem/hilink/alcatel_hilink.sh 2>&1 &
-chmod +x /usr/share/3ginfo-lite/modem/hilink/huawei_hilink.sh 2>&1 &
-chmod +x /usr/share/3ginfo-lite/modem/hilink/zte.sh 2>&1 &
-rm -rf /tmp/luci-indexcache 2>&1 &
-rm -rf /tmp/luci-modulecache/ 2>&1 &
-
-exit 0
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/3ginfo.sh b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/3ginfo.sh
deleted file mode 100755
index e5cc9ef57..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/3ginfo.sh
+++ /dev/null
@@ -1,531 +0,0 @@
-#!/bin/sh
-
-#
-# (c) 2010-2025 Cezary Jackiewicz
-#
-# (c) 2021-2025 modified by Rafał Wabik - IceG - From eko.one.pl forum
-#
-
-
-band4g() {
-# see https://en.wikipedia.org/wiki/LTE_frequency_bands
- echo -n "B${1}"
- case "${1}" in
- "1") echo " (2100 MHz)";;
- "2") echo " (1900 MHz)";;
- "3") echo " (1800 MHz)";;
- "4") echo " (1700 MHz)";;
- "5") echo " (850 MHz)";;
- "7") echo " (2600 MHz)";;
- "8") echo " (900 MHz)";;
- "11") echo " (1500 MHz)";;
- "12") echo " (700 MHz)";;
- "13") echo " (700 MHz)";;
- "14") echo " (700 MHz)";;
- "17") echo " (700 MHz)";;
- "18") echo " (850 MHz)";;
- "19") echo " (850 MHz)";;
- "20") echo " (800 MHz)";;
- "21") echo " (1500 MHz)";;
- "24") echo " (1600 MHz)";;
- "25") echo " (1900 MHz)";;
- "26") echo " (850 MHz)";;
- "28") echo " (700 MHz)";;
- "29") echo " (700 MHz)";;
- "30") echo " (2300 MHz)";;
- "31") echo " (450 MHz)";;
- "32") echo " (1500 MHz)";;
- "34") echo " (2000 MHz)";;
- "37") echo " (1900 MHz)";;
- "38") echo " (2600 MHz)";;
- "39") echo " (1900 MHz)";;
- "40") echo " (2300 MHz)";;
- "41") echo " (2500 MHz)";;
- "42") echo " (3500 MHz)";;
- "43") echo " (3700 MHz)";;
- "46") echo " (5200 MHz)";;
- "47") echo " (5900 MHz)";;
- "48") echo " (3500 MHz)";;
- "50") echo " (1500 MHz)";;
- "51") echo " (1500 MHz)";;
- "53") echo " (2400 MHz)";;
- "54") echo " (1600 MHz)";;
- "65") echo " (2100 MHz)";;
- "66") echo " (1700 MHz)";;
- "67") echo " (700 MHz)";;
- "69") echo " (2600 MHz)";;
- "70") echo " (1700 MHz)";;
- "71") echo " (600 MHz)";;
- "72") echo " (450 MHz)";;
- "73") echo " (450 MHz)";;
- "74") echo " (1500 MHz)";;
- "75") echo " (1500 MHz)";;
- "76") echo " (1500 MHz)";;
- "85") echo " (700 MHz)";;
- "87") echo " (410 MHz)";;
- "88") echo " (410 MHz)";;
- "103") echo " (700 MHz)";;
- "106") echo " (900 MHz)";;
- "*") echo "";;
- esac
-}
-
-band5g() {
-# see https://en.wikipedia.org/wiki/5G_NR_frequency_bands
- echo -n "n${1}"
- case "${1}" in
- "1") echo " (2100 MHz)";;
- "2") echo " (1900 MHz)";;
- "3") echo " (1800 MHz)";;
- "5") echo " (850 MHz)";;
- "7") echo " (2600 MHz)";;
- "8") echo " (900 MHz)";;
- "12") echo " (700 MHz)";;
- "13") echo " (700 MHz)";;
- "14") echo " (700 MHz)";;
- "18") echo " (850 MHz)";;
- "20") echo " (800 MHz)";;
- "24") echo " (1600 MHz)";;
- "25") echo " (1900 MHz)";;
- "26") echo " (850 MHz)";;
- "28") echo " (700 MHz)";;
- "29") echo " (700 MHz)";;
- "30") echo " (2300 MHz)";;
- "34") echo " (2100 MHz)";;
- "38") echo " (2600 MHz)";;
- "39") echo " (1900 MHz)";;
- "40") echo " (2300 MHz)";;
- "41") echo " (2500 MHz)";;
- "46") echo " (5200 MHz)";;
- "47") echo " (5900 MHz)";;
- "48") echo " (3500 MHz)";;
- "50") echo " (1500 MHz)";;
- "51") echo " (1500 MHz)";;
- "53") echo " (2400 MHz)";;
- "54") echo " (1600 MHz)";;
- "65") echo " (2100 MHz)";;
- "66") echo " (1700/2100 MHz)";;
- "67") echo " (700 MHz)";;
- "70") echo " (2000 MHz)";;
- "71") echo " (600 MHz)";;
- "74") echo " (1500 MHz)";;
- "75") echo " (1500 MHz)";;
- "76") echo " (1500 MHz)";;
- "77") echo " (3700 MHz)";;
- "78") echo " (3500 MHz)";;
- "79") echo " (4700 MHz)";;
- "80") echo " (1800 MHz)";;
- "81") echo " (900 MHz)";;
- "82") echo " (800 MHz)";;
- "83") echo " (700 MHz)";;
- "84") echo " (2100 MHz)";;
- "85") echo " (700 MHz)";;
- "86") echo " (1700 MHz)";;
- "89") echo " (850 MHz)";;
- "90") echo " (2500 MHz)";;
- "91") echo " (800/1500 MHz)";;
- "92") echo " (800/1500 MHz)";;
- "93") echo " (900/1500 MHz)";;
- "94") echo " (900/1500 MHz)";;
- "95") echo " (2100 MHz)";;
- "96") echo " (6000 MHz)";;
- "97") echo " (2300 MHz)";;
- "98") echo " (1900 MHz)";;
- "99") echo " (1600 MHz)";;
- "100") echo " (900 MHz)";;
- "101") echo " (1900 MHz)";;
- "102") echo " (6200 MHz)";;
- "104") echo " (6700 MHz)";;
- "105") echo " (600 MHz)";;
- "106") echo " (900 MHz)";;
- "109") echo " (700/1500 MHz)";;
- "257") echo " (28 GHz)";;
- "258") echo " (26 GHz)";;
- "259") echo " (41 GHz)";;
- "260") echo " (39 GHz)";;
- "261") echo " (28 GHz)";;
- "262") echo " (47 GHz)";;
- "263") echo " (60 GHz)";;
- "*") echo "";;
- esac
-}
-
-getdevicevendorproduct() {
- devname="$(basename $1)"
- case "$devname" in
- 'mhi_DUN'*)
- devpath=$(find /sys/devices -name "$devname" -type d 2>/dev/null | head -1)
- target_dir=${devpath%/*/*/*}
- V=$(cat "$target_dir/vendor")
- D=$(cat "$target_dir/device")
- echo "pci/${V/0x/}${D/0x/}"
- ;;
- 'wwan'*'at'*)
- devpath="$(readlink -f /sys/class/wwan/$devname/device)"
- T=${devpath%/*/*/*}
- if [ -e $T/vendor ] && [ -e $T/device ]; then
- V=$(cat $T/vendor)
- D=$(cat $T/device)
- echo "pci/${V/0x/}${D/0x/}"
- fi
- ;;
- 'ttyACM'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- T=${devpath%/*}
- echo "usb/$(cat $T/idVendor)$(cat $T/idProduct)"
- ;;
- 'tty'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- T=${devpath%/*/*}
- echo "usb/$(cat $T/idVendor)$(cat $T/idProduct)"
- ;;
- *)
- devpath="$(readlink -f /sys/class/usbmisc/$devname/device)"
- T=${devpath%/*}
- echo "usb/$(cat $T/idVendor)$(cat $T/idProduct)"
- ;;
- esac
-}
-
-RES="/usr/share/3ginfo-lite"
-
-DEVICE=$($RES/detect.sh)
-if [ -z "$DEVICE" ]; then
- echo '{"error":"Device not found"}'
- exit 0
-fi
-
-O=""
-if [ -e /usr/bin/sms_tool ]; then
- O=$(sms_tool -D -d $DEVICE at "AT+CPIN?;+CSQ;+COPS=3,0;+COPS?;+COPS=3,2;+COPS?;+CREG=2;+CREG?")
-else
- O=$(gcom -d $DEVICE -s $RES/info.gcom 2>/dev/null)
-fi
-
-getpath() {
- devname="$(basename $1)"
- case "$devname" in
- 'wwan'*'at'*)
- devpath="$(readlink -f /sys/class/wwan/$devname/device)"
- P=${devpath%/*/*/*}
- ;;
- 'ttyACM'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- P=${devpath%/*}
- ;;
- 'tty'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- P=${devpath%/*/*}
- ;;
- *)
- devpath="$(readlink -f /sys/class/usbmisc/$devname/device/)"
- P=${devpath%/*}
- ;;
- esac
-}
-
-# --- modemdefine - WAN config ---
-CONFIG=modemdefine
-MODEMZ=$(uci show $CONFIG 2>/dev/null | grep -o "@modemdefine\[[0-9]*\]\.modem" | wc -l | xargs)
-if [[ $MODEMZ -gt 1 ]]; then
- SEC=$(uci -q get modemdefine.@general[0].main_network)
-fi
-if [[ $MODEMZ -eq 0 ]]; then
- SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
-fi
-if [[ $MODEMZ -eq 1 ]]; then
- SEC=$(uci -q get modemdefine.@modemdefine[0].network)
-fi
-
-if [ -z "$SEC" ]; then
- getpath $DEVICE
- PORIG=$P
- for DEV in /sys/class/tty/* /sys/class/usbmisc/*; do
- getpath "/dev/"${DEV##/*/}
- if [ "x$PORIG" == "x$P" ]; then
- SEC=$(uci show network | grep "/dev/"${DEV##/*/} | cut -f2 -d.)
- [ -n "$SEC" ] && break
- fi
- done
-fi
-# --- modemdefine config ---
-
-CONN_TIME="-"
-RX="-"
-TX="-"
-
-NETUP=$(ifstatus $SEC | grep "\"up\": true")
-if [ -n "$NETUP" ]; then
-
- CT=$(uci -q -P /var/state/ get network.$SEC.connect_time)
- if [ -z $CT ]; then
- CT=$(ifstatus $SEC | awk -F[:,] '/uptime/ {print $2}' | xargs)
- else
- UPTIME=$(cut -d. -f1 /proc/uptime)
- CT=$((UPTIME-CT))
- fi
- if [ ! -z $CT ]; then
-
- D=$(expr $CT / 60 / 60 / 24)
- H=$(expr $CT / 60 / 60 % 24)
- M=$(expr $CT / 60 % 60)
- S=$(expr $CT % 60)
- CONN_TIME=$(printf "%dd, %02d:%02d:%02d" $D $H $M $S)
- CONN_TIME_SINCE=$(date "+%Y%m%d%H%M%S" -d "@$(($(date +%s) - CT))")
-
- fi
-
- IFACE=$(ifstatus $SEC | awk -F\" '/l3_device/ {print $4}')
- if [ -n "$IFACE" ]; then
- RX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$2}')
- TX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$4}')
- fi
-fi
-
-# CSQ
-CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
-
-[ "x$CSQ" == "x" ] && CSQ=-1
-if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
- CSQ_PER=$(($CSQ * 100/31))
-else
- CSQ=""
- CSQ_PER=""
-fi
-
-# COPS numeric
-# see https://mcc-mnc.com/
-# Update: 11/11/2024 items: 3121
-COPS=""
-COPS_MCC=""
-COPS_MNC=""
-COPS_NUM=$(echo "$O" | awk -F[\"] '/^\+COPS:\s*.,2/ {print $2}')
-if [ -n "$COPS_NUM" ]; then
- COPS_MCC=${COPS_NUM:0:3}
- COPS_MNC=${COPS_NUM:3:3}
-fi
-
-TCOPS=$(echo "$O" | awk -F[\"] '/^\+COPS:\s*.,0/ {print $2}')
-[ "x$TCOPS" != "x" ] && COPS="$TCOPS"
-
-if [ -z "$COPS" ]; then
- if [ -n "$COPS_NUM" ]; then
- COPS=$(awk -F[\;] '/^'$COPS_NUM';/ {print $3}' $RES/mccmnc.dat | xargs)
- LOC=$(awk -F[\;] '/^'$COPS_NUM';/ {print $2}' $RES/mccmnc.dat)
- fi
-fi
-[ -z "$COPS" ] && COPS=$COPS_NUM
-case "$COPS" in
- *\ *)
- COPS=$(echo "$COPS" | awk '{if(NF==2 && tolower($1)==tolower($2)){print $1}else{print $0}}')
- ;;
-esac
-
-isp=$(sms_tool -d "$DEVICE" at "AT+COPS?" | sed -n '2p' | cut -d '"' -f2 | tr -d '\r')
-isp_num="$COPS_MCC $COPS_MNC"
-isp_numws="$COPS_MCC$COPS_MNC"
-
-case "$COPS" in
- *[!0-9]* | '')
- # Non-numeric characters or is blank
- ;;
- *)
- if [ "$COPS" = "$isp_num" ] || [ "$COPS" = "$isp_numws" ]; then
- if [ -n "$isp" ]; then
- COPS=$(awk -F[\;] '/^'"$isp"';/ {print $3}' $RES/mccmnc.dat | xargs)
- LOC=$(awk -F[\;] '/^'"$isp"';/ {print $2}' $RES/mccmnc.dat)
- fi
- fi
- ;;
-esac
-
-
-# operator location from temporary config
-LOCATIONFILE=/tmp/location
-if [ -e "$LOCATIONFILE" ]; then
- touch $LOCATIONFILE
- LOC=$(cat $LOCATIONFILE)
- if [ -n "$LOC" ]; then
- LOC=$(cat $LOCATIONFILE)
- if [[ $LOC == "-" ]]; then
- rm $LOCATIONFILE
- LOC=$(awk -F[\;] '/^'$COPS_NUM';/ {print $2}' $RES/mccmnc.dat)
- if [ -n "$LOC" ]; then
- echo "$LOC" > /tmp/location
- fi
- else
- LOC=$(awk -F[\;] '/^'$COPS_NUM';/ {print $2}' $RES/mccmnc.dat)
- if [ -n "$LOC" ]; then
- echo "$LOC" > /tmp/location
- fi
- fi
- fi
-else
- case "$COPS_MCC$COPS_MNC" in
- *[!0-9]* | '')
- # Non-numeric characters or is blank
- ;;
- *)
- if [ -n "$LOC" ]; then
- LOC=$(awk -F[\;] '/^'"$COPS_MCC$COPS_MNC"';/ {print $2}' $RES/mccmnc.dat)
- echo "$LOC" > /tmp/location
- else
- echo "-" > /tmp/location
- fi
- ;;
- esac
-fi
-
-T=$(echo "$O" | awk -F[,\ ] '/^\+CPIN:/ {print $0;exit}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" == "+CPIN: READY" ] || REG=$(echo "$T" | cut -f2 -d: | xargs)
-fi
-
-T=$(echo "$O" | awk -F[,\ ] '/^\+CME ERROR:/ {print $0;exit}')
-if [ -n "$T" ]; then
- case "$T" in
- "+CME ERROR: 10"*) REG="SIM not inserted";;
- "+CME ERROR: 11"*) REG="SIM PIN required";;
- "+CME ERROR: 12"*) REG="SIM PUK required";;
- "+CME ERROR: 13"*) REG="SIM failure";;
- "+CME ERROR: 14"*) REG="SIM busy";;
- "+CME ERROR: 15"*) REG="SIM wrong";;
- "+CME ERROR: 17"*) REG="SIM PIN2 required";;
- "+CME ERROR: 18"*) REG="SIM PUK2 required";;
- *) REG=$(echo "$T" | cut -f2 -d: | xargs);;
- esac
-fi
-
-# CREG
-eval $(echo "$O" | busybox awk -F[,] '/^\+CREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";LAC_HEX=\"%X\";CID_HEX=\"%X\";LAC_DEC=\"%d\";CID_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, "0x"$4, "0x"$3, "0x"$4, $5}')
-case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- 6*) REG="6";;
- 7*) REG="7";;
- *) REG="";;
-esac
-
-# MODE
-if [ -z "$MODE_NUM" ] || [ "x$MODE_NUM" == "x0" ]; then
-# MODE_NUM=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4;exit}' | xargs)
- MODE_NUM=$(echo "$O" | awk -F[,] '/^\+COPS: 0,2/ {print $4;exit}' | xargs)
-fi
-case "$MODE_NUM" in
- 2*) MODE="UMTS";;
- 3*) MODE="EDGE";;
- 4*) MODE="HSDPA";;
- 5*) MODE="HSUPA";;
- 6*) MODE="HSPA";;
- 7*) MODE="LTE";;
- *) MODE="-";;
-esac
-
-# TAC
-OTX=$(sms_tool -d $DEVICE at "at+cereg")
-TAC=$(echo "$OTX" | awk -F[,] '/^\+CEREG/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
-if [ "x$TAC" != "x" ]; then
- TAC_HEX=$(printf %d 0x$TAC)
-else
- TAC="-"
- TAC_HEX="-"
-fi
-
-CONF_DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
-if echo "x$CONF_DEVICE" | grep -q "192.168."; then
- if grep -q "Vendor=1bbb" /sys/kernel/debug/usb/devices; then
- . $RES/modem/hilink/alcatel_hilink.sh $DEVICE
- fi
- if grep -q "Vendor=12d1" /sys/kernel/debug/usb/devices; then
- . $RES/modem/hilink/huawei_hilink.sh $DEVICE
- fi
- if grep -q "Vendor=19d2" /sys/kernel/debug/usb/devices; then
- . $RES/modem/hilink/zte.sh $DEVICE
- fi
- SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
- SEC=${SEC:-wan}
-else
-
-if [ -e /usr/bin/sms_tool ]; then
- REGOK=0
- [ "x$REG" == "x1" ] || [ "x$REG" == "x5" ] || [ "x$REG" == "x6" ] || [ "x$REG" == "x7" ] && REGOK=1
- VIDPID=$(getdevicevendorproduct $DEVICE)
- if [ -e "$RES/modem/$VIDPID" ]; then
- case $(cat /tmp/sysinfo/board_name) in
- "zte,mf289f")
- . "$RES/modem/usb/19d21485"
- ;;
- *)
- . "$RES/modem/$VIDPID"
- ;;
- esac
- fi
-fi
-
-fi
-
-sanitize_string() {
-[ -z "$1" ] && echo "-" || echo "$1" | tr -d '\r\n'
-}
-sanitize_number() {
-[ -z "$1" ] && echo "-" || echo "$1"
-}
-
-cat <
-#
-# (c) 2023-2025 modified by Rafał Wabik - IceG - From eko.one.pl forum
-#
-
-
-#
-# from config modemdefine
-#
-CONFIG=modemdefine
-MODEMZ=$(uci show $CONFIG 2>/dev/null | grep -o "@modemdefine\[[0-9]*\]\.modem" | wc -l | xargs)
-if [ -n "$MODEMZ" ]; then
-
- if [[ $MODEMZ = 0 ]]; then
- DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
- if [ -n "$DEVICE" ]; then
- echo $DEVICE
- exit 0
- fi
- fi
-
- if [[ $MODEMZ = 1 ]]; then
- DEVICE=$(uci -q get modemdefine.@modemdefine[0].comm_port)
- if [ -n "$DEVICE" ]; then
- echo $DEVICE
- exit 0
- fi
- fi
-
- if [[ $MODEMZ > 1 ]]; then
- DEVICE=$(uci -q get modemdefine.@general[0].main_modem)
- if [ -n "$DEVICE" ]; then
- echo $DEVICE
- exit 0
- fi
- fi
-fi
-
-
-getdevicepath() {
- devname="$(basename $1)"
- case "$devname" in
- 'wwan'*'at'*)
- devpath="$(readlink -f /sys/class/wwan/$devname/device)"
- echo ${devpath%/*/*/*}
- ;;
- 'ttyACM'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- echo ${devpath%/*}
- ;;
- 'tty'*)
- devpath="$(readlink -f /sys/class/tty/$devname/device)"
- echo ${devpath%/*/*}
- ;;
- *)
- devpath="$(readlink -f /sys/class/usbmisc/$devname/device)"
- echo ${devpath%/*}
- ;;
- esac
-}
-
-# from config
-DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
-if [ -n "$DEVICE" ]; then
- echo $DEVICE
- exit 0
-fi
-
-# from temporary config
-MODEMFILE=/tmp/modem
-touch $MODEMFILE
-DEVICE=$(cat $MODEMFILE)
-if [ -n "$DEVICE" ]; then
- echo $DEVICE
- exit 0
-fi
-
-# find any device
-DEVICES=$(find /dev -name "ttyUSB*" -o -name "ttyACM*" -o -name "wwan*at*" | sort -r)
-# limit to devices from the modem
-WAN=$(uci -q get network.wan.device)
-if [ -e "$WAN" ]; then
- DEVPATH=$(getdevicepath "$WAN")
- DEVICESFOUND=""
- for DEVICE in $DEVICES; do
- T=$(getdevicepath $DEVICE)
- [ "x$T" = "x$DEVPATH" ] && DEVICESFOUND="$DEVICESFOUND $DEVICE"
- done
- DEVICES="$DEVICESFOUND"
-fi
-
-for DEVICE in $DEVICES; do
- gcom -d $DEVICE -s /usr/share/3ginfo-lite/check.gcom >/dev/null 2>&1
- if [ $? = 0 ]; then
- echo "$DEVICE" | tee $MODEMFILE
- exit 0
- fi
-done
-
-echo ""
-exit 0
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/info.gcom b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/info.gcom
deleted file mode 100644
index e0ff20f8a..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/info.gcom
+++ /dev/null
@@ -1,51 +0,0 @@
-opengt
- set com 115200n81
- set comecho off
- set senddelay 0.01
- waitquiet 0.01 0.01
-
- let $c="AT+CSQ^m"
- let $r="+CSQ"
- gosub readatcmd
-
- let $c="AT+COPS=3,0;+COPS?^m"
- let $r="+COPS"
- gosub readatcmd
-
- let $c="AT+COPS=3,2;+COPS?^m"
- let $r="+COPS"
- gosub readatcmd
-
- let $c="AT+CREG=2;+CREG?^m"
- let $r="+CREG"
- gosub readatcmd
-
- let $c="AT+CPIN?^m"
- let $r="+CPIN"
- gosub readatcmd
-
- exit 0
-
-:readatcmd
- let i=15
- send $c
-:loop
- get 0.1 "^m" $s
- let l=len($r)
- if len($s) < l goto loop1
- if $mid($s,1,l) <> $r goto loop1
- print $s
- return
-
-:loop1
- if len($s) < 2 goto loop2
- if $mid($s,1,2) = "ER" return
- if $mid($s,1,2) = "CO" return
- if len($s) < 10 goto loop2
- if $mid($s,1,10) != "+CME ERROR" goto loop2
- print $s
- return
-:loop2
- if i = 0 exit 0
- let i=i-1
- goto loop
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/mccmnc.dat b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/mccmnc.dat
deleted file mode 100644
index ac6315e02..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/mccmnc.dat
+++ /dev/null
@@ -1,3121 +0,0 @@
-28988;Abkhazia;A-Mobile
-28968;Abkhazia;A-Mobile
-28967;Abkhazia;Aquafon
-289299;Abkhazia;Failed Calls
-289999;Abkhazia;Fix Line
-41201;Afghanistan;AWCC
-41250;Afghanistan;Etisalat
-412299;Afghanistan;Failed Calls
-412999;Afghanistan;Fix Line
-41288;Afghanistan;Mobifone
-41280;Afghanistan;Mobifone
-41240;Afghanistan;MTN
-41220;Afghanistan;Roshan
-27603;Albania;ALBtelecom Mobile / Eagle
-276299;Albania;Failed Calls
-276999;Albania;Fix Line
-27601;Albania;One / AMC
-27602;Albania;Vodafone
-60302;Algeria;Djezzy
-603299;Algeria;Failed Calls
-603999;Algeria;Fix Line
-60301;Algeria;Mobilis
-60303;Algeria;Ooredoo
-544780;American Samoa;ASTCA Mobile
-54411;American Samoa;BlueSky
-544299;American Samoa;Failed Calls
-544999;American Samoa;Fix Line
-21303;Andorra;Andorra Telecom / Mobiland
-213299;Andorra;Failed Calls
-213999;Andorra;Fix Line
-631299;Angola;Failed Calls
-631999;Angola;Fix Line
-63104;Angola;MoviCel
-63102;Angola;Unitel
-365850;Anguilla;Digicel
-365299;Anguilla;Failed Calls
-365999;Anguilla;Fix Line
-365840;Anguilla;Flow
-344930;Antigua and Barbuda;Digicel
-34493;Antigua and Barbuda;Digicel
-344299;Antigua and Barbuda;Failed Calls
-344999;Antigua and Barbuda;Fix Line
-34492;Antigua and Barbuda;Flow
-344920;Antigua and Barbuda;Flow
-34430;Antigua and Barbuda;imobile / APUA
-34403;Antigua and Barbuda;imobile / APUA
-722320;Argentina;Claro
-72231;Argentina;Claro
-722310;Argentina;Claro
-722330;Argentina;Claro
-722299;Argentina;Express
-722299;Argentina;Failed Calls
-722999;Argentina;Fix Line
-722299;Argentina;Imowi
-722299;Argentina;IPLAN
-722299;Argentina;Kallofer
-72270;Argentina;Movistar
-72207;Argentina;Movistar
-72210;Argentina;Movistar
-722299;Argentina;Nuestro
-72234;Argentina;Personal
-722299;Argentina;Telecentro
-722340;Argentina;Personal
-722341;Argentina;Personal
-28301;Armenia;Beeline
-283299;Armenia;Failed Calls
-283999;Armenia;Fix Line
-28304;Armenia;KT
-28310;Armenia;Orange
-28305;Armenia;Viva-MTS
-36302;Aruba;Digicel
-363299;Aruba;Failed Calls
-363999;Aruba;Fix Line
-363299;Aruba;MIO
-36301;Aruba;SETAR
-505299;Australia;ACMA
-50530;Australia;Compatel
-505299;Australia;Failed Calls
-505999;Australia;Fix Line
-505299;Australia;Get SIM
-50519;Australia;Lycamobile
-50535;Australia;MessageBird
-50510;Australia;Norfolk Telecom
-50590;Australia;Optus
-50588;Australia;Pivotel
-50550;Australia;Pivotel
-50513;Australia;RailCorp
-50526;Australia;Sinch
-50502;Australia;Optus
-505299;Australia;Symbio
-50572;Australia;Telstra
-50539;Australia;Telstra
-50501;Australia;Telstra
-50571;Australia;Telstra
-50511;Australia;Telstra
-50516;Australia;VicTrack
-50506;Australia;Vodafone
-50512;Australia;Vodafone
-50507;Australia;Vodafone
-50503;Australia;Vodafone
-23205;Austria;3
-23219;Austria;3
-23216;Austria;3
-23210;Austria;3
-23214;Austria;3
-23211;Austria;A1 Telekom
-23209;Austria;A1 Telekom
-23202;Austria;A1 Telekom
-23212;Austria;A1 Telekom
-23201;Austria;A1 Telekom
-232299;Austria;ArgoNET
-232299;Austria;DIALOG telekom
-232299;Austria;Digital Privacy
-232299;Austria;DIMOCO
-232299;Austria;educom
-232299;Austria;Failed Calls
-232999;Austria;Fix Line
-23225;Austria;Holding Graz
-232299;Austria;Innsbrucker Kommunalbetriebe
-232299;Austria;kabelplus
-232299;Austria;Lenovo Connect
-232299;Austria;LINK Mobility
-23226;Austria;LIWEST Mobil
-23208;Austria;Lycamobile
-23217;Austria;MRS
-23220;Austria;Mtel
-23291;Austria;OBB Infrastruktur
-23222;Austria;Plintron
-232299;Austria;Simple SMS
-232299;Austria;Skymond Mobile
-23224;Austria;Smartel Services
-23218;Austria;smartspace
-23213;Austria;T-Mobile / Magenta
-23203;Austria;T-Mobile / Magenta
-23204;Austria;T-Mobile / Magenta
-23223;Austria;T-Mobile / Magenta
-232299;Austria;Telfoni
-23227;Austria;Tismi
-23207;Austria;Ventocom
-40001;Azerbaijan;Azercell
-40002;Azerbaijan;Bakcell
-400299;Azerbaijan;Failed Calls
-400999;Azerbaijan;Fix Line
-40003;Azerbaijan;FONEX
-40004;Azerbaijan;Nar Mobile
-40006;Azerbaijan;Naxtel
-364490;Bahamas;Aliv
-364390;Bahamas;Cybercell / BaTelCo
-36430;Bahamas;Cybercell / BaTelCo
-36439;Bahamas;Cybercell / BaTelCo
-364299;Bahamas;Failed Calls
-364999;Bahamas;Fix Line
-42601;Bahrain;Batelco
-426299;Bahrain;Failed Calls
-426999;Bahrain;Fix Line
-42605;Bahrain;Royal Court
-42604;Bahrain;VIVA
-42602;Bahrain;Zain
-47002;Bangladesh;Airtel
-47007;Bangladesh;Airtel
-47003;Bangladesh;Banglalink
-470299;Bangladesh;Failed Calls
-470999;Bangladesh;Fix Line
-47001;Bangladesh;GrameenPhone
-47004;Bangladesh;TeleTalk
-34250;Barbados;Digicel
-342299;Barbados;Failed Calls
-342999;Barbados;Fix Line
-342600;Barbados;Flow / Lime
-342299;Barbados;Ozone
-25704;Belarus;life:)
-257299;Belarus;Failed Calls
-257999;Belarus;Fix Line
-25702;Belarus;MTS
-25701;Belarus;velcom A1
-20620;Belgium;Base
-20628;Belgium;BICS
-20625;Belgium;Dense Air
-20623;Belgium;Dust Mobile
-20633;Belgium;Ericsson
-206299;Belgium;Failed Calls
-206299;Belgium;FEBO
-206999;Belgium;Fix Line
-206299;Belgium;GianCom
-20602;Belgium;Infrabel
-206299;Belgium;interactive digital media / IDM
-206299;Belgium;L-mobi
-20699;Belgium;Lancelot
-206299;Belgium;Legos
-20606;Belgium;Lycamobile
-20630;Belgium;Mobile Vikings
-20610;Belgium;Mobistar / Orange
-206299;Belgium;Nord Connect
-20634;Belgium;onoff
-206299;Belgium;PM Factory
-20600;Belgium;Proximus
-20601;Belgium;Proximus
-20604;Belgium;Proximus
-20605;Belgium;Telenet
-20607;Belgium;Vectone Mobile
-20608;Belgium;VOOmobile
-206299;Belgium;Voxbone / Bandwidth
-70267;Belize;DigiCell
-702299;Belize;Failed Calls
-702999;Belize;Fix Line
-70269;Belize;Smart
-70299;Belize;Smart
-616299;Benin;Failed Calls
-616999;Benin;Fix Line
-61602;Benin;Moov
-61603;Benin;MTN
-35001;Bermuda;Digicel
-350299;Bermuda;Failed Calls
-350999;Bermuda;Fix Line
-35000;Bermuda;One
-40217;Bhutan;B-Mobile
-40211;Bhutan;B-Mobile
-402299;Bhutan;Failed Calls
-402999;Bhutan;Fix Line
-40277;Bhutan;TashiCell
-73602;Bolivia;Entel Movil
-736299;Bolivia;Failed Calls
-736999;Bolivia;Fix Line
-73603;Bolivia;Tigo
-73601;Bolivia;Viva
-21890;Bosnia and Herzegovina;BH Mobile
-21803;Bosnia and Herzegovina;Eronet
-218299;Bosnia and Herzegovina;Failed Calls
-218999;Bosnia and Herzegovina;Fix Line
-21805;Bosnia and Herzegovina;m:tel
-65204;Botswana;beMobile
-652299;Botswana;Failed Calls
-652999;Botswana;Fix Line
-65201;Botswana;Mascom
-65202;Botswana;Orange
-72433;Brazil;Algar Telecom
-72434;Brazil;Algar Telecom
-72432;Brazil;Algar Telecom
-72426;Brazil;Americanet
-724299;Brazil;ARQIA
-724299;Brazil;Bbs Options
-724299;Brazil;Cinco
-72438;Brazil;Claro
-72405;Brazil;Claro
-724299;Brazil;Failed Calls
-724999;Brazil;Fix Line
-72421;Brazil;Ligue
-72400;Brazil;Claro-nxt/Nextel
-72439;Brazil;Claro-nxt/Nextel
-724299;Brazil;NLT
-72431;Brazil;Oi Movel
-72416;Brazil;Oi Movel
-72415;Brazil;Sercomtel
-72417;Brazil;Surf
-724299;Brazil;Telecall
-72404;Brazil;TIM
-72403;Brazil;TIM
-72454;Brazil;TIM
-72402;Brazil;TIM
-724299;Brazil;Vecto Mobile
-72423;Brazil;Vivo
-72406;Brazil;Vivo
-72410;Brazil;Vivo
-72411;Brazil;Vivo
-348570;British Virgin Islands;CCT
-348770;British Virgin Islands;Digicel
-348299;British Virgin Islands;Failed Calls
-348999;British Virgin Islands;Fix Line
-348170;British Virgin Islands;Flow
-52802;Brunei;Progresif Cellular / B-Mobile
-52811;Brunei;DST
-52803;Brunei;DST
-528299;Brunei;Failed Calls
-528999;Brunei;Fix Line
-52801;Brunei;imagine
-28401;Bulgaria;A1
-28411;Bulgaria;Bulsatcom
-284299;Bulgaria;Failed Calls
-284999;Bulgaria;Fix Line
-28413;Bulgaria;T.com
-28405;Bulgaria;Telenor
-28403;Bulgaria;Vivacom
-613299;Burkina Faso;Failed Calls
-613999;Burkina Faso;Fix Line
-61302;Burkina Faso;Orange
-61303;Burkina Faso;Telecel
-61301;Burkina Faso;Telmob
-642299;Burundi;Failed Calls
-642999;Burundi;Fix Line
-64201;Burundi;Leo
-64282;Burundi;Leo
-64208;Burundi;Lumitel
-64203;Burundi;ONAMOB
-64207;Burundi;Smart
-45604;Cambodia;QB
-45601;Cambodia;Cellcard
-45618;Cambodia;Cellcard
-45616;Cambodia;CooTel
-456299;Cambodia;Failed Calls
-456999;Cambodia;Fix Line
-45608;Cambodia;Metfone
-456299;Cambodia;MPTC
-45611;Cambodia;Seatel
-45605;Cambodia;Smart
-45602;Cambodia;Smart
-45606;Cambodia;Smart
-624299;Cameroon;Failed Calls
-624999;Cameroon;Fix Line
-62401;Cameroon;MTN
-62404;Cameroon;Nextel
-62402;Cameroon;Orange
-302630;Canada;Bell Mobility
-30261;Canada;Bell Mobility
-302660;Canada;Bell Mobility
-30264;Canada;Bell Mobility
-302690;Canada;Bell Mobility
-30269;Canada;Bell Mobility
-302640;Canada;Bell Mobility
-302610;Canada;Bell Mobility
-30266;Canada;Bell Mobility
-30263;Canada;Bell Mobility
-302270;Canada;eastlink
-302299;Canada;Failed Calls
-30237;Canada;Fido
-302370;Canada;Fido
-302999;Canada;Fix Line
-30249;Canada;Freedom Mobile
-302491;Canada;Freedom Mobile
-302490;Canada;Freedom Mobile
-302620;Canada;Ice Wireless
-30262;Canada;Ice Wireless
-30253;Canada;K-Net Mobile
-302380;Canada;K-Net Mobile
-302530;Canada;K-Net Mobile
-30238;Canada;K-Net Mobile
-30232;Canada;Rogers
-30282;Canada;Rogers
-302320;Canada;Rogers
-302820;Canada;Rogers
-30272;Canada;Rogers
-302720;Canada;Rogers
-302721;Canada;Rogers
-302781;Canada;SaskTel Mobility
-302750;Canada;SaskTel Mobility
-30275;Canada;SaskTel Mobility
-302680;Canada;SaskTel Mobility
-30268;Canada;SaskTel Mobility
-30278;Canada;SaskTel Mobility
-302681;Canada;SaskTel Mobility
-302780;Canada;SaskTel Mobility
-302760;Canada;Telus Mobility
-30222;Canada;Telus Mobility
-302360;Canada;Telus Mobility
-302221;Canada;Telus Mobility
-30236;Canada;Telus Mobility
-302220;Canada;Telus Mobility
-302860;Canada;Telus Mobility
-30276;Canada;Telus Mobility
-30222;Canada;Telus Mobility
-30286;Canada;Telus Mobility
-30250;Canada;Videotron
-302510;Canada;Videotron
-302520;Canada;Videotron
-302500;Canada;Videotron
-30251;Canada;Videotron
-302299;Canada;Xplore Mobile
-62501;Cape Verde;CVMovel
-625299;Cape Verde;Failed Calls
-625999;Cape Verde;Fix Line
-62502;Cape Verde;Unitel T+
-34650;Cayman Islands;Digicel
-346299;Cayman Islands;Failed Calls
-346999;Cayman Islands;Fix Line
-346140;Cayman Islands;Flow / Lime
-34601;Cayman Islands;Logic
-62304;Central African Republic;Azur
-623299;Central African Republic;Failed Calls
-623999;Central African Republic;Fix Line
-62301;Central African Republic;Moov
-62303;Central African Republic;Orange
-623299;Central African Republic;Socatel
-62302;Central African Republic;Telecel
-62201;Chad;Airtel
-622299;Chad;Failed Calls
-622999;Chad;Fix Line
-62203;Chad;Moov
-62204;Chad;Salam
-730299;Chile;Boby
-730299;Chile;CellOPS
-73022;Chile;Cellplus
-73011;Chile;Celupago
-73015;Chile;Cibeles Telecom
-73027;Chile;Cibeles Telecom
-73003;Chile;Claro
-73023;Chile;Claro
-73017;Chile;Compatel
-730299;Chile;Dotcom
-73018;Chile;Empresas Bunker
-73010;Chile;Entel
-73001;Chile;Entel
-730299;Chile;Failed Calls
-730999;Chile;Fix Line
-730299;Chile;GTD Movil
-730299;Chile;Industel
-73006;Chile;INNET
-73020;Chile;Inversiones Santa Fe
-730299;Chile;Mavi
-730299;Chile;Mobilink
-73019;Chile;Movil Falabella
-73007;Chile;Movistar
-73002;Chile;Movistar
-730299;Chile;Mundo Pacifico
-73014;Chile;Netline
-730299;Chile;NetUno
-73016;Chile;Nomade Telecomunicaciones
-730299;Chile;Quantax
-730299;Chile;RedVoiss
-730299;Chile;Simple
-730299;Chile;Swedcom
-730299;Chile;Telcomax
-730299;Chile;Telefonica Uno Uno Cuatro
-73012;Chile;Telestar
-730299;Chile;Television Interactiva
-73013;Chile;Virgin Mobile
-730299;Chile;VOIP Analysis
-73008;Chile;VTR Movil
-73009;Chile;WOM
-73005;Chile;WOM
-73004;Chile;WOM
-46004;China;China Mobile
-46007;China;China Mobile
-46002;China;China Mobile
-46008;China;China Mobile
-46000;China;China Mobile
-46011;China;China Telecom
-46003;China;China Telecom
-46012;China;China Telecom
-46006;China;China Unicom
-46001;China;China Unicom
-46009;China;China Unicom
-46010;China;China Unicom
-460299;China;Failed Calls
-460999;China;Fix Line
-732299;Colombia;ATnet
-732130;Colombia;Avantel
-732666;Colombia;Claro
-732101;Colombia;Claro
-73202;Colombia;Edatel
-732187;Colombia;eTb
-732299;Colombia;Eztalk Mobile
-732299;Colombia;Failed Calls
-732999;Colombia;Fix Line
-732240;Colombia;Flash Mobile
-732299;Colombia;Gomobile
-732220;Colombia;Libre Tecnologias
-732299;Colombia;Movil Exito
-73201;Colombia;Movistar
-732123;Colombia;Movistar
-732299;Colombia;Plintron
-732230;Colombia;Setroc Mobile
-732199;Colombia;SUMA movil
-732103;Colombia;Tigo
-732165;Colombia;Tigo
-732111;Colombia;Tigo
-732299;Colombia;TuCEL
-732142;Colombia;UNE
-73220;Colombia;UNE
-732299;Colombia;Vilacom Mobile
-732154;Colombia;Virgin Mobile
-732360;Colombia;WOM
-654299;Comoros;Failed Calls
-654999;Comoros;Fix Line
-65401;Comoros;HURI
-65402;Comoros;Telma
-62901;Congo;Airtel
-629299;Congo;Failed Calls
-629999;Congo;Fix Line
-62910;Congo;MTN
-62907;Congo;Warid
-54801;Cook Islands;Vodafone / Bluesky
-548299;Cook Islands;Failed Calls
-548999;Cook Islands;Fix Line
-71203;Costa Rica;Claro
-712299;Costa Rica;Failed Calls
-712999;Costa Rica;Fix Line
-71202;Costa Rica;Kolbi / ICE
-71201;Costa Rica;Kolbi / ICE
-71204;Costa Rica;Movistar
-712299;Costa Rica;MultiCom
-712299;Costa Rica;racsa
-712299;Costa Rica;Tuyo Movil
-21910;Croatia;A1 / VIP
-219299;Croatia;Failed Calls
-219999;Croatia;Fix Line
-21901;Croatia;T-Mobile
-21912;Croatia;TELE FOCUS
-21902;Croatia;Telemach / Tele2
-36801;Cuba;Cubacel
-368299;Cuba;Failed Calls
-368999;Cuba;Fix Line
-368299;Cuba;MoviTel
-28022;Cyprus;Cablenet / Lemontel
-28002;Cyprus;Cytamobile-Vodafone
-28001;Cyprus;Cytamobile-Vodafone
-28010;Cyprus;Epic / MTN
-280299;Cyprus;Failed Calls
-280999;Cyprus;Fix Line
-28020;Cyprus;PrimeTel
-230299;Czech Republic;+4U Mobile
-230299;Czech Republic;3ton
-230299;Czech Republic;CEZ
-23008;Czech Republic;Compatel
-230299;Czech Republic;Dragon
-230299;Czech Republic;EriMobile
-230299;Czech Republic;Failed Calls
-230299;Czech Republic;Fayn
-230999;Czech Republic;Fix Line
-230299;Czech Republic;GoMobil
-230299;Czech Republic;ha-loo mobil
-230299;Czech Republic;Laudatio
-230299;Czech Republic;METRONET
-230299;Czech Republic;MOBIL21
-230299;Czech Republic;Nej Mobil
-230299;Czech Republic;NETBOX Mobil
-23004;Czech Republic;Nordic Telecom
-23002;Czech Republic;O2
-230299;Czech Republic;Odorik
-23005;Czech Republic;PODA
-230299;Czech Republic;SAZKA
-23098;Czech Republic;SZDC
-230299;Czech Republic;SZDC
-23001;Czech Republic;T-Mobile
-23007;Czech Republic;T-Mobile
-230299;Czech Republic;Tesco Mobile
-230299;Czech Republic;TOPefekt
-230299;Czech Republic;TT Quality
-230299;Czech Republic;Uniphone
-23009;Czech Republic;Uniphone
-23003;Czech Republic;Vodafone
-63090;Democratic Republic of Congo;Africell
-63002;Democratic Republic of Congo;Airtel
-630299;Democratic Republic of Congo;Failed Calls
-630999;Democratic Republic of Congo;Fix Line
-63086;Democratic Republic of Congo;Orange
-63005;Democratic Republic of Congo;Supercell
-630299;Democratic Republic of Congo;Tatem
-63001;Democratic Republic of Congo;Vodacom
-63088;Democratic Republic of Congo;Yozma Timeturns
-23806;Denmark;3
-238299;Denmark;42 Telecom
-238299;Denmark;5Tel
-23823;Denmark;Banedanmark
-238299;Denmark;Benemen
-238299;Denmark;Bolignet-Aarhus
-238299;Denmark;CBB Mobil
-238299;Denmark;celfon
-23888;Denmark;Cobira
-238299;Denmark;Companymobile
-23813;Denmark;Compatel
-238299;Denmark;Comtalk
-238299;Denmark;Evercall
-238299;Denmark;Failed Calls
-238299;Denmark;Firmafon
-238299;Denmark;Firstcom
-238999;Denmark;Fix Line
-238299;Denmark;Flexfone
-23817;Denmark;Gotanet
-23842;Denmark;Greenwave
-238299;Denmark;ipnordic
-238299;Denmark;Ipvision
-238299;Denmark;Lancelot
-238299;Denmark;Lebara
-23828;Denmark;LINK Mobility
-23812;Denmark;Lycamobile
-238299;Denmark;Maxtel.dk
-238299;Denmark;MI Carrier Services
-238299;Denmark;Mitto
-238299;Denmark;Mobiweb
-23814;Denmark;Monty Mobile
-23815;Denmark;Net 1
-23804;Denmark;Nexcon.io
-238299;Denmark;NextM2M
-23873;Denmark;Onomondo
-23830;Denmark;Pareteum
-238299;Denmark;SimService
-23803;Denmark;Syniverse
-23801;Denmark;TDC
-23810;Denmark;TDC
-23877;Denmark;Telenor
-23802;Denmark;Telenor
-238299;Denmark;Telenor Connexion
-23820;Denmark;Telia
-23896;Denmark;Telia
-23816;Denmark;Tismi
-238299;Denmark;Tripple Track
-238299;Denmark;Uni-tel
-23825;Denmark;Viahub
-238299;Denmark;Viptel
-23808;Denmark;Voxbone / Bandwidth
-310299;Diego Garcia;Failed Calls
-310999;Diego Garcia;Fix Line
-310299;Diego Garcia;Sure
-63801;Djibouti;Evatis
-638299;Djibouti;Failed Calls
-638999;Djibouti;Fix Line
-36650;Dominica;Digicel
-366299;Dominica;Failed Calls
-366999;Dominica;Fix Line
-366110;Dominica;Flow
-37002;Dominican Republic;Claro
-370299;Dominican Republic;Failed Calls
-370999;Dominican Republic;Fix Line
-37001;Dominican Republic;Orange / Altice
-370299;Dominican Republic;Satel
-37004;Dominican Republic;Viva
-514299;East Timor;Failed Calls
-514999;East Timor;Fix Line
-51403;East Timor;Telemor
-51401;East Timor;Telkomcel
-51402;East Timor;Timor Telecom
-74001;Ecuador;Claro
-74002;Ecuador;CNT movil
-740299;Ecuador;Failed Calls
-740999;Ecuador;Fix Line
-74000;Ecuador;Movistar
-60203;Egypt;Etisalat
-602299;Egypt;Failed Calls
-602999;Egypt;Fix Line
-60201;Egypt;Orange
-60202;Egypt;Vodafone
-60204;Egypt;WE
-70601;El Salvador;Claro
-70602;El Salvador;Digicel
-706299;El Salvador;Failed Calls
-706999;El Salvador;Fix Line
-70604;El Salvador;Movistar
-70605;El Salvador;RED
-70603;El Salvador;Tigo
-627299;Equatorial Guinea;Failed Calls
-627999;Equatorial Guinea;Fix Line
-62703;Equatorial Guinea;Muni
-62701;Equatorial Guinea;Orange
-65701;Eritrea;Eritel
-657299;Eritrea;Failed Calls
-657999;Eritrea;Fix Line
-24802;Estonia;Elisa
-248299;Estonia;Failed Calls
-248999;Estonia;Fix Line
-24803;Estonia;Tele2
-24813;Estonia;Telia
-24801;Estonia;Telia
-24804;Estonia;TravelSim
-63601;Ethiopia;Ethio Mobile
-636299;Ethiopia;Failed Calls
-636999;Ethiopia;Fix Line
-63602;Ethiopia;Safaricom
-750999;Falkland Islands;Fix Line
-750299;Falkland Islands;Failed Calls
-75001;Falkland Islands;Sure
-288299;Faroe Islands;Failed Calls
-28801;Faroe Islands;Faroese Telecom
-288999;Faroe Islands;Fix Line
-28802;Faroe Islands;Hey / Kall
-28803;Faroe Islands;Tosa
-54202;Fiji;DigiCell
-542299;Fiji;Failed Calls
-542999;Fiji;Fix Line
-54201;Fiji;Vodafone
-24414;Finland;Alcom
-244299;Finland;Benemen
-24426;Finland;Compatel
-244299;Finland;Cuuma
-24413;Finland;DNA
-24412;Finland;DNA
-24403;Finland;DNA
-24404;Finland;DNA
-24406;Finland;Elisa
-24421;Finland;Elisa
-24405;Finland;Elisa
-244299;Finland;Failed Calls
-244999;Finland;Fix Line
-244299;Finland;interactive digital media / IDM
-244299;Finland;IPIFY
-244299;Finland;Lancelot
-244299;Finland;MI Carrier Services
-244299;Finland;MobiWeb
-24424;Finland;Nord Connect
-24439;Finland;NSN
-24441;Finland;NSN
-24440;Finland;NSN
-24407;Finland;NSN
-24438;Finland;NSN
-24408;Finland;NSN
-24409;Finland;NSN
-244299;Finland;Premium Numbers
-244299;Finland;RAILI
-24443;Finland;Telavox
-24436;Finland;Telia
-24491;Finland;Telia
-24415;Finland;Telit
-24437;Finland;Tismi
-244299;Finland;TravelSim
-244299;Finland;Twilio
-24435;Finland;Ukko Mobile
-24442;Finland;Viahub
-24447;Finland;VIRVE
-24446;Finland;VIRVE
-24433;Finland;VIRVE
-24445;Finland;VIRVE
-24432;Finland;Voxbone / Bandwidth
-208299;France;Add-On Multimedia
-208299;France;Afone Mobile
-20828;France;Airmob
-208299;France;Alphalink
-208299;France;Alphalink
-208299;France;Annatel
-208299;France;Atlas
-208299;France;Auchan
-208299;France;Auchan
-208299;France;Axialys
-208299;France;Bazile
-208299;France;BJT
-208299;France;BJT
-20888;France;Bouygues Telecom
-20821;France;Bouygues Telecom
-20820;France;Bouygues Telecom
-208299;France;Bretagne Telecom
-208299;France;CAT
-208299;France;CELESTE
-20834;France;Cellhire
-208299;France;Codepi
-208299;France;Coolwave
-20827;France;Coriolis
-208299;France;CPRO
-208299;France;CRH
-208299;France;CRT
-208299;France;CTExcel
-208299;France;Doctolib
-208299;France;Failed Calls
-208999;France;Fix Line
-208299;France;Foliateam
-20815;France;Free Mobile
-20835;France;Free Mobile
-20816;France;Free Mobile
-20836;France;Free Mobile
-20894;France;Halys
-208299;France;Happy Telecom
-208299;France;Hexatel
-20889;France;Hub One
-208299;France;i-via
-20837;France;IP Directions
-208299;France;IP Telecom
-208299;France;Iptis
-208299;France;JOi
-208299;France;Kertel
-208299;France;Keyyo Mobile
-208299;France;La Poste Mobile
-208299;France;La Poste Mobile
-208299;France;LASOTEL
-20838;France;Lebara
-20817;France;Legos
-208299;France;Linkt
-208299;France;LITEYEAR
-20825;France;Lycamobile
-20824;France;MobiquiThings
-20803;France;MobiquiThings
-208299;France;Netcom
-20839;France;Networth Telecom
-208299;France;Nordnet
-20826;France;NRJ
-208299;France;onoff
-208299;France;OpenIP
-20801;France;Orange
-20891;France;Orange
-20802;France;Orange
-20832;France;Orange
-208299;France;Paritel
-208299;France;Prixtel
-208299;France;Prixtel
-208299;France;SCT TELECOM
-208299;France;SCT TELECOM
-208299;France;Sewan Communications
-20813;France;SFR
-20808;France;SFR
-20811;France;SFR
-20810;France;SFR
-20809;France;SFR
-208299;France;SIMbioz
-20830;France;Syma Mobile
-208299;France;TDF
-208299;France;Tismi
-20822;France;Transatel
-208299;France;Trunkline
-20812;France;Truphone
-208299;France;unyc
-208299;France;VA SOLUTIONS
-20831;France;Vectone Mobile
-208299;France;VOIP Telecom
-547299;French Polynesia;Failed Calls
-547999;French Polynesia;Fix Line
-547299;French Polynesia;Ora
-54720;French Polynesia;Vini
-54715;French Polynesia;Vodafone
-62803;Gabon;Airtel
-628299;Gabon;Failed Calls
-628999;Gabon;Fix Line
-62801;Gabon;Libertis
-60702;Gambia;Africel
-60703;Gambia;Comium
-607299;Gambia;Failed Calls
-607999;Gambia;Fix Line
-60701;Gambia;Gamcel
-60704;Gambia;QCell
-28204;Georgia;Beeline
-282299;Georgia;Failed Calls
-282999;Georgia;Fix Line
-28201;Georgia;Geocell
-28207;Georgia;GlobalCell
-28202;Georgia;MagtiCom
-28211;Georgia;Mobilive
-28222;Georgia;MyPhone
-28210;Georgia;Premium Net
-28208;Georgia;Silknet
-28212;Georgia;Telecom 1
-26223;Germany;1&1
-262299;Germany;Argon Networks
-26210;Germany;DB Netz
-262299;Germany;Failed Calls
-262999;Germany;Fix Line
-26214;Germany;Lebara
-26243;Germany;Lycamobile
-26213;Germany;T-mobile
-26225;Germany;Mtel
-26221;Germany;Multiconnect
-26212;Germany;sipgate
-26222;Germany;sipgate
-26201;Germany;T-mobile
-26278;Germany;T-mobile
-26206;Germany;T-mobile
-26224;Germany;TelcoVillage
-26205;Germany;Telefonica / O2
-26220;Germany;Telefonica / O2
-26217;Germany;Telefonica / O2
-26203;Germany;Telefonica / O2
-26216;Germany;Telefonica / O2
-26211;Germany;Telefonica / O2
-26208;Germany;Telefonica / O2
-26207;Germany;Telefonica / O2
-262299;Germany;Tismi
-26242;Germany;Truphone
-26202;Germany;Vodafone
-26209;Germany;Vodafone
-26204;Germany;Vodafone
-62006;Ghana;Airtel
-62003;Ghana;Airtel
-620299;Ghana;Comsys
-620299;Ghana;Failed Calls
-620999;Ghana;Fix Line
-62007;Ghana;Glo
-62001;Ghana;MTN
-62005;Ghana;National Security
-62008;Ghana;Surfline
-62002;Ghana;Vodafone
-266299;Gibraltar;Failed Calls
-266999;Gibraltar;Fix Line
-266299;Gibraltar;GibFibreSpeed
-26601;Gibraltar;Gibtel
-202299;Greece;AMD Telecom
-202299;Greece;Apifon
-20215;Greece;BWS
-20202;Greece;Cosmote
-20201;Greece;Cosmote
-202299;Greece;Failed Calls
-202999;Greece;Fix Line
-20216;Greece;Inter Telecom
-202299;Greece;Interconnect
-202299;Greece;M-STAT
-202299;Greece;Nova
-20204;Greece;OSE
-20203;Greece;OTE
-202299;Greece;OTEGLOBE
-202299;Greece;Premium Net
-20205;Greece;Vodafone
-20210;Greece;Wind
-20209;Greece;Wind
-20212;Greece;Yuboto
-290299;Greenland;Failed Calls
-290999;Greenland;Fix Line
-29001;Greenland;Tele Greenland
-35250;Grenada;Digicel
-352299;Grenada;Failed Calls
-352999;Grenada;Fix Line
-352110;Grenada;Flow
-352299;Grenada;Spice Mobile
-34008;Guadeloupe and Martinique and French Guiana;Amigo
-34020;Guadeloupe and Martinique and French Guiana;Digicel
-340299;Guadeloupe and Martinique and French Guiana;Failed Calls
-340999;Guadeloupe and Martinique and French Guiana;Fix Line
-34004;Guadeloupe and Martinique and French Guiana;Free
-34001;Guadeloupe and Martinique and French Guiana;Orange
-34002;Guadeloupe and Martinique and French Guiana;SFR
-310370;Guam;Docomo Pacific
-310470;Guam;Docomo Pacific
-310299;Guam;Failed Calls
-310999;Guam;Fix Line
-310140;Guam;GTA
-310110;Guam;IT&E
-70401;Guatemala;Claro
-704299;Guatemala;Failed Calls
-704999;Guatemala;Fix Line
-70403;Guatemala;Movistar
-70402;Guatemala;Tigo
-61105;Guinea;Cellcom
-611299;Guinea;Failed Calls
-611999;Guinea;Fix Line
-61104;Guinea;MTN
-61101;Guinea;Orange
-632299;Guinea-Bissau;Failed Calls
-632999;Guinea-Bissau;Fix Line
-63201;Guinea-Bissau;Guinetel
-63202;Guinea-Bissau;MTN
-63203;Guinea-Bissau;Orange
-73802;Guyana;Cellink
-73801;Guyana;Digicel
-738299;Guyana;Failed Calls
-738999;Guyana;Fix Line
-37202;Haiti;Digicel
-372299;Haiti;Failed Calls
-372999;Haiti;Fix Line
-37203;Haiti;Natcom
-70801;Honduras;Claro
-70801;Honduras;Claro
-708299;Honduras;Failed Calls
-708999;Honduras;Fix Line
-70830;Honduras;HonduTel
-70830;Honduras;HonduTel
-70802;Honduras;Tigo
-70802;Honduras;Tigo
-45414;Hong Kong;3
-45405;Hong Kong;3
-45404;Hong Kong;3
-45403;Hong Kong;3
-45412;Hong Kong;China Mobile
-45430;Hong Kong;China Mobile
-45413;Hong Kong;China Mobile
-45432;Hong Kong;HKBN
-45407;Hong Kong;China Unicom
-45411;Hong Kong;CHKTL
-45401;Hong Kong;Citic
-45431;Hong Kong;CTExcel
-45436;Hong Kong;Eascotel
-454999;Hong Kong;Fix Line
-45425;Hong Kong;Government
-454392;Hong Kong;Government
-454396;Hong Kong;Government
-454391;Hong Kong;Government
-454395;Hong Kong;Government
-454390;Hong Kong;Government
-454394;Hong Kong;Government
-45428;Hong Kong;Government
-454398;Hong Kong;Government
-454393;Hong Kong;Government
-45427;Hong Kong;Government
-45426;Hong Kong;Government
-454397;Hong Kong;Government
-45424;Hong Kong;Multibyte
-45417;Hong Kong;SmarTone
-45406;Hong Kong;SmarTone
-45415;Hong Kong;SmarTone
-45402;Hong Kong;SUN Mobile / CSL
-45410;Hong Kong;SUN Mobile / CSL
-45420;Hong Kong;SUN Mobile / CSL
-45418;Hong Kong;SUN Mobile / CSL
-45419;Hong Kong;SUN Mobile / CSL
-45400;Hong Kong;SUN Mobile / CSL
-45416;Hong Kong;SUN Mobile / CSL
-45408;Hong Kong;Tru
-45435;Hong Kong;Webbing
-216299;Hungary;Antenna
-21603;Hungary;Digi
-216299;Hungary;Failed Calls
-216999;Hungary;Fix line
-216299;Hungary;Invitech
-216299;Hungary;Mobil4
-21602;Hungary;MVM NET
-216299;Hungary;Netfone
-216299;Hungary;TARR
-21630;Hungary;Telekom
-21601;Hungary;Telenor
-216299;Hungary;Vidanet
-21670;Hungary;Vodafone
-274299;Iceland;Failed Calls
-274999;Iceland;Fix Line
-27411;Iceland;NOVA
-27431;Iceland;Siminn
-27408;Iceland;Siminn
-27401;Iceland;Siminn
-27416;Iceland;Tismi
-27404;Iceland;Viking Wireless
-27412;Iceland;Vodafone
-27403;Iceland;Vodafone
-27402;Iceland;Vodafone
-40537;India;Aircel
-40441;India;Aircel
-40593;India;Airtel
-40503;India;Airtel
-40428;India;Aircel
-40528;India;Aircel
-40598;India;Airtel
-40549;India;Airtel
-40541;India;Aircel
-40437;India;Aircel
-40594;India;Airtel
-40506;India;Airtel
-40425;India;Aircel
-40435;India;Aircel
-40529;India;Aircel
-40570;India;Airtel
-40542;India;Aircel
-40595;India;Airtel
-40510;India;Airtel
-40533;India;Aircel
-40590;India;Airtel
-40591;India;Aircel
-40433;India;Aircel
-40517;India;Aircel
-40596;India;Airtel
-40516;India;Airtel
-40535;India;Aircel
-40491;India;Aircel
-40417;India;Aircel
-40442;India;Aircel
-40592;India;Airtel
-40502;India;Airtel
-40429;India;Aircel
-40525;India;Aircel
-40597;India;Airtel
-40531;India;Airtel
-40494;India;Airtel
-40498;India;Airtel
-40406;India;Airtel
-40493;India;Airtel
-40449;India;Airtel
-40497;India;Airtel
-40403;India;Airtel
-40492;India;Airtel
-40431;India;Airtel
-40496;India;Airtel
-40402;India;Airtel
-40490;India;Airtel
-40416;India;Airtel
-40495;India;Airtel
-40470;India;Airtel
-40410;India;Airtel
-40571;India;BSNL Mobile
-40472;India;BSNL Mobile
-40553;India;BSNL Mobile
-40480;India;BSNL Mobile
-40576;India;BSNL Mobile
-40459;India;BSNL Mobile
-40559;India;BSNL Mobile
-40476;India;BSNL Mobile
-40453;India;BSNL Mobile
-40572;India;BSNL Mobile
-40471;India;BSNL Mobile
-40554;India;BSNL Mobile
-40577;India;BSNL Mobile
-40458;India;BSNL Mobile
-40562;India;BSNL Mobile
-40475;India;BSNL Mobile
-40534;India;BSNL Mobile
-40451;India;BSNL Mobile
-40573;India;BSNL Mobile
-40466;India;BSNL Mobile
-40555;India;BSNL Mobile
-40580;India;BSNL Mobile
-40457;India;BSNL Mobile
-40564;India;BSNL Mobile
-40474;India;BSNL Mobile
-40538;India;BSNL Mobile
-40438;India;BSNL Mobile
-40574;India;BSNL Mobile
-40464;India;BSNL Mobile
-40557;India;BSNL Mobile
-40581;India;BSNL Mobile
-40455;India;BSNL Mobile
-40566;India;BSNL Mobile
-40473;India;BSNL Mobile
-40551;India;BSNL Mobile
-40434;India;BSNL Mobile
-40481;India;BSNL Mobile
-40575;India;BSNL Mobile
-40462;India;BSNL Mobile
-40558;India;BSNL Mobile
-40477;India;BSNL Mobile
-40454;India;BSNL Mobile
-40569;India;Dolphin
-40469;India;Dolphin
-404299;India;Failed Calls
-404999;India;Fix Line
-405999;India;Fix Line
-40468;India;Garuda
-40568;India;Garuda
-40414;India;Idea
-405849;India;Idea
-404846;India;Idea
-40522;India;Idea
-40589;India;Idea
-40444;India;Idea
-40582;India;Idea
-404852;India;Idea
-40507;India;Idea
-40412;India;Idea
-405850;India;Idea
-404845;India;Idea
-40524;India;Idea
-40424;India;Idea
-405845;India;Idea
-404850;India;Idea
-40512;India;Idea
-40407;India;Idea
-405852;India;Idea
-40482;India;Idea
-40544;India;Idea
-40489;India;Idea
-40422;India;Idea
-405846;India;Idea
-404849;India;Idea
-40514;India;Idea
-40404;India;Idea
-405853;India;Idea
-40478;India;Idea
-40556;India;Idea
-40487;India;Idea
-40419;India;Idea
-405848;India;Idea
-404848;India;Idea
-40519;India;Idea
-40587;India;Idea
-40456;India;Idea
-40578;India;Idea
-404853;India;Idea
-40504;India;Idea
-404856;India;Jio
-404866;India;Jio
-405866;India;Jio
-405857;India;Jio
-404860;India;Jio
-404871;India;Jio
-404862;India;Jio
-405871;India;Jio
-405862;India;Jio
-404857;India;Jio
-404867;India;Jio
-405867;India;Jio
-405858;India;Jio
-404872;India;Jio
-404854;India;Jio
-404863;India;Jio
-405872;India;Jio
-405863;India;Jio
-405854;India;Jio
-404868;India;Jio
-405868;India;Jio
-405859;India;Jio
-404873;India;Jio
-404855;India;Jio
-404864;India;Jio
-405873;India;Jio
-405864;India;Jio
-405855;India;Jio
-404858;India;Jio
-404869;India;Jio
-405869;India;Jio
-405861;India;Jio
-405860;India;Jio
-404865;India;Jio
-405874;India;Jio
-405865;India;Jio
-405856;India;Jio
-404859;India;Jio
-404870;India;Jio
-404861;India;Jio
-405870;India;Jio
-405861;India;Jio
-404874;India;Jio
-40521;India;Loop Mobile
-40421;India;Loop Mobile
-40409;India;Reliance Mobile
-40509;India;Reliance Mobile
-40423;India;Reliance Mobile
-40552;India;Reliance Mobile
-40483;India;Reliance Mobile
-40518;India;Reliance Mobile
-40436;India;Reliance Mobile
-40567;India;Reliance Mobile
-40485;India;Reliance Mobile
-40523;India;Reliance Mobile
-40450;India;Reliance Mobile
-40583;India;Reliance Mobile
-40536;India;Reliance Mobile
-40452;India;Reliance Mobile
-40585;India;Reliance Mobile
-40408;India;Reliance Mobile
-40508;India;Reliance Mobile
-40418;India;Reliance Mobile
-40550;India;Reliance Mobile
-40467;India;Reliance Mobile
-40584;India;Vodafone
-40415;India;Vodafone
-40511;India;Vodafone
-40488;India;Vodafone
-40530;India;Vodafone
-40443;India;Vodafone
-40586;India;Vodafone
-40413;India;Vodafone
-40513;India;Vodafone
-40486;India;Vodafone
-40543;India;Vodafone
-40430;India;Vodafone
-40501;India;Vodafone
-40588;India;Vodafone
-40411;India;Vodafone
-40515;India;Vodafone
-40484;India;Vodafone
-40546;India;Vodafone
-40427;India;Vodafone
-40405;India;Vodafone
-40520;India;Vodafone
-40460;India;Vodafone
-40560;India;Vodafone
-40420;India;Vodafone
-40505;India;Vodafone
-40401;India;Vodafone
-40527;India;Vodafone
-40446;India;Vodafone
-51089;Indonesia;3
-510299;Indonesia;Failed Calls
-510999;Indonesia;Fix Line
-51001;Indonesia;Indosat Ooredoo
-51062;Indonesia;Indosat Ooredoo
-51021;Indonesia;Indosat Ooredoo
-51027;Indonesia;Net1
-51009;Indonesia;Smartfren
-51028;Indonesia;Smartfren
-51099;Indonesia;Smartfren
-51020;Indonesia;Telkomsel
-51010;Indonesia;Telkomsel
-51008;Indonesia;XL
-51011;Indonesia;XL
-90167;International Networks;1NCE
-90176;International Networks;A1
-90114;International Networks;AeroMobile
-901299;International Networks;Afinna One
-90181;International Networks;Airnity
-90182;International Networks;AnyNet
-90124;International Networks;Bandwidth
-90155;International Networks;Beezz
-90158;International Networks;BICS
-90170;International Networks;Bubbletone
-90118;International Networks;Cingular Wireless Network
-90116;International Networks;Cisco Jasper
-90148;International Networks;Com4 Sweden
-90173;International Networks;Cubic
-90142;International Networks;DCN Hub
-90140;International Networks;Deutsche Telekom
-901299;International Networks;DIDWW
-90150;International Networks;EchoStar Mobile
-901299;International Networks;Ellipsat
-90143;International Networks;EMnify
-901299;International Networks;EMSAT
-901299;International Networks;Failed Calls
-901999;International Networks;Fix Line
-901299;International Networks;Global Access Services
-901299;International Networks;Globalstar
-90113;International Networks;GSM.AQ
-90122;International Networks;i-lincc
-90111;International Networks;Inmarsat
-90120;International Networks;Intermatica
-90103;International Networks;Iridium
-90169;International Networks;Legos
-90166;International Networks;Limitless
-90152;International Networks;Manx Telecom
-90119;International Networks;Maritime Roaming Service
-901299;International Networks;MCNtelecom
-90112;International Networks;MCP
-90159;International Networks;MessageBird
-90127;International Networks;Monaco Telecom
-90184;International Networks;Movistar
-90138;International Networks;MTT
-90139;International Networks;MTX Connect
-90117;International Networks;Navitas Telecom
-90179;International Networks;Nokia
-90185;International Networks;O2
-90115;International Networks;OnAir
-90141;International Networks;One Network
-90147;International Networks;Ooredoo
-90131;International Networks;Orange
-901299;International Networks;Oration Technologies
-901299;International Networks;Phonegroup
-90165;International Networks;Plintron
-90175;International Networks;Pod
-901299;International Networks;republic wireless
-90157;International Networks;SAP
-901299;International Networks;Sipme
-90133;International Networks;SMART
-90178;International Networks;Sparkle
-90164;International Networks;Syniverse
-90172;International Networks;Tele2
-901299;International Networks;Telecom26
-901299;International Networks;Telekom Malaysia
-90129;International Networks;Telenor Connexion
-90105;International Networks;Thuraya RMSS
-90137;International Networks;Transatel
-90162;International Networks;Twilio
-90134;International Networks;tyntec
-90151;International Networks;VisionNG
-90121;International Networks;Wins
-901299;International Networks;Zain
-432299;Iran;Anarestan
-432299;Iran;ApTel
-432299;Iran;Arian Tel
-432299;Iran;Failed Calls
-432999;Iran;Fix Line
-432299;Iran;LotusTel
-43211;Iran;MCI
-43219;Iran;MTCE
-43235;Iran;MTN IranCell
-43220;Iran;RighTel
-43201;Iran;SamanTel
-43208;Iran;Shatel Mobile
-43232;Iran;Taliya
-43214;Iran;Telekish
-41805;Iraq;Asia Cell
-418299;Iraq;Failed Calls
-418999;Iraq;Fix Line
-41840;Iraq;Korek
-41845;Iraq;Mobitel
-41820;Iraq;Zain
-41830;Iraq;Zain
-27205;Ireland;3
-27202;Ireland;3
-27217;Ireland;3
-272299;Ireland;BT
-27216;Ireland;Carphone Mobile
-272299;Ireland;Cubic Telecom
-272299;Ireland;Failed Calls
-272999;Ireland;Fix Line
-27213;Ireland;Lycamobile
-27207;Ireland;Meteor
-27203;Ireland;Meteor
-27208;Ireland;Meteor
-272299;Ireland;Net Feasa
-272299;Ireland;OGCIO
-27211;Ireland;Tesco Mobile
-27215;Ireland;Virgin Media
-27201;Ireland;Vodafone
-42519;Israel;019 Mobile
-425299;Israel;Annatel Mobile
-42523;Israel;Beezz
-425299;Israel;Bynet
-425299;Israel;Cellact
-42502;Israel;Cellcom
-425299;Israel;Failed Calls
-425999;Israel;Fix Line
-42508;Israel;Golan Telecom
-42515;Israel;Home Cellular
-42577;Israel;Hot Mobile
-42507;Israel;Hot Mobile
-42513;Israel;Ituran
-42522;Israel;Maskyoo
-42501;Israel;Orange
-42512;Israel;Pelephone
-42503;Israel;Pelephone
-42516;Israel;Rami Levy Communications
-425299;Israel;T2T
-42517;Israel;Von waves
-42509;Israel;We4G
-42514;Israel;YouPhone
-222299;Italy;1Mobile
-222299;Italy;A-Tono
-22240;Italy;Agile Telecom
-22234;Italy;BT mobile
-222299;Italy;Esendex
-222299;Italy;Compatel
-22253;Italy;CoopVoce
-222299;Italy;Daily Telecom Mobile
-22236;Italy;Digi
-222299;Italy;DireQ
-22242;Italy;Enel
-222299;Italy;Failed Calls
-22208;Italy;Fastweb
-222999;Italy;Fix Line
-22299;Italy;WindTre / Hi3G
-22250;Italy;Iliad
-222299;Italy;Kaleyra
-22239;Italy;SMS.it / LINK Mobility
-22235;Italy;Lycamobile
-22207;Italy;Noverca Italia
-22254;Italy;Plintron
-22233;Italy;Poste Mobile
-222999;Italy;Premium Numbers
-22258;Italy;rdcom
-22230;Italy;RFI
-22256;Italy;spusu
-22201;Italy;TIM
-22248;Italy;Telecom Italia Mobile
-22243;Italy;Telecom Italia Mobile
-222299;Italy;Sparkle
-222299;Italy;Tiscali
-22244;Italy;Mundio
-22251;Italy;ho.
-22249;Italy;Vianova Mobile
-22210;Italy;Vodafone
-22206;Italy;Vodafone
-222299;Italy;Vola
-222299;Italy;Webcom
-22288;Italy;WindTre / WIND
-22237;Italy;WindTre / Hi3G
-612299;Ivory Coast;Failed Calls
-612999;Ivory Coast;Fix Line
-61202;Ivory Coast;Moov
-61205;Ivory Coast;MTN
-61203;Ivory Coast;Orange
-33850;Jamaica;Digicel
-338299;Jamaica;Failed Calls
-338999;Jamaica;Fix Line
-338110;Jamaica;Flow
-338180;Jamaica;Flow
-440299;Japan;Failed Calls
-440999;Japan;Fix Line
-44075;Japan;KDDI
-44053;Japan;KDDI
-44071;Japan;KDDI
-44076;Japan;KDDI
-44054;Japan;KDDI
-44072;Japan;KDDI
-44050;Japan;KDDI
-44070;Japan;KDDI
-44073;Japan;KDDI
-44051;Japan;KDDI
-44074;Japan;KDDI
-44052;Japan;KDDI
-44010;Japan;NTT DoCoMo
-44078;Japan;Okinawa Cellular
-44011;Japan;Rakuten Mobile
-44020;Japan;SoftBank
-44000;Japan;SoftBank
-44021;Japan;SoftBank
-44005;Japan;SoftBank
-44001;Japan;SoftBank
-416299;Jordan;Failed Calls
-416999;Jordan;Fix Line
-41677;Jordan;Orange
-41603;Jordan;Umniah
-41601;Jordan;Zain
-40107;Kazakhstan;Altel
-401299;Kazakhstan;Arna
-40101;Kazakhstan;Beeline
-401299;Kazakhstan;Failed Calls
-401999;Kazakhstan;Fix Line
-40108;Kazakhstan;Kazakhstan Online
-40102;Kazakhstan;Kcell
-40177;Kazakhstan;Tele2
-63903;Kenya;Airtel
-63905;Kenya;Airtel
-639299;Kenya;eferio
-639299;Kenya;Failed Calls
-63906;Kenya;Finserve Africa
-639999;Kenya;Fix Line
-63909;Kenya;Homeland Media
-63912;Kenya;Infura
-63911;Kenya;Jambo Telcoms
-63910;Kenya;Jamii Telecommunications
-63904;Kenya;Mobile Pay
-63902;Kenya;Safaricom
-63901;Kenya;Safaricom
-63907;Kenya;Telkom
-545299;Kiribati;Failed Calls
-545999;Kiribati;Fix Line
-54501;Kiribati;FrigateNet
-54509;Kiribati;FrigateNet
-545299;Kiribati;Ocean Link
-22107;Kosovo;D3 mobile
-221299;Kosovo;Failed Calls
-221999;Kosovo;Fix Line
-22102;Kosovo;IPKO
-221299;Kosovo;MTS
-22101;Kosovo;Vala
-419299;Kuwait;Failed Calls
-419999;Kuwait;Fix Line
-41903;Kuwait;Ooredoo
-419299;Kuwait;Virgin Mobile
-41904;Kuwait;Viva
-41902;Kuwait;Zain
-43701;Kyrgyzstan;Beeline
-437299;Kyrgyzstan;Failed Calls
-437999;Kyrgyzstan;Fix Line
-43706;Kyrgyzstan;KT Mobile
-43705;Kyrgyzstan;MegaCom
-43709;Kyrgyzstan;O!
-43710;Kyrgyzstan;Saima
-43703;Kyrgyzstan;Fonex
-45708;Laos;Beeline
-45702;Laos;ETL Mobile
-457299;Laos;Failed Calls
-457999;Laos;Fix Line
-45701;Laos;LTC
-45703;Laos;Unitel
-24705;Latvia;Bite
-247299;Latvia;Failed Calls
-247999;Latvia;Fix Line
-24701;Latvia;LMT
-24710;Latvia;LMT
-247299;Latvia;Premium Numbers
-24702;Latvia;Tele2
-24704;Latvia;Tet
-24703;Latvia;TRIATEL
-24708;Latvia;VENTA Mobile
-24709;Latvia;XOmobile
-41501;Lebanon;Alfa
-415299;Lebanon;Failed Calls
-415999;Lebanon;Fix Line
-41503;Lebanon;Touch
-65102;Lesotho;Econet
-651299;Lesotho;Failed Calls
-651999;Lesotho;Fix Line
-65101;Lesotho;Vodacom
-618299;Liberia;Failed Calls
-618999;Liberia;Fix Line
-61801;Liberia;MTN / Lonestar
-61804;Liberia;Novafone
-61807;Liberia;Orange
-60601;Libya;Al-Madar
-606299;Libya;Failed Calls
-606999;Libya;Fix Line
-60600;Libya;Libyana
-60603;Libya;LibyaPhone Mobile
-29502;Liechtenstein;7acht
-29506;Liechtenstein;CUBIC
-295299;Liechtenstein;Datamobile
-295299;Liechtenstein;Dimoco
-29509;Liechtenstein;EMnify
-295299;Liechtenstein;Failed Calls
-295999;Liechtenstein;Fix Line
-246999;Liechtenstein;Fix Line
-29501;Liechtenstein;FL GSM
-29505;Liechtenstein;FL1
-295299;Liechtenstein;SORACOM
-295299;Liechtenstein;Telna
-24602;Lithuania;Bite
-246299;Lithuania;Failed Calls
-24605;Lithuania;LTG
-24606;Lithuania;Mediafon
-246299;Lithuania;SkyCall
-24603;Lithuania;Tele2
-246299;Lithuania;Teletel
-24601;Lithuania;Telia
-27010;Luxembourg;Blue Communications
-270299;Luxembourg;Bouygues Telecom
-27081;Luxembourg;e-LUX Mobile
-270299;Luxembourg;Eltrona
-270299;Luxembourg;Failed Calls
-270999;Luxembourg;Fix Line
-27005;Luxembourg;Luxembourg Online
-270299;Luxembourg;MTX Connect
-27099;Luxembourg;Orange
-27001;Luxembourg;Post
-27077;Luxembourg;Tango
-45503;Macao;3
-45505;Macao;3
-45507;Macao;China Telecom
-45502;Macao;China Telecom
-45504;Macao;CTM
-45501;Macao;CTM
-455299;Macao;Failed Calls
-455999;Macao;Fix Line
-45506;Macao;SmarTone
-45500;Macao;SmarTone
-64601;Madagascar;Airtel
-646299;Madagascar;Bip
-646299;Madagascar;Failed Calls
-646999;Madagascar;Fix Line
-64602;Madagascar;Orange
-64604;Madagascar;Telma
-65010;Malawi;Airtel
-650299;Malawi;Failed Calls
-650999;Malawi;Fix Line
-65001;Malawi;TNM
-502156;Malaysia;Altel Communications
-50214;Malaysia;Telekom Malaysia
-50211;Malaysia;Telekom Malaysia
-50219;Malaysia;Celcom
-50213;Malaysia;Celcom
-50210;Malaysia;DiGi
-50216;Malaysia;DiGi
-502299;Malaysia;Failed Calls
-502999;Malaysia;Fix Line
-502299;Malaysia;MKN
-50217;Malaysia;Maxis
-50212;Malaysia;Maxis
-502299;Malaysia;Maxis Broadband
-502299;Malaysia;OCESB
-502299;Malaysia;REDtone Mobile
-502299;Malaysia;REDtone
-502299;Malaysia;TT dotCom
-502150;Malaysia;Tune Talk
-50218;Malaysia;U Mobile
-502153;Malaysia;Webe Digital
-502195;Malaysia;XOX Com
-502299;Malaysia;Y-Max
-502152;Malaysia;Yes
-47201;Maldives;DhiMobile
-472299;Maldives;Failed Calls
-472999;Maldives;Fix Line
-47202;Maldives;Ooredoo
-610299;Mali;Failed Calls
-610999;Mali;Fix Line
-61001;Mali;Malitel
-61002;Mali;Orange
-61003;Mali;Telecel
-27801;Malta;Epic
-278299;Malta;Failed Calls
-278999;Malta;Fix Line
-27821;Malta;GO Mobile
-27830;Malta;GO Mobile
-27877;Malta;Melita
-551299;Marshall Islands;Failed Calls
-551999;Marshall Islands;Fix Line
-551299;Marshall Islands;MINTA
-60902;Mauritania;Chinguitel
-609299;Mauritania;Failed Calls
-609999;Mauritania;Fix Line
-60901;Mauritania;Mattel
-60910;Mauritania;Mauritel
-61702;Mauritius;Chili
-61703;Mauritius;Chili
-61710;Mauritius;Emtel
-617299;Mauritius;Failed Calls
-617999;Mauritius;Fix Line
-61701;Mauritius;my.t mobile
-647299;Mayotte;Failed Calls
-647999;Mayotte;Fix Line
-64701;Mayotte;Maore Mobile
-64710;Mayotte;SFR
-334140;Mexico;ALTAN Redes
-334299;Mexico;Altcel
-33450;Mexico;AT&T / IUSACell
-33450;Mexico;AT&T / IUSACell
-334299;Mexico;Failed Calls
-334999;Mexico;Fix Line
-334299;Mexico;FreedomPop
-334299;Mexico;Ibo Cell
-334299;Mexico;Maxcom
-334299;Mexico;MegaTel
-33403;Mexico;Movistar
-33430;Mexico;Movistar
-334299;Mexico;NEUS Mobile
-33401;Mexico;Nextel
-33410;Mexico;Nextel
-33490;Mexico;Nextel
-334299;Mexico;QBOcel
-33460;Mexico;SAI PCS
-334299;Mexico;Servitron
-33420;Mexico;Telcel
-33402;Mexico;Telcel
-334299;Mexico;Telecomunicaciones 360
-33480;Mexico;Unefon
-33470;Mexico;Unefon
-550299;Micronesia;Failed Calls
-550999;Micronesia;Fix Line
-55001;Micronesia;FSMTCeLL
-259299;Moldova;Failed Calls
-25902;Moldova;Moldcell
-25901;Moldova;Orange
-25903;Moldova;Unite
-25999;Moldova;Unite
-25905;Moldova;Unite
-212299;Monaco;Failed Calls
-212999;Monaco;Fix Line
-21201;Monaco;Monaco Telecom
-21210;Monaco;Monaco Telecom
-428299;Mongolia;Failed Calls
-428999;Mongolia;Fix Line
-42898;Mongolia;G-Mobile
-42899;Mongolia;Mobicom
-42800;Mongolia;Skytel
-42888;Mongolia;Unitel
-297299;Montenegro;Failed Calls
-297999;Montenegro;Fix Line
-29703;Montenegro;Mtel
-29702;Montenegro;Telekom / T-mobile
-29701;Montenegro;Telenor
-354299;Montserrat;Digicel
-354299;Montserrat;Failed Calls
-354999;Montserrat;Fix Line
-354860;Montserrat;Flow
-604299;Morocco;Failed Calls
-604999;Morocco;Fix Line
-60401;Morocco;IAM
-60405;Morocco;inwi
-60402;Morocco;inwi
-60400;Morocco;Orange
-643299;Mozambique;Failed Calls
-643999;Mozambique;Fix Line
-64303;Mozambique;Movitel
-64301;Mozambique;TMCEL
-64304;Mozambique;Vodacom
-414299;Myanmar;Failed Calls
-414999;Myanmar;Fix Line
-41403;Myanmar;MecTel
-41400;Myanmar;MPT
-41401;Myanmar;MPT
-41409;Myanmar;Mytel
-41405;Myanmar;Ooredoo
-41406;Myanmar;Telenor
-649299;Namibia;Demshi
-649299;Namibia;Failed Calls
-649999;Namibia;Fix Line
-64901;Namibia;MTC
-64903;Namibia;TN Mobile
-53602;Nauru;Digicel
-536299;Nauru;Failed Calls
-536999;Nauru;Fix Line
-429299;Nepal;CG Telecom
-429299;Nepal;Failed Calls
-429999;Nepal;Fix Line
-42903;Nepal;Hello Nepal
-42902;Nepal;Ncell
-42901;Nepal;Nepal Telecom
-42904;Nepal;Smart
-42900;Nepal;UTL
-204299;Netherlands;88 mobile
-204299;Netherlands;AGMS
-20430;Netherlands;ASPIDER Solutions
-204299;Netherlands;Belcentrale
-204299;Netherlands;BodyTrace
-204299;Netherlands;Combird Mobile
-204299;Netherlands;Dean Mobile
-204299;Netherlands;Eazit
-20405;Netherlands;ElephantTalk
-204299;Netherlands;EziMobile
-204299;Netherlands;Failed Calls
-204999;Netherlands;Fix Line
-204299;Netherlands;interactive digital media / IDM
-20400;Netherlands;Intovoice
-204299;Netherlands;KeenMobile
-20423;Netherlands;KORE
-20410;Netherlands;KPN
-20469;Netherlands;KPN
-20412;Netherlands;KPN
-20408;Netherlands;KPN
-20427;Netherlands;L-mobi
-20428;Netherlands;Lancelot
-20498;Netherlands;Lancelot
-20409;Netherlands;Lycamobile
-20463;Netherlands;MessageBird
-204299;Netherlands;mGage
-204299;Netherlands;Motto
-20407;Netherlands;Move / Teleena
-204299;Netherlands;Okta8
-204299;Netherlands;Premium Numbers
-204299;Netherlands;Premium Routing
-20424;Netherlands;Private Mobility
-20421;Netherlands;ProRail
-204299;Netherlands;Redworks
-20426;Netherlands;SpeakUp
-20402;Netherlands;T-Mobile
-20420;Netherlands;T-Mobile
-20416;Netherlands;T-Mobile
-20429;Netherlands;Tismi
-20433;Netherlands;Truphone
-20406;Netherlands;Vectone Mobile
-20404;Netherlands;Vodafone
-20403;Netherlands;Voiceworks Mobile
-20415;Netherlands;Ziggo
-20418;Netherlands;Ziggo Services
-36291;Netherlands Antilles;Chippie
-36269;Netherlands Antilles;Digicel
-362299;Netherlands Antilles;Failed Calls
-362999;Netherlands Antilles;Fix Line
-362299;Netherlands Antilles;Premium Numbers
-36251;Netherlands Antilles;TelCell
-546299;New Caledonia;Failed Calls
-546999;New Caledonia;Fix Line
-54601;New Caledonia;Mobilis
-53024;New Zealand;2degrees
-530299;New Zealand;Compass Mobile
-530299;New Zealand;Devoli
-530299;New Zealand;Failed Calls
-530999;New Zealand;Fix Line
-530299;New Zealand;LinkTel
-53006;New Zealand;Skinny Mobile
-53002;New Zealand;Spark Mobile
-53005;New Zealand;Spark Mobile
-530299;New Zealand;Symbio
-530299;New Zealand;Vocus
-53001;New Zealand;Vodafone
-530299;New Zealand;Voxbone / Bandwidth
-530299;New Zealand;Voyager Internet
-530299;New Zealand;WXC
-71073;Nicaragua;Claro
-71021;Nicaragua;Claro
-71068;Nicaragua;CooTel
-710299;Nicaragua;Failed Calls
-710999;Nicaragua;Fix Line
-71030;Nicaragua;Movistar
-61402;Niger;Airtel
-614299;Niger;Failed Calls
-614999;Niger;Fix Line
-61403;Niger;Moov
-61401;Niger;Niger Telecoms
-61404;Niger;Orange
-62160;Nigeria;9mobile
-62120;Nigeria;Airtel
-621299;Nigeria;Alpha Technologies
-621299;Nigeria;Failed Calls
-621999;Nigeria;Fix Line
-62150;Nigeria;Glo Mobile
-62130;Nigeria;MTN
-62140;Nigeria;ntel
-62127;Nigeria;Smile
-621299;Nigeria;Zodafones
-555299;Niue;Failed Calls
-555999;Niue;Fix Line
-55501;Niue;Telecom Niue
-467299;North Korea;Failed Calls
-467999;North Korea;Fix Line
-467299;North Korea;Kangsung Net
-467192;North Korea;Koryolink
-29403;North Macedonia;A1
-29402;North Macedonia;A1
-294299;North Macedonia;Failed Calls
-259999;North Macedonia;Fix Line
-294999;North Macedonia;Fix Line
-294299;North Macedonia;LATRON
-29404;North Macedonia;Lycamobile
-29411;North Macedonia;Mobik
-294299;North Macedonia;Telekabel
-29401;North Macedonia;Telekom
-534299;Northern Mariana Islands;Failed Calls
-534999;Northern Mariana Islands;Fix Line
-24222;Norway;Altibox Mobil
-24221;Norway;BANE NOR
-24220;Norway;BANE NOR
-242299;Norway;bigblu
-242299;Norway;Chilimobil
-24209;Norway;Com4
-24215;Norway;eRate
-242299;Norway;Failed Calls
-242999;Norway;Fix Line
-242299;Norway;GlobalConnect
-242299;Norway;
-24214;Norway;ICE
-242299;Norway;intility
-24216;Norway;Iristel
-242299;Norway;JetNett
-24223;Norway;Lycamobile
-24205;Norway;Network Norway
-242299;Norway;NextGenTel
-24210;Norway;Nkom
-242299;Norway;Nodnett
-24206;Norway;ICE
-242299;Norway;Puzzel
-242299;Norway;Sierra Wireless
-242299;Norway;Svea
-242299;Norway;Telavox
-24212;Norway;Telenor
-24201;Norway;Telenor
-24202;Norway;Telia / NetCom
-24208;Norway;Telia / NetCom
-242299;Norway;unifon
-422299;Oman;Failed Calls
-422999;Oman;Fix Line
-42202;Oman;Omantel Mobile
-42203;Oman;Ooredoo / Nawras
-410299;Pakistan;Failed Calls
-410999;Pakistan;Fix Line
-41007;Pakistan;Jazz
-41001;Pakistan;Jazz
-41005;Pakistan;SCO Mobile
-41006;Pakistan;Telenor
-41003;Pakistan;Ufone
-410299;Pakistan;Warid
-41004;Pakistan;Zong
-552299;Palau;Failed Calls
-552999;Palau;Fix Line
-55299;Palau;Palau Mobile
-55201;Palau;PalauCel
-55202;Palau;PT Waves
-425299;Palestinian Territory;Failed Calls
-425999;Palestinian Territory;Fix Line
-42505;Palestinian Territory;Jawwal
-42506;Palestinian Territory;Ooredoo
-71401;Panama;#NAZWA?
-71403;Panama;Claro
-71404;Panama;Digicel
-714299;Panama;Failed Calls
-714999;Panama;Fix Line
-71420;Panama;Movistar
-71402;Panama;Movistar
-53701;Papua New Guinea;BeMobile Vodafone
-53702;Papua New Guinea;Citifon
-53703;Papua New Guinea;Digicel
-537299;Papua New Guinea;DIGIVOIP
-537299;Papua New Guinea;Failed Calls
-537999;Papua New Guinea;Fix Line
-74402;Paraguay;Claro
-744299;Paraguay;Failed Calls
-744999;Paraguay;Fix Line
-74405;Paraguay;Personal
-74403;Paraguay;Personal
-74404;Paraguay;Tigo
-74401;Paraguay;VOX
-71670;Peru;Claro
-71610;Peru;Claro
-71620;Peru;Claro
-716299;Peru;Dolphin
-71617;Peru;Entel
-716299;Peru;Failed Calls
-716999;Peru;Fix Line
-71606;Peru;Movistar
-71607;Peru;Entel
-71630;Peru;Tuyo
-71615;Peru;Viettel
-51566;Philippines;DITO
-515299;Philippines;Failed Calls
-515999;Philippines;Fix Line
-51502;Philippines;Globe
-51501;Philippines;Globe
-51503;Philippines;Smart
-51505;Philippines;Sun Cellular
-260299;Poland;3S
-26017;Poland;Aero2
-26016;Poland;Aero2
-26015;Poland;Aero2
-26004;Poland;Aero2
-26048;Poland;Agile Telecom
-26018;Poland;AMD Telecom
-260299;Poland;Benemen
-260299;Poland;BSG
-260299;Poland;Caritas Laczy
-260299;Poland;Cludo
-26032;Poland;Compatel
-26012;Poland;Cyfrowy Polsat
-260299;Poland;e-Telko
-26041;Poland;EZ Mobile
-260299;Poland;Failed Calls
-260999;Poland;Fix Line
-260299;Poland;I.M. Consulting
-260299;Poland;Inea
-260299;Poland;IZZI
-260299;Poland;JMDI J. Maleszko
-260299;Poland;Klucz Mobile
-260299;Poland;lajt mobile
-260299;Poland;LoVo
-26009;Poland;Lycamobile
-26049;Poland;Messagebird
-260299;Poland;Metro Mobile
-260299;Poland;Mobile Vikings
-260299;Poland;Mobiledata
-26042;Poland;MobiWeb
-260299;Poland;Moja GSM
-26013;Poland;Move
-260299;Poland;multiMOBILE
-260299;Poland;Nasza Wizja
-260299;Poland;NAU Mobile
-260299;Poland;nc+ Mobile
-26019;Poland;NetBalt
-26007;Poland;Netia
-260299;Poland;Next Mobile
-260299;Poland;NIMBOW
-26027;Poland;Ntel Solutions
-26005;Poland;Orange
-26003;Poland;Orange
-26035;Poland;PKP
-26098;Poland;Play
-26006;Poland;Play
-26011;Poland;Plus
-26001;Poland;Plus
-26097;Poland;Politechnika Lodzka Uczelniane
-26090;Poland;Polska Spolka Gazownictwa
-260299;Poland;Polvoice
-260299;Poland;Pomagacz
-260299;Poland;Premium Mobile
-260299;Poland;Premium Numbers
-260299;Poland;SAT FILM
-26014;Poland;Move
-260299;Poland;SGT
-26047;Poland;SMSHIGHWAY
-260299;Poland;Softelnet
-26034;Poland;T-Mobile
-26002;Poland;T-Mobile
-26010;Poland;T-Mobile
-26014;Poland;Telco Leaders
-260299;Poland;Tele GO
-260299;Poland;TeleCube
-260299;Poland;Telenabler
-260299;Poland;TELGAM
-26020;Poland;Tismi
-260299;Poland;TOYAmobilna
-26022;Poland;Twilio
-260299;Poland;UPC
-260299;Poland;Vectra
-26045;Poland;Virgin Mobile
-26045;Poland;Virgin Mobile
-260299;Poland;Vonage
-26039;Poland;Voxbone / Bandwidth
-260299;Poland;w naszej Rodzinie
-268299;Portugal;Failed Calls
-268999;Portugal;Fix Line
-26804;Portugal;Lycamobile
-26806;Portugal;MEO
-26880;Portugal;MEO
-26808;Portugal;MEO
-26803;Portugal;NOS
-26893;Portugal;NOS
-268299;Portugal;NOWO
-268299;Portugal;Oni
-410299;Portugal;Premium Numbers
-26891;Portugal;Vodafone
-26801;Portugal;Vodafone
-33030;Puerto Rico;AT&T Mobility
-330110;Puerto Rico;Claro
-33011;Puerto Rico;Claro
-330299;Puerto Rico;Failed Calls
-330999;Puerto Rico;Fix Line
-330490;Puerto Rico;T-Mobile
-427299;Qatar;Failed Calls
-427999;Qatar;Fix Line
-42706;Qatar;Ooredoo
-42701;Qatar;Ooredoo
-42702;Qatar;Vodafone
-647299;Reunion;Failed Calls
-647999;Reunion;Fix Line
-64702;Reunion;Only
-64703;Reunion;Only
-64700;Reunion;Orange
-64704;Reunion;ZEOP Mobile
-22605;Romania;Digi Mobil
-226299;Romania;Failed Calls
-226999;Romania;Fix Line
-226299;Romania;Iristel
-22616;Romania;Lycamobile
-22610;Romania;Orange
-22602;Romania;Telekom
-22603;Romania;Telekom
-22601;Romania;Vodafone
-250299;Russia;Antares
-250299;Russia;Arktur
-250299;Russia;Astran
-250299;Russia;ASVT
-250299;Russia;Aurora Telecom
-25099;Russia;Beeline
-250299;Russia;Beliton
-250299;Russia;BIT-CENTR
-250299;Russia;Center 2M
-250299;Russia;Cifra 1
-250299;Russia;CountryCom
-250299;Russia;ECO Networks
-250299;Russia;Elemte
-250299;Russia;ER-Telecom
-250299;Russia;Failed Calls
-250999;Russia;Fix Line
-250299;Russia;Gazprom Telecom
-25048;Russia;Global Telecom
-25055;Russia;Glonass
-250299;Russia;GLONASS MOBILE
-250299;Russia;Integral
-250299;Russia;Internod
-250299;Russia;Intersvyaz-2
-25034;Russia;Krymtelecom
-250299;Russia;KvatroPlus
-250299;Russia;Lardex
-25054;Russia;Letai Mobile
-250299;Russia;Lycamobile
-25057;Russia;Matrix Mobile
-250299;Russia;Media-Market
-25002;Russia;Megafon
-250299;Russia;Metro-Pei
-250299;Russia;MGTS
-250299;Russia;Miatel
-250299;Russia;MOSTELECOM
-25035;Russia;Motiv
-250299;Russia;MSN Telekom
-25001;Russia;MTS
-25042;Russia;MTT
-250299;Russia;NCI
-250299;Russia;NETBYNET
-250299;Russia;New Mobile Communications
-250299;Russia;OBIT
-250299;Russia;Orange Business Services
-250299;Russia;PIN
-250299;Russia;Plintron
-250299;Russia;Quantech
-250299;Russia;RECONN
-250299;Russia;Reteyl Innovatsii
-250299;Russia;Sberbank-Telecom
-25033;Russia;SEVTELECOM
-250299;Russia;Sim Sim
-250299;Russia;Sintonik
-250299;Russia;Sky Networks
-25009;Russia;Skylink
-250299;Russia;SkyNet
-250299;Russia;Sonet
-250299;Russia;Sprint
-250299;Russia;Start
-250299;Russia;SunSIM
-250299;Russia;Surgutneftegaz
-250299;Russia;Svyazresurs-Mobile
-250299;Russia;Tander
-25020;Russia;Tele2
-25012;Russia;Tele2
-250299;Russia;Tinkoff Mobile
-250299;Russia;TMT
-250299;Russia;TransMobilCom
-250299;Russia;TRASTEL
-250299;Russia;TRN-telecom
-250299;Russia;TTK
-250299;Russia;TTK-Svyaz
-250299;Russia;TVE
-250299;Russia;UnitTelecom
-250299;Russia;Unycel
-250299;Russia;Vainah Telecom
-250299;Russia;ViKom
-250299;Russia;Virgin Connect
-250299;Russia;Voentelecom
-25077;Russia;Glonass
-25060;Russia;Volna Mobile
-250299;Russia;VTB Mobile
-25032;Russia;Win Mobile
-25011;Russia;Yota
-63513;Rwanda;Airtel
-635299;Rwanda;Failed Calls
-635999;Rwanda;Fix Line
-63510;Rwanda;MTN
-658299;Saint Helena and Ascension and Tristan da Cunha;Failed Calls
-658999;Saint Helena and Ascension and Tristan da Cunha;Fix Line
-35670;Saint Kitts and Nevis;Chippie
-35670;Saint Kitts and Nevis;Chippie
-35650;Saint Kitts and Nevis;Digicel
-35650;Saint Kitts and Nevis;Digicel
-356299;Saint Kitts and Nevis;Failed Calls
-356999;Saint Kitts and Nevis;Fix Line
-356110;Saint Kitts and Nevis;Flow
-35611;Saint Kitts and Nevis;Flow
-356299;Saint Kitts and Nevis;The Cable
-35805;Saint Lucia;Digicel
-35850;Saint Lucia;Digicel
-358299;Saint Lucia;Failed Calls
-358999;Saint Lucia;Fix Line
-358110;Saint Lucia;Flow
-35811;Saint Lucia;Flow
-30803;Saint Pierre and Miquelon;Ameris
-30801;Saint Pierre and Miquelon;Ameris
-308299;Saint Pierre and Miquelon;Failed Calls
-308999;Saint Pierre and Miquelon;Fix Line
-30802;Saint Pierre and Miquelon;Globaltel
-36070;Saint Vincent and the Grenadines;Digicel
-36050;Saint Vincent and the Grenadines;Digicel
-360299;Saint Vincent and the Grenadines;Failed Calls
-360999;Saint Vincent and the Grenadines;Fix Line
-360110;Saint Vincent and the Grenadines;Flow
-54927;Samoa;BlueSky
-54901;Samoa;Digicel
-549299;Samoa;Failed Calls
-549999;Samoa;Fix Line
-292299;San Marino;Failed Calls
-292999;San Marino;Fix Line
-29201;San Marino;Prima
-292299;San Marino;TeleneT
-62601;Sao Tome and Principe;CSTmovel
-626299;Sao Tome and Principe;Failed Calls
-626999;Sao Tome and Principe;Fix Line
-62602;Sao Tome and Principe;Unitel
-901299;Satellite Networks;Failed Calls
-901999;Satellite Networks;Fix Line
-420299;Saudi Arabia;Failed Calls
-420999;Saudi Arabia;Fix Line
-42006;Saudi Arabia;Lebara Mobile
-42003;Saudi Arabia;Mobily
-420299;Saudi Arabia;Red Bull MOBILE
-420299;Saudi Arabia;Salam
-42001;Saudi Arabia;STC / Al Jawal
-42005;Saudi Arabia;Virgin Mobile
-42004;Saudi Arabia;Zain
-608299;Senegal;2s Mobile
-60803;Senegal;Expresso
-608299;Senegal;Failed Calls
-608999;Senegal;Fix Line
-60802;Senegal;Free
-60804;Senegal;HAYO
-60801;Senegal;Orange
-608299;Senegal;Promobile
-220299;Serbia;Failed Calls
-220999;Serbia;Fix Line
-22011;Serbia;Globaltel
-22003;Serbia;MTS
-22001;Serbia;Telenor
-22005;Serbia;VIP
-22020;Serbia;VIP
-63310;Seychelles;Airtel
-63301;Seychelles;Cable & Wireless
-633299;Seychelles;Failed Calls
-633999;Seychelles;Fix Line
-63305;Seychelles;Intelvision
-61903;Sierra Leone;Africell
-61905;Sierra Leone;Africell
-61904;Sierra Leone;Comium
-619299;Sierra Leone;Failed Calls
-619999;Sierra Leone;Fix Line
-619299;Sierra Leone;IPTel
-61925;Sierra Leone;Mobitel
-619299;Sierra Leone;Onlime
-61901;Sierra Leone;Orange
-61907;Sierra Leone;Qcell
-619299;Sierra Leone;SierraTel
-52509;Singapore;Circles.Life
-525299;Singapore;Failed Calls
-525999;Singapore;Fix Line
-52512;Singapore;GRID
-52503;Singapore;M1
-52511;Singapore;M1
-525299;Singapore;MyRepublic
-525299;Singapore;Nexwave
-525299;Singapore;redONE
-52507;Singapore;SingTel
-52502;Singapore;SingTel
-52501;Singapore;SingTel
-525299;Singapore;Smart Pinoy
-52506;Singapore;Starhub
-52505;Singapore;Starhub
-52508;Singapore;Starhub
-52510;Singapore;TPG Telecom
-525299;Singapore;VivoBee
-525299;Singapore;Zero1
-231299;Slovakia;Failed Calls
-231999;Slovakia;Fix Line
-23106;Slovakia;O2
-23101;Slovakia;Orange
-23107;Slovakia;Orange
-23105;Slovakia;Orange
-23103;Slovakia;Swan / 4ka
-23102;Slovakia;Telekom
-23150;Slovakia;Telekom
-23104;Slovakia;Telekom
-23108;Slovakia;Uniphone
-231299;Slovakia;Vonage
-23199;Slovakia;ZSR
-29340;Slovenia;A1 / Si.mobil
-29320;Slovenia;Compatel
-29386;Slovenia;Elektro Gorenjska
-293299;Slovenia;Failed Calls
-293999;Slovenia;Fix Line
-293299;Slovenia;HOT mobil
-293299;Slovenia;Me2
-29341;Slovenia;Mobitel
-293299;Slovenia;Novatel
-29310;Slovenia;Slovenske zeleznice
-293299;Slovenia;SoftNET
-29364;Slovenia;T-2
-29370;Slovenia;Telemach / Tusmobil
-54002;Solomon Islands;bemobile
-54001;Solomon Islands;Breeze
-540299;Solomon Islands;Failed Calls
-540999;Solomon Islands;Fix Line
-540299;Solomon Islands;Satsol
-540299;Solomon Islands;Smile
-637299;Somalia;AirSom
-637299;Somalia;Failed Calls
-637999;Somalia;Fix Line
-63730;Somalia;Golis
-63719;Somalia;Hormuud
-63710;Somalia;Nationlink
-637299;Somalia;NETCO
-63770;Somalia;Onkod
-63704;Somalia;Somafone
-637299;Somalia;SomNetworks
-63771;Somalia;Somtel
-637299;Somalia;STG
-63782;Somalia;Telcom Mobile
-63701;Somalia;Telesom
-65507;South Africa;Cell C
-655299;South Africa;Failed Calls
-655999;South Africa;Fix Line
-655299;South Africa;Lycamobile
-65510;South Africa;MTN
-65512;South Africa;MTN
-65519;South Africa;Rain
-65573;South Africa;Rain
-65574;South Africa;Rain
-65538;South Africa;Rain
-65505;South Africa;Telkom
-65502;South Africa;Telkom
-655299;South Africa;Virgin Mobile
-65501;South Africa;Vodacom
-450299;South Korea;Failed Calls
-450999;South Korea;Fix Line
-45007;South Korea;KT Powertel
-45006;South Korea;LG U+
-45004;South Korea;olleh / KT
-45008;South Korea;olleh / KT
-45002;South Korea;olleh / KT
-45012;South Korea;SK Telecom
-45005;South Korea;SK Telecom
-45011;South Korea;SK Telecom
-659299;South Sudan;Digitel
-659299;South Sudan;Failed Calls
-659999;South Sudan;Fix Line
-65902;South Sudan;MTN
-65906;South Sudan;Zain
-214299;Spain;ACN
-214299;Spain;Adamo Telecom
-21436;Spain;Alai
-21402;Spain;Alta Tecnologia en Comunicacions
-214299;Spain;Aurea
-21414;Spain;Avatel Movil
-214299;Spain;Billing Financial
-214299;Spain;Bluephone
-214299;Spain;CloudComms
-214299;Spain;Dialoga
-21422;Spain;Digi.Mobil
-214299;Spain;Dragonet
-21408;Spain;Euskaltel Movil
-214299;Spain;Evolutio
-214299;Spain;Failed Calls
-214999;Spain;Fix Line
-214299;Spain;Global
-214299;Spain;GNET
-21434;Spain;ION MOBILE
-214299;Spain;Jetnet
-214299;Spain;Lemonvil
-21425;Spain;Lycamobile
-21417;Spain;mobil R
-21438;Spain;Movistar
-21407;Spain;Movistar
-21405;Spain;Movistar
-214299;Spain;Olephone
-214299;Spain;On Movil
-214299;Spain;Oniti Telecom
-214299;Spain;OperadorsCat
-21409;Spain;Orange
-21421;Spain;Orange
-21403;Spain;Orange
-214299;Spain;Pepephone
-214299;Spain;Premium Numbers
-214299;Spain;PTV Telecom movil
-214299;Spain;Quattre
-214299;Spain;Sarenet
-214299;Spain;SEWAN
-21419;Spain;Simyo
-21435;Spain;SUMA movil
-214299;Spain;Suop
-214299;Spain;Syma
-21416;Spain;mobil R
-214299;Spain;Telsome
-214299;Spain;The Telecom Boutique
-21427;Spain;Truphone
-21412;Spain;Venus Movil
-21401;Spain;Vodafone
-21437;Spain;Vodafone
-21406;Spain;Vodafone
-214299;Spain;Vodafone Enabler
-21433;Spain;Yoigo
-21423;Spain;Yoigo
-21429;Spain;Yoigo
-21404;Spain;Yoigo
-214299;Spain;You Mobile
-21410;Spain;Zinnia
-41301;Sri Lanka;SLTMobitel
-41302;Sri Lanka;Dialog
-41303;Sri Lanka;Hutch
-41304;Sri Lanka;Lanka Bell
-41305;Sri Lanka;Airtel
-41308;Sri Lanka;Hutch
-41309;Sri Lanka;Hutch
-41311;Sri Lanka;Dialog
-41312;Sri Lanka;SLTMobitel
-41313;Sri Lanka;Lanka Bell
-413299;Sri Lanka;Failed Calls
-413999;Sri Lanka;Fix Line
-634299;Sudan;Failed Calls
-634999;Sudan;Fix Line
-63403;Sudan;MTN
-63402;Sudan;MTN
-63407;Sudan;Sudani One
-63406;Sudan;Zain
-63401;Sudan;Zain
-74603;Suriname;Digicel
-746299;Suriname;Failed Calls
-746999;Suriname;Fix Line
-74602;Suriname;Telesur
-65302;Swaziland;Eswatini Mobile
-65301;Swaziland;Eswatini Telecom
-653299;Swaziland;Failed Calls
-653999;Swaziland;Fix Line
-65310;Swaziland;Swazi MTN
-24016;Sweden;
-24035;Sweden;42 Telecom
-24013;Sweden;A3
-240299;Sweden;Advoco
-240299;Sweden;
-240299;Sweden;Allo Telecom
-240299;Sweden;Bahnhof
-240299;Sweden;Benemen
-240299;Sweden;Biztel
-240299;Sweden;BM Sverige
-240299;Sweden;Bredband 2
-240299;Sweden;Bredbandsson
-240299;Sweden;BSG
-240299;Sweden;Chilimobil
-24011;Sweden;Com Hem
-24009;Sweden;Com4
-24032;Sweden;Compatel
-240299;Sweden;Connectel
-240299;Sweden;Core Telecom
-240299;Sweden;easy pbx
-240299;Sweden;EasyTelecom
-24022;Sweden;EUtel
-240299;Sweden;Failed Calls
-240299;Sweden;Fastcom
-240299;Sweden;Febo Telecom
-240299;Sweden;Fello
-240299;Sweden;Fibio
-24063;Sweden;Fink Telecom
-240299;Sweden;Firstcom
-240999;Sweden;Fix Line
-240299;Sweden;Fonia
-24018;Sweden;Messit / Minicall
-240299;Sweden;Global Telefoni
-240299;Sweden;GlobalConnect
-24027;Sweden;Globetouch
-24017;Sweden;Gotanet
-24002;Sweden;3
-240299;Sweden;Horisen
-240299;Sweden;iCentrex
-24023;Sweden;Infobip
-240299;Sweden;InfraCom
-24036;Sweden;interactive digital media / IDM
-240299;Sweden;Ipify
-240299;Sweden;Junyverse
-240299;Sweden;Karma Mobil
-240299;Sweden;Lancelot
-24028;Sweden;LINK Mobility
-240299;Sweden;Loxysoft
-24012;Sweden;Lycamobile
-240299;Sweden;Maingate
-240299;Sweden;Megaphone
-240299;Sweden;MessageBird
-24029;Sweden;MI Carrier Services
-240299;Sweden;miniTel
-240299;Sweden;Mitto
-24033;Sweden;Mobile Arts
-24043;Sweden;MobiWeb
-240299;Sweden;Molnstruktur
-24025;Sweden;Monty Mobile
-240299;Sweden;My Beat
-240299;Sweden;Net at Once
-24040;Sweden;Netmore
-240299;Sweden;Netsize
-240299;Sweden;onoff
-240299;Sweden;Bixia AB
-240299;Sweden;Premium Numbers
-24039;Sweden;Primlight
-24031;Sweden;Rebtel
-24020;Sweden;Sierra Wireless
-24015;Sweden;
-24037;Sweden;Sinch
-240299;Sweden;soatso
-240299;Sweden;Soluno
-24045;Sweden;Spirius
-240299;Sweden;SSTNet
-240299;Sweden;Svea Billing Services
-240299;Sweden;Svensk Konsumentmobil
-240299;Sweden;TelaVox
-24007;Sweden;Tele2
-24005;Sweden;Tele2
-24014;Sweden;Tele2
-240299;Sweden;Telecom3 Sverige AB
-240299;Sweden;Teledigit Scandinavia AB
-240299;Sweden;Telekometen
-24044;Sweden;Telenabler
-24042;Sweden;Telenor Connexion
-24004;Sweden;Telenor
-24008;Sweden;Telenor
-24001;Sweden;Telia
-240299;Sweden;Tell it to Mi
-240299;Sweden;Telness
-24003;Sweden;Net 1
-24048;Sweden;Tismi
-240299;Sweden;Tolv Mobil
-24021;Sweden;Trafikverket
-24026;Sweden;Twilio
-240299;Sweden;Unicorn Telecom
-24019;Sweden;Vectone Mobile
-240299;Sweden;Verbal
-24046;Sweden;Viahub
-24047;Sweden;Viatel
-240299;Sweden;Vobbiz
-240299;Sweden;Voice Integrate
-240299;Sweden;Voicetech
-24038;Sweden;Voxbone / Bandwidth
-240299;Sweden;Weelia
-240299;Sweden;Wifi.se
-240299;Sweden;Wifog Sverige
-240299;Sweden;XPLORA
-22858;Switzerland;Beeone
-22805;Switzerland;Comfone
-22809;Switzerland;Comfone
-228299;Switzerland;Failed Calls
-228999;Switzerland;Fix Line
-22866;Switzerland;Inovia
-22854;Switzerland;Lycamobile
-22869;Switzerland;MTEL
-22865;Switzerland;Nexphone
-22851;Switzerland;relario
-22803;Switzerland;Salt Mobile
-22806;Switzerland;SBB
-22808;Switzerland;Sunrise
-22807;Switzerland;Sunrise
-22812;Switzerland;Sunrise
-22802;Switzerland;Sunrise
-22860;Switzerland;Sunrise
-22801;Switzerland;Swisscom
-22862;Switzerland;Telecom26
-22870;Switzerland;Tismi
-22853;Switzerland;UPC
-22859;Switzerland;Vectone Mobile
-417299;Syria;Failed Calls
-417999;Syria;Fix Line
-41702;Syria;MTN
-41701;Syria;Syriatel
-46612;Taiwan;APT
-46605;Taiwan;APT
-46692;Taiwan;Chunghwa Telecom
-46611;Taiwan;Chunghwa Telecom
-466299;Taiwan;Failed Calls
-46601;Taiwan;Far EasTone
-46603;Taiwan;Far EasTone
-46688;Taiwan;Far EasTone
-466999;Taiwan;Fix Line
-46689;Taiwan;T Star
-46697;Taiwan;Taiwan Mobile
-43604;Tajikistan;Babilon-Mobile
-436299;Tajikistan;Failed Calls
-436999;Tajikistan;Fix Line
-43603;Tajikistan;Megafon
-43615;Tajikistan;O-Mobile
-436299;Tajikistan;Premium Numbers
-43602;Tajikistan;Tcell
-43601;Tajikistan;Tcell
-43605;Tajikistan;Zet-Mobile
-64005;Tanzania;Airtel
-640299;Tanzania;Failed Calls
-640999;Tanzania;Fix Line
-64009;Tanzania;Halotel / Viettel
-64099;Tanzania;Mkulima African Telecommunication
-64014;Tanzania;MO Mobile
-64011;Tanzania;Smile Communications
-64007;Tanzania;Tanzania Telecommunication Corporation
-64002;Tanzania;Tigo / MIC
-64004;Tanzania;Vodacom
-64013;Tanzania;WiAfrica
-64003;Tanzania;Zanzibar Telecom / Zantel
-52003;Thailand;AIS
-52001;Thailand;AIS
-52018;Thailand;dtac
-52005;Thailand;dtac TriNet
-520299;Thailand;Failed Calls
-520999;Thailand;Fix Line
-52000;Thailand;my
-52047;Thailand;TOTmobile
-52015;Thailand;TOTmobile
-52004;Thailand;TrueMove H
-61503;Togo;Atlantique Telecom / Moov
-615299;Togo;Failed Calls
-615999;Togo;Fix Line
-61501;Togo;Togo Cellulaire / TogoCel
-53943;Tonga;Digicel
-53988;Tonga;Digicel
-539299;Tonga;Failed Calls
-539999;Tonga;Fix Line
-53901;Tonga;U-Call
-539299;Tonga;WanTok
-37412;Trinidad and Tobago;bmobile
-374130;Trinidad and Tobago;Digicel
-374299;Trinidad and Tobago;Failed Calls
-374999;Trinidad and Tobago;Fix Line
-605299;Tunisia;Failed Calls
-605999;Tunisia;Fix Line
-60506;Tunisia;Lycamobile
-60503;Tunisia;Ooredoo
-60501;Tunisia;Orange
-60502;Tunisia;TT Mobile
-286299;Turkiye;Asistan Telekom
-28603;Turkiye;Avea
-28604;Turkiye;Avea
-286299;Turkiye;BasakCell
-286299;Turkiye;Compatel
-286299;Turkiye;Failed Calls
-286299;Turkiye;Fenix Telekom
-286999;Turkiye;Fix Line
-286299;Turkiye;Foniva
-286299;Turkiye;IsNet
-286299;Turkiye;Maxiphone
-286299;Turkiye;Medium Telekom
-286299;Turkiye;Mobilisim
-286299;Turkiye;Netgsm
-286299;Turkiye;Nida
-286299;Turkiye;Oris
-286299;Turkiye;Pelicell
-286299;Turkiye;Plus Telekom
-286299;Turkiye;Roitel
-286299;Turkiye;SesNet
-286299;Turkiye;TCDD
-286299;Turkiye;TTM
-28601;Turkiye;Turkcell
-28602;Turkiye;Vodafone
-43801;Turkmenistan;MTS
-438299;Turkmenistan;Failed Calls
-438999;Turkmenistan;Fix Line
-43802;Turkmenistan;TMCELL
-376360;Turks and Caicos Islands;Digicel
-37650;Turks and Caicos Islands;Digicel
-376299;Turks and Caicos Islands;Failed Calls
-376999;Turks and Caicos Islands;Fix Line
-376350;Turks and Caicos Islands;Flow
-553299;Tuvalu;Failed Calls
-553999;Tuvalu;Fix Line
-55301;Tuvalu;Tuvalu Telecom
-64122;Uganda;Airtel
-64101;Uganda;Airtel
-641299;Uganda;Failed Calls
-641999;Uganda;Fix Line
-64104;Uganda;Lycamobile
-64111;Uganda;Mango
-64110;Uganda;MTN
-64133;Uganda;Smile
-25507;Ukraine;3Mob
-255299;Ukraine;Failed Calls
-255999;Ukraine;Fix Line
-25504;Ukraine;IT
-25502;Ukraine;Kyivstar
-25503;Ukraine;Kyivstar
-25506;Ukraine;lifecell
-25521;Ukraine;PEOPLEnet
-25599;Ukraine;Phoenix
-25501;Ukraine;Vodafone
-42403;United Arab Emirates;DU
-42402;United Arab Emirates;Etisalat
-424299;United Arab Emirates;Failed Calls
-424999;United Arab Emirates;Fix Line
-23478;United Kingdom;Airwave
-23429;United Kingdom;aql
-23476;United Kingdom;BT Group
-23400;United Kingdom;BT Group
-23408;United Kingdom;BT OnePhone
-23418;United Kingdom;Cloud9
-23430;United Kingdom;EE/Everything Everywhere
-23432;United Kingdom;EE/Everything Everywhere
-23433;United Kingdom;EE/Everything Everywhere
-23431;United Kingdom;EE/Everything Everywhere
-234299;United Kingdom;Failed Calls
-234999;United Kingdom;Fix Line
-23417;United Kingdom;FlexTel
-23404;United Kingdom;FMS Solutions
-23439;United Kingdom;Gamma Mobile
-23424;United Kingdom;Greenfone
-23472;United Kingdom;Hanhaa Mobile
-23471;United Kingdom;Home Office
-23420;United Kingdom;3
-23494;United Kingdom;3
-23423;United Kingdom;Icron Network
-23403;United Kingdom;Jersey Airtel
-23435;United Kingdom;JSC Ingenicum
-23450;United Kingdom;JT Mobile
-23414;United Kingdom;LINK Mobility
-23426;United Kingdom;Lycamobile
-23458;United Kingdom;Manx Telecom Mobile
-23428;United Kingdom;Marathon Telecom
-23475;United Kingdom;Mass Response Service GmbH
-23456;United Kingdom;NCSC
-23495;United Kingdom;Network Rail
-23412;United Kingdom;Network Rail
-23413;United Kingdom;Network Rail
-23451;United Kingdom;now broadband
-23434;United Kingdom;Orange
-23474;United Kingdom;Pareteum
-23457;United Kingdom;Sky
-23440;United Kingdom;spusu
-23455;United Kingdom;Sure Guernsey
-23436;United Kingdom;Sure Isle of Man
-23499;United Kingdom;Sure Jersey
-23437;United Kingdom;Synectiv
-23416;United Kingdom;Talk Talk
-23427;United Kingdom;Tata Communications Ltd
-23411;United Kingdom;O2
-23410;United Kingdom;O2
-23402;United Kingdom;O2
-23422;United Kingdom;Telesign Mobile
-23419;United Kingdom;TeleWare
-23409;United Kingdom;Tismi
-23425;United Kingdom;Truphone
-23401;United Kingdom;Vectone Mobile
-23438;United Kingdom;Virgin Mobile
-23491;United Kingdom;Vodafone
-23407;United Kingdom;Vodafone
-23415;United Kingdom;Vodafone
-23492;United Kingdom;Vodafone
-23477;United Kingdom;Vodafone
-23489;United Kingdom;Vodafone
-310130;United States of America;Appalachian Wireless
-310750;United States of America;Appalachian Wireless
-312130;United States of America;Appalachian Wireless
-312750;United States of America;Appalachian Wireless
-312710;United States of America;ASTAC Cellular
-310710;United States of America;ASTAC Cellular
-310760;United States of America;ASTAC Cellular
-312760;United States of America;ASTAC Cellular
-31290;United States of America;AT&T Mobility
-310210;United States of America;AT&T Mobility
-311380;United States of America;AT&T Mobility
-313680;United States of America;AT&T Mobility
-31130;United States of America;AT&T Mobility
-31380;United States of America;AT&T Mobility
-310680;United States of America;AT&T Mobility
-312280;United States of America;AT&T Mobility
-31216;United States of America;AT&T Mobility
-310150;United States of America;AT&T Mobility
-311170;United States of America;AT&T Mobility
-313210;United States of America;AT&T Mobility
-312950;United States of America;AT&T Mobility
-310280;United States of America;AT&T Mobility
-312150;United States of America;AT&T Mobility
-311410;United States of America;AT&T Mobility
-313950;United States of America;AT&T Mobility
-31016;United States of America;AT&T Mobility
-31170;United States of America;AT&T Mobility
-31390;United States of America;AT&T Mobility
-310950;United States of America;AT&T Mobility
-312380;United States of America;AT&T Mobility
-31230;United States of America;AT&T Mobility
-310170;United States of America;AT&T Mobility
-311180;United States of America;AT&T Mobility
-313380;United States of America;AT&T Mobility
-31316;United States of America;AT&T Mobility
-310380;United States of America;AT&T Mobility
-312170;United States of America;AT&T Mobility
-311670;United States of America;AT&T Mobility
-31070;United States of America;AT&T Mobility
-31030;United States of America;AT&T Mobility
-31180;United States of America;AT&T Mobility
-313150;United States of America;AT&T Mobility
-312410;United States of America;AT&T Mobility
-31270;United States of America;AT&T Mobility
-310180;United States of America;AT&T Mobility
-311210;United States of America;AT&T Mobility
-313410;United States of America;AT&T Mobility
-31330;United States of America;AT&T Mobility
-310410;United States of America;AT&T Mobility
-312180;United States of America;AT&T Mobility
-311680;United States of America;AT&T Mobility
-31080;United States of America;AT&T Mobility
-31190;United States of America;AT&T Mobility
-313170;United States of America;AT&T Mobility
-312670;United States of America;AT&T Mobility
-31280;United States of America;AT&T Mobility
-313280;United States of America;AT&T Mobility
-311280;United States of America;AT&T Mobility
-313670;United States of America;AT&T Mobility
-31116;United States of America;AT&T Mobility
-31370;United States of America;AT&T Mobility
-310670;United States of America;AT&T Mobility
-312210;United States of America;AT&T Mobility
-311950;United States of America;AT&T Mobility
-31090;United States of America;AT&T Mobility
-311150;United States of America;AT&T Mobility
-313180;United States of America;AT&T Mobility
-312680;United States of America;AT&T Mobility
-310600;United States of America;Cellcom
-310630;United States of America;Choice Wireless
-310700;United States of America;cv cellular
-310880;United States of America;DTC Wireless
-31035;United States of America;ETEX
-310990;United States of America;Evolve
-310299;United States of America;Failed Calls
-310999;United States of America;Fix Line
-311370;United States of America;GCI Wireless
-310430;United States of America;GCI Wireless
-311430;United States of America;GCI Wireless
-310340;United States of America;Limitless
-312690;United States of America;Limitless
-310690;United States of America;Limitless
-311340;United States of America;Limitless
-311690;United States of America;Limitless
-312340;United States of America;Limitless
-313299;United States of America;Northstar Technology
-314299;United States of America;Northstar Technology
-310299;United States of America;Northstar Technology
-315299;United States of America;Northstar Technology
-311299;United States of America;Northstar Technology
-316299;United States of America;Northstar Technology
-312299;United States of America;Northstar Technology
-310540;United States of America;OWTC
-311360;United States of America;Pioneer Cellular
-310280;United States of America;Pioneer Cellular
-311570;United States of America;Pioneer Cellular
-313280;United States of America;Pioneer Cellular
-310360;United States of America;Pioneer Cellular
-313360;United States of America;Pioneer Cellular
-311280;United States of America;Pioneer Cellular
-310570;United States of America;Pioneer Cellular
-313570;United States of America;Pioneer Cellular
-31610;United States of America;T-Mobile
-311250;United States of America;T-Mobile
-310882;United States of America;T-Mobile
-312490;United States of America;T-Mobile
-310270;United States of America;T-Mobile
-312120;United States of America;T-Mobile
-316830;United States of America;T-Mobile
-310190;United States of America;T-Mobile
-311530;United States of America;T-Mobile
-316230;United States of America;T-Mobile
-312870;United States of America;T-Mobile
-311190;United States of America;T-Mobile
-310800;United States of America;T-Mobile
-312240;United States of America;T-Mobile
-310230;United States of America;T-Mobile
-311880;United States of America;T-Mobile
-316490;United States of America;T-Mobile
-316120;United States of America;T-Mobile
-311260;United States of America;T-Mobile
-310940;United States of America;T-Mobile
-312530;United States of America;T-Mobile
-310310;United States of America;T-Mobile
-312160;United States of America;T-Mobile
-316870;United States of America;T-Mobile
-310160;United States of America;T-Mobile
-311660;United States of America;T-Mobile
-316240;United States of America;T-Mobile
-312880;United States of America;T-Mobile
-311200;United States of America;T-Mobile
-310830;United States of America;T-Mobile
-312250;United States of America;T-Mobile
-310240;United States of America;T-Mobile
-311882;United States of America;T-Mobile
-316530;United States of America;T-Mobile
-316160;United States of America;T-Mobile
-311270;United States of America;T-Mobile
-312660;United States of America;T-Mobile
-31110;United States of America;T-Mobile
-310490;United States of America;T-Mobile
-312190;United States of America;T-Mobile
-316880;United States of America;T-Mobile
-310120;United States of America;T-Mobile
-311800;United States of America;T-Mobile
-316250;United States of America;T-Mobile
-312882;United States of America;T-Mobile
-311230;United States of America;T-Mobile
-310870;United States of America;T-Mobile
-312260;United States of America;T-Mobile
-310250;United States of America;T-Mobile
-311940;United States of America;T-Mobile
-316660;United States of America;T-Mobile
-316190;United States of America;T-Mobile
-311311;United States of America;T-Mobile
-312800;United States of America;T-Mobile
-311120;United States of America;T-Mobile
-310530;United States of America;T-Mobile
-312200;United States of America;T-Mobile
-316882;United States of America;T-Mobile
-31010;United States of America;T-Mobile
-311830;United States of America;T-Mobile
-316260;United States of America;T-Mobile
-312940;United States of America;T-Mobile
-311240;United States of America;T-Mobile
-310880;United States of America;T-Mobile
-312270;United States of America;T-Mobile
-310260;United States of America;T-Mobile
-31210;United States of America;T-Mobile
-316800;United States of America;T-Mobile
-316200;United States of America;T-Mobile
-311490;United States of America;T-Mobile
-312830;United States of America;T-Mobile
-311160;United States of America;T-Mobile
-310660;United States of America;T-Mobile
-312230;United States of America;T-Mobile
-316940;United States of America;T-Mobile
-310200;United States of America;T-Mobile
-311870;United States of America;T-Mobile
-316270;United States of America;T-Mobile
-31020;United States of America;Union Wireless
-310770;United States of America;Verizon Wireless
-311894;United States of America;Verizon Wireless
-310280;United States of America;Verizon Wireless
-311286;United States of America;Verizon Wireless
-312480;United States of America;Verizon Wireless
-312591;United States of America;Verizon Wireless
-310591;United States of America;Verizon Wireless
-311597;United States of America;Verizon Wireless
-310271;United States of America;Verizon Wireless
-311277;United States of America;Verizon Wireless
-312283;United States of America;Verizon Wireless
-310482;United States of America;Verizon Wireless
-311488;United States of America;Verizon Wireless
-312893;United States of America;Verizon Wireless
-31113;United States of America;Verizon Wireless
-312274;United States of America;Verizon Wireless
-310893;United States of America;Verizon Wireless
-311899;United States of America;Verizon Wireless
-310285;United States of America;Verizon Wireless
-311390;United States of America;Verizon Wireless
-312485;United States of America;Verizon Wireless
-312596;United States of America;Verizon Wireless
-310596;United States of America;Verizon Wireless
-311890;United States of America;Verizon Wireless
-310276;United States of America;Verizon Wireless
-311282;United States of America;Verizon Wireless
-312288;United States of America;Verizon Wireless
-312487;United States of America;Verizon Wireless
-310487;United States of America;Verizon Wireless
-311593;United States of America;Verizon Wireless
-312898;United States of America;Verizon Wireless
-31012;United States of America;Verizon Wireless
-311273;United States of America;Verizon Wireless
-312279;United States of America;Verizon Wireless
-310350;United States of America;Verizon Wireless
-311484;United States of America;Verizon Wireless
-312820;United States of America;Verizon Wireless
-310898;United States of America;Verizon Wireless
-310820;United States of America;Verizon Wireless
-311895;United States of America;Verizon Wireless
-310281;United States of America;Verizon Wireless
-311287;United States of America;Verizon Wireless
-312481;United States of America;Verizon Wireless
-312592;United States of America;Verizon Wireless
-310592;United States of America;Verizon Wireless
-311598;United States of America;Verizon Wireless
-310272;United States of America;Verizon Wireless
-311278;United States of America;Verizon Wireless
-312284;United States of America;Verizon Wireless
-310483;United States of America;Verizon Wireless
-311489;United States of America;Verizon Wireless
-312894;United States of America;Verizon Wireless
-311110;United States of America;Verizon Wireless
-312275;United States of America;Verizon Wireless
-310894;United States of America;Verizon Wireless
-311910;United States of America;Verizon Wireless
-310286;United States of America;Verizon Wireless
-311480;United States of America;Verizon Wireless
-312597;United States of America;Verizon Wireless
-310597;United States of America;Verizon Wireless
-311891;United States of America;Verizon Wireless
-310277;United States of America;Verizon Wireless
-311283;United States of America;Verizon Wireless
-312289;United States of America;Verizon Wireless
-312488;United States of America;Verizon Wireless
-310488;United States of America;Verizon Wireless
-311594;United States of America;Verizon Wireless
-312899;United States of America;Verizon Wireless
-31013;United States of America;Verizon Wireless
-311274;United States of America;Verizon Wireless
-312280;United States of America;Verizon Wireless
-312271;United States of America;Verizon Wireless
-310390;United States of America;Verizon Wireless
-311485;United States of America;Verizon Wireless
-312890;United States of America;Verizon Wireless
-310899;United States of America;Verizon Wireless
-310890;United States of America;Verizon Wireless
-311896;United States of America;Verizon Wireless
-310282;United States of America;Verizon Wireless
-311288;United States of America;Verizon Wireless
-312482;United States of America;Verizon Wireless
-312593;United States of America;Verizon Wireless
-310593;United States of America;Verizon Wireless
-311599;United States of America;Verizon Wireless
-310273;United States of America;Verizon Wireless
-311279;United States of America;Verizon Wireless
-312285;United States of America;Verizon Wireless
-310484;United States of America;Verizon Wireless
-311590;United States of America;Verizon Wireless
-312895;United States of America;Verizon Wireless
-312276;United States of America;Verizon Wireless
-310895;United States of America;Verizon Wireless
-31212;United States of America;Verizon Wireless
-310287;United States of America;Verizon Wireless
-311481;United States of America;Verizon Wireless
-312598;United States of America;Verizon Wireless
-310598;United States of America;Verizon Wireless
-311892;United States of America;Verizon Wireless
-310278;United States of America;Verizon Wireless
-311284;United States of America;Verizon Wireless
-312350;United States of America;Verizon Wireless
-312489;United States of America;Verizon Wireless
-310489;United States of America;Verizon Wireless
-311595;United States of America;Verizon Wireless
-312910;United States of America;Verizon Wireless
-310110;United States of America;Verizon Wireless
-311275;United States of America;Verizon Wireless
-312281;United States of America;Verizon Wireless
-310480;United States of America;Verizon Wireless
-311486;United States of America;Verizon Wireless
-312891;United States of America;Verizon Wireless
-310910;United States of America;Verizon Wireless
-312272;United States of America;Verizon Wireless
-310891;United States of America;Verizon Wireless
-311897;United States of America;Verizon Wireless
-31004;United States of America;Verizon Wireless
-310283;United States of America;Verizon Wireless
-311289;United States of America;Verizon Wireless
-312483;United States of America;Verizon Wireless
-312594;United States of America;Verizon Wireless
-310594;United States of America;Verizon Wireless
-311770;United States of America;Verizon Wireless
-310274;United States of America;Verizon Wireless
-311280;United States of America;Verizon Wireless
-312286;United States of America;Verizon Wireless
-310485;United States of America;Verizon Wireless
-311591;United States of America;Verizon Wireless
-312896;United States of America;Verizon Wireless
-311271;United States of America;Verizon Wireless
-312277;United States of America;Verizon Wireless
-31213;United States of America;Verizon Wireless
-310288;United States of America;Verizon Wireless
-311482;United States of America;Verizon Wireless
-312599;United States of America;Verizon Wireless
-310896;United States of America;Verizon Wireless
-310599;United States of America;Verizon Wireless
-311893;United States of America;Verizon Wireless
-310279;United States of America;Verizon Wireless
-311285;United States of America;Verizon Wireless
-312390;United States of America;Verizon Wireless
-312590;United States of America;Verizon Wireless
-310590;United States of America;Verizon Wireless
-311596;United States of America;Verizon Wireless
-311276;United States of America;Verizon Wireless
-312282;United States of America;Verizon Wireless
-310481;United States of America;Verizon Wireless
-311487;United States of America;Verizon Wireless
-312892;United States of America;Verizon Wireless
-31112;United States of America;Verizon Wireless
-312273;United States of America;Verizon Wireless
-310892;United States of America;Verizon Wireless
-311898;United States of America;Verizon Wireless
-310284;United States of America;Verizon Wireless
-311350;United States of America;Verizon Wireless
-312484;United States of America;Verizon Wireless
-312595;United States of America;Verizon Wireless
-310595;United States of America;Verizon Wireless
-311820;United States of America;Verizon Wireless
-310275;United States of America;Verizon Wireless
-311281;United States of America;Verizon Wireless
-312287;United States of America;Verizon Wireless
-312486;United States of America;Verizon Wireless
-310486;United States of America;Verizon Wireless
-311592;United States of America;Verizon Wireless
-312897;United States of America;Verizon Wireless
-311272;United States of America;Verizon Wireless
-312278;United States of America;Verizon Wireless
-312110;United States of America;Verizon Wireless
-310289;United States of America;Verizon Wireless
-311483;United States of America;Verizon Wireless
-312770;United States of America;Verizon Wireless
-310897;United States of America;Verizon Wireless
-310740;United States of America;Viaero Wireless
-310450;United States of America;Viaero Wireless
-310860;United States of America;West Central Wireless
-74801;Uruguay;Antel Movil
-74810;Uruguay;Claro
-748299;Uruguay;Failed Calls
-748999;Uruguay;Fix Line
-74807;Uruguay;Movistar
-43404;Uzbekistan;Beeline
-434299;Uzbekistan;Failed Calls
-434999;Uzbekistan;Fix Line
-43406;Uzbekistan;Perfectum Mobile
-43405;Uzbekistan;Ucell
-43407;Uzbekistan;UMS
-43403;Uzbekistan;UzMobile
-54105;Vanuatu;Digicel
-541299;Vanuatu;Failed Calls
-541999;Vanuatu;Fix Line
-54101;Vanuatu;Smile
-225299;Vatican;Failed Calls
-225999;Vatican;Fix Line
-73402;Venezuela;Digitel
-734299;Venezuela;Failed Calls
-734999;Venezuela;Fix Line
-73406;Venezuela;Movilnet
-73404;Venezuela;Movistar
-452299;Vietnam;Failed Calls
-452999;Vietnam;Fix Line
-45207;Vietnam;Gmobile
-45208;Vietnam;I-Telecom
-45201;Vietnam;MobiFone
-45209;Vietnam;Reddi
-45205;Vietnam;Vietnamobile
-45206;Vietnam;Viettel
-45204;Vietnam;Viettel
-45202;Vietnam;VinaPhone
-376299;Virgin Islands;Failed Calls
-376999;Virgin Islands;Fix Line
-543299;Wallis and Futuna;Failed Calls
-543999;Wallis and Futuna;Fix Line
-54301;Wallis and Futuna;Manuia
-421299;Yemen;Failed Calls
-421999;Yemen;Fix Line
-42101;Yemen;SabaFon
-42102;Yemen;Spacetel
-42104;Yemen;Y
-42103;Yemen;Yemen Mobile
-64501;Zambia;Airtel
-645299;Zambia;Failed Calls
-645999;Zambia;Fix Line
-64502;Zambia;MTN
-64503;Zambia;Zamtel
-64804;Zimbabwe;Econet
-648299;Zimbabwe;Failed Calls
-648999;Zimbabwe;Fix Line
-64801;Zimbabwe;NetOne
-64803;Zimbabwe;Telecel
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/alcatel_hilink.sh b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/alcatel_hilink.sh
deleted file mode 100755
index 84eee9c34..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/alcatel_hilink.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-#
-# (c) 2010-2021 Cezary Jackiewicz
-#
-# (c) 2021 modified by Rafał Wabik - IceG - From eko.one.pl forum
-#
-
-IP=$1
-[ -z "$IP" ] && exit 0
-[ -e /usr/bin/wget ] || exit 0
-
-getvaluen() {
- echo $(sed 's!.*"'$2'":\([^,]*\).*!\1!g' /tmp/$1)
-}
-
-getvalue() {
- echo $(sed 's!.*"'$2'":"\([^"]*\).*!\1!g' /tmp/$1)
-}
-
-rand=`awk 'BEGIN{srand();print int(rand()*(99000-1000))+1000 }'`
-
-files="getWanInfo getImgInfo getSysteminfo"
-for f in $files; do
- wget -t 3 -O /tmp/$f "http://$IP/goform/$f?rand=$rand" >/dev/null 2>&1
-done
-
-MODEN=$(getvaluen getWanInfo "network_type")
-case $MODEN in
- 1) MODE="GPRS";;
- 2) MODE="EDGE";;
- 3) MODE="HSDPA";;
- 4) MODE="HSUPA";;
- 5) MODE="UMTS";;
- 9) MODE="GSM";;
- 11) MODE="LTE";;
- 12) MODE="HSPA+";;
- 13) MODE="DC HSPA+";;
- *) MODE="-";;
-esac
-echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
-
-COPS=$(getvalue getWanInfo "network_name")
-echo "+COPS: 0,0,\"$OPER\",x"
-
-SIGNAL=$(getvaluen getImgInfo "signal")
-case $SIGNAL in
- 1) CSQ="6";;
- 2) CSQ="12";;
- 3) CSQ="18";;
- 4) CSQ="24";;
- 5) CSQ="31";;
- *) CSQ="0";;
-esac
-echo "+CSQ: $CSQ,99"
-
-MODEL=$(getvalue getSysteminfo "dev_name")
-echo MODEL="Alcatel $MODEL"
-
-if [ "x$2" != "xdebug" ]; then
- for f in $files; do
- rm /tmp/$f
- done
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/huawei_hilink.sh b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/huawei_hilink.sh
deleted file mode 100755
index 9797ecc2b..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/huawei_hilink.sh
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/bin/sh
-#
-# (c) 2010-2021 Cezary Jackiewicz
-#
-# (c) 2024 modified by Rafał Wabik - IceG - From eko.one.pl forum
-#
-
-IP=$1
-[ -z "$IP" ] && exit 0
-[ -e /usr/bin/wget ] || exit 0
-getvaluen() {
- echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9]//g')
-}
-
-getvaluens() {
- echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9-]//g')
-}
-
-getvalue() {
- echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1)
-}
-
-cookie=$(mktemp)
-/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/token" >/dev/null 2>&1
-token=$(getvaluen webserver-token token)
-if [ -z "$token" ]; then
- /usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/SesTokInfo" >/dev/null 2>&1
- sesinfo=$(getvalue webserver-token SesInfo)
-fi
-if [ -z "$sesinfo" ]; then
- /usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $cookie "http://$IP/html/home.html"
-fi
-
-files="device/signal monitoring/status net/current-plmn net/signal-para device/information device/basic_information"
-for f in $files; do
- nf=$(echo $f | sed 's!/!-!g')
- if [ -n "$token" ]; then
- /usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "__RequestVerificationToken: $token" >/dev/null 2>&1
- elif [ -n "$sesinfo" ]; then
- /usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "Cookie: $sesinfo" >/dev/null 2>&1
- else
- /usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --load-cookies=$cookie >/dev/null 2>&1
- fi
-done
-
-# Protocol
-# Driver=qmi_wwan & Driver=cdc_mbim & Driver=cdc_ether & Driver=huawei_cdc_ncm
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=12d1 ProdID=' '{print $2}' | cut -c-1108)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-elif echo "$PVCUT" | grep -q "Driver=huawei_cdc_ncm"
-then
- PROTO="ncm"
-fi
-
-RSSI=$(getvalue device-signal rssi)
-if [ "$RSSI" == "<=-113dBm" ]; then
- RSSI=
-else
- RSSI=$(echo "$RSSI" | sed 's/[^0-9]//g')
-fi
-if [ -n "$RSSI" ]; then
- CSQ=$(((-1*RSSI + 113)/2))
- CSQ_PER=$(($CSQ * 100/31))
-else
- CSQ_PER=$(getvaluen monitoring-status SignalStrength)
- if [ -z "$CSQ_PER" ]; then
- CSQ_PER=$(getvaluen monitoring-status SignalIcon)
- if [ -n "$CSQ_PER" ]; then
- CSQ_PER=$((($CSQ_PER * 20) - 19))
- fi
- fi
- if [ -n "$CSQ_PER" ]; then
- CSQ=$((($CSQ_PER*31)/100))
- fi
-fi
-
-MODEN=$(getvaluen monitoring-status CurrentNetworkType)
-case $MODEN in
- 0) MODE="NOSERVICE";;
- 1) MODE="GSM";;
- 2) MODE="GPRS";;
- 3) MODE="EDGE";;
- 4) MODE="WCDMA";;
- 5) MODE="HSDPA";;
- 6) MODE="HSUPA";;
- 7) MODE="HSPA";;
- 8) MODE="TDSCDMA";;
- 9) MODE="HSPA+";;
- 10) MODE="EVDO rev. 0";;
- 11) MODE="EVDO rev. A";;
- 12) MODE="EVDO rev. B";;
- 13) MODE="1xRTT";;
- 14) MODE="UMB";;
- 15) MODE="1xEVDV";;
- 16) MODE="3xRTT";;
- 17) MODE="HSPA+64QAM";;
- 18) MODE="HSPA+MIMO";;
- 19) MODE="LTE";;
- 21) MODE="IS95A";;
- 22) MODE="IS95B";;
- 23) MODE="CDMA1x";;
- 24) MODE="EVDO rev. 0";;
- 25) MODE="EVDO rev. A";;
- 26) MODE="EVDO rev. B";;
- 27) MODE="Hybrydowa CDMA1x";;
- 28) MODE="Hybrydowa EVDO rev. 0";;
- 29) MODE="Hybrydowa EVDO rev. A";;
- 30) MODE="Hybrydowa EVDO rev. B";;
- 31) MODE="EHRPD rev. 0";;
- 32) MODE="EHRPD rev. A";;
- 33) MODE="EHRPD rev. B";;
- 34) MODE="Hybrydowa EHRPD rev. 0";;
- 35) MODE="Hybrydowa EHRPD rev. A";;
- 36) MODE="Hybrydowa EHRPD rev. B";;
- 41) MODE="WCDMA (UMTS)";;
- 42) MODE="HSDPA";;
- 43) MODE="HSUPA";;
- 44) MODE="HSPA";;
- 45) MODE="HSPA+";;
- 46) MODE="DC-HSPA+";;
- 61) MODE="TD SCDMA";;
- 62) MODE="TD HSDPA";;
- 63) MODE="TD HSUPA";;
- 64) MODE="TD HSPA";;
- 65) MODE="TD HSPA+";;
- 81) MODE="802.16E";;
- 101) MODE="LTE";;
- *) MODE="-";;
-esac
-
-if [ "x$MODE" = "xLTE" ] || [ "x$MODE" = "xNOSERVICE"]; then
- RSRP=$(getvaluens device-signal rsrp)
- SINR=$(getvaluens device-signal sinr)
- RSRQ=$(getvaluens device-signal rsrq)
-fi
-
-MODEL=$(getvalue device-information DeviceName)
-if [ -n "$MODEL" ]; then
- class=$(getvalue device-information Classify)
- MODEL="Huawei $MODEL ($class)"
-else
- MODEL=$(getvalue device-basic_information devicename)
- class=$(getvalue device-basic_information classify)
- [ -n "$MODEL" ] && MODEL="Huawei $MODEL ($class)"
-fi
-
-FW=$(getvalue device-information SoftwareVersion)
-if [ -n "$FW" ]; then
- rev=$(getvalue device-information HardwareVersion)
- FW="$rev / $FW"
-fi
-
-if [ -z "$FW" ]
-then
- FW='-'
-fi
-
-if [ -z "$TEMP" ]
-then
- TEMP='-'
-fi
-
-COPSA=$(getvaluen net-current-plmn Numeric)
-COPSB=$(echo "${COPSA}" | cut -c1-3)
-COPSC=$(echo -n $COPSA | tail -c 2)
-COPS_MCC="$COPSB"
-COPS_MNC="$COPSC"
-
-COPS=$(getvalue net-current-plmn ShortName)
-
-if [[ $COPSA =~ ^[0-9]+$ ]]; then
- if [ -z "$COPS" ]
- then
- COPS=$(awk -F[\;] '/^'$COPSA';/ {print $3}' $RES/mccmnc.dat | xargs)
- fi
- LOC=$(awk -F[\;] '/^'$COPSA';/ {print $2}' $RES/mccmnc.dat)
-fi
-
-# operator location from temporary config
-LOCATIONFILE=/tmp/location
-if [ -e "$LOCATIONFILE" ]; then
- touch $LOCATIONFILE
- LOC=$(cat $LOCATIONFILE)
- if [ -n "$LOC" ]; then
- LOC=$(cat $LOCATIONFILE)
- if [[ $LOC == "-" ]]; then
- rm $LOCATIONFILE
- LOC=$(awk -F[\;] '/^'$COPSA';/ {print $2}' $RES/mccmnc.dat)
- if [ -n "$LOC" ]; then
- echo "$LOC" > /tmp/location
- fi
- else
- LOC=$(awk -F[\;] '/^'$COPSA';/ {print $2}' $RES/mccmnc.dat)
- if [ -n "$LOC" ]; then
- echo "$LOC" > /tmp/location
- fi
- fi
- fi
-else
- if [[ "$COPS_MCC$COPS_MNC" =~ ^[0-9]+$ ]]; then
- if [ -n "$LOC" ]; then
- LOC=$(awk -F[\;] '/^'$COPS_MCC$COPS_MNC';/ {print $2}' $RES/mccmnc.dat)
- echo "$LOC" > /tmp/location
- else
- echo "-" > /tmp/location
- fi
- fi
-fi
-
-LAC_HEX=$(getvalue net-signal-para Lac)
-if [ -z "$LAC_HEX" ]; then
- /usr/bin/wget -t 3 -O /tmp/add-param "http://$IP/config/deviceinformation/add_param.xml" > /dev/null 2>&1
- LAC_HEX=$(getvalue add-param lac)
- rm /tmp/add-param
-fi
-if [ -z "$LAC_HEX" ]
-then
- LAC_HEX='-'
-fi
-
-CID_HEX=$(getvalue net-signal-para CellID)
-if [ -z "$CID_HEX" ]; then
- CID_HEX=$(getvalue device-signal cell_id)
- [ -n "$CID_HEX" ] && CID_HEX=$(printf %0X $CID_HEX)
-fi
-
-if [ -z "$CID_HEX" ]
-then
- CID_HEX='-'
-fi
-
-if [ -z "$CID_DEC" ]
-then
- [ -n "$CID_HEX" ] && CID_DEC=$(echo $((0x$CID_HEX)))
-fi
-
-rm $cookie
-break
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/zte.sh b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/zte.sh
deleted file mode 100755
index fc9a29c01..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/hilink/zte.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# (c) 2010-2021 Cezary Jackiewicz
-#
-# (c) 2021 modified by Rafał Wabik - IceG - From eko.one.pl forum
-#
-
-IP=$1
-[ -z "$IP" ] && exit 0
-
-T=$(mktemp)
-wget -q -O $T "http://$IP/goform/goform_get_cmd_process?multi_data=1&cmd=manufacturer_name,model_name,network_provider,network_type,lte_rsrp,lte_rsrq,lte_rssi,lte_snr,cell_id,lac_code,hmcc,hmnc,rmcc,rmnc,rssi,rscp,ecio"
-
-. /usr/share/libubox/jshn.sh
-json_load "$(cat $T)"
-
-json_get_vars manufacturer_name model_name network_provider network_type lte_rsrp lte_rsrq lte_rssi lte_snr cell_id lac_code hmcc hmnc rmcc rmnc rssi rscp ecio
-
-if [ -n "$lte_rssi" ]; then
- RSSI=$lte_rssi
-fi
-if [ -n "$rssi" ]; then
- CSQ=$(((rssi+113)/2))
- CSQ_PER=$(($CSQ * 100/31))
-else
- CSQ=0
- CSQ_PER=0
-fi
-echo "+CSQ: $CSQ,99"
-
-MODEL=$manufacturer_name $model_name
-
-MODE=$network_type
-
-echo "^SYSINFOEX:x,x,x,x,,x,\"$network_type\",x,\"$network_type\""
-
-if [ -n "$hmcc" ]; then
- COPS_MCC==$(printf "%03d" $hmcc)
-else
- [ -n "$rmcc" ] && COPS_MCC==$(printf "%03d" $rmcc)
-fi
-
-if [ -n "$hmnc" ]; then
- COPS_MNC=$(printf "%02d" $hmnc)
-else
- [ -n "$rmnc" ] && COPS_MNC=$(printf "%02d" $rmnc)
-fi
-echo "+COPS: 0,2,\"$mcc$mnc\",x"
-
-if [ "x$network_type" = "xLTE" ]; then
- echo "^LTERSRP: $lte_rsrp,$lte_rsrq"
- RSRP=$lte_rsrp
- RSRQ=$lte_rsrq
-else
- echo "^CSNR: $rscp,$ecio"
-fi
-
-echo "+CREG: 2,1,\"$lac_code\",\"$cell_id\""
-CID_HEX=$cell_id
-LAC_HEX=$lac_code
-
-rm $T
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/105be0b0 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/105be0b0
deleted file mode 100644
index 4d50b5738..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/105be0b0
+++ /dev/null
@@ -1,204 +0,0 @@
-# Dell DW5930e
-# Foxconn T99W175
-
-O=$(sms_tool -d $DEVICE at "at^temp")
-
-T=$(echo "$O" | awk '/^TSENS: / {gsub("C","",$2); print $2}')
-T1=$(echo "$O" | awk '/^PA: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- [ "$T1" -gt "$T" ] && T="$T1"
-fi
-T1=$(echo "$O" | awk '/^Skin Sensor: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- [ "$T1" -gt "$T" ] && T="$T1"
-fi
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at^debug?")
-
-case "$MODE_NUM" in
- "7")
- MODE="LTE |"
- echo "$O" | grep -q "scell:" && MODE="LTE-A |"
- ;;
- "11")
- MODE="5G SA |"
- ;;
- "13")
- MODE="5G NSA |"
- ;;
-esac
-
-T=$(echo "$O" | awk -F: '/^lte_tac:/ {print $2}')
-if [ -n "$T" ]; then
- TAC_HEX=$(printf "%X" $T)
- TAC_DEC=$(printf "%d" "0x$T")
-fi
-
-O1=$(echo "$O" | grep -A 3 pcell)
-T=$(echo "$O1" | awk -F: '/^pcell:/ {print $3}' | cut -f1 -d" ")
-if [ -n "$T" ]; then
- MODE="$MODE $(band4g $T)"
- T1=$(echo "$O1" | awk -F: '/^pcell:/ {print $4}' | xargs)
- PBAND="$(band4g $T) @${T1/MHz/} MHz"
-
- T=$(echo "$O1" | awk -F: '/pci:/ {print $3}' | xargs)
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O1" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O1" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
- [ -n "$T" ] && RSRP="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
- [ -n "$T" ] && RSRQ="${T/dB/}"
- T=$(echo "$O1" | awk -F[:,] '/^lte_rssi:/ {print $2}')
- [ -n "$T" ] && RSSI="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
- [ -n "$T" ] && [ "$T" != "NA" ] && SINR="${T/dB/}"
-fi
-
-O1=$(echo "$O" | grep -A 3 scell)
-IDX=0;
-while true; do
- O2=$(echo "$O1" | head -n4)
- if [ -z "$O2" ]; then
- break
- fi
- IDX=$((IDX + 1))
-
- T=$(echo "$O2" | awk -F: '/^scell:/ {print $3}' | cut -f1 -d" ")
- MODE="$MODE / $(band4g $T)"
- T1=$(echo "$O2" | awk -F: '/^scell:/ {print $4}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band4g $T) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/pci:/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O2" | awk -F[:,] '/^lte_rssi:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-
- O1=$(echo "$O1" | sed '1,4d')
-done
-
-T=$(echo "$O" | awk -F: '/^nr_band:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- IDX=$((IDX + 1))
-
- T1=$(echo "$O" | awk -F: '/^nr_band_width:/ {print $2}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O" | awk -F: '/^nr_pci:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_channel:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_rsrp:/ {print $2}' | cut -f1 -d" ")
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O" | awk -F: '/^nr_rsrq:/ {print $2}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O" | awk -F: '/^nr_snr:/ {print $2}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-
-# Modem
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-if echo "$DEVICE" | grep -q "wwan0at0"
-then
- PROTO="mbim"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/17cb0308 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/17cb0308
deleted file mode 100644
index f2a82de54..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/17cb0308
+++ /dev/null
@@ -1,530 +0,0 @@
-# Quectel RM520N-GL
-# Quectel RM521F-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- MODE="LTE |"
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE_A"
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- MODE="LTE |"
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR-N"*)
- B=$(echo $T | sed 's/NR-N\(.*\)/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-else
- case "$MODE_NUM" in
- 7 | 13)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*LTE.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- fi
- ;;
- 11*)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*NR5G.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- fi
- ;;
- esac
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+GSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM
-if [ -d "/sys/class/mhi_uci_q" ]; then
- if ls /sys/class/mhi_uci_q/mhi_QMI0 > /dev/null 2>&1; then
- PROTO="qmi"
- elif ls /sys/class/mhi_uci_q/mhi_MBIM* > /dev/null 2>&1; then
- PROTO="mbim"
- else
- # Fallback - assume qmi if MHI exists but no specific match
- PROTO="qmi"
- fi
-fi
\ No newline at end of file
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/1eac1004 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/1eac1004
deleted file mode 100644
index f2a82de54..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/pci/1eac1004
+++ /dev/null
@@ -1,530 +0,0 @@
-# Quectel RM520N-GL
-# Quectel RM521F-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- MODE="LTE |"
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE_A"
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- MODE="LTE |"
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR-N"*)
- B=$(echo $T | sed 's/NR-N\(.*\)/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-else
- case "$MODE_NUM" in
- 7 | 13)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*LTE.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- fi
- ;;
- 11*)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*NR5G.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- fi
- ;;
- esac
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+GSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM
-if [ -d "/sys/class/mhi_uci_q" ]; then
- if ls /sys/class/mhi_uci_q/mhi_QMI0 > /dev/null 2>&1; then
- PROTO="qmi"
- elif ls /sys/class/mhi_uci_q/mhi_MBIM* > /dev/null 2>&1; then
- PROTO="mbim"
- else
- # Fallback - assume qmi if MHI exists but no specific match
- PROTO="qmi"
- fi
-fi
\ No newline at end of file
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00857 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00857
deleted file mode 100644
index 4cc230f93..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00857
+++ /dev/null
@@ -1,128 +0,0 @@
-# Telit LN940 (QMI) / Telit LN940 (MBIM) / HP lt4220 (MBIM) / HP lt4220 (QMI)
-
-O=$(sms_tool -D -d $DEVICE at "AT^CA_INFO?;^RFSTS?;+TEMP")
-
-TR=$(echo "$O" |grep -A2 RFSTS: | awk 'NR ==2{print $0}')
-
-if [ "$MODE" = "LTE" ]; then
- RSRP=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$3}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSRQ=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$5}')
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$16*2-20}')
-else
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$6}')
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\PCC info: /{print $2}' | sed 's/Band is //g')
-[ -z "$T" ] && T=$(echo "$O" | awk -F[,] '/^\PCC info: /{print $2}')
-if [ -n "$T" ]; then
- PC=$(echo $T | tr -d 'LTE_B')
- MODE="LTE | $(band4g $PC)"
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC1 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC1=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE/LTE/LTE_A} / "$(band4g ${SC1} "")
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC2 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC2=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE} / "$(band4g ${SC2} "")
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE_A,LTE-A ,')
-
-# Primary band
-T1=$(echo "$O" | awk '/PCC/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T1" ]; then
- T2=$(echo "$O" | awk '/PCC/{print $8}' | sed -e 's/Band_width//g')
- PBAND="$(band4g ${T1/B/} "") @$T2 MHz"
- EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
- PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S1)
-T3=$(echo "$O" | awk '/SCC1/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T3" ]; then
- T4=$(echo "$O" | awk '/SCC1/{print $8}' | sed -e 's/Band_width//g')
- S1BAND="$(band4g ${T3/B/} "") @$T4 MHz"
-# S1EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S1PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S2)
-T5=$(echo "$O" | awk '/SCC2/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T5" ]; then
- T6=$(echo "$O" | awk '/SCC2/{print $8}' | sed -e 's/Band_width//g')
- S2BAND="$(band4g ${T5/B/} "") @$T6 MHz"
-# S2EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S2PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# Temperature
-T=$(echo "$O" | awk -F [:] '/tsens_tz_sensor0:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP=$(echo "$T °C")
-fi
-
-# Cell ID & LAC & TAC
-LAC_HEX=$(printf "%X" $LAC_DEC)
-if [ -n "$LAC_DEC" ]; then
- TAC_HEX=$LAC_HEX
-fi
-CID_HEX=$(printf "%X" $CID_DEC)
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=03f0 ProdID=0857' '{print $2}' | cut -c-1220)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
-# Model
-PVMODEL=$(echo $PV | awk -F 'Vendor=03f0 ProdID=0857' '{print $2}' | cut -c-150)
-if [ -z "$MODEL" ]
-then
- MODELBCUT=$(echo $PVMODEL | awk -F 'Manufacturer=|S: Product=' '{print $2}'| xargs)
- MODELACUT=$(echo $PVMODEL | awk -F 'Product=|S: SerialNumber' '{print $2}'| xargs)
- MODELC="$MODELBCUT "$MODELACUT
- MODEL=$(echo "$MODELC" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}')
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | awk -F " " '/GSN /{print $2}')
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | awk -F " " '/CIMI /{print $2}')
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID" | xargs)
-NR_D=$(echo "$O" | awk -F [:] '/ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# FW
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEV2 | awk -F 'Revision: | IMEI: ' '{print $2}' | cut -c-50)
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00a57 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00a57
deleted file mode 100644
index 5bed514a9..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f00a57
+++ /dev/null
@@ -1,128 +0,0 @@
-# Telit LN940 (QMI) / Telit LN940 (MBIM) / HP lt4220 (MBIM) / HP lt4220 (QMI)
-
-O=$(sms_tool -D -d $DEVICE at "AT^CA_INFO?;^RFSTS?;+TEMP")
-
-TR=$(echo "$O" |grep -A2 RFSTS: | awk 'NR ==2{print $0}')
-
-if [ "$MODE" = "LTE" ]; then
- RSRP=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$3}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSRQ=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$5}')
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$16*2-20}')
-else
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$6}')
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\PCC info: /{print $2}' | sed 's/Band is //g')
-[ -z "$T" ] && T=$(echo "$O" | awk -F[,] '/^\PCC info: /{print $2}')
-if [ -n "$T" ]; then
- PC=$(echo $T | tr -d 'LTE_B')
- MODE="LTE | $(band4g $PC)"
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC1 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC1=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE/LTE/LTE_A} / "$(band4g ${SC1} "")
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC2 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC2=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE} / "$(band4g ${SC2} "")
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE_A,LTE-A ,')
-
-# Primary band
-T1=$(echo "$O" | awk '/PCC/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T1" ]; then
- T2=$(echo "$O" | awk '/PCC/{print $8}' | sed -e 's/Band_width//g')
- PBAND="$(band4g ${T1/B/} "") @$T2 MHz"
- EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
- PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S1)
-T3=$(echo "$O" | awk '/SCC1/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T3" ]; then
- T4=$(echo "$O" | awk '/SCC1/{print $8}' | sed -e 's/Band_width//g')
- S1BAND="$(band4g ${T3/B/} "") @$T4 MHz"
-# S1EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S1PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S2)
-T5=$(echo "$O" | awk '/SCC2/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T5" ]; then
- T6=$(echo "$O" | awk '/SCC2/{print $8}' | sed -e 's/Band_width//g')
- S2BAND="$(band4g ${T5/B/} "") @$T6 MHz"
-# S2EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S2PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# Temperature
-T=$(echo "$O" | awk -F [:] '/tsens_tz_sensor0:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP=$(echo "$T °C")
-fi
-
-# Cell ID & LAC & TAC
-LAC_HEX=$(printf "%X" $LAC_DEC)
-if [ -n "$LAC_DEC" ]; then
- TAC_HEX=$LAC_HEX
-fi
-CID_HEX=$(printf "%X" $CID_DEC)
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=03f0 ProdID=0a57' '{print $2}' | cut -c-1220)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
-# Model
-PVMODEL=$(echo $PV | awk -F 'Vendor=03f0 ProdID=0a57' '{print $2}' | cut -c-150)
-if [ -z "$MODEL" ]
-then
- MODELBCUT=$(echo $PVMODEL | awk -F 'Manufacturer=|S: Product=' '{print $2}'| xargs)
- MODELACUT=$(echo $PVMODEL | awk -F 'Product=|S: SerialNumber' '{print $2}'| xargs)
- MODELC="$MODELBCUT "$MODELACUT
- MODEL=$(echo "$MODELC" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}')
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | awk -F " " '/GSN /{print $2}')
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | awk -F " " '/CIMI /{print $2}')
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID" | xargs)
-NR_D=$(echo "$O" | awk -F [:] '/ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# FW
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEV2 | awk -F 'Revision: | IMEI: ' '{print $2}' | cut -c-50)
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f0581d b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f0581d
deleted file mode 100644
index e85928e86..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/03f0581d
+++ /dev/null
@@ -1,113 +0,0 @@
-# Huawei E3272/E3372/E3276
-
-O=$(sms_tool -d $DEVICE at "at^chiptemp?;^hcsq?")
-
-T=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$T"
-
- case "$MODE" in
- WCDMA*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSCP":"'$RSCP' dBm"}'
- ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"ECIO":"'$ECIO' dB"}'
- ;;
- LTE*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}' | xargs)
- RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$RSRP' dBm"}'
- SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$SINR' dB"}'
- RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$RSRQ' dB"}'
- ;;
- esac
-fi
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-MODELB=$(echo $DEV2 | awk -F 'Manufacturer:|Revision:' '{print $2}'| xargs)
-MODELC=$(echo $MODELB | sed 's/Model://' | xargs)
-MODEL=$(echo $MODELC | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')
-FW=$(echo $DEV2 | awk -F 'Revision:|IMEI' '{print $2}'| xargs)
-
-# Protocol
-# Driver=qmi_wwan & Driver=cdc_mbim & Driver=cdc_ether & Driver=huawei_cdc_ncm
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=12d1 ProdID=1506' '{print $2}' | cut -c-1104)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-elif echo "$PVCUT" | grep -q "cdc_ncm"
-then
- PROTO="ncm"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed 's/AT+GSN//g' | xargs)
-if [ -n "NR_I" ]
-then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT^ICCID?")
-NR_D=$(echo "$O" | awk -F [:] '/^\^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# DL / UL / Band
-OTB=$(sms_tool -d $DEVICE at "AT^HFREQINFO?")
-TBX=$(echo "$OTB" | awk -F [:] '/^\^HFREQINFO:/{print $2}' | xargs)
-TB=$(echo "$TBX" | cut -d ',' -f3-3 )
-
-TDL=$(echo "$TBX" | cut -d ',' -f6-6 )
-DL=$(($TDL/1000))
-
-TUL=$(echo "$TBX" | cut -d ',' -f9-9 )
-UL=$(($TUL/1000))
-
-ULBW="UL: @$UL MHz"
-DLBW="DL: @$DL MHz"
-
-PBAND="$(band4g $TB "") $DLBW $ULBW"
-EARFCN=$(echo "$TBX" | cut -d ',' -f4-4 )
-PCI="-"
-
-# LAC & TAC
-T_HEX=$LAC_HEX
-T_DEC=$LAC_DEC
-
-# Temperature
-T=$(echo "$O" | awk -F[,:] '/^\^CHIPTEMP/ {gsub(/[ \r]/,"");t=0;for(i=2;i<=NF;i++)if($i!=65535){if($i>100){$i=$i/10};if($i>t){t=$i}};printf "%.1f", t}')
-if [ "x$T" != "x0.0" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- TEMP="$T °C"
- #ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c66000 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c66000
deleted file mode 100644
index ae7e23132..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c66000
+++ /dev/null
@@ -1,29 +0,0 @@
-# Qualcomm CDMA Technologies MSM
-
-# Modem
-MODEL="Qualcomm CDMA Technologies MSM"
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR")
-FW=$(echo $FWA | cut -c 9- | sed s/"OK"// | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8- | sed s/"OK"// | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9- | sed s/"OK"// | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | sed s/"OK"// | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69025 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69025
deleted file mode 100644
index 2f7c5c83e..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69025
+++ /dev/null
@@ -1,223 +0,0 @@
-# Foxconn T99W175 (FW 6.0.0.6)
-
-O=$(sms_tool -d $DEVICE at "AT^TEMP?")
-
-T=$(echo "$O" | awk '/^TSENS: / {gsub("C","",$2); print $2}')
-T1=$(echo "$O" | awk '/^PA: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-
-T1=$(echo "$O" | awk '/^Skin Sensor: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at^debug?")
-
-case "$MODE_NUM" in
- "7")
- MODE="LTE |"
- echo "$O" | grep -q "scell:" && MODE="LTE-A |"
- ;;
- "11")
- MODE="5G SA |"
- ;;
- "13")
- MODE="5G NSA |"
- ;;
-esac
-
-T=$(echo "$O" | awk -F: '/^lte_tac:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
-# TAC_HEX=$(printf "%X" $T)
-# TAC_DEC=$(printf "%d" "0x$T")
-
- TAC_HEX=$(printf "%X" $T)
- TAC_DEC="$T"
-fi
-
-O1=$(echo "$O" | grep -A 3 pcell)
-T=$(echo "$O1" | awk -F: '/^pcell:/ {print $3}' | cut -f1 -d" ")
-if [ -n "$T" ]; then
- MODE="$MODE $(band4g $T)"
- T1=$(echo "$O1" | awk -F: '/^pcell:/ {print $4}' | xargs)
- PBAND="$(band4g $T) @${T1/MHz/} MHz"
-
- T=$(echo "$O1" | awk -F: '/pci:/ {print $3}' | xargs)
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O1" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O1" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
- [ -n "$T" ] && RSRP="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
- [ -n "$T" ] && RSRQ="${T/dB/}"
- T=$(echo "$O1" | awk -F[:,] '/^lte_rssi:/ {print $2}')
- [ -n "$T" ] && RSSI="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
- [ -n "$T" ] && [ "$T" != "NA" ] && SINR="${T/dB/}"
-fi
-
-O1=$(echo "$O" | grep -A 3 scell)
-IDX=0;
-while true; do
- O2=$(echo "$O1" | head -n4)
- if [ -z "$O2" ]; then
- break
- fi
- IDX=$((IDX + 1))
-
- T=$(echo "$O2" | awk -F: '/^scell:/ {print $3}' | cut -f1 -d" ")
- MODE="$MODE / $(band4g $T)"
- T1=$(echo "$O2" | awk -F: '/^scell:/ {print $4}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band4g $T) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/pci:/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O2" | awk -F[:,] '/^lte_rssi:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-
- O1=$(echo "$O1" | sed '1,4d')
-done
-
-T=$(echo "$O" | awk -F: '/^nr_band:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- IDX=$((IDX + 1))
-
- T1=$(echo "$O" | awk -F: '/^nr_band_width:/ {print $2}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O" | awk -F: '/^nr_pci:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_channel:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_rsrp:/ {print $2}' | cut -f1 -d" ")
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O" | awk -F: '/^nr_rsrq:/ {print $2}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O" | awk -F: '/^nr_snr:/ {print $2}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-
-# Modem
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=05c6 ProdID=9025' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c690d5 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c690d5
deleted file mode 100644
index 462214063..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c690d5
+++ /dev/null
@@ -1,223 +0,0 @@
-# Foxconn T99W175 (FW 6.0.0.6)
-
-O=$(sms_tool -d $DEVICE at "AT^TEMP?")
-
-T=$(echo "$O" | awk '/^TSENS: / {gsub("C","",$2); print $2}')
-T1=$(echo "$O" | awk '/^PA: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-
-T1=$(echo "$O" | awk '/^Skin Sensor: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at^debug?")
-
-case "$MODE_NUM" in
- "7")
- MODE="LTE |"
- echo "$O" | grep -q "scell:" && MODE="LTE-A |"
- ;;
- "11")
- MODE="5G SA |"
- ;;
- "13")
- MODE="5G NSA |"
- ;;
-esac
-
-T=$(echo "$O" | awk -F: '/^lte_tac:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
-# TAC_HEX=$(printf "%X" $T)
-# TAC_DEC=$(printf "%d" "0x$T")
-
- TAC_HEX=$(printf "%X" $T)
- TAC_DEC="$T"
-fi
-
-O1=$(echo "$O" | grep -A 3 pcell)
-T=$(echo "$O1" | awk -F: '/^pcell:/ {print $3}' | cut -f1 -d" ")
-if [ -n "$T" ]; then
- MODE="$MODE $(band4g $T)"
- T1=$(echo "$O1" | awk -F: '/^pcell:/ {print $4}' | xargs)
- PBAND="$(band4g $T) @${T1/MHz/} MHz"
-
- T=$(echo "$O1" | awk -F: '/pci:/ {print $3}' | xargs)
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O1" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O1" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
- [ -n "$T" ] && RSRP="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
- [ -n "$T" ] && RSRQ="${T/dB/}"
- T=$(echo "$O1" | awk -F[:,] '/^lte_rssi:/ {print $2}')
- [ -n "$T" ] && RSSI="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
- [ -n "$T" ] && [ "$T" != "NA" ] && SINR="${T/dB/}"
-fi
-
-O1=$(echo "$O" | grep -A 3 scell)
-IDX=0;
-while true; do
- O2=$(echo "$O1" | head -n4)
- if [ -z "$O2" ]; then
- break
- fi
- IDX=$((IDX + 1))
-
- T=$(echo "$O2" | awk -F: '/^scell:/ {print $3}' | cut -f1 -d" ")
- MODE="$MODE / $(band4g $T)"
- T1=$(echo "$O2" | awk -F: '/^scell:/ {print $4}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band4g $T) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/pci:/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O2" | awk -F[:,] '/^lte_rssi:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-
- O1=$(echo "$O1" | sed '1,4d')
-done
-
-T=$(echo "$O" | awk -F: '/^nr_band:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- IDX=$((IDX + 1))
-
- T1=$(echo "$O" | awk -F: '/^nr_band_width:/ {print $2}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O" | awk -F: '/^nr_pci:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_channel:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_rsrp:/ {print $2}' | cut -f1 -d" ")
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O" | awk -F: '/^nr_rsrq:/ {print $2}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O" | awk -F: '/^nr_snr:/ {print $2}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-
-# Modem
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=05c6 ProdID=90d5' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69215 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69215
deleted file mode 100644
index 3c65f1ed1..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69215
+++ /dev/null
@@ -1,117 +0,0 @@
-# Quectel EC20-E
-# Quectel EC25
-
-OCT=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$OCT" | awk -F[,:] '/^\+QTEMP/ {t=$2*1;if($3*1>t)t=$3*1;if($4*1>t)t=$4*1;printf "%d", t}')
-if [ -n "$T" ]; then
- TEMP="$T °C"
-fi
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $2"/"$4}' | xargs)
-if [ -n "$T" ]; then
- if [ "x$MODE_NUM" = "x7" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- MODE="LTE | $(band4g ${B})"
- MAINCUT="$(band4g ${B})"
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
-if [ "x$T" = "xLTE" ] || [ "x$T" = "x4G" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- DLBW="DL: @$T1 MHz"
- PBAND="$MAINCUT $DLBW $ULBW"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
- PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}')
- EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", $1*0.2-20}')
- SINR=$T
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $4}' | xargs)
-if [ -n "$T" ]; then
- COPS="$T"
-fi
-
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEVV | awk -F 'Revision:' '{print $2}'| xargs)
-MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $1}'| xargs)
-if [ -z "$MODEL" ]
-then
- MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $2}'| xargs)
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=05c6 ProdID=9215' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69625 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69625
deleted file mode 100644
index e4e3e66f3..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/05c69625
+++ /dev/null
@@ -1,85 +0,0 @@
-# YUGA CLM920-NC5
-
-O=$(sms_tool -d $DEVICE at "at+temp")
-
-T=$(echo "$O" | awk -F[,:] '/^temp:/ {print $2}')
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo")
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/.*LTE_EUTRAN_BAND\(.*\)"/\1/')
- MODE="LTE $(band4g ${B})"
- PBAND="$(band4g ${B})"
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $5}')
- EARFCN="$T"
- fi
- O=$(sms_tool -d $DEVICE at "at+qnwinfo")
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $3}')
- if [ -n "$T" ]; then
- T_HEX=$(printf "%X" "$T")
- T_DEC=$(printf "%d" "$T")
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $5}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $12}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $11}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $10}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+LTEINFO/ {print $13}' | xargs)
- [ -n "$T" ] && SINR="$T"
-fi
-
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR"//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "// | sed s/"Co.,Ltd."//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT^IMEI?" | xargs)
-NR_I=$(echo "$O" | awk -F': ' '/\^IMEI:/ {print $2}')
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+QCIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+QCIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=05c6 ProdID=9625' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7126 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7126
deleted file mode 100644
index d0925b71f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7126
+++ /dev/null
@@ -1,310 +0,0 @@
-# Fibocom modems with ProdID=0e8d +GTUSBMODE: 40
-# Fibocom FM350-GL
-
-convert_bw() {
- case "${1}" in
- "6") echo "1.4 MHz";;
- "15") echo "3 MHz";;
- "25") echo "5 MHz";;
- "50") echo "10 MHz";;
- "75") echo "15 MHz";;
- "100") echo "20 MHz";;
- "125") echo "25 MHz";;
- "150") echo "30 MHz";;
- "200") echo "40 MHz";;
- "250") echo "50 MHz";;
- "300") echo "60 MHz";;
- "400") echo "80 MHz";;
- "450") echo "90 MHz";;
- "500") echo "100 MHz";;
- "1000") echo "200 MHz";;
- "2000") echo "400 MHz";;
- *) echo "";;
- esac
-}
-
-O=$(sms_tool -d $DEVICE at "AT+GTCCINFO?;+GTCAINFO?")
-
-case "$MODE_NUM" in
- 7*)
- if echo "$O" | grep -q -E '^SCC'; then
- MODE="LTE-A |"
- fi
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*) MODE="5G NSA |"
- ;;
-esac
-
-T_MODE=""
-
-T1=$(echo "$O" | grep -A3 '+GTCCINFO:' | grep "1,[49],${COPS_MCC}")
-if [ -n "$T1" ]; then
- T_RAT=$(echo "$T1" | awk -F, '{print $2}')
- T=$(echo "$T1" | awk -F, '{print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $7}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $8}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $9}')
- if [ -n "$T" ]; then
- case $T_RAT in
- 4)
- T=$((T - 100))
- T_MODE="$(band4g $T)"
- PBAND="$(band4g $T)"
- ;;
- 9)
- T=$(echo "$T" | sed 's/^50//')
- T_MODE="$(band5g $T)"
- PBAND="$(band5g $T)"
- ;;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $11}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) SINR=$(echo "$T" | awk '{printf "%0.1f", $1/2 }');;
- 9) SINR=$(echo "$T" | awk '{printf "%0.1f", ($1-45)/2-1 }');;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $13}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) RSRP=$((T - 141));;
- 9) RSRP=$((T - 157));;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $14}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) RSRQ=$(echo "$T" | awk '{printf "%0.1f", ($1-34)/2-3 }');;
- 9) RSRQ=$(echo "$T" | awk '{printf "%0.1f", ($1-87)/2 }');;
- esac
- fi
- if [ -n "$CSQ" ]; then
- RSSI=$((2 * $CSQ -113))
- fi
-fi
-
-IFS="
-"
-IDX=1
-LINES=$(echo "$O" | grep -E '^PCC:')
-[ -n "$LINES" ] && T_MODE=""
-
-T_4G_MODE=""
-T_4G_PBAND=""
-T_4G_PCI=""
-T_4G_EARFCN=""
-
-T_5G_MODE=""
-T_5G_PBAND=""
-T_5G_PCI=""
-T_5G_EARFCN=""
-
-for LINE in $LINES; do
- T_BAND=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $2}')
- T_PCI=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $3}')
- T_EARFCN=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $4}')
- T_DBW=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $5}')
-
- if [ -n "$T_BAND" ]; then
- DBW=""
- if [ -n "$T_DBW" -a "$T_DBW" -ne "0" ]; then
- DBW=" @$(convert_bw $T_DBW)"
- fi
-
- if [ "$T_BAND" -lt "200" ]; then
- T_BAND=$((T_BAND - 100))
- T_4G_MODE="$(band4g ${T_BAND}) + "
- T_4G_PBAND="$(band4g ${T_BAND})${DBW}"
- T_4G_PCI="$T_PCI"
- T_4G_EARFCN="$T_EARFCN"
- elif [ "$T_BAND" -gt "500" ]; then
- T_BAND=$(echo "$T_BAND" | sed 's/^50//')
- T_5G_MODE="$(band5g ${T_BAND}) + "
- T_5G_PBAND="$(band5g ${T_BAND})${DBW}"
- T_5G_PCI="$T_PCI"
- T_5G_EARFCN="$T_EARFCN"
- fi
- fi
-
- IDX=$((IDX + 1))
-done
-
-if [ -n "$T_4G_PBAND" ]; then
- PBAND="$T_4G_PBAND"
- PCI="$T_4G_PCI"
- EARFCN="$T_4G_EARFCN"
-elif [ -n "$T_5G_PBAND" ]; then
- PBAND="$T_5G_PBAND"
- PCI="$T_5G_PCI"
- EARFCN="$T_5G_EARFCN"
-fi
-
-
-IFS="
-"
-IDX=1
-LINES=$(echo "$O" | grep -E '^SCC\s?[0-9]:2,')
-for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $4}')
- if [ -n "$T" ]; then
- T_DBW=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $7}')
- DBW=""
- if [ -n "$T_DBW" -a "$T_DBW" -ne "0" ]; then
- DBW=" @$(convert_bw $T_DBW)"
- fi
- T2=""
- if [ "$T" -lt "200" ]; then
- T=$((T - 100))
- T2="$(band4g $T)${DBW}"
- T_4G_MODE="${T_4G_MODE}$(band4g $T) / "
- elif [ "$T" -gt "500" ]; then
- T=$(echo "$T" | sed 's/^50//')
- T2="$(band5g $T)${DBW}"
- T_5G_MODE="${T_5G_MODE}$(band5g $T) / "
- fi
- if [ -n "$T2" ]; then
- case $IDX in
- "1") S1BAND="$T2";;
- "2") S2BAND="$T2";;
- "3") S3BAND="$T2";;
- "4") S4BAND="$T2";;
- *);;
- esac
- fi
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $5}')
- if [ -n "$T" ]; then
- case $IDX in
- "1") S1PCI="$T";;
- "2") S2PCI="$T";;
- "3") S3PCI="$T";;
- "4") S4PCI="$T";;
- *);;
- esac
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $6}')
- if [ -n "$T" ]; then
- case $IDX in
- "1") S1EARFCN="$T";;
- "2") S2EARFCN="$T";;
- "3") S3EARFCN="$T";;
- "4") S4EARFCN="$T";;
- *);;
- esac
- fi
-
- IDX=$((IDX + 1))
-done
-
-T_4G_MODE=$(echo "$T_4G_MODE" | sed 's/ [\/\+] $//')
-T_5G_MODE=$(echo "$T_5G_MODE" | sed 's/ [\/\+] $//')
-
-if [ -n "$T_4G_PBAND" -a -n "$T_5G_PBAND" ]; then
- if [ -n "$T_5G_PBAND" ]; then
- case $IDX in
- "1") S1BAND="$T_5G_PBAND";;
- "2") S2BAND="$T_5G_PBAND";;
- "3") S3BAND="$T_5G_PBAND";;
- "4") S4BAND="$T_5G_PBAND";;
- *);;
- esac
- fi
-
- if [ -n "$T_5G_PCI" ]; then
- case $IDX in
- "1") S1PCI="$T_5G_PCI";;
- "2") S2PCI="$T_5G_PCI";;
- "3") S3PCI="$T_5G_PCI";;
- "4") S4PCI="$T_5G_PCI";;
- *);;
- esac
- fi
-
- if [ -n "$T_5G_EARFCN" ]; then
- case $IDX in
- "1") S1EARFCN="$T_5G_EARFCN";;
- "2") S2EARFCN="$T_5G_EARFCN";;
- "3") S3EARFCN="$T_5G_EARFCN";;
- "4") S4EARFCN="$T_5G_EARFCN";;
- *);;
- esac
- fi
-fi
-
-if [ -z "$T_MODE" ]; then
- if [ -n "$T_4G_MODE" ]; then
- MODE="$MODE $T_4G_MODE"
- fi
-
- if [ -n "$T_5G_MODE" ]; then
- [ -n "$T_4G_MODE" ] && MODE="$MODE /"
- MODE="$MODE $T_5G_MODE"
- fi
-fi
-
-# Modem
-OA=$(sms_tool -d $DEVICE at "AT+CGMM?")
-MODELA=$(echo "$OA" | awk -F [:,] '/\+CGMM/{print $2}' | xargs)
-OB=$(sms_tool -d $DEVICE at "AT+CGMI?")
-MODELB=$(echo "$OB" | awk -F [:,] '/\+CGMI/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | sed s/"Wireless Inc."//)
-MODEL="$MODELBCUT $MODELA"
-
-OF=$(sms_tool -d $DEVICE at "AT+GMR?")
-FW=$(echo "$OF" | awk -F[,:] '/\+GMR:/ {print $2}' | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-OAA=$(sms_tool -d $DEVICE at "AT+CGSN?")
-NR_IMEI=$(echo "$OAA" | awk -F[,:] '/\+CGSN:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-OBB=$(sms_tool -d $DEVICE at "AT+CIMI?")
-NR_IMSI=$(echo "$OBB" | awk -F [,:] '/\+CIMI:/ {print $2}' | xargs)
-
-# Integrated Circuit Card Identifier (ICCID)
-OCC=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$OCC" | awk -F [,:] '/\+ICCID:/ {print $2}' | xargs)
-
-# Temp
-OT=$(sms_tool -d "$DEVICE" at "AT+ETHERMAL?")
-TM=$(echo "$OT" | awk -F, '/\+ETHERMAL:/{ sum+=$2; count++ } END { if(count > 0) { printf "%.1f", sum/count } else { print 0 } }' | xargs)
-if [ -n "$TM" ]; then
- TEMP="$TM °C"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-TTY=$(basename $DEVICE)
-devpath=$(readlink -f /sys/class/tty/$TTY/device)
-BASE=$(readlink -f ${devpath%/*/*})
-
-NETIF=$(for a in /sys/class/net/*; do readlink -f $a; done | grep "$BASE")
-NETDRV=$(basename $(readlink -f $NETIF/../../driver))
-
-case $NETDRV in
- "qmi_wwan")
- PROTO="qmi";;
- "cdc_mbim")
- PROTO="mbim";;
- "cdc_ether")
- PROTO="ecm";;
- "rndis_host")
- PROTO="ncm";;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7127 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7127
deleted file mode 100644
index 695179e5d..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0e8d7127
+++ /dev/null
@@ -1,316 +0,0 @@
-# Fibocom modems with ProdID=0e8d +GTUSBMODE: 41
-# Fibocom FM350-GL
-
-convert_bw() {
- case "${1}" in
- "6") echo "1.4 MHz";;
- "15") echo "3 MHz";;
- "25") echo "5 MHz";;
- "50") echo "10 MHz";;
- "75") echo "15 MHz";;
- "100") echo "20 MHz";;
- "125") echo "25 MHz";;
- "150") echo "30 MHz";;
- "200") echo "40 MHz";;
- "250") echo "50 MHz";;
- "300") echo "60 MHz";;
- "400") echo "80 MHz";;
- "450") echo "90 MHz";;
- "500") echo "100 MHz";;
- "1000") echo "200 MHz";;
- "2000") echo "400 MHz";;
- *) echo "";;
- esac
-}
-
-O=$(sms_tool -d $DEVICE at "AT+GTCCINFO?;+GTCAINFO?")
-
-case "$MODE_NUM" in
- 7*)
- if echo "$O" | grep -q -E '^SCC'; then
- MODE="LTE-A |"
- fi
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*) MODE="5G NSA |"
- ;;
-esac
-
-T_MODE=""
-
-T1=$(echo "$O" | grep -A3 '+GTCCINFO:' | grep "1,[49],${COPS_MCC}")
-if [ -n "$T1" ]; then
- T_RAT=$(echo "$T1" | awk -F, '{print $2}')
- T=$(echo "$T1" | awk -F, '{print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $7}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $8}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $9}')
- if [ -n "$T" ]; then
- case $T_RAT in
- 4)
- T=$((T - 100))
- T_MODE="$(band4g $T)"
- PBAND="$(band4g $T)"
- ;;
- 9)
- T=$(echo "$T" | sed 's/^50//')
- T_MODE="$(band5g $T)"
- PBAND="$(band5g $T)"
- ;;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $11}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) SINR=$(echo "$T" | awk '{printf "%0.1f", $1/2 }');;
- 9) SINR=$(echo "$T" | awk '{printf "%0.1f", ($1-45)/2-1 }');;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $13}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) RSRP=$((T - 141));;
- 9) RSRP=$((T - 157));;
- esac
- fi
- T=$(echo "$T1" | awk -F, '{print $14}')
- if [ -n "$T" -a "$T" -ne "255" ]; then
- case $T_RAT in
- 4) RSRQ=$(echo "$T" | awk '{printf "%0.1f", ($1-34)/2-3 }');;
- 9) RSRQ=$(echo "$T" | awk '{printf "%0.1f", ($1-87)/2 }');;
- esac
- fi
- if [ -n "$CSQ" ]; then
- RSSI=$((2 * $CSQ -113))
- fi
-fi
-
-IFS="
-"
-IDX=1
-LINES=$(echo "$O" | grep -E '^PCC:')
-[ -n "$LINES" ] && T_MODE=""
-
-T_4G_MODE=""
-T_4G_PBAND=""
-T_4G_PCI=""
-T_4G_EARFCN=""
-
-T_5G_MODE=""
-T_5G_PBAND=""
-T_5G_PCI=""
-T_5G_EARFCN=""
-
-for LINE in $LINES; do
- T_BAND=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $2}')
- T_PCI=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $3}')
- T_EARFCN=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $4}')
- T_DBW=$(echo "$LINE" | awk -F[:,] '/^PCC:/{print $5}')
-
- if [ -n "$T_BAND" ]; then
- DBW=""
- if [ -n "$T_DBW" -a "$T_DBW" -ne "0" ]; then
- DBW=" @$(convert_bw $T_DBW)"
- fi
-
- if [ "$T_BAND" -lt "200" ]; then
- T_BAND=$((T_BAND - 100))
- T_4G_MODE="$(band4g ${T_BAND}) + "
- T_4G_PBAND="$(band4g ${T_BAND})${DBW}"
- T_4G_PCI="$T_PCI"
- T_4G_EARFCN="$T_EARFCN"
- elif [ "$T_BAND" -gt "500" ]; then
- T_BAND=$(echo "$T_BAND" | sed 's/^50//')
- T_5G_MODE="$(band5g ${T_BAND}) + "
- T_5G_PBAND="$(band5g ${T_BAND})${DBW}"
- T_5G_PCI="$T_PCI"
- T_5G_EARFCN="$T_EARFCN"
- fi
- fi
-
- IDX=$((IDX + 1))
-done
-
-if [ -n "$T_4G_PBAND" ]; then
- PBAND="$T_4G_PBAND"
- PCI="$T_4G_PCI"
- EARFCN="$T_4G_EARFCN"
-elif [ -n "$T_5G_PBAND" ]; then
- PBAND="$T_5G_PBAND"
- PCI="$T_5G_PCI"
- EARFCN="$T_5G_EARFCN"
-fi
-
-
-IFS="
-"
-IDX=1
-LINES=$(echo "$O" | grep -E '^SCC\s?[0-9]:2,')
-for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $4}')
- if [ -n "$T" ]; then
- T_DBW=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $7}')
- DBW=""
- if [ -n "$T_DBW" -a "$T_DBW" -ne "0" ]; then
- DBW=" @$(convert_bw $T_DBW)"
- fi
- T2=""
- if [ "$T" -lt "200" ]; then
- T=$((T - 100))
- T2="$(band4g $T)${DBW}"
- T_4G_MODE="${T_4G_MODE}$(band4g $T) / "
- elif [ "$T" -gt "500" ]; then
- T=$(echo "$T" | sed 's/^50//')
- T2="$(band5g $T)${DBW}"
- T_5G_MODE="${T_5G_MODE}$(band5g $T) / "
- fi
- if [ -n "$T2" ]; then
- case $IDX in
- "1") S1BAND="$T2";;
- "2") S2BAND="$T2";;
- "3") S3BAND="$T2";;
- "4") S4BAND="$T2";;
- *);;
- esac
- fi
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $5}')
- if [ -n "$T" ]; then
- case $IDX in
- "1") S1PCI="$T";;
- "2") S2PCI="$T";;
- "3") S3PCI="$T";;
- "4") S4PCI="$T";;
- *);;
- esac
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC\s?'$IDX':2,/{print $6}')
- if [ -n "$T" ]; then
- case $IDX in
- "1") S1EARFCN="$T";;
- "2") S2EARFCN="$T";;
- "3") S3EARFCN="$T";;
- "4") S4EARFCN="$T";;
- *);;
- esac
- fi
-
- IDX=$((IDX + 1))
-done
-
-T_4G_MODE=$(echo "$T_4G_MODE" | sed 's/ [\/\+] $//')
-T_5G_MODE=$(echo "$T_5G_MODE" | sed 's/ [\/\+] $//')
-
-if [ -n "$T_4G_PBAND" -a -n "$T_5G_PBAND" ]; then
- if [ -n "$T_5G_PBAND" ]; then
- case $IDX in
- "1") S1BAND="$T_5G_PBAND";;
- "2") S2BAND="$T_5G_PBAND";;
- "3") S3BAND="$T_5G_PBAND";;
- "4") S4BAND="$T_5G_PBAND";;
- *);;
- esac
- fi
-
- if [ -n "$T_5G_PCI" ]; then
- case $IDX in
- "1") S1PCI="$T_5G_PCI";;
- "2") S2PCI="$T_5G_PCI";;
- "3") S3PCI="$T_5G_PCI";;
- "4") S4PCI="$T_5G_PCI";;
- *);;
- esac
- fi
-
- if [ -n "$T_5G_EARFCN" ]; then
- case $IDX in
- "1") S1EARFCN="$T_5G_EARFCN";;
- "2") S2EARFCN="$T_5G_EARFCN";;
- "3") S3EARFCN="$T_5G_EARFCN";;
- "4") S4EARFCN="$T_5G_EARFCN";;
- *);;
- esac
- fi
-fi
-
-if [ -z "$T_MODE" ]; then
- if [ -n "$T_4G_MODE" ]; then
- MODE="$MODE $T_4G_MODE"
- fi
-
- if [ -n "$T_5G_MODE" ]; then
- [ -n "$T_4G_MODE" ] && MODE="$MODE /"
- MODE="$MODE $T_5G_MODE"
- fi
-fi
-
-# Modem data forcing
-if [ "$CSQ" = "0" ]; then
-$CSQ="1"
-$CSQ_PER="10"
-fi
-
-# Modem
-OA=$(sms_tool -d $DEVICE at "AT+CGMM?")
-MODELA=$(echo "$OA" | awk -F [:,] '/\+CGMM/{print $2}' | xargs)
-OB=$(sms_tool -d $DEVICE at "AT+CGMI?")
-MODELB=$(echo "$OB" | awk -F [:,] '/\+CGMI/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | sed s/"Wireless Inc."//)
-MODEL="$MODELBCUT $MODELA"
-
-OF=$(sms_tool -d $DEVICE at "AT+GMR?")
-FW=$(echo "$OF" | awk -F[,:] '/\+GMR:/ {print $2}' | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-OAA=$(sms_tool -d $DEVICE at "AT+CGSN?")
-NR_IMEI=$(echo "$OAA" | awk -F[,:] '/\+CGSN:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-OBB=$(sms_tool -d $DEVICE at "AT+CIMI?")
-NR_IMSI=$(echo "$OBB" | awk -F [,:] '/\+CIMI:/ {print $2}' | xargs)
-
-# Integrated Circuit Card Identifier (ICCID)
-OCC=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$OCC" | awk -F [,:] '/\+ICCID:/ {print $2}' | xargs)
-
-# Temp
-OT=$(sms_tool -d "$DEVICE" at "AT+ETHERMAL?")
-TM=$(echo "$OT" | awk -F, '/\+ETHERMAL:/{ sum+=$2; count++ } END { if(count > 0) { printf "%.1f", sum/count } else { print 0 } }' | xargs)
-if [ -n "$TM" ]; then
- TEMP="$TM °C"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-TTY=$(basename $DEVICE)
-devpath=$(readlink -f /sys/class/tty/$TTY/device)
-BASE=$(readlink -f ${devpath%/*/*})
-
-NETIF=$(for a in /sys/class/net/*; do readlink -f $a; done | grep "$BASE")
-NETDRV=$(basename $(readlink -f $NETIF/../../driver))
-
-case $NETDRV in
- "qmi_wwan")
- PROTO="qmi";;
- "cdc_mbim")
- PROTO="mbim";;
- "cdc_ether")
- PROTO="ecm";;
- "rndis_host")
- PROTO="ncm";;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0f3d68aa b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0f3d68aa
deleted file mode 100644
index 908ced857..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/0f3d68aa
+++ /dev/null
@@ -1,84 +0,0 @@
-# Sierra Wireless 320u
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-T=$(echo "$O" | awk '/^LTE band:/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- case "$T" in
- *"B1") MODE=$(band 1 "LTE ");;
- *"B3") MODE=$(band 3 "LTE ");;
- *"B5") MODE=$(band 5 "LTE ");;
- *"B7") MODE=$(band 7 "LTE ");;
- *"B8") MODE=$(band 8 "LTE ");;
- *) MODE="LTE ${T}";;
- esac
-fi
-
-T=$(echo "$O" | awk '/^RSSI/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- RSSI="${T// //}"
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSSI":"'${T// //}' dBm"}'
-fi
-
-T=$(echo "$O" | awk '/^RSRP/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- RSRP="${T// //}"
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'${T// //}' dBm"}'
-fi
-T=$(echo "$O" | awk '/^RSRQ/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- RSRQ="$T"
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$T' dB"}'
-fi
-T=$(echo "$O" | awk '/^SINR/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- SINR="$T"
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$T' dB"}'
-fi
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
-
-TAC_HEX=$(echo "$O" |awk -F: '/TAC:/ {print $3}' | awk '{ print $1 }' | xargs)
-TAC_DEC=$(echo "$O" | sed 's/[()]//g' |awk -F: '/TAC:/ {print $3}' | awk '{ print $2 }' | xargs)
-
-
-BW=$(echo "$O" |awk -F: '/LTE bw:/ {print $3}' | xargs)
-RXCH=$(echo "$O" |awk -F: '/LTE Rx chan:/ {print $2}' | cut -f1 | xargs)
-TXCH=$(echo "$O" |awk -F: '/LTE Tx chan:/ {print $3}' | cut -f1 | xargs)
-
-PBAND="RxCh:$RXCH / TxCh:$TXCH / Bw:$BW"
-#EARFCN=$(echo "$O" |awk -F: '/^LTE Rx chan:/ {print $2}' | cut -f1 | xargs)
-PCI="-"
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-MODELB=$(echo $DEV2 | awk -F 'Manufacturer:|Revision:' '{print $2}'| xargs)
-MODEL=$(echo $MODELB | sed 's/Model://' | xargs)
-
-FW=$(echo $DEV2 | awk -F 'Revision:|IMEI' '{print $2}'| xargs)
-NR_IMEI=$(echo "$OF" | awk '/^IMEI:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$O" | awk '/^ICCID/ {print $2}')
-
-PROTO=sierra
-
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119968a2 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119968a2
deleted file mode 100644
index 24e1632ea..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119968a2
+++ /dev/null
@@ -1,39 +0,0 @@
-# Sierra Wireless MC7710
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk '/.*TAC:/ {print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- TAC="${T_DEC} ($T)"
- fi
-
- T=$(echo "$O" | awk '/^RSSI/ {print $3}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk '/^RSRP/ {print $3}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk '/^RSRQ/ {print $3}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk '/^SINR/ {print $3}')
- [ -n "$T" ] && SINR="$T"
-
- T=$(echo "$O" | awk '/^LTE band:/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE band:/ {print $6}')
- PBAND="$(band4g ${T/B/}) @${T1} MHz"
- MODE="LTE $(band4g ${T/B/})"
- fi
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $4}')
-# [ -n "$T" ] && addon 34 "EARFCN DL" "$T"
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $8}')
-# [ -n "$T" ] && addon 34 "EARFCN UL" "$T"
-fi
-
-fi
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999041 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999041
deleted file mode 100644
index 0cafb0415..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999041
+++ /dev/null
@@ -1,103 +0,0 @@
-# Sierra Wireless EM7355 (maybe? I do not own one to test with)
-# Sierra Wireless MC7355
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}' | grep -oE "\d+\.?\d{0,2}")
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk '/.*TAC:/ {print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- fi
-
- T=$(echo "$O" | awk '/^PCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="${T// //}"
- T=$(echo "$O" | awk '/^PCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP="${T// //}"
- T=$(echo "$O" | awk '/^RSRQ/ {print $3}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk '/^SINR/ {print $3}')
- [ -n "$T" ] && SINR="$T"
-
- T=$(echo "$O" | awk '/^LTE band:/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE band:/ {print $6}')
- PBAND="$(band4g ${T/B/}) @${T1} MHz"
- MODE="$MODE $(band4g ${T/B/})"
- fi
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $4}')
-# [ -n "$T" ] && addon 34 "EARFCN DL" "$T"
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $8}')
-# [ -n "$T" ] && addon 34 "EARFCN UL" "$T"
-
- T=$(echo "$O" | awk -F: '/^LTE CA state:.*ACTIVE/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE Scell bw:/ {print $3}')
- if [ -n "$T1" ]; then
- S1BAND="$(band ${T/B/}) @${T1#bw:} MHz"
- else
- S1BAND="$(band ${T/B/})"
- fi
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE Scell chan:/ {print $7}')
- [ -n "$T" ] && S1EARFCN="${T#chan:}"
-
- T=$(echo "$O" | awk '/^SCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="${T// //}"
- T=$(echo "$O" | awk '/^SCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP="${T// //}"
- fi
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "// | cut -f1 -d",")
-MODEL="$MODELBCUT "$MODELACUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F[,:] '/^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=1199 ProdID=9041' '{print $2}' | cut -c-1100)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999071 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999071
deleted file mode 100644
index f1e1601c8..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/11999071
+++ /dev/null
@@ -1,104 +0,0 @@
-# DW5809e Dell Wireless 5809e Gobi 4G LTE Mobile Broadband Card (EM7305)
-# DW5811e Snapdragon X7 LTE (EM7455B)
-# Sierra Wireless EM7455
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}' | grep -oE "\d+\.?\d{0,2}")
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk '/.*TAC:/ {print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- fi
-
- T=$(echo "$O" | awk '/^PCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="${T// //}"
- T=$(echo "$O" | awk '/^PCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP="${T// //}"
- T=$(echo "$O" | awk '/^RSRQ/ {print $3}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk '/^SINR/ {print $3}')
- [ -n "$T" ] && SINR="$T"
-
- T=$(echo "$O" | awk '/^LTE band:/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE band:/ {print $6}')
- PBAND="$(band4g ${T/B/}) @${T1} MHz"
- MODE="$MODE $(band4g ${T/B/})"
- fi
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $4}')
-# [ -n "$T" ] && addon 34 "EARFCN DL" "$T"
- T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $8}')
-# [ -n "$T" ] && addon 34 "EARFCN UL" "$T"
-
- T=$(echo "$O" | awk -F: '/^LTE CA state:.*ACTIVE/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE Scell bw:/ {print $3}')
- if [ -n "$T1" ]; then
- S1BAND="$(band4g ${T/B/}) @${T1#bw:} MHz"
- else
- S1BAND="$(band4g ${T/B/})"
- fi
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE Scell chan:/ {print $7}')
- [ -n "$T" ] && S1EARFCN="${T#chan:}"
-
- T=$(echo "$O" | awk '/^SCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="${T// //} dBm"
- T=$(echo "$O" | awk '/^SCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP="${T// //} dBm"
- fi
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "// | cut -f1 -d",")
-MODEL="$MODELBCUT "$MODELACUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F[,:] '/^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=1199 ProdID=9071' '{print $2}' | cut -c-1100)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119990d3 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119990d3
deleted file mode 100644
index b98ee6a88..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/119990d3
+++ /dev/null
@@ -1,147 +0,0 @@
-# Sierra Wireless EM9190
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}')
-[ -n "$T" ] && TEMP="$T °C"
-
-
-T=$(echo "$O" | awk '/^System mode:/ {print $3}')
-case $T in
- "LTE")
- MODE="LTE"
- ;;
- "ENDC")
- MODE="5G NSA"
- ;;
-esac
-
-T=$(echo "$O" | awk '/.*TAC:/ {print $6}')
-if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-fi
-
-T=$(echo "$O" | awk '/^PCC.*RSSI/ {print $4}' | xargs)
-[ -n "$T" ] && && RSSI="${T// //}"
-T=$(echo "$O" | awk '/^PCC.*RSRP/ {print $8}' | xargs)
-[ -n "$T" ] && RSRP="${T// //}"
-T=$(echo "$O" | awk '/^RSRQ/ {print $3}')
-[ -n "$T" ] && RSRQ="$T"
-T=$(echo "$O" | awk '/^SINR/ {print $3}')
-[ -n "$T" ] && SINR="$T"
-
-T=$(echo "$O" | awk '/^LTE band:/ {print $3}')
-if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE band:/ {print $6}')
- PBAND="$(band4g ${T/B/}) @${T1} MHz"
- MODE="$MODE $(band4g ${T/B/})"
-fi
-T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $4}')
-# [ -n "$T" ] && addon 34 "EARFCN DL" "$T"
-T=$(echo "$O" | awk '/^LTE Rx chan:/ {print $8}')
-# [ -n "$T" ] && addon 34 "EARFCN UL" "$T"
-
-T=$(echo "$O" | awk -F: '/^LTE SCC1 state:.*ACTIVE/ {print $3}')
-if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE SCC1 bw/ {print $5}')
- if [ -n "$T1" ]; then
- S1BAND=$(band4g ${T/B/}) @${T1} MHz"
- else
- S1BAND="$(band4g ${T/B/})"
- fi
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE SCC1 Rx chan:/ {print $11}')
-# [ -n "$T" ] && addon 54 "(S1) EARFCN DL" "${T}"
- T=$(echo "$O" | awk '/.*LTE SCC1 Tx chan:/ {print $10}')
-# [ -n "$T" ] && addon 54 "(S1) EARFCN UL" "${T}"
-
- T=$(echo "$O" | awk '/^SCC1.*RSSI/ {print $4}' | xargs)
-# [ -n "$T" ] && addon 55 "(S1) RSSI" "${T// //} dBm"
- T=$(echo "$O" | awk '/^SCC1.*RSRP/ {print $8}' | xargs)
-# [ -n "$T" ] && addon 56 "(S1) RSRP" "${T// //} dBm"
-fi
-
-T=$(echo "$O" | awk -F: '/^LTE SCC2 state:.*ACTIVE/ {print $3}')
-if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE SCC2 bw/ {print $5}')
- if [ -n "$T1" ]; then
- S2BAND="$(band4g ${T/B/}) @${T1} MHz"
- else
- S2BAND="$(band4g ${T/B/})"
- fi
- MODE="$MODE / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE SCC2 Rx chan:/ {print $11}')
-# [ -n "$T" ] && addon 64 "(S2) EARFCN DL" "${T}"
- T=$(echo "$O" | awk '/.*LTE SCC2 Tx chan:/ {print $10}')
-# [ -n "$T" ] && addon 64 "(S2) EARFCN UL" "${T}"
-
- T=$(echo "$O" | awk '/^SCC2.*RSSI/ {print $4}' | xargs)
-# [ -n "$T" ] && addon 65 "(S2) RSSI" "${T// //} dBm"
- T=$(echo "$O" | awk '/^SCC2.*RSRP/ {print $8}' | xargs)
-# [ -n "$T" ] && addon 66 "(S2) RSRP" "${T// //} dBm"
-fi
-
-T=$(echo "$O" | awk -F: '/^LTE SCC3 state:.*ACTIVE/ {print $3}')
-if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE SCC3 bw/ {print $5}')
- if [ -n "$T1" ]; then
- S3BAND"$(band4g ${T/B/}) @${T1} MHz"
- else
- S3BAND"$(band4g ${T/B/})"
- fi
- MODE="$MODE / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE SCC3 Rx chan:/ {print $11}')
-# [ -n "$T" ] && addon 74 "(S3) EARFCN DL" "${T}"
- T=$(echo "$O" | awk '/.*LTE SCC3 Tx chan:/ {print $10}')
-# [ -n "$T" ] && addon 74 "(S3) EARFCN UL" "${T}"
-
- T=$(echo "$O" | awk '/^SCC3.*RSSI/ {print $4}' | xargs)
-# [ -n "$T" ] && addon 75 "(S3) RSSI" "${T// //} dBm"
- T=$(echo "$O" | awk '/^SCC3.*RSRP/ {print $8}' | xargs)
-# [ -n "$T" ] && addon 76 "(S3) RSRP" "${T// //} dBm"
-fi
-
-T=$(echo "$O" | awk '/^SCC. NR5G band:/ {print $4}')
-if [ -n "$T" ] && [ "$T" != "---" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- T1=$(echo "$O" | awk '/^SCC.*SCC. NR5G bw:/ {print $8}')
- if [ -n "$T1" ]; then
-# addon 80 "5G band" "$(band5g ${T/n/}) @${T1} MHz"
- else
-# addon 80 "5G band" "$(band5g ${T/n/})"
- fi
- T=$(echo "$O" | awk '/^SCC. NR5G Rx chan:/ {print $5}')
-# [ -n "$T" ] && addon 84 "EARFCN DL" "$T"
- T=$(echo "$O" | awk '/^SCC.*SCC. NR5G Tx chan:/ {print $10}')
-# [ -n "$T" ] && addon 84 "EARFCN UL" "$T"
- T=$(echo "$O" | awk '/^NR5G RSRP/ {print $4}')
-# [ -n "$T" ] && addon 86 "RSRP" "$T dBm"
- T=$(echo "$O" | awk '/^NR5G.*RSRQ/ {print $8}')
-# [ -n "$T" ] && addon 87 "RSRQ" "$T dB"
- T=$(echo "$O" | awk '/^NR5G SINR/ {print $4}')
-# [ -n "$T" ] && addon 88 "RSRP" "$T dBm"
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-# Modem
-
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=1199 ProdID=90d3' '{print $2}' | cut -c-1100)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d11506 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d11506
deleted file mode 100644
index 21c75dcf2..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d11506
+++ /dev/null
@@ -1,122 +0,0 @@
-# Huawei E3272/E3372/E3276
-
-O=$(sms_tool -d $DEVICE at "at^chiptemp?;^hcsq?;^iccid?")
-
-T=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$T"
-
- case "$MODE" in
- WCDMA*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSCP":"'$RSCP' dBm"}'
- ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"ECIO":"'$ECIO' dB"}'
- ;;
- LTE*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}' | xargs)
- RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$RSRP' dBm"}'
- SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$SINR' dB"}'
- RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$RSRQ' dB"}'
- ;;
- esac
-fi
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-MODELB=$(echo $DEV2 | awk -F 'Manufacturer:|Revision:' '{print $2}'| xargs)
-MODELC=$(echo $MODELB | sed 's/Model://' | xargs)
-MODEL=$(echo $MODELC | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')
-FW=$(echo $DEV2 | awk -F 'Revision:|IMEI' '{print $2}'| xargs)
-
-# Protocol
-# Driver=qmi_wwan & Driver=cdc_mbim & Driver=cdc_ether & Driver=huawei_cdc_ncm
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=12d1 ProdID=1506' '{print $2}' | cut -c-1104)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-elif echo "$PVCUT" | grep -q "cdc_ncm"
-then
- PROTO="ncm"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OI=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$OI" | sed 's/AT+GSN//g' | xargs)
-if [ -n "NR_I" ]
-then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OC=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$OC" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-NR_D=$(echo "$O" | awk -F [:] '/^\^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-XFR=$(sms_tool -d $DEVICE at "at^hfreqinfo?")
-XFRCOUNT=$(echo -n "$XFR" | wc -c)
-
-if [ -n "$XFR" ] && [ "$XFRCOUNT" -gt "15" ]; then
-
-# DL / UL / Band
-TBX=$(echo "$XFR" | awk -F [:] '/^\^HFREQINFO:/{print $2}' | xargs)
-TB=$(echo "$TBX" | cut -d ',' -f3-3 )
-
-TDL=$(echo "$TBX" | cut -d ',' -f6-6 )
-DL=$(($TDL/1000))
-
-TUL=$(echo "$TBX" | cut -d ',' -f9-9 )
-UL=$(($TUL/1000))
-
-ULBW="UL: @$UL MHz"
-DLBW="DL: @$DL MHz"
-
-PBAND="$(band4g $TB "") $DLBW $ULBW"
-EARFCN=$(echo "$TBX" | cut -d ',' -f4-4 )
-PCI="-"
-
-if [[ "$MODE" == *"LTE"* ]] && [ -n "$TB" ]; then
-MODE="LTE | "$(band4g $TB "")
-fi
-
-fi
-
-# LAC & TAC
-T_HEX=$LAC_HEX
-T_DEC=$LAC_DEC
-
-# Temperature
-T=$(echo "$O" | awk -F[,:] '/^\^CHIPTEMP/ {gsub(/[ \r]/,"");t=0;for(i=2;i<=NF;i++)if($i!=65535){if($i>100){$i=$i/10};if($i>t){t=$i}};printf "%.1f", t}')
-if [ "x$T" != "x0.0" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- TEMP="$T °C"
- #ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1155e b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1155e
deleted file mode 100644
index 37aea532f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1155e
+++ /dev/null
@@ -1,127 +0,0 @@
-# Huawei E3272/E3372/E3276
-
-O=$(sms_tool -d $DEVICE at "at^chiptemp?;^hcsq?;^iccid?")
-
-T=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$T"
-
- case "$MODE" in
- WCDMA*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSCP":"'$RSCP' dBm"}'
- ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"ECIO":"'$ECIO' dB"}'
- ;;
- LTE*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}' | xargs)
- RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$RSRP' dBm"}'
- SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$SINR' dB"}'
- RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$RSRQ' dB"}'
- ;;
- esac
-fi
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-MODELB=$(echo $DEV2 | awk -F 'Manufacturer:|Revision:' '{print $2}'| xargs)
-MODELC=$(echo $MODELB | sed 's/Model://' | xargs)
-MODEL=$(echo $MODELC | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')
-FW=$(echo $DEV2 | awk -F 'Revision:|IMEI' '{print $2}'| xargs)
-
-# Protocol
-# Driver=qmi_wwan & Driver=cdc_mbim & Driver=cdc_ether & Driver=huawei_cdc_ncm
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=12d1 ProdID=155e' '{print $2}' | cut -c-1104)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-elif echo "$PVCUT" | grep -q "cdc_ncm"
-then
- PROTO="ncm"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OI=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$OI" | sed 's/AT+GSN//g' | xargs)
-if [ -n "NR_I" ]
-then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OC=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$OC" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-NR_D=$(echo "$O" | awk -F [:] '/^\^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-if [[ "$MODE" == *"LTE"* ]]; then
-
-XFR=$(sms_tool -d $DEVICE at "at^hfreqinfo?")
-XFRCOUNT=$(echo -n "$XFR" | wc -c)
-
-if [ -n "$XFR" ]; then
- if [ -n "$XFRCOUNT" ]; then
- if [ "$XFRCOUNT" -gt "15" ]; then
-
- # DL / UL / Band
- TBX=$(echo "$XFR" | awk -F [:] '/^\^HFREQINFO:/{print $2}' | xargs)
- TB=$(echo "$TBX" | cut -d ',' -f3-3 )
-
- TDL=$(echo "$TBX" | cut -d ',' -f6-6 )
- DL=$(($TDL/1000))
-
- TUL=$(echo "$TBX" | cut -d ',' -f9-9 )
- UL=$(($TUL/1000))
-
- ULBW="UL: @$UL MHz"
- DLBW="DL: @$DL MHz"
-
- PBAND="$(band4g $TB "") $DLBW $ULBW"
- EARFCN=$(echo "$TBX" | cut -d ',' -f4-4 )
- PCI="-"
- fi
- fi
-fi
-
-MODE="LTE | "$(band4g $TB "")
-fi
-
-
-# LAC & TAC
-T_HEX=$LAC_HEX
-T_DEC=$LAC_DEC
-
-# Temperature
-T=$(echo "$O" | awk -F[,:] '/^\^CHIPTEMP/ {gsub(/[ \r]/,"");t=0;for(i=2;i<=NF;i++)if($i!=65535){if($i>100){$i=$i/10};if($i>t){t=$i}};printf "%.1f", t}')
-if [ "x$T" != "x0.0" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- TEMP="$T °C"
- #ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1156c b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1156c
deleted file mode 100644
index e85928e86..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/12d1156c
+++ /dev/null
@@ -1,113 +0,0 @@
-# Huawei E3272/E3372/E3276
-
-O=$(sms_tool -d $DEVICE at "at^chiptemp?;^hcsq?")
-
-T=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$T"
-
- case "$MODE" in
- WCDMA*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSCP":"'$RSCP' dBm"}'
- ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"ECIO":"'$ECIO' dB"}'
- ;;
- LTE*)
- PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}' | xargs)
- PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}' | xargs)
- PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}' | xargs)
- RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$RSRP' dBm"}'
- SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$SINR' dB"}'
- RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$RSRQ' dB"}'
- ;;
- esac
-fi
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-MODELB=$(echo $DEV2 | awk -F 'Manufacturer:|Revision:' '{print $2}'| xargs)
-MODELC=$(echo $MODELB | sed 's/Model://' | xargs)
-MODEL=$(echo $MODELC | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')
-FW=$(echo $DEV2 | awk -F 'Revision:|IMEI' '{print $2}'| xargs)
-
-# Protocol
-# Driver=qmi_wwan & Driver=cdc_mbim & Driver=cdc_ether & Driver=huawei_cdc_ncm
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=12d1 ProdID=1506' '{print $2}' | cut -c-1104)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-elif echo "$PVCUT" | grep -q "cdc_ncm"
-then
- PROTO="ncm"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed 's/AT+GSN//g' | xargs)
-if [ -n "NR_I" ]
-then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT^ICCID?")
-NR_D=$(echo "$O" | awk -F [:] '/^\^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# DL / UL / Band
-OTB=$(sms_tool -d $DEVICE at "AT^HFREQINFO?")
-TBX=$(echo "$OTB" | awk -F [:] '/^\^HFREQINFO:/{print $2}' | xargs)
-TB=$(echo "$TBX" | cut -d ',' -f3-3 )
-
-TDL=$(echo "$TBX" | cut -d ',' -f6-6 )
-DL=$(($TDL/1000))
-
-TUL=$(echo "$TBX" | cut -d ',' -f9-9 )
-UL=$(($TUL/1000))
-
-ULBW="UL: @$UL MHz"
-DLBW="DL: @$DL MHz"
-
-PBAND="$(band4g $TB "") $DLBW $ULBW"
-EARFCN=$(echo "$TBX" | cut -d ',' -f4-4 )
-PCI="-"
-
-# LAC & TAC
-T_HEX=$LAC_HEX
-T_DEC=$LAC_DEC
-
-# Temperature
-T=$(echo "$O" | awk -F[,:] '/^\^CHIPTEMP/ {gsub(/[ \r]/,"");t=0;for(i=2;i<=NF;i++)if($i!=65535){if($i>100){$i=$i/10};if($i>t){t=$i}};printf "%.1f", t}')
-if [ "x$T" != "x0.0" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- TEMP="$T °C"
- #ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/15081001 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/15081001
deleted file mode 100644
index 6316ec7e9..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/15081001
+++ /dev/null
@@ -1,50 +0,0 @@
-# Fibocom NL668-CN
-
-# Modem
-OA=$(sms_tool -d $DEVICE at "AT+CGMM?")
-MODELA=$(echo "$OA" | awk -F [:,] '/\+CGMM/{print $2}' | xargs)
-OB=$(sms_tool -d $DEVICE at "AT+CGMI?")
-MODELB=$(echo "$OB" | awk -F [:,] '/\+CGMI/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | sed s/"Wireless Inc."//)
-MODEL="$MODELBCUT $MODELA"
-
-OF=$(sms_tool -d $DEVICE at "AT+GMR?")
-FW=$(echo "$OF" | awk -F[,:] '/\+GMR:/ {print $2}' | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-OAA=$(sms_tool -d $DEVICE at "AT+CGSN?")
-NR_IMEI=$(echo "$OAA" | awk -F[,:] '/\+CGSN:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-OBB=$(sms_tool -d $DEVICE at "AT+CIMI?")
-NR_IMSI=$(echo "$OBB" | awk -F [,:] '/\+CIMI:/ {print $2}' | xargs)
-
-# Integrated Circuit Card Identifier (ICCID)
-OCC=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$OCC" | awk -F [,:] '/\+ICCID:/ {print $2}' | xargs)
-
-# Temp
-OT=$(sms_tool -d $DEVICE at "AT+MTSM=1")
-TM=$(echo "$OT" | awk '/\+MTSM:/{print $2}')
-if [ -n "$TM" ]; then
- TEMP="$TM °C"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-TTY=$(basename $DEVICE)
-devpath=$(readlink -f /sys/class/tty/$TTY/device)
-BASE=$(readlink -f ${devpath%/*/*})
-
-NETIF=$(for a in /sys/class/net/*; do readlink -f $a; done | grep "$BASE")
-NETDRV=$(basename $(readlink -f $NETIF/../../driver))
-
-case $NETDRV in
- "qmi_wwan")
- PROTO="QMI";;
- "cdc_mbim")
- PROTO="MBIM";;
- "cdc_ether")
- PROTO="ECM";;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/16907588 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/16907588
deleted file mode 100644
index d93d7ddc0..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/16907588
+++ /dev/null
@@ -1,148 +0,0 @@
-# ASKEY WWHC050
-
-O=$(sms_tool -d $DEVICE at "at\$qcai?;+ccputemp;+cgcelli;+cgnws")
-T=$(echo "$O" | awk 'BEGIN{FS="BEARER:"}/^\+CGCELLI/{print $2}' | awk 'BEGIN{FS=","}{print $1}')
-
-case "$T" in
-"0x01"*)
- MODE="GPRS";;
-"0x02"*)
- MODE="EDGE";;
-"0x03"*)
- MODE="HSDPA";;
-"0x04"*)
- MODE="HSUPA";;
-"0x05"*)
- MODE="WCDMA";;
-"0x06"*)
- MODE="CDMA";;
-"0x07"*)
- MODE="EV-DO REV 0";;
-"0x08"*)
- MODE="EV-DO REV A";;
-"0x09"*)
- MODE="GSM";;
-"0x0a"*|"0x0A"*)
- MODE="EV-DO REV B";;
-"0x0b"*|"0x0B"*)
- MODE="LTE";;
-"0x0c"*|"0x0C"*)
- MODE="HSDPA+";;
-"0x0d"*|"0x0D"*)
- MODE="DC-HSDPA+";;
-esac
-
-if [ $MODE != "LTE" ]; then
- O1=$(echo "$O" | grep CGCELLI | sed 's/+CGCELLI://')
- T1="$O1"
- while true; do
- T2=${T1%%,*}
- [ -z "$T2" ] && break
- if echo "$T2" | grep -q ":"; then
- F1=${T2%%:*}
- F2=${T2##*:}
- UNIT=""
- IGNORE=0
- case "$F1" in
- RSCP|RSRP|RSSI) UNIT=" dBm";;
- ECIO|SINR|RSRQ) UNIT=" dB";;
- LAC|PLMN|BEARER) IGNORE=1;;
- esac
- if [ $IGNORE -eq 0 ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"'$F1'":"'$F2''$UNIT'"}'
- fi
- fi
- if echo "$T1" | grep -q ","; then
- T2="${T2},"
- fi
- T1=$(echo "$T1" | sed 's/^'$T2'//')
- done
-fi
-
-T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $7}')
-if [ -n "$T" ]; then
- case $T in
- *"Band:1") MODE=$(band4g 1 "LTE ");;
- *"Band:3") MODE=$(band4g 3 "LTE ");;
- *"Band:7") MODE=$(band4g 7 "LTE ");;
- *"Band:8") MODE=$(band4g 8 "LTE ");;
- *"Band:20") MODE=$(band4g 20 "LTE ");;
- *) MODE="LTE ${T}";;
- esac
-fi
-
-T=$(echo "$O" | awk -F[,] '/CA:ADDED/{print $16}')
-if [ -n "$T" ]; then
- case $T in
- *"(S)Band:1") MODE="${MODE/LTE/LTE_A} / "$(band4g 1 "");;
- *"(S)Band:3") MODE="${MODE/LTE/LTE_A} / "$(band4g 3 "");;
- *"(S)Band:7") MODE="${MODE/LTE/LTE_A} / "$(band4g 7 "");;
- *"(S)Band:8") MODE="${MODE/LTE/LTE_A} / "$(band4g 8 "");;
- *"(S)Band:20") MODE="${MODE/LTE/LTE_A} / "$(band4g 20 "");;
- *) MODE="${MODE/LTE/LTE_A} / B${T}";;
- esac
-fi
-
-T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $3}')
-if [ -n "$T" ]; then
- RSRP=${T##*:}
- T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $12}')
- if [ -n "$T" ]; then
- RSRP="$RSRP / "${T##*:}" dBm"
- fi
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"RSRP":"'$RSRP'"}'
-fi
-T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $4}')
-if [ -n "$T" ]; then
- RSRQ=${T##*:}
- T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $13}')
- if [ -n "$T" ]; then
- RSRQ="$RSRQ / "${T##*:}" dB"
- fi
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"RSRQ":"'$RSRQ'"}'
-fi
-T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $5}')
-if [ -n "$T" ]; then
- RSSI=${T##*:}
- T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $14}')
- if [ -n "$T" ]; then
- RSSI="$RSSI / "${T##*:}" dBm"
- fi
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"RSSI":"'$RSSI'"}'
-fi
-#T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $6}')
-#if [ -n "$T" ]; then
-# SINR=${T##*:}
-# T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $15}')
-# if [ -n "$T" ]; then
-# SINR="$SINR / "${T##*:}" dB"
-# fi
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$SINR'"}'
-#fi
-#T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $8}')
-#if [ -n "$T" ]; then
-# BW=${T##*:}" MHz"
-# T=$(echo "$O" | awk -F[,] '/^\$QCAI/{print $17}')
-# if [ -n "$T" ]; then
-# BW="$BW / "${T##*:}" MHz"
-# fi
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"BW":"'$BW'"}'
-#fi
-
-T=$(echo "$O" | awk -F[:] '/^\+CCPUTEMP/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"Temperatura":"'$T' °C"}'
-fi
-
-T=$(echo "$O" | awk -F[,] '/^\+CGNWS/ {print $9}' | xargs)
-if [ -n "$T" ]; then
- COPS="$T"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20167 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20167
deleted file mode 100644
index 5ca063243..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20167
+++ /dev/null
@@ -1,19 +0,0 @@
-# ZTE MF821
-
-O=$(sms_tool -d $DEVICE at "at+zcellinfo?")
-BAND=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO:/ {print $4}')
-case "$MODE_NUM" in
- 7*)
- case "$BAND" in
- *"B1") MODE=$(band4g 1 "LTE ");;
- *"B3") MODE=$(band4g 3 "LTE ");;
- *"B7") MODE=$(band4g 7 "LTE ");;
- *"B8") MODE=$(band4g 8 "LTE ");;
- *"B20") MODE=$(band4g 20 "LTE ");;
- *) MODE="$MODE B${BAND}";;
- esac
- ;;
- *)
- MODE="$MODE $BAND"
- ;;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20189 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20189
deleted file mode 100644
index 540dbeeaf..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d20189
+++ /dev/null
@@ -1,62 +0,0 @@
-# ZTE MF28D/MF290
-
-O=$(sms_tool -d $DEVICE at "at+zrssi?;+zcellinfo?")
-
-case "$MODE_NUM" in
- 3*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- RSSI="$T"
- ADDON="$ADDON"'{"RSSI":"'$T' dBm"}'
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- ;;
- 2*|\
- 4*|\
- 5*|\
- 6*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"RSCP":"'$T' dBm"}'
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"ECIO":"'$T' dB"}'
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- ;;
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- RSRP="$T"
- ADDON="$ADDON"'{"RSRP":"'$T' dBm"}'
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- RSRQ="$T"
- ADDON="$ADDON"'{"RSRQ":"'$T' dB"}'
-# T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $5}' | xargs)
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
- SINR="$T"
-# ADDON="$ADDON"'{"SINR":"'$T' dB"}'
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCELLINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- PCI="$T"
- ADDON="$ADDON"'{"PCI":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $5}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- EARFCN="$T"
- ADDON="$ADDON"'{"EARFCN":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- case "$T" in
- *"LTE B1") MODE=$(band4g 1 "LTE ");;
- *"LTE B3") MODE=$(band4g 3 "LTE ");;
- *"LTE B7") MODE=$(band4g 7 "LTE ");;
- *"LTE B8") MODE=$(band4g 8 "LTE ");;
- *"LTE B20") MODE=$(band4g 20 "LTE ");;
- *) MODE="${T}";;
- esac
- ;;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21275 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21275
deleted file mode 100644
index 2de86cf02..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21275
+++ /dev/null
@@ -1,58 +0,0 @@
-# ZTE P685M
-# ZTE ZM8630A
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+zrssi;+zcellinfo?;+zcainfo?")
-
-case "$MODE_NUM" in
- 3*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSSI="$T"
- ;;
- 2*|\
- 4*|\
- 5*|\
- 6*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
-# addon 35 "RSCP" "$T dBm"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
-# addon 36 "ECIO" "$T dB"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- ;;
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $4}' | xargs)
- if [ -n "$T" ]; then
- T_HEX=$(printf "%X" $T)
- T_DEC=$(printf "%d" "0x${T_HEX}")
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $5}' | xargs)
- [ -n "$T" ] && SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="LTE | $(band4g ${T/LTE B/})"
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $6}' | xargs)
- if [ -z "$T1" ] || [ "x$T1" = "x0.0" ]; then
- PBAND="$(band4g $T)"
- else
- PBAND="$(band4g $T) @${T1} MHz"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $2}' | xargs)
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $5}' | xargs)
- [ -n "$T" ] && EARFCN="$T"
- fi
- ;;
-esac
-
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21432 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21432
deleted file mode 100644
index c27f8532f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21432
+++ /dev/null
@@ -1,134 +0,0 @@
-# ZTE MF286
-# ZTE MF286A
-
-
-O=$(sms_tool -d $DEVICE at "at+zrssi;+zcellinfo?;+zcainfo?")
-
-case "$MODE_NUM" in
- 3*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSSI="$T"
- ;;
- 2*|\
- 4*|\
- 5*|\
- 6*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- ;;
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $4}' | xargs)
- if [ -n "$T" ]; then
- T_HEX=$(printf "%X" $T)
- T_DEC=$T
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $4}' | xargs)
- RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $5}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="LTE $(band4g ${T/LTE B/})"
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $6}' | xargs)
- PBAND="$(band4g $T "") @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $2}' | xargs)
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $5}' | xargs)
- [ -n "$T" ] && EARFCN="$T"
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $9}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $11}' | xargs)
- S1BAND="$(band4g $T "") @$T1 MHz"
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T})"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $7}' | xargs)
- [ -n "$T" ] && S1PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO/ {print $10}' | xargs)
- [ -n "$T" ] && S1EARFCN="$T"
- fi
- ;;
-esac
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | cut -c 8-)
-
-MODELA=$(echo $DEVV | awk -F 'Revision: ' '{print $1}'| xargs)
-MODELB=$(echo $MODELA | awk -F 'Manufacturer: |CORPORATION' '{print $2}'| xargs)
-
-MODELD=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELDCUT=$(echo $MODELD | cut -c 9-)
-
-MODEL="$MODELB "$MODELDCUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PV85=$(echo $PV | awk -F 'Vendor=19d2 ProdID=1485' '{print $2}' | cut -c-1220)
-if [ -n "$PV85" ]; then
- if echo "$PV85" | grep -q "Driver=qmi_wwan"
- then
- PROTO="qmi"
- elif echo "$PV85" | grep -q "Driver=cdc_mbim"
- then
- PROTO="mbim"
- elif echo "$PV85" | grep -q "Driver=cdc_ether"
- then
- PROTO="ecm"
- fi
-fi
-PV32=$(echo $PV | awk -F 'Vendor=19d2 ProdID=1432' '{print $2}' | cut -c-1220)
-if [ -n "$PV32" ]; then
- if echo "$PV32" | grep -q "Driver=qmi_wwan"
- then
- PROTO="qmi"
- elif echo "$PV32" | grep -q "Driver=cdc_mbim"
- then
- PROTO="mbim"
- elif echo "$PV32" | grep -q "Driver=cdc_ether"
- then
- PROTO="ecm"
- fi
-fi
-
-#T=$(echo "$O" | awk -F[,:] '/^\+ZDON/ {print $2}' | xargs)
-#if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
-# COPS="$T"
-#fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21485 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21485
deleted file mode 100644
index 329e10489..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21485
+++ /dev/null
@@ -1,202 +0,0 @@
-# ZTE MF286D
-# ZTE MF289F
-
-O=$(sms_tool -d $DEVICE at "at+zrssi;+zcellinfo?;+zcainfo?")
-
-case "$MODE_NUM" in
- 3*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSSI="$T"
- if [ "x${LAC_DEC}" = "x0" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- LAC_DEC=$T
- LAC_HEX=$(printf "%X" $T)
- fi
- fi
- if [ "x${CID_DEC}" = "x0" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- CID_DEC=$T
- CID_HEX=$(printf "%X" $T)
- fi
- fi
- ;;
- 2*|\
- 4*|\
- 5*|\
- 6*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- if [ "x${LAC_DEC}" = "x0" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- LAC_DEC=$T
- LAC_HEX=$(printf "%X" $T)
- fi
- fi
- if [ "x${CID_DEC}" = "x0" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- CID_DEC=$T
- CID_HEX=$(printf "%X" $T)
- fi
- fi
- ;;
- 7*)
- if [ "x${CID_DEC}" = "x0" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- CID_DEC=$T
- CID_HEX=$(printf "%X" $T)
- fi
- fi
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $4}' | xargs)
- if [ -n "$T" ]; then
- T_HEX=$(printf "%X" $T)
- T_DEC=$T
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $4}' | xargs)
- RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $5}' | xargs)
- SINR="$T"
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="LTE $(band4g ${T/LTE B/})"
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $6}' | xargs)
- PBAND="$(band4g $T "") @$T1 MHz"
- [ "x$MODE" = "xLTE BUnknown" ] && MODE="LTE $(band4g $T)"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $2}' | xargs)
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $5}' | xargs)
- [ -n "$T" ] && EARFCN="$T"
- fi
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $9}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $11}' | xargs)
- S1BAND="$(band4g $T "") @$T1 MHz"
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T})"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $7}' | xargs)
- [ -n "$T" ] && S1PCI="$T"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $10}' | xargs)
- [ -n "$T" ] && S1EARFCN="$T"
- fi
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $14}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $16}' | xargs)
- S2BAND="$(band4g $T "") @$T1 MHz"
- MODE="$MODE / $(band4g ${T})"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $12}' | xargs)
- [ -n "$T" ] && S2PCI="$T"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $15}' | xargs)
- [ -n "$T" ] && S2EARFCN="$T"
- fi
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $19}' | xargs)
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $21}' | xargs)
- S3BAND="$(band4g $T "") @$T1 MHz"
- MODE="$MODE / $(band4g ${T})"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $17}' | xargs)
- [ -n "$T" ] && S3PCI="$T"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $20}' | xargs)
- [ -n "$T" ] && S3EARFCN="$T"
- fi
-
- ;;
-esac
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Firmware
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | cut -c 8-)
-
-# Model
-MODELA=$(echo $DEVV | awk -F 'Revision: ' '{print $1}'| xargs)
-MODELB=$(echo $MODELA | awk -F 'Manufacturer: |CORPORATION' '{print $2}'| xargs)
-
-MODELD=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-
-SUB='MODULE'
-if [[ "$MODELD" == *"$SUB"* ]]; then
-MODELDCUT=$(echo $MODELD | awk -F 'CGMM |MODULE' '{print $2}'| xargs)
-MODEL="$MODELB "$MODELDCUT
-else
-MODELDCUT=$(echo $MODELD | cut -c 9-)
-MODEL="$MODELB "$MODELDCUT
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PV85=$(echo $PV | awk -F 'Vendor=19d2 ProdID=1485' '{print $2}' | cut -c-1220)
-if [ -n "$PV85" ]; then
- if echo "$PV85" | grep -q "Driver=qmi_wwan"
- then
- PROTO="qmi"
- elif echo "$PV85" | grep -q "Driver=cdc_mbim"
- then
- PROTO="mbim"
- elif echo "$PV85" | grep -q "Driver=cdc_ether"
- then
- PROTO="ecm"
- fi
-fi
-PV32=$(echo $PV | awk -F 'Vendor=19d2 ProdID=1432' '{print $2}' | cut -c-1220)
-if [ -n "$PV32" ]; then
- if echo "$PV32" | grep -q "Driver=qmi_wwan"
- then
- PROTO="qmi"
- elif echo "$PV32" | grep -q "Driver=cdc_mbim"
- then
- PROTO="mbim"
- elif echo "$PV32" | grep -q "Driver=cdc_ether"
- then
- PROTO="ecm"
- fi
-fi
-
-#T=$(echo "$O" | awk -F[,:] '/^\+ZDON/ {print $2}' | xargs)
-#if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
-# COPS="$T"
-#fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21489 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21489
deleted file mode 100644
index 00fe26518..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/19d21489
+++ /dev/null
@@ -1,139 +0,0 @@
-# ZTE MF286R
-
-O=$(sms_tool -d $DEVICE at "at+zrssi;+zcellinfo?;+zcainfo?")
-
-case "$MODE_NUM" in
- 3*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSSI="$T"
- ;;
- 2*|\
- 4*|\
- 5*|\
- 6*|\
- 8*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- [ -n "$T" ] && MODE="$T"
- ;;
-
- 7*|\
- 9*)
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $4}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- T_HEX=$(printf "%X" $T)
- T_DEC=$T
- LAC_DEC=$T_DEC
- LAC_HEX=$T_HEX
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $4}' | xargs)
- RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $2}' | xargs)
- RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $3}' | xargs)
- RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZRSSI/ {print $5}' | xargs)
- SINR="$T"
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="LTE $(band4g ${T/LTE B/})"
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $3}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $6}' | xargs)
- PBAND="$(band4g $T "") @$T1 MHz"
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $2}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PCI="$T"
- fi
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $5}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- EARFCN="$T"
- fi
- fi
-
- if [ "x$MODE_NUM" = "x9" ]; then
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $9}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- T1=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $11}' | xargs)
- S1BAND="$(band4g $T "") @$T1 MHz"
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T})"
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $7}' | xargs)
- [ -n "$T" ] && S1PCI="$T"
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO/ {print $10}' | xargs)
- [ -n "$T" ] && S1EARFCN="$T"
- fi
- fi
- ;;
-esac
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-# Firmware
-FWB=$(sms_tool -d $DEVICE at "AT+GMR")
-FW=$(echo $FWB | tr -d " \t\n\r" | xargs)
-
-if [[ "$FW" == *"MF286RA"* && "$CSQ" == *"-"* ]]; then
-OQ=$(sms_tool -D -d $DEVICE at "AT+CSQ")
-CSQ=$(echo "$OQ" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
-
-[ "x$CSQ" = "x" ] && CSQ=-1
- if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
- CSQ_PER=$(($CSQ * 100/31))
- fi
-fi
-
-# Modem
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-
-if [[ "$MODELA" == *"ZTE"* ]]; then
-MODELACUT=$(echo $MODELA | awk -F'CGMI: ' '{print $2}' | sed 's/"//g' | sed 's/ CORPORATION//g')
-MODELO=$(echo $MODELACUT | tr -d " \t\n\r" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMM")
-MODELBCUT=$(echo $MODELB | awk -F'CGMM: ' '{print $2}' | sed 's/"//g')
-MODELCUT=$(echo $MODELBCUT | tr -d " \t\n\r" | xargs)
-
-MODEL="$MODELO "$MODELCUT
-else
-MODELO=$(echo $MODELA | tr -d " \t\n\r" | cut -d ":" -f2 | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMM")
-MODELCUT=$(echo $MODELB | tr -d " \t\n\r" | cut -d ":" -f2 | xargs)
-
-MODEL="$MODELO "$MODELCUT
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OI=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$OI" | sed 's/AT+GSN//g' | xargs)
-if [ -z "NR_I" ]; then
- OIB=$(sms_tool -d $DEVICE at "AT*MRD_IMEI?" | xargs)
- NR_I=$(echo "$OIB" | awk -F [:] '/^\*MRD_IMEI:/{print $2}' | xargs)
- NR_IMEI="$NR_I"
-else
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OS=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$OS" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-OD=$(sms_tool -d $DEVICE at "AT*ICCID?" | xargs)
-NR_D=$(echo "$OD" | awk -F [:] '/^\*ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=19d2 ProdID=1489' '{print $2}' | cut -c-1450)
-if echo "$PVCUT" | grep -q "rndis_host"
-then
- PROTO="ncm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71040 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71040
deleted file mode 100644
index d8b7ecbad..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71040
+++ /dev/null
@@ -1,162 +0,0 @@
-# Telit LN940-CP
-
-O=$(sms_tool -d $DEVICE at "at#servinfo;#cainfo?")
-
-channeltoband()
-{
- if [ $1 -ge 0 ] && [ $1 -le 599 ]; then
- echo "1"
- elif [ $1 -ge 1200 ] && [ $1 -le 1949 ]; then
- echo "3"
- elif [ $1 -ge 2750 ] && [ $1 -le 3449 ]; then
- echo "7"
- elif [ $1 -ge 3450 ] && [ $1 -le 3799 ]; then
- echo "8"
- elif [ $1 -ge 6150 ] && [ $1 -le 6449 ]; then
- echo "20"
- else
- echo "?"
- fi
-}
-
-case "$MODE_NUM" in
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $4}' | xargs)
- [ -n "$COPS" ] && COPS="$T"
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $7}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T_DEC=$(printf "%d" "0x$T")
-# ADDON="$ADDON"'{"TAC":"'$T_DEC' ('$T')"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- RSSI=$T
- [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSSI":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $10}' | xargs)
- if [ -n "$T" ]; then
- RSRP=$T
- [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- EARFCN=$T
- [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"EARFCN":"'$T'"}'
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T1=$(channeltoband $T)
- PBAND="$(band4g $T1 "")"
- ADDON="$ADDON"'{"Primary band":"'$(band4g $T1 "")'"}'
- MODE=$(band4g $T1 "LTE ")
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $5}' | xargs)
- if [ -n "$T" ]; then
- PCI=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"PCI":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $7}' | xargs)
- if [ -n "$T" ]; then
- RSSI=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSSI":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $6}' | xargs)
- if [ -n "$T" ]; then
- RSRP=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRP":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $8}' | xargs)
- if [ -n "$T" ]; then
- RSRQ=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"RSRQ":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $9}' | xargs)
- if [ -n "$T" ]; then
- SINR=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"SINR":"'$T'"}'
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $15}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T1=$(channeltoband $T)
- S1BAND=="$(band4g $T1 "")"
-# ADDON="$ADDON"'{"(S1) band":"'$(band4g $T1 "")'"}'
-# MODE="${MODE/LTE/LTE_A} / "$(band4g $T1 "")
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $17}' | xargs)
- if [ -n "$T" ]; then
- S1PCI=$T
-# [ -n "$ADDON" ] && ADDON="$ADDON,"
-# ADDON="$ADDON"'{"(S1) PCI":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $19}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S1) RSSI":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $18}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S1) RSRP":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $20}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S1) RSRQ":"'$T' dB"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $21}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S1) SINR":"'$T' dB"}'
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $26}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T1=$(channeltoband $T)
- S2BAND=="$(band4g $T1 "")"
- ADDON="$ADDON"'{"(S2) band":"'$(band4g $T1 "")'"}'
- MODE="${MODE} / "$(band4g $T1 "")
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $28}' | xargs)
- if [ -n "$T" ]; then
- S2PCI="$T"
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S2) PCI":"'$T'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $30}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S2) RSSI":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $29}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S2) RSRP":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $31}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S2) RSRQ":"'$T' dB"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#CAINFO/ {print $32}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- ADDON="$ADDON"'{"(S2) SINR":"'$T' dB"}'
- fi
- ;;
-esac
-
-MODE=$(echo $MODE | sed 's,/,+,')
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71201 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71201
deleted file mode 100644
index a444dadef..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71201
+++ /dev/null
@@ -1,42 +0,0 @@
-# Telit LE910-EUG
-
-O=$(sms_tool -d $DEVICE at "at#servinfo")
-
-case "$MODE_NUM" in
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $4}' | xargs)
- [ -n "$COPS" ] && COPS="$T"
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $7}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
- TAC_DEC=$T_DEC
- ADDON="$ADDON"'{"TAC":"'$T_DEC' ('$T')"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- RSSI="$T"
- ADDON="$ADDON"'{"RSSI":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $10}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- RSRP="$T"
- ADDON="$ADDON"'{"RSRP":"'$T' dBm"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $6}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- PCI="$(printf "%d" "0x$T")"
- ADDON="$ADDON"'{"PCI":"'$(printf "%d" "0x$T")'"}'
- fi
- T=$(echo "$O" | awk -F[,:] '/^#SERVINFO/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- EARFCN="$T"
- ADDON="$ADDON"'{"EARFCN":"'$T'"}'
- fi
- ;;
-esac
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71900 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71900
deleted file mode 100644
index f4a53cda3..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71900
+++ /dev/null
@@ -1,128 +0,0 @@
-# Telit LN940 (QMI) / Telit LN940 (MBIM) / HP lt4220 (MBIM) / HP lt4220 (QMI)
-
-O=$(sms_tool -D -d $DEVICE at "AT^CA_INFO?;^RFSTS?;+TEMP")
-
-TR=$(echo "$O" |grep -A2 RFSTS: | awk 'NR ==2{print $0}')
-
-if [ "$MODE" = "LTE" ]; then
- RSRP=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$3}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSRQ=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$5}')
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$16*2-20}')
-else
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$6}')
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\PCC info: /{print $2}' | sed 's/Band is //g')
-[ -z "$T" ] && T=$(echo "$O" | awk -F[,] '/^\PCC info: /{print $2}')
-if [ -n "$T" ]; then
- PC=$(echo $T | tr -d 'LTE_B')
- MODE="LTE | $(band4g $PC)"
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC1 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC1=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE/LTE/LTE_A} / "$(band4g ${SC1} "")
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC2 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC2=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE} / "$(band4g ${SC2} "")
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE_A,LTE-A ,')
-
-# Primary band
-T1=$(echo "$O" | awk '/PCC/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T1" ]; then
- T2=$(echo "$O" | awk '/PCC/{print $8}' | sed -e 's/Band_width//g')
- PBAND="$(band4g ${T1/B/} "") @$T2 MHz"
- EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
- PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S1)
-T3=$(echo "$O" | awk '/SCC1/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T3" ]; then
- T4=$(echo "$O" | awk '/SCC1/{print $8}' | sed -e 's/Band_width//g')
- S1BAND="$(band4g ${T3/B/} "") @$T4 MHz"
-# S1EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S1PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S2)
-T5=$(echo "$O" | awk '/SCC2/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T5" ]; then
- T6=$(echo "$O" | awk '/SCC2/{print $8}' | sed -e 's/Band_width//g')
- S2BAND="$(band4g ${T5/B/} "") @$T6 MHz"
-# S2EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S2PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# Temperature
-T=$(echo "$O" | awk -F [:] '/tsens_tz_sensor0:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP=$(echo "$T °C")
-fi
-
-# Cell ID & LAC & TAC
-LAC_HEX=$(printf "%X" $LAC_DEC)
-if [ -n "$LAC_DEC" ]; then
- TAC_HEX=$LAC_HEX
-fi
-CID_HEX=$(printf "%X" $CID_DEC)
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1bc7 ProdID=1900' '{print $2}' | cut -c-1220)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
-# Model
-PVMODEL=$(echo $PV | awk -F 'Vendor=1bc7 ProdID=1900' '{print $2}' | cut -c-150)
-if [ -z "$MODEL" ]
-then
- MODELBCUT=$(echo $PVMODEL | awk -F 'Manufacturer=|S: Product=' '{print $2}'| xargs)
- MODELACUT=$(echo $PVMODEL | awk -F 'Product=|S: SerialNumber' '{print $2}'| xargs)
- MODELC="$MODELBCUT "$MODELACUT
- MODEL=$(echo "$MODELC" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}')
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | awk -F " " '/GSN /{print $2}')
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | awk -F " " '/CIMI /{print $2}')
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID" | xargs)
-NR_D=$(echo "$O" | awk -F [:] '/ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# FW
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEV2 | awk -F 'Revision: | IMEI: ' '{print $2}' | cut -c-50)v
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71901 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71901
deleted file mode 100644
index f82a6b987..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1bc71901
+++ /dev/null
@@ -1,128 +0,0 @@
-# Telit LN940 (QMI) / Telit LN940 (MBIM) / HP lt4220 (MBIM) / HP lt4220 (QMI)
-
-O=$(sms_tool -D -d $DEVICE at "AT^CA_INFO?;^RFSTS?;+TEMP")
-
-TR=$(echo "$O" |grep -A2 RFSTS: | awk 'NR ==2{print $0}')
-
-if [ "$MODE" = "LTE" ]; then
- RSRP=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$3}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSRQ=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$5}')
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$16*2-20}')
-else
- SINR=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$4}')
- RSSI=$(echo "$TR" | awk -F [,] '{printf "%.0f\n",$6}')
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\PCC info: /{print $2}' | sed 's/Band is //g')
-[ -z "$T" ] && T=$(echo "$O" | awk -F[,] '/^\PCC info: /{print $2}')
-if [ -n "$T" ]; then
- PC=$(echo $T | tr -d 'LTE_B')
- MODE="LTE | $(band4g $PC)"
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC1 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC1=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE/LTE/LTE_A} / "$(band4g ${SC1} "")
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\SCC2 info: /{print $2}' | sed 's/Band is //g')
- if [ -n "$T" ]; then
- SC2=$(echo $T | tr -d 'LTE_B')
- MODE="${MODE} / "$(band4g ${SC2} "")
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE_A,LTE-A ,')
-
-# Primary band
-T1=$(echo "$O" | awk '/PCC/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T1" ]; then
- T2=$(echo "$O" | awk '/PCC/{print $8}' | sed -e 's/Band_width//g')
- PBAND="$(band4g ${T1/B/} "") @$T2 MHz"
- EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
- PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S1)
-T3=$(echo "$O" | awk '/SCC1/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T3" ]; then
- T4=$(echo "$O" | awk '/SCC1/{print $8}' | sed -e 's/Band_width//g')
- S1BAND="$(band4g ${T3/B/} "") @$T4 MHz"
-# S1EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S1PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# CA band (S2)
-T5=$(echo "$O" | awk '/SCC2/{print $5}' | sed -e 's/LTE_//g' -e 's/.$//')
-if [ -n "$T5" ]; then
- T6=$(echo "$O" | awk '/SCC2/{print $8}' | sed -e 's/Band_width//g')
- S2BAND="$(band4g ${T5/B/} "") @$T6 MHz"
-# S2EARFCN=$(echo "$TR" |awk -F [,] '{print $2}')
-# S2PCI=$(echo "$TR" |awk -F [,] '{print $11}')
-fi
-
-# Temperature
-T=$(echo "$O" | awk -F [:] '/tsens_tz_sensor0:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP=$(echo "$T °C")
-fi
-
-# Cell ID & LAC & TAC
-LAC_HEX=$(printf "%X" $LAC_DEC)
-if [ -n "$LAC_DEC" ]; then
- TAC_HEX=$LAC_HEX
-fi
-CID_HEX=$(printf "%X" $CID_DEC)
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1bc7 ProdID=1901' '{print $2}' | cut -c-1220)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
-# Model
-PVMODEL=$(echo $PV | awk -F 'Vendor=1bc7 ProdID=1901' '{print $2}' | cut -c-150)
-if [ -z "$MODEL" ]
-then
- MODELBCUT=$(echo $PVMODEL | awk -F 'Manufacturer=|S: Product=' '{print $2}'| xargs)
- MODELACUT=$(echo $PVMODEL | awk -F 'Product=|S: SerialNumber' '{print $2}'| xargs)
- MODELC="$MODELBCUT "$MODELACUT
- MODEL=$(echo "$MODELC" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}')
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | awk -F " " '/GSN /{print $2}')
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | awk -F " " '/CIMI /{print $2}')
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID" | xargs)
-NR_D=$(echo "$O" | awk -F [:] '/ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# FW
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEV2 | awk -F 'Revision: | IMEI: ' '{print $2}' | cut -c-50)
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9000 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9000
deleted file mode 100644
index b2177bc5e..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9000
+++ /dev/null
@@ -1,100 +0,0 @@
-# SIMCOM SIM8200EA-M2
-# SIMCOM SIM7906
-
-OT=$(sms_tool -d $DEVICE at "AT+CPMUTEMP")
-
-T=$(echo "$OT" | awk -F[,:] '/^\+CPMUTEMP: / {print $2}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-O=$(sms_tool -d $DEVICE at "AT+CPSI?")
-
-case $MODE_NUM in
- 7)
- MODE="LTE |"
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $5}')
- if [ -n "$T" ]; then
- TAC_DEC=$(printf "%d" "$T")
- TAC_HEX="${T/0x/}"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $7}')
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $8}')
- if [ -n "$T" ]; then
- PBAND="$(band4g ${T/EUTRAN-BAND/})"
- MODE="$MODE $(band4g ${T/EUTRAN-BAND/})"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $9}')
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $10}')
- if [ -n "$T" ]; then
- DLBW="DL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $11}')
- if [ -n "$T" ]; then
- ULBW="UL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW $ULBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $12/10}')
- [ -n "$T" ] && RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $13/10}')
- [ -n "$T" ] && RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $14/10}')
- [ -n "$T" ] && RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $15}' | xargs)
- [ -n "$T" ] && SINR=$T
- ;;
- 11) MODE="5G SA";;
- 13) MODE="5G NSA";;
-esac
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "AT+CGMR")
-FWA=$(echo "$OF" | awk -F [:] '/^\+CGMR: /{print $2}' | xargs)
-if [ -n "$FWA" ]; then
- FW="$FWA"
-fi
-
-OL=$(sms_tool -d $DEVICE at "AT+CGMM")
-MODELB=$(echo "$OL" | sed s/"AT+CGMM"// | tr -s "\n" | xargs)
-if [ -n "$MODELB" ]; then
- MODEL="$(echo $MODELB | sed 's,_, ,')"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OM=$(sms_tool -d $DEVICE at "AT+CGSN")
-NR_I=$(echo "$OM" | sed s/"AT+CGSN"// | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OC=$(sms_tool -d $DEVICE at "AT+CIMI")
-NR_C=$(echo "$OC" | sed s/"AT+CIMI"// | tr -s "\n" | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-OI=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$OI" | awk -F [:] '/^\+ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1e0e ProdID=9000' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9001 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9001
deleted file mode 100644
index 303275efa..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9001
+++ /dev/null
@@ -1,100 +0,0 @@
-# SIMCOM SIM8200EA-M2
-# SIMCOM SIM7906
-
-OT=$(sms_tool -d $DEVICE at "AT+CPMUTEMP")
-
-T=$(echo "$OT" | awk -F[,:] '/^\+CPMUTEMP: / {print $2}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-O=$(sms_tool -d $DEVICE at "AT+CPSI?")
-
-case $MODE_NUM in
- 7)
- MODE="LTE |"
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $5}')
- if [ -n "$T" ]; then
- TAC_DEC=$(printf "%d" "$T")
- TAC_HEX="${T/0x/}"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $7}')
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $8}')
- if [ -n "$T" ]; then
- PBAND="$(band4g ${T/EUTRAN-BAND/})"
- MODE="$MODE $(band4g ${T/EUTRAN-BAND/})"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $9}')
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $10}')
- if [ -n "$T" ]; then
- DLBW="DL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $11}')
- if [ -n "$T" ]; then
- ULBW="UL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW $ULBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $12/10}')
- [ -n "$T" ] && RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $13/10}')
- [ -n "$T" ] && RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $14/10}')
- [ -n "$T" ] && RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $15}' | xargs)
- [ -n "$T" ] && SINR=$T
- ;;
- 11) MODE="5G SA";;
- 13) MODE="5G NSA";;
-esac
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "AT+CGMR")
-FWA=$(echo "$OF" | awk -F [:] '/^\+CGMR: /{print $2}' | xargs)
-if [ -n "$FWA" ]; then
- FW="$FWA"
-fi
-
-OL=$(sms_tool -d $DEVICE at "AT+CGMM")
-MODELB=$(echo "$OL" | sed s/"AT+CGMM"// | tr -s "\n" | xargs)
-if [ -n "$MODELB" ]; then
- MODEL="$(echo $MODELB | sed 's,_, ,')"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OM=$(sms_tool -d $DEVICE at "AT+CGSN")
-NR_I=$(echo "$OM" | sed s/"AT+CGSN"// | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OC=$(sms_tool -d $DEVICE at "AT+CIMI")
-NR_C=$(echo "$OC" | sed s/"AT+CIMI"// | tr -s "\n" | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-OI=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$OI" | awk -F [:] '/^\+ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1e0e ProdID=9001' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9003 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9003
deleted file mode 100644
index 2117d96dc..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e0e9003
+++ /dev/null
@@ -1,100 +0,0 @@
-# SIMCOM SIM8200EA-M2
-# SIMCOM SIM7906
-
-OT=$(sms_tool -d $DEVICE at "AT+CPMUTEMP")
-
-T=$(echo "$OT" | awk -F[,:] '/^\+CPMUTEMP: / {print $2}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-O=$(sms_tool -d $DEVICE at "AT+CPSI?")
-
-case $MODE_NUM in
- 7)
- MODE="LTE |"
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $5}')
- if [ -n "$T" ]; then
- TAC_DEC=$(printf "%d" "$T")
- TAC_HEX="${T/0x/}"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $7}')
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $8}')
- if [ -n "$T" ]; then
- PBAND="$(band4g ${T/EUTRAN-BAND/})"
- MODE="$MODE $(band4g ${T/EUTRAN-BAND/})"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $9}')
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $10}')
- if [ -n "$T" ]; then
- DLBW="DL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $11}')
- if [ -n "$T" ]; then
- ULBW="UL: @$T MHz"
- PBAND="$(band4g ${T/EUTRAN-BAND/}) $DLBW $ULBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $12/10}')
- [ -n "$T" ] && RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $13/10}')
- [ -n "$T" ] && RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $14/10}')
- [ -n "$T" ] && RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+CPSI: LTE/ {print $15}' | xargs)
- [ -n "$T" ] && SINR=$T
- ;;
- 11) MODE="5G SA";;
- 13) MODE="5G NSA";;
-esac
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "AT+CGMR")
-FWA=$(echo "$OF" | awk -F [:] '/^\+CGMR: /{print $2}' | xargs)
-if [ -n "$FWA" ]; then
- FW="$FWA"
-fi
-
-OL=$(sms_tool -d $DEVICE at "AT+CGMM")
-MODELB=$(echo "$OL" | sed s/"AT+CGMM"// | tr -s "\n" | xargs)
-if [ -n "$MODELB" ]; then
- MODEL="$(echo $MODELB | sed 's,_, ,')"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-OM=$(sms_tool -d $DEVICE at "AT+CGSN")
-NR_I=$(echo "$OM" | sed s/"AT+CGSN"// | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-OC=$(sms_tool -d $DEVICE at "AT+CIMI")
-NR_C=$(echo "$OC" | sed s/"AT+CIMI"// | tr -s "\n" | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-OI=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$OI" | awk -F [:] '/^\+ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1e0e ProdID=9003' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b3 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b3
deleted file mode 100644
index fd24a6b0f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b3
+++ /dev/null
@@ -1,225 +0,0 @@
-# Dell DW5930e
-# Foxconn T99W175
-# Thales Cinterion MV31-W
-
-O=$(sms_tool -d $DEVICE at "AT^TEMP?")
-
-T=$(echo "$O" | awk '/^TSENS: / {gsub("C","",$2); print $2}')
-T1=$(echo "$O" | awk '/^PA: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-
-T1=$(echo "$O" | awk '/^Skin Sensor: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at^debug?")
-
-case "$MODE_NUM" in
- "7")
- MODE="LTE |"
- echo "$O" | grep -q "scell:" && MODE="LTE-A |"
- ;;
- "11")
- MODE="5G SA |"
- ;;
- "13")
- MODE="5G NSA |"
- ;;
-esac
-
-T=$(echo "$O" | awk -F: '/^lte_tac:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
-# TAC_HEX=$(printf "%X" $T)
-# TAC_DEC=$(printf "%d" "0x$T")
-
- TAC_HEX=$(printf "%X" $T)
- TAC_DEC="$T"
-fi
-
-O1=$(echo "$O" | grep -A 3 pcell)
-T=$(echo "$O1" | awk -F: '/^pcell:/ {print $3}' | cut -f1 -d" ")
-if [ -n "$T" ]; then
- MODE="$MODE $(band4g $T)"
- T1=$(echo "$O1" | awk -F: '/^pcell:/ {print $4}' | xargs)
- PBAND="$(band4g $T) @${T1/MHz/} MHz"
-
- T=$(echo "$O1" | awk -F: '/pci:/ {print $3}' | xargs)
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O1" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O1" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
- [ -n "$T" ] && RSRP="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
- [ -n "$T" ] && RSRQ="${T/dB/}"
- T=$(echo "$O1" | awk -F[:,] '/^lte_rssi:/ {print $2}')
- [ -n "$T" ] && RSSI="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
- [ -n "$T" ] && [ "$T" != "NA" ] && SINR="${T/dB/}"
-fi
-
-O1=$(echo "$O" | grep -A 3 scell)
-IDX=0;
-while true; do
- O2=$(echo "$O1" | head -n4)
- if [ -z "$O2" ]; then
- break
- fi
- IDX=$((IDX + 1))
-
- T=$(echo "$O2" | awk -F: '/^scell:/ {print $3}' | cut -f1 -d" ")
- MODE="$MODE / $(band4g $T)"
- T1=$(echo "$O2" | awk -F: '/^scell:/ {print $4}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band4g $T) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/pci:/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O2" | awk -F[:,] '/^lte_rssi:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-
- O1=$(echo "$O1" | sed '1,4d')
-done
-
-T=$(echo "$O" | awk -F: '/^nr_band:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- IDX=$((IDX + 1))
-
- T1=$(echo "$O" | awk -F: '/^nr_band_width:/ {print $2}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O" | awk -F: '/^nr_pci:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_channel:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_rsrp:/ {print $2}' | cut -f1 -d" ")
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O" | awk -F: '/^nr_rsrq:/ {print $2}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O" | awk -F: '/^nr_snr:/ {print $2}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-
-# Modem
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1e2d ProdID=00b3' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b7 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b7
deleted file mode 100644
index a3202c687..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/1e2d00b7
+++ /dev/null
@@ -1,225 +0,0 @@
-# Dell DW5930e
-# Foxconn T99W175
-# Thales Cinterion MV31-W
-
-O=$(sms_tool -d $DEVICE at "AT^TEMP?")
-
-T=$(echo "$O" | awk '/^TSENS: / {gsub("C","",$2); print $2}')
-T1=$(echo "$O" | awk '/^PA: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-
-T1=$(echo "$O" | awk '/^Skin Sensor: / {gsub("C","",$2); print $2}')
-if [ -n "$T" ] && [ -n "$T1" ]; then
- if [[ "$T1" =~ ^[0-9]+$ && "$T" =~ ^[0-9]+$ ]]; then
- if [ "$T1" -gt "$T" ]; then
- T="$T1"
- fi
- fi
-fi
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at^debug?")
-
-case "$MODE_NUM" in
- "7")
- MODE="LTE |"
- echo "$O" | grep -q "scell:" && MODE="LTE-A |"
- ;;
- "11")
- MODE="5G SA |"
- ;;
- "13")
- MODE="5G NSA |"
- ;;
-esac
-
-T=$(echo "$O" | awk -F: '/^lte_tac:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
-# TAC_HEX=$(printf "%X" $T)
-# TAC_DEC=$(printf "%d" "0x$T")
-
- TAC_HEX=$(printf "%X" $T)
- TAC_DEC="$T"
-fi
-
-O1=$(echo "$O" | grep -A 3 pcell)
-T=$(echo "$O1" | awk -F: '/^pcell:/ {print $3}' | cut -f1 -d" ")
-if [ -n "$T" ]; then
- MODE="$MODE $(band4g $T)"
- T1=$(echo "$O1" | awk -F: '/^pcell:/ {print $4}' | xargs)
- PBAND="$(band4g $T) @${T1/MHz/} MHz"
-
- T=$(echo "$O1" | awk -F: '/pci:/ {print $3}' | xargs)
- [ -n "$T" ] && PCI=$T
- T=$(echo "$O1" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- [ -n "$T" ] && EARFCN=$T
- T=$(echo "$O1" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
- [ -n "$T" ] && RSRP="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
- [ -n "$T" ] && RSRQ="${T/dB/}"
- T=$(echo "$O1" | awk -F[:,] '/^lte_rssi:/ {print $2}')
- [ -n "$T" ] && RSSI="${T/dBm/}"
- T=$(echo "$O1" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
- [ -n "$T" ] && [ "$T" != "NA" ] && SINR="${T/dB/}"
-fi
-
-O1=$(echo "$O" | grep -A 3 scell)
-IDX=0;
-while true; do
- O2=$(echo "$O1" | head -n4)
- if [ -z "$O2" ]; then
- break
- fi
- IDX=$((IDX + 1))
-
- T=$(echo "$O2" | awk -F: '/^scell:/ {print $3}' | cut -f1 -d" ")
- MODE="$MODE / $(band4g $T)"
- T1=$(echo "$O2" | awk -F: '/^scell:/ {print $4}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band4g $T) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band4g $T) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/pci:/ {print $3}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F: '/^channel:/ {print $2}' | cut -f1 -d" " | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O2" | awk -F[:,] '/^lte_rsrp:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/rsrq:/ {print $4}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O2" | awk -F[:,] '/^lte_rssi:/ {print $2}')
-# [ -n "$T" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "${T/dBm/} dBm"
- T=$(echo "$O2" | awk -F[:,] '/lte_snr:/ {print $4}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-
- O1=$(echo "$O1" | sed '1,4d')
-done
-
-T=$(echo "$O" | awk -F: '/^nr_band:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE="$MODE / $(band5g ${T/n/})"
- IDX=$((IDX + 1))
-
- T1=$(echo "$O" | awk -F: '/^nr_band_width:/ {print $2}' | xargs)
- if [ -n "$T1" ]; then
- case $IDX in
- 1) S1BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 2) S2BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 3) S3BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- 4) S4BAND="$(band5g ${T/n/}) @${T1/MHz/} MHz";;
- *) ;;
- esac
- fi
-
- T=$(echo "$O" | awk -F: '/^nr_pci:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_channel:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$O" | awk -F: '/^nr_rsrp:/ {print $2}' | cut -f1 -d" ")
-# [ -n "$T" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "${T/dBm/} dBm"
- T=$(echo "$O" | awk -F: '/^nr_rsrq:/ {print $2}' | xargs)
-# [ -n "$T" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "${T/dB/} dB"
- T=$(echo "$O" | awk -F: '/^nr_snr:/ {print $2}' | xargs)
-# [ -n "$T" ] && [ "$T" != "NA" ] && addon $((POS + 8)) "(S${IDX}) SNR" "${T/dB/} dB"
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-
-# Modem
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=1e2d ProdID=00b7' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/20202033 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/20202033
deleted file mode 100644
index 223e013ba..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/20202033
+++ /dev/null
@@ -1,89 +0,0 @@
-# BroadMobi BM806U (DLINK DWR-921 C1)
-
-if [ "x$MODE_NUM" = "x7" ]; then
-
- O=$(sms_tool -d $DEVICE at "AT+BMTCELLINFO")
- echo "$O" | grep "^+BMTCELLINFO" | grep -q ",LAC_ID:" && O=$(echo "$O"| sed 's/,[ ]*/\n/g')
-
- T=$(echo "$O" | awk -F[,:] '/^TAC:/ {print $2}' | xargs)
- if [ -n "$T" ]; then
- T_HEX=$(printf "%X" $T)
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^RSSI:/ {print $2}' | xargs)
- [ -n "$T" ] && RSSI="-${T}"
- T=$(echo "$O" | awk -F[,:] '/^RSRP:/ {print $2}' | xargs)
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^RSRQ:/ {print $2}' | xargs)
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^SINR:/ {print $2}' | xargs)
- [ -n "$T" ] && SINR="$T"
-
- TB=$(echo "$O" | awk -F[,:] '/^ACTIVE BAND:/ {print $2}' | xargs)
- [ -n "$TB" ] && MODE="LTE | $(band4g ${TB})" && PBAND="$(band4g ${TB})"
- if [ -z "$TB" ]; then
- T=$(echo "$O" | awk -F[,:] '/^active band:/ {print $2}' | xargs)
- [ -n "$T" ] && MODE="LTE | $(band4g ${T})"
- PBAND="$(band4g ${T})"
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^PCI:/ {print $2}' | xargs)
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^EARFCN_DL:/ {print $2}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- EARFCN="$T"
-# EARFCN DL="$T"
- fi
- T=$(echo "$O" | awk -F[,:] '/^EARFCN_UL:/ {print $2}' | xargs)
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- EARFCN UL="$T"
- fi
-
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2020 ProdID=2033' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0122 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0122
deleted file mode 100644
index ac421a720..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0122
+++ /dev/null
@@ -1,502 +0,0 @@
-# Quectel RM551E-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
- fi
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
- MODE="LTE |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-GETNFO=$(gcom -d $DEVICE -s /usr/share/3ginfo-lite/vendorproduct.gcom)
-FW=$(echo "$GETNFO" | awk -F [:] '/^\+CGMR:/{print $2}' | xargs)
-
-MVENDOR=$(echo "$GETNFO" | awk -F [:] '/^\+CGMI:/{print $2}' | xargs)
-MPRODUCT=$(echo "$GETNFO" | awk -F [:] '/^\+CGMM:/{print $2}' | xargs)
-MODEL="$MVENDOR "$MPRODUCT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-NR_I=$(echo "$GETNFO" | awk -F [:] '/^\+CGSN:/{print $2}' | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-NR_C=$(echo "$GETNFO" | awk -F [:] '/^\+CIMI:/{print $2}' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-NR_D=$(echo "$GETNFO" | awk -F [:] '/^\+ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0801' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0125 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0125
deleted file mode 100644
index 54a0ee6b7..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0125
+++ /dev/null
@@ -1,118 +0,0 @@
-# Quectel EC20-E
-# Quectel EC25
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {t=$2*1;if($3*1>t)t=$3*1;if($4*1>t)t=$4*1;printf "%d", t}')
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $2"/"$4}' | xargs)
-if [ -n "$T" ]; then
- if [ "x$MODE_NUM" = "x7" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- MODE="LTE | $(band4g ${B})"
- MAINCUT="$(band4g ${B})"
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
-if [ "x$T" = "xLTE" ] || [ "x$T" = "x4G" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- PBAND="$MAINCUT $DLBW $ULBW"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}')
- [ -n "$T" ] && EARFCN="$T"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}')
- RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", $1*0.2-20}')
- SINR="$T"
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $4}' | xargs)
-if [ -n "$T" ]; then
- COPS="$T"
-fi
-
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEVV | awk -F 'Revision:' '{print $2}'| xargs)
-MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $1}'| xargs)
-if [ -z "$MODEL" ]
-then
- MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $2}'| xargs)
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0125' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0133 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0133
deleted file mode 100644
index ac421a720..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0133
+++ /dev/null
@@ -1,502 +0,0 @@
-# Quectel RM551E-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
- fi
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
- MODE="LTE |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,'| sed 's,LTE B,LTE | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-GETNFO=$(gcom -d $DEVICE -s /usr/share/3ginfo-lite/vendorproduct.gcom)
-FW=$(echo "$GETNFO" | awk -F [:] '/^\+CGMR:/{print $2}' | xargs)
-
-MVENDOR=$(echo "$GETNFO" | awk -F [:] '/^\+CGMI:/{print $2}' | xargs)
-MPRODUCT=$(echo "$GETNFO" | awk -F [:] '/^\+CGMM:/{print $2}' | xargs)
-MODEL="$MVENDOR "$MPRODUCT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-NR_I=$(echo "$GETNFO" | awk -F [:] '/^\+CGSN:/{print $2}' | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-NR_C=$(echo "$GETNFO" | awk -F [:] '/^\+CIMI:/{print $2}' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-NR_D=$(echo "$GETNFO" | awk -F [:] '/^\+ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0801' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0306 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0306
deleted file mode 100644
index 30d470d78..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0306
+++ /dev/null
@@ -1,151 +0,0 @@
-# Quectel EP06
-# Quectel EG06
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {t=$2*1;if($3*1>t)t=$3*1;if($4*1>t)t=$4*1;printf "%d", t}')
-[ -n "$T" ] && TEMP="$T °C"
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $2"/"$4}' | xargs)
-if [ -n "$T" ]; then
- if [ "x$MODE_NUM" = "x7" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- MODE="LTE $(band4g ${B})"
- MAINCUT="$(band4g ${B})"
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
-if [ "x$T" = "xLTE" ] || [ "x$T" = "x4G" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- DLBW="DL: @$T1 MHz"
- PBAND="$MAINCUT $DLBW $ULBW"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
- PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}')
- EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- RSRQ=$T
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", $1*0.2-20}')
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR=$T
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- O=$(sms_tool -d $DEVICE at "AT+QCAINFO")
-
- T=$(echo "$O" | awk -F[,] '/^\+QCAINFO: "scc"/{print $4}' | xargs)
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $4}')
- case $T in
- 6) T1="1.4";;
- 15) T1="3";;
- 25) T1="5";;
- 50) T1="10";;
- 75) T1="15";;
- 100) T1="20";;
- *) T1="?";;
- esac
- MODE="${MODE/LTE/LTE_A} / $(band4g ${B})"
- S1BAND="$(band4g ${B}) @$T1 MHz"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $7}')
- S1PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $3}')
- S1EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $10}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $8}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $9}')
- RSRQ=$T
-# T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $11}' | awk '{printf "%.1f\n", $1*0.2-20}')
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
- SINR=$T
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed "s/LTE_A/LTE-A | /g")
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEVV | awk -F 'Revision:' '{print $2}'| xargs)
-MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $1}'| xargs)
-if [ -z "$MODEL" ]
-then
- MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $2}'| xargs)
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0306' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c030b b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c030b
deleted file mode 100644
index d7b8ae96c..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c030b
+++ /dev/null
@@ -1,147 +0,0 @@
-# Quectel EM06
-
-QTEMP=$(sms_tool -d $DEVICE at "AT+QTEMP" | grep cpuss-usr)
-QTEMPEXTRACTED=$(echo "${QTEMP}" | awk -F[,:] '/^\+QTEMP/ {t=$2*1;if($3*1>t)t=$3*1;if($4*1>t)t=$4*1;printf "%d", t}')
-[ -n "${QTEMP}" ] && TEMP="${QTEMPEXTRACTED} °C"
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $2"/"$4}' | xargs)
-if [ -n "$T" ]; then
- if [ "x$MODE_NUM" = "x7" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- MODE="LTE $(band4g ${B})"
- MAINCUT="$(band4g ${B})"
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
-if [ "x$T" = "xLTE" ] || [ "x$T" = "x4G" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- DLBW="DL: @$T1 MHz"
- PBAND="$MAINCUT $DLBW $ULBW"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
- PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}')
- EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", $1*0.2-20}')
- SINR=$T
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- O=$(sms_tool -d $DEVICE at "AT+QCAINFO")
-
- T=$(echo "$O" | awk -F[,] '/^\+QCAINFO: "scc"/{print $4}' | xargs)
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $4}')
- case $T in
- 6) T1="1.4";;
- 15) T1="3";;
- 25) T1="5";;
- 50) T1="10";;
- 75) T1="15";;
- 100) T1="20";;
- *) T1="?";;
- esac
- MODE="${MODE/LTE/LTE_A} / $(band4g ${B})"
- S1BAND="$(band4g ${B}) @$T1 MHz"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $7}')
- S1PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $3}')
- S1EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $10}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $8}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $9}')
- RSRQ=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "scc"/ {print $11}' | awk '{printf "%.1f\n", $1*0.2-20}')
- SINR=$T
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed "s/LTE_A/LTE-A | /g")
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEVV | awk -F 'Revision:' '{print $2}'| xargs)
-MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $1}'| xargs)
-if [ -z "$MODEL" ]
-then
- MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $2}'| xargs)
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=030b' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0512 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0512
deleted file mode 100644
index 1234b3b8c..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0512
+++ /dev/null
@@ -1,253 +0,0 @@
-# Quectel EG18-EA
-# Quectel EM12-G
-# Quectel EM160R-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE-A"
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
- if [ -z "$T" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:/{print $4}')
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- MODE="$MODE $T2"
- T3=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:"/{print $11}')
- case $T3 in
- 6) T4="1.4";;
- 15) T4="3";;
- 25) T4="5";;
- 50) T4="10";;
- 75) T4="15";;
- 100) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- else
- PBAND="$T2 @${T4} MHz"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {printf "%.1f\n", $18/5-20}' | xargs)
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- [ -n "$T" ] && SINR="$T"
- else
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- MODE="$MODE $T2"
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6) T4="1.4";;
- 15) T4="3";;
- 25) T4="5";;
- 50) T4="10";;
- 75) T4="15";;
- 100) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- else
- PBAND="$T2 @${T4} MHz"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{printf "%.1f\n", $11/5-20}' | xargs)
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- [ -n "$T" ] && SINR="$T"
-
-IFS="
-"
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- MODE="$MODE / $T2"
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- case $T3 in
- 6) T4="1.4";;
- 15) T4="3";;
- 25) T4="5";;
- 50) T4="10";;
- 75) T4="15";;
- 100) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @${T4} MHz";;
- 2) S2BAND="$T2 @${T4} MHz";;
- 3) S3BAND="$T2 @${T4} MHz";;
- 4) S4BAND="$T2 @${T4} MHz";;
- *) ;;
- esac
- fi
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
- fi
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
- fi
-# T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}')
-# addon $((POS + 5)) "(S${IDX}) RSSI" "$T dBm"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# addon $((POS + 6)) "(S${IDX}) RSRP" "$T dBm"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# addon $((POS + 7)) "(S${IDX}) RSRQ" "$T dB"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{printf "%.1f\n", $11/5-20}' | xargs)
-# addon $((POS + 8)) "(S${IDX}) SINR" "$T dB"
-
- IDX=$((IDX + 1))
- done
- fi
-fi
-
-fi
-
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE B,LTE | B,' | sed 's,LTE_A,LTE-A,' | sed 's,LTE-A B,LTE-A | B,')
-
-# Modem
-OF=$(sms_tool -d $DEVICE at "ati")
-DEVV=$(echo $OF | tr -s "\n" | xargs)
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | cut -c 8-)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | cut -c 9-)
-MODELBCUT=$(echo $MODELB | cut -c 9-)
-MODEL="$MODELBCUT "$MODELACUT
-if [ -z "$MODEL" ]
-then
- MODEL=$(echo $DEVV | awk -F 'ati|Revision:' '{print $2}'| xargs)
-fi
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0512' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0620 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0620
deleted file mode 100644
index 5ac936758..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0620
+++ /dev/null
@@ -1,256 +0,0 @@
-# Quectel EM160R-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
-fi
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE-A |"
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- done
- fi
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$T
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $17}' | xargs)
- if [ -n "$T" ]; then
- RSSI=$T
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}' | xargs)
- if [ -n "$T" ]; then
- RSRP=$T
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}' | xargs)
- if [ -n "$T" ]; then
- RSRQ=$T
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}' | xargs)
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $10}' | xargs)
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
-
- QO=$(sms_tool -d $DEVICE at "at+qnwinfo;")
- PBAND=$(echo "$QO" | awk -F[,:] '/^\+QNWINFO:/ {print $4}' | xargs)
- MAINCUT=$(echo $PBAND | sed 's/LTE BAND //g')
-
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="?";;
- esac
- ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- DLBW="DL: @$T1 MHz"
-
- PBAND="$(band4g $MAINCUT "") $DLBW $ULBW"
- if [ "x$MODE" = "xLTE" ]; then
- MODE="LTE | $(band4g $MAINCUT "")"
- fi
- fi
-fi
-
-IFS="
-"
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6) T4="1.4";;
- 15) T4="3";;
- 25) T4="5";;
- 50) T4="10";;
- 75) T4="15";;
- 100) T4="20";;
- *) T4="?";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- else
- PBAND="$T2 @$T4 MHz"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- EARFCN=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- PCI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- RSSI=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- RSRP=$T
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- RSRQ=$T
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- case $T3 in
- 6) T4="1.4";;
- 15) T4="3";;
- 25) T4="5";;
- 50) T4="10";;
- 75) T4="15";;
- 100) T4="20";;
- *) T4="?";;
- esac
- if [ -z "$T4" ]; then
-
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
-
- else
-
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
-
- fi
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- if [ -n "$T" ]; then
-
- case $IDX in
- 1) S1EARFCN="$T";;
- 2) S2EARFCN="$T";;
- 3) S3EARFCN="$T";;
- 4) S4EARFCN="$T";;
- *) ;;
- esac
-
- fi
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
- if [ -n "$T" ]; then
-
- case $IDX in
- 1) S1PCI="$T";;
- 2) S2PCI="$T";;
- 3) S3PCI="$T";;
- 4) S4PCI="$T";;
- *) ;;
- esac
-
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE B,LTE | B,' | sed 's,LTE_A,LTE-A,' | sed 's,LTE-A B,LTE-A | B,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | cut -c 8-)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | cut -c 9-)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0620' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0800 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0800
deleted file mode 100644
index 1dd8f1bd1..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0800
+++ /dev/null
@@ -1,539 +0,0 @@
-# Quectel RG500Q-EA
-# Quectel RG502Q-EA
-# Quectel RM500Q-GL
-# Quectel RM502Q-AE
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | busybox awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- MODE="LTE |"
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE_A"
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- MODE="LTE |"
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR-N"*)
- B=$(echo $T | sed 's/NR-N\(.*\)/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-else
- case "$MODE_NUM" in
- 7 | 13)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*LTE.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- fi
- ;;
- 11*)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*NR5G.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- fi
- ;;
- esac
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE B,LTE | B,' | sed 's,LTE_A,LTE-A,' | sed 's,LTE-A B,LTE-A | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+GSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0800' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0801 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0801
deleted file mode 100644
index ea661882f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0801
+++ /dev/null
@@ -1,549 +0,0 @@
-# Quectel RM520N-GL
-# Quectel RM521F-GL
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- T=""
- TAC_HEX=""
- CID_HEX=""
- TAC_DEC=""
- eval $(echo "$O" | busybox awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ -n "$TAC_DEC" ] && [ "$TAC_DEC" != "0" ] && TAC_DEC="${TAC_DEC}"
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-if [ "$CID_HEX" = "0" ]; then
-Oz=$(sms_tool -d $DEVICE at "at+qeng=\"servingcell\";")
-CID_HEX=$(echo "$Oz" | awk -F',' '/LTE/ {print $5}')
-CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-
-case "$MODE_NUM" in
- 7*)
- MODE="LTE |"
- echo "$O" | grep -q -i "+QCAINFO.*SCC" && MODE="LTE_A"
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- MODE="LTE |"
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR-N"*)
- B=$(echo $T | sed 's/NR-N\(.*\)/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-else
- case "$MODE_NUM" in
- 7 | 13)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*LTE.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- fi
- ;;
- 11*)
- T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO:.*NR5G.*/{print $4}')
- if [ -n "$T" ]; then
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- fi
- ;;
- esac
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE B,LTE | B,' | sed 's,LTE_A,LTE-A,' | sed 's,LTE-A B,LTE-A | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+GSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0801' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0900 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0900
deleted file mode 100644
index 4b337954d..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c0900
+++ /dev/null
@@ -1,524 +0,0 @@
-# Quectel RM500U-CNV
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $3}' | sort -r | head -n1 | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ -z "$REG" ] || [ "x$MODE_NUM" = "x11" ]; then
- O=$(sms_tool -d $DEVICE at "at+c5greg=2;+c5greg?")
-
- # C5GREG
- eval $(echo "$O" | busybox awk -F[,] '/^\+C5GREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";TAC_HEX=\"%X\";CID_HEX=\"%s\";TAC_DEC=\"%d\";MODE_NUM=\"%d\"", $2, "0x"$3, $4, "0x"$3, $5}')
- case "$T" in
- 0*) REG="0";;
- 1*) REG="1";;
- 2*) REG="2";;
- 3*) REG="3";;
- 5*) REG="5";;
- *) REG="";;
- esac
- [ "x$REG" = "x1" ] || [ "x$REG" = "x5" ] && REGOK=1
-
- [ "$TAC_DEC" != "0" ]
- [ -n "$CID_HEX" ] && CID_DEC=$(printf "%d" "0x${CID_HEX}")
-fi
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qcainfo;+qeng=\"servingcell\";+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-case "$MODE_NUM" in
- 7*)
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
- fi
- ;;
- 11*)
- MODE="5G SA |"
- ;;
- 13*)
- if echo "$O" | grep -q -i "+QCAINFO.*NR5G"; then
- MODE="5G NSA |"
- else
- if echo "$O" | grep -q -i "+QCAINFO.*PCC.*LTE"; then
- MODE="LTE |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
-
- if echo "$O" | grep -q -i "+QCAINFO.*SCC"; then
- MODE="LTE-A |"
-
- OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# OTS=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR=$OTS
-
- TDX=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$TDX")
- TAC_HEX=$TDX
- fi
- fi
- fi
- ;;
-esac
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- MODE="$MODE $(band4g ${B})"
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- MODE="$MODE $(band5g ${B})"
- ;;
- esac
-
- T1=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{gsub(" ", "-");print $5}')
- if [ -n "$T1" ]; then
- for T in $T1; do
- case $T in
- *"LTE-BAND"*)
- B=$(echo $T | sed 's/"LTE-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band4g ${B})"
- ;;
- *"NR-N"*)
- B=$(echo $T | sed 's/NR-N\(.*\)/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- *"NR5G-BAND"*)
- B=$(echo $T | sed 's/"NR5G-BAND-\(.*\)"/\1/')
- MODE="$MODE / $(band5g ${B})"
- ;;
- esac
- done
- fi
-fi
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
-fi
-
-if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
- if [ "x$T" = "xNR5G-SA" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $8}')
- if [ -n "$T" ]; then
- CID_HEX=$T
- CID_DEC=$(printf "%d" "0x${CID_HEX}")
- fi
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $9}')
-# [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) BW="5";;
- 1) BW="10";;
- 2) BW="15";;
- 3) BW="20";;
- 4) BW="25";;
- 5) BW="30";;
- 6) BW="40";;
- 7) BW="50";;
- 8) BW="60";;
- 9) BW="70";;
- 10) BW="80";;
- 11) BW="90";;
- 12) BW="100";;
- 13) BW="200";;
- 14) BW="400";;
- *) BW="";;
- esac
- [ -n "$BW" ] && DBW="@$BW MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- if [ -n "$T" ]; then
- RSRP="$T"
- if [ -n "$BW" ]; then
- N=$((BW * 5))
- RSSI=$(echo "$T $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- [ -z "$CSQ_PER" ] && CSQ_PER=$(((RSSI + 113) * 100 / 62 ))
- [ -z "$CSQ" ] && CSQ=$(((31 * CSQ_PER) / 100))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $15}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $16}')
- [ -n "$T" ] && SINR="$T"
- fi
-fi
-
-IFS="
-"
-
-if [ "x$MODE_NUM" = "x13" ]; then
- LINES=$(echo "$O" | grep "+QENG")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/{print $2}' | xargs)
- if [ "x$T" = "xLTE" ]; then
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $12}')
- TAC_DEC=$(printf "%d" "0x$T")
- TAC_HEX=$T
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $16}' | awk '{printf "%.0f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $10}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$LINE" | awk -F[,:] '/^\+QENG:/ {print $11}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- elif [ "x$T" = "xservingcell" ]; then
- if [ "x${MODE:0:3}" = "xLTE" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | awk '{printf "%.1f\n", 0.2*$1*10 - 20}')
-# T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $18}' | xargs)
- SINR="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && ULBW="UL: @$T1 MHz"
- T=$(echo "$O" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0*) T1="1.4";;
- 1*) T1="3";;
- 2*) T1="5";;
- 3*) T1="10";;
- 4*) T1="15";;
- 5*) T1="20";;
- *) T1="";;
- esac
- [ -n "$T1" ] && DLBW="DL: @$T1 MHz"
- fi
- fi
- done
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $5}')
-if [ -n "$T" ]; then
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- ;;
- *"NR N"*)
- B=$(echo $T | sed 's/NR N\(.*\)/\1/')
- T2=$(band5g ${B})
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- ;;
- esac
- T3=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $4}')
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- if [ -z "$T4" ]; then
- PBAND="$T2"
- if [ -n "$DBW" ]; then
- PBAND="$T2 $DBW"
- fi
- else
- PBAND="$T2 @$T4 MHz"
- fi
- if [ "x$MODE_NUM" = "x11" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $6}' | xargs)
- [ -n "$T" ] && PCI="$T"
- else
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $3}')
- [ -n "$T" ] && EARFCN="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $7}')
- [ -n "$T" ] && PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $10}')
- [ -n "$T" ] && RSSI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $8}')
- [ -n "$T" ] && RSRP="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+QCAINFO: "(pcc|PCC)"/{print $9}')
- [ -n "$T" ] && RSRQ="$T"
- fi
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^\+QCAINFO: \"(scc|SCC)\"")
- for LINE in $LINES; do
-
- T=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $5}')
- T3=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $4}')
- T4=""
- case $T in
- *"LTE BAND"*)
- B=$(echo $T | sed 's/"LTE BAND \(.*\)"/\1/')
- T2=$(band4g ${B})
- case $T3 in
- 6*) T4="1.4";;
- 15*) T4="3";;
- 25*) T4="5";;
- 50*) T4="10";;
- 75*) T4="15";;
- 100*) T4="20";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $10}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 5)) "(S${IDX}) RSSI" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}' | xargs)
-# [ -n "$T5" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- ;;
- *"NR5G BAND"*)
- B=$(echo $T | sed 's/"NR5G BAND \(.*\)"/\1/')
- T2=$(band5g ${B})
- case $T3 in
- 0) T4="5";;
- 1) T4="10";;
- 2) T4="15";;
- 3) T4="20";;
- 4) T4="25";;
- 5) T4="30";;
- 6) T4="40";;
- 7) T4="50";;
- 8) T4="60";;
- 9) T4="70";;
- 10) T4="80";;
- 11) T4="90";;
- 12) T4="100";;
- 13) T4="200";;
- 14) T4="400";;
- *) T4="";;
- esac
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $3}')
- [ -n "$T5" ]
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1EARFCN="$T5";;
- 2) S2EARFCN="$T5";;
- 3) S3EARFCN="$T5";;
- 4) S4EARFCN="$T5";;
- *) ;;
- esac
- fi
-
- if [ "x$MODE_NUM" = "x11" ]; then
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}' | xargs)
- if [ -n "$T5" ] && [ "$T5" != "-" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
-
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $9}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- else
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $6}' | xargs)
- if [ -n "$T5" ]; then
- case $IDX in
- 1) S1PCI="$T5";;
- 2) S2PCI="$T5";;
- 3) S3PCI="$T5";;
- 4) S4PCI="$T5";;
- *) ;;
- esac
- fi
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $7}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$T5 dBm"
- T5=$(echo "$LINE" | awk -F[,:] '/^\+QCAINFO: "(scc|SCC)"/{print $8}')
-# [ -n "$T5" ] && [ "$T5" != "-" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$T5 dB"
- fi
- ;;
- esac
- if [ -z "$T4" ]; then
- case $IDX in
- 1) S1BAND="$T2";;
- 2) S2BAND="$T2";;
- 3) S3BAND="$T2";;
- 4) S4BAND="$T2";;
- *) ;;
- esac
- else
- case $IDX in
- 1) S1BAND="$T2 @$T4 MHz";;
- 2) S2BAND="$T2 @$T4 MHz";;
- 3) S3BAND="$T2 @$T4 MHz";;
- 4) S4BAND="$T2 @$T4 MHz";;
- *) ;;
- esac
- fi
-
- IDX=$((IDX + 1))
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE B,LTE | B,' | sed 's,LTE_A,LTE-A,' | sed 's,LTE-A B,LTE-A | B,')
-
-if [ "${LAC_DEC}" = "0" ]; then
- LAC_DEC="-"
- LAC_HEX="-"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Slot SIM
-O=$(sms_tool -d $DEVICE at "AT+QUIMSLOT?")
-T=$(echo "$O" | awk -F [:] '/^\+QUIMSLOT/{print $2}' | xargs)
-if [ -n "$T" ]; then
- SSIM="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+GSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=0900' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c6026 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c6026
deleted file mode 100644
index b64a1ee71..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2c7c6026
+++ /dev/null
@@ -1,116 +0,0 @@
-# Quectel EC200T
-
-O=$(sms_tool -d $DEVICE at "at+qtemp")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QTEMP/ {print $2}' | sort -r | head -n1 | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
-fi
-
-O=$(sms_tool -d $DEVICE at "at+qnwinfo;+qspn")
-
-T=$(echo "$O" | awk -F[,:] '/^\+QNWINFO/ {print $2"/"$4}' | xargs)
-if [ -n "$T" ]; then
- if [ "x$MODE_NUM" = "x7" ]; then
- B=$(echo $T | sed 's/.*LTE BAND \(.*\)/\1/')
- MODE="LTE | $(band4g ${B})"
- MAINCUT="$(band4g ${B})"
- fi
-fi
-
-E=$(sms_tool -d $DEVICE at "at+qeng=\"servingcell\"")
-
-T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $4}' | xargs)
-if [ "x$T" = "xLTE" ] || [ "x$T" = "x4G" ]; then
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $14}')
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $12}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- ULBW="UL: @$T1 MHz"
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $13}')
- case $T in
- 0) T1="1.4";;
- 1) T1="3";;
- 2) T1="5";;
- 3) T1="10";;
- 4) T1="15";;
- 5) T1="20";;
- *) T1="?";;
- esac
- DLBW="DL: @$T1 MHz"
- PBAND="$MAINCUT $DLBW $ULBW"
-
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $9}')
- PCI=$T
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $10}')
- EARFCN=$T
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $17}')
- RSSI=$T
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $15}')
- RSRP=$T
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $16}')
- RSRQ=$T
- T=$(echo "$E" | awk -F[,:] '/^\+QENG:/ {print $18}')
- SINR=$T
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+QSPN/ {print $2}' | xargs)
-if [ -n "$T" ] && [ -z "$FORCE_PLMN" ]; then
- COPS="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O" | sed 's/AT+GSN//g' | xargs)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed 's/AT+CIMI//g' | xargs)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+QCCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+QCCID/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+GMR"//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM"//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI"//)
-MODEL="$MODELBCUT "$MODELACUT
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=2c7c ProdID=6026' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70007 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70007
deleted file mode 100644
index 9fed40d9f..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70007
+++ /dev/null
@@ -1,293 +0,0 @@
-# Fibocom L850-GL
-
-convertchannel() {
- if [ $1 -ge 0 ] && [ $1 -le 599 ]; then
- newband=1
- elif [ $1 -ge 600 ] && [ $1 -le 1199 ]; then
- newband=2
- elif [ $1 -ge 1200 ] && [ $1 -le 1949 ]; then
- newband=3
- elif [ $1 -ge 1950] && [ $1 -le 2399 ]; then
- newband=4
- elif [ $1 -ge 2400] && [ $1 -le 2469 ]; then
- newband=5
- elif [ $1 -ge 2750 ] && [ $1 -le 3449 ]; then
- newband=7
- elif [ $1 -ge 3450 ] && [ $1 -le 3799 ]; then
- newband=8
- elif [ $1 -ge 6150 ] && [ $1 -le 6449 ]; then
- newband=20
- elif [ $1 -ge 9210 ] && [ $1 -le 9659 ]; then
- newband=28
- elif [ $1 -ge 9870 ] && [ $1 -le 9919 ]; then
- newband=31
- elif [ $1 -ge 37750 ] && [ $1 -le 38249 ]; then
- newband=38
- elif [ $1 -ge 38650 ] && [ $1 -le 39649 ]; then
- newband=40
- else
- newband=0
- fi
-}
-
-O=$(sms_tool -d $DEVICE at "at+xlec?;+rsrp?;+rsrq?;+xmci=1")
-
-T=$(echo "$O" | awk -F [:_] '/\+XLEC:/{gsub("\r",""); print $4}' | awk -F [:,] '{print $1}')
-if [ -n "$T" ]; then
- case $T in
- *"1"*) MODE="${MODE} "$(band4g 1 "");;
- *"2"*) MODE="${MODE} "$(band4g 2 "");;
- *"3"*) MODE="${MODE} "$(band4g 3 "");;
- *"4"*) MODE="${MODE} "$(band4g 4 "");;
- *"5"*) MODE="${MODE} "$(band4g 5 "");;
- *"7"*) MODE="${MODE} "$(band4g 7 "");;
- *"8"*) MODE="${MODE} "$(band4g 8 "");;
- *"12"*) MODE="${MODE} "$(band4g 12 "");;
- *"13"*) MODE="${MODE} "$(band4g 13 "");;
- *"14"*) MODE="${MODE} "$(band4g 14 "");;
- *"17"*) MODE="${MODE} "$(band4g 17 "");;
- *"18"*) MODE="${MODE} "$(band4g 18 "");;
- *"19"*) MODE="${MODE} "$(band4g 19 "");;
- *"20"*) MODE="${MODE} "$(band4g 20 "");;
- *"21"*) MODE="${MODE} "$(band4g 21 "");;
- *"25"*) MODE="${MODE} "$(band4g 25 "");;
- *"26"*) MODE="${MODE} "$(band4g 26 "");;
- *"28"*) MODE="${MODE} "$(band4g 28 "");;
- *"29"*) MODE="${MODE} "$(band4g 29 "");;
- *"30"*) MODE="${MODE} "$(band4g 30 "");;
- *"32"*) MODE="${MODE} "$(band4g 32 "");;
- *"34"*) MODE="${MODE} "$(band4g 34 "");;
- *"38"*) MODE="${MODE} "$(band4g 38 "");;
- *"39"*) MODE="${MODE} "$(band4g 39 "");;
- *"40"*) MODE="${MODE} "$(band4g 40 "");;
- *"41"*) MODE="${MODE} "$(band4g 41 "");;
- *"42"*) MODE="${MODE} "$(band4g 42 "");;
- *"43"*) MODE="${MODE} "$(band4g 43 "");;
- *"46"*) MODE="${MODE} "$(band4g 46 "");;
- *"48"*) MODE="${MODE} "$(band4g 48 "");;
- *"66"*) MODE="${MODE} "$(band4g 66 "");;
- *"71"*) MODE="${MODE} "$(band4g 71 "");;
- *) MODE="${MODE} ${T}";;
- esac
-fi
-
-RSRP=$(echo "$O" | awk -F [:,] '/\+RSRP:/{printf "%.0f\n", $4}')
-
-BWDL=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r","",$4); print $4}')
- case $BWDL in
- 1) NP=15 ;;
- 2) NP=25 ;;
- 3) NP=50 ;;
- 4) NP=75 ;;
- 5) NP=100 ;;
- *) NP=0 ;;
- esac
-
-CSQ=$(echo $RSRP $NP | awk '{printf "%.0f\n", (($1+10*log(12*$2)/log(10))+113)/2}')
-[ "x$CSQ" = "x" ] && CSQ=-1
-if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
- CSQ_PER=$(($CSQ * 100/31))
- RSSI=$((2 * CSQ - 113))
- # Fibocom RSSI up -51dBm. Thanks to TSA74 at 4pda.to
-elif [ $CSQ -ge 32 -a $CSQ -le 50 ]; then
- RSSI=$((2 * CSQ - 113))
- CSQ_PER="100"
- CSQ="31"
-else
- CSQ_PER="0"
-fi
-
-RSRQ=$(echo "$O" | awk -F [:,] '/\+RSRQ:/{printf "%.0f\n", $4}')
-SINR=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.0f\n", $13/4+5}')
-
-LTE_Cx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{print $3}')
-LTE_CA=$(($LTE_Cx -1))
-
-if [ -n "LTE_CA" ]; then
-
-case $LTE_CA in
- 1*)
- CAx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6}')
- BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "$5}')
- ;;
- 2*)
- CAx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9}')
- BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "$5" "$6}');;
- 3*)
- CAx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9" "$12}')
- BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "$5" "$6" "$7}')
- ;;
- 4*)
- CAx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9" "$12" "$15}')
- BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "$5" "$6" "$7" "$8}')
- ;;
-esac
-
-CA_BAND=""
-for sca in $CAx; do
- convertchannel $sca 2> /dev/null
- BAND="$(band4g $newband "")"
- CA_BAND=$CA_BAND' / '$BAND
- CABANDx=$CABANDx','$newband
-done
-MODE="LTE-A | $(band4g $T "")${CA_BAND}"
-
-S1=$(echo "$CABANDx" | awk -F [,] '/\,/{print $2" "}' | sed 's/ //g')
-S2=$(echo "$CABANDx" | awk -F [,] '/\,/{print $3" "}' | sed 's/ //g')
-S3=$(echo "$CABANDx" | awk -F [,] '/\,/{print $4" "}' | sed 's/ //g')
-S4=$(echo "$CABANDx" | awk -F [,] '/\,/{print $5" "}' | sed 's/ //g')
-
-BWCA=0
-BWCA_INFO=""
-for T3 in $BWCx; do
- case $T3 in
- 1*) T5="3";;
- 2*) T5="5";;
- 3*) T5="10";;
- 4*) T5="15";;
- 5*) T5="20";;
- *) T5="0";;
- esac
-BWCA=$(($BWCA+$T5))
-[[ -z ${BWCA_INFO} ]] && BWCA_INFO="${T5}" || BWCA_INFO="${BWCA_INFO},${T5}"
-done
-
-BW1=$(echo "$BWCA_INFO" | awk -F [,] '/\,/{print $2" "}')
-BW2=$(echo "$BWCA_INFO" | awk -F [,] '/\,/{print $3" "}')
-BW3=$(echo "$BWCA_INFO" | awk -F [,] '/\,/{print $4" "}')
-BW4=$(echo "$BWCA_INFO" | awk -F [,] '/\,/{print $5" "}')
-
-T2=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "}')
- case $T2 in
- 1*) T4="3";;
- 2*) T4="5";;
- 3*) T4="10";;
- 4*) T4="15";;
- 5*) T4="20";;
- *) T4="0";;
- esac
-
- if [ -n "$T4" ]; then
- PBAND="$(band4g $T "") @$T4 MHz"
- PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $2}')
- EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $3}')
- fi
-
-if [ -n "$S1" ]; then
-S1BAND="$(band4g $S1 "") @$BW1 MHz"
-S1PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $5}')
-S1EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $6}')
-fi
-if [ -n "$S2" ]; then
-S2BAND="$(band4g $S2 "") @$BW2 MHz"
-S2PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $8}')
-S2EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $9}')
-fi
-if [ -n "$S3" ]; then
-S3BAND="$(band4g $S3 "") @$BW3 MHz"
-S3PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $11}')
-S3EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $12}')
-fi
-if [ -n "$S4" ]; then
-S4BAND="$(band4g $S4 "") @$BW4 MHz"
-S4PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $14}')
-S4EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $15}')
-fi
-
-
-fi
-
-if [[ "$MODE" != *"LTE-A"* ]]; then
- if [ -n "$T" ]; then
- MODE="LTE | $(band4g $T "")"
-
- T2=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r",""); print $4" "}')
- case $T2 in
- 1*) T4="3";;
- 2*) T4="5";;
- 3*) T4="10";;
- 4*) T4="15";;
- 5*) T4="20";;
- *) T4="0";;
- esac
-
- if [ -n "$T4" ]; then
- PBAND="$(band4g $T "") @$T4 MHz"
- PCI=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $2}')
- EARFCN=$(echo "$O" | awk -F[,:] '/^\+RSRP:/ {print $3}')
- fi
- fi
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,')
-
-OT=$(sms_tool -d $DEVICE at "AT+XCCINFO=1;+XCCINFO?")
-if [ -n "$OT" ]; then
- T=$(echo "$OT" | awk -F[,:] '/^\+XCCINFO:/{print $11}' | xargs)
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- fi
- if [ -z "$T_HEX" ]; then
- [ -n "$T_DEC" ] && T_HEX=$(printf %0X $T_DEC)
- fi
-fi
-
-if [ "$REG" == "6" ]; then
-REG="1"
-fi
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GTPKGVER?" | xargs)
-FW=$(echo "$FWA" | cut -d ":" -f2 | xargs)
-
-MDL=$(sms_tool -d $DEVICE at "AT+GMM?" | xargs)
-MODELM=$(echo $MDL | awk -F [:] '/^\+GMM: /{print $2}'| awk -F 'LTE Module' '{print $1}' | xargs)
-MODELF=$(sms_tool -d $DEVICE at "AT+CGMI" | xargs)
-
-MODELMCUT=$(echo $MODELM)
-MODELFCUT=$(echo $MODELF | awk -F [:] '/^\+CGMI:/{print $2}' | xargs)
-MODEL="$MODELFCUT "$MODELMCUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+CCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+CCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCAX=$(echo $PV | awk -F"Vendor=2cb7 ProdID=0007" '{print $2}')
-PVCA=$(echo "$PVCAX" | cut -c-2453)
-
-if [ -n "$PVCA" ]; then
- case $PVCA in
- *"Driver=qmi_wwan"*)
- PROTO="qmi"
- ;;
- *"Driver=cdc_ncm"*)
- PROTO="ncm"
- ;;
- *"Driver=cdc_mbim"*)
- PROTO="mbim"
- ;;
- *"Driver=cdc_ether"*)
- PROTO="ecm"
- ;;
- esac
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70104 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70104
deleted file mode 100644
index 65a24f4fd..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70104
+++ /dev/null
@@ -1,205 +0,0 @@
-# Fibocom FM150-AE
-
-O=$(sms_tool -d $DEVICE at "at+gtccinfo?;+gtcainfo?")
-
-if [ "x$MODE" = "xLTE" ]; then
- if [[ "$O" == *"SCC"* ]]; then
- MODE="LTE_A"
- fi
- T1=$(echo "$O" | grep -A 3 'LTE service cell' | grep '1,4,'${COPS_MCC}','${COPS_MNC}',')
- if [ -n "$T1" ]; then
- T=$(echo "$T1" | awk -F, '{print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $8}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $7}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $11}')
- if [ -n "$T" ]; then
- if [ $T -ge -100 ] || [ $T -le 100 ]; then
- T=$(echo "$T" | awk -F, '{printf "%0.1f", $T/2}')
- fi
- fi
- T=$(echo "$T1" | awk -F, '{print $13}')
- if [ -n "$T" ]; then
- RSRP=$((T - 141))
- fi
- T=$(echo "$T1" | awk -F, '{print $14}')
- if [ -n "$T" ]; then
- T2=$(echo "$T" | awk '{printf "%0.1f", ($1-34)/2-3 }')
- RSRQ=$T2
- fi
- T=$(echo "$T1" | awk -F, '{print $11}')
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T2=$(echo "$T" | awk '{printf "%0.1f", $1/4+5 }')
- SINR=$T2
- fi
- T=$(echo "$T1" | awk -F, '{print $14}')
- if [ -n "$T" ]; then
- [ -n "$ADDON" ] && ADDON="$ADDON,"
- T2=$(echo "$T" | awk '{printf "%0.1f", $1-110 }')
- RSSI=$T2
- fi
-
- T=$(echo "$T1" | awk -F, '{print $9}')
- if [ -n "$T" ]; then
- T=$((T - 100))
-
- case $T in
- *"1") MODE="$MODE | "$(band4g 1 "");;
- *"2") MODE="$MODE | "$(band4g 2 "");;
- *"3") MODE="$MODE | "$(band4g 3 "");;
- *"5") MODE="$MODE | "$(band4g 5 "");;
- *"7") MODE="$MODE | "$(band4g 7 "");;
- *"8") MODE="$MODE | "$(band4g 8 "");;
- *"18") MODE="$MODE | "$(band4g 18 "");;
- *"19") MODE="$MODE | "$(band4g 19 "");;
- *"20") MODE="$MODE | "$(band4g 20 "");;
- *"28") MODE="$MODE | "$(band4g 28 "");;
- *"32") MODE="$MODE | "$(band4g 32 "");;
- *"34") MODE="$MODE | "$(band4g 34 "");;
- *"38") MODE="$MODE | "$(band4g 38 "");;
- *"39") MODE="$MODE | "$(band4g 39 "");;
- *"40") MODE="$MODE | "$(band4g 40 "");;
- *"41") MODE="$MODE | "$(band4g 41 "");;
- *"42") MODE="$MODE | "$(band4g 42 "");;
- *"43") MODE="$MODE | "$(band4g 43 "");;
- *) MODE="$MODE / B${T}";;
- esac
- PBAND="$(band4g $T "")"
- fi
-
- fi
-
- T=$(echo "$O" | awk -F[:,] '/^PCC/{print $3}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$O" | awk -F[:,] '/^PCC/{print $4}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
-
-IFS="
-"
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^SCC[0-9]: ")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[:,] '/^SCC'$IDX': 1,0/{print $4}')
- T=$((T - 100))
-
- case $T in
- "1") T2=$(band4g 1 "");;
- "2") T2=$(band4g 2 "");;
- "3") T2=$(band4g 3 "");;
- "5") T2=$(band4g 5 "");;
- "7") T2=$(band4g 7 "");;
- "8") T2=$(band4g 8 "");;
- "18") T2=$(band4g 18 "");;
- "19") T2=$(band4g 19 "");;
- "20") T2=$(band4g 20 "");;
- "28") T2=$(band4g 28 "");;
- "32") T2=$(band4g 32 "");;
- "34") T2=$(band4g 34 "");;
- "38") T2=$(band4g 38 "");;
- "39") T2=$(band4g 39 "");;
- "40") T2=$(band4g 40 "");;
- "41") T2=$(band4g 41 "");;
- "42") T2=$(band4g 42 "");;
- "43") T2=$(band4g 43 "");;
- *) T2="B${T}";;
- esac
- MODE="$MODE / $T2"
-
- if [ -n "$T" ]; then
-
- case $IDX in
- "1") S1BAND="$T2";;
- "2") S2BAND="$T2";;
- "3") S3BAND="$T2";;
- "4") S4BAND="$T2";;
- *);;
- esac
-
- case $IDX in
- "1") S1PCI="$T";;
- "2") S2PCI="$T";;
- "3") S3PCI="$T";;
- "4") S4PCI="$T";;
- *);;
- esac
-
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC'$IDX': 1,0/{print $6}')
- if [ -n "$T" ]; then
-
- case $IDX in
- "1") S1EARFCN="$T";;
- "2") S2EARFCN="$T";;
- "3") S3EARFCN="$T";;
- "4") S4EARFCN="$T";;
- *);;
- esac
-
- fi
- IDX=$((IDX + 1))
- done
-
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A /LTE-A /g" | sed 's,/,+,')
-
-# Modem
-OA=$(sms_tool -d $DEVICE at "AT+CGMM?")
-MODELA=$(echo "$OA" | awk -F [:,] '/\+CGMM/{print $2}' | xargs)
-OB=$(sms_tool -d $DEVICE at "AT+CGMI?")
-MODELB=$(echo "$OB" | awk -F [:,] '/\+CGMI/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | sed s/"Wireless Inc."//)
-MODEL="$MODELBCUT $MODELA"
-
-OF=$(sms_tool -d $DEVICE at "AT+GMR?")
-FW=$(echo "$OF" | awk -F[,:] '/\+GMR:/ {print $2}' | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-OAA=$(sms_tool -d $DEVICE at "AT+CGSN?")
-NR_IMEI=$(echo "$OAA" | awk -F[,:] '/\+CGSN:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-OBB=$(sms_tool -d $DEVICE at "AT+CIMI?")
-NR_IMSI=$(echo "$OBB" | awk -F [,:] '/\+CIMI:/ {print $2}' | xargs)
-
-# Integrated Circuit Card Identifier (ICCID)
-OCC=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$OCC" | awk -F [,:] '/\+ICCID:/ {print $2}' | xargs)
-
-# Temp
-OT=$(sms_tool -d $DEVICE at "AT+MTSM=1")
-TX=$(echo "$OT" | awk '/\+MTSM:/{print $2}')
-if [ -n "$TX" ]; then
- TEMP="$TX °C"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2cb7 ProdID=0104' '{print $2}' | cut -c-1290)
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70105 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70105
deleted file mode 100644
index eda3685e1..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cb70105
+++ /dev/null
@@ -1,176 +0,0 @@
-# Fibocom modems with ProdID=0105
-# NL952-EAU in ECM mode (LTE CAT18)
-
-O=$(sms_tool -d $DEVICE at "AT+GTCCINFO?;+GTCAINFO?")
-
-if [ "x$MODE" = "xLTE" ]; then
- if [[ "$O" == *"SCC"* ]]; then
- MODE="LTE_A"
- fi
- T1=$(echo "$O" | grep -A 3 'LTE service cell' | grep '1,4,'${COPS_MCC}','${COPS_MNC}',')
- if [ -n "$T1" ]; then
- T=$(echo "$T1" | awk -F, '{print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
- LAC_DEC=""
- LAC_HEX=""
- fi
- T=$(echo "$T1" | awk -F, '{print $7}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $8}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$T1" | awk -F, '{print $9}')
- if [ -n "$T" ]; then
- T=$((T - 100))
- MODE="$MODE | $(band4g $T)"
- PBAND="$(band4g $T "")"
- fi
- T=$(echo "$T1" | awk -F, '{print $11}')
- if [ -n "$T" ]; then
- T2=$(echo "$T" | awk '{printf "%0.1f", $1/2 }')
- SINR=$T2
- fi
- T=$(echo "$T1" | awk -F, '{print $13}')
- if [ -n "$T" ]; then
- RSRP=$((T - 141))
- fi
- T=$(echo "$T1" | awk -F, '{print $14}')
- if [ -n "$T" ]; then
- T2=$(echo "$T" | awk '{printf "%0.1f", ($1-34)/2-3 }')
- RSRQ=$T2
- fi
-
- if [ -n "$CSQ" ]; then
- RSSI=$((2 * $CSQ -113))
- fi
-
-
- fi
-
- T=$(echo "$O" | awk -F[:,] '/^PCC/{print $3}')
- if [ -n "$T" ]; then
- PCI=$T
- fi
- T=$(echo "$O" | awk -F[:,] '/^PCC/{print $4}')
- if [ -n "$T" ]; then
- EARFCN=$T
- fi
-
-IFS="
-"
-
- IDX=1
- LINES=$(echo "$O" | grep -E "^SCC[0-9]: 2")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[:,] '/^SCC'$IDX': 2,./{print $4}')
- T=$((T - 100))
-
- T2=$(band4g $T)
- MODE="$MODE / $T2"
-
- if [ -n "$T" ]; then
-
- case $IDX in
- "1") S1BAND="$T2";;
- "2") S2BAND="$T2";;
- "3") S3BAND="$T2";;
- "4") S4BAND="$T2";;
- *);;
- esac
-
- case $IDX in
- "1") S1PCI="$T";;
- "2") S2PCI="$T";;
- "3") S3PCI="$T";;
- "4") S4PCI="$T";;
- *);;
- esac
-
- fi
-
- T=$(echo "$LINE" | awk -F[:,] '/^SCC'$IDX': 2,./{print $6}')
- if [ -n "$T" ]; then
-
- case $IDX in
- "1") S1EARFCN="$T";;
- "2") S2EARFCN="$T";;
- "3") S3EARFCN="$T";;
- "4") S4EARFCN="$T";;
- *);;
- esac
-
- fi
- IDX=$((IDX + 1))
- done
-
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A /LTE-A /g" | sed 's,/,+,')
-
-# Modem
-OA=$(sms_tool -d $DEVICE at "AT+CGMM?")
-MODELA=$(echo "$OA" | awk -F [:,] '/\+CGMM/{print $2}' | xargs)
-OB=$(sms_tool -d $DEVICE at "AT+CGMI?")
-MODELB=$(echo "$OB" | awk -F [:,] '/\+CGMI/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | sed s/"Wireless Inc."//)
-MODEL="$MODELBCUT $MODELA"
-
-OF=$(sms_tool -d $DEVICE at "AT+GMR?")
-FW=$(echo "$OF" | awk -F[,:] '/\+GMR:/ {print $2}' | xargs)
-
-# International Mobile Equipment Identity (IMEI)
-OAA=$(sms_tool -d $DEVICE at "AT+CGSN?")
-NR_IMEI=$(echo "$OAA" | awk -F[,:] '/\+CGSN:/ {print $2}' | xargs)
-
-# International Mobile Subscriber Identity (IMSI)
-OBB=$(sms_tool -d $DEVICE at "AT+CIMI?")
-NR_IMSI=$(echo "$OBB" | awk -F [,:] '/\+CIMI:/ {print $2}' | xargs)
-
-# Integrated Circuit Card Identifier (ICCID)
-OCC=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_ICCID=$(echo "$OCC" | awk -F [,:] '/\+ICCID:/ {print $2}' | xargs)
-
-# Temp
-OT=$(sms_tool -d $DEVICE at "AT+MTSM=1")
-TM=$(echo "$OT" | awk '/\+MTSM:/{print $2}')
-if [ -n "$TM" ]; then
- TEMP="$TM °C"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-
-TTY=$(basename $DEVICE)
-devpath=$(readlink -f /sys/class/tty/$TTY/device)
-BASE=$(readlink -f ${devpath%/*/*})
-
-NETIF=$(for a in /sys/class/net/*; do readlink -f $a; done | grep "$BASE")
-NETDRV=$(basename $(readlink -f $NETIF/../../driver))
-
-case $NETDRV in
- "qmi_wwan")
- PROTO="QMI";;
- "cdc_mbim")
- PROTO="MBIM";;
- "cdc_ether")
- PROTO="ECM";;
-esac
-
-
-#PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-#PVCUT=$(echo $PV | awk -F 'Vendor=2cb7 ProdID=0105' '{print $2}' | cut -c-1290)
-#if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-#then
-# PROTO="qmi"
-#elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-#then
-# PROTO="mbim"
-#elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-#then
-# PROTO="ecm"
-#fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20001 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20001
deleted file mode 100644
index 8d402d4b0..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20001
+++ /dev/null
@@ -1,88 +0,0 @@
-# Mikrotik R11e-LTE6
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "at+cesq;+zcainfo?;+zpas?;+zcellinfo?")
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" != "99" ] && RSSI="$((T - 111))"
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $4}' | xargs)
-#if [ -n "$T" ]; then
-# [ "$T" != "255" ] && addon 35 "RSCP" "$((T - 121)) dBm"
-#fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $5}' | xargs)
-#if [ -n "$T" ]; then
-# if [ "$T" != "255" ]; then
-# T=$(echo "$T" | awk '{printf "%.1f", -1 * (24.5 - $1 * 0.5)}')
-# addon 36 "ECIO" "$T dB"
-# fi
-#fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $7}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" != "255" ] && RSRP="$((T - 141))"
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $6}' | xargs)
-if [ -n "$T" ]; then
- if [ "$T" != "255" ]; then
- T=$(echo "$T" | awk '{printf "%.1f", -1 * (20 - $1 * 0.5)}')
- RSRQ="$T"
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+ZPAS/ {print $2}' | xargs)
-[ -n "$T" ] && MODE=$T
-
-case "$MODE_NUM" in
- 7*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="$MODE $(band4g ${T/LTE B/})"
- PBAND="$(band4g ${T/LTE B/})"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $3}' | xargs)
- PCI="$T"
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $5}' | xargs)
- EARFCN="$T"
- ;;
- 9*)
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- MODE="$MODE $(band4g ${T/LTE B/})"
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- PBAND="$(band4g ${T/LTE B/})"
- fi
-
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO: /{print $6}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- DBW="$T MHz"
- PBAND="$PBAND @$DBW"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO: /{print $2}' | xargs)
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- PCI="$T"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+ZCAINFO: /{print $5}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- EARFCN="$T"
- fi
-
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO: /{print $13}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- MODE="$MODE / $(band4g ${T})"
- S1BAND="$(band4g ${T})"
- fi
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO: /{print $15}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- S1DBW="$T MHz"
- S1BAND="$S1BAND @$S1DBW"
- fi
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO: /{print $11}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- S1PCI="$T"
- fi
- T=$(echo "$O" | awk -F[,:\;] '/^\+ZCAINFO: /{print $14}')
- if [ -n "$T" ] && [ "$T" != "0" ]; then
- S1EARFCN="$T"
- fi
- ;;
-esac
-
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20004 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20004
deleted file mode 100644
index fb36d61eb..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/2cd20004
+++ /dev/null
@@ -1,101 +0,0 @@
-# Mikrotik R11e-LTE6
-
-O=$(sms_tool -d $DEVICE at "at+cesq;+zcainfo?;+zpas?;+zcellinfo?")
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" != "99" ] && RSSI="$((T - 111))"
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $4}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" != "255" ] && RSCP="$((T - 121))"
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $5}' | xargs)
-if [ -n "$T" ]; then
- if [ "$T" != "255" ]; then
- T=$(echo "$T" | awk '{printf "%.1f", -1 * (24.5 - $1 * 0.5)}')
- ECIO="$T dB"
- fi
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $7}' | xargs)
-if [ -n "$T" ]; then
- [ "$T" != "255" ] && RSRP="$((T - 141))"
-fi
-T=$(echo "$O" | awk -F[,:] '/^\+CESQ/ {print $6}' | xargs)
-if [ -n "$T" ]; then
- if [ "$T" != "255" ]; then
- T=$(echo "$T" | awk '{printf "%.1f", -1 * (20 - $1 * 0.5)}')
- RSRQ="$T"
- SINR=""
- fi
-fi
-
-T=$(echo "$O" | awk -F[,:] '/^\+ZPAS/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- MODE=$T
- T=$(echo "$O" | awk -F[,:] '/^\+ZCELLINFO/ {print $4}' | xargs)
- if [ "x$MODE_NUM" = "x7" ] || [ "x$MODE_NUM" = "x9" ]; then
- MODE="$MODE $(band4g ${T/LTE B/})"
- PBAND="$(band4g ${T/LTE B/})"
- else
- MODE="$MODE $T"
- PBAND="$(band4g ${T})"
- fi
-fi
-
-case "$MODE_NUM" in
- 9*)
- T=$(echo "$O" | awk -F[,] '/^\+ZCAINFO: /{print $11}')
- if [ -n "$T" ]; then
- if [ "$T" != "0" ]; then
- MODE="$MODE / $(band4g ${T})"
- S1BAND="$(band4g ${T})"
- fi
- fi
- ;;
-esac
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed "s/LTE_A/LTE-A | /g")
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR"//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | xargs)
-MODELACUT=$(echo $MODELA | awk -F [:] '/^\+CGMM:/{print $2}' | xargs)
-MODELBCUT=$(echo $MODELB | awk -F [:] '/^\+CGMI:/{print $2}' | xargs)
-MODEL="$MODELBCUT "$MODELACUT
-
-# LAC & TAC
-T_HEX=$LAC_HEX
-T_DEC=$LAC_DEC
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN"//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI"//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT*ICCID?")
-NR_D=$(echo "$O" | awk -F [:] '/^\*ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=2cd2 ProdID=0004' '{print $2}' | cut -c-1220)
-if echo "$PVCUT" | grep -q "Driver=rndis_host"
-then
- PROTO="ncm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81b6 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81b6
deleted file mode 100644
index 8e4c2417e..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81b6
+++ /dev/null
@@ -1,103 +0,0 @@
-# DW5809e Dell Wireless 5809e Gobi 4G LTE Mobile Broadband Card (EM7305)
-# DW5811e Snapdragon X7 LTE (EM7455B)
-# Sierra Wireless EM7455
-
-O=$(sms_tool -d $DEVICE at "at!gstatus?")
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk '/.*TAC:/ {print $5}')
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX="$T"
- fi
-
- T=$(echo "$O" | awk '/^PCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI="$(echo "${T// //}" | sed 's,/.*,,')"
- T=$(echo "$O" | awk '/^PCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP="$(echo "${T// //}" | sed 's,/.*,,')"
- T=$(echo "$O" | awk '/^RSRQ/ {print $3}')
- [ -n "$T" ] && RSRQ="$T"
- T=$(echo "$O" | awk '/^SINR/ {print $3}')
- [ -n "$T" ] && SINR="$T"
-
- T=$(echo "$O" | awk '/^LTE band:/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE band:/ {print $6}')
- PBAND="$(band4g ${T/B/}) @${T1} MHz"
- MODE="$MODE $(band4g ${T/B/})"
- fi
-
- T=$(echo "$O" | awk -F: '/^LTE CA state:.*ACTIVE/ {print $3}')
- if [ -n "$T" ]; then
- T1=$(echo "$O" | awk '/^LTE Scell bw:/ {print $3}')
- if [ -n "$T1" ]; then
- S1BAND="$(band4g ${T/B/}) @${T1#bw:} MHz"
- else
- S1BAND="$(band4g ${T/B/})"
- fi
- MODE="${MODE/LTE/LTE_A} / $(band4g ${T/B/})"
-
- T=$(echo "$O" | awk '/.*LTE Scell chan:/ {print $7}')
- [ -n "$T" ] && EARFCN="${T#chan:}"
-
- T=$(echo "$O" | awk '/^SCC.*RSSI/ {print $4}' | xargs)
- [ -n "$T" ] && RSSI=$(echo "${T// //}" | sed 's,/.*,,')
- T=$(echo "$O" | awk '/^SCC.*RSRP/ {print $7}' | xargs)
- [ -n "$T" ] && RSRP=$(echo "${T// //}" | sed 's,/.*,,')
- fi
-fi
-
-T=$(echo "$O" | awk -F: '/Temperature:/ {print $3}' | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
-fi
-
-MODE=$(echo $MODE | sed "s/LTE_A/LTE-A |/g" | sed 's,/,+,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+CGMR" | tr -s "\n" | xargs)
-FW=$(echo $FWA | sed s/"AT+CGMR "//)
-
-MODELA=$(sms_tool -d $DEVICE at "AT+CGMM" | tr -s "\n" | xargs)
-MODELB=$(sms_tool -d $DEVICE at "AT+CGMI" | tr -s "\n" | xargs)
-
-MODELACUT=$(echo $MODELA | sed s/"AT+CGMM "//)
-MODELBCUT=$(echo $MODELB | sed s/"AT+CGMI "// | cut -f1 -d",")
-MODEL="$MODELBCUT "$MODELACUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID")
-NR_D=$(echo "$O" | awk -F[,:] '/^ICCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCUT=$(echo $PV | awk -F 'Vendor=413c ProdID=81b6' '{print $2}' | cut -c-1290)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81d7 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81d7
deleted file mode 100644
index 2828b6e62..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/413c81d7
+++ /dev/null
@@ -1,221 +0,0 @@
-# DW5821e Snapdragon X20 LTE
-
-
-O=$(sms_tool -d $DEVICE at "at+temp")
-
-T=$(echo "$O" | awk -F: '/xo_therm_buf:/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- TEMP="$T °C"
-else
- O=$(sms_tool -d $DEVICE at "at^temp?")
- T=$(echo "$O" | awk '{gsub("C","");print $2}' | sort -r | head -n 1)
- [ -n "$T" ] && TEMP="$T °C"
-fi
-
-O=$(sms_tool -d $DEVICE at "at^ca_info?;^debug?")
-
-O1=$(echo "$O" | sed -n '/^RAT:/,/^SCell1:/p')
-[ -z "$O1" ] && O1=$(echo "$O" | sed -n '/^EARFCN/,/^SCell1:/p')
-
-T=$(echo "$O1" | awk '/TAC:/ {print $2}')
-if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- T_HEX=$T
-fi
-
-T=$(echo "$O" | awk '/^RSSI:/ {print $2}' | sed 's/dBm//')
-[ -n "$T" ] && RSSI=$T
-T=$(echo "$O" | awk '/^RSRP:/ {print $2}' | sed 's/dBm//')
-[ -n "$T" ] && RSRP=$T
-T=$(echo "$O" | awk '/^RSRQ:/ {print $2}' | sed 's/dB//')
-[ -n "$T" ] && RSRQ=$T
-T=$(echo "$O" | awk '/^RS-SINR/ {print $2}' | sed 's/dB//')
-[ -n "$T" ] && SINR=$T
-T=$(echo "$O" | awk '/^RS-SNR/ {print $2}' | sed 's/dB//')
-[ -n "$T" ] && SINR=$T
-# SNR > SINR
-
-T=$(echo "$O1" | awk '/^BAND:/ {print $2}')
-if [ -n "$T" ]; then
- B=$(band4g $T)
- PBAND="$B"
- MODE="$MODE $B"
-fi
-T=$(echo "$O1" | awk '/^BW:/ {print $2}')
-[ -n "$T" ] && PBAND="$PBAND @$T MHz"
-T=$(echo "$O1" | awk -F[\(\)] '/^eNB ID\(PCI\)/ {print $4}')
-[ -n "$T" ] && PCI="$T"
-T=$(echo "$O1" | awk '/^EARFCN/ {print $2}' | xargs)
-if [ -n "$T" ]; then
- EARFCN="$(echo $T | cut -f1 -d/)"
-# addon 34 "EARFCN DL" "$(echo $T | cut -f1 -d/)"
-# addon 34 "EARFCN UL" "$(echo $T | cut -f2 -d/)"
-fi
-
-T=$(echo "$O" | awk '/^SCC1 info:/ {print $5}')
-if [ -n "$T" ]; then
- T=${T/,/}
- T=${T/LTE_B/}
- S1BAND="$(band4g $T)"
- MODE="${MODE/LTE/LTE_A} / $(band4g $T)"
- T=$(echo "$O" | awk '/^SCC1 info:/ {print $8}')
- [ -n "$T" ] && S1BAND="$S1BAND @$T MHz"
-
- O1=$(echo "$O" | sed -n '/^SCell1:/,/^SCell2:/p')
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $2}')
- [ -n "$T" ] && S1EARFCN="$T"
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $4}' | xargs)
- [ -n "$T" ] && S1PCI="$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $2}' | sed 's/dBm//')
-# [ -n "$T" ] && addon 56 "(S1) RSRP" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $4}' | xargs | sed 's/dB//')
-# [ -n "$T" ] && addon 57 "(S1) RSRQ" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $2}' | sed 's/dBm//')
-# [ -n "$T" ] && addon 55 "(S1) RSSI" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $4}' | xargs | sed 's/dB//')
-# [ -n "$T" ] && addon 58 "(S1) SNR" "$T"
-fi
-
-T=$(echo "$O" | awk '/^SCC2 info:/ {print $5}')
-if [ -n "$T" ]; then
- T=${T/,/}
- T=${T/LTE_B/}
- S2BAND="$(band4g $T)"
- MODE="${MODE} / $(band4g $T)"
- T=$(echo "$O" | awk '/^SCC2 info:/ {print $8}')
- [ -n "$T" ] && S2BAND="$S2BAND @$T MHz"
-
- O1=$(echo "$O" | sed -n '/^SCell2:/,/^SCell3:/p')
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $2}')
- [ -n "$T" ] && S2EARFCN="$T"
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $4}' | xargs)
- [ -n "$T" ] && S2PCI="$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 66 "(S2) RSRP" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 67 "(S2) RSRQ" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 65 "(S2) RSSI" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 68 "(S2) SNR" "$T"
-fi
-
-T=$(echo "$O" | awk '/^SCC3 info:/ {print $5}')
-if [ -n "$T" ]; then
- T=${T/,/}
- T=${T/LTE_B/}
- S3BAND="$(band4g $T)"
- MODE="${MODE} / $(band4g $T)"
- T=$(echo "$O" | awk '/^SCC3 info:/ {print $8}')
- [ -n "$T" ] && S3BAND="$S3BAND @$T MHz"
-
- O1=$(echo "$O" | sed -n '/^SCell3:/,/^SCell4:/p')
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $2}')
- [ -n "$T" ] && S3EARFCN="$T"
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $4}' | xargs)
- [ -n "$T" ] && S3PCI="$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 66 "(S3) RSRP" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 67 "(S3) RSRQ" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 65 "(S3) RSSI" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 68 "(S3) SNR" "$T"
-fi
-
-T=$(echo "$O" | awk '/^SCC4 info:/ {print $5}')
-if [ -n "$T" ]; then
- T=${T/,/}
- T=${T/LTE_B/}
- S4BAND="$(band4g $T)"
- MODE="${MODE} / $(band4g $T)"
- T=$(echo "$O" | awk '/^SCC4 info:/ {print $8}')
- [ -n "$T" ] && S4BAND="$S4BAND @$T MHz"
-
- O1=$(echo "$O" | sed -n '/^SCell4:/,/^SCell5:/p')
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $2}')
- [ -n "$T" ] && S4EARFCN="$T"
- T=$(echo "$O1" | awk -F [:,\ ] '/^EARFCN/{print $4}' | xargs)
- [ -n "$T" ] && S4PCI="$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 66 "(S4) RSRP" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSRP/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 67 "(S4) RSRQ" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $2}' | sed 's/dBm/ dBm/')
-# [ -n "$T" ] && addon 65 "(S4) RSSI" "$T"
- T=$(echo "$O1" | awk -F [:,] '/^RSSI/{print $4}' | xargs | sed 's/dB/ dB/')
-# [ -n "$T" ] && addon 68 "(S4) SNR" "$T"
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,' | sed 's,LTE_A,LTE-A | ,' | sed 's,LTE B,LTE | B,')
-
-# Cell ID & LAC & TAC
-LAC_HEX=$(printf "%X" $LAC_DEC)
-if [ -n "$LAC_DEC" ]; then
- TAC_HEX=$LAC_HEX
-fi
-CID_HEX=$(printf "%X" $CID_DEC)
-
-if [ -z "$TAC_DEC" ]
-then
- [ -n "$TAC_HEX" ] && TAC_DEC=$(echo $((0x$TAC_HEX)))
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices)
-PVCUT=$(echo $PV | awk -F 'Vendor=413c ProdID=81d7' '{print $2}' | cut -c-1520)
-
-if echo "$PVCUT" | grep -q "Driver=qmi_wwan"
-then
- PROTO="qmi"
-elif echo "$PVCUT" | grep -q "Driver=cdc_mbim"
-then
- PROTO="mbim"
-elif echo "$PVCUT" | grep -q "Driver=cdc_ether"
-then
- PROTO="ecm"
-fi
-
-# Modem
-PVMODEL=$(echo $PV | awk -F 'Vendor=413c ProdID=81d7' '{print $2}' | cut -c-150)
-if [ -z "$MODEL" ]
-then
- MODELBCUT=$(echo $PVMODEL | awk -F 'Manufacturer=|S: Product=' '{print $2}' | sed s/"Inc. "// | xargs)
- MODELACUT=$(echo $PVMODEL | awk -F 'Product=| S: SerialNumber' '{print $2}'| xargs)
- MODEL="$MODELBCUT "$MODELACUT
-# MODELC="$MODELBCUT "$MODELACUT
-# MODEL=$(echo "$MODELC" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}' | tr -d '\r\n')
-fi
-
-# FW
-OF=$(sms_tool -d $DEVICE at "ati")
-DEV2=$(echo $OF | tr -s "\n" | xargs)
-FW=$(echo $DEV2 | awk -F 'Revision: | IMEI: ' '{print $2}' | cut -c-50)
-
-T=$(echo "$O" | awk -F ': ' '/ICCID:/ {print $2}')
-if [ -n "$T" ]; then
- NR_ICCID="$T"
-fi
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+GSN" | xargs)
-NR_I=$(echo "$O")
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O")
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+ICCID" | xargs)
-NR_D=$(echo "$O" | awk -F [:] '/^\ICCID:/{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/808707f9 b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/808707f9
deleted file mode 100644
index b8d59deb7..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/808707f9
+++ /dev/null
@@ -1,488 +0,0 @@
-# Fibocom L860
-
-bandwidth() {
- case $1 in
- 0) echo "1.4";;
- 1) echo "3";;
- 2) echo "5";;
- 3) echo "10";;
- 4) echo "15";;
- 5) echo "20";;
- *) echo "";;
- esac
-}
-
-channeltoband()
-{
- if [ $1 -ge 0 ] && [ $1 -le 599 ]; then
- echo "1"
- elif [ $1 -ge 600 ] && [ $1 -le 1199 ]; then
- echo "2"
- elif [ $1 -ge 1200 ] && [ $1 -le 1949 ]; then
- echo "3"
- elif [ $1 -ge 1950] && [ $1 -le 2399 ]; then
- echo "4"
- elif [ $1 -ge 2400] && [ $1 -le 2469 ]; then
- echo "5"
- elif [ $1 -ge 2750 ] && [ $1 -le 3449 ]; then
- echo "7"
- elif [ $1 -ge 3450 ] && [ $1 -le 3799 ]; then
- echo "8"
- elif [ $1 -ge 6150 ] && [ $1 -le 6449 ]; then
- echo "20"
- elif [ $1 -ge 9210 ] && [ $1 -le 9659 ]; then
- echo "28"
- elif [ $1 -ge 9870 ] && [ $1 -le 9919 ]; then
- echo "31"
- elif [ $1 -ge 37750 ] && [ $1 -le 38249 ]; then
- echo "38"
- elif [ $1 -ge 38650 ] && [ $1 -le 39649 ]; then
- echo "40"
- else
- echo "0"
- fi
-}
-
-
-O=$(sms_tool -d $DEVICE at "AT+MTSM=1")
-
-T=$(echo "$O" | awk -F: '/^\+MTSM:/ {print $2}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "AT+XLEC?;+XMCI=1;+XCCINFO=1;+XCCINFO?")
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+XCCINFO:/{print $11}' | xargs)
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- fi
-
- PB=""
- S1B=""
- S2B=""
- S3B=""
- S4B=""
- BWP=""
- BWS1=""
- BWS2=""
- BWS3=""
- BWS4=""
-
- CELLS=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $3}')
- [ -z "$CELLS" ] && CELLS=0
- case $CELLS in
-
- "1")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- ;;
- "2")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$(band4g ${T/BAND_LTE_/})"
- else
- PBAND="$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- ;;
- "3")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$(band4g ${T/BAND_LTE_/})"
- else
- PBAND="$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- ;;
- "4")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- BWS3=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S3B=$(band4g $T)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- ;;
- "5")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- BWS3=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- BWS4=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="S2B"
- else
- S2BAND="S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $12}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S3B=$(band4g $T)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $13}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S4B=$(band4g $T)
- if [ -z "$BWS4" ]; then
- S4BAND="$S4B"
- else
- S4BAND="$S4B @${BWS4} MHz"
- fi
- MODE="$MODE / $S4B"
- fi
- ;;
- esac
-
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $7}' | xargs)
- if [ -n "$T" ]; then
- PCI="$(printf "%d" "$T")"
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $8}' | xargs)
- if [ "$T" != "0xFFFFFFFF" ]; then
- # EARFCN DL
- EARFCN="$(printf "%d" "$T")"
- if [ -z "$PB" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- PB=$(band4g $T1)
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $9}' | xargs)
-# [ "$T" != "0xFFFFFFFF" ] && addon 34 "EARFCN UL" "$(printf "%d" "$T")"
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $11}')
- if [ "$T" != "255" ]; then
- RSRP="$((-141 + T))"
- N=""
- case $BWP in
- "1.4") N=6;;
- "3") N=15;;
- "5") N=25;;
- "10") N=50;;
- "15") N=75;;
- "20") N=100;;
- esac
- if [ -n "$N" ]; then
- RSSI=$(echo "$((-141 + T)) $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- CSQ_PER=$(((RSSI + 113) * 100 / 62))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $12}')
- [ "$T" != "255" ] && RSRQ="$((-20 + T/2))"
- # SNR
-# T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-# [ "$T" != "255" ] && SNR="$T"
- # SINR
- SINR=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.0f\n", $13/4+5}')
- fi
-
-IFS="
-"
-
- IDX=1
- LINES=$(echo "$O" | grep "+XMCI: 5")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $7}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$(printf "%d" "$T")";;
- 2) S2PCI="$(printf "%d" "$T")";;
- 3) S3PCI="$(printf "%d" "$T")";;
- 4) S4PCI="$(printf "%d" "$T")";;
- *) ;;
- esac
- T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $8}' | xargs)
- if [ "$T" != "0xFFFFFFFF" ]; then
- # EARFCN DL
- case $IDX in
- 1) S1EARFCN="$(printf "%d" "$T")";;
- 2) S2EARFCN="$(printf "%d" "$T")";;
- 3) S3EARFCN="$(printf "%d" "$T")";;
- 4) S4EARFCN="$(printf "%d" "$T")";;
- *) ;;
- esac
- case $IDX in
- 1)
- if [ -z "$S1B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S1B=$(band4g $T1)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- ;;
- 2)
- if [ -z "$S2B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S2B=$(band4g $T1)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- ;;
- 3)
- if [ -z "$S3B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S3B=$(band4g $T1)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- ;;
- 4)
- if [ -z "$S4B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S4B=$(band4g $T1)
- if [ -z "$BWS4" ]; then
- S4BAND="$S4B"
- else
- S4BAND="$S4B @${BWS4} MHz"
- fi
- MODE="$MODE / $S4B"
- fi
- ;;
- esac
- fi
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $9}' | xargs)
-# [ "$T" != "0xFFFFFFFF" ] && addon $((POS + 4)) "(S${IDX}) EARFCN UL" "$(printf "%d" "$T")"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $11}')
-# [ "$T" != "255" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$((-141 + T)) dBm"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $12}')
-# [ "$T" != "255" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$((-20 + T/2)) dB"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-# [ "$T" != "255" ] && addon $((POS + 8)) "(S${IDX}) SNR" "$T dB"
- IDX=$((IDX + 1))
- [ $IDX -ge $CELLS ] && break
- POS=$((POS + 10))
- fi
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GTPKGVER?" | xargs)
-FW=$(echo "$FWA" | cut -d ":" -f2 | xargs)
-
-MDL=$(sms_tool -d $DEVICE at "AT+GMM?" | xargs)
-MODELM=$(echo "$MDL" | cut -d ':' -f2 | cut -d ',' -f1 | awk -F'"' '{print $1}')
-MODELF=$(sms_tool -d $DEVICE at "AT+CGMI" | xargs)
-
-MODELMCUT=$(echo $MODELM)
-MODELFCUT=$(echo $MODELF | sed s/"AT+CGMI "//)
-MODEL="$MODELFCUT "$MODELMCUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+CCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+CCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCAX=$(echo $PV | awk -F"Vendor=8087 ProdID=07f9" '{print $2}')
-PVCA=$(echo "$PVCAX" | cut -c-2453)
-PVCBX=$(echo $PV | awk -F"Vendor=8087 ProdID=095a" '{print $2}')
-PVCB=$(echo "$PVCBX" | cut -c-2453)
-
-if [ -n "$PVCA" ]; then
- case $PVCA in
- *"Driver=qmi_wwan"*)
- PROTO="qmi"
- ;;
- *"Driver=cdc_ncm"*)
- PROTO="ncm"
- ;;
- *"Driver=cdc_mbim"*)
- PROTO="mbim"
- ;;
- *"Driver=cdc_ether"*)
- PROTO="ecm"
- ;;
- esac
-fi
-
-if [ -n "$PVCB" ]; then
- case $PVCB in
- *"Driver=qmi_wwan"*)
- PROTO="qmi"
- ;;
- *"Driver=cdc_ncm"*)
- PROTO="ncm"
- ;;
- *"Driver=cdc_mbim"*)
- PROTO="mbim"
- ;;
- *"Driver=cdc_ether"*)
- PROTO="ecm"
- ;;
- esac
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/8087095a b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/8087095a
deleted file mode 100644
index b8d59deb7..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/modem/usb/8087095a
+++ /dev/null
@@ -1,488 +0,0 @@
-# Fibocom L860
-
-bandwidth() {
- case $1 in
- 0) echo "1.4";;
- 1) echo "3";;
- 2) echo "5";;
- 3) echo "10";;
- 4) echo "15";;
- 5) echo "20";;
- *) echo "";;
- esac
-}
-
-channeltoband()
-{
- if [ $1 -ge 0 ] && [ $1 -le 599 ]; then
- echo "1"
- elif [ $1 -ge 600 ] && [ $1 -le 1199 ]; then
- echo "2"
- elif [ $1 -ge 1200 ] && [ $1 -le 1949 ]; then
- echo "3"
- elif [ $1 -ge 1950] && [ $1 -le 2399 ]; then
- echo "4"
- elif [ $1 -ge 2400] && [ $1 -le 2469 ]; then
- echo "5"
- elif [ $1 -ge 2750 ] && [ $1 -le 3449 ]; then
- echo "7"
- elif [ $1 -ge 3450 ] && [ $1 -le 3799 ]; then
- echo "8"
- elif [ $1 -ge 6150 ] && [ $1 -le 6449 ]; then
- echo "20"
- elif [ $1 -ge 9210 ] && [ $1 -le 9659 ]; then
- echo "28"
- elif [ $1 -ge 9870 ] && [ $1 -le 9919 ]; then
- echo "31"
- elif [ $1 -ge 37750 ] && [ $1 -le 38249 ]; then
- echo "38"
- elif [ $1 -ge 38650 ] && [ $1 -le 39649 ]; then
- echo "40"
- else
- echo "0"
- fi
-}
-
-
-O=$(sms_tool -d $DEVICE at "AT+MTSM=1")
-
-T=$(echo "$O" | awk -F: '/^\+MTSM:/ {print $2}' | xargs)
-[ -n "$T" ] && TEMP="$T °C"
-
-if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "AT+XLEC?;+XMCI=1;+XCCINFO=1;+XCCINFO?")
-
-if [ "x$MODE_NUM" = "x7" ]; then
- T=$(echo "$O" | awk -F[,:] '/^\+XCCINFO:/{print $11}' | xargs)
- if [ -n "$T" ]; then
- T_DEC=$(printf "%d" "0x$T")
- fi
-
- PB=""
- S1B=""
- S2B=""
- S3B=""
- S4B=""
- BWP=""
- BWS1=""
- BWS2=""
- BWS3=""
- BWS4=""
-
- CELLS=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $3}')
- [ -z "$CELLS" ] && CELLS=0
- case $CELLS in
-
- "1")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- ;;
- "2")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$(band4g ${T/BAND_LTE_/})"
- else
- PBAND="$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- ;;
- "3")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$(band4g ${T/BAND_LTE_/})"
- else
- PBAND="$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- ;;
- "4")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- BWS3=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S3B=$(band4g $T)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- ;;
- "5")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
- BWP=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
- BWS1=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
- BWS2=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
- BWS3=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
- BWS4=$(bandwidth "$T")
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- PB=$(band4g ${T/BAND_LTE_/})
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S1B=$(band4g $T)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S2B=$(band4g $T)
- if [ -z "$BWS2" ]; then
- S2BAND="S2B"
- else
- S2BAND="S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $12}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S3B=$(band4g $T)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $13}')
- if [ -n "$T" ] && [ "x$T" != "x0" ]; then
- S4B=$(band4g $T)
- if [ -z "$BWS4" ]; then
- S4BAND="$S4B"
- else
- S4BAND="$S4B @${BWS4} MHz"
- fi
- MODE="$MODE / $S4B"
- fi
- ;;
- esac
-
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $7}' | xargs)
- if [ -n "$T" ]; then
- PCI="$(printf "%d" "$T")"
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $8}' | xargs)
- if [ "$T" != "0xFFFFFFFF" ]; then
- # EARFCN DL
- EARFCN="$(printf "%d" "$T")"
- if [ -z "$PB" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- PB=$(band4g $T1)
- if [ -z "$BWP" ]; then
- PBAND="$PB"
- else
- PBAND="$PB @${BWP} MHz"
- fi
- MODE="$MODE $PB"
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $9}' | xargs)
-# [ "$T" != "0xFFFFFFFF" ] && addon 34 "EARFCN UL" "$(printf "%d" "$T")"
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $11}')
- if [ "$T" != "255" ]; then
- RSRP="$((-141 + T))"
- N=""
- case $BWP in
- "1.4") N=6;;
- "3") N=15;;
- "5") N=25;;
- "10") N=50;;
- "15") N=75;;
- "20") N=100;;
- esac
- if [ -n "$N" ]; then
- RSSI=$(echo "$((-141 + T)) $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
- if [ -n "$RSSI" ]; then
- [ $RSSI -lt -113 ] && RSSI="-113"
- [ $RSSI -gt -51 ] && RSSI="-51"
- RSSI="$RSSI"
- CSQ_PER=$(((RSSI + 113) * 100 / 62))
- fi
- fi
- fi
- T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $12}')
- [ "$T" != "255" ] && RSRQ="$((-20 + T/2))"
- # SNR
-# T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-# [ "$T" != "255" ] && SNR="$T"
- # SINR
- SINR=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.0f\n", $13/4+5}')
- fi
-
-IFS="
-"
-
- IDX=1
- LINES=$(echo "$O" | grep "+XMCI: 5")
- for LINE in $LINES; do
- T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $7}' | xargs)
- if [ -n "$T" ]; then
- case $IDX in
- 1) S1PCI="$(printf "%d" "$T")";;
- 2) S2PCI="$(printf "%d" "$T")";;
- 3) S3PCI="$(printf "%d" "$T")";;
- 4) S4PCI="$(printf "%d" "$T")";;
- *) ;;
- esac
- T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $8}' | xargs)
- if [ "$T" != "0xFFFFFFFF" ]; then
- # EARFCN DL
- case $IDX in
- 1) S1EARFCN="$(printf "%d" "$T")";;
- 2) S2EARFCN="$(printf "%d" "$T")";;
- 3) S3EARFCN="$(printf "%d" "$T")";;
- 4) S4EARFCN="$(printf "%d" "$T")";;
- *) ;;
- esac
- case $IDX in
- 1)
- if [ -z "$S1B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S1B=$(band4g $T1)
- if [ -z "$BWS1" ]; then
- S1BAND="$S1B"
- else
- S1BAND="$S1B @${BWS1} MHz"
- fi
- MODE="${MODE/LTE/LTE_A} / $S1B"
- fi
- ;;
- 2)
- if [ -z "$S2B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S2B=$(band4g $T1)
- if [ -z "$BWS2" ]; then
- S2BAND="$S2B"
- else
- S2BAND="$S2B @${BWS2} MHz"
- fi
- MODE="$MODE / $S2B"
- fi
- ;;
- 3)
- if [ -z "$S3B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S3B=$(band4g $T1)
- if [ -z "$BWS3" ]; then
- S3BAND="$S3B"
- else
- S3BAND="$S3B @${BWS3} MHz"
- fi
- MODE="$MODE / $S3B"
- fi
- ;;
- 4)
- if [ -z "$S4B" ]; then
- T1=$(channeltoband $(printf "%d" "$T"))
- S4B=$(band4g $T1)
- if [ -z "$BWS4" ]; then
- S4BAND="$S4B"
- else
- S4BAND="$S4B @${BWS4} MHz"
- fi
- MODE="$MODE / $S4B"
- fi
- ;;
- esac
- fi
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $9}' | xargs)
-# [ "$T" != "0xFFFFFFFF" ] && addon $((POS + 4)) "(S${IDX}) EARFCN UL" "$(printf "%d" "$T")"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $11}')
-# [ "$T" != "255" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$((-141 + T)) dBm"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $12}')
-# [ "$T" != "255" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$((-20 + T/2)) dB"
-# T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-# [ "$T" != "255" ] && addon $((POS + 8)) "(S${IDX}) SNR" "$T dB"
- IDX=$((IDX + 1))
- [ $IDX -ge $CELLS ] && break
- POS=$((POS + 10))
- fi
- done
-fi
-
-fi
-
-MODE=$(echo $MODE | sed 's,/,+,')
-
-# Modem
-FWA=$(sms_tool -d $DEVICE at "AT+GTPKGVER?" | xargs)
-FW=$(echo "$FWA" | cut -d ":" -f2 | xargs)
-
-MDL=$(sms_tool -d $DEVICE at "AT+GMM?" | xargs)
-MODELM=$(echo "$MDL" | cut -d ':' -f2 | cut -d ',' -f1 | awk -F'"' '{print $1}')
-MODELF=$(sms_tool -d $DEVICE at "AT+CGMI" | xargs)
-
-MODELMCUT=$(echo $MODELM)
-MODELFCUT=$(echo $MODELF | sed s/"AT+CGMI "//)
-MODEL="$MODELFCUT "$MODELMCUT
-
-# International Mobile Equipment Identity (IMEI)
-O=$(sms_tool -d $DEVICE at "AT+CGSN" | xargs)
-NR_I=$(echo "$O" | sed s/"AT+CGSN "//)
-if [ -n "$NR_I" ]; then
- NR_IMEI="$NR_I"
-fi
-
-# International Mobile Subscriber Identity (IMSI)
-O=$(sms_tool -d $DEVICE at "AT+CIMI" | xargs)
-NR_C=$(echo "$O" | sed s/"AT+CIMI "//)
-if [ -n "$NR_C" ]; then
- NR_IMSI="$NR_C"
-fi
-
-# Integrated Circuit Card Identifier (ICCID)
-O=$(sms_tool -d $DEVICE at "AT+CCID")
-NR_D=$(echo "$O" | awk -F [:] '/^\+CCID: /{print $2}' | xargs)
-if [ -n "$NR_D" ]; then
- NR_ICCID="$NR_D"
-fi
-
-# Protocol
-# DRIVER=QMI_WWAN & DRIVER=CDC_MBIM & DRIVER=CDC_ETHER
-PV=$(cat /sys/kernel/debug/usb/devices 2>/dev/null)
-PVCAX=$(echo $PV | awk -F"Vendor=8087 ProdID=07f9" '{print $2}')
-PVCA=$(echo "$PVCAX" | cut -c-2453)
-PVCBX=$(echo $PV | awk -F"Vendor=8087 ProdID=095a" '{print $2}')
-PVCB=$(echo "$PVCBX" | cut -c-2453)
-
-if [ -n "$PVCA" ]; then
- case $PVCA in
- *"Driver=qmi_wwan"*)
- PROTO="qmi"
- ;;
- *"Driver=cdc_ncm"*)
- PROTO="ncm"
- ;;
- *"Driver=cdc_mbim"*)
- PROTO="mbim"
- ;;
- *"Driver=cdc_ether"*)
- PROTO="ecm"
- ;;
- esac
-fi
-
-if [ -n "$PVCB" ]; then
- case $PVCB in
- *"Driver=qmi_wwan"*)
- PROTO="qmi"
- ;;
- *"Driver=cdc_ncm"*)
- PROTO="ncm"
- ;;
- *"Driver=cdc_mbim"*)
- PROTO="mbim"
- ;;
- *"Driver=cdc_ether"*)
- PROTO="ecm"
- ;;
- esac
-fi
diff --git a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/vendorproduct.gcom b/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/vendorproduct.gcom
deleted file mode 100644
index 8863262e2..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/3ginfo-lite/vendorproduct.gcom
+++ /dev/null
@@ -1,91 +0,0 @@
-opengt
- set com 115200n81
- set comecho off
- set senddelay 0.01
- waitquiet 0.01 0.01
-
- let $c="ATE0;+CGMI^m"
- let $r="+CGMI:"
- gosub readatcmdfl
-
- let $c="AT+CGMM^m"
- let $r="+CGMM:"
- gosub readatcmdfl
-
- let $c="AT+CGMR^m"
- let $r="+CGMR:"
- gosub readatcmdfl
- let $c="AT+GMR^m"
- let $r="+GMR:"
- gosub readatcmdfl
-
- let $c="AT+CGSN^m"
- let $r="+CGSN:"
- gosub readatcmdfl
-
- let $c="AT+CIMI^m"
- let $r="+CIMI:"
- gosub readatcmdfl
-
- let $c="AT\^ICCID?^m"
- gosub readatcmd
- let $c="AT+ICCID^m"
- gosub readatcmd
- let $c="AT+QCCID^m"
- gosub readatcmd
- let $c="AT#CCID^m"
- gosub readatcmd
- let $c="AT!ICCID?^m"
- gosub readatcmd
- let $c="AT*ICCID?^m"
- gosub readatcmd
- let $c="AT+CCID^m"
- gosub readatcmd
-
- exit 0
-
-:readatcmd
- let i=15
- send $c
-:loop
- get 0.1 "^m" $s
- if len($s) < 2 goto loop2
- if $mid($s,1,2) = "ER" goto loop1
- if $mid($s,1,2) = "OK" goto loop2
- if $mid($s,1,2) = "AT" goto loop2
- print $s,"\n"
- exit 0
-
-:loop1
- return
-
-:loop2
- if i = 0 return
- let i=i-1
- goto loop
-
-:readatcmdfl
- let i=15
- send $c
-:loop3
- get 0.1 "^m" $s
- if len($s) < 2 goto loop5
- let f=0
- if $mid($s,0,1) ="\n" let f=1
- if $mid($s,f,2) = "ER" goto loop4
- if $mid($s,f,2) = "OK" goto loop5
- if $mid($s,f,2) = "AT" goto loop5
- if $mid($s,f,1) = "\^" goto loop5
- if $mid($s,f,1) = "#" goto loop5
- let l=len($s)
- let $s=$mid($s,f,l)
- print $r,$s,"\n"
- return
-
-:loop4
- return
-
-:loop5
- if i = 0 return
- let i=i-1
- goto loop3
diff --git a/luci-app-3ginfo-lite/root/usr/share/luci/menu.d/luci-app-3ginfo-lite.json b/luci-app-3ginfo-lite/root/usr/share/luci/menu.d/luci-app-3ginfo-lite.json
deleted file mode 100644
index c854cb0f0..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/luci/menu.d/luci-app-3ginfo-lite.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "admin/modem": {
- "title": "Modem",
- "order": 30,
- "action": {
- "type": "firstchild",
- "recurse": true
- }
- },
-
- "admin/modem/3ginfo-lite": {
- "title": "Information about 3G/4G/5G connection",
- "order": 10,
- "action": {
- "type": "alias",
- "path": "admin/modem/3ginfo-lite/3gdetail"
- },
- "depends": {
- "acl": [ "luci-app-3ginfo-lite" ],
- "uci": { "3ginfo": true }
- }
- },
-
- "admin/modem/3ginfo-lite/3gdetail": {
- "title": "Details",
- "order": 10,
- "action": {
- "type": "view",
- "path": "modem/3gdetail"
- }
- },
-
- "admin/modem/3ginfo-lite/3gdebug": {
- "title": "Diagnostics",
- "order": 20,
- "action": {
- "type": "view",
- "path": "modem/3gdebug"
- }
- },
-
- "admin/modem/3ginfo-lite/3gconfig": {
- "title": "Configuration",
- "order": 30,
- "action": {
- "type": "view",
- "path": "modem/3gconfig"
- }
- }
-}
diff --git a/luci-app-3ginfo-lite/root/usr/share/rpcd/acl.d/luci-app-3ginfo-lite.json b/luci-app-3ginfo-lite/root/usr/share/rpcd/acl.d/luci-app-3ginfo-lite.json
deleted file mode 100644
index 2b1493de4..000000000
--- a/luci-app-3ginfo-lite/root/usr/share/rpcd/acl.d/luci-app-3ginfo-lite.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "luci-app-3ginfo-lite": {
- "description": "Grant access to LuCI app 3ginfo-lite",
- "read": {
- "cgi-io": [ "exec" ],
- "file": {
- "/usr/share/3ginfo-lite/3ginfo.sh": [ "exec" ],
- "/usr/share/3ginfo-lite/detect.sh": [ "exec" ],
- "/usr/share/3ginfo-lite/check.gcom": [ "exec" ],
- "/usr/share/3ginfo-lite/info.gcom": [ "exec" ],
- "/etc/modemdefine": [ "read" ],
- "/etc/3ginfo": [ "read" ],
- "/sys/kernel/debug/usb/devices": [ "read" ]
- },
- "uci": [ "3ginfo" ]
- },
- "write": {
- "file": {
- "/bin/cat": [ "exec" ],
- "/bin/sh -x /usr/share/3ginfo-lite/3ginfo.sh": [ "exec" ],
- "/bin/ls /dev": [ "exec" ],
- "/etc/modemdefine": [ "write" ],
- "/tmp/debug_result.txt": [ "write" ],
- "/etc/3ginfo": [ "write" ]
- },
- "uci": [ "3ginfo" ]
- }
- }
-}
diff --git a/luci-app-at-socat/LICENSE b/luci-app-at-socat/LICENSE
deleted file mode 100644
index f288702d2..000000000
--- a/luci-app-at-socat/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/luci-app-at-socat/Makefile b/luci-app-at-socat/Makefile
deleted file mode 100644
index 9fa174399..000000000
--- a/luci-app-at-socat/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Copyright 2024 Rafał Wabik - IceG - From eko.one.pl forum
-#
-# Licensed to the GNU General Public License v3.0.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=luci-app-at-socat
-LUCI_TITLE:=LuCI JS Support for sending at commands using socat
-MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
-LUCI_DESCRIPTION:=LuCI JS interface for sending at commands using socat.
-LUCI_DEPENDS:=+socat
-LUCI_PKGARCH:=all
-PKG_VERSION:=1.0.2
-PKG_RELEASE:=1
-
-define Package/$(PKG_NAME)/conffiles
-/etc/modem/atsocatcommands.user
-endef
-
-include $(TOPDIR)/feeds/luci/luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatcommands.js b/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatcommands.js
deleted file mode 100644
index d33ad69d7..000000000
--- a/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatcommands.js
+++ /dev/null
@@ -1,177 +0,0 @@
-'use strict';
-'require dom';
-'require form';
-'require fs';
-'require ui';
-'require uci';
-'require view';
-
-/*
- Copyright 2024 Rafał Wabik - IceG - From eko.one.pl forum
-
- Licensed to the GNU General Public License v3.0.
-*/
-
-return view.extend({
- handleCommand: function(exec, args) {
- var buttons = document.querySelectorAll('.cbi-button');
-
- for (var i = 0; i < buttons.length; i++)
- buttons[i].setAttribute('disabled', 'true');
-
- return fs.exec(exec, args).then(function(res) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = '';
-
- //res.stdout = res.stdout?.replace(/^\s*\n/gm, "") || '';
- res.stdout = res.stdout?.split(/\r?\n/).filter(line => line.trim() !== '').join('\n') || '';
- res.stderr = res.stderr?.split(/\r?\n/).filter(line => line.trim() !== '').join('\n') || '';
-
- dom.content(out, [ res.stdout || '', res.stderr || '' ]);
-
- }).catch(function(err) {
- ui.addNotification(null, E('p', [ err ]))
- }).finally(function() {
- for (var i = 0; i < buttons.length; i++)
- buttons[i].removeAttribute('disabled');
-
- });
- },
-
- handleGo: function(ev) {
-
- var port, atcmd = document.getElementById('cmdvalue').value;
- var sections = uci.sections('atsocat');
- var port = sections[0].set_port;
-
- if ( atcmd.length < 2 )
- {
- ui.addNotification(null, E('p', _('Please specify the AT command to send')), 'info');
- return false;
- }
- else {
-
- if ( !port )
- {
- ui.addNotification(null, E('p', _('Please set the port for communication with the modem')), 'info');
- return false;
- }
- else {
- return this.handleCommand('/usr/bin/luci-app-at-socat', [ atcmd, port ]);
- }
- }
-
- if ( !port )
- {
- ui.addNotification(null, E('p', _('Please set the port for communication with the modem')), 'info');
- return false;
- }
-
- },
-
- handleClear: function(ev) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = 'none';
-
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
-
- document.getElementById('cmdvalue').focus();
- },
-
- handleCopy: function(ev) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = 'none';
-
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
- var x = document.getElementById('tk').value;
- ov.value = x;
- },
-
- load: function() {
- return Promise.all([
- L.resolveDefault(fs.read_direct('/etc/modem/atsocatcommands.user'), null),
- uci.load('atsocat')
- ]);
- },
-
- render: function (loadResults) {
-
- return E('div', { 'class': 'cbi-map', 'id': 'map' }, [
- E('h2', {}, [ _('AT Commands') ]),
- E('div', { 'class': 'cbi-map-descr'}, _('User interface for sending AT commands using socat utility.')),
- E('hr'),
- E('div', { 'class': 'cbi-section' }, [
- E('div', { 'class': 'cbi-section-node' }, [
- E('div', { 'class': 'cbi-value' }, [
- E('label', { 'class': 'cbi-value-title' }, [ _('User AT commands') ]),
- E('div', { 'class': 'cbi-value-field' }, [
- E('select', { 'class': 'cbi-input-select',
- 'id': 'tk',
- 'style': 'margin:5px 0; width:100%;',
- 'change': ui.createHandlerFn(this, 'handleCopy'),
- 'mousedown': ui.createHandlerFn(this, 'handleCopy')
- },
- (loadResults[0] || "").trim().split("\n").map(function(cmd) {
- var fields = cmd.split(/;/);
- var name = fields[0];
- var code = fields[1];
- return E('option', { 'value': code }, name ) })
- )
- ])
- ]),
- E('div', { 'class': 'cbi-value' }, [
- E('label', { 'class': 'cbi-value-title' }, [ _('Command to send') ]),
- E('div', { 'class': 'cbi-value-field' }, [
- E('input', {
- 'style': 'margin:5px 0; width:100%;',
- 'type': 'text',
- 'id': 'cmdvalue',
- 'data-tooltip': _('Press [Enter] to send the command, press [Delete] to delete the command'),
- 'keydown': function(ev) {
- if (ev.keyCode === 13)
- {
- var execBtn = document.getElementById('execute');
- if (execBtn)
- execBtn.click();
- }
- if (ev.keyCode === 46)
- {
- var del = document.getElementById('cmdvalue');
- if (del)
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
- document.getElementById('cmdvalue').focus();
- }
- }
- }),
- ])
- ]),
-
- ])
- ]),
- E('hr'),
- E('div', { 'class': 'right' }, [
- E('button', {
- 'class': 'cbi-button cbi-button-remove',
- 'id': 'clr',
- 'click': ui.createHandlerFn(this, 'handleClear')
- }, [ _('Clear form') ]),
- '\xa0\xa0\xa0',
- E('button', {
- 'class': 'cbi-button cbi-button-action important',
- 'id': 'execute',
- 'click': ui.createHandlerFn(this, 'handleGo')
- }, [ _('Send command') ]),
- ]),
- E('p', _('Reply')),
- E('pre', { 'class': 'atcommand-output', 'id': 'preout', 'style': 'display:none; border: 1px solid var(--border-color-medium); border-radius: 5px; font-family: monospace' }),
-
- ]);
- },
-
- handleSaveApply: null,
- handleSave: null,
- handleReset: null
-})
diff --git a/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatconfig.js b/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatconfig.js
deleted file mode 100644
index 48379483d..000000000
--- a/luci-app-at-socat/htdocs/luci-static/resources/view/modem/atsocatconfig.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-'require form';
-'require fs';
-'require view';
-'require uci';
-'require ui';
-'require tools.widgets as widgets'
-
-/*
- Copyright 2024 Rafał Wabik - IceG - From eko.one.pl forum
-
- Licensed to the GNU General Public License v3.0.
-*/
-
-return view.extend({
- load: function() {
- return fs.list('/dev').then(function(devs) {
- return devs.filter(function(dev) {
- return dev.name.match(/^ttyUSB/) || dev.name.match(/^cdc-wdm/) || dev.name.match(/^ttyACM/) || dev.name.match(/^mhi_/) || dev.name.match(/^wwan/);
- });
- });
- },
-
- render: function(devs) {
- var m, s, o;
- m = new form.Map('atsocat', _('Configuration socat'), _('Configuration panel for socat.'));
-
- s = m.section(form.TypedSection, 'atsocat', '', _(''));
- s.anonymous = true;
-
- o = s.option(form.Value, 'set_port', _('Port for communication with the modem'),
- _("Select one of the available ttyUSBX ports."));
- devs.sort((a, b) => a.name > b.name);
- devs.forEach(dev => o.value('/dev/' + dev.name));
-
- o.placeholder = _('Please select a port');
- o.rmempty = false;
-
- o = s.option(form.TextValue, '_tmpl', _('User AT commands'),
- _("Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atsocatcommands.user."));
- o.rows = 20;
- o.cfgvalue = function(section_id) {
- return fs.trimmed('/etc/modem/atsocatcommands.user');
- };
- o.write = function(section_id, formvalue) {
- return fs.write('/etc/modem/atsocatcommands.user', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
- };
-
- return m.render();
- }
-});
diff --git a/luci-app-at-socat/po/pl/atsocat.po b/luci-app-at-socat/po/pl/atsocat.po
deleted file mode 100644
index 25116089e..000000000
--- a/luci-app-at-socat/po/pl/atsocat.po
+++ /dev/null
@@ -1,53 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "AT Commands"
-msgstr "Polecenia AT"
-
-msgid "Configuration"
-msgstr "Konfiguracja"
-
-msgid "Please specify the AT command to send"
-msgstr "Proszę podać polecenie AT do wysłania"
-
-msgid "Please set the port for communication with the modem"
-msgstr "Proszę podać port do komunikacji z modemem"
-
-msgid "User AT commands"
-msgstr "Polecenia AT użytkownika"
-
-msgid "Command to send"
-msgstr "Polecenie do wysłania"
-
-msgid "Clear form"
-msgstr "Wyczyść formularz"
-
-msgid "Send command"
-msgstr "Wyślij polecenie"
-
-msgid "Reply"
-msgstr "Odpowiedź"
-
-msgid "User interface for sending AT commands using socat utility."
-msgstr "Interfejs użytkownika do wysyłania poleceń AT za pomocą socat."
-
-msgid "Configuration socat"
-msgstr "Konfiguracja socat"
-
-msgid "Configuration panel for socat."
-msgstr "Panel ustawień dla programu socat oraz dla interfejsu użytkownika."
-
-msgid "Port for communication with the modem"
-msgstr "Port do komunikacji z modemem"
-
-msgid "Select one of the available ttyUSBX ports."
-msgstr "Wybierz jeden z dostępnych portów ttyUSBX."
-
-msgid "Please select a port"
-msgstr "Proszę wybrać port"
-
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atsocatcommands.user."
-msgstr "Każda linijka powinna mieć następujący format: 'Opis polecenia AT;polecenie AT'. Dla wygody użytkownika polecenia zapisywane są w pliku /etc/modem/atsocatcommands.user."
-
-msgid "Press [Enter] to send the command, press [Delete] to delete the command"
-msgstr "Wciśnij [Enter] aby wysłać polecenie, wciśnij [Delete] aby usunąć"
diff --git a/luci-app-at-socat/root/etc/config/atsocat b/luci-app-at-socat/root/etc/config/atsocat
deleted file mode 100644
index a6ea73fc0..000000000
--- a/luci-app-at-socat/root/etc/config/atsocat
+++ /dev/null
@@ -1,4 +0,0 @@
-
-config atsocat 'general'
- option set_port ''
-
diff --git a/luci-app-at-socat/root/etc/modem/atsocatcommands.user b/luci-app-at-socat/root/etc/modem/atsocatcommands.user
deleted file mode 100644
index 0e402bff3..000000000
--- a/luci-app-at-socat/root/etc/modem/atsocatcommands.user
+++ /dev/null
@@ -1,2 +0,0 @@
-Signal Quality/Strength ➜ AT+CSQ;AT+CSQ
-
diff --git a/luci-app-at-socat/root/etc/uci-defaults/start_socat b/luci-app-at-socat/root/etc/uci-defaults/start_socat
deleted file mode 100644
index dea6c5eee..000000000
--- a/luci-app-at-socat/root/etc/uci-defaults/start_socat
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# Copyright 2024 Rafał Wabik (IceG) - From eko.one.pl forum
-# MIT License
-
-chmod +x /usr/bin/luci-app-at-socat 2>&1 &
-
-rm -rf /tmp/luci-indexcache 2>&1 &
-rm -rf /tmp/luci-modulecache/ 2>&1 &
-exit 0
diff --git a/luci-app-at-socat/root/usr/bin/luci-app-at-socat b/luci-app-at-socat/root/usr/bin/luci-app-at-socat
deleted file mode 100755
index cae495186..000000000
--- a/luci-app-at-socat/root/usr/bin/luci-app-at-socat
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-ARGS=$1
-DEVPORT=$2
-
-echo "${ARGS}" | socat - ${DEVPORT},,crnl
-
diff --git a/luci-app-at-socat/root/usr/share/luci/menu.d/luci-app-at-socat.json b/luci-app-at-socat/root/usr/share/luci/menu.d/luci-app-at-socat.json
deleted file mode 100644
index 27a0c64e4..000000000
--- a/luci-app-at-socat/root/usr/share/luci/menu.d/luci-app-at-socat.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "admin/modem": {
- "title": "Modem",
- "order": 30,
- "action": {
- "type": "firstchild",
- "recurse": true
- }
- },
-
- "admin/modem/atsocat": {
- "title": "AT Commands",
- "order": 10,
- "action": {
- "type": "alias",
- "path": "admin/modem/atsocat/atsocatcommands"
- },
- "depends": {
- "acl": [ "luci-app-at-socat" ]
- }
- },
-
- "admin/modem/atsocat/atsocatcommands": {
- "title": "AT Commands",
- "order": 10,
- "action": {
- "type": "view",
- "path": "modem/atsocatcommands"
- }
- },
-
- "admin/modem/atsocat/atsocatconfig": {
- "title": "Configuration",
- "order": 20,
- "action": {
- "type": "view",
- "path": "modem/atsocatconfig"
- }
- }
-
-}
diff --git a/luci-app-at-socat/root/usr/share/rpcd/acl.d/luci-app-at-socat.json b/luci-app-at-socat/root/usr/share/rpcd/acl.d/luci-app-at-socat.json
deleted file mode 100644
index c3ca26eec..000000000
--- a/luci-app-at-socat/root/usr/share/rpcd/acl.d/luci-app-at-socat.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "luci-app-at-socat": {
- "description": "Grant access to sending at commands using socat",
- "read": {
- "cgi-io": [ "exec" ],
- "file": {
- "/usr/bin/socat": [ "exec" ],
- "/usr/bin/luci-app-at-socat": [ "exec" ],
- "/etc/modem/atsocatcommands.user": [ "read" ]
- },
- "uci": [ "atsocat" ]
- },
- "write": {
- "file": {
- "/etc/modem/atsocatcommands.user": [ "write" ]
- },
- "uci": [ "atsocat" ]
- }
- }
-}
diff --git a/luci-app-atcommands/LICENSE b/luci-app-atcommands/LICENSE
deleted file mode 100644
index f288702d2..000000000
--- a/luci-app-atcommands/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/luci-app-atcommands/Makefile b/luci-app-atcommands/Makefile
deleted file mode 100644
index 1670f82c8..000000000
--- a/luci-app-atcommands/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Copyright 2022-2024 Rafał Wabik - IceG - From eko.one.pl forum
-#
-# Licensed to the GNU General Public License v3.0.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=luci-app-atcommands
-LUCI_TITLE:=LuCI JS Support for AT commands
-MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
-LUCI_DESCRIPTION:=LuCI JS interface for the sms-tool. The user interface supports only AT commands.
-LUCI_DEPENDS:=+sms-tool
-LUCI_PKGARCH:=all
-PKG_VERSION:=1.0.9
-PKG_RELEASE:=1
-
-define Package/luci-app-atcommands/conffiles
-/etc/config/atcommands
-/etc/modem/atcommands.user
-endef
-
-include $(TOPDIR)/feeds/luci/luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atcommands.js b/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atcommands.js
deleted file mode 100644
index f0009f4b8..000000000
--- a/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atcommands.js
+++ /dev/null
@@ -1,184 +0,0 @@
-'use strict';
-'require dom';
-'require form';
-'require fs';
-'require ui';
-'require uci';
-'require view';
-
-/*
- Copyright 2022-2024 Rafał Wabik - IceG - From eko.one.pl forum
-
- Licensed to the GNU General Public License v3.0.
-*/
-
-
-return view.extend({
- handleCommand: function(exec, args) {
- var buttons = document.querySelectorAll('.cbi-button');
-
- for (var i = 0; i < buttons.length; i++)
- buttons[i].setAttribute('disabled', 'true');
-
- return fs.exec(exec, args).then(function(res) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = '';
-
- res.stdout = res.stdout?.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "") || '';
- res.stderr = res.stderr?.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "") || '';
-
- if (res.stdout === undefined || res.stderr === undefined || res.stderr.includes('undefined') || res.stdout.includes('undefined')) {
- return;
- }
- else {
- dom.content(out, [ res.stdout || '', res.stderr || '' ]);
- }
-
- }).catch(function(err) {
- if (res.stdout === undefined || res.stderr === undefined || res.stderr.includes('undefined') || res.stdout.includes('undefined')) {
- return;
- }
- else {
- ui.addNotification(null, E('p', [ err ]));
- }
- }).finally(function() {
- for (var i = 0; i < buttons.length; i++)
- buttons[i].removeAttribute('disabled');
-
- });
- },
-
- handleGo: function(ev) {
-
- var port, atcmd = document.getElementById('cmdvalue').value;
- var sections = uci.sections('atcommands');
- var port = sections[0].set_port;
-
- if ( atcmd.length < 2 )
- {
- ui.addNotification(null, E('p', _('Please specify the AT command to send')), 'info');
- return false;
- }
- else {
-
- if ( !port )
- {
- ui.addNotification(null, E('p', _('Please set the port for communication with the modem')), 'info');
- return false;
- }
- else {
- return this.handleCommand('sms_tool', [ '-d' , port , 'at' , atcmd ]);
- }
- }
-
- if ( !port )
- {
- ui.addNotification(null, E('p', _('Please set the port for communication with the modem')), 'info');
- return false;
- }
-
- },
-
- handleClear: function(ev) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = 'none';
-
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
-
- document.getElementById('cmdvalue').focus();
- },
-
- handleCopy: function(ev) {
- var out = document.querySelector('.atcommand-output');
- out.style.display = 'none';
-
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
- var x = document.getElementById('tk').value;
- ov.value = x;
- },
-
- load: function() {
- return Promise.all([
- L.resolveDefault(fs.read_direct('/etc/modem/atcommands.user'), null),
- uci.load('atcommands')
- ]);
- },
-
- render: function (loadResults) {
-
- var info = _('User interface for handling AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s.').format('', '');
-
- return E('div', { 'class': 'cbi-map', 'id': 'map' }, [
- E('h2', {}, [ _('AT Commands') ]),
- E('div', { 'class': 'cbi-map-descr'}, info),
- E('hr'),
- E('div', { 'class': 'cbi-section' }, [
- E('div', { 'class': 'cbi-section-node' }, [
- E('div', { 'class': 'cbi-value' }, [
- E('label', { 'class': 'cbi-value-title' }, [ _('User AT commands') ]),
- E('div', { 'class': 'cbi-value-field' }, [
- E('select', { 'class': 'cbi-input-select', 'id': 'tk', 'style': 'margin:5px 0; width:100%;', 'mousedown': ui.createHandlerFn(this, 'handleCopy')},
- (loadResults[0] || "").trim().split("\n").map(function(cmd) {
- var fields = cmd.split(/;/);
- var name = fields[0];
- var code = fields[1];
- return E('option', { 'value': code }, name ) })
- )
- ])
- ]),
- E('div', { 'class': 'cbi-value' }, [
- E('label', { 'class': 'cbi-value-title' }, [ _('Command to send') ]),
- E('div', { 'class': 'cbi-value-field' }, [
- E('input', {
- 'style': 'margin:5px 0; width:100%;',
- 'type': 'text',
- 'id': 'cmdvalue',
- 'data-tooltip': _('Press [Enter] to send the command, press [Delete] to delete the command'),
- 'keydown': function(ev) {
- if (ev.keyCode === 13)
- {
- var execBtn = document.getElementById('execute');
- if (execBtn)
- execBtn.click();
- }
- if (ev.keyCode === 46)
- {
- var del = document.getElementById('cmdvalue');
- if (del)
- var ov = document.getElementById('cmdvalue');
- ov.value = '';
- document.getElementById('cmdvalue').focus();
- }
- }
- }),
- ])
- ]),
-
- ])
- ]),
- E('hr'),
- E('div', { 'class': 'right' }, [
- E('button', {
- 'class': 'cbi-button cbi-button-remove',
- 'id': 'clr',
- 'click': ui.createHandlerFn(this, 'handleClear')
- }, [ _('Clear form') ]),
- '\xa0\xa0\xa0',
- E('button', {
- 'class': 'cbi-button cbi-button-action important',
- 'id': 'execute',
- 'click': ui.createHandlerFn(this, 'handleGo')
- }, [ _('Send command') ]),
- ]),
- E('p', _('Reply')),
- E('pre', { 'class': 'atcommand-output', 'id': 'preout', 'style': 'display:none; border: 1px solid var(--border-color-medium); border-radius: 5px; font-family: monospace' }),
-
- ]);
- },
-
- handleSaveApply: null,
- handleSave: null,
- handleReset: null
-})
diff --git a/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atconfig.js b/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atconfig.js
deleted file mode 100644
index 09dd491ea..000000000
--- a/luci-app-atcommands/htdocs/luci-static/resources/view/modem/atconfig.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-'require form';
-'require fs';
-'require view';
-'require uci';
-'require ui';
-'require tools.widgets as widgets'
-
-/*
- Copyright 2022-2024 Rafał Wabik - IceG - From eko.one.pl forum
-
- Licensed to the GNU General Public License v3.0.
-*/
-
-
-return view.extend({
- load: function() {
- return fs.list('/dev').then(function(devs) {
- return devs.filter(function(dev) {
- return dev.name.match(/^ttyUSB/) || dev.name.match(/^cdc-wdm/) || dev.name.match(/^ttyACM/) || dev.name.match(/^mhi_/) || dev.name.match(/^wwan/);
- });
- });
- },
-
- render: function(devs) {
- var m, s, o;
- m = new form.Map('atcommands', _('Configuration sms-tool'), _('Configuration panel for sms-tool and gui application.'));
-
- s = m.section(form.TypedSection, 'atcommands', '', _(''));
- s.anonymous = true;
-
- o = s.option(form.Value, 'set_port', _('Port for communication with the modem'),
- _("Select one of the available ttyUSBX ports."));
- devs.sort((a, b) => a.name > b.name);
- devs.forEach(dev => o.value('/dev/' + dev.name));
-
- o.placeholder = _('Please select a port');
- o.rmempty = false;
-
- o = s.option(form.TextValue, '_tmpl', _('User AT commands'),
- _("Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcommands.user."));
- o.rows = 20;
- o.cfgvalue = function(section_id) {
- return fs.trimmed('/etc/modem/atcommands.user');
- };
- o.write = function(section_id, formvalue) {
- return fs.write('/etc/modem/atcommands.user', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
- };
-
- return m.render();
- }
-});
diff --git a/luci-app-atcommands/po/it/atcommands.po b/luci-app-atcommands/po/it/atcommands.po
deleted file mode 100644
index 90476e985..000000000
--- a/luci-app-atcommands/po/it/atcommands.po
+++ /dev/null
@@ -1,53 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "AT Commands"
-msgstr "Comandi AT"
-
-msgid "Configuration"
-msgstr "Configurazione"
-
-msgid "Please specify the AT command to send"
-msgstr "Specificare il comando AT da inviare"
-
-msgid "Please set the port for communication with the modem"
-msgstr "Specificare la porta per la comunicazione con il modem"
-
-msgid "User AT commands"
-msgstr "Comandi AT dell'utente"
-
-msgid "Command to send"
-msgstr "Il comando da inviare"
-
-msgid "Clear form"
-msgstr "Forma chiara"
-
-msgid "Send command"
-msgstr "Invia il comando"
-
-msgid "Reply"
-msgstr "Risposta"
-
-msgid "User interface for handling AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Interfaccia utente per la gestione dei comandi AT utilizzando sms-tool. Maggiori informazioni sul programma sms-tool su %sforum eko.one.pl%s."
-
-msgid "Configuration sms-tool"
-msgstr "Configurazione dello strumento sms-tool"
-
-msgid "Configuration panel for sms-tool and gui application."
-msgstr "Pannello impostazioni per il programma sms-tool e per l'interfaccia utente."
-
-msgid "Port for communication with the modem"
-msgstr "Porta di comunicazione modem"
-
-msgid "Select one of the available ttyUSBX ports."
-msgstr "Seleziona una delle porte ttyUSBX disponibili."
-
-msgid "Please select a port"
-msgstr "Seleziona una porta"
-
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location '/etc/modem/atcommands.user'."
-msgstr "Ogni riga dovrebbe avere il seguente formato: 'AT descrizione comando;AT comando'. Per comodità, i comandi AT sono memorizzati nel file /etc/modem/atcommands.user'."
-
-msgid "Press [Enter] to send the command, press [Delete] to delete the command."
-msgstr "Premere [Enter] per inviare il comando, premere [Delete] per eliminare."
diff --git a/luci-app-atcommands/po/pl/atcommands.po b/luci-app-atcommands/po/pl/atcommands.po
deleted file mode 100644
index 3b661cb5e..000000000
--- a/luci-app-atcommands/po/pl/atcommands.po
+++ /dev/null
@@ -1,53 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "AT Commands"
-msgstr "Polecenia AT"
-
-msgid "Configuration"
-msgstr "Konfiguracja"
-
-msgid "Please specify the AT command to send"
-msgstr "Proszę podać polecenie AT do wysłania"
-
-msgid "Please set the port for communication with the modem"
-msgstr "Proszę podać port do komunikacji z modemem"
-
-msgid "User AT commands"
-msgstr "Polecenia AT użytkownika"
-
-msgid "Command to send"
-msgstr "Polecenie do wysłania"
-
-msgid "Clear form"
-msgstr "Wyczyść formularz"
-
-msgid "Send command"
-msgstr "Wyślij polecenie"
-
-msgid "Reply"
-msgstr "Odpowiedź"
-
-msgid "User interface for handling AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Interfejs użytkownika do obsługi poleceń AT za pomocą sms-tool. Więcej informacji o programie sms-tool na %sforum eko.one.pl%s."
-
-msgid "Configuration sms-tool"
-msgstr "Konfiguracja sms-tool"
-
-msgid "Configuration panel for sms-tool and gui application."
-msgstr "Panel ustawień dla programu sms-tool oraz dla interfejsu użytkownika."
-
-msgid "Port for communication with the modem"
-msgstr "Port do komunikacji z modemem"
-
-msgid "Select one of the available ttyUSBX ports."
-msgstr "Wybierz jeden z dostępnych portów ttyUSBX."
-
-msgid "Please select a port"
-msgstr "Proszę wybrać port"
-
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcommands.user."
-msgstr "Każda linijka powinna mieć następujący format: 'Opis polecenia AT;polecenie AT'. Dla wygody użytkownika polecenia zapisywane są w pliku /etc/modem/atcommands.user."
-
-msgid "Press [Enter] to send the command, press [Delete] to delete the command"
-msgstr "Wciśnij [Enter] aby wysłać polecenie, wciśnij [Delete] aby usunąć"
diff --git a/luci-app-atcommands/po/template/atcommands.pot b/luci-app-atcommands/po/template/atcommands.pot
deleted file mode 100644
index 9bdd92d34..000000000
--- a/luci-app-atcommands/po/template/atcommands.pot
+++ /dev/null
@@ -1,53 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "AT Commands"
-msgstr ""
-
-msgid "Configuration"
-msgstr ""
-
-msgid "Please specify the AT command to send"
-msgstr ""
-
-msgid "Please set the port for communication with the modem"
-msgstr ""
-
-msgid "User AT commands"
-msgstr ""
-
-msgid "Command to send"
-msgstr ""
-
-msgid "Clear form"
-msgstr ""
-
-msgid "Send command"
-msgstr ""
-
-msgid "Reply"
-msgstr ""
-
-msgid "User interface for handling AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr ""
-
-msgid "Configuration sms-tool"
-msgstr ""
-
-msgid "Configuration panel for sms-tool and gui application."
-msgstr ""
-
-msgid "Port for communication with the modem"
-msgstr ""
-
-msgid "Select one of the available ttyUSBX ports."
-msgstr ""
-
-msgid "Please select a port"
-msgstr ""
-
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location '/etc/modem/atcommands.user'."
-msgstr ""
-
-msgid "Press [Enter] to send the command, press [Delete] to delete the command."
-msgstr ""
diff --git a/luci-app-atcommands/po/zh_Hans/atcommands.po b/luci-app-atcommands/po/zh_Hans/atcommands.po
deleted file mode 100644
index 58ecdfeb5..000000000
--- a/luci-app-atcommands/po/zh_Hans/atcommands.po
+++ /dev/null
@@ -1,56 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-msgid "Modem"
-msgstr "移动通信"
-
-msgid "AT Commands"
-msgstr "AT 指令"
-
-msgid "Configuration"
-msgstr "配置"
-
-msgid "Please specify the AT command to send"
-msgstr "请指定要发送的AT指令"
-
-msgid "Please set the port for communication with the modem"
-msgstr "请设置与模块通信的端口"
-
-msgid "User AT commands"
-msgstr "用户 AT 指令"
-
-msgid "Command to send"
-msgstr "要发送的指令"
-
-msgid "Clear form"
-msgstr "清除表单"
-
-msgid "Send command"
-msgstr "发送指令"
-
-msgid "Reply"
-msgstr "回显"
-
-msgid "User interface for handling AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "用于通过 sms-tool 处理 AT 指令的用户界面。关于 sms-tool 的更多信息在 %s论坛 seko.one.pl%s。"
-
-msgid "Configuration sms-tool"
-msgstr "配置 sms-tool"
-
-msgid "Configuration panel for sms-tool and gui application."
-msgstr "sms-tool 和图形界面配置面板。"
-
-msgid "Port for communication with the modem"
-msgstr "模块通信端口"
-
-msgid "Select one of the available ttyUSBX ports."
-msgstr "请选择可用的 ttyUSBX 端口。"
-
-msgid "Please select a port"
-msgstr "请选择一个端口"
-
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcommands.user."
-msgstr "每一行必须是如下形式:'AT指令描述;AT指令'。为了用户方便,这个文件存储在:'/etc/modem/atcommands.user'。"
-
-msgid "Press [Enter] to send the command, press [Delete] to delete the command"
-msgstr "点击 [Enter]键 发送指令,点击 [Delete]键 删除指令。"
diff --git a/luci-app-atcommands/root/etc/config/atcommands b/luci-app-atcommands/root/etc/config/atcommands
deleted file mode 100644
index 359e54255..000000000
--- a/luci-app-atcommands/root/etc/config/atcommands
+++ /dev/null
@@ -1,4 +0,0 @@
-
-config atcommands
- option set_port ''
-
diff --git a/luci-app-atcommands/root/etc/modem/atcommands.user b/luci-app-atcommands/root/etc/modem/atcommands.user
deleted file mode 100644
index 0e402bff3..000000000
--- a/luci-app-atcommands/root/etc/modem/atcommands.user
+++ /dev/null
@@ -1,2 +0,0 @@
-Signal Quality/Strength ➜ AT+CSQ;AT+CSQ
-
diff --git a/luci-app-atcommands/root/etc/uci-defaults/setupatcmds.sh b/luci-app-atcommands/root/etc/uci-defaults/setupatcmds.sh
deleted file mode 100644
index 9f060e3cb..000000000
--- a/luci-app-atcommands/root/etc/uci-defaults/setupatcmds.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# Copyright 2022 Rafał Wabik (IceG) - From eko.one.pl forum
-# MIT License
-
-rm -rf /tmp/luci-indexcache
-rm -rf /tmp/luci-modulecache/
-exit 0
diff --git a/luci-app-atcommands/root/usr/share/luci/menu.d/luci-app-atcommands.json b/luci-app-atcommands/root/usr/share/luci/menu.d/luci-app-atcommands.json
deleted file mode 100644
index 6e9c79ff3..000000000
--- a/luci-app-atcommands/root/usr/share/luci/menu.d/luci-app-atcommands.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "admin/modem": {
- "title": "Modem",
- "order": 30,
- "action": {
- "type": "firstchild",
- "recurse": true
- }
- },
-
- "admin/modem/luci-app-atcommands": {
- "title": "AT Commands",
- "order": 10,
- "action": {
- "type": "alias",
- "path": "admin/modem/luci-app-atcommands/atcommands"
- },
- "depends": {
- "acl": [ "luci-app-atcommands" ],
- "uci": { "atcommands": true }
- }
- },
-
- "admin/modem/luci-app-atcommands/atcommands": {
- "title": "AT Commands",
- "order": 10,
- "action": {
- "type": "view",
- "path": "modem/atcommands"
- }
- },
-
- "admin/modem/luci-app-atcommands/atconfig": {
- "title": "Configuration",
- "order": 20,
- "action": {
- "type": "view",
- "path": "modem/atconfig"
- }
- },
-
-}
diff --git a/luci-app-atcommands/root/usr/share/rpcd/acl.d/luci-app-atcommands.json b/luci-app-atcommands/root/usr/share/rpcd/acl.d/luci-app-atcommands.json
deleted file mode 100644
index 667ad4c8d..000000000
--- a/luci-app-atcommands/root/usr/share/rpcd/acl.d/luci-app-atcommands.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "luci-app-atcommands": {
- "description": "Grant access to atcommands executables",
- "read": {
- "cgi-io": [ "exec" ],
- "file": {
- "/usr/bin/sms_tool": [ "exec" ],
- "/etc/atcommands": [ "read" ],
- "/etc/modem/atcommands.user": [ "read" ]
- },
- "uci": [ "atcommands", "luci-app-atcommands" ]
- },
- "write": {
- "file": {
- "/etc/atcommands": [ "write" ],
- "/etc/modem/atcommands.user": [ "write" ],
- },
- "uci": [ "atcommands", "luci-app-atcommands" ]
- }
- }
-}
diff --git a/luci-app-crontab-wizard/Makefile b/luci-app-crontab-wizard/Makefile
new file mode 100644
index 000000000..481f72b1a
--- /dev/null
+++ b/luci-app-crontab-wizard/Makefile
@@ -0,0 +1,20 @@
+#
+# Copyright 2025 Rafał Wabik - IceG - From eko.one.pl forum
+#
+# MIT License
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-crontab-wizard
+LUCI_TITLE:=Crontab configurator for LuCI JS
+MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
+LUCI_DESCRIPTION:=Super simple graphical configurator for crontab.
+LUCI_DEPENDS:=
+PKG_VERSION:=1.0.4
+PKG_RELEASE:=1
+LUCI_PKGARCH:=all
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-crontab-wizard/htdocs/luci-static/resources/view/system/crontab_wizard.js b/luci-app-crontab-wizard/htdocs/luci-static/resources/view/system/crontab_wizard.js
new file mode 100644
index 000000000..099681657
--- /dev/null
+++ b/luci-app-crontab-wizard/htdocs/luci-static/resources/view/system/crontab_wizard.js
@@ -0,0 +1,750 @@
+'use strict';
+'require baseclass';
+'require form';
+'require ui';
+'require view';
+'require fs';
+'require tools.widgets as widgets';
+
+/*
+
+ Copyright 2025 Rafał Wabik - IceG - From eko.one.pl forum
+
+ MIT License
+
+*/
+
+function popTimeout(a, message, timeout, severity) {
+ ui.addTimeLimitedNotification(a, message, timeout, severity)
+}
+
+return view.extend({
+ colors: {
+ light: {
+ minute: '#fdd2d6',
+ hour: '#cfead1',
+ day: '#ffd8ad',
+ month: '#bbdefb',
+ weekday:'#e1bee7'
+ },
+ dark: {
+ minute: '#5b2f35',
+ hour: '#2f4732',
+ day: '#4a3828',
+ month: '#30475e',
+ weekday:'#3a2f41'
+ }
+ },
+
+ getCurrentColors: function() {
+ const isDarkMode = document.documentElement.getAttribute('data-darkmode') === 'true';
+ return isDarkMode ? this.colors.dark : this.colors.light;
+ },
+
+ getBadgeTextColor: function() {
+ const isDarkMode = document.documentElement.getAttribute('data-darkmode') === 'true';
+ return isDarkMode ? '#ffffff' : '#111111';
+ },
+
+ _weekdayNames: function(){
+ return [
+ _('Sunday'), _('Monday'), _('Tuesday'), _('Wednesday'), _('Thursday'), _('Friday'), _('Saturday')
+ ];
+ },
+ _monthNames: function(){
+ return [
+ '', _('January'), _('February'), _('March'), _('April'), _('May'), _('June'),
+ _('July'), _('August'), _('September'), _('October'), _('November'), _('December')
+ ];
+ },
+
+ _formatRange: function(a, b){
+ return a + '-' + b;
+ },
+
+ _parseSegments: function(expr, base) {
+ if (!expr || expr === '*') return { type: 'any' };
+ if (/^\*\/\d+$/.test(expr)) return { type: 'step', step: parseInt(expr.slice(2), 10) };
+
+ const segs = [];
+ expr.split(',').forEach(function(part){
+ const m = part.match(/^(\d+)-(\d+)$/);
+ if (m) {
+ const a = parseInt(m[1],10), b = parseInt(m[2],10);
+ segs.push({ kind:'range', a:a, b:b });
+ } else {
+ const v = parseInt(part,10);
+ if (!isNaN(v)) segs.push({ kind:'single', v:v });
+ }
+ });
+ return { type:'list', segs:segs };
+ },
+
+ _expand: function(parsed, minVal, maxVal) {
+ if (parsed.type === 'any') return null;
+ const vals = new Set();
+ if (parsed.type === 'step') {
+ const n = parsed.step;
+ for (let i=minVal; i<=maxVal; i+=n) vals.add(i);
+ return Array.from(vals).sort(function(a,b){ return a-b; });
+ }
+ parsed.segs.forEach(function(s){
+ if (s.kind==='single') { if (s.v>=minVal && s.v<=maxVal) vals.add(s.v); }
+ else { for (let i=s.a; i<=s.b; i++) if (i>=minVal && i<=maxVal) vals.add(i); }
+ });
+ return Array.from(vals).sort(function(a,b){ return a-b; });
+ },
+
+ _humanList: function(parsed, labeller) {
+ if (parsed.type === 'any') return null;
+ if (parsed.type === 'step') return null;
+ const self = this;
+ const items = parsed.segs.map(function(s){
+ if (s.kind==='single') return labeller(s.v, false);
+ return self._formatRange(labeller(s.a,false), labeller(s.b,true));
+ });
+ return items.join(', ');
+ },
+
+ _pluralMin: function(n){ return (n===1) ? _('minute') : _('minutes'); },
+ _pluralHour: function(n){ return (n===1) ? _('hour') : _('hours'); },
+ _pluralDay: function(n){ return (n===1) ? _('day') : _('days'); },
+
+ _pad2: function(n){ return (n<10 ? '0'+n : ''+n); },
+
+ _enumerateTimes: function(minExpr, hourExpr) {
+ const pm = this._parseSegments(minExpr,0), ph = this._parseSegments(hourExpr,0);
+ const mins = (pm.type==='any' || pm.type==='step') ? null : this._expand(pm,0,59);
+ const hours = (ph.type==='any' || ph.type==='step') ? null : this._expand(ph,0,23);
+ if (!mins || !hours) return null;
+
+ const combos = [];
+ for (let i=0;i0 && combos.length<=12) return { single: null, list: combos.join(', ') };
+ return null;
+ },
+
+ _timeOfDayPhrase: function(minExpr, hourExpr) {
+ const pm = this._parseSegments(minExpr,0), ph = this._parseSegments(hourExpr,0);
+
+ const times = this._enumerateTimes(minExpr, hourExpr);
+ if (times) {
+ if (times.single) return _('at time: %s').format(times.single);
+ return _('at times: %s').format(times.list);
+ }
+
+ let parts = [];
+
+ // Minutes
+ if (pm.type==='step') {
+ parts.push(_('runs every %d %s').format(pm.step, this._pluralMin(pm.step)));
+ } else if (pm.type==='list') {
+ const list = this._humanList(pm, function(n){ return String(n); });
+ if (list) parts.push(_('in minutes: %s').format(list));
+ }
+
+ // Hours
+ if (ph.type==='step') {
+ parts.push(_('runs every %d %s').format(ph.step, this._pluralHour(ph.step)));
+ } else if (ph.type==='list') {
+ const listH = this._humanList(ph, function(n){ return String(n); });
+ if (listH) parts.push(_('in hours: %s').format(listH));
+ }
+
+ return parts.length > 0 ? parts.join('; ') : null;
+ },
+
+ _descDayOfMonth: function(expr){
+ if (expr === '*') return null;
+ const p = this._parseSegments(expr,1);
+
+ if (p.type==='step') {
+ return _('runs every %d %s of the month').format(p.step, this._pluralDay(p.step));
+ }
+
+ const listStr = this._humanList(p, function(n){ return String(n); });
+ if (!listStr) return null;
+ return _('on day(s): %s').format(listStr);
+ },
+
+ _descMonth: function(expr){
+ if (expr === '*') return null;
+ const p = this._parseSegments(expr,1);
+ if (p.type==='step') return _('runs every %d month(s)').format(p.step);
+ const months = this._monthNames();
+ const list = this._humanList(p, function(n){ return months[n]; });
+ return list ? _('in month(s): %s').format(list) : null;
+ },
+
+ _descWeekday: function(expr){
+ if (expr === '*') return null;
+ const p = this._parseSegments(expr,0);
+ if (p.type==='step') return _('runs every %d day of the week').format(p.step);
+ const days = this._weekdayNames();
+ const list = this._humanList(p, function(n){ return days[n===7?0:n]; });
+ return list ? _('on weekday(s): %s').format(list) : null;
+ },
+
+ _describeCron: function(minute, hour, day, month, weekday, command){
+ const parts = [];
+
+ const isMinuteChanged = minute !== '*';
+ const isHourChanged = hour !== '*';
+ const isDayChanged = day !== '*';
+ const isMonthChanged = month !== '*';
+ const isWeekdayChanged = weekday !== '*';
+
+ // Nothing changed
+ if (!isMinuteChanged && !isHourChanged && !isDayChanged && !isMonthChanged && !isWeekdayChanged) {
+ const prefix = command ? _('Command "%s" ').format(command) : _('Command');
+ return prefix + ' ';
+ }
+
+ // Time (hour and minute)
+ const timePart = this._timeOfDayPhrase(minute, hour);
+ if (timePart) parts.push(timePart);
+
+ // Month
+ const monthPart = this._descMonth(month);
+ if (monthPart) parts.push(monthPart);
+
+ // Day of month
+ const dayPart = this._descDayOfMonth(day);
+ if (dayPart) parts.push(dayPart);
+
+ // Day of week
+ const weekdayPart = this._descWeekday(weekday);
+ if (weekdayPart) parts.push(weekdayPart);
+
+ const prefix = command ? _('Command "%s" will run').format(command) : _('Command will run');
+
+ if (parts.length === 0) {
+ return prefix + '.';
+ }
+
+ return prefix + ' ' + parts.join('; ') + '.';
+ },
+
+ addStyles: function() {
+ const style = document.createElement('style');
+ style.type = 'text/css';
+ style.textContent = `
+ .ifacebox .span-40 { grid-column: span 2; }
+ .ifacebox .span-80 { grid-column: span 4; }
+ .ifacebox .span-160 { grid-column: span 8; }
+ .ifacebox .span-320 { grid-column: span 8; }
+ @media (max-width: 560px) {
+ .ifacebox .span-320 { grid-column: span 8 !important; }
+ }
+ :root {
+ --tile-free: #eceff1;
+ --tile-active: #34c759;
+ --tile-text: #263238;
+ --tile-text-on-active: #ffffff;
+ --iface-head-bg: #f8f8f8;
+ --app-id-font-color: #454545;
+ --border-color-soft: #eceff1;
+ --border-color-medium: #cfd8dc;
+ --border-color-strong: #90a4ae;
+ --tile-border: #b0bec5;
+ --cron-minute: #fdd2d6;
+ --cron-hour: #cfead1;
+ --cron-day: #ffd8ad;
+ --cron-month: #bbdefb;
+ --cron-weekday: #e1bee7;
+ --badge-text: #111111;
+ --badge-border: rgba(0,0,0,.15);
+ --badge-shadow: rgba(0,0,0,.06);
+
+ --multiselect-bg: var(--border-color-low);
+ --multiselect-text: #263238;
+ --multiselect-border: #cfd8dc;
+ --multiselect-selected-bg: #e3f2fd;
+ --multiselect-selected-text: #1565c0;
+ --multiselect-hover-bg: #f5f5f5;
+ }
+ :root[data-darkmode="true"] {
+ --tile-free: #2a2f34;
+ --tile-active: #2ecc71;
+ --tile-text: #e5e7eb;
+ --tile-text-on-active: #ffffff;
+ --iface-head-bg: #1f2327;
+ --border-color-soft: #2a2f34;
+ --border-color-medium: #3a4146;
+ --border-color-strong: #6b737a;
+ --app-id-font-color: #f6f6f6;
+ --tile-border: #54616b;
+
+ --cron-minute: #8b4f5a;
+ --cron-hour: #4f6b52;
+ --cron-day: #7a5838;
+ --cron-month: #4a6b8e;
+ --cron-weekday:#5a4f71;
+
+ --badge-text: #ffffff;
+ --badge-border: rgba(255,255,255,.2);
+ --badge-shadow: rgba(0,0,0,.35);
+
+ --multiselect-bg: var(--border-color-low);
+ --multiselect-text: #e5e7eb;
+ --multiselect-border: #3a4146;
+ --multiselect-hover-bg: #3a4146;
+ }
+
+ .cron-minute-head { background: var(--cron-minute) !important; }
+ .cron-hour-head { background: var(--cron-hour) !important; }
+ .cron-day-head { background: var(--cron-day) !important; }
+ .cron-month-head { background: var(--cron-month) !important; }
+ .cron-weekday-head{ background: var(--cron-weekday)!important; }
+
+ :root .cron-minute-head { color: #263238 !important; }
+ :root .cron-hour-head { color: #263238 !important; }
+ :root .cron-day-head { color: #263238 !important; }
+ :root .cron-month-head { color: #263238 !important; }
+ :root .cron-weekday-head{ color: #263238 !important; }
+
+ :root[data-darkmode="true"] .cron-minute-head { color: #ffcdd2 !important; }
+ :root[data-darkmode="true"] .cron-hour-head { color: #c8e6c9 !important; }
+ :root[data-darkmode="true"] .cron-day-head { color: #ffe0b2 !important; }
+ :root[data-darkmode="true"] .cron-month-head { color: #bbdefb !important; }
+ :root[data-darkmode="true"] .cron-weekday-head{ color: #e1bee7 !important; }
+
+ .ifacebox .tile { font-weight: normal; }
+
+ .cron-badge {
+ display: inline-block;
+ padding: 3px 6px;
+ border-radius: 6px;
+ border: 1px solid var(--badge-border);
+ box-shadow: 0 1px 1px var(--badge-shadow), inset 0 1px 0 rgba(255,255,255,.08);
+ font-weight: 600;
+ letter-spacing: .2px;
+ }
+
+ .cbi-input-text { text-align: left !important; }
+ #cron_preview_text { text-align: left !important; }
+
+ #cron_preview {
+ height: 40px !important;
+ min-height: 40px !important;
+ max-height: 40px !important;
+ background-color: var(--multiselect-bg) !important;
+ border: 1px solid var(--badge-border);
+ line-height: 26px;
+ display: flex;
+ align-items: center;
+ }
+
+ .cron-actions {
+ margin-top: 1em;
+ display: flex;
+ justify-content: flex-end;
+ gap: .6em;
+ }
+
+ .cron-multiselect {
+ width: 100%;
+ min-height: 140px;
+ background-color: var(--multiselect-bg) !important;
+ color: var(--multiselect-text) !important;
+ border: 1px solid var(--multiselect-border) !important;
+ border-radius: 4px;
+ padding: 4px;
+ font-family: inherit;
+ font-size: 13px;
+ line-height: 1.4;
+ outline: none;
+ transition: border-color 0.2s, box-shadow 0.2s;
+ }
+
+ .cron-multiselect:focus {
+ border-color: var(--tile-active) !important;
+ box-shadow: 0 0 0 2px rgba(52, 199, 89, 0.2) !important;
+ }
+
+ :root:not([data-darkmode="true"]) .cron-multiselect option {
+ padding: 4px 8px; border: none; outline: none;
+ background-color: revert !important; color: revert !important;
+ }
+ :root:not([data-darkmode="true"]) .cron-multiselect option:not(:checked):hover {
+ background-color: var(--multiselect-hover-bg) !important;
+ }
+
+ /* Dark mode */
+ :root[data-darkmode="true"] .cron-multiselect option {
+ background-color: var(--multiselect-bg) !important;
+ color: var(--multiselect-text) !important;
+ padding: 4px 8px; border: none; outline: none;
+ }
+ :root[data-darkmode="true"] .cron-multiselect option:hover {
+ background-color: var(--multiselect-hover-bg) !important;
+ }
+ :root[data-darkmode="true"] #minute_select option:checked { background-color: var(--cron-minute) !important; color: #ffffff !important; font-weight: 600; }
+ :root[data-darkmode="true"] #hour_select option:checked { background-color: var(--cron-hour) !important; color: #ffffff !important; font-weight: 600; }
+ :root[data-darkmode="true"] #day_select option:checked { background-color: var(--cron-day) !important; color: #ffffff !important; font-weight: 600; }
+ :root[data-darkmode="true"] #month_select option:checked { background-color: var(--cron-month) !important; color: #ffffff !important; font-weight: 600; }
+ :root[data-darkmode="true"] #weekday_select option:checked { background-color: var(--cron-weekday) !important; color: #ffffff !important; font-weight: 600; }
+
+ :root[data-darkmode="true"] #minute_select option:checked:hover { background-color: var(--cron-minute) !important; color: #ffffff !important; }
+ :root[data-darkmode="true"] #hour_select option:checked:hover { background-color: var(--cron-hour) !important; color: #ffffff !important; }
+ :root[data-darkmode="true"] #day_select option:checked:hover { background-color: var(--cron-day) !important; color: #ffffff !important; }
+ :root[data-darkmode="true"] #month_select option:checked:hover { background-color: var(--cron-month) !important; color: #ffffff !important; }
+ :root[data-darkmode="true"] #weekday_select option:checked:hover { background-color: var(--cron-weekday) !important; color: #ffffff !important; }
+
+ :root[data-darkmode="true"] .cron-multiselect::-webkit-scrollbar { width: 8px; }
+ :root[data-darkmode="true"] .cron-multiselect::-webkit-scrollbar-track { background: #1a1e22; border-radius: 4px; }
+ :root[data-darkmode="true"] .cron-multiselect::-webkit-scrollbar-thumb { background: #4a5158; border-radius: 4px; }
+ :root[data-darkmode="true"] .cron-multiselect::-webkit-scrollbar-thumb:hover { background: #5a6168; }
+
+ :root .cron-multiselect::-webkit-scrollbar { width: 8px; }
+ :root .cron-multiselect::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; }
+ :root .cron-multiselect::-webkit-scrollbar-thumb { background: #c1c1c1; }
+ :root .cron-multiselect::-webkit-scrollbar-thumb:hover { background: #a8a8a8; }
+ `;
+ document.head.appendChild(style);
+ },
+
+ badge: function(bg, content){
+ const color = this.getBadgeTextColor();
+ return '' + content + '';
+ },
+
+ getSelectedValues: function(selectId) {
+ const sel = document.getElementById(selectId);
+ if (!sel) return [];
+ const vals = Array.from(sel.selectedOptions || [])
+ .map(function(o){ return o.value; })
+ .filter(function(v){ return v !== undefined && v !== null; });
+ return vals;
+ },
+
+ normalizeSelection: function(values) {
+ if (!values || values.length === 0) return ['*'];
+ if (values.includes('*')) return ['*'];
+ const uniq = Array.from(new Set(values.map(function(v){ return parseInt(v, 10); })));
+ return uniq.sort(function(a,b){ return a-b; }).map(function(x){ return String(x); });
+ },
+
+ compressValues: function(values) {
+ if (!values || values.length === 0) return '*';
+ if (values.length === 1) return values[0];
+
+ const nums = values.map(function(v){ return parseInt(v,10); });
+ let parts = [];
+ let start = nums[0];
+ let prev = nums[0];
+
+ for (let i = 1; i < nums.length; i++) {
+ const cur = nums[i];
+ if (cur === prev + 1) { prev = cur; continue; }
+ parts.push(start === prev ? String(start) : (start + '-' + prev));
+ start = prev = cur;
+ }
+ parts.push(start === prev ? String(start) : (start + '-' + prev));
+ return parts.join(',');
+ },
+
+ buildCronField: function(selectId, checkboxId /*, isPeriod*/) {
+ const valuesRaw = this.getSelectedValues(selectId);
+ const values = this.normalizeSelection(valuesRaw);
+
+ if (checkboxId) {
+ const cb = document.getElementById(checkboxId);
+ if (cb && cb.checked) {
+ const sel = values[0];
+ if (sel === '*' || sel === undefined) return '*';
+ return '*/' + sel;
+ }
+ }
+ if (values.length === 0 || values[0] === '*') return '*';
+ return this.compressValues(values);
+ },
+
+ updateCronPreview: function() {
+ const minute = this.buildCronField('minute_select', 'minute_checkbox', true);
+ const hour = this.buildCronField('hour_select', 'hour_checkbox', true);
+ const day = this.buildCronField('day_select', 'day_checkbox', true);
+ const month = this.buildCronField('month_select');
+ const weekday = this.buildCronField('weekday_select');
+
+ const cmdInput = document.getElementById('cron_command_input');
+ const command = cmdInput ? (cmdInput.value || '') : '';
+
+ const isMinuteChanged = minute !== '*';
+ const isHourChanged = hour !== '*';
+ const isDayChanged = day !== '*';
+ const isMonthChanged = month !== '*';
+ const isWeekdayChanged = weekday !== '*';
+ const isCommandChanged = command !== '';
+
+ const colors = this.getCurrentColors();
+
+ let cronHtml = '';
+ cronHtml += isMinuteChanged ? this.badge(colors.minute, minute) : minute; cronHtml += ' ';
+ cronHtml += isHourChanged ? this.badge(colors.hour, hour) : hour; cronHtml += ' ';
+ cronHtml += isDayChanged ? this.badge(colors.day, day) : day; cronHtml += ' ';
+ cronHtml += isMonthChanged ? this.badge(colors.month, month) : month; cronHtml += ' ';
+ cronHtml += isWeekdayChanged ? this.badge(colors.weekday, weekday) : weekday; cronHtml += ' ';
+ cronHtml += isCommandChanged ? '' + command + ''
+ : command
+
+ document.getElementById('cron_preview').innerHTML = cronHtml;
+
+ const plain = minute + ' ' + hour + ' ' + day + ' ' + month + ' ' + weekday + ' ' + command;
+ document.getElementById('cron_preview_text').value = plain;
+
+ const human = this._describeCron(minute, hour, day, month, weekday, command);
+ const humanEl = document.getElementById('cron_human_text');
+ if (humanEl) humanEl.value = human;
+ },
+
+ appendCronLine: function() {
+ const input = document.getElementById('cron_preview_text');
+ if (!input) {
+ ui.addNotification(null, E('p', _('Please enter the command')), 'info');
+ return;
+ }
+
+ const cronLine = (input.value || '').trim();
+ const isDefault = cronLine === '* * * * *' || cronLine === '';
+ const parts = cronLine.split(/\s+/);
+
+ if (isDefault) {
+ ui.addNotification(null, E('p', _('Check the cron entry, it must contain (time + command)')), 'info');
+ return;
+ }
+ if (parts.length < 6) {
+ ui.addNotification(null, E('p', _('Please enter the command')), 'info');
+ return;
+ }
+
+ return fs.read('/etc/crontabs/root').then(function(content) {
+ let current = (content || '').replace(/\r\n/g, '\n');
+
+ const haystack = '\n' + current + (current.endsWith('\n') ? '' : '\n');
+ const needle = '\n' + cronLine + '\n';
+ if (haystack.indexOf(needle) !== -1) {
+ ui.addNotification(null, E('p', _('This entry already exists in cron') + ': ' + cronLine));
+ return Promise.resolve('duplicate');
+ }
+
+ if (!current.endsWith('\n') && current.length > 0) current += '\n';
+ current += cronLine + '\n';
+
+ return fs.write('/etc/crontabs/root', current).then(function(){ return 'written'; });
+ }).then(function(state) {
+ if (state === 'duplicate') return;
+
+ return fs.exec('/etc/init.d/cron', ['restart']).then(function() {
+ popTimeout(null, E('p', _('Added entry to cron') + ': ' + cronLine), 5000, 'info');
+ });
+ }).catch(function(e) {
+ ui.addNotification(null, E('p', _('Error: %s').format(e.message)));
+ });
+ },
+
+ generateOptions: function(start, end, labels) {
+ const opts = [];
+ opts.push(E('option', { value: '*', selected: true }, '*'));
+
+ if (labels) {
+ for (let i = 0; i < labels.length; i++) {
+ opts.push(E('option', { value: (start + i).toString() }, labels[i]));
+ }
+ } else {
+ for (let i = start; i <= end; i++) {
+ opts.push(E('option', { value: i.toString() }, i.toString()));
+ }
+ }
+ return opts;
+ },
+
+ resetMulti: function(id) {
+ const sel = document.getElementById(id);
+ if (!sel) return;
+ Array.from(sel.options).forEach(function(o){ o.selected = (o.value === '*'); });
+ },
+
+ render: function(){
+ this.addStyles();
+
+ const root = E('div', { class:'cbi-map' }, [
+ E('h4', {}, [ _('Graphical Crontab Configurator') ]),
+ E('div', { 'class': 'cbi-section-descr fade-in' }, [_('A super simple graphical configurator for crontab.') ]),
+
+ E('div', { 'style': 'display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));margin-bottom:1em;gap:1em' }, [
+ E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;width:100%' }, [
+ E('div', { 'class': 'ifacebox-head cron-minute-head', 'style': 'font-weight:bold;padding:8px;color:#ffffff;' }, [ _('Minute') ]),
+ E('div', { 'class': 'ifacebox-body', 'style': 'padding:8px' }, [
+ E('select', {
+ 'id': 'minute_select',
+ 'class': 'cbi-input-select cron-multiselect',
+ 'multiple': true,
+ 'size': 8,
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }, this.generateOptions(0, 59)),
+ E('div', { 'style': 'display:flex; align-items:center; gap:5px; margin-top:6px' }, [
+ E('input', {
+ 'type': 'checkbox',
+ 'id': 'minute_checkbox',
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }),
+ E('label', { 'for': 'minute_checkbox', 'style': 'font-size:12px' }, _('every specified minute period'))
+ ])
+ ])
+ ]),
+
+ E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;width:100%' }, [
+ E('div', { 'class': 'ifacebox-head cron-hour-head', 'style': 'font-weight:bold;padding:8px;color:#ffffff;' }, [ _('Hour') ]),
+ E('div', { 'class': 'ifacebox-body', 'style': 'padding:8px' }, [
+ E('select', {
+ 'id': 'hour_select',
+ 'class': 'cbi-input-select cron-multiselect',
+ 'multiple': true,
+ 'size': 8,
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }, this.generateOptions(0, 23)),
+ E('div', { 'style': 'display:flex; align-items:center; gap:5px; margin-top:6px' }, [
+ E('input', {
+ 'type': 'checkbox',
+ 'id': 'hour_checkbox',
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }),
+ E('label', { 'for': 'hour_checkbox', 'style': 'font-size:12px' }, _('every specified hour period'))
+ ])
+ ])
+ ]),
+
+ E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;width:100%' }, [
+ E('div', { 'class': 'ifacebox-head cron-day-head', 'style': 'font-weight:bold;padding:8px;color:#ffffff;' }, [ _('Day') ]),
+ E('div', { 'class': 'ifacebox-body', 'style': 'padding:8px' }, [
+ E('select', {
+ 'id': 'day_select',
+ 'class': 'cbi-input-select cron-multiselect',
+ 'multiple': true,
+ 'size': 8,
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }, this.generateOptions(1, 31)),
+ E('div', { 'style': 'display:flex; align-items:center; gap:5px; margin-top:6px' }, [
+ E('input', {
+ 'type': 'checkbox',
+ 'id': 'day_checkbox',
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }),
+ E('label', { 'for': 'day_checkbox', 'style': 'font-size:12px' }, _('every specified day period'))
+ ])
+ ])
+ ]),
+
+ E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;width:100%' }, [
+ E('div', { 'class': 'ifacebox-head cron-month-head', 'style': 'font-weight:bold;padding:8px;color:#ffffff;' }, [ _('Month') ]),
+ E('div', { 'class': 'ifacebox-body', 'style': 'padding:8px' }, [
+ E('select', {
+ 'id': 'month_select',
+ 'class': 'cbi-input-select cron-multiselect',
+ 'multiple': true,
+ 'size': 8,
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }, this.generateOptions(1, 12, [
+ _('January'), _('February'), _('March'), _('April'), _('May'), _('June'),
+ _('July'), _('August'), _('September'), _('October'), _('November'), _('December')
+ ]))
+ ])
+ ]),
+
+ E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;width:100%' }, [
+ E('div', { 'class': 'ifacebox-head cron-weekday-head', 'style': 'font-weight:bold;padding:8px;color:#ffffff;' }, [ _('Weekday') ]),
+ E('div', { 'class': 'ifacebox-body', 'style': 'padding:8px' }, [
+ E('select', {
+ 'id': 'weekday_select',
+ 'class': 'cbi-input-select cron-multiselect',
+ 'multiple': true,
+ 'size': 8,
+ 'change': ui.createHandlerFn(this, 'updateCronPreview')
+ }, this.generateOptions(0, 6, [
+ _('Sunday'), _('Monday'), _('Tuesday'), _('Wednesday'), _('Thursday'), _('Friday'), _('Saturday')
+ ]))
+ ])
+ ])
+ ]),
+
+ E('label', { 'style': 'font-weight:bold; display:block; margin-bottom:5px;' }, _('Command to execute:')),
+ E('input', {
+ 'id': 'cron_command_input',
+ 'class': 'cbi-input-text',
+ 'style': 'width:100%; margin-bottom:10px; text-align:center;',
+ 'blur': ui.createHandlerFn(this, 'updateCronPreview')
+ }),
+
+ E('div', { 'style': 'margin-top:1em;' }, [
+ E('label', { 'style': 'font-weight:bold; display:block; margin-bottom:5px;' }, _('Command preview:')),
+ E('div', {
+ 'id': 'cron_preview',
+ 'style': 'width:100%; margin-bottom:10px; font-family:monospace; border:1px solid var(--border-color-medium); padding:8px; background:var(--tile-free); border-radius:6px; color:var(--tile-text);'
+ }),
+ ]),
+
+ // Desc
+ E('div', { 'style': 'margin-top:1em;' }, [
+ E('label', { 'style': 'font-weight:bold; display:block; margin-bottom:5px;' }, _('Description:')),
+ E('textarea', {
+ 'id': 'cron_human_text',
+ 'class': 'cbi-input-textarea',
+ 'style': 'width:100%; min-height:60px; resize:vertical;',
+ 'readonly': true
+ })
+ ]),
+
+ E('div', { 'style': 'margin-top:1em;' }, [
+ E('label', { 'style': 'font-weight:bold; display:block; margin-bottom:5px;' }, _('Generated cron command:')),
+ E('input', {
+ 'id': 'cron_preview_text',
+ 'class': 'cbi-input-text',
+ 'style': 'width:100%; margin-bottom:10px; font-family:monospace;',
+ 'readonly': true,
+ 'data-tooltip': _('Cron command for copying'),
+ 'value': '* * * * * '
+ })
+ ]),
+
+ E('div', { 'class': 'cron-actions' }, [
+ E('button', {
+ 'class': 'cbi-button cbi-button-positive',
+ 'click': ui.createHandlerFn(this, 'appendCronLine')
+ }, _('Add to cron')),
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': ui.createHandlerFn(this, function(){
+ this.resetMulti('minute_select');
+ this.resetMulti('hour_select');
+ this.resetMulti('day_select');
+ this.resetMulti('month_select');
+ this.resetMulti('weekday_select');
+ document.getElementById('cron_command_input').value = '';
+
+ const minuteCheckbox = document.getElementById('minute_checkbox');
+ const hourCheckbox = document.getElementById('hour_checkbox');
+ const dayCheckbox = document.getElementById('day_checkbox');
+ if (minuteCheckbox) minuteCheckbox.checked = false;
+ if (hourCheckbox) hourCheckbox.checked = false;
+ if (dayCheckbox) dayCheckbox.checked = false;
+
+ this.updateCronPreview();
+ })
+ }, _('Reset changes'))
+ ])
+ ]);
+
+ setTimeout(() => this.updateCronPreview(), 0);
+ return root;
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null
+});
diff --git a/luci-app-crontab-wizard/po/pl/luci-app-crontab-wizard.po b/luci-app-crontab-wizard/po/pl/luci-app-crontab-wizard.po
new file mode 100644
index 000000000..a4cbd4fc7
--- /dev/null
+++ b/luci-app-crontab-wizard/po/pl/luci-app-crontab-wizard.po
@@ -0,0 +1,200 @@
+msgid "Graphical Crontab Configurator"
+msgstr "Graficzny konfigurator crontab"
+
+msgid "Crontab Configurator"
+msgstr "Konfigurator crontab"
+
+msgid "Minute"
+msgstr "Minuta"
+
+msgid "Hour"
+msgstr "Godzina"
+
+msgid "Day"
+msgstr "Dzień"
+
+msgid "Month"
+msgstr "Miesiąc"
+
+msgid "Weekday"
+msgstr "Dzień tygodnia"
+
+msgid "Command to execute:"
+msgstr "Polecenie do wykonania:"
+
+msgid "Command preview:"
+msgstr "Wizualizacja polecenia:"
+
+msgid "Generated cron command:"
+msgstr "Wygenerowane polecenie cron:"
+
+msgid "Move to crontab"
+msgstr "Przenieś do crontab"
+
+msgid "Reset changes"
+msgstr "Resetuj zmiany"
+
+msgid "every specified minute period"
+msgstr "co podany okres minut"
+
+msgid "every specified hour period"
+msgstr "co podany okres godzin"
+
+msgid "every specified day period"
+msgstr "co podany okres dni"
+
+msgid "January"
+msgstr "Styczeń"
+
+msgid "February"
+msgstr "Luty"
+
+msgid "March"
+msgstr "Marzec"
+
+msgid "April"
+msgstr "Kwiecień"
+
+msgid "May"
+msgstr "Maj"
+
+msgid "June"
+msgstr "Czerwiec"
+
+msgid "July"
+msgstr "Lipiec"
+
+msgid "August"
+msgstr "Sierpień"
+
+msgid "September"
+msgstr "Wrzesień"
+
+msgid "October"
+msgstr "Październik"
+
+msgid "November"
+msgstr "Listopad"
+
+msgid "December"
+msgstr "Grudzień"
+
+msgid "Sunday"
+msgstr "Niedziela"
+
+msgid "Monday"
+msgstr "Poniedziałek"
+
+msgid "Tuesday"
+msgstr "Wtorek"
+
+msgid "Wednesday"
+msgstr "Środa"
+
+msgid "Thursday"
+msgstr "Czwartek"
+
+msgid "Friday"
+msgstr "Piątek"
+
+msgid "Saturday"
+msgstr "Sobota"
+
+msgid "A super simple graphical configurator for crontab."
+msgstr "Bardzo prosty graficzny konfigurator dla crontab."
+
+msgid "Please enter the command"
+msgstr "Proszę podać polecenie"
+
+msgid "Check the cron entry, it must contain (time + command)"
+msgstr "Sprawdź wpis crona, musi zawierać (czas + polecenie)"
+
+msgid "This entry already exists in cron"
+msgstr "Wpis już istnieje w cronie"
+
+msgid "This entry already exists in cron"
+msgstr "Wpis już istnieje w cronie"
+
+msgid "Added entry to cron"
+msgstr "Dodano wpis do crona"
+
+msgid "Error: %s"
+msgstr "Błąd: %s"
+
+msgid "Add to cron"
+msgstr "Dodaj do crona"
+
+msgid "Cron command for copying"
+msgstr "Polecenie cron do skopiowania"
+
+msgid "minute"
+msgstr "minuta"
+
+msgid "minutes"
+msgstr "minut(-y)"
+
+msgid "hour"
+msgstr "godzina"
+
+msgid "hours"
+msgstr "godzin(-y)"
+
+msgid "day"
+msgstr "dzień"
+
+msgid "days"
+msgstr "dni(-ach)"
+
+msgid "month"
+msgstr "miesiąc"
+
+msgid "months"
+msgstr "miesiące(-ęcy)"
+
+msgid "Description:"
+msgstr "Opis:"
+
+msgid "at time: %s"
+msgstr "o godzinie: %s"
+
+msgid "at times: %s"
+msgstr "o czasie: %s"
+
+msgid "runs every %d %s"
+msgstr "działa z okresem %d %s"
+
+msgid "in minutes: %s"
+msgstr "w minutach: %s"
+
+msgid "in hours: %s"
+msgstr "w godzinach: %s"
+
+msgid "runs every %d %s of the month"
+msgstr "z okresem co %d %s dni w miesiącu"
+
+msgid "on day(s): %s"
+msgstr "w dniu(-ach): %s"
+
+msgid "runs every %d month(s)"
+msgstr "z okresem co %d miesiąc(-ęcy)"
+
+msgid "in month(s): %s"
+msgstr "w miesiącu(-ach): %s"
+
+msgid "runs every %d day of the week"
+msgstr "działa każdego %d dnia tygodnia"
+
+msgid "on weekday(s): %s"
+msgstr "w dni(-u) tygodnia: %s"
+
+msgid "Command \"%s\" "
+msgstr "Polecenie \"%s\" "
+
+msgid "Command"
+msgstr "Polecenie"
+
+msgid "Command will run"
+msgstr "Polecenie zostanie wykonane"
+
+msgid "Command \"%s\" will run"
+msgstr "Polecenie \"%s\" zostanie wykonane"
diff --git a/luci-app-3ginfo-lite/po/zh-cn b/luci-app-crontab-wizard/po/zh-cn
similarity index 100%
rename from luci-app-3ginfo-lite/po/zh-cn
rename to luci-app-crontab-wizard/po/zh-cn
diff --git a/luci-app-crontab-wizard/po/zh_Hans/crontab-wizard.po b/luci-app-crontab-wizard/po/zh_Hans/crontab-wizard.po
new file mode 100644
index 000000000..5f2379c98
--- /dev/null
+++ b/luci-app-crontab-wizard/po/zh_Hans/crontab-wizard.po
@@ -0,0 +1,202 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: luci-app-crontab-wizard\n"
+"Language: zh_Hans\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: luci-app-crontab-wizard/root/usr/share/luci/menu.d/luci-app-crontab-wizard.json
+msgid "Scheduled Tasks"
+msgstr "计划任务"
+
+msgid "Crontab Configurator"
+msgstr "Crontab 配置向导"
+
+#: luci-app-crontab-wizard/htdocs/luci-static/resources/view/system/crontab_wizard.js
+msgid "Graphical Crontab Configurator"
+msgstr "图形化 Crontab 配置向导"
+
+msgid "A super simple graphical configurator for crontab."
+msgstr "一个超级简单的图形化 Crontab 定时任务配置工具。"
+
+msgid "Minute"
+msgstr "分钟"
+
+msgid "every specified minute period"
+msgstr "每隔指定分钟周期"
+
+msgid "Hour"
+msgstr "小时"
+
+msgid "every specified hour period"
+msgstr "每隔指定小时周期"
+
+msgid "Day"
+msgstr "日期"
+
+msgid "every specified day period"
+msgstr "每隔指定天数周期"
+
+msgid "Month"
+msgstr "月份"
+
+msgid "Weekday"
+msgstr "星期"
+
+msgid "Command to execute:"
+msgstr "要执行的命令:"
+
+msgid "Command preview:"
+msgstr "命令预览:"
+
+msgid "Description:"
+msgstr "规则说明:"
+
+msgid "Generated cron command:"
+msgstr "生成的 Cron 命令:"
+
+msgid "Cron command for copying"
+msgstr "用于复制的 Cron 命令"
+
+msgid "Add to cron"
+msgstr "添加到 Crontab"
+
+msgid "Reset changes"
+msgstr "重置更改"
+
+msgid "Please enter the command"
+msgstr "请输入命令"
+
+msgid "Check the cron entry, it must contain (time + command)"
+msgstr "请检查 Cron 条目,必须包含(时间 + 命令)"
+
+msgid "This entry already exists in cron"
+msgstr "此条目已存在于 Crontab 中"
+
+msgid "Added entry to cron"
+msgstr "已将条目添加到 Crontab"
+
+msgid "Error: %s"
+msgstr "错误:%s"
+
+msgid "Command \"%s\" "
+msgstr "命令 \"%s\" "
+
+msgid "Command"
+msgstr "命令"
+
+msgid "Command \"%s\" will run"
+msgstr "命令 \"%s\" 将运行"
+
+msgid "Command will run"
+msgstr "命令将运行"
+
+msgid "at time: %s"
+msgstr "时间:%s"
+
+msgid "at times: %s"
+msgstr "时间:%s"
+
+msgid "runs every %d %s"
+msgstr "每 %d %s运行一次"
+
+msgid "in minutes: %s"
+msgstr "在指定分钟:%s"
+
+msgid "in hours: %s"
+msgstr "在指定小时:%s"
+
+msgid "runs every %d %s of the month"
+msgstr "每月每 %d %s运行一次"
+
+msgid "on day(s): %s"
+msgstr "在日期:%s"
+
+msgid "runs every %d month(s)"
+msgstr "每 %d 个月运行一次"
+
+msgid "in month(s): %s"
+msgstr "在月份:%s"
+
+msgid "runs every %d day of the week"
+msgstr "每周每 %d 天运行一次"
+
+msgid "on weekday(s): %s"
+msgstr "在星期:%s"
+
+msgid "minute"
+msgstr "分钟"
+
+msgid "minutes"
+msgstr "分钟"
+
+msgid "hour"
+msgstr "小时"
+
+msgid "hours"
+msgstr "小时"
+
+msgid "day"
+msgstr "天"
+
+msgid "days"
+msgstr "天"
+
+msgid "Sunday"
+msgstr "星期日"
+
+msgid "Monday"
+msgstr "星期一"
+
+msgid "Tuesday"
+msgstr "星期二"
+
+msgid "Wednesday"
+msgstr "星期三"
+
+msgid "Thursday"
+msgstr "星期四"
+
+msgid "Friday"
+msgstr "星期五"
+
+msgid "Saturday"
+msgstr "星期六"
+
+msgid "January"
+msgstr "一月"
+
+msgid "February"
+msgstr "二月"
+
+msgid "March"
+msgstr "三月"
+
+msgid "April"
+msgstr "四月"
+
+msgid "May"
+msgstr "五月"
+
+msgid "June"
+msgstr "六月"
+
+msgid "July"
+msgstr "七月"
+
+msgid "August"
+msgstr "八月"
+
+msgid "September"
+msgstr "九月"
+
+msgid "October"
+msgstr "十月"
+
+msgid "November"
+msgstr "十一月"
+
+msgid "December"
+msgstr "十二月"
diff --git a/luci-app-crontab-wizard/root/usr/share/luci/menu.d/luci-app-crontab-wizard.json b/luci-app-crontab-wizard/root/usr/share/luci/menu.d/luci-app-crontab-wizard.json
new file mode 100644
index 000000000..fd254c6e1
--- /dev/null
+++ b/luci-app-crontab-wizard/root/usr/share/luci/menu.d/luci-app-crontab-wizard.json
@@ -0,0 +1,37 @@
+{
+ "admin/system/crontab": {
+ "title": "Scheduled Tasks",
+ "order": 46,
+ "action": {
+ "type": "view",
+ "path": "system/crontab"
+ },
+ "depends": {
+ "acl": [ "luci-mod-system-cron" ]
+ }
+ },
+
+ "admin/system/crontab/crontab": {
+ "title": "Scheduled Tasks",
+ "order": 46,
+ "action": {
+ "type": "view",
+ "path": "system/crontab"
+ },
+ "depends": {
+ "acl": [ "luci-mod-system-cron" ]
+ }
+ },
+
+ "admin/system/crontab/wizard": {
+ "title": "Crontab Configurator",
+ "order": 47,
+ "action": {
+ "type": "view",
+ "path": "system/crontab_wizard"
+ },
+ "depends": {
+ "acl": [ "luci-app-crontab-wizard" ]
+ }
+ }
+}
diff --git a/luci-app-crontab-wizard/root/usr/share/rpcd/acl.d/luci-mod-system-cron-wizard.json b/luci-app-crontab-wizard/root/usr/share/rpcd/acl.d/luci-mod-system-cron-wizard.json
new file mode 100644
index 000000000..3ba3889b3
--- /dev/null
+++ b/luci-app-crontab-wizard/root/usr/share/rpcd/acl.d/luci-mod-system-cron-wizard.json
@@ -0,0 +1,22 @@
+{
+ "luci-app-crontab-wizard": {
+ "description": "Grant access to luci-app-crontab-wizard",
+ "read": {
+ "file": {
+ "/etc/crontabs/root": [ "read" ]
+ },
+ "ubus": {
+ "file": [ "read" ]
+ }
+ },
+ "write": {
+ "file": {
+ "/etc/crontabs/root": [ "write" ],
+ "/etc/init.d/cron reload": [ "exec" ]
+ },
+ "ubus": {
+ "file": [ "write" ]
+ }
+ }
+ }
+}
diff --git a/luci-app-guest-wifi-js/Makefile b/luci-app-guest-wifi-js/Makefile
new file mode 100644
index 000000000..64e6b3f9f
--- /dev/null
+++ b/luci-app-guest-wifi-js/Makefile
@@ -0,0 +1,20 @@
+#
+# Copyright 2026 Rafał Wabik - IceG - From eko.one.pl forum
+#
+# Licensed to the GNU General Public License v3.0.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-guest-wifi-js
+LUCI_TITLE:=LuCI JS support for Guest Wi-Fi
+PKG_MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
+LUCI_DESCRIPTION:=LuCI JS interface for the Guest Wi-Fi
+LUCI_DEPENDS:=+luci-base +firewall4 +dnsmasq
+LUCI_PKGARCH:=all
+PKG_VERSION:=1.0.7
+PKG_RELEASE:=1
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-guest-wifi-js/htdocs/luci-static/resources/view/network/guest_wifi.js b/luci-app-guest-wifi-js/htdocs/luci-static/resources/view/network/guest_wifi.js
new file mode 100644
index 000000000..f3e331450
--- /dev/null
+++ b/luci-app-guest-wifi-js/htdocs/luci-static/resources/view/network/guest_wifi.js
@@ -0,0 +1,1083 @@
+'use strict';
+'require form';
+'require view';
+'require uci';
+'require ui';
+'require dom';
+'require tools.widgets as widgets';
+'require uqr';
+
+/*
+ Copyright 2026 Rafał Wabik - IceG - From eko.one.pl forum
+
+ Licensed to the GNU General Public License v3.0.
+*/
+
+let DEFAULTS = {
+ ssid: 'Guest-WiFi',
+ encryption: 'psk2',
+ password: '',
+ radio: 'radio0',
+ isolate: '1',
+ macaddr: '',
+ ip: '172.16.0.1',
+ netmask: '255.240.0.0',
+ dhcpStart: '100',
+ dhcpLimit: '150',
+ dhcpLease: '12h',
+ fwForwardDest: 'wan',
+ fwInput: 'REJECT',
+ fwOutput: 'ACCEPT',
+ fwForward: 'REJECT',
+ fwDhcpPorts: '67-68',
+ fwDnsPort: '53'
+};
+
+let OWNER_TAG = 'guest_owner';
+
+function addGuestWifiStyles() {
+ let style = document.createElement('style');
+ style.type = 'text/css';
+ style.textContent = '\
+ :root {\
+ --gw-badge-on-bg: #34c759;\
+ --gw-badge-off-bg: #7f8c8d;\
+ --gw-badge-text: #ffffff;\
+ --gw-badge-shadow: 0 1px 2px rgba(0,0,0,.4), 0 2px 6px rgba(0,0,0,.25);\
+ --gw-badge-border-on: transparent;\
+ --gw-badge-border-off: transparent;\
+ }\
+ :root[data-darkmode="true"] {\
+ --gw-badge-on-bg: rgba(46,204,113,0.28);\
+ --gw-badge-off-bg: rgba(255,255,255,0.12);\
+ --gw-badge-text: #e5e7eb;\
+ --gw-badge-shadow: 0 1px 2px rgba(0,0,0,.35), 0 2px 6px rgba(0,0,0,.22);\
+ --gw-badge-border-on: rgba(46,204,113,0.5);\
+ --gw-badge-border-off: rgba(255,255,255,0.3);\
+ }\
+ .gw-badge {\
+ display:inline-block;\
+ padding:4px 10px;\
+ border-radius:4px;\
+ color:var(--gw-badge-text);\
+ font-size:13px;\
+ font-weight:500;\
+ white-space:nowrap;\
+ text-align:center;\
+ border:1px solid transparent;\
+ text-shadow:var(--gw-badge-shadow);\
+ }\
+ .gw-badge-on { background:var(--gw-badge-on-bg); border-color:var(--gw-badge-border-on); }\
+ .gw-badge-off { background:var(--gw-badge-off-bg); border-color:var(--gw-badge-border-off); }\
+ ';
+ document.head.appendChild(style);
+}
+
+function ssidBadge(section_id, text) {
+ let val = uci.get('guestwifi', section_id, 'enable');
+ let enabled = (val == null) ? true : (val === '1');
+ let cls = 'gw-badge ' + (enabled ? 'gw-badge-on' : 'gw-badge-off');
+ return E('span', { 'class': cls }, text || '');
+}
+
+function radioBadge(section_id, radioName, wifiDevices) {
+ let val = uci.get('guestwifi', section_id, 'enable');
+ let enabled = (val == null) ? true : (val === '1');
+ let label = radioLabel(radioName, wifiDevices);
+
+ return E('span', { 'class': 'ifacebadge' }, [
+ E('img', { 'src': L.resource('icons/wifi%s.svg').format(enabled ? '' : '_disabled') }),
+ ' ',
+ label,
+ '\u00A0'
+ ]);
+}
+
+let ENCRYPTION_MODES = [
+ ['psk2', 'WPA2-PSK'],
+ ['sae', 'WPA3-SAE'],
+ ['sae-mixed', 'WPA2-PSK/WPA3-SAE ' + _('Mixed Mode')],
+ ['psk-mixed', 'WPA-PSK/WPA2-PSK ' + _('Mixed Mode')],
+ ['psk', 'WPA-PSK'],
+ ['owe', 'OWE (' + _('Enhanced Open') + ')'],
+ ['wep-open', _('WEP Open System')],
+ ['wep-shared', _('WEP Shared Key')],
+ ['none', _('No encryption (open network)')]
+];
+
+function encryptionLabel(key) {
+ let hit = ENCRYPTION_MODES.filter(function(m) { return m[0] === key; })[0];
+ return hit ? hit[1] : key;
+}
+
+let PASSWORD_CHARSETS = {
+ upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ lower: 'abcdefghijklmnopqrstuvwxyz',
+ digits: '1234567890',
+ special: '!@#$%^&*()-_=+[]{}?'
+};
+
+function secureRandomInt(max) {
+ let cryptoObj = window.crypto || window.msCrypto;
+ let arr = new Uint32Array(1);
+
+ if (cryptoObj && cryptoObj.getRandomValues) {
+ cryptoObj.getRandomValues(arr);
+ return arr[0] % max;
+ }
+
+ return Math.floor(Math.random() * max);
+}
+
+function shuffleArray(arr) {
+ for (let i = arr.length - 1; i > 0; i--) {
+ let j = secureRandomInt(i + 1);
+ let tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
+ }
+ return arr;
+}
+
+function generateStrongPassword(length, components) {
+ let chosenSets = (components || []).map(function(c) { return PASSWORD_CHARSETS[c]; }).filter(Boolean);
+
+ if (!chosenSets.length)
+ chosenSets = [PASSWORD_CHARSETS.lower, PASSWORD_CHARSETS.digits];
+
+ length = Math.max(parseInt(length, 10) || 0, chosenSets.length);
+ length = Math.min(Math.max(length, 8), 63);
+
+ let pool = chosenSets.join('');
+ let result = chosenSets.map(function(set) { return set.charAt(secureRandomInt(set.length)); });
+
+ for (let i = result.length; i < length; i++)
+ result.push(pool.charAt(secureRandomInt(pool.length)));
+
+ return shuffleArray(result).join('');
+}
+
+let cbiPasswordComponentsValue = form.ListValue.extend({
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ let choices = this.transformChoices();
+ let widget = new ui.Dropdown(
+ (cfgvalue != null) ? cfgvalue : this.default,
+ choices,
+ {
+ id: this.cbid(section_id),
+ sort: this.keylist,
+ optional: true,
+ multiple: true,
+ display_items: 4,
+ dropdown_items: 4,
+ select_placeholder: this.placeholder,
+ validate: L.bind(this.validate, this, section_id),
+ disabled: (this.readonly != null) ? this.readonly : this.map.readonly
+ }
+ );
+
+ window.__guestPasswordComponentsDropdown = window.__guestPasswordComponentsDropdown || {};
+ window.__guestPasswordComponentsDropdown[section_id] = widget;
+
+ return widget.render();
+ }
+});
+
+function buildSVGQRCode(data, code, options, dummy) {
+ let opts = Object.assign({
+ pixelSize: 4,
+ whiteColor: 'white',
+ blackColor: 'black',
+ ecc: 'M'
+ }, options);
+
+ let svg = uqr.renderSVG(data, opts);
+
+ if (dummy)
+ return svg;
+
+ code.style.opacity = '';
+ dom.content(code, Object.assign(E(svg), { style: 'width:100%;height:auto' }));
+}
+
+function assignNetIndexes() {
+ let defs = uci.sections('guestwifi', 'guest');
+ let used = {};
+
+ defs.forEach(function(def) {
+ let idx = parseInt(def.net_idx, 10);
+ if (idx > 0)
+ used[idx] = true;
+ });
+
+ let nextIdx = 1;
+ function takeNextFreeIdx() {
+ while (used[nextIdx]) nextIdx++;
+ used[nextIdx] = true;
+ return nextIdx;
+ }
+
+ defs.forEach(function(def) {
+ let idx = parseInt(def.net_idx, 10);
+ if (!(idx > 0))
+ uci.set('guestwifi', def['.name'], 'net_idx', String(takeNextFreeIdx()));
+ });
+}
+
+function namesForNetIndex(idx) {
+ let suf = (idx > 1) ? String(idx) : '';
+ return {
+ networkName: 'guest' + (suf ? '_' + suf : ''),
+ deviceName: 'br-guest' + suf,
+ wifiName: 'guestwifi' + (suf ? '_' + suf : ''),
+ dhcpName: 'guest' + (suf ? '_' + suf : '')
+ };
+}
+
+let IP_POOL_FIRST_OCTET = 172;
+let IP_POOL_SECOND_FIRST = 16;
+let IP_POOL_SECOND_LAST = 31;
+
+function usedInterfaceIps(excludeSid) {
+ let used = {};
+
+ uci.sections('guestwifi', 'guest').forEach(function(s) {
+ if (s['.name'] === excludeSid) return;
+ if (s.interface_ip) used[s.interface_ip] = true;
+ });
+ uci.sections('network', 'interface').forEach(function(s) {
+ if (excludeSid != null && s[OWNER_TAG] === excludeSid) return;
+ if (s.ipaddr) used[s.ipaddr] = true;
+ });
+
+ return used;
+}
+
+function randomFreeGuestIp(excludeSid) {
+ let used = usedInterfaceIps(excludeSid);
+ let candidates = [];
+
+ for (let o2 = IP_POOL_SECOND_FIRST; o2 <= IP_POOL_SECOND_LAST; o2++) {
+ let ip = IP_POOL_FIRST_OCTET + '.' + o2 + '.0.1';
+ if (!used[ip])
+ candidates.push(ip);
+ }
+
+ if (!candidates.length)
+ return null;
+
+ return candidates[Math.floor(Math.random() * candidates.length)];
+}
+
+function bandLabelForDevice(dev) {
+ if (!dev)
+ return '';
+
+ let band = dev.band;
+ if (band === '2g') return '2.4 GHz';
+ if (band === '5g') return '5 GHz';
+ if (band === '6g') return '6 GHz';
+
+ let hw = dev.hwmode || '';
+ if (/^11a/.test(hw) && !/^11ax/.test(hw)) {
+ return '5 GHz';
+ }
+ if (/^11(b|g)/.test(hw))
+ return '2.4 GHz';
+
+ let htmode = dev.htmode || '';
+ if (/^HE160|HE80|VHT/.test(htmode))
+ return '5 GHz';
+
+ return '';
+}
+
+function radioLabel(radioName, wifiDevices) {
+ let dev = wifiDevices.filter(function(d) { return d['.name'] === radioName; })[0];
+ let band = bandLabelForDevice(dev);
+ return band ? (radioName + ' (' + band + ')') : radioName;
+}
+
+function uciDeleteMatching(config, type, field, value) {
+ uci.sections(config, type).forEach(function(s) {
+ if (s[field] === value)
+ uci.remove(config, s['.name']);
+ });
+}
+
+function cleanupGuestConfig(validSids, ownerSid) {
+ function shouldRemove(s) {
+ let owner = s[OWNER_TAG];
+ if (!owner)
+ return false;
+ if (ownerSid != null)
+ return owner === ownerSid;
+ return validSids.indexOf(owner) === -1;
+ }
+
+ uci.sections('network', 'interface').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('network', s['.name']);
+ });
+ uci.sections('network', 'device').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('network', s['.name']);
+ });
+ uci.sections('wireless', 'wifi-iface').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('wireless', s['.name']);
+ });
+ uci.sections('dhcp', 'dhcp').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('dhcp', s['.name']);
+ });
+ uci.sections('firewall', 'zone').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('firewall', s['.name']);
+ });
+ uci.sections('firewall', 'forwarding').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('firewall', s['.name']);
+ });
+ uci.sections('firewall', 'rule').forEach(function(s) {
+ if (shouldRemove(s)) uci.remove('firewall', s['.name']);
+ });
+}
+
+function collectOwnerSids() {
+ let sids = {};
+
+ uci.sections('network', 'interface').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('network', 'device').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('wireless', 'wifi-iface').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('dhcp', 'dhcp').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('firewall', 'zone').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('firewall', 'forwarding').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+ uci.sections('firewall', 'rule').forEach(function(s) { if (s[OWNER_TAG]) sids[s[OWNER_TAG]] = true; });
+
+ return Object.keys(sids);
+}
+
+function importGuestNetwork(sid) {
+ let iface = uci.sections('network', 'interface').filter(function(s) { return s[OWNER_TAG] === sid; })[0];
+ let dhcp = uci.sections('dhcp', 'dhcp').filter(function(s) { return s[OWNER_TAG] === sid; })[0];
+ let wifi = uci.sections('wireless', 'wifi-iface').filter(function(s) { return s[OWNER_TAG] === sid; })[0];
+ let zone = uci.sections('firewall', 'zone').filter(function(s) { return s[OWNER_TAG] === sid; })[0];
+ let fwd = uci.sections('firewall', 'forwarding').filter(function(s) { return s[OWNER_TAG] === sid; })[0];
+ let rules = uci.sections('firewall', 'rule').filter(function(s) { return s[OWNER_TAG] === sid; });
+
+ let dhcpRule = rules.filter(function(r) { return r.proto === 'udp'; })[0];
+ let dnsRule = rules.filter(function(r) { return r.proto === 'tcpudp'; })[0];
+
+ uci.add('guestwifi', 'guest', sid);
+ uci.set('guestwifi', sid, 'enable', (wifi && wifi.disabled === '1') ? '0' : '1');
+
+ if (wifi) {
+ uci.set('guestwifi', sid, 'ssid', wifi.ssid || DEFAULTS.ssid);
+ uci.set('guestwifi', sid, 'radio', wifi.device || DEFAULTS.radio);
+ uci.set('guestwifi', sid, 'isolate', wifi.isolate || DEFAULTS.isolate);
+ if (wifi.macaddr)
+ uci.set('guestwifi', sid, 'macaddr', wifi.macaddr);
+
+ if (!wifi.encryption || wifi.encryption === 'none' || wifi.encryption === 'owe') {
+ uci.set('guestwifi', sid, 'encryption', wifi.encryption || 'none');
+ } else if (wifi.encryption === 'wep-open' || wifi.encryption === 'wep-shared') {
+ uci.set('guestwifi', sid, 'encryption', wifi.encryption);
+ uci.set('guestwifi', sid, 'password', wifi.key1 || DEFAULTS.password);
+ } else {
+ uci.set('guestwifi', sid, 'encryption', wifi.encryption);
+ uci.set('guestwifi', sid, 'password', wifi.key || DEFAULTS.password);
+ }
+ }
+
+ if (iface) {
+ uci.set('guestwifi', sid, 'interface_ip', iface.ipaddr || DEFAULTS.ip);
+ uci.set('guestwifi', sid, 'netmask', iface.netmask || DEFAULTS.netmask);
+ }
+
+ if (dhcp) {
+ uci.set('guestwifi', sid, 'dhcp_start', dhcp.start || DEFAULTS.dhcpStart);
+ uci.set('guestwifi', sid, 'dhcp_limit', dhcp.limit || DEFAULTS.dhcpLimit);
+ uci.set('guestwifi', sid, 'dhcp_lease', dhcp.leasetime || DEFAULTS.dhcpLease);
+ }
+
+ if (zone) {
+ uci.set('guestwifi', sid, 'fw_input', zone.input || DEFAULTS.fwInput);
+ uci.set('guestwifi', sid, 'fw_output', zone.output || DEFAULTS.fwOutput);
+ uci.set('guestwifi', sid, 'fw_forward', zone.forward || DEFAULTS.fwForward);
+ }
+
+ if (fwd) {
+ uci.set('guestwifi', sid, 'fw_forward_dest', fwd.dest || DEFAULTS.fwForwardDest);
+ }
+
+ if (dhcpRule) {
+ uci.set('guestwifi', sid, 'fw_dhcp_ports', dhcpRule.dest_port || DEFAULTS.fwDhcpPorts);
+ }
+
+ if (dnsRule) {
+ uci.set('guestwifi', sid, 'fw_dns_port', dnsRule.dest_port || DEFAULTS.fwDnsPort);
+ }
+}
+
+function knownGuestSids() {
+ return uci.sections('guestwifi', 'guest').map(function(s) { return s['.name']; });
+}
+
+function resolveDuplicateInterfaceIps() {
+ let seen = {};
+
+ uci.sections('guestwifi', 'guest').forEach(function(def) {
+ let sid = def['.name'];
+ let ip = def.interface_ip;
+ if (!ip) return;
+
+ if (seen[ip]) {
+ let newIp = randomFreeGuestIp(sid);
+ if (newIp) {
+ uci.set('guestwifi', sid, 'interface_ip', newIp);
+ seen[newIp] = true;
+ }
+ } else {
+ seen[ip] = true;
+ }
+ });
+}
+
+function guessLegacyInterfaceNames() {
+ return uci.sections('network', 'interface').filter(function(s) {
+ if (s[OWNER_TAG]) return false;
+ if (/^cfg[0-9a-f]+$/i.test(s['.name'])) return false;
+ return /guest/i.test(s['.name']) || /guest/i.test(s.device || '');
+ }).map(function(s) { return s['.name']; });
+}
+
+function zoneMatchesNetwork(zone, ifname) {
+ let net = zone.network;
+ if (Array.isArray(net)) return net.indexOf(ifname) !== -1;
+ return net === ifname;
+}
+
+function importLegacyGuestNetwork(ifname) {
+ let sid = ifname;
+
+ uci.set('network', ifname, OWNER_TAG, sid);
+
+ let iface = uci.sections('network', 'interface').filter(function(s) { return s['.name'] === ifname; })[0];
+ let deviceName = iface ? iface.device : null;
+
+ if (deviceName) {
+ let dev = uci.sections('network', 'device').filter(function(d) { return d.name === deviceName; })[0];
+ if (dev) uci.set('network', dev['.name'], OWNER_TAG, sid);
+ }
+
+ let dhcp = uci.sections('dhcp', 'dhcp').filter(function(d) { return d.interface === ifname; })[0];
+ if (dhcp) uci.set('dhcp', dhcp['.name'], OWNER_TAG, sid);
+
+ let wifi = uci.sections('wireless', 'wifi-iface').filter(function(w) { return w.network === ifname; })[0];
+ if (wifi) uci.set('wireless', wifi['.name'], OWNER_TAG, sid);
+
+ let zone = uci.sections('firewall', 'zone').filter(function(z) { return zoneMatchesNetwork(z, ifname); })[0];
+ if (zone) {
+ uci.set('firewall', zone['.name'], OWNER_TAG, sid);
+
+ let zoneName = zone.name || zone['.name'];
+ uci.sections('firewall', 'forwarding').forEach(function(f) {
+ if (f.src === zoneName) uci.set('firewall', f['.name'], OWNER_TAG, sid);
+ });
+ uci.sections('firewall', 'rule').forEach(function(r) {
+ if (r.src === zoneName) uci.set('firewall', r['.name'], OWNER_TAG, sid);
+ });
+ }
+
+ importGuestNetwork(sid);
+}
+
+function importExistingGuestNetworks() {
+ collectOwnerSids().forEach(function(sid) {
+ if (knownGuestSids().indexOf(sid) === -1)
+ importGuestNetwork(sid);
+ });
+
+ guessLegacyInterfaceNames().forEach(function(ifname) {
+ if (knownGuestSids().indexOf(ifname) === -1)
+ importLegacyGuestNetwork(ifname);
+ });
+}
+
+return view.extend({
+ load: function() {
+ return Promise.all([
+ uci.load('network'),
+ uci.load('wireless'),
+ uci.load('dhcp'),
+ uci.load('firewall'),
+ uci.load('guestwifi')
+ ]).then(function() {
+ importExistingGuestNetworks();
+ });
+ },
+
+ buildGuestNetwork: function(sid) {
+ let get = function(name, def) { return uci.get('guestwifi', sid, name) || def; };
+
+ let enabled = get('enable', '1') === '1';
+ let ssid = get('ssid', DEFAULTS.ssid);
+ let encryption = get('encryption', DEFAULTS.encryption);
+ let password = get('password', DEFAULTS.password);
+ let radio = get('radio', DEFAULTS.radio);
+ let isolate = get('isolate', DEFAULTS.isolate);
+ let macaddr = get('macaddr', DEFAULTS.macaddr);
+ let ip = get('interface_ip', DEFAULTS.ip);
+ let netmask = get('netmask', DEFAULTS.netmask);
+ let dhcpStart = get('dhcp_start', DEFAULTS.dhcpStart);
+ let dhcpLimit = get('dhcp_limit', DEFAULTS.dhcpLimit);
+ let dhcpLease = get('dhcp_lease', DEFAULTS.dhcpLease);
+ let fwDest = get('fw_forward_dest', DEFAULTS.fwForwardDest);
+ let fwInput = get('fw_input', DEFAULTS.fwInput);
+ let fwOutput = get('fw_output', DEFAULTS.fwOutput);
+ let fwForward = get('fw_forward', DEFAULTS.fwForward);
+ let fwDhcpPorts= get('fw_dhcp_ports', DEFAULTS.fwDhcpPorts);
+ let fwDnsPort = get('fw_dns_port', DEFAULTS.fwDnsPort);
+
+ let netIdx = parseInt(get('net_idx', ''), 10);
+ let names = namesForNetIndex(netIdx > 0 ? netIdx : 1);
+ let networkName = names.networkName;
+ let deviceName = names.deviceName;
+ let wifiName = names.wifiName;
+ let dhcpName = names.dhcpName;
+
+ // NETWORK
+ uci.add('network', 'interface', networkName);
+ uci.set('network', networkName, OWNER_TAG, sid);
+ uci.set('network', networkName, 'device', deviceName);
+ uci.set('network', networkName, 'proto', 'static');
+ uci.set('network', networkName, 'ipaddr', ip);
+ uci.set('network', networkName, 'netmask', netmask);
+
+ let devSid = uci.add('network', 'device');
+ uci.set('network', devSid, OWNER_TAG, sid);
+ uci.set('network', devSid, 'name', deviceName);
+ uci.set('network', devSid, 'type', 'bridge');
+ uci.set('network', devSid, 'bridge_empty', '1');
+
+ // DHCP
+ uci.add('dhcp', 'dhcp', dhcpName);
+ uci.set('dhcp', dhcpName, OWNER_TAG, sid);
+ uci.set('dhcp', dhcpName, 'start', dhcpStart);
+ uci.set('dhcp', dhcpName, 'limit', dhcpLimit);
+ uci.set('dhcp', dhcpName, 'leasetime', dhcpLease);
+ uci.set('dhcp', dhcpName, 'interface', networkName);
+ uci.set('dhcp', dhcpName, 'dhcpv4', 'server');
+
+ uci.set('dhcp', dhcpName, 'ignore', enabled ? '0' : '1');
+
+ // WIRELESS
+ uci.add('wireless', 'wifi-iface', wifiName);
+ uci.set('wireless', wifiName, OWNER_TAG, sid);
+ uci.set('wireless', wifiName, 'device', radio);
+ uci.set('wireless', wifiName, 'mode', 'ap');
+ uci.set('wireless', wifiName, 'network', networkName);
+ uci.set('wireless', wifiName, 'ssid', ssid);
+ uci.set('wireless', wifiName, 'isolate', isolate);
+
+ if (macaddr)
+ uci.set('wireless', wifiName, 'macaddr', macaddr);
+ uci.set('wireless', wifiName, 'disabled', enabled ? '0' : '1');
+
+ if (encryption === 'none' || encryption === 'owe') {
+ uci.set('wireless', wifiName, 'encryption', encryption);
+ } else if (encryption === 'wep-open' || encryption === 'wep-shared') {
+ uci.set('wireless', wifiName, 'encryption', encryption);
+ uci.set('wireless', wifiName, 'key', '1');
+ uci.set('wireless', wifiName, 'key1', password);
+ } else {
+ uci.set('wireless', wifiName, 'encryption', encryption);
+ uci.set('wireless', wifiName, 'key', password);
+ }
+
+ // FIREWALL
+ let zoneSid = uci.add('firewall', 'zone');
+ uci.set('firewall', zoneSid, OWNER_TAG, sid);
+ uci.set('firewall', zoneSid, 'name', networkName);
+ uci.set('firewall', zoneSid, 'network', [ networkName ]);
+ uci.set('firewall', zoneSid, 'input', fwInput);
+ uci.set('firewall', zoneSid, 'output', fwOutput);
+ uci.set('firewall', zoneSid, 'forward', fwForward);
+
+ let fwdSid = uci.add('firewall', 'forwarding');
+ uci.set('firewall', fwdSid, OWNER_TAG, sid);
+ uci.set('firewall', fwdSid, 'src', networkName);
+ uci.set('firewall', fwdSid, 'dest', fwDest);
+
+ // Rule: DHCP
+ let dhcpRuleSid = uci.add('firewall', 'rule');
+ uci.set('firewall', dhcpRuleSid, OWNER_TAG, sid);
+ uci.set('firewall', dhcpRuleSid, 'src', networkName);
+ uci.set('firewall', dhcpRuleSid, 'proto', 'udp');
+ uci.set('firewall', dhcpRuleSid, 'src_port', fwDhcpPorts);
+ uci.set('firewall', dhcpRuleSid, 'dest_port', fwDhcpPorts);
+ uci.set('firewall', dhcpRuleSid, 'target', 'ACCEPT');
+ uci.set('firewall', dhcpRuleSid, 'family', 'ipv4');
+
+ // Rule: DNS
+ let dnsRuleSid = uci.add('firewall', 'rule');
+ uci.set('firewall', dnsRuleSid, OWNER_TAG, sid);
+ uci.set('firewall', dnsRuleSid, 'src', networkName);
+ uci.set('firewall', dnsRuleSid, 'dest_port', fwDnsPort);
+ uci.set('firewall', dnsRuleSid, 'target', 'ACCEPT');
+ uci.set('firewall', dnsRuleSid, 'family', 'ipv4');
+ uci.set('firewall', dnsRuleSid, 'proto', 'tcpudp');
+ },
+
+ applyAll: function(m) {
+ let self = this;
+
+ return m.save().then(function() {
+ resolveDuplicateInterfaceIps();
+
+ assignNetIndexes();
+
+ let defs = uci.sections('guestwifi', 'guest');
+ let validSids = defs.map(function(s) { return s['.name']; });
+
+ cleanupGuestConfig(validSids, null);
+
+ defs.forEach(function(def) {
+ let sid = def['.name'];
+ cleanupGuestConfig(validSids, sid);
+ self.buildGuestNetwork(sid);
+ });
+
+ return uci.save();
+ }).then(function() {
+ return ui.changes.apply(false);
+ }).catch(function(err) {
+ ui.addNotification(null, E('p', {}, _('Error saving configuration:') + ' ' + err.message), 'error');
+ });
+ },
+
+ render: function() {
+ let self = this;
+
+ addGuestWifiStyles();
+
+ let wifiDevices = uci.sections('wireless', 'wifi-device');
+ let radios = wifiDevices.map(function(d) { return d['.name']; });
+ if (!radios.length)
+ radios = ['radio0', 'radio1', 'radio2'];
+
+ let m = new form.Map('guestwifi', _('Guest Wi-Fi'),
+ _('A user interface for easily creating and management isolated Wi-Fi networks for guests, each with its own access point, DHCP, and firewall rules.'));
+
+ self.map = m;
+
+ let s = m.section(form.GridSection, 'guest', _('Guest networks'));
+ s.anonymous = true;
+ s.addremove = true;
+ s.sortable = true;
+ s.nodescriptions = true;
+ s.addbtntitle = _('Add new guest network...');
+
+ s.tab('general', _('General'));
+ s.tab('security', _('Security'));
+ s.tab('network', _('Network & DHCP'));
+ s.tab('firewall', _('Firewall'));
+
+ let o = s.taboption('general', form.Flag, 'enable', _('Enabled'),
+ _('Enable guest network.'));
+ o.rmempty = false;
+ o.default = '1';
+ o.editable = true;
+
+ o = s.taboption('general', form.Value, 'ssid', _('Network name (SSID)'));
+ o.rmempty = false;
+ o.default = DEFAULTS.ssid;
+ o.textvalue = function(section_id) {
+ let val = this.cfgvalue(section_id) || this.default;
+ return ssidBadge(section_id, val);
+ };
+
+ o = s.taboption('general', form.ListValue, 'radio', _('Radio'),
+ _('The radio on which the guest network will work.'));
+ radios.forEach(function(r) { o.value(r, radioLabel(r, wifiDevices)); });
+ o.default = DEFAULTS.radio;
+ o.rmempty = false;
+ o.textvalue = function(section_id) {
+ let val = this.cfgvalue(section_id) || this.default;
+ return radioBadge(section_id, val, wifiDevices);
+ };
+
+ o = s.taboption('security', form.ListValue, 'encryption', _('Encryption'),
+ _('WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest security but requires WPA3-capable clients.'));
+ ENCRYPTION_MODES.forEach(function(m) { o.value(m[0], m[1]); });
+ o.default = DEFAULTS.encryption;
+ o.rmempty = false;
+ o.textvalue = function(section_id) {
+ let val = this.cfgvalue(section_id) || this.default;
+ return encryptionLabel(val);
+ };
+
+ o = s.taboption('network', form.Value, 'interface_ip', _('Interface IP address'));
+ o.datatype = 'ip4addr';
+ o.rmempty = false;
+ o.default = DEFAULTS.ip;
+ o.cfgvalue = function(section_id) {
+ let val = uci.get('guestwifi', section_id, 'interface_ip');
+ if (val) return val;
+ return randomFreeGuestIp(section_id) || DEFAULTS.ip;
+ };
+
+ o.textvalue = function(section_id) {
+ let val = this.cfgvalue(section_id) || this.default;
+ return E('code', {}, val);
+ };
+ o.validate = function(section_id, value) {
+ if (!/^(\d{1,3}\.){3}\d{1,3}$/.test(value))
+ return true;
+
+ let used = usedInterfaceIps(section_id);
+ if (!used[value])
+ return true;
+
+ let newIp = randomFreeGuestIp(section_id);
+ if (!newIp) {
+ return _('The address %s is already in use and no free address is available in the 172.16.0.1 - 172.31.0.1 range.').format(value);
+ }
+
+ let el = this.getUIElement(section_id);
+ if (el) el.setValue(newIp);
+ return true;
+ };
+
+ o = s.taboption('network', form.Value, 'netmask', _('Netmask'));
+ o.datatype = 'ip4addr';
+ o.rmempty = false;
+ o.default = DEFAULTS.netmask;
+ o.modalonly = true;
+
+ o = s.taboption('network', form.Value, 'dhcp_start', _('DHCP range start'),
+ _('Lowest leased address, as offset from the network address.'));
+ o.datatype = 'uinteger';
+ o.rmempty = false;
+ o.default = DEFAULTS.dhcpStart;
+ o.modalonly = true;
+
+ o = s.taboption('network', form.Value, 'dhcp_limit', _('DHCP client limit'),
+ _('Maximum number of leased addresses.'));
+ o.datatype = 'uinteger';
+ o.rmempty = false;
+ o.default = DEFAULTS.dhcpLimit;
+ o.modalonly = true;
+
+ o = s.taboption('network', form.Value, 'dhcp_lease', _('DHCP lease time'),
+ _('E.g. "1h", "30m", "12h". Minimum is "2m".'));
+ o.rmempty = false;
+ o.default = DEFAULTS.dhcpLease;
+
+ o = s.taboption('security', form.Value, 'password', _('Password'), ' ');
+ o.password = true;
+ o.depends('encryption', 'psk');
+ o.depends('encryption', 'psk2');
+ o.depends('encryption', 'psk-mixed');
+ o.depends('encryption', 'sae');
+ o.depends('encryption', 'sae-mixed');
+ o.depends('encryption', 'wep-open');
+ o.depends('encryption', 'wep-shared');
+ o.default = DEFAULTS.password;
+ o.modalonly = true;
+ o.validate = function(section_id, value) {
+ let enc = this.map.lookupOption('encryption', section_id)[0].formvalue(section_id);
+
+ let inputEl = document.getElementById(this.cbid(section_id));
+ let strength = inputEl ? inputEl.parentNode.querySelector('.cbi-value-description') : null;
+ let strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g"),
+ mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g"),
+ enoughRegex = new RegExp("(?=.{6,}).*", "g");
+
+ if (strength) {
+ if (!value || !value.length)
+ strength.innerHTML = '';
+ else if (false == enoughRegex.test(value))
+ strength.innerHTML = '%s: %s'.format(_('Password strength'), _('More Characters'));
+ else if (strongRegex.test(value))
+ strength.innerHTML = '%s: %s'.format(_('Password strength'), _('Strong'));
+ else if (mediumRegex.test(value))
+ strength.innerHTML = '%s: %s'.format(_('Password strength'), _('Medium'));
+ else
+ strength.innerHTML = '%s: %s'.format(_('Password strength'), _('Weak'));
+ }
+
+ if (!value)
+ return true;
+
+ if (enc === 'wep-open' || enc === 'wep-shared') {
+ let isHex = /^[0-9a-fA-F]+$/.test(value);
+ let validLength = isHex ? (value.length === 10 || value.length === 26)
+ : (value.length === 5 || value.length === 13);
+ if (!validLength)
+ return _('WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits.');
+ return true;
+ }
+
+ if (enc !== 'none' && enc !== 'owe' && value.length < 8)
+ return _('Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE).');
+
+ return true;
+ };
+
+ let passwordDependsOn = function(opt) {
+ opt.depends('encryption', 'psk');
+ opt.depends('encryption', 'psk2');
+ opt.depends('encryption', 'psk-mixed');
+ opt.depends('encryption', 'sae');
+ opt.depends('encryption', 'sae-mixed');
+ opt.depends('encryption', 'wep-open');
+ opt.depends('encryption', 'wep-shared');
+ };
+
+ o = s.taboption('security', form.Value, 'password_length', _('Password length'),
+ _('Minimum length is 8 characters, 13 characters recommended.'));
+ o.datatype = 'range(8,63)';
+ o.default = '13';
+ o.rmempty = true;
+ o.modalonly = true;
+ passwordDependsOn(o);
+
+ o = s.taboption('security', cbiPasswordComponentsValue, 'password_components', _('Password composition'),
+ _('Character types to use when generating a password.'));
+ o.value('upper', _('Uppercase letters'));
+ o.value('lower', _('Lowercase letters'));
+ o.value('digits', _('Digits'));
+ o.value('special', _('Special characters'));
+ o.default = ['upper', 'lower', 'digits', 'special'];
+ o.placeholder = _('Select password components...');
+ o.rmempty = true;
+ o.modalonly = true;
+ passwordDependsOn(o);
+
+ o = s.taboption('security', form.Button, '_password_generate', _('Generate password'));
+ o.inputtitle = _('Generate');
+ o.inputstyle = 'action';
+ o.modalonly = true;
+ passwordDependsOn(o);
+ o.onclick = function(ev, section_id) {
+ let section = this.section;
+ let lengthEl = section.getUIElement(section_id, 'password_length');
+ let componentsEl = section.getUIElement(section_id, 'password_components');
+ let passwordEl = section.getUIElement(section_id, 'password');
+
+ let length = lengthEl ? parseInt(lengthEl.getValue(), 10) : 16;
+ let components = componentsEl ? componentsEl.getValue() : [];
+
+ if (!Array.isArray(components))
+ components = components ? [components] : [];
+
+ let newPassword = generateStrongPassword(length, components);
+
+ if (passwordEl) {
+ passwordEl.setValue(newPassword);
+ if (typeof passwordEl.triggerValidation === 'function')
+ passwordEl.triggerValidation();
+ }
+ };
+
+ o = s.taboption('security', form.DummyValue, '_qrops', _('QR Code'),
+ _('Generates a QR code with the guest network data (SSID, encryption, password) so a client device can scan and connect.'));
+ o.modalonly = true;
+
+ o.createWiFiPassword = function(section_id) {
+ function pctEncode(str) {
+ let bytes = new TextEncoder().encode(str);
+ let out = '';
+
+ for (let i = 0; i < bytes.length; i++) {
+ let b = bytes[i];
+ let printable = (b >= 0x20 && b <= 0x3A && b !== 0x3B) || (b >= 0x3C && b <= 0x7E);
+
+ if (printable)
+ out += String.fromCharCode(b);
+ else
+ out += '%' + b.toString(16).toUpperCase().padStart(2, '0');
+ }
+
+ return out;
+ }
+
+ let wifiSSID = this.section.formvalue(section_id, 'ssid');
+ let wifiEncr = this.section.formvalue(section_id, 'encryption') || '';
+ let wifiKey = this.section.formvalue(section_id, 'password');
+
+ let trdisable = '';
+ if (wifiEncr === 'sae') trdisable = 0;
+ else if (wifiEncr === 'owe') trdisable = 3;
+
+ return [
+ 'WIFI:',
+ (wifiKey) ? 'T:WPA;' : null,
+ (trdisable !== '') ? 'R:' + trdisable + ';' : null,
+ 'S:' + wifiSSID + ';',
+ (wifiKey) ? 'P:' + pctEncode(wifiKey) + ';' : null
+ ].filter(Boolean).join('') + ';';
+ };
+
+ o.handleGenerateQR = function(section_id, ev) {
+ let parent = s.map;
+ let mapNode = document.querySelector('body.modal-overlay-active > #modal_overlay > .modal.cbi-modal > .cbi-map:not(.hidden)');
+ let headNode = mapNode.parentNode.querySelector('h4');
+ let wifiQRGenerator = this.createWiFiPassword.bind(this, section_id);
+
+ return Promise.all([
+ parent.save(null, true)
+ ]).then(function() {
+ let qrm, qrs, qro;
+
+ qrm = new form.JSONMap({ qrcode: {} }, null, _('Scan this QR code with the client device.'));
+ qrm.parent = parent;
+
+ qrs = qrm.section(form.NamedSection, 'qrcode');
+
+ function handleQRParamChange(ev, section_id, value) {
+ let code = this.map.findElement('.qr-code');
+ let conf = this.map.findElement('.wifi-qr-code-content');
+ let ecc = this.section.getUIElement(section_id, 'ecc');
+
+ if (this.isValid(section_id)) {
+ conf.firstChild.data = wifiQRGenerator(section_id);
+ code.style.opacity = '.5';
+ buildSVGQRCode(conf.firstChild.data, code, { ecc: ecc.getValue() });
+ }
+ }
+
+ qro = qrs.option(form.ListValue, 'ecc', _('QR Error Correction Code Level'));
+ qro.value('L', _('Low'));
+ qro.value('M', _('Medium'));
+ qro.value('Q', _('Quartile'));
+ qro.value('H', _('High'));
+ qro.onchange = handleQRParamChange;
+
+ qro = qrs.option(form.DummyValue, 'output');
+ qro.renderWidget = function() {
+ let wifi_qr = wifiQRGenerator(section_id);
+ let ecc = this.section.formvalue(section_id, 'ecc');
+
+ return E('div', {
+ 'class': 'qr-code-display',
+ 'style': 'display:flex; flex-wrap:wrap; align-items:center; gap:.5em'
+ }, [
+ E('div', { 'class': 'qr-code' }, [
+ E(buildSVGQRCode(wifi_qr, null, { ecc: ecc || undefined }, true))
+ ]),
+ E('pre', {
+ 'class': 'wifi-qr-code-content',
+ 'style': 'flex:1; overflow:auto; word-break:break-all;',
+ 'click': function(ev) {
+ let sel = window.getSelection();
+ let range = document.createRange();
+
+ range.selectNodeContents(ev.currentTarget);
+
+ sel.removeAllRanges();
+ sel.addRange(range);
+ }
+ }, [wifi_qr])
+ ]);
+ };
+
+ return qrm.render().then(function(nodes) {
+ let dStyle = mapNode.style;
+ mapNode.style.display = 'none';
+
+ let bRowStyle = mapNode.nextElementSibling.style;
+ mapNode.nextElementSibling.style.display = 'none';
+
+ headNode.appendChild(E('span', [' » ', _('Generate guest WiFi QR…')]));
+ mapNode.parentNode.appendChild(E([], [
+ nodes,
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'btn',
+ 'click': function() {
+ nodes.parentNode.removeChild(nodes.nextSibling);
+ nodes.parentNode.removeChild(nodes);
+ mapNode.style = dStyle;
+ mapNode.nextSibling.style = bRowStyle;
+ headNode.removeChild(headNode.lastChild);
+ }
+ }, [_('Back to settings')])
+ ])
+ ]));
+ });
+ });
+ };
+
+ o.cfgvalue = function(section_id) {
+ return E('button', {
+ 'class': 'btn qr-code',
+ 'style': 'display:inline-flex;align-items:center;gap:.5em',
+ 'click': ui.createHandlerFn(this, 'handleGenerateQR', section_id)
+ }, [
+ E(buildSVGQRCode('openwrt.org', null, { pixelSize: 1, ecc: 'L' }, true)),
+ _('Generate QR…')
+ ]);
+ };
+
+ o = s.taboption('security', form.ListValue, 'isolate', _('Client isolation'),
+ _('Blocks communication between clients on this guest network.'));
+ o.value('1', _('Yes'));
+ o.value('0', _('No'));
+ o.default = DEFAULTS.isolate;
+ o.rmempty = false;
+ o.modalonly = true;
+
+ o = s.taboption('security', form.Value, 'macaddr', _('MAC address'),
+ _('Override default MAC address - the range of usable addresses might be limited by the driver'));
+ o.value('', _('driver default'));
+ o.value('random', _('randomly generated'));
+ o.datatype = "or('random',macaddr)";
+ o.default = DEFAULTS.macaddr;
+ o.rmempty = true;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', widgets.ZoneSelect, 'fw_forward_dest', _('Forwarding destination zone'),
+ _('Firewall zone guest traffic is forwarded to (usually "wan"). Pick an existing zone from the list or fill out the -- custom -- field to enter one manually.'));
+ o.rmempty = false;
+ o.default = DEFAULTS.fwForwardDest;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', form.ListValue, 'fw_input', _('Input'),
+ _('Traffic from guests to the router itself (e.g. LuCI, SSH).'));
+ o.value('REJECT', _('reject')); o.value('ACCEPT', _('accept')); o.value('DROP', _('drop'));
+ o.default = DEFAULTS.fwInput;
+ o.rmempty = false;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', form.ListValue, 'fw_output', _('Output'),
+ _('Traffic from the router itself to guests. ACCEPT is recommended so router services (DHCP, DNS) keep working.'));
+ o.value('REJECT', _('reject')); o.value('ACCEPT', _('accept')); o.value('DROP', _('drop'));
+ o.default = DEFAULTS.fwOutput;
+ o.rmempty = false;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', form.ListValue, 'fw_forward', _('Forward'),
+ _('Traffic passing between guests and other networks/zones (e.g. LAN). Keep this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow guests to reach other networks.'));
+ o.value('REJECT', _('reject')); o.value('ACCEPT', _('accept')); o.value('DROP', _('drop'));
+ o.default = DEFAULTS.fwForward;
+ o.rmempty = false;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', form.Value, 'fw_dhcp_ports', _('DHCP rule ports'),
+ _('UDP port range for DHCP traffic, e.g. "67-68".'));
+ o.rmempty = false;
+ o.default = DEFAULTS.fwDhcpPorts;
+ o.modalonly = true;
+
+ o = s.taboption('firewall', form.Value, 'fw_dns_port', _('DNS rule port'));
+ o.datatype = 'port';
+ o.rmempty = false;
+ o.default = DEFAULTS.fwDnsPort;
+ o.modalonly = true;
+
+ return m.render();
+ },
+
+ handleSave: function(ev) {
+ return this.applyAll(this.map);
+ },
+ handleSaveApply: null,
+ handleReset: null
+});
diff --git a/luci-app-guest-wifi-js/po/cs/guest-wifi.po b/luci-app-guest-wifi-js/po/cs/guest-wifi.po
new file mode 100644
index 000000000..6bede3f08
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/cs/guest-wifi.po
@@ -0,0 +1,276 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: cs\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi pro hosty"
+
+msgid "Guest networks"
+msgstr "Sítě pro hosty"
+
+msgid "Add new guest network..."
+msgstr "Přidat novou síť pro hosty..."
+
+msgid "General"
+msgstr "Obecné"
+
+msgid "Security"
+msgstr "Zabezpečení"
+
+msgid "Network & DHCP"
+msgstr "Síť a DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Povoleno"
+
+msgid "Network name (SSID)"
+msgstr "Název sítě (SSID)"
+
+msgid "Radio"
+msgstr "Rádio"
+
+msgid "Interface IP address"
+msgstr "IP adresa rozhraní"
+
+msgid "Netmask"
+msgstr "Maska sítě"
+
+msgid "DHCP range start"
+msgstr "Začátek rozsahu DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Nejnižší zapůjčená adresa, jako posun (offset) od adresy sítě."
+
+msgid "DHCP client limit"
+msgstr "Limit klientů DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Maximální počet zapůjčených adres."
+
+msgid "DHCP lease time"
+msgstr "Doba zapůjčení DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Např. „1h“, „30m“, „12h“. Minimum je „2m“."
+
+msgid "Encryption"
+msgstr "Šifrování"
+
+msgid "No encryption (open network)"
+msgstr "Bez šifrování (otevřená síť)"
+
+msgid "Password"
+msgstr "Heslo"
+
+msgid "Client isolation"
+msgstr "Izolace klientů"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blokuje komunikaci mezi klienty v této síti pro hosty."
+
+msgid "Yes"
+msgstr "Ano"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Forwarding destination zone"
+msgstr "Cílová zóna přesměrování"
+
+msgid "DHCP rule ports"
+msgstr "Porty pravidla DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Rozsah portů UDP pro provoz DHCP, např. „67-68“."
+
+msgid "DNS rule port"
+msgstr "Port pravidla DNS"
+
+msgid "Error saving configuration:"
+msgstr "Chyba při ukládání konfigurace:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Uživatelské rozhraní pro snadné vytváření a správu izolovaných Wi-Fi sítí "
+"pro hosty, z nichž každá má vlastní přístupový bod, DHCP a pravidla firewallu."
+
+msgid "Enable guest network."
+msgstr "Povolit síť pro hosty."
+
+msgid "The radio on which the guest network will work."
+msgstr "Rádio, na kterém bude síť pro hosty fungovat."
+
+msgid "MAC address"
+msgstr "MAC adresa"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Přepsat výchozí MAC adresu – rozsah použitelných adres může být omezen ovladačem"
+
+msgid "randomly generated"
+msgstr "náhodně generováno"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Adresa %s se již používá a v rozsahu 172.16.0.1 - 172.31.0.1 není k dispozici "
+"žádná volná adresa."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Heslo musí mít délku alespoň 8 znaků (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Otevřený systém"
+
+msgid "WEP Shared Key"
+msgstr "WEP Sdílený klíč"
+
+msgid "Mixed Mode"
+msgstr "Smíšený režim"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK je doporučeno pro většinu zařízení. WPA3-SAE nabízí nejsilnější "
+"zabezpečení, ale vyžaduje klienty podporující WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"Klíč WEP musí mít 5 nebo 13 znaků ASCII, nebo 10 nebo 26 hexadecimálních číslic."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Zóna firewallu, do které je směrován provoz hostů (obvykle „wan“). Vyberte "
+"existující zónu ze seznamu nebo vyplňte pole -- vlastní -- pro ruční zadání."
+
+msgid "Input"
+msgstr "Vstup"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Provoz od hostů do samotného routeru (např. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Výstup"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Provoz ze samotného routeru k hostům. Doporučuje se AKCEPTOVAT (ACCEPT), aby "
+"služby routeru (DHCP, DNS) nadále fungovaly."
+
+msgid "Forward"
+msgstr "Přesměrování"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Provoz procházející mezi hosty a ostatními sítěmi/zónami (např. LAN). Ponechte "
+"ODMÍTNOUT (REJECT) nebo ZAHODIT (DROP) pro izolaci hostů od vaší sítě LAN. "
+"AKCEPTOVAT (ACCEPT) by hostům umožnilo přístup k ostatním sítím."
+
+msgid "accept"
+msgstr "akceptovat"
+
+msgid "reject"
+msgstr "odmítnout"
+
+msgid "drop"
+msgstr "zahodit"
+
+msgid "driver default"
+msgstr "výchozí ovladače"
+
+msgid "Password length"
+msgstr "Délka hesla"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Minimální délka je 8 znaků, doporučeno 13."
+
+msgid "Password composition"
+msgstr "Skladba hesla"
+
+msgid "Character types to use when generating a password."
+msgstr "Typy znaků použité při generování hesla."
+
+msgid "Uppercase letters"
+msgstr "Velká písmena"
+
+msgid "Lowercase letters"
+msgstr "Malá písmena"
+
+msgid "Digits"
+msgstr "Číslice"
+
+msgid "Special characters"
+msgstr "Speciální znaky"
+
+msgid "Select password components..."
+msgstr "Vyberte složky hesla..."
+
+msgid "Generate password"
+msgstr "Generování hesla"
+
+msgid "Generate"
+msgstr "Generovat"
+
+msgid "QR Code"
+msgstr "QR kód"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Vygeneruje QR kód s údaji hostovské sítě (SSID, šifrování, heslo), díky "
+"kterému může klientské zařízení naskenovat kód a připojit se."
+
+msgid "QR Error Correction Code Level"
+msgstr "Úroveň korekce chyb QR kódu"
+
+msgid "Low"
+msgstr "Nízká"
+
+msgid "Medium"
+msgstr "Střední"
+
+msgid "Quartile"
+msgstr "Kvartilní"
+
+msgid "High"
+msgstr "Vysoká"
+
+msgid "Scan this QR code with the client device."
+msgstr "Naskenujte tento QR kód klientským zařízením."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Generování QR kódu hostovské Wi-Fi…"
+
+msgid "Back to settings"
+msgstr "Zpět na nastavení"
+
+msgid "Generate QR…"
+msgstr "Generovat QR kód…"
diff --git a/luci-app-guest-wifi-js/po/da/guest-wifi.po b/luci-app-guest-wifi-js/po/da/guest-wifi.po
new file mode 100644
index 000000000..644957887
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/da/guest-wifi.po
@@ -0,0 +1,279 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Gæste-wi-fi"
+
+msgid "Guest networks"
+msgstr "Gæstenetværk"
+
+msgid "Add new guest network..."
+msgstr "Tilføj nyt gæstenetværk..."
+
+msgid "General"
+msgstr "Generelt"
+
+msgid "Security"
+msgstr "Sikkerhed"
+
+msgid "Network & DHCP"
+msgstr "Netværk & DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Aktiveret"
+
+msgid "Network name (SSID)"
+msgstr "Netværksnavn (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "Grænseflade-IP-adresse"
+
+msgid "Netmask"
+msgstr "Netmaske"
+
+msgid "DHCP range start"
+msgstr "DHCP-intervalstart"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Laveste leasede adresse, som offset fra netværksadressen."
+
+msgid "DHCP client limit"
+msgstr "DHCP-klientgrænse"
+
+msgid "Maximum number of leased addresses."
+msgstr "Maksimalt antal leasede adresser."
+
+msgid "DHCP lease time"
+msgstr "DHCP-leasingperiode"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "F.eks. \"1h\", \"30m\", \"12h\". Minimum er \"2m\"."
+
+msgid "Encryption"
+msgstr "Kryptering"
+
+msgid "No encryption (open network)"
+msgstr "Ingen kryptering (åbent netværk)"
+
+msgid "Password"
+msgstr "Adgangskode"
+
+msgid "Client isolation"
+msgstr "Klientisolering"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blokerer kommunikation mellem klienter på dette gæstenetværk."
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Forwarding destination zone"
+msgstr "Viderestillingsmålzone"
+
+msgid "DHCP rule ports"
+msgstr "DHCP-regelporte"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "UDP-portinterval til DHCP-trafik, f.eks. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "DNS-regelport"
+
+msgid "Error saving configuration:"
+msgstr "Fejl under lagring af konfiguration:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"En brugergrænseflade til nemt at oprette og administrere isolerede wi-fi-"
+"netværk til gæster, hver med sit eget adgangspunkt, DHCP og firewallregler."
+
+msgid "Enable guest network."
+msgstr "Aktiver gæstenetværk."
+
+msgid "The radio on which the guest network will work."
+msgstr "Den radio, som gæstenetværket vil fungere på."
+
+msgid "MAC address"
+msgstr "MAC-adresse"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Tilsidesæt standard MAC-adresse - intervallet for anvendelige adresser kan "
+"være begrænset af driveren"
+
+msgid "randomly generated"
+msgstr "tilfældigt genereret"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Adressen %s er allerede i brug, og der er ingen ledig adresse tilgængelig i "
+"intervallet 172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Adgangskoden skal være mindst 8 tegn lang (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Open System"
+
+msgid "WEP Shared Key"
+msgstr "WEP Shared Key"
+
+msgid "Mixed Mode"
+msgstr "Mixed Mode"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK anbefales til de fleste enheder. WPA3-SAE giver den stærkeste "
+"sikkerhed, men kræver WPA3-kompatible klienter."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP-nøglen skal være 5 eller 13 ASCII-tegn eller 10 eller 26 heksadecimale "
+"cifre."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Firewall-zone som gæstetrafik viderestilles til (normalt \"wan\"). Vælg en "
+"eksisterende zone fra listen eller udfyld feltet -- brugerdefineret -- "
+"for at indtaste en manuelt."
+
+msgid "Input"
+msgstr "Input"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Trafik fra gæster til selve routeren (f.eks. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Output"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Trafik fra selve routeren til gæster. ACCEPT anbefales, så routertjenester "
+"(DHCP, DNS) fortsat fungerer."
+
+msgid "Forward"
+msgstr "Viderestilling"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Trafik, der passerer mellem gæster og andre netværk/zoner (f.eks. LAN). Behold "
+"dette på REJECT eller DROP for at isolere gæster fra dit LAN. ACCEPT vil "
+"tillade gæster at nå andre netværk."
+
+msgid "accept"
+msgstr "accepter"
+
+msgid "reject"
+msgstr "afvis"
+
+msgid "drop"
+msgstr "drop"
+
+msgid "driver default"
+msgstr "driverstandard"
+
+msgid "Password length"
+msgstr "Adgangskodelængde"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Minimumslængden er 8 tegn, 13 tegn anbefales."
+
+msgid "Password composition"
+msgstr "Adgangskodesammensætning"
+
+msgid "Character types to use when generating a password."
+msgstr "Tegntyper der bruges ved generering af en adgangskode."
+
+msgid "Uppercase letters"
+msgstr "Store bogstaver"
+
+msgid "Lowercase letters"
+msgstr "Små bogstaver"
+
+msgid "Digits"
+msgstr "Tal"
+
+msgid "Special characters"
+msgstr "Specialtegn"
+
+msgid "Select password components..."
+msgstr "Vælg adgangskodekomponenter..."
+
+msgid "Generate password"
+msgstr "Generer adgangskode"
+
+msgid "Generate"
+msgstr "Generer"
+
+msgid "QR Code"
+msgstr "QR-kode"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Genererer en QR-kode med gæstenetværkets data (SSID, kryptering, "
+"adgangskode), så en klientenhed kan scanne og oprette forbindelse."
+
+msgid "QR Error Correction Code Level"
+msgstr "Fejlkorrektionsniveau for QR-kode"
+
+msgid "Low"
+msgstr "Lav"
+
+msgid "Medium"
+msgstr "Middel"
+
+msgid "Quartile"
+msgstr "Kvartil"
+
+msgid "High"
+msgstr "Høj"
+
+msgid "Scan this QR code with the client device."
+msgstr "Scan denne QR-kode med klientenheden."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Genererer QR-kode til gæste-WiFi…"
+
+msgid "Back to settings"
+msgstr "Tilbage til indstillinger"
+
+msgid "Generate QR…"
+msgstr "Generer QR-kode…"
diff --git a/luci-app-guest-wifi-js/po/de/guest-wifi.po b/luci-app-guest-wifi-js/po/de/guest-wifi.po
new file mode 100644
index 000000000..16496962c
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/de/guest-wifi.po
@@ -0,0 +1,280 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: de\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Gast-WLAN"
+
+msgid "Guest networks"
+msgstr "Gastnetzwerke"
+
+msgid "Add new guest network..."
+msgstr "Neues Gastnetzwerk hinzufügen..."
+
+msgid "General"
+msgstr "Allgemein"
+
+msgid "Security"
+msgstr "Sicherheit"
+
+msgid "Network & DHCP"
+msgstr "Netzwerk & DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Aktiviert"
+
+msgid "Network name (SSID)"
+msgstr "Netzwerkname (SSID)"
+
+msgid "Radio"
+msgstr "Funkinterface"
+
+msgid "Interface IP address"
+msgstr "Interface-IP-Adresse"
+
+msgid "Netmask"
+msgstr "Netzmaske"
+
+msgid "DHCP range start"
+msgstr "DHCP-Pool-Start"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Kleinste zugewiesene Adresse, als Offset zur Netzwerkadresse."
+
+msgid "DHCP client limit"
+msgstr "DHCP-Client-Limit"
+
+msgid "Maximum number of leased addresses."
+msgstr "Maximale Anzahl zugewiesener Adressen."
+
+msgid "DHCP lease time"
+msgstr "Gültigkeitsdauer der DHCP-Lease"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Z. B. „1h“, „30m“, „12h“. Das Minimum ist „2m“."
+
+msgid "Encryption"
+msgstr "Verschlüsselung"
+
+msgid "No encryption (open network)"
+msgstr "Keine Verschlüsselung (offenes Netzwerk)"
+
+msgid "Password"
+msgstr "Passwort"
+
+msgid "Client isolation"
+msgstr "Client-Isolierung"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blockiert die Kommunikation zwischen Clients in diesem Gastnetzwerk."
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nein"
+
+msgid "Forwarding destination zone"
+msgstr "Weiterleitungs-Zielzone"
+
+msgid "DHCP rule ports"
+msgstr "DHCP-Regelports"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "UDP-Portbereich für DHCP-Datenverkehr, z. B. „67-68“."
+
+msgid "DNS rule port"
+msgstr "DNS-Regelport"
+
+msgid "Error saving configuration:"
+msgstr "Fehler beim Speichern der Konfiguration:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Eine Benutzeroberfläche zur einfachen Erstellung und Verwaltung isolierter "
+"Gast-WLAN-Netzwerke, jeweils mit eigenem Access Point, DHCP und Firewall-Regeln."
+
+msgid "Enable guest network."
+msgstr "Gastnetzwerk aktivieren."
+
+msgid "The radio on which the guest network will work."
+msgstr "Das Funkinterface, auf dem das Gastnetzwerk betrieben wird."
+
+msgid "MAC address"
+msgstr "MAC-Adresse"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Standard-MAC-Adresse überschreiben – der Bereich der nutzbaren Adressen "
+"kann durch den Treiber eingeschränkt sein"
+
+msgid "randomly generated"
+msgstr "zufällig generiert"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Die Adresse %s wird bereits verwendet und im Bereich 172.16.0.1 - 172.31.0.1 "
+"ist keine freie Adresse verfügbar."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Das Passwort muss mindestens 8 Zeichen lang sein (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Offenes System"
+
+msgid "WEP Shared Key"
+msgstr "WEP Gemeinsamer Schlüssel"
+
+msgid "Mixed Mode"
+msgstr "Gemischter Modus"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK wird für die meisten Geräte empfohlen. WPA3-SAE bietet die stärkste "
+"Sicherheit, erfordert jedoch WPA3-fähige Clients."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"Der WEP-Schlüssel muss 5 oder 13 ASCII-Zeichen oder 10 oder 26 Hexadezimalziffern "
+"lang sein."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Firewall-Zone, an die der Gast-Datenverkehr weitergeleitet wird (normalerweise "
+"„wan“). Wählen Sie eine vorhandene Zone aus der Liste aus oder füllen Sie das "
+"Feld -- benutzerdefiniert -- aus, um eine manuell einzugeben."
+
+msgid "Input"
+msgstr "Eingang"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Datenverkehr von Gästen zum Router selbst (z. B. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Ausgang"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Datenverkehr vom Router selbst zu den Gästen. ACCEPT (Zulassen) wird "
+"empfohlen, damit die Router-Dienste (DHCP, DNS) weiterhin funktionieren."
+
+msgid "Forward"
+msgstr "Weiterleitung"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Datenverkehr zwischen Gästen und anderen Netzwerken/Zonen (z. B. LAN). Belassen "
+"Sie dies auf REJECT oder DROP, um Gäste von Ihrem LAN zu isolieren. ACCEPT "
+"würde Gästen den Zugriff auf andere Netzwerke ermöglichen."
+
+msgid "accept"
+msgstr "akzeptieren"
+
+msgid "reject"
+msgstr "ablehnen"
+
+msgid "drop"
+msgstr "verwerfen"
+
+msgid "driver default"
+msgstr "Treibervorgabe"
+
+msgid "Password length"
+msgstr "Passwortlänge"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Die Mindestlänge beträgt 8 Zeichen, empfohlen werden 13."
+
+msgid "Password composition"
+msgstr "Passwortzusammensetzung"
+
+msgid "Character types to use when generating a password."
+msgstr "Zeichentypen, die bei der Erstellung eines Passworts verwendet werden."
+
+msgid "Uppercase letters"
+msgstr "Großbuchstaben"
+
+msgid "Lowercase letters"
+msgstr "Kleinbuchstaben"
+
+msgid "Digits"
+msgstr "Ziffern"
+
+msgid "Special characters"
+msgstr "Sonderzeichen"
+
+msgid "Select password components..."
+msgstr "Passwortkomponenten auswählen..."
+
+msgid "Generate password"
+msgstr "Passwort generieren"
+
+msgid "Generate"
+msgstr "Generieren"
+
+msgid "QR Code"
+msgstr "QR-Code"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Erzeugt einen QR-Code mit den Daten des Gastnetzwerks (SSID, "
+"Verschlüsselung, Passwort), damit ein Client-Gerät ihn scannen und sich "
+"verbinden kann."
+
+msgid "QR Error Correction Code Level"
+msgstr "Fehlerkorrekturstufe des QR-Codes"
+
+msgid "Low"
+msgstr "Niedrig"
+
+msgid "Medium"
+msgstr "Mittel"
+
+msgid "Quartile"
+msgstr "Quartil"
+
+msgid "High"
+msgstr "Hoch"
+
+msgid "Scan this QR code with the client device."
+msgstr "Scannen Sie diesen QR-Code mit dem Client-Gerät."
+
+msgid "Generate guest WiFi QR…"
+msgstr "QR-Code für Gast-WLAN wird erzeugt…"
+
+msgid "Back to settings"
+msgstr "Zurück zu den Einstellungen"
+
+msgid "Generate QR…"
+msgstr "QR-Code generieren…"
diff --git a/luci-app-guest-wifi-js/po/es/guest-wifi.po b/luci-app-guest-wifi-js/po/es/guest-wifi.po
new file mode 100644
index 000000000..822116fe2
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/es/guest-wifi.po
@@ -0,0 +1,280 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: es\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi de invitados"
+
+msgid "Guest networks"
+msgstr "Redes de invitados"
+
+msgid "Add new guest network..."
+msgstr "Añadir nueva red de invitados..."
+
+msgid "General"
+msgstr "General"
+
+msgid "Security"
+msgstr "Seguridad"
+
+msgid "Network & DHCP"
+msgstr "Red y DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Activado"
+
+msgid "Network name (SSID)"
+msgstr "Nombre de la red (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "Dirección IP de la interfaz"
+
+msgid "Netmask"
+msgstr "Máscara de red"
+
+msgid "DHCP range start"
+msgstr "Inicio del rango DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Dirección asignada más baja, como compensación (offset) de la dirección de red."
+
+msgid "DHCP client limit"
+msgstr "Límite de clientes DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Número máximo de direcciones asignadas."
+
+msgid "DHCP lease time"
+msgstr "Tiempo de asignación DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Ej. \"1h\", \"30m\", \"12h\". El mínimo es \"2m\"."
+
+msgid "Encryption"
+msgstr "Cifrado"
+
+msgid "No encryption (open network)"
+msgstr "Sin cifrado (red abierta)"
+
+msgid "Password"
+msgstr "Contraseña"
+
+msgid "Client isolation"
+msgstr "Aislamiento de clientes"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Bloquea la comunicación entre clientes en esta red de invitados."
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Forwarding destination zone"
+msgstr "Zona de destino de reenvío"
+
+msgid "DHCP rule ports"
+msgstr "Puertos de la regla DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Rango de puertos UDP para el tráfico DHCP, ej. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "Puerto de la regla DNS"
+
+msgid "Error saving configuration:"
+msgstr "Error al guardar la configuración:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Una interfaz de usuario para crear y administrar fácilmente redes Wi-Fi "
+"aisladas para invitados, cada una con su propio punto de acceso, DHCP y "
+"reglas de firewall."
+
+msgid "Enable guest network."
+msgstr "Activar la red de invitados."
+
+msgid "The radio on which the guest network will work."
+msgstr "La radio en la que funcionará la red de invitados."
+
+msgid "MAC address"
+msgstr "Dirección MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Anular la dirección MAC predeterminada: el rango de direcciones utilizables "
+"puede estar limitado por el controlador"
+
+msgid "randomly generated"
+msgstr "generado aleatoriamente"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"La dirección %s ya está en uso y no hay ninguna dirección libre disponible en el "
+"rango 172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"La contraseña debe tener al menos 8 caracteres de longitud (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "Sistema abierto WEP"
+
+msgid "WEP Shared Key"
+msgstr "Clave compartida WEP"
+
+msgid "Mixed Mode"
+msgstr "Modo mixto"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"Se recomienda WPA2-PSK para la mayoría de los dispositivos. WPA3-SAE ofrece la "
+"seguridad más sólida, pero requiere clientes compatibles con WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"La clave WEP debe tener 5 o 13 caracteres ASCII, o 10 o 26 dígitos hexadecimales."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Zona del firewall a la que se reenvía el tráfico de invitados (normalmente \"wan\"). "
+"Elija una zona existente de la lista o complete el campo -- personalizado -- "
+"para ingresar una manualmente."
+
+msgid "Input"
+msgstr "Entrada"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Tráfico de los invitados hacia el propio router (ej. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Salida"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Tráfico desde el propio router hacia los invitados. Se recomienda ACEPTAR (ACCEPT) "
+"para que los servicios del router (DHCP, DNS) sigan funcionando."
+
+msgid "Forward"
+msgstr "Reenvío"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Tráfico que pasa entre los invitados y otras redes/zonas (ej. LAN). Mantenga esto "
+"en RECHAZAR (REJECT) o DESCARTAR (DROP) para aislar a los invitados de su LAN. "
+"ACEPTAR (ACCEPT) permitiría a los invitados acceder a otras redes."
+
+msgid "accept"
+msgstr "aceptar"
+
+msgid "reject"
+msgstr "rechazar"
+
+msgid "drop"
+msgstr "descartar"
+
+msgid "driver default"
+msgstr "predeterminado del controlador"
+
+msgid "Password length"
+msgstr "Longitud de la contraseña"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "La longitud mínima es de 8 caracteres, se recomiendan 13."
+
+msgid "Password composition"
+msgstr "Composición de la contraseña"
+
+msgid "Character types to use when generating a password."
+msgstr "Tipos de caracteres a usar al generar una contraseña."
+
+msgid "Uppercase letters"
+msgstr "Letras mayúsculas"
+
+msgid "Lowercase letters"
+msgstr "Letras minúsculas"
+
+msgid "Digits"
+msgstr "Dígitos"
+
+msgid "Special characters"
+msgstr "Caracteres especiales"
+
+msgid "Select password components..."
+msgstr "Seleccione los componentes de la contraseña..."
+
+msgid "Generate password"
+msgstr "Generar contraseña"
+
+msgid "Generate"
+msgstr "Generar"
+
+msgid "QR Code"
+msgstr "Código QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Genera un código QR con los datos de la red de invitados (SSID, cifrado, "
+"contraseña) para que un dispositivo cliente pueda escanearlo y conectarse."
+
+msgid "QR Error Correction Code Level"
+msgstr "Nivel de corrección de errores del código QR"
+
+msgid "Low"
+msgstr "Bajo"
+
+msgid "Medium"
+msgstr "Medio"
+
+msgid "Quartile"
+msgstr "Cuartil"
+
+msgid "High"
+msgstr "Alto"
+
+msgid "Scan this QR code with the client device."
+msgstr "Escanee este código QR con el dispositivo cliente."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Generando código QR de la red Wi-Fi de invitados…"
+
+msgid "Back to settings"
+msgstr "Volver a la configuración"
+
+msgid "Generate QR…"
+msgstr "Generar código QR…"
diff --git a/luci-app-guest-wifi-js/po/fr/guest-wifi.po b/luci-app-guest-wifi-js/po/fr/guest-wifi.po
new file mode 100644
index 000000000..10abca05e
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/fr/guest-wifi.po
@@ -0,0 +1,282 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: fr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi invités"
+
+msgid "Guest networks"
+msgstr "Réseaux invités"
+
+msgid "Add new guest network..."
+msgstr "Ajouter un nouveau réseau invités..."
+
+msgid "General"
+msgstr "Général"
+
+msgid "Security"
+msgstr "Sécurité"
+
+msgid "Network & DHCP"
+msgstr "Réseau & DHCP"
+
+msgid "Firewall"
+msgstr "Pare-feu"
+
+msgid "Enabled"
+msgstr "Activé"
+
+msgid "Network name (SSID)"
+msgstr "Nom du réseau (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "Adresse IP de l'interface"
+
+msgid "Netmask"
+msgstr "Masque de réseau"
+
+msgid "DHCP range start"
+msgstr "Début de la plage DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "La plus basse adresse louée, sous forme de décalage (offset) par rapport à l'adresse réseau."
+
+msgid "DHCP client limit"
+msgstr "Limite de clients DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Nombre maximum d'adresses louées."
+
+msgid "DHCP lease time"
+msgstr "Durée du bail DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Par ex. \"1h\", \"30m\", \"12h\". Le minimum est \"2m\"."
+
+msgid "Encryption"
+msgstr "Chiffrement"
+
+msgid "No encryption (open network)"
+msgstr "Pas de chiffrement (réseau ouvert)"
+
+msgid "Password"
+msgstr "Mot de passe"
+
+msgid "Client isolation"
+msgstr "Isolation des clients"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Bloque la communication entre les clients sur ce réseau invités."
+
+msgid "Yes"
+msgstr "Oui"
+
+msgid "No"
+msgstr "Non"
+
+msgid "Forwarding destination zone"
+msgstr "Zone de destination du transfert"
+
+msgid "DHCP rule ports"
+msgstr "Ports de la règle DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Plage de ports UDP для le trafic DHCP, par ex. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "Port de la règle DNS"
+
+msgid "Error saving configuration:"
+msgstr "Erreur lors de l'enregistrement de la configuration :"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Une interface utilisateur pour créer et gérer facilement des réseaux Wi-Fi "
+"isolés pour les invités, chacun ayant son propre point d'accès, DHCP et "
+"règles de pare-feu."
+
+msgid "Enable guest network."
+msgstr "Activer le réseau invités."
+
+msgid "The radio on which the guest network will work."
+msgstr "La radio sur laquelle le réseau invités fonctionnera."
+
+msgid "MAC address"
+msgstr "Adresse MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Remplacer l'adresse MAC par défaut - la plage d'adresses utilisables peut "
+"être limitée par le pilote"
+
+msgid "randomly generated"
+msgstr "généré aléatoirement"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"L'adresse %s est déjà utilisée et aucune adresse libre n'est disponible dans "
+"la plage 172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"Le mot de passe doit comporter au moins 8 caractères (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Système ouvert"
+
+msgid "WEP Shared Key"
+msgstr "WEP Clé partagée"
+
+msgid "Mixed Mode"
+msgstr "Mode mixte"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK est recommandé pour la plupart des appareils. WPA3-SAE offre la sécurité "
+"la plus forte mais nécessite des clients compatibles WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"La clé WEP doit comporter 5 ou 13 caractères ASCII, ou 10 ou 26 chiffres "
+"hexadécimaux."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Zone de pare-feu vers laquelle le trafic invité est transféré (généralement \"wan\"). "
+"Choisissez une zone existante dans la liste ou remplissez le champ -- personnalisé -- "
+"pour en saisir une manuellement."
+
+msgid "Input"
+msgstr "Entrée"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Trafic des invités vers le routeur lui-même (par ex. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Sortie"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Trafic du routeur lui-même vers les invités. ACCEPTER (ACCEPT) est recommandé pour que "
+"les services du routeur (DHCP, DNS) continuent de fonctionner."
+
+msgid "Forward"
+msgstr "Transfert"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Trafic circulant entre les invités et d'autres réseaux/zones (par ex. LAN). Maintenez "
+"cette option sur REJETER (REJECT) ou ABANDONNER (DROP) pour isoler les invités de votre LAN. "
+"ACCEPTER permettrait aux invités d'accéder aux autres réseaux."
+
+msgid "accept"
+msgstr "accepter"
+
+msgid "reject"
+msgstr "rejeter"
+
+msgid "drop"
+msgstr "abandonner"
+
+msgid "driver default"
+msgstr "valeur par défaut du pilote"
+
+msgid "Password length"
+msgstr "Longueur du mot de passe"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "La longueur minimale est de 8 caractères, 13 sont recommandés."
+
+msgid "Password composition"
+msgstr "Composition du mot de passe"
+
+msgid "Character types to use when generating a password."
+msgstr "Types de caractères à utiliser lors de la génération d'un mot de passe."
+
+msgid "Uppercase letters"
+msgstr "Lettres majuscules"
+
+msgid "Lowercase letters"
+msgstr "Lettres minuscules"
+
+msgid "Digits"
+msgstr "Chiffres"
+
+msgid "Special characters"
+msgstr "Caractères spéciaux"
+
+msgid "Select password components..."
+msgstr "Sélectionnez les composants du mot de passe..."
+
+msgid "Generate password"
+msgstr "Générer le mot de passe"
+
+msgid "Generate"
+msgstr "Générer"
+
+msgid "QR Code"
+msgstr "Code QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Génère un code QR avec les données du réseau invité (SSID, chiffrement, "
+"mot de passe) afin qu'un appareil client puisse le scanner et se "
+"connecter."
+
+msgid "QR Error Correction Code Level"
+msgstr "Niveau de correction d'erreur du code QR"
+
+msgid "Low"
+msgstr "Faible"
+
+msgid "Medium"
+msgstr "Moyen"
+
+msgid "Quartile"
+msgstr "Quartile"
+
+msgid "High"
+msgstr "Élevé"
+
+msgid "Scan this QR code with the client device."
+msgstr "Scannez ce code QR avec l'appareil client."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Génération du code QR du Wi-Fi invité…"
+
+msgid "Back to settings"
+msgstr "Retour aux paramètres"
+
+msgid "Generate QR…"
+msgstr "Générer le code QR…"
diff --git a/luci-app-guest-wifi-js/po/it/guest-wifi.po b/luci-app-guest-wifi-js/po/it/guest-wifi.po
new file mode 100644
index 000000000..b0eb21ba0
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/it/guest-wifi.po
@@ -0,0 +1,281 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: lt\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi ospiti"
+
+msgid "Guest networks"
+msgstr "Reti ospiti"
+
+msgid "Add new guest network..."
+msgstr "Aggiungi nuova rete ospiti..."
+
+msgid "General"
+msgstr "Generale"
+
+msgid "Security"
+msgstr "Sicurezza"
+
+msgid "Network & DHCP"
+msgstr "Rete & DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Abilitato"
+
+msgid "Network name (SSID)"
+msgstr "Nome della rete (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "Indirizzo IP dell'interfaccia"
+
+msgid "Netmask"
+msgstr "Maschera di rete"
+
+msgid "DHCP range start"
+msgstr "Inizio intervallo DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Indirizzo assegnato più basso, come scostamento (offset) dall'indirizzo di rete."
+
+msgid "DHCP client limit"
+msgstr "Limite client DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Numero massimo di indirizzi assegnati."
+
+msgid "DHCP lease time"
+msgstr "Tempo di concessione DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Es. \"1h\", \"30m\", \"12h\". Il minimo è \"2m\"."
+
+msgid "Encryption"
+msgstr "Crittografia"
+
+msgid "No encryption (open network)"
+msgstr "Nessuna crittografia (rete aperta)"
+
+msgid "Password"
+msgstr "Password"
+
+msgid "Client isolation"
+msgstr "Isolamento client"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blocca la comunicazione tra i client su questa rete ospiti."
+
+msgid "Yes"
+msgstr "Sì"
+
+msgid "No"
+msgstr "No"
+
+msgid "Forwarding destination zone"
+msgstr "Zona di destinazione del port forwarding"
+
+msgid "DHCP rule ports"
+msgstr "Porte della regola DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Intervallo di porte UDP per il traffico DHCP, es. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "Porta della regola DNS"
+
+msgid "Error saving configuration:"
+msgstr "Errore durante il salvataggio della configurazione:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Un'interfaccia utente per creare e gestire facilmente reti Wi-Fi isolate "
+"per gli ospiti, ciascuna con il proprio punto di accesso, DHCP e regole del firewall."
+
+msgid "Enable guest network."
+msgstr "Abilita rete ospiti."
+
+msgid "The radio on which the guest network will work."
+msgstr "La radio su cui funzionerà la rete ospiti."
+
+msgid "MAC address"
+msgstr "Indirizzo MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Sostituisci l'indirizzo MAC predefinito - l'intervallo di indirizzi utilizzabili "
+"potrebbe essere limitato dal driver"
+
+msgid "randomly generated"
+msgstr "generato casualmente"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"L'indirizzo %s è già in uso e nessun indirizzo libero è disponibile nell'intervallo "
+"172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"La password deve contenere almeno 8 caratteri (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "Sistema aperto WEP"
+
+msgid "WEP Shared Key"
+msgstr "Chiave condivisa WEP"
+
+msgid "Mixed Mode"
+msgstr "Modalità mista"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK è consigliato per la maggior parte dei dispositivi. WPA3-SAE offre la "
+"sicurezza più forte ma richiede client compatibili con WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"La chiave WEP deve essere composta da 5 o 13 caratteri ASCII, oppure da 10 o 26 cifre esadecimali."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Zona del firewall a cui viene inoltrato il traffico degli ospiti (di solito \"wan\"). "
+"Scegli una zona esistente dall'elenco o compila il campo -- personalizzato -- "
+"per inserirne una manualmente."
+
+msgid "Input"
+msgstr "Ingresso"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Traffico dagli ospiti verso il router stesso (es. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Uscita"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Traffico dal router stesso verso gli ospiti. Si raccomanda ACCETTA (ACCEPT) in modo che "
+"i servizi del router (DHCP, DNS) continuino a funzionare."
+
+msgid "Forward"
+msgstr "Inoltro"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Traffico che passa tra gli ospiti e altre reti/zone (es. LAN). Mantieni su "
+"RESPINGI (REJECT) o SCARTA (DROP) per isolare gli ospiti dalla tua LAN. ACCETTA "
+"consentirebbe agli ospiti di raggiungere altre reti."
+
+msgid "accept"
+msgstr "accetta"
+
+msgid "reject"
+msgstr "respingi"
+
+msgid "drop"
+msgstr "scarta"
+
+msgid "driver default"
+msgstr "predefinito del driver"
+
+msgid "Password length"
+msgstr "Lunghezza della password"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "La lunghezza minima è di 8 caratteri, consigliati 13."
+
+msgid "Password composition"
+msgstr "Composizione della password"
+
+msgid "Character types to use when generating a password."
+msgstr "Tipi di caratteri da usare durante la generazione di una password."
+
+msgid "Uppercase letters"
+msgstr "Lettere maiuscole"
+
+msgid "Lowercase letters"
+msgstr "Lettere minuscole"
+
+msgid "Digits"
+msgstr "Cifre"
+
+msgid "Special characters"
+msgstr "Caratteri speciali"
+
+msgid "Select password components..."
+msgstr "Seleziona i componenti della password..."
+
+msgid "Generate password"
+msgstr "Genera password"
+
+msgid "Generate"
+msgstr "Genera"
+
+msgid "QR Code"
+msgstr "Codice QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Genera un codice QR con i dati della rete ospiti (SSID, crittografia, "
+"password) in modo che un dispositivo client possa scansionarlo e "
+"connettersi."
+
+msgid "QR Error Correction Code Level"
+msgstr "Livello di correzione degli errori del codice QR"
+
+msgid "Low"
+msgstr "Basso"
+
+msgid "Medium"
+msgstr "Medio"
+
+msgid "Quartile"
+msgstr "Quartile"
+
+msgid "High"
+msgstr "Alto"
+
+msgid "Scan this QR code with the client device."
+msgstr "Scansiona questo codice QR con il dispositivo client."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Generazione del codice QR della Wi-Fi ospiti…"
+
+msgid "Back to settings"
+msgstr "Torna alle impostazioni"
+
+msgid "Generate QR…"
+msgstr "Genera codice QR…"
diff --git a/luci-app-guest-wifi-js/po/ja/guest-wifi.po b/luci-app-guest-wifi-js/po/ja/guest-wifi.po
new file mode 100644
index 000000000..0dc41026e
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/ja/guest-wifi.po
@@ -0,0 +1,276 @@
+msgid ""
+msgstr ""
+"Language: ja\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "ゲスト Wi-Fi"
+
+msgid "Guest networks"
+msgstr "ゲスト ネットワーク"
+
+msgid "Add new guest network..."
+msgstr "新しいゲスト ネットワークを追加..."
+
+msgid "General"
+msgstr "全般設定"
+
+msgid "Security"
+msgstr "セキュリティ設定"
+
+msgid "Network & DHCP"
+msgstr "ネットワーク & DHCP"
+
+msgid "Firewall"
+msgstr "ファイアウォール"
+
+msgid "Enabled"
+msgstr "有効"
+
+msgid "Network name (SSID)"
+msgstr "ネットワーク名 (SSID)"
+
+msgid "Radio"
+msgstr "無線インターフェース"
+
+msgid "Interface IP address"
+msgstr "インターフェース IP アドレス"
+
+msgid "Netmask"
+msgstr "ネットマスク"
+
+msgid "DHCP range start"
+msgstr "DHCP 割り当て開始アドレス"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "ネットワーク アドレスからのオフセット値となる、割り当て最小アドレスです。"
+
+msgid "DHCP client limit"
+msgstr "DHCP クライアント上限数"
+
+msgid "Maximum number of leased addresses."
+msgstr "割り当て可能な最大アドレス数です。"
+
+msgid "DHCP lease time"
+msgstr "DHCP リース時間"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "例: \"1h\"(1時間)、\"30m\"(30分)、\"12h\"(12時間)。最小値は \"2m\" です。"
+
+msgid "Encryption"
+msgstr "暗号化方式"
+
+msgid "No encryption (open network)"
+msgstr "暗号化なし (オープン ネットワーク)"
+
+msgid "Password"
+msgstr "パスワード"
+
+msgid "Client isolation"
+msgstr "クライアントの隔離"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "このゲスト ネットワーク内のクライアント間の通信をブロックします。"
+
+msgid "Yes"
+msgstr "はい"
+
+msgid "No"
+msgstr "いいえ"
+
+msgid "Forwarding destination zone"
+msgstr "転送先ゾーン"
+
+msgid "DHCP rule ports"
+msgstr "DHCP ルール ポート"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "DHCP トラフィック用の UDP ポート範囲(例: \"67-68\")です。"
+
+msgid "DNS rule port"
+msgstr "DNS ルール ポート"
+
+msgid "Error saving configuration:"
+msgstr "設定の保存中にエラーが発生しました:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"ゲスト用の隔離された Wi-Fi ネットワークを簡単に作成・管理するためのユーザー インター"
+"フェースです。それぞれに独自のアクセス ポイント、DHCP、およびファイアウォール ルールが適用されます。"
+
+msgid "Enable guest network."
+msgstr "ゲスト ネットワークを有効にする。"
+
+msgid "The radio on which the guest network will work."
+msgstr "ゲスト ネットワークが動作する無線インターフェースです。"
+
+msgid "MAC address"
+msgstr "MAC アドレス"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"デフォルトの MAC アドレスを上書きします - 使用可能なアドレス範囲は"
+"ドライバーによって制限される場合があります"
+
+msgid "randomly generated"
+msgstr "ランダム生成"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"アドレス %s はすでに使用されています。また、172.16.0.1 - 172.31.0.1 の"
+"範囲内に利用可能な空きアドレスがありません。"
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "パスワードは8文字以上である必要があります (WPA-PSK/WPA2-PSK/WPA3-SAE)。"
+
+msgid "WEP Open System"
+msgstr "WEP オープンシステム"
+
+msgid "WEP Shared Key"
+msgstr "WEP 共有キー"
+
+msgid "Mixed Mode"
+msgstr "ミックス モード"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"ほとんどのデバイスには WPA2-PSK が推奨されます。WPA3-SAE は最も強力な"
+"セキュリティを提供しますが、WPA3 対応のクライアントが必要です。"
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP キーは、5文字もしくは13文字の ASCII 文字、または10桁もしくは26桁の16進数である必要があります。"
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"ゲスト トラフィックの転送先となるファイアウォール ゾーン(通常は \"wan\")です。"
+"リストから既存のゾーンを選択するか、-- カスタム -- フィールドに入力して手動で設定してください。"
+
+msgid "Input"
+msgstr "インバウンド (受信)"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "ゲストからルーター自体へのトラフィック(例: LuCI、SSH)です。"
+
+msgid "Output"
+msgstr "アウトバウンド (送信)"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"ルーター自体からゲストへのトラフィックです。ルーターのサービス(DHCP、DNS)を"
+"正常に機能させるため、ACCEPT(許可)を推奨します。"
+
+msgid "Forward"
+msgstr "フォワード (転送)"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"ゲストと他のネットワーク/ゾーン(例: LAN)の間を通過するトラフィックです。"
+"ゲストを LAN から隔離するには、REJECT(拒否)または DROP(破棄)のままにしてください。"
+"ACCEPT(許可)にすると、ゲストが他のネットワークにアクセスできるようになります。"
+
+msgid "accept"
+msgstr "accept (許可)"
+
+msgid "reject"
+msgstr "reject (拒否)"
+
+msgid "drop"
+msgstr "drop (破棄)"
+
+msgid "driver default"
+msgstr "ドライバーのデフォルト値"
+
+msgid "Password length"
+msgstr "パスワードの長さ"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "最小長は8文字です。13文字を推奨します。"
+
+msgid "Password composition"
+msgstr "パスワードの構成"
+
+msgid "Character types to use when generating a password."
+msgstr "パスワード生成時に使用する文字の種類。"
+
+msgid "Uppercase letters"
+msgstr "大文字"
+
+msgid "Lowercase letters"
+msgstr "小文字"
+
+msgid "Digits"
+msgstr "数字"
+
+msgid "Special characters"
+msgstr "特殊文字"
+
+msgid "Select password components..."
+msgstr "パスワードの構成要素を選択..."
+
+msgid "Generate password"
+msgstr "パスワードの生成"
+
+msgid "Generate"
+msgstr "生成"
+
+msgid "QR Code"
+msgstr "QRコード"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"ゲストネットワークのデータ(SSID、暗号化方式、パスワード)を含むQRコードを"
+"生成し、クライアント端末でスキャンして接続できるようにします。"
+
+msgid "QR Error Correction Code Level"
+msgstr "QRコードの誤り訂正レベル"
+
+msgid "Low"
+msgstr "低"
+
+msgid "Medium"
+msgstr "中"
+
+msgid "Quartile"
+msgstr "四分位"
+
+msgid "High"
+msgstr "高"
+
+msgid "Scan this QR code with the client device."
+msgstr "クライアント端末でこのQRコードをスキャンしてください。"
+
+msgid "Generate guest WiFi QR…"
+msgstr "ゲストWi-Fi用QRコードを生成中…"
+
+msgid "Back to settings"
+msgstr "設定に戻る"
+
+msgid "Generate QR…"
+msgstr "QRコードを生成…"
diff --git a/luci-app-guest-wifi-js/po/ko/guest-wifi.po b/luci-app-guest-wifi-js/po/ko/guest-wifi.po
new file mode 100644
index 000000000..10289e7e4
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/ko/guest-wifi.po
@@ -0,0 +1,275 @@
+msgid ""
+msgstr ""
+"Language: ko\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "게스트 Wi-Fi"
+
+msgid "Guest networks"
+msgstr "게스트 네트워크"
+
+msgid "Add new guest network..."
+msgstr "새 게스트 네트워크 추가..."
+
+msgid "General"
+msgstr "일반 설정"
+
+msgid "Security"
+msgstr "보안 설정"
+
+msgid "Network & DHCP"
+msgstr "네트워크 및 DHCP"
+
+msgid "Firewall"
+msgstr "방화벽"
+
+msgid "Enabled"
+msgstr "활성화됨"
+
+msgid "Network name (SSID)"
+msgstr "네트워크 이름 (SSID)"
+
+msgid "Radio"
+msgstr "무선 디바이스"
+
+msgid "Interface IP address"
+msgstr "인터페이스 IP 주소"
+
+msgid "Netmask"
+msgstr "넷마스크"
+
+msgid "DHCP range start"
+msgstr "DHCP 할당 시작 주소"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "네트워크 주소로부터의 오프셋 값으로 계산되는 가장 낮은 임대 주소입니다."
+
+msgid "DHCP client limit"
+msgstr "DHCP 클라이언트 제한"
+
+msgid "Maximum number of leased addresses."
+msgstr "임대 가능한 최대 주소 수입니다."
+
+msgid "DHCP lease time"
+msgstr "DHCP 임대 시간"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "예: \"1h\", \"30m\", \"12h\". 최소값은 \"2m\"입니다."
+
+msgid "Encryption"
+msgstr "암호화 방식"
+
+msgid "No encryption (open network)"
+msgstr "암호화 없음 (개방형 네트워크)"
+
+msgid "Password"
+msgstr "비밀번호"
+
+msgid "Client isolation"
+msgstr "클라이언트 격리"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "이 게스트 네트워크에 연결된 클라이언트 간의 통신을 차단합니다."
+
+msgid "Yes"
+msgstr "예"
+
+msgid "No"
+msgstr "아니요"
+
+msgid "Forwarding destination zone"
+msgstr "전달 대상 구역"
+
+msgid "DHCP rule ports"
+msgstr "DHCP 규칙 포트"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "DHCP 트래픽용 UDP 포트 범위 (예: \"67-68\")."
+
+msgid "DNS rule port"
+msgstr "DNS 규칙 포트"
+
+msgid "Error saving configuration:"
+msgstr "설정 저장 중 오류 발생:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"각각 독립된 액세스 포인트, DHCP 및 방화벽 규칙을 갖는 게스트용 격리 무선 "
+"네트워크를 쉽게 생성하고 관리할 수 있는 사용자 인터페이스입니다."
+
+msgid "Enable guest network."
+msgstr "게스트 네트워크를 활성화합니다."
+
+msgid "The radio on which the guest network will work."
+msgstr "게스트 네트워크가 동작할 무선 디바이스입니다."
+
+msgid "MAC address"
+msgstr "MAC 주소"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"기본 MAC 주소 재정의 - 사용 가능한 주소 범위가 드라이버에 의해 제한될 수 있습니다"
+
+msgid "randomly generated"
+msgstr "무작위로 생성됨"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"주소 %s은(는) 이미 사용 중이며 172.16.0.1 - 172.31.0.1 범위 내에 사용할 수 있는 "
+"빈 주소가 없습니다."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "비밀번호는 최소 8자 이상이어야 합니다 (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP 오픈 시스템"
+
+msgid "WEP Shared Key"
+msgstr "WEP 공유 키"
+
+msgid "Mixed Mode"
+msgstr "혼합 모드"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"대부분의 기기에는 WPA2-PSK를 권장합니다. WPA3-SAE는 가장 강력한 보안을 제공하지만 "
+"WPA3을 지원하는 클라이언트가 필요합니다."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP 키는 5자 또는 13자의 ASCII 문자이거나, 10자리 또는 26자리의 16진수여야 합니다."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"게스트 트래픽이 전달될 방화벽 구역입니다 (보통 \"wan\"). 목록에서 기존 구역을 "
+"선택하거나 -- 사용자 정의 -- 필드를 작성하여 수동으로 입력하십시오."
+
+msgid "Input"
+msgstr "입력 (Inbound)"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "게스트로부터 라우터 자체로 향하는 트래픽입니다 (예: LuCI, SSH)."
+
+msgid "Output"
+msgstr "출력 (Outbound)"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"라우터 자체에서 게스트로 향하는 트래픽입니다. 라우터 서비스(DHCP, DNS)가 정상적으로 "
+"작동할 수 있도록 허용(ACCEPT)을 권장합니다."
+
+msgid "Forward"
+msgstr "전달 (Forward)"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"게스트와 다른 네트워크/구역(예: LAN) 간에 통과하는 트래픽입니다. 게스트를 LAN으로부터 "
+"격리하려면 거부(REJECT) 또는 버림(DROP)으로 유지하십시오. 허용(ACCEPT)으로 설정하면 "
+"게스트가 다른 네트워크에 접근할 수 있습니다."
+
+msgid "accept"
+msgstr "허용 (accept)"
+
+msgid "reject"
+msgstr "거부 (reject)"
+
+msgid "drop"
+msgstr "버림 (drop)"
+
+msgid "driver default"
+msgstr "드라이버 기본값"
+
+msgid "Password length"
+msgstr "비밀번호 길이"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "최소 길이는 8자이며, 13자를 권장합니다."
+
+msgid "Password composition"
+msgstr "비밀번호 구성"
+
+msgid "Character types to use when generating a password."
+msgstr "비밀번호를 생성할 때 사용할 문자 유형입니다."
+
+msgid "Uppercase letters"
+msgstr "대문자"
+
+msgid "Lowercase letters"
+msgstr "소문자"
+
+msgid "Digits"
+msgstr "숫자"
+
+msgid "Special characters"
+msgstr "특수 문자"
+
+msgid "Select password components..."
+msgstr "비밀번호 구성 요소 선택..."
+
+msgid "Generate password"
+msgstr "비밀번호 생성"
+
+msgid "Generate"
+msgstr "생성"
+
+msgid "QR Code"
+msgstr "QR 코드"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"클라이언트 기기가 스캔하여 연결할 수 있도록 게스트 네트워크 데이터(SSID, "
+"암호화, 비밀번호)가 포함된 QR 코드를 생성합니다."
+
+msgid "QR Error Correction Code Level"
+msgstr "QR 코드 오류 수정 수준"
+
+msgid "Low"
+msgstr "낮음"
+
+msgid "Medium"
+msgstr "보통"
+
+msgid "Quartile"
+msgstr "사분위"
+
+msgid "High"
+msgstr "높음"
+
+msgid "Scan this QR code with the client device."
+msgstr "클라이언트 기기로 이 QR 코드를 스캔하세요."
+
+msgid "Generate guest WiFi QR…"
+msgstr "게스트 Wi-Fi QR 코드 생성 중…"
+
+msgid "Back to settings"
+msgstr "설정으로 돌아가기"
+
+msgid "Generate QR…"
+msgstr "QR 코드 생성…"
diff --git a/luci-app-guest-wifi-js/po/nl/guest-wifi.po b/luci-app-guest-wifi-js/po/nl/guest-wifi.po
new file mode 100644
index 000000000..5987705cc
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/nl/guest-wifi.po
@@ -0,0 +1,280 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: nl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Gast-wifi"
+
+msgid "Guest networks"
+msgstr "Gastnetwerken"
+
+msgid "Add new guest network..."
+msgstr "Nieuw gastnetwerk toevoegen..."
+
+msgid "General"
+msgstr "Algemeen"
+
+msgid "Security"
+msgstr "Beveiliging"
+
+msgid "Network & DHCP"
+msgstr "Netwerk & DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Ingeschakeld"
+
+msgid "Network name (SSID)"
+msgstr "Netwerknaam (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "IP-adres van interface"
+
+msgid "Netmask"
+msgstr "Netmasker"
+
+msgid "DHCP range start"
+msgstr "Start DHCP-bereik"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Laagste geleased adres, als offset van het netwerkadres."
+
+msgid "DHCP client limit"
+msgstr "DHCP-clientlimiet"
+
+msgid "Maximum number of leased addresses."
+msgstr "Maximaal aantal geleasde adressen."
+
+msgid "DHCP lease time"
+msgstr "DHCP-leasetijd"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Bijv. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+
+msgid "Encryption"
+msgstr "Versleuteling"
+
+msgid "No encryption (open network)"
+msgstr "Geen versleuteling (open netwerk)"
+
+msgid "Password"
+msgstr "Wachtwoord"
+
+msgid "Client isolation"
+msgstr "Client-isolatie"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blokkeert communicatie tussen clients op dit gastnetwerk."
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nee"
+
+msgid "Forwarding destination zone"
+msgstr "Doelzone voor doorsturen"
+
+msgid "DHCP rule ports"
+msgstr "DHCP-regelpoorten"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "UDP-poortbereik voor DHCP-verkeer, bijv. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "DNS-regelpoort"
+
+msgid "Error saving configuration:"
+msgstr "Fout bij opslaan van configuratie:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Een gebruikersinterface om eenvoudig geïsoleerde wifi-netwerken voor gasten "
+"aan te maken en te beheren, elk met een eigen toegangspunt, DHCP en firewallregels."
+
+msgid "Enable guest network."
+msgstr "Gastnetwerk inschakelen."
+
+msgid "The radio on which the guest network will work."
+msgstr "De radio waarop het gastnetwerk zal werken."
+
+msgid "MAC address"
+msgstr "MAC-adres"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Standaard MAC-adres overschrijven - het bereik van bruikbare adressen kan "
+"beperkt zijn door het stuurprogramma"
+
+msgid "randomly generated"
+msgstr "willekeurig gegenereerd"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Het adres %s is al in gebruik en er is geen vrij adres beschikbaar in het "
+"bereik 172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"Wachtwoord moet minstens 8 tekens lang zijn (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Open Systeem"
+
+msgid "WEP Shared Key"
+msgstr "WEP Gedeelde Sleutel"
+
+msgid "Mixed Mode"
+msgstr "Gemengde Modus"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK wordt aanbevolen voor de meeste apparaten. WPA3-SAE biedt de sterkste "
+"beveiliging, maar vereist clients die WPA3 ondersteunen."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP-sleutel moet 5 of 13 ASCII-tekens zijn, of 10 of 26 hexadecimale cijfers."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Firewallzone waarnaar gastverkeer wordt doorgestuurd (meestal \"wan\"). Kies een "
+"bestaande zone uit de lijst of vul het veld -- aangepast -- in om er "
+"handmatig een in te voeren."
+
+msgid "Input"
+msgstr "Inkomend"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Verkeer van gasten naar de router zelf (bijv. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Uitgaand"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Verkeer van de router zelf naar gasten. ACCEPTEREN (ACCEPT) wordt aanbevolen "
+"zodat routerdiensten (DHCP, DNS) blijven werken."
+
+msgid "Forward"
+msgstr "Doorsturen"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Verkeer tussen gasten en andere netwerken/zones (bijv. LAN). Houd dit op "
+"WEIGEREN (REJECT) of VERWERPEN (DROP) om gasten van uw LAN te isoleren. "
+"ACCEPTEREN zou gasten toegang geven tot andere netwerken."
+
+msgid "accept"
+msgstr "accepteren"
+
+msgid "reject"
+msgstr "weigeren"
+
+msgid "drop"
+msgstr "verwerpen"
+
+msgid "driver default"
+msgstr "standaard van stuurprogramma"
+
+msgid "Password length"
+msgstr "Wachtwoordlengte"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "De minimale lengte is 8 tekens, 13 tekens aanbevolen."
+
+msgid "Password composition"
+msgstr "Samenstelling van het wachtwoord"
+
+msgid "Character types to use when generating a password."
+msgstr "Tekentypen om te gebruiken bij het genereren van een wachtwoord."
+
+msgid "Uppercase letters"
+msgstr "Hoofdletters"
+
+msgid "Lowercase letters"
+msgstr "Kleine letters"
+
+msgid "Digits"
+msgstr "Cijfers"
+
+msgid "Special characters"
+msgstr "Speciale tekens"
+
+msgid "Select password components..."
+msgstr "Selecteer wachtwoordonderdelen..."
+
+msgid "Generate password"
+msgstr "Wachtwoord genereren"
+
+msgid "Generate"
+msgstr "Genereren"
+
+msgid "QR Code"
+msgstr "QR-code"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Genereert een QR-code met de gegevens van het gastnetwerk (SSID, "
+"versleuteling, wachtwoord) zodat een clientapparaat kan scannen en "
+"verbinding maken."
+
+msgid "QR Error Correction Code Level"
+msgstr "Foutcorrectieniveau van de QR-code"
+
+msgid "Low"
+msgstr "Laag"
+
+msgid "Medium"
+msgstr "Gemiddeld"
+
+msgid "Quartile"
+msgstr "Kwartiel"
+
+msgid "High"
+msgstr "Hoog"
+
+msgid "Scan this QR code with the client device."
+msgstr "Scan deze QR-code met het clientapparaat."
+
+msgid "Generate guest WiFi QR…"
+msgstr "QR-code voor gast-wifi genereren…"
+
+msgid "Back to settings"
+msgstr "Terug naar instellingen"
+
+msgid "Generate QR…"
+msgstr "QR-code genereren…"
diff --git a/luci-app-guest-wifi-js/po/pl/guest-wifi.po b/luci-app-guest-wifi-js/po/pl/guest-wifi.po
new file mode 100644
index 000000000..6754f1fa1
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/pl/guest-wifi.po
@@ -0,0 +1,276 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Guest Wi-Fi"
+msgstr "Sieć gościnna"
+
+msgid "Guest networks"
+msgstr "Sieci gościnne"
+
+msgid "Add new guest network..."
+msgstr "Dodaj nową sieć gościnną..."
+
+msgid "General"
+msgstr "Ogólne"
+
+msgid "Security"
+msgstr "Bezpieczeństwo"
+
+msgid "Network & DHCP"
+msgstr "Sieć i DHCP"
+
+msgid "Firewall"
+msgstr "Zapora sieciowa"
+
+msgid "Enabled"
+msgstr "Włączona"
+
+msgid "Network name (SSID)"
+msgstr "Nazwa sieci (SSID)"
+
+msgid "Radio"
+msgstr "Radio"
+
+msgid "Interface IP address"
+msgstr "Adres IP interfejsu"
+
+msgid "Netmask"
+msgstr "Maska sieci"
+
+msgid "DHCP range start"
+msgstr "Początek zakresu DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Najniższy przydzielany adres, jako offset od adresu sieci."
+
+msgid "DHCP client limit"
+msgstr "Limit klientów DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Maksymalna liczba przydzielanych adresów."
+
+msgid "DHCP lease time"
+msgstr "Czas dzierżawy DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Np. „1h”, „30m”, „12h”. Minimum to „2m”."
+
+msgid "Encryption"
+msgstr "Szyfrowanie"
+
+msgid "No encryption (open network)"
+msgstr "Brak szyfrowania (sieć otwarta)"
+
+msgid "Password"
+msgstr "Hasło"
+
+msgid "Client isolation"
+msgstr "Izolacja klientów"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Blokuje komunikację między klientami tej sieci gościnnej."
+
+msgid "Yes"
+msgstr "Tak"
+
+msgid "No"
+msgstr "Nie"
+
+msgid "Forwarding destination zone"
+msgstr "Strefa docelowa przekierowania"
+
+msgid "DHCP rule ports"
+msgstr "Porty reguły DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Zakres portów UDP dla ruchu DHCP, np. „67-68”."
+
+msgid "DNS rule port"
+msgstr "Port reguły DNS"
+
+msgid "Error saving configuration:"
+msgstr "Błąd podczas zapisywania konfiguracji:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Interfejs użytkownika do łatwego zarządzania izolowanymi "
+"sieciami Wi-Fi dla gości, z których każda ma własny punkt dostępowy, DHCP "
+"i reguły zapory."
+
+msgid "Enable guest network."
+msgstr "Włącz sieć gośinną."
+
+msgid "The radio on which the guest network will work."
+msgstr "Radio na którym będzie pracować sieć gościnna."
+
+msgid "MAC address"
+msgstr "Adres MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Nadpisz domyślny adres MAC - zakres dostępnych adresów może być ograniczony "
+"przez sterownik"
+
+msgid "randomly generated"
+msgstr "wygenerowany losowo"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Adres %s jest już używany i brak wolnego adresu w zakresie 172.16.0.1 - "
+"172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Hasło musi mieć co najmniej 8 znaków (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP System otwarty"
+
+msgid "WEP Shared Key"
+msgstr "WEP Klucz współdzielony"
+
+msgid "Mixed Mode"
+msgstr "Tryb mieszany"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK jest zalecane dla większości urządzeń. WPA3-SAE oferuje "
+"najsilniejsze zabezpieczenia, ale wymaga klientów obsługujących WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"Klucz WEP musi mieć 5 lub 13 znaków ASCII, albo 10 lub 26 cyfr "
+"szesnastkowych."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Strefa zapory, do której przekazywany jest ruch gościnny (zwykle „wan”). "
+"Wybierz istniejącą strefę z listy lub wypełnij pole -- własne --,"
+" aby wpisać ją ręcznie."
+
+msgid "Input"
+msgstr "Ruch przychodzący"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Ruch od gości do samego routera (np. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Ruch wychodzący"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Ruch od samego routera do gości. Zalecane jest AKCEPTUJ, aby usługi "
+"routera (DHCP, DNS) nadal działały."
+
+msgid "Forward"
+msgstr "Ruch przekazujący"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Ruch przechodzący między gośćmi a innymi sieciami/strefami (np. LAN). "
+"Pozostaw ODRZUCAJ lub PORZURCAJ, aby izolować gości od sieci LAN. AKCEPTUJ"
+" pozwoliłby gościom na dostęp do innych sieci."
+
+msgid "accept"
+msgstr "accept"
+
+msgid "reject"
+msgstr "reject"
+
+msgid "drop"
+msgstr "drop"
+
+msgid "driver default"
+msgstr "domyślne sterownika"
+
+msgid "Password length"
+msgstr "Długość hasła"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Minimalna długość to 8 znaków, zalecane 13."
+
+msgid "Password composition"
+msgstr "Składowe hasła"
+
+msgid "Character types to use when generating a password."
+msgstr "Rodzaje znaków używane podczas generowania hasła."
+
+msgid "Uppercase letters"
+msgstr "Wielkie litery"
+
+msgid "Lowercase letters"
+msgstr "Małe litery"
+
+msgid "Digits"
+msgstr "Cyfry"
+
+msgid "Special characters"
+msgstr "Znaki specjalne"
+
+msgid "Select password components..."
+msgstr "Wybierz składowe hasła..."
+
+msgid "Generate password"
+msgstr "Generowanie hasła"
+
+msgid "Generate"
+msgstr "Generuj"
+
+msgid "QR Code"
+msgstr "Kod QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Generuje kod QR z danymi sieci gościnnej (SSID, szyfrowanie, hasło), "
+"dzięki któremu urządzenie klienckie może zeskanować kod i połączyć się "
+"z siecią."
+
+msgid "QR Error Correction Code Level"
+msgstr "Poziom korekcji błędów kodu QR"
+
+msgid "Low"
+msgstr "Niski"
+
+msgid "Medium"
+msgstr "Średni"
+
+msgid "Quartile"
+msgstr "Kwartylowy"
+
+msgid "High"
+msgstr "Wysoki"
+
+msgid "Scan this QR code with the client device."
+msgstr "Zeskanuj ten kod QR za pomocą urządzenia klienckiego."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Generowanie kodu QR sieci gościnnej…"
+
+msgid "Back to settings"
+msgstr "Powrót do ustawień"
+
+msgid "Generate QR…"
+msgstr "Generuj kod QR…"
diff --git a/luci-app-guest-wifi-js/po/pt_BR/guest-wifi.po b/luci-app-guest-wifi-js/po/pt_BR/guest-wifi.po
new file mode 100644
index 000000000..0e008e8df
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/pt_BR/guest-wifi.po
@@ -0,0 +1,280 @@
+msgid ""
+msgstr ""
+"Language: pt_BR\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi de Convidados"
+
+msgid "Guest networks"
+msgstr "Redes de convidados"
+
+msgid "Add new guest network..."
+msgstr "Adicionar nova rede de convidados..."
+
+msgid "General"
+msgstr "Geral"
+
+msgid "Security"
+msgstr "Segurança"
+
+msgid "Network & DHCP"
+msgstr "Rede & DHCP"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Enabled"
+msgstr "Ativado"
+
+msgid "Network name (SSID)"
+msgstr "Nome da rede (SSID)"
+
+msgid "Radio"
+msgstr "Rádio"
+
+msgid "Interface IP address"
+msgstr "Endereço IP da interface"
+
+msgid "Netmask"
+msgstr "Máscara de rede"
+
+msgid "DHCP range start"
+msgstr "Início do intervalo DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Menor endereço concedido, como um deslocamento do endereço de rede."
+
+msgid "DHCP client limit"
+msgstr "Limite de clientes DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Número máximo de endereços concedidos."
+
+msgid "DHCP lease time"
+msgstr "Tempo de concessão DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Ex: \"1h\", \"30m\", \"12h\". O mínimo é \"2m\"."
+
+msgid "Encryption"
+msgstr "Criptografia"
+
+msgid "No encryption (open network)"
+msgstr "Sem criptografia (rede aberta)"
+
+msgid "Password"
+msgstr "Senha"
+
+msgid "Client isolation"
+msgstr "Isolamento de clientes"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Bloqueia a comunicação entre clientes nesta rede de convidados."
+
+msgid "Yes"
+msgstr "Sim"
+
+msgid "No"
+msgstr "Não"
+
+msgid "Forwarding destination zone"
+msgstr "Zona de destino do encaminhamento"
+
+msgid "DHCP rule ports"
+msgstr "Portas da regra DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Intervalo de portas UDP para tráfego DHCP, ex: \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "Porta da regra DNS"
+
+msgid "Error saving configuration:"
+msgstr "Erro ao salvar a configuração:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Uma interface de usuário para criar e gerenciar facilmente redes Wi-Fi "
+"isoladas para convidados, cada uma com seu próprio ponto de acesso, DHCP e "
+"regras de firewall."
+
+msgid "Enable guest network."
+msgstr "Ativar rede de convidados."
+
+msgid "The radio on which the guest network will work."
+msgstr "O rádio no qual a rede de convidados irá funcionar."
+
+msgid "MAC address"
+msgstr "Endereço MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Substituir o endereço MAC padrão - o intervalo de endereços utilizáveis pode "
+"ser limitado pelo driver"
+
+msgid "randomly generated"
+msgstr "gerado aleatoriamente"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"O endereço %s já está em uso e nenhum endereço livre está disponível no "
+"intervalo 172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"A senha deve ter pelo menos 8 caracteres (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "Sistema Aberto WEP"
+
+msgid "WEP Shared Key"
+msgstr "Chave Compartilhada WEP"
+
+msgid "Mixed Mode"
+msgstr "Modo Misto"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"O WPA2-PSK é recomendado para a maioria dos dispositivos. O WPA3-SAE oferece a "
+"segurança mais forte, mas requer clientes compatíveis com WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"A chave WEP deve ter 5 ou 13 caracteres ASCII, ou 10 ou 26 dígitos "
+"hexadecimais."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Zona do firewall para onde o tráfego de convidados é encaminhado (geralmente \"wan\"). "
+"Escolha uma zona existente da lista ou preencha o campo -- personalizado -- "
+"para inserir uma manualmente."
+
+msgid "Input"
+msgstr "Entrada"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Tráfego dos convidados para o próprio roteador (ex: LuCI, SSH)."
+
+msgid "Output"
+msgstr "Saída"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Tráfego do próprio roteador para os convidados. Recomenda-se ACEITAR (ACCEPT) "
+"para que os serviços do roteador (DHCP, DNS) continuem funcionando."
+
+msgid "Forward"
+msgstr "Encaminhamento"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Tráfego passando entre convidados e outras redes/zonas (ex: LAN). Mantenha como "
+"REJEITAR (REJECT) ou DESCARTAR (DROP) para isolar os convidados da sua LAN. "
+"ACEITAR (ACCEPT) permitiria que os convidados alcançassem outras redes."
+
+msgid "accept"
+msgstr "aceitar"
+
+msgid "reject"
+msgstr "rejeitar"
+
+msgid "drop"
+msgstr "descartar"
+
+msgid "driver default"
+msgstr "padrão do driver"
+
+msgid "Password length"
+msgstr "Comprimento da senha"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "O comprimento mínimo é de 8 caracteres, sendo 13 recomendados."
+
+msgid "Password composition"
+msgstr "Composição da senha"
+
+msgid "Character types to use when generating a password."
+msgstr "Tipos de caracteres a serem usados ao gerar uma senha."
+
+msgid "Uppercase letters"
+msgstr "Letras maiúsculas"
+
+msgid "Lowercase letters"
+msgstr "Letras minúsculas"
+
+msgid "Digits"
+msgstr "Dígitos"
+
+msgid "Special characters"
+msgstr "Caracteres especiais"
+
+msgid "Select password components..."
+msgstr "Selecione os componentes da senha..."
+
+msgid "Generate password"
+msgstr "Gerar senha"
+
+msgid "Generate"
+msgstr "Gerar"
+
+msgid "QR Code"
+msgstr "Código QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Gera um código QR com os dados da rede de convidados (SSID, criptografia, "
+"senha) para que um dispositivo cliente possa escanear e se conectar."
+
+msgid "QR Error Correction Code Level"
+msgstr "Nível de correção de erros do código QR"
+
+msgid "Low"
+msgstr "Baixo"
+
+msgid "Medium"
+msgstr "Médio"
+
+msgid "Quartile"
+msgstr "Quartil"
+
+msgid "High"
+msgstr "Alto"
+
+msgid "Scan this QR code with the client device."
+msgstr "Escaneie este código QR com o dispositivo cliente."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Gerando código QR do Wi-Fi de convidados…"
+
+msgid "Back to settings"
+msgstr "Voltar às configurações"
+
+msgid "Generate QR…"
+msgstr "Gerar código QR…"
diff --git a/luci-app-guest-wifi-js/po/ru/guest-wifi.po b/luci-app-guest-wifi-js/po/ru/guest-wifi.po
new file mode 100644
index 000000000..d72c51183
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/ru/guest-wifi.po
@@ -0,0 +1,280 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: ru\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Гостевой Wi-Fi"
+
+msgid "Guest networks"
+msgstr "Гостевые сети"
+
+msgid "Add new guest network..."
+msgstr "Добавить новую гостевую сеть..."
+
+msgid "General"
+msgstr "Общие настройки"
+
+msgid "Security"
+msgstr "Безопасность"
+
+msgid "Network & DHCP"
+msgstr "Сеть и DHCP"
+
+msgid "Firewall"
+msgstr "Межсетевой экран"
+
+msgid "Enabled"
+msgstr "Включено"
+
+msgid "Network name (SSID)"
+msgstr "Имя сети (SSID)"
+
+msgid "Radio"
+msgstr "Радиоинтерфейс"
+
+msgid "Interface IP address"
+msgstr "IP-адрес интерфейса"
+
+msgid "Netmask"
+msgstr "Маска сети"
+
+msgid "DHCP range start"
+msgstr "Начало диапазона DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Наименьший арендуемый адрес, как смещение от сетевого адреса."
+
+msgid "DHCP client limit"
+msgstr "Лимит клиентов DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Максимальное количество арендуемых адресов."
+
+msgid "DHCP lease time"
+msgstr "Время аренды DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Например, «1h», «30m», «12h». Ми its — «2m»."
+
+msgid "Encryption"
+msgstr "Шифрование"
+
+msgid "No encryption (open network)"
+msgstr "Без шифрования (открытая сеть)"
+
+msgid "Password"
+msgstr "Пароль"
+
+msgid "Client isolation"
+msgstr "Изоляция клиентов"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Блокирует связь между клиентами в этой гостевой сети."
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Нет"
+
+msgid "Forwarding destination zone"
+msgstr "Зона назначения перенаправления"
+
+msgid "DHCP rule ports"
+msgstr "Порты правила DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Диапазон портов UDP для DHCP-трафика, например, «67-68»."
+
+msgid "DNS rule port"
+msgstr "Порт правила DNS"
+
+msgid "Error saving configuration:"
+msgstr "Ошибка при сохранении конфигурации:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Пользовательский интерфейс для простого создания и управления изолированными "
+"сетями Wi-Fi для гостей, каждая из которых имеет собственную точку доступа, DHCP "
+"и правила межсетевого экрана."
+
+msgid "Enable guest network."
+msgstr "Включить гостевую сеть."
+
+msgid "The radio on which the guest network will work."
+msgstr "Радиоинтерфейс, на котором будет работать гостевая сеть."
+
+msgid "MAC address"
+msgstr "MAC-адрес"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Переопределить исходный MAC-адрес (диапазон доступных адресов может быть "
+"ограничен драйвером)"
+
+msgid "randomly generated"
+msgstr "сгенерирован случайно"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Адрес %s уже используется, и в диапазоне 172.16.0.1 - 172.31.0.1 нет "
+"свободных адресов."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Пароль должен быть длиной не менее 8 символов (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Открытая система"
+
+msgid "WEP Shared Key"
+msgstr "WEP Общий ключ"
+
+msgid "Mixed Mode"
+msgstr "Смешанный режим"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK рекомендуется для большинства устройств. WPA3-SAE обеспечивает максимальную "
+"безопасность, но требует поддержки со стороны клиентов."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"Ключ WEP должен состоять из 5 или 13 символов ASCII, либо из 10 или 26 шестнадцатеричных цифр."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Зона межсетевого экрана, в которую перенаправляется гостевой трафик (обычно «wan»). "
+"Выберите существующую зону из списка или заполните поле -- своё --, "
+"чтобы ввести её вручную."
+
+msgid "Input"
+msgstr "Входной"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Транзит трафика от гостей к самому роутеру (например, LuCI, SSH)."
+
+msgid "Output"
+msgstr "Выходной"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Трафик от самого роутера к гостям. Рекомендуется ПРИНИМАТЬ (ACCEPT), чтобы "
+"службы роутера (DHCP, DNS) продолжали работать."
+
+msgid "Forward"
+msgstr "Перенаправление"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Трафик, проходящий между гостями и другими сетями/зонами (например, LAN). "
+"Установите ОТКЛОНЯТЬ (REJECT) или СБРАСЫВАТЬ (DROP), чтобы изолировать гостей от вашей LAN. "
+"ПРИНИМАТЬ (ACCEPT) позволит гостям получать доступ к другим сетям."
+
+msgid "accept"
+msgstr "принимать"
+
+msgid "reject"
+msgstr "отклонять"
+
+msgid "drop"
+msgstr "сбрасывать"
+
+msgid "driver default"
+msgstr "по умолчанию для драйвера"
+
+msgid "Password length"
+msgstr "Длина пароля"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Минимальная длина — 8 символов, рекомендуется 13."
+
+msgid "Password composition"
+msgstr "Состав пароля"
+
+msgid "Character types to use when generating a password."
+msgstr "Типы символов, используемые при генерации пароля."
+
+msgid "Uppercase letters"
+msgstr "Заглавные буквы"
+
+msgid "Lowercase letters"
+msgstr "Строчные буквы"
+
+msgid "Digits"
+msgstr "Цифры"
+
+msgid "Special characters"
+msgstr "Специальные символы"
+
+msgid "Select password components..."
+msgstr "Выберите составляющие пароля..."
+
+msgid "Generate password"
+msgstr "Генерация пароля"
+
+msgid "Generate"
+msgstr "Сгенерировать"
+
+msgid "QR Code"
+msgstr "QR-код"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Создаёт QR-код с данными гостевой сети (SSID, шифрование, пароль), чтобы "
+"клиентское устройство могло отсканировать его и подключиться."
+
+msgid "QR Error Correction Code Level"
+msgstr "Уровень коррекции ошибок QR-кода"
+
+msgid "Low"
+msgstr "Низкий"
+
+msgid "Medium"
+msgstr "Средний"
+
+msgid "Quartile"
+msgstr "Квартильный"
+
+msgid "High"
+msgstr "Высокий"
+
+msgid "Scan this QR code with the client device."
+msgstr "Отсканируйте этот QR-код с помощью клиентского устройства."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Создание QR-кода гостевой Wi-Fi сети…"
+
+msgid "Back to settings"
+msgstr "Вернуться к настройкам"
+
+msgid "Generate QR…"
+msgstr "Создать QR-код…"
diff --git a/luci-app-guest-wifi-js/po/tr/guest-wifi.po b/luci-app-guest-wifi-js/po/tr/guest-wifi.po
new file mode 100644
index 000000000..01ee19d5e
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/tr/guest-wifi.po
@@ -0,0 +1,278 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: tr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Misafir Wi-Fi"
+
+msgid "Guest networks"
+msgstr "Misafir ağları"
+
+msgid "Add new guest network..."
+msgstr "Yeni misafir ağı ekle..."
+
+msgid "General"
+msgstr "Genel"
+
+msgid "Security"
+msgstr "Güvenlik"
+
+msgid "Network & DHCP"
+msgstr "Ağ & DHCP"
+
+msgid "Firewall"
+msgstr "Güvenlik Duvarı"
+
+msgid "Enabled"
+msgstr "Etkinleştirildi"
+
+msgid "Network name (SSID)"
+msgstr "Ağ adı (SSID)"
+
+msgid "Radio"
+msgstr "Radyo"
+
+msgid "Interface IP address"
+msgstr "Arayüz IP adresi"
+
+msgid "Netmask"
+msgstr "Ağ maskesi"
+
+msgid "DHCP range start"
+msgstr "DHCP aralığı başlangıcı"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Ağ adresinden uzaklık (offset) olarak kiralanan en düşük adres."
+
+msgid "DHCP client limit"
+msgstr "DHCP istemci sınırı"
+
+msgid "Maximum number of leased addresses."
+msgstr "Kiralanabilecek maksimum adres sayısı."
+
+msgid "DHCP lease time"
+msgstr "DHCP kiralama süresi"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Örn. \"1h\", \"30m\", \"12h\". Minimum \"2m\"dir."
+
+msgid "Encryption"
+msgstr "Şifreleme"
+
+msgid "No encryption (open network)"
+msgstr "Şifreleme yok (açık ağ)"
+
+msgid "Password"
+msgstr "Şifre"
+
+msgid "Client isolation"
+msgstr "İstemci izolasyonu"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Bu misafir ağındaki istemciler arasındaki iletişimi engeller."
+
+msgid "Yes"
+msgstr "Evet"
+
+msgid "No"
+msgstr "Hayır"
+
+msgid "Forwarding destination zone"
+msgstr "Yönlendirme hedef bölgesi"
+
+msgid "DHCP rule ports"
+msgstr "DHCP kural bağlantı noktaları"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "DHCP trafiği için UDP bağlantı noktası aralığı, örn. \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "DNS kural bağlantı noktası"
+
+msgid "Error saving configuration:"
+msgstr "Yapılandırma kaydedilirken hata oluştu:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Her biri kendi erişim noktasına, DHCP'sine ve güvenlik duvarı kurallarına sahip, "
+"misafirler için yalıtılmış Wi-Fi ağlarını kolayca oluşturmak ve yönetmek için bir kullanıcı arayüzü."
+
+msgid "Enable guest network."
+msgstr "Misafir ağını etkinleştir."
+
+msgid "The radio on which the guest network will work."
+msgstr "Misafir ağının çalışacağı radyo bandı."
+
+msgid "MAC address"
+msgstr "MAC adresi"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Varsayılan MAC adresini geçersiz kıl - kullanılabilir adreslerin aralığı "
+"sürücü tarafından sınırlandırılabilir"
+
+msgid "randomly generated"
+msgstr "rastgele oluşturulmuş"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"%s adresi zaten kullanımda ve 172.16.0.1 - 172.31.0.1 aralığında boş "
+"adres yok."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "Şifre en az 8 karakter uzunluğunda olmalıdır (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "WEP Açık Sistem"
+
+msgid "WEP Shared Key"
+msgstr "WEP Paylaşılan Anahtar"
+
+msgid "Mixed Mode"
+msgstr "Karışık Mod"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"Çoğu cihaz için WPA2-PSK önerilir. WPA3-SAE en güçlü güvenliği sunar ancak "
+"WPA3 özellikli istemciler gerektirir."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP anahtarı 5 veya 13 ASCII karakteri ya da 10 veya 26 onaltılık (hexadecimal) basamak olmalıdır."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Misafir trafiğinin yönlendirildiği güvenlik duvarı bölgesi (genellikle \"wan\"). "
+"Listeden mevcut bir bölge seçin veya manuel olarak girmek için -- özel -- alanını doldurun."
+
+msgid "Input"
+msgstr "Giriş"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Misafirlerden yönlendiricinin (router) kendisine gelen trafik (örn. LuCI, SSH)."
+
+msgid "Output"
+msgstr "Çıkış"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Yönlendiricinin kendisinden misafirlere giden trafik. Yönlendirici servislerinin "
+"(DHCP, DNS) çalışmaya devam etmesi için KABUL ET (ACCEPT) önerilir."
+
+msgid "Forward"
+msgstr "Yönlendirme"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Misafirler ile diğer ağlar/bölgeler (örn. LAN) arasında geçen trafik. Misafirleri "
+"LAN'ınızdan yalıtmak için bunu REDDET (REJECT) veya DÜŞÜR (DROP) olarak tutun. KABUL ET, "
+"misafirlerin diğer ağlara ulaşmasına izin verir."
+
+msgid "accept"
+msgstr "kabul et"
+
+msgid "reject"
+msgstr "reddet"
+
+msgid "drop"
+msgstr "düşür"
+
+msgid "driver default"
+msgstr "sürücü varsayılanı"
+
+msgid "Password length"
+msgstr "Parola uzunluğu"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Minimum uzunluk 8 karakterdir, 13 karakter önerilir."
+
+msgid "Password composition"
+msgstr "Parola bileşimi"
+
+msgid "Character types to use when generating a password."
+msgstr "Parola oluştururken kullanılacak karakter türleri."
+
+msgid "Uppercase letters"
+msgstr "Büyük harfler"
+
+msgid "Lowercase letters"
+msgstr "Küçük harfler"
+
+msgid "Digits"
+msgstr "Rakamlar"
+
+msgid "Special characters"
+msgstr "Özel karakterler"
+
+msgid "Select password components..."
+msgstr "Parola bileşenlerini seçin..."
+
+msgid "Generate password"
+msgstr "Parola oluştur"
+
+msgid "Generate"
+msgstr "Oluştur"
+
+msgid "QR Code"
+msgstr "QR Kodu"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"İstemci cihazın tarayıp bağlanabilmesi için misafir ağı verileriyle "
+"(SSID, şifreleme, parola) bir QR kodu oluşturur."
+
+msgid "QR Error Correction Code Level"
+msgstr "QR Kodu Hata Düzeltme Seviyesi"
+
+msgid "Low"
+msgstr "Düşük"
+
+msgid "Medium"
+msgstr "Orta"
+
+msgid "Quartile"
+msgstr "Çeyreklik"
+
+msgid "High"
+msgstr "Yüksek"
+
+msgid "Scan this QR code with the client device."
+msgstr "Bu QR kodunu istemci cihazla tarayın."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Misafir Wi-Fi QR kodu oluşturuluyor…"
+
+msgid "Back to settings"
+msgstr "Ayarlara dön"
+
+msgid "Generate QR…"
+msgstr "QR kodu oluştur…"
diff --git a/luci-app-guest-wifi-js/po/vi/guest-wifi.po b/luci-app-guest-wifi-js/po/vi/guest-wifi.po
new file mode 100644
index 000000000..d93321199
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/vi/guest-wifi.po
@@ -0,0 +1,278 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: vi\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Guest Wi-Fi"
+msgstr "Wi-Fi khách"
+
+msgid "Guest networks"
+msgstr "Mạng khách"
+
+msgid "Add new guest network..."
+msgstr "Thêm mạng khách mới..."
+
+msgid "General"
+msgstr "Chung"
+
+msgid "Security"
+msgstr "Bảo mật"
+
+msgid "Network & DHCP"
+msgstr "Mạng & DHCP"
+
+msgid "Firewall"
+msgstr "Tường lửa"
+
+msgid "Enabled"
+msgstr "Đã bật"
+
+msgid "Network name (SSID)"
+msgstr "Tên mạng (SSID)"
+
+msgid "Radio"
+msgstr "Sóng vô tuyến"
+
+msgid "Interface IP address"
+msgstr "Địa chỉ IP giao diện"
+
+msgid "Netmask"
+msgstr "Mặt nạ mạng"
+
+msgid "DHCP range start"
+msgstr "Bắt đầu dải DHCP"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "Địa chỉ cho thuê thấp nhất, dưới dạng khoảng bù (offset) từ địa chỉ mạng."
+
+msgid "DHCP client limit"
+msgstr "Giới hạn thiết bị DHCP"
+
+msgid "Maximum number of leased addresses."
+msgstr "Số lượng địa chỉ cho thuê tối đa."
+
+msgid "DHCP lease time"
+msgstr "Thời gian thuê DHCP"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "Ví dụ: \"1h\", \"30m\", \"12h\". Tối thiểu là \"2m\"."
+
+msgid "Encryption"
+msgstr "Mã hóa"
+
+msgid "No encryption (open network)"
+msgstr "Không mã hóa (mạng mở)"
+
+msgid "Password"
+msgstr "Mật khẩu"
+
+msgid "Client isolation"
+msgstr "Cách ly thiết bị"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "Chặn giao tiếp giữa các thiết bị khách trong mạng này."
+
+msgid "Yes"
+msgstr "Có"
+
+msgid "No"
+msgstr "Không"
+
+msgid "Forwarding destination zone"
+msgstr "Vùng đích chuyển tiếp"
+
+msgid "DHCP rule ports"
+msgstr "Cổng quy tắc DHCP"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "Dải cổng UDP cho lưu lượng DHCP, ví dụ: \"67-68\"."
+
+msgid "DNS rule port"
+msgstr "Cổng quy tắc DNS"
+
+msgid "Error saving configuration:"
+msgstr "Lỗi khi lưu cấu hình:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"Giao diện người dùng để dễ dàng tạo và quản lý các mạng Wi-Fi tách biệt cho khách, "
+"mỗi mạng có điểm truy cập, DHCP và các quy tắc tường lửa riêng."
+
+msgid "Enable guest network."
+msgstr "Bật mạng khách."
+
+msgid "The radio on which the guest network will work."
+msgstr "Băng tần sóng vô tuyến mà mạng khách sẽ hoạt động."
+
+msgid "MAC address"
+msgstr "Địa chỉ MAC"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"Ghi đè địa chỉ MAC mặc định - dải địa chỉ có thể sử dụng có thể bị giới hạn bởi trình điều khiển"
+
+msgid "randomly generated"
+msgstr "được tạo ngẫu nhiên"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"Địa chỉ %s đã được sử dụng và không có địa chỉ nào còn trống trong dải "
+"172.16.0.1 - 172.31.0.1."
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr ""
+"Mật khẩu phải dài ít nhất 8 ký tự (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+
+msgid "WEP Open System"
+msgstr "Hệ thống mở WEP"
+
+msgid "WEP Shared Key"
+msgstr "Khóa chia sẻ WEP"
+
+msgid "Mixed Mode"
+msgstr "Chế độ hỗn hợp"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"WPA2-PSK được khuyến nghị cho hầu hết các thiết bị. WPA3-SAE cung cấp mức độ bảo mật "
+"cao nhất nhưng yêu cầu thiết bị khách hỗ trợ WPA3."
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"Khóa WEP phải gồm 5 hoặc 13 ký tự ASCII, hoặc 10 hoặc 26 chữ số thập lục phân."
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"Vùng tường lửa mà lưu lượng mạng khách được chuyển tiếp đến (thường là \"wan\"). "
+"Chọn một vùng hiện có từ danh sách hoặc điền vào trường -- tùy chỉnh -- "
+"để nhập thủ công."
+
+msgid "Input"
+msgstr "Đầu vào"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "Lưu lượng truy cập từ khách đến chính bộ định tuyến (ví dụ: LuCI, SSH)."
+
+msgid "Output"
+msgstr "Đầu ra"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"Lưu lượng truy cập từ chính bộ định tuyến đến khách. Khuyến nghị chọn ACCEPT (CHẤP NHẬN) "
+"để các dịch vụ của bộ định tuyến (DHCP, DNS) tiếp tục hoạt động."
+
+msgid "Forward"
+msgstr "Chuyển tiếp"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"Lưu lượng truyền qua lại giữa khách và các mạng/vùng khác (ví dụ: LAN). Giữ nguyên "
+"REJECT (TỪ CHỐI) hoặc DROP (HỦY BỎ) để cách ly khách khỏi mạng LAN của bạn. "
+"ACCEPT sẽ cho phép khách truy cập vào các mạng khác."
+
+msgid "accept"
+msgstr "chấp nhận"
+
+msgid "reject"
+msgstr "từ chối"
+
+msgid "drop"
+msgstr "hủy bỏ"
+
+msgid "driver default"
+msgstr "mặc định của trình điều khiển"
+
+msgid "Password length"
+msgstr "Độ dài mật khẩu"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "Độ dài tối thiểu là 8 ký tự, khuyến nghị 13 ký tự."
+
+msgid "Password composition"
+msgstr "Thành phần mật khẩu"
+
+msgid "Character types to use when generating a password."
+msgstr "Các loại ký tự được sử dụng khi tạo mật khẩu."
+
+msgid "Uppercase letters"
+msgstr "Chữ hoa"
+
+msgid "Lowercase letters"
+msgstr "Chữ thường"
+
+msgid "Digits"
+msgstr "Chữ số"
+
+msgid "Special characters"
+msgstr "Ký tự đặc biệt"
+
+msgid "Select password components..."
+msgstr "Chọn các thành phần mật khẩu..."
+
+msgid "Generate password"
+msgstr "Tạo mật khẩu"
+
+msgid "Generate"
+msgstr "Tạo"
+
+msgid "QR Code"
+msgstr "Mã QR"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"Tạo mã QR chứa dữ liệu mạng khách (SSID, mã hóa, mật khẩu) để thiết bị "
+"khách có thể quét và kết nối."
+
+msgid "QR Error Correction Code Level"
+msgstr "Mức độ sửa lỗi mã QR"
+
+msgid "Low"
+msgstr "Thấp"
+
+msgid "Medium"
+msgstr "Trung bình"
+
+msgid "Quartile"
+msgstr "Phần tư"
+
+msgid "High"
+msgstr "Cao"
+
+msgid "Scan this QR code with the client device."
+msgstr "Quét mã QR này bằng thiết bị khách."
+
+msgid "Generate guest WiFi QR…"
+msgstr "Đang tạo mã QR Wi-Fi khách…"
+
+msgid "Back to settings"
+msgstr "Quay lại cài đặt"
+
+msgid "Generate QR…"
+msgstr "Tạo mã QR…"
diff --git a/luci-app-atcommands/po/zh-cn b/luci-app-guest-wifi-js/po/zh-cn
similarity index 100%
rename from luci-app-atcommands/po/zh-cn
rename to luci-app-guest-wifi-js/po/zh-cn
diff --git a/luci-app-guest-wifi-js/po/zh_Hans/guest-wifi.po b/luci-app-guest-wifi-js/po/zh_Hans/guest-wifi.po
new file mode 100644
index 000000000..df85a7b95
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/zh_Hans/guest-wifi.po
@@ -0,0 +1,273 @@
+msgid ""
+msgstr ""
+"Last-Translator: \n"
+"Language-Team: Chinese (Simplified)\n"
+"Language: zh_Hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Guest Wi-Fi"
+msgstr "访客 Wi-Fi"
+
+msgid "Guest networks"
+msgstr "访客网络"
+
+msgid "Add new guest network..."
+msgstr "添加新的访客网络..."
+
+msgid "General"
+msgstr "基本设置"
+
+msgid "Security"
+msgstr "安全设置"
+
+msgid "Network & DHCP"
+msgstr "网络与 DHCP"
+
+msgid "Firewall"
+msgstr "防火墙"
+
+msgid "Enabled"
+msgstr "已启用"
+
+msgid "Network name (SSID)"
+msgstr "网络名称 (SSID)"
+
+msgid "Radio"
+msgstr "无线射频"
+
+msgid "Interface IP address"
+msgstr "接口 IP 地址"
+
+msgid "Netmask"
+msgstr "网络掩码"
+
+msgid "DHCP range start"
+msgstr "DHCP 分配起始地址"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "最低的租用地址,作为网络地址的偏移量。"
+
+msgid "DHCP client limit"
+msgstr "DHCP 客户端限制"
+
+msgid "Maximum number of leased addresses."
+msgstr "最大可租用的地址数量。"
+
+msgid "DHCP lease time"
+msgstr "DHCP 租用时间"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "例如:\"1h\"(1小时)、\"30m\"(30分钟)、\"12h\"(12小时)。最小值为 \"2m\"。"
+
+msgid "Encryption"
+msgstr "加密方式"
+
+msgid "No encryption (open network)"
+msgstr "不加密(开放网络)"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Client isolation"
+msgstr "客户端隔离"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "阻止此访客网络中客户端之间的互相通信。"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Forwarding destination zone"
+msgstr "转发目标区域"
+
+msgid "DHCP rule ports"
+msgstr "DHCP 规则端口"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "DHCP 流量的 UDP 端口范围,例如:\"67-68\"。"
+
+msgid "DNS rule port"
+msgstr "DNS 规则端口"
+
+msgid "Error saving configuration:"
+msgstr "保存配置时出错:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"一个方便创建和管理隔离的访客 Wi-Fi 网络的图形界面,每个网络都有独立的"
+"接入点、DHCP 和防火墙规则。"
+
+msgid "Enable guest network."
+msgstr "启用访客网络。"
+
+msgid "The radio on which the guest network will work."
+msgstr "访客网络将工作的无线射频。"
+
+msgid "MAC address"
+msgstr "MAC 地址"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"重写默认 MAC 地址 - 可用地址的范围可能会受到驱动程序的限制"
+
+msgid "randomly generated"
+msgstr "随机生成"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"地址 %s 已在使用中,且在 172.16.0.1 - 172.31.0.1 范围内没有可用的空闲地址。"
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "密码长度必须至少为 8 个字符 (WPA-PSK/WPA2-PSK/WPA3-SAE)。"
+
+msgid "WEP Open System"
+msgstr "WEP 开放系统"
+
+msgid "WEP Shared Key"
+msgstr "WEP 共享密钥"
+
+msgid "Mixed Mode"
+msgstr "混合模式"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"推荐大多数设备使用 WPA2-PSK。WPA3-SAE 提供了最强的安全性,但需要客户端支持 WPA3。"
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP 密钥必须是 5 或 13 个 ASCII 字符,或者是 10 或 26 个十六进制数字。"
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"访客流量转发到的防火墙区域(通常为 \"wan\")。从列表中选择一个现有区域,"
+"或者填写 -- 自定义 -- 字段以手动输入。"
+
+msgid "Input"
+msgstr "入站数据"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "从访客到路由器本身的流量(例如:LuCI、SSH)。"
+
+msgid "Output"
+msgstr "出站数据"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"从路由器本身到访客的流量。建议设为 接受(ACCEPT),以确保路由器服务(DHCP、DNS)正常工作。"
+
+msgid "Forward"
+msgstr "转发数据"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"访客与其他网络/区域(如 LAN)之间通过的流量。请保持为 拒绝(REJECT) 或 丢弃(DROP) "
+"以将访客与您的 LAN 隔离。设为 接受(ACCEPT) 将允许访客访问其他网络。"
+
+msgid "accept"
+msgstr "接受"
+
+msgid "reject"
+msgstr "拒绝"
+
+msgid "drop"
+msgstr "丢弃"
+
+msgid "driver default"
+msgstr "驱动默认"
+
+msgid "Password length"
+msgstr "密码长度"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "最小长度为8个字符,建议使用13个字符。"
+
+msgid "Password composition"
+msgstr "密码组成"
+
+msgid "Character types to use when generating a password."
+msgstr "生成密码时使用的字符类型。"
+
+msgid "Uppercase letters"
+msgstr "大写字母"
+
+msgid "Lowercase letters"
+msgstr "小写字母"
+
+msgid "Digits"
+msgstr "数字"
+
+msgid "Special characters"
+msgstr "特殊字符"
+
+msgid "Select password components..."
+msgstr "选择密码组成部分..."
+
+msgid "Generate password"
+msgstr "生成密码"
+
+msgid "Generate"
+msgstr "生成"
+
+msgid "QR Code"
+msgstr "二维码"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"生成包含访客网络数据(SSID、加密方式、密码)的二维码,以便客户端设备扫描"
+"并连接。"
+
+msgid "QR Error Correction Code Level"
+msgstr "二维码纠错级别"
+
+msgid "Low"
+msgstr "低"
+
+msgid "Medium"
+msgstr "中"
+
+msgid "Quartile"
+msgstr "四分位"
+
+msgid "High"
+msgstr "高"
+
+msgid "Scan this QR code with the client device."
+msgstr "请使用客户端设备扫描此二维码。"
+
+msgid "Generate guest WiFi QR…"
+msgstr "正在生成访客 Wi-Fi 二维码…"
+
+msgid "Back to settings"
+msgstr "返回设置"
+
+msgid "Generate QR…"
+msgstr "生成二维码…"
diff --git a/luci-app-guest-wifi-js/po/zh_Hant/guest-wifi.po b/luci-app-guest-wifi-js/po/zh_Hant/guest-wifi.po
new file mode 100644
index 000000000..230ded1da
--- /dev/null
+++ b/luci-app-guest-wifi-js/po/zh_Hant/guest-wifi.po
@@ -0,0 +1,273 @@
+msgid ""
+msgstr ""
+"Last-Translator: \n"
+"Language-Team: Chinese (Traditional)\n"
+"Language: zh_Hant\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Guest Wi-Fi"
+msgstr "訪客 Wi-Fi"
+
+msgid "Guest networks"
+msgstr "訪客網路"
+
+msgid "Add new guest network..."
+msgstr "新增訪客網路..."
+
+msgid "General"
+msgstr "基本設定"
+
+msgid "Security"
+msgstr "安全設定"
+
+msgid "Network & DHCP"
+msgstr "網路与 DHCP"
+
+msgid "Firewall"
+msgstr "防火牆"
+
+msgid "Enabled"
+msgstr "已啟用"
+
+msgid "Network name (SSID)"
+msgstr "網路名稱 (SSID)"
+
+msgid "Radio"
+msgstr "無線射頻"
+
+msgid "Interface IP address"
+msgstr "介面 IP 位址"
+
+msgid "Netmask"
+msgstr "網路遮罩"
+
+msgid "DHCP range start"
+msgstr "DHCP 分配起始位址"
+
+msgid "Lowest leased address, as offset from the network address."
+msgstr "最低的租用位址,作為網路位址的偏移量。"
+
+msgid "DHCP client limit"
+msgstr "DHCP 用戶端限制"
+
+msgid "Maximum number of leased addresses."
+msgstr "最大可租用的位址數量。"
+
+msgid "DHCP lease time"
+msgstr "DHCP 租期"
+
+msgid "E.g. \"1h\", \"30m\", \"12h\". Minimum is \"2m\"."
+msgstr "例如:\"1h\"(1小時)、\"30m\"(30分鐘)、\"12h\"(12小時)。最小值为 \"2m\"。"
+
+msgid "Encryption"
+msgstr "加密方式"
+
+msgid "No encryption (open network)"
+msgstr "不加密(開放網路)"
+
+msgid "Password"
+msgstr "密碼"
+
+msgid "Client isolation"
+msgstr "用戶端隔離"
+
+msgid "Blocks communication between clients on this guest network."
+msgstr "阻止此訪客網路中用戶端之間的互相通訊。"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Forwarding destination zone"
+msgstr "轉發目標區域"
+
+msgid "DHCP rule ports"
+msgstr "DHCP 規則埠"
+
+msgid "UDP port range for DHCP traffic, e.g. \"67-68\"."
+msgstr "DHCP 流量的 UDP 埠範圍,例如:\"67-68\"。"
+
+msgid "DNS rule port"
+msgstr "DNS 規則埠"
+
+msgid "Error saving configuration:"
+msgstr "儲存設定時出錯:"
+
+msgid ""
+"A user interface for easily creating and management isolated Wi-Fi "
+"networks for guests, each with its own access point, DHCP, and firewall "
+"rules."
+msgstr ""
+"一個方便建立和管理隔離的訪客 Wi-Fi 網路的圖形介面,每個網路都有獨立的"
+"存取點、DHCP 和防火牆規則。"
+
+msgid "Enable guest network."
+msgstr "啟用訪客網路。"
+
+msgid "The radio on which the guest network will work."
+msgstr "訪客網路將運作的無線射頻。"
+
+msgid "MAC address"
+msgstr "MAC 位址"
+
+msgid ""
+"Override default MAC address - the range of usable addresses might be "
+"limited by the driver"
+msgstr ""
+"覆寫預設 MAC 位址 - 可用位址的範圍可能會受到驅動程式的限制"
+
+msgid "randomly generated"
+msgstr "隨機產生"
+
+msgid ""
+"The address %s is already in use and no free address is available in the "
+"172.16.0.1 - 172.31.0.1 range."
+msgstr ""
+"位址 %s 已在使用中,且在 172.16.0.1 - 172.31.0.1 範圍內沒有可用的空閒位址。"
+
+msgid ""
+"Password must be at least 8 characters long (WPA-PSK/WPA2-PSK/WPA3-SAE)."
+msgstr "密碼長度必須至少為 8 個字元 (WPA-PSK/WPA2-PSK/WPA3-SAE)。"
+
+msgid "WEP Open System"
+msgstr "WEP 開放系統"
+
+msgid "WEP Shared Key"
+msgstr "WEP 共用金鑰"
+
+msgid "Mixed Mode"
+msgstr "混合模式"
+
+msgid "Enhanced Open"
+msgstr "Enhanced Open"
+
+msgid ""
+"WPA2-PSK is recommended for most devices. WPA3-SAE offers the strongest "
+"security but requires WPA3-capable clients."
+msgstr ""
+"推薦大多數裝置使用 WPA2-PSK。WPA3-SAE 提供了最強的安全性,但需要用戶端支援 WPA3。"
+
+msgid ""
+"WEP key must be 5 or 13 ASCII characters, or 10 or 26 hexadecimal digits."
+msgstr ""
+"WEP 金鑰必須是 5 或 13 個 ASCII 字元,或者是 10 或 26 個十六進位數字。"
+
+msgid ""
+"Firewall zone guest traffic is forwarded to (usually \"wan\"). Pick an "
+"existing zone from the list or fill out the -- custom -- field to enter "
+"one manually."
+msgstr ""
+"訪客流量轉發到的防火牆區域(通常為 \"wan\")。從列表中選擇一个現有區域,"
+"或者填寫 -- 自訂 -- 欄位以手動輸入。"
+
+msgid "Input"
+msgstr "入站數據"
+
+msgid "Traffic from guests to the router itself (e.g. LuCI, SSH)."
+msgstr "從訪客到路由器本身的流量(例如:LuCI、SSH)。"
+
+msgid "Output"
+msgstr "出站數據"
+
+msgid ""
+"Traffic from the router itself to guests. ACCEPT is recommended so router "
+"services (DHCP, DNS) keep working."
+msgstr ""
+"從路由器本身到訪客的流量。建議設為 接受(ACCEPT),以確保路由器服務(DHCP、DNS)正常運作。"
+
+msgid "Forward"
+msgstr "轉發數據"
+
+msgid ""
+"Traffic passing between guests and other networks/zones (e.g. LAN). Keep "
+"this REJECT or DROP to isolate guests from your LAN. ACCEPT would allow "
+"guests to reach other networks."
+msgstr ""
+"訪客與其他網路/區域(如 LAN)之間通過的流量。請保持為 拒絕(REJECT) 或 丟棄(DROP) "
+"以將訪客與您的 LAN 隔離。設為 接受(ACCEPT) 將允許訪客存取其他網路。"
+
+msgid "accept"
+msgstr "接受"
+
+msgid "reject"
+msgstr "拒絕"
+
+msgid "drop"
+msgstr "丟棄"
+
+msgid "driver default"
+msgstr "驅動程式預設"
+
+msgid "Password length"
+msgstr "密碼長度"
+
+msgid "Minimum length is 8 characters, 13 characters recommended."
+msgstr "最小長度為8個字元,建議使用13個字元。"
+
+msgid "Password composition"
+msgstr "密碼組成"
+
+msgid "Character types to use when generating a password."
+msgstr "產生密碼時使用的字元類型。"
+
+msgid "Uppercase letters"
+msgstr "大寫字母"
+
+msgid "Lowercase letters"
+msgstr "小寫字母"
+
+msgid "Digits"
+msgstr "數字"
+
+msgid "Special characters"
+msgstr "特殊字元"
+
+msgid "Select password components..."
+msgstr "選擇密碼組成部分..."
+
+msgid "Generate password"
+msgstr "產生密碼"
+
+msgid "Generate"
+msgstr "產生"
+
+msgid "QR Code"
+msgstr "QR code"
+
+msgid ""
+"Generates a QR code with the guest network data (SSID, encryption, "
+"password) so a client device can scan and connect."
+msgstr ""
+"產生包含訪客網路資料(SSID、加密方式、密碼)的 QR code,以便客戶端裝置"
+"掃描並連線。"
+
+msgid "QR Error Correction Code Level"
+msgstr "QR code 錯誤更正等級"
+
+msgid "Low"
+msgstr "低"
+
+msgid "Medium"
+msgstr "中"
+
+msgid "Quartile"
+msgstr "四分位"
+
+msgid "High"
+msgstr "高"
+
+msgid "Scan this QR code with the client device."
+msgstr "請使用客戶端裝置掃描此 QR code。"
+
+msgid "Generate guest WiFi QR…"
+msgstr "正在產生訪客 Wi-Fi QR code…"
+
+msgid "Back to settings"
+msgstr "返回設定"
+
+msgid "Generate QR…"
+msgstr "產生 QR code…"
diff --git a/luci-app-guest-wifi-js/root/etc/config/guestwifi b/luci-app-guest-wifi-js/root/etc/config/guestwifi
new file mode 100644
index 000000000..139597f9c
--- /dev/null
+++ b/luci-app-guest-wifi-js/root/etc/config/guestwifi
@@ -0,0 +1,2 @@
+
+
diff --git a/luci-app-guest-wifi-js/root/usr/share/luci/menu.d/luci-app-guest-wifi-js.json b/luci-app-guest-wifi-js/root/usr/share/luci/menu.d/luci-app-guest-wifi-js.json
new file mode 100644
index 000000000..6831f769c
--- /dev/null
+++ b/luci-app-guest-wifi-js/root/usr/share/luci/menu.d/luci-app-guest-wifi-js.json
@@ -0,0 +1,8 @@
+{
+ "admin/network/wireless/guest_wifi": {
+ "title": "Guest Wi-Fi",
+ "order": 17,
+ "action": { "type": "view", "path": "network/guest_wifi" },
+ "depends": { "acl": [ "luci-app-guest-wifi-js" ] }
+ }
+}
diff --git a/luci-app-guest-wifi-js/root/usr/share/rpcd/acl.d/luci-app-guest-wifi-js.json b/luci-app-guest-wifi-js/root/usr/share/rpcd/acl.d/luci-app-guest-wifi-js.json
new file mode 100644
index 000000000..8e69d1408
--- /dev/null
+++ b/luci-app-guest-wifi-js/root/usr/share/rpcd/acl.d/luci-app-guest-wifi-js.json
@@ -0,0 +1,11 @@
+{
+ "luci-app-guest-wifi-js": {
+ "description": "Grant UCI access for guest wifi configuration",
+ "read": {
+ "uci": [ "guestwifi", "network", "wireless", "dhcp", "firewall" ]
+ },
+ "write": {
+ "uci": [ "guestwifi", "network", "wireless", "dhcp", "firewall" ]
+ }
+ }
+}
diff --git a/luci-app-ports-status-mod/Makefile b/luci-app-ports-status-mod/Makefile
new file mode 100644
index 000000000..7bd3aa901
--- /dev/null
+++ b/luci-app-ports-status-mod/Makefile
@@ -0,0 +1,25 @@
+#
+# Copyright 2025 Rafał Wabik - IceG - From eko.one.pl forum
+#
+# MIT License
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-ports-status-mod
+PKG_MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
+LUCI_TITLE:=Small modification of Ports Status
+LUCI_DEPENDS:=+luci-mod-admin-full
+LUCI_PKGARCH:=all
+PKG_LICENSE:=MIT
+PKG_VERSION:=1.0.8
+PKG_RELEASE:=1
+
+define Package/luci-app-ports-status-mod/conffiles
+/etc/user_defined_ports.json
+/etc/user_defined_ports.json.bak
+endef
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-ports-status-mod/htdocs/luci-static/resources/view/status/include/29_ports_custom.js b/luci-app-ports-status-mod/htdocs/luci-static/resources/view/status/include/29_ports_custom.js
new file mode 100644
index 000000000..09cd82994
--- /dev/null
+++ b/luci-app-ports-status-mod/htdocs/luci-static/resources/view/status/include/29_ports_custom.js
@@ -0,0 +1,1566 @@
+'use strict';
+'require baseclass';
+'require fs';
+'require ui';
+'require uci';
+'require rpc';
+'require network';
+'require firewall';
+'require dom';
+'require poll';
+
+(function() {
+ var style = document.createElement('style');
+ style.textContent = [
+ '@keyframes status-blink { 0%, 60%, 100% { opacity: 1; } 30% { opacity: 0.2; } }',
+ '.ports-operation-status {',
+ ' display: none;',
+ ' padding: 10px 14px;',
+ ' border: 1px solid var(--border-color-medium);',
+ ' border-radius: 5px;',
+ ' margin: 0 0 10px 0;',
+ ' font-size: 90%;',
+ '}',
+ '.ports-operation-status.active {',
+ ' display: block;',
+ '}',
+ '.ports-operation-status .spinning {',
+ ' display: inline-block;',
+ ' margin-right: 8px;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox {',
+ ' display: flex;',
+ ' flex-direction: column;',
+ ' align-items: stretch;',
+ ' box-sizing: border-box;',
+ ' text-align: center;',
+ ' min-width: 60px !important;',
+ ' max-width: 80px !important;',
+ ' width: 100%;',
+ ' margin: .2em auto !important;',
+ '}',
+ 'html.theme-footstrap .ports-container {',
+ ' grid-template-columns: repeat(auto-fit, minmax(60px, 80px)) !important;',
+ ' justify-content: start;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .ifacebox-head,',
+ 'html.theme-footstrap .ports-container .ifacebox > .ifacebox-body {',
+ ' display: block;',
+ ' width: 100%;',
+ ' box-sizing: border-box;',
+ ' float: none;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .ifacebox-head.cbi-tooltip-container {',
+ ' display: flex;',
+ '}',
+ 'html.theme-footstrap .ports-container .port-speed-body {',
+ ' padding: 0.3em 0.5em;',
+ ' line-height: 1.3;',
+ '}',
+ 'html.theme-footstrap .ports-container .port-speed-body img {',
+ ' display: block;',
+ ' margin: 0 auto 0.2em auto;',
+ '}',
+ 'html.theme-footstrap .ports-container .port-speed-body .port-speed-text {',
+ ' display: block;',
+ ' width: 100%;',
+ ' text-align: center;',
+ '}',
+ 'html.theme-footstrap .ports-container .port-status-body {',
+ ' display: block;',
+ ' clear: both;',
+ ' padding: 0.25em 0.5em;',
+ ' text-align: center;',
+ ' white-space: nowrap;',
+ ' border-top: 1px solid var(--border-color-medium);',
+ ' border-bottom: 1px solid var(--border-color-medium);',
+ '}',
+ 'html.theme-footstrap .ports-container .port-status-body > span {',
+ ' display: inline-block;',
+ ' vertical-align: middle;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .port-label {',
+ ' order: 1 !important;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .port-description {',
+ ' order: 2 !important;',
+ ' text-align: center;',
+ ' border-bottom: 1px solid var(--border-color-medium);',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .port-speed-body {',
+ ' order: 3 !important;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .ifacebox-head.cbi-tooltip-container {',
+ ' order: 4 !important;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .port-status-body {',
+ ' order: 5 !important;',
+ '}',
+ 'html.theme-footstrap .ports-container .ifacebox > .port-traffic-body {',
+ ' order: 6 !important;',
+ '}'
+ ].join('\n');
+ document.head.appendChild(style);
+
+ try {
+ var mediaBase = (window.L && L.env && L.env.mediaurlbase) || '';
+ var isFootstrap = /footstrap/i.test(mediaBase) ||
+ !!document.querySelector('link[rel="stylesheet"][href*="footstrap"]');
+
+ if (isFootstrap)
+ document.documentElement.classList.add('theme-footstrap');
+ } catch (e) {
+ console.warn('Theme detection failed:', e);
+ }
+})();
+
+var callGetBuiltinEthernetPorts = rpc.declare({
+ object: 'luci',
+ method: 'getBuiltinEthernetPorts',
+ expect: { result: [] }
+});
+
+var callWritePortConfig = rpc.declare({
+ object: 'file',
+ method: 'write',
+ params: ['path', 'data'],
+ expect: { }
+});
+
+var callGetPortsStatus = rpc.declare({
+ object: 'ports-status-mod',
+ method: 'getPortsStatus',
+ expect: { }
+});
+
+var callSetPortStatus = rpc.declare({
+ object: 'ports-status-mod',
+ method: 'setPortStatus',
+ params: ['port', 'status'],
+ expect: { }
+});
+
+var USER_PORTS_FILE = '/etc/user_defined_ports.json';
+var USER_PORTS_BACKUP = '/etc/user_defined_ports.json.bak';
+var CONFIG_LOCK = false;
+var isDragging = false;
+var draggedElement = null;
+var originalPorts = [];
+
+var _portsStatusTimer = null;
+
+function popTimeout(a, message, timeout, severity) {
+ ui.addTimeLimitedNotification(a, message, timeout, severity);
+}
+
+function showPortsStatus(message) {
+ var statusBox = document.getElementById('ports-operation-status');
+ if (!statusBox) return;
+ statusBox.innerHTML = '';
+ var msgText = (message && message.textContent !== undefined)
+ ? message.textContent
+ : (typeof message === 'string' ? message : '');
+ statusBox.appendChild(E('span', {'class': 'spinning'}, msgText));
+ statusBox.classList.add('active');
+}
+
+function hidePortsStatus() {
+ var statusBox = document.getElementById('ports-operation-status');
+ if (!statusBox) return;
+ statusBox.classList.remove('active');
+}
+
+function showPortsStatusTimeout(message, timeout) {
+ showPortsStatus(message);
+ if (_portsStatusTimer) clearTimeout(_portsStatusTimer);
+ _portsStatusTimer = setTimeout(function() {
+ hidePortsStatus();
+ _portsStatusTimer = null;
+ }, timeout || 4000);
+}
+
+function isString(v)
+{
+ return typeof(v) === 'string' && v !== '';
+}
+
+function resolveVLANChain(ifname, bridges, mapping)
+{
+ while (!mapping[ifname]) {
+ var m = ifname.match(/^(.+)\.([^.]+)$/);
+
+ if (!m)
+ break;
+
+ if (bridges[m[1]]) {
+ if (bridges[m[1]].vlan_filtering)
+ mapping[ifname] = bridges[m[1]].vlans[m[2]];
+ else
+ mapping[ifname] = bridges[m[1]].ports;
+ }
+ else if (/^[0-9]{1,4}$/.test(m[2]) && m[2] <= 4095) {
+ mapping[ifname] = [ m[1] ];
+ }
+ else {
+ break;
+ }
+
+ ifname = m[1];
+ }
+}
+
+function buildVLANMappings(mapping)
+{
+ var bridge_vlans = uci.sections('network', 'bridge-vlan'),
+ vlan_devices = uci.sections('network', 'device'),
+ interfaces = uci.sections('network', 'interface'),
+ bridges = {};
+
+ /* find bridge VLANs */
+ for (var i = 0, s; (s = bridge_vlans[i]) != null; i++) {
+ if (!isString(s.device) || !/^[0-9]{1,4}$/.test(s.vlan) || +s.vlan > 4095)
+ continue;
+
+ var aliases = L.toArray(s.alias),
+ ports = L.toArray(s.ports),
+ br = bridges[s.device] = (bridges[s.device] || { ports: [], vlans: {}, vlan_filtering: true });
+
+ br.vlans[s.vlan] = [];
+
+ for (var j = 0; j < ports.length; j++) {
+ var port = ports[j].replace(/:[ut*]+$/, '');
+
+ if (br.ports.indexOf(port) === -1)
+ br.ports.push(port);
+
+ br.vlans[s.vlan].push(port);
+ }
+
+ for (var j = 0; j < aliases.length; j++)
+ if (aliases[j] != s.vlan)
+ br.vlans[aliases[j]] = br.vlans[s.vlan];
+ }
+
+ /* find bridges, VLAN devices */
+ for (var i = 0, s; (s = vlan_devices[i]) != null; i++) {
+ if (s.type == 'bridge') {
+ if (!isString(s.name))
+ continue;
+
+ var ports = L.toArray(s.ports),
+ br = bridges[s.name] || (bridges[s.name] = { ports: [], vlans: {}, vlan_filtering: false });
+
+ if (s.vlan_filtering == '0')
+ br.vlan_filtering = false;
+ else if (s.vlan_filtering == '1')
+ br.vlan_filtering = true;
+
+ for (var j = 0; j < ports.length; j++)
+ if (br.ports.indexOf(ports[j]) === -1)
+ br.ports.push(ports[j]);
+
+ mapping[s.name] = br.ports;
+ }
+ else if (s.type == '8021q' || s.type == '8021ad') {
+ if (!isString(s.name) || !isString(s.vid) || !isString(s.ifname))
+ continue;
+
+ /* parent device is a bridge */
+ if (bridges[s.ifname]) {
+ /* parent bridge is VLAN enabled, device refers to VLAN ports */
+ if (bridges[s.ifname].vlan_filtering)
+ mapping[s.name] = bridges[s.ifname].vlans[s.vid];
+
+ /* parent bridge is not VLAN enabled, device refers to all bridge ports */
+ else
+ mapping[s.name] = bridges[s.ifname].ports;
+ }
+
+ /* parent is a simple netdev */
+ else {
+ mapping[s.name] = [ s.ifname ];
+ }
+
+ resolveVLANChain(s.ifname, bridges, mapping);
+ }
+ }
+
+ /* resolve VLAN tagged interfaces in bridge ports */
+ for (var brname in bridges) {
+ for (var i = 0; i < bridges[brname].ports.length; i++)
+ resolveVLANChain(bridges[brname].ports[i], bridges, mapping);
+
+ for (var vid in bridges[brname].vlans)
+ for (var i = 0; i < bridges[brname].vlans[vid].length; i++)
+ resolveVLANChain(bridges[brname].vlans[vid][i], bridges, mapping);
+ }
+
+ /* find implicit VLAN devices */
+ for (var i = 0, s; (s = interfaces[i]) != null; i++) {
+ if (!isString(s.device))
+ continue;
+
+ resolveVLANChain(s.device, bridges, mapping);
+ }
+}
+
+function resolveVLANPorts(ifname, mapping, seen)
+{
+ var ports = [];
+
+ if (!seen)
+ seen = {};
+
+ if (mapping[ifname]) {
+ for (var i = 0; i < mapping[ifname].length; i++) {
+ if (!seen[mapping[ifname][i]]) {
+ seen[mapping[ifname][i]] = true;
+ ports.push.apply(ports, resolveVLANPorts(mapping[ifname][i], mapping, seen));
+ }
+ }
+ }
+ else {
+ ports.push(ifname);
+ }
+
+ return ports.sort(L.naturalCompare);
+}
+
+function buildInterfaceMapping(zones, networks) {
+ var vlanmap = {},
+ portmap = {},
+ netmap = {};
+
+ buildVLANMappings(vlanmap);
+
+ for (var i = 0; i < networks.length; i++) {
+ var l3dev = networks[i].getDevice();
+
+ if (!l3dev)
+ continue;
+
+ var ports = resolveVLANPorts(l3dev.getName(), vlanmap);
+
+ for (var j = 0; j < ports.length; j++) {
+ portmap[ports[j]] = portmap[ports[j]] || { networks: [], zones: [] };
+ portmap[ports[j]].networks.push(networks[i]);
+ }
+
+ netmap[networks[i].getName()] = networks[i];
+ }
+
+ for (var i = 0; i < zones.length; i++) {
+ var networknames = zones[i].getNetworks();
+
+ for (var j = 0; j < networknames.length; j++) {
+ if (!netmap[networknames[j]])
+ continue;
+
+ var l3dev = netmap[networknames[j]].getDevice();
+
+ if (!l3dev)
+ continue;
+
+ var ports = resolveVLANPorts(l3dev.getName(), vlanmap);
+
+ for (var k = 0; k < ports.length; k++) {
+ portmap[ports[k]] = portmap[ports[k]] || { networks: [], zones: [] };
+
+ if (portmap[ports[k]].zones.indexOf(zones[i]) === -1)
+ portmap[ports[k]].zones.push(zones[i]);
+ }
+ }
+ }
+
+ return portmap;
+}
+
+function formatSpeed(carrier, speed, duplex) {
+ if ((speed > 0) && duplex) {
+ var d = (duplex == 'half') ? '\u202f(H)' : '',
+ e = E('span', { 'title': _('Speed: %d Mbit/s, Duplex: %s').format(speed, duplex) });
+
+ switch (true) {
+ case (speed < 1000):
+ e.innerText = '%d\u202fM%s'.format(speed, d);
+ break;
+ case (speed == 1000):
+ e.innerText = '1\u202fGbE' + d;
+ break;
+ case (speed >= 1e6 && speed < 1e9):
+ e.innerText = '%f\u202fTbE'.format(speed / 1e6);
+ break;
+ case (speed >= 1e9):
+ e.innerText = '%f\u202fPbE'.format(speed / 1e9);
+ break;
+ default: e.innerText = '%f\u202fGbE'.format(speed / 1000);
+ }
+
+ return e;
+ }
+
+ return carrier ? _('Connected') : _('no link');
+}
+
+function formatStats(portdev) {
+ var stats = portdev._devstate('stats') || {};
+
+ return ui.itemlist(E('span'), [
+ _('Received bytes'), '%1024mB'.format(stats.rx_bytes),
+ _('Received packets'), '%1000mPkts.'.format(stats.rx_packets),
+ _('Received multicast'), '%1000mPkts.'.format(stats.multicast),
+ _('Receive errors'), '%1000mPkts.'.format(stats.rx_errors),
+ _('Receive dropped'), '%1000mPkts.'.format(stats.rx_dropped),
+
+ _('Transmitted bytes'), '%1024mB'.format(stats.tx_bytes),
+ _('Transmitted packets'), '%1000mPkts.'.format(stats.tx_packets),
+ _('Transmit errors'), '%1000mPkts.'.format(stats.tx_errors),
+ _('Transmit dropped'), '%1000mPkts.'.format(stats.tx_dropped),
+
+ _('Collisions seen'), stats.collisions
+ ]);
+}
+
+function renderNetworkBadge(network, zonename) {
+ var l3dev = network.getDevice();
+ var span = E('span', { 'class': 'ifacebadge', 'style': 'margin:.125em 0' }, [
+ E('span', {
+ 'class': 'zonebadge',
+ 'title': zonename ? _('Part of zone %q').format(zonename) : _('No zone assigned'),
+ 'style': firewall.getZoneColorStyle(zonename)
+ }, '\u202f'),
+ '\u202f', network.getName(), ': '
+ ]);
+
+ if (l3dev)
+ span.appendChild(E('img', {
+ 'title': l3dev.getI18n(),
+ 'src': L.resource('icons/%s%s.svg'.format(l3dev.getType(), l3dev.isUp() ? '' : '_disabled'))
+ }));
+ else
+ span.appendChild(E('em', _('(no interfaces attached)')));
+
+ return span;
+}
+
+function renderNetworksTooltip(pmap) {
+ var res = [ null ],
+ zmap = {};
+
+ for (var i = 0; pmap && i < pmap.zones.length; i++) {
+ var networknames = pmap.zones[i].getNetworks();
+
+ for (var k = 0; k < networknames.length; k++)
+ zmap[networknames[k]] = pmap.zones[i].getName();
+ }
+
+ for (var i = 0; pmap && i < pmap.networks.length; i++)
+ res.push(E('br'), renderNetworkBadge(pmap.networks[i], zmap[pmap.networks[i].getName()]));
+
+ if (res.length > 1)
+ res[0] = N_((res.length - 1) / 2, 'Part of network:', 'Part of networks:');
+ else
+ res[0] = _('Port is not part of any network');
+
+ return E([], res);
+}
+
+function validatePortsConfig(config) {
+ if (!config) {
+ console.error('Config is null or undefined');
+ return false;
+ }
+
+ if (!Array.isArray(config)) {
+ console.error('Config is not an array');
+ return false;
+ }
+
+ if (config.length === 0) {
+ console.error('Config is empty array');
+ return false;
+ }
+
+ for (var i = 0; i < config.length; i++) {
+ if (!config[i].device || typeof config[i].device !== 'string') {
+ console.error('Invalid device field at index', i);
+ return false;
+ }
+ }
+
+ console.log('Config validation passed:', config.length, 'ports');
+ return true;
+}
+
+function loadUserPorts() {
+ return L.resolveDefault(fs.read(USER_PORTS_FILE), null).then(function(content) {
+ if (!content || content.trim() === '' || content.trim() === '[]') {
+ console.log('User ports file is empty or missing');
+ return null;
+ }
+ try {
+ var parsed = JSON.parse(content);
+ if (Array.isArray(parsed) && parsed.length === 0) {
+ console.log('User ports file contains empty array');
+ return null;
+ }
+ if (!validatePortsConfig(parsed)) {
+ console.error('Invalid ports configuration detected');
+ ui.addNotification(null, E('p', _('Port config file is corrupted. Use "Restore backup .bak" from edit modal.')), 'error');
+ return null;
+ }
+ console.log('Successfully loaded user ports config:', parsed.length, 'ports');
+ return parsed;
+ } catch(e) {
+ console.error('Failed to parse user ports config:', e);
+ ui.addNotification(null, E('p', _('Port config parse error. Use "Restore backup .bak" from edit modal.')), 'error');
+ return null;
+ }
+ }).catch(function(err) {
+ console.log('User ports file does not exist yet:', err);
+ return null;
+ });
+}
+
+
+function setFileReadOnly(filepath) {
+ return fs.exec('/bin/chmod', ['444', filepath]).then(function(res) {
+ if (res.code === 0) {
+ console.log('File set to read-only (444):', filepath);
+ } else {
+ console.warn('Failed to set read-only on', filepath, ':', res.stderr);
+ }
+ }).catch(function(err) {
+ console.warn('chmod 444 error for', filepath, ':', err);
+ });
+}
+
+function ensureFileWritable(filepath) {
+ return fs.exec('/bin/chmod', ['644', filepath]).then(function(res) {
+ if (res.code === 0) {
+ console.log('File set to writable (644):', filepath);
+ return true;
+ } else {
+ return fs.exec('/bin/touch', [filepath]).then(function(touchRes) {
+ if (touchRes.code === 0) {
+ return fs.exec('/bin/chmod', ['644', filepath]).then(function() { return true; });
+ }
+ console.warn('Could not create or chmod file:', filepath);
+ return false;
+ });
+ }
+ }).catch(function(err) {
+ console.warn('ensureFileWritable error for', filepath, ':', err);
+ return false;
+ });
+}
+
+function verifyFileSaved(filepath, expectedContent) {
+ return L.resolveDefault(fs.read(filepath), null).then(function(content) {
+ if (!content) {
+ console.error('Verification failed: file empty after save');
+ return false;
+ }
+ var ok = content.trim().substring(0, 80) === expectedContent.trim().substring(0, 80);
+ if (!ok) {
+ console.error('Verification failed: content mismatch');
+ }
+ return ok;
+ }).catch(function() { return false; });
+}
+
+function saveUserPorts(ports) {
+ if (CONFIG_LOCK) {
+ console.warn('Save operation already in progress, skipping...');
+ return Promise.reject(new Error('Save operation locked'));
+ }
+
+ CONFIG_LOCK = true;
+
+ if (!ports || !Array.isArray(ports) || ports.length === 0) {
+ CONFIG_LOCK = false;
+ console.error('Refusing to save empty or invalid configuration');
+ ui.addNotification(null, E('p', _('Cannot save empty configuration')), 'error');
+ return Promise.reject(new Error('Invalid configuration'));
+ }
+
+ var config = ports.map(function(port) {
+ return {
+ device: port.device,
+ label: port.label || port.device,
+ role: port.role,
+ originalLabel: port.originalLabel || port.device,
+ description: port.description || ''
+ };
+ });
+
+ var jsonContent = JSON.stringify(config, null, 2);
+
+ return ensureFileWritable(USER_PORTS_FILE).then(function(writable) {
+ if (!writable) {
+ CONFIG_LOCK = false;
+ var msg = _('Cannot make config file writable. Check /etc permissions.');
+ ui.addNotification(null, E('p', msg), 'error');
+ throw new Error(msg);
+ }
+ return fs.write(USER_PORTS_FILE, jsonContent);
+ }).then(function() {
+ return verifyFileSaved(USER_PORTS_FILE, jsonContent).then(function(ok) {
+ if (!ok) {
+ CONFIG_LOCK = false;
+ var msg = _('Save verification failed - file content mismatch!');
+ ui.addNotification(null, E('p', msg), 'error');
+ throw new Error(msg);
+ }
+ console.log('Save verified successfully for', USER_PORTS_FILE);
+ return setFileReadOnly(USER_PORTS_FILE).then(function() {
+ CONFIG_LOCK = false;
+ return true;
+ });
+ });
+ }).catch(function(err) {
+ CONFIG_LOCK = false;
+ console.error('saveUserPorts failed:', err);
+ throw err;
+ });
+}
+
+function mergePortConfigs(detectedPorts, userConfig) {
+ if (!userConfig || !Array.isArray(userConfig) || userConfig.length === 0) {
+ console.log('No valid user config, using detected ports');
+ return detectedPorts;
+ }
+
+ var userMap = {};
+ userConfig.forEach(function(p) {
+ if (p && p.device) {
+ userMap[p.device] = p;
+ }
+ });
+
+ var merged = [];
+ var addedDevices = {};
+
+ userConfig.forEach(function(userPort) {
+ if (!userPort || !userPort.device) return;
+
+ var detected = detectedPorts.find(function(p) { return p.device === userPort.device; });
+ if (detected) {
+ merged.push({
+ device: detected.device,
+ role: detected.role,
+ netdev: detected.netdev,
+ label: userPort.label || detected.device,
+ originalLabel: userPort.originalLabel || detected.device,
+ description: userPort.description || ''
+ });
+ addedDevices[userPort.device] = true;
+ }
+ });
+
+ detectedPorts.forEach(function(port) {
+ if (!addedDevices[port.device]) {
+ merged.push({
+ device: port.device,
+ role: port.role,
+ netdev: port.netdev,
+ label: port.device,
+ originalLabel: port.originalLabel || port.device,
+ description: ''
+ });
+ }
+ });
+
+ console.log('Merged config: detected=' + detectedPorts.length + ', user=' + userConfig.length + ', result=' + merged.length);
+ return merged;
+}
+
+function showEditLabelModal(port, labelElement, descriptionElement, statusElement, ports) {
+ poll.stop();
+
+ var modalTitle = _('Edit Port Label');
+ var currentLabel = port.label || port.device;
+ var currentDescription = port.description || '';
+ var originalLabel = port.originalLabel || port.device;
+
+ var statusRadioUp = E('input', {
+ 'type': 'radio',
+ 'name': 'port_status',
+ 'value': 'up',
+ 'id': 'port-status-up',
+ 'disabled': true
+ });
+
+ var statusRadioDown = E('input', {
+ 'type': 'radio',
+ 'name': 'port_status',
+ 'value': 'down',
+ 'id': 'port-status-down',
+ 'disabled': true
+ });
+
+ var isLanPort = false;
+
+ L.resolveDefault(callGetPortsStatus(), {}).then(function(portsStatus) {
+ var deviceForStatus = port.device.split('@')[0];
+ var operstate = portsStatus[deviceForStatus];
+
+ if (operstate !== undefined) {
+ isLanPort = true;
+ statusRadioUp.disabled = false;
+ statusRadioDown.disabled = false;
+
+ var isCurrentlyEnabled = (operstate !== 'disabled');
+
+ if (isCurrentlyEnabled) {
+ statusRadioUp.checked = true;
+ } else {
+ statusRadioDown.checked = true;
+ }
+ port._currentOperstate = operstate;
+ } else {
+ var msgElement = document.getElementById('port-status-message');
+ if (msgElement) {
+ msgElement.style.display = 'block';
+ }
+ }
+
+ console.log('Modal opened for port:', port.device);
+ console.log('Device for status lookup:', deviceForStatus);
+ console.log('Operstate from rpcd:', operstate);
+ console.log('isLanPort (enabled):', isLanPort);
+ });
+
+ var labelInputEl = E('input', {
+ 'type': 'text',
+ 'class': 'cbi-input-text',
+ 'value': currentLabel,
+ 'style': 'width: 100%; margin-bottom: 1em;',
+ 'placeholder': port.device,
+ 'maxlength': '9'
+ });
+
+ var descriptionInputEl = E('input', {
+ 'type': 'text',
+ 'class': 'cbi-input-text',
+ 'value': currentDescription,
+ 'style': 'width: 100%; margin-bottom: 1em;',
+ 'placeholder': _(''),
+ 'maxlength': '50'
+ });
+
+ var infoText = E('p', { 'style': 'margin: 0.5em 0; font-size: 90%; color: var(--text-color-secondary);' }, [
+ _('Device')+': ',
+ E('strong', {}, port.device),
+ E('br'),
+ _('Original label')+': ',
+ E('strong', {}, originalLabel),
+ E('br'),
+ E('small', {}, _('Label max 9 chars, description max 50 chars.')),
+ E('br'),
+ E('small', {}, _('User settings are saved to the /etc/user_defined_ports.json file.'))
+ ]);
+
+ var statusSection = [
+ E('p', { 'style': 'margin-top: 1em;' }, _('Change port state')),
+ E('div', { 'style': 'margin-bottom: 1em;' }, [
+ E('label', {
+ 'data-tooltip': _('Enable this port')
+ }, [
+ statusRadioUp,
+ ' ',
+ _('Enable port')
+ ]),
+ ' \u00a0 ',
+ E('label', {
+ 'data-tooltip': _('Disable this port')
+ }, [
+ statusRadioDown,
+ ' ',
+ _('Disable port')
+ ])
+ ]),
+ E('div', {
+ 'id': 'port-status-message',
+ 'style': 'margin-top: 8px; padding: 8px; background: var(--background-color-medium); border: 1px solid var(--border-color-medium); border-radius: 4px; font-size: 12px; color: var(--text-color-secondary); display: none;'
+ }, [
+ _('Changing port state is available only for LAN ports')
+ ])
+ ];
+
+ var modalContent = E('div', {}, [
+ E('p', {}, _('Enter new label for this port:')),
+ labelInputEl,
+ E('p', { 'style': 'margin-top: 1em;' }, _('Enter description (optional):')),
+ descriptionInputEl
+ ].concat(statusSection).concat([infoText]));
+
+ var restoreBtn = E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': function(ev) {
+ labelInputEl.value = originalLabel;
+ descriptionInputEl.value = '';
+ ev.target.blur();
+ labelInputEl.focus();
+ }
+ }, _('Restore Original'));
+
+ var handleDownloadConfig = function() {
+ L.resolveDefault(fs.read(USER_PORTS_FILE), null).then(function(content) {
+ if (content) {
+ var link = E('a', {
+ 'download': 'user_defined_ports.json',
+ 'href': URL.createObjectURL(new Blob([content], {
+ type: 'application/json'
+ }))
+ });
+ link.click();
+ URL.revokeObjectURL(link.href);
+ } else {
+ ui.addNotification(null, E('p', _('Configuration file not found')), 'warning');
+ }
+ }).catch(function(err) {
+ ui.addNotification(null, E('p', _('Download error: %s').format(err.message)), 'error');
+ });
+ };
+
+ var handleUploadConfig = function(ev) {
+ var fileInput = E('input', {
+ 'type': 'file',
+ 'accept': '.json',
+ 'style': 'display: none',
+ 'change': function(e) {
+ var file = e.target.files[0];
+ if (!file) return;
+
+ var reader = new FileReader();
+ reader.onload = function(event) {
+ try {
+ var config = JSON.parse(event.target.result);
+
+ if (!Array.isArray(config)) {
+ throw new Error(_('Invalid configuration format'));
+ }
+
+ if (!validatePortsConfig(config)) {
+ throw new Error(_('Configuration validation failed'));
+ }
+
+ ui.showModal(_('Restore configuration'), [
+ E('p', _('This will overwrite current ports configuration. Continue?')),
+ E('p', {}, [
+ E('strong', {}, _('File contains:')),
+ ' ', config.length, ' ', _('ports')
+ ]),
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': function() {
+ ui.hideModal();
+ poll.start();
+ }
+ }, _('Cancel')),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-positive',
+ 'click': function() {
+ fs.write(USER_PORTS_FILE, JSON.stringify(config, null, 2)).then(function() {
+ ui.hideModal();
+ popTimeout(null, E('p', _('Configuration restored successfully. Reloading...')), 5000, 'info');
+ setTimeout(function() {
+ window.location.reload();
+ }, 1500);
+ }).catch(function(err) {
+ ui.hideModal();
+ ui.addNotification(null, E('p', _('File restore failed: %s').format(err.message)), 'error');
+ poll.start();
+ });
+ }
+ }, _('Restore'))
+ ])
+ ]);
+ } catch(err) {
+ ui.addNotification(null, E('p', _('Invalid JSON file: %s').format(err.message)), 'error');
+ }
+ };
+ reader.readAsText(file);
+ }
+ });
+
+ document.body.appendChild(fileInput);
+ fileInput.click();
+ document.body.removeChild(fileInput);
+ };
+
+ var handleRestoreBackup = function() {
+ L.resolveDefault(fs.read(USER_PORTS_BACKUP), null).then(function(backupContent) {
+ if (!backupContent) {
+ ui.addNotification(null, E('p', _('No backup file found')), 'warning');
+ return;
+ }
+
+ try {
+ var backupConfig = JSON.parse(backupContent);
+ if (!validatePortsConfig(backupConfig)) {
+ throw new Error('Invalid backup configuration');
+ }
+
+ ui.showModal(_('Restore from backup'), [
+ E('p', _('Restore configuration from backup file? This will overwrite current settings.')),
+ E('p', {}, [
+ E('strong', {}, _('Backup contains:')),
+ ' ', backupConfig.length, ' ', _('ports')
+ ]),
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': function() {
+ ui.hideModal();
+ poll.start();
+ }
+ }, _('Cancel')),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': function() {
+ ensureFileWritable(USER_PORTS_FILE).then(function() {
+ return fs.write(USER_PORTS_FILE, backupContent);
+ }).then(function() {
+ return verifyFileSaved(USER_PORTS_FILE, backupContent);
+ }).then(function(ok) {
+ if (!ok) throw new Error('Verification failed');
+ return setFileReadOnly(USER_PORTS_FILE);
+ }).then(function() {
+ ui.hideModal();
+ popTimeout(null, E('p', _('Configuration restored from backup. Reloading...')), 5000, 'info');
+ setTimeout(function() { window.location.reload(); }, 1500);
+ }).catch(function(err) {
+ ui.hideModal();
+ ui.addNotification(null, E('p', _('Restore failed: %s').format(err.message)), 'error');
+ poll.start();
+ });
+ }
+ }, _('Restore'))
+ ])
+ ]);
+ } catch(e) {
+ ui.addNotification(null, E('p', _('Backup file is corrupted: %s').format(e.message)), 'error');
+ }
+ }).catch(function(err) {
+ ui.addNotification(null, E('p', _('Error reading backup: %s').format(err.message)), 'error');
+ });
+ };
+
+ var handleCreateBackup = function() {
+ L.resolveDefault(fs.read(USER_PORTS_FILE), null).then(function(content) {
+ if (!content) {
+ ui.addNotification(null, E('p', _('No config file to backup')), 'warning');
+ return;
+ }
+ try {
+ var parsed = JSON.parse(content);
+ if (!validatePortsConfig(parsed)) throw new Error('invalid');
+ } catch(e) {
+ ui.addNotification(null, E('p', _('Config file is corrupted, cannot create backup')), 'error');
+ return;
+ }
+ ensureFileWritable(USER_PORTS_BACKUP).then(function() {
+ return fs.write(USER_PORTS_BACKUP, content);
+ }).then(function() {
+ return verifyFileSaved(USER_PORTS_BACKUP, content);
+ }).then(function(ok) {
+ if (ok) {
+ return setFileReadOnly(USER_PORTS_BACKUP).then(function() {
+ popTimeout(null, E('p', _('Backup file created: %s').format(USER_PORTS_BACKUP)), 5000, 'info');
+ });
+ } else {
+ ui.addNotification(null, E('p', _('Backup write verification failed!')), 'error');
+ }
+ }).catch(function(err) {
+ ui.addNotification(null, E('p', _('Backup creation failed: %s').format(err.message)), 'error');
+ });
+ }).catch(function(err) {
+ ui.addNotification(null, E('p', _('Error reading config: %s').format(err.message)), 'error');
+ });
+ };
+
+ var backupComboButton = new ui.ComboButton('_backup', {
+ '_backup': _('Create backup .bak'),
+ '_save': _('Save .json file'),
+ '_upload': _('Upload .json file'),
+ '_restore_backup': _('Restore backup .bak')
+ }, {
+ 'click': function(ev, name) {
+ if (name === '_backup') {
+ handleCreateBackup();
+ } else if (name === '_save') {
+ handleDownloadConfig();
+ } else if (name === '_upload') {
+ handleUploadConfig(ev);
+ } else if (name === '_restore_backup') {
+ handleRestoreBackup();
+ }
+ },
+ 'classes': {
+ '_backup': 'cbi-button cbi-button-action',
+ '_save': 'cbi-button cbi-button-neutral',
+ '_upload': 'cbi-button cbi-button-neutral',
+ '_restore_backup': 'cbi-button cbi-button-negative'
+ }
+ }).render();
+
+ ui.showModal(modalTitle, [
+ modalContent,
+ E('div', { 'style': 'display: flex; justify-content: space-between; align-items: center;' }, [
+ E('div', {}, [
+ backupComboButton
+ ]),
+ E('div', { 'class': 'right' }, [
+ restoreBtn,
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': function() {
+ ui.hideModal();
+ poll.start();
+ }
+ }, _('Cancel')),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-positive',
+ 'click': function() {
+ var newLabel = labelInputEl.value.trim();
+ var newDescription = descriptionInputEl.value.trim();
+
+ if (newLabel === '') {
+ newLabel = port.device;
+ }
+
+ port.label = newLabel;
+ port.description = newDescription;
+ labelElement.textContent = newLabel;
+
+ if (newDescription) {
+ descriptionElement.textContent = newDescription;
+ descriptionElement.style.display = 'block';
+ } else {
+ descriptionElement.textContent = '';
+ descriptionElement.style.display = 'none';
+ }
+
+ var newStatusEnabled = document.getElementById('port-status-up').checked;
+ var currentOperstate = port._currentOperstate || 'unknown';
+ var isCurrentlyEnabled = (currentOperstate !== 'disabled');
+ var statusChanged = isLanPort && (newStatusEnabled !== isCurrentlyEnabled);
+
+ ui.showModal(null, E('p', { 'class': 'spinning' }, _('Saving configuration...')));
+
+ var promises = [saveUserPorts(ports)];
+
+ if (statusChanged) {
+ var newStatus = newStatusEnabled ? 'up' : 'down';
+ promises.push(
+ L.resolveDefault(callSetPortStatus(port.device, newStatus), {})
+ .then(function(res) {
+ if (res && res.success) {
+ var newOperstate = newStatusEnabled ? 'idle' : 'disabled';
+ var statusColor = '#888';
+ var statusText = _('Down');
+ var statusAnimate = '';
+
+ if (newOperstate === 'disabled') {
+ statusColor = '#FF204E'; // Red
+ statusText = _('Disabled');
+ } else if (newOperstate === 'idle') {
+ statusColor = '#FFF455'; // Yellow
+ statusText = _('Idle');
+ }
+
+ var statusDot = E('span', {
+ 'style': 'display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;background-color:' + statusColor + ';' + statusAnimate
+ });
+
+ dom.content(statusElement, [ statusDot, statusText ]);
+ port._operstate = newOperstate;
+ port._currentOperstate = newOperstate;
+
+ var msg = newStatusEnabled ? _('Port has been enabled successfully') : _('Port has been disabled successfully');
+ showPortsStatusTimeout(msg, 5000);
+ } else {
+ showPortsStatusTimeout(_('Failed to change port status'), 5000);
+ }
+ })
+ .catch(function(err) {
+ showPortsStatusTimeout(_('Error changing port status'), 5000);
+ })
+ );
+ }
+
+ Promise.all(promises).then(function() {
+ ui.hideModal();
+ showPortsStatusTimeout(_('Port configuration saved successfully'), 5000);
+ poll.start();
+ }).catch(function(err) {
+ ui.hideModal();
+ poll.start();
+ });
+ }
+ }, _('Save'))
+ ])
+ ])
+ ]);
+
+ setTimeout(function() {
+ labelInputEl.focus();
+ labelInputEl.select();
+ }, 100);
+
+ var handleKeydown = function(ev) {
+ if (ev.key === 'Enter') {
+ ev.preventDefault();
+ var saveBtn = modalContent.parentNode.querySelector('.cbi-button-positive');
+ if (saveBtn) {
+ saveBtn.click();
+ }
+ } else if (ev.key === 'Escape') {
+ ev.preventDefault();
+ ui.hideModal();
+ poll.start();
+ }
+ };
+
+ labelInputEl.addEventListener('keydown', handleKeydown);
+ descriptionInputEl.addEventListener('keydown', handleKeydown);
+}
+
+function makeEditable(element, descriptionElement, statusElement, port, ports) {
+ element.style.cursor = 'pointer';
+ element.title = _('Click to edit label');
+
+ element.addEventListener('click', function(ev) {
+ if (isDragging)
+ return;
+
+ ev.stopPropagation();
+ ev.preventDefault();
+
+ showEditLabelModal(port, element, descriptionElement, statusElement, ports);
+ });
+}
+
+function makeDraggable(element, port, container, ports) {
+ var dragHandle = E('div', {
+ 'class': 'drag-handle',
+ 'style': 'position: absolute; top: 0; left: 0; right: 0; bottom: 0; cursor: move; z-index: 1; pointer-events: none;',
+ 'title': _('Hold to drag and reorder')
+ });
+
+ element.style.position = 'relative';
+ element.appendChild(dragHandle);
+
+ var clickTimer = null;
+ var clickStart = null;
+ var hasMoved = false;
+ var isTouch = false;
+
+ function startDrag(ev) {
+ isDragging = true;
+ draggedElement = element;
+ poll.stop();
+
+ element.style.opacity = '0.5';
+ element.style.zIndex = '1000';
+ dragHandle.style.cursor = 'move';
+ dragHandle.style.pointerEvents = 'auto';
+
+ document.body.style.cursor = 'move';
+
+ var placeholder = E('div', {
+ 'class': 'ifacebox drag-placeholder',
+ 'style': element.style.cssText + 'opacity: 0.3; border: 3px dashed var(--border-color-medium); background: var(--border-color-low);'
+ });
+
+ element.style.boxShadow = '0 5px 15px var(--border-color-strong)';
+
+ function onMouseMove(e) {
+ if (isTouch && e.cancelable) {
+ e.preventDefault();
+ }
+
+ var clientX = e.clientX;
+ if (e.touches && e.touches.length > 0) {
+ clientX = e.touches[0].clientX;
+ }
+
+ var afterElement = getDragAfterElement(container, clientX);
+ if (afterElement == null) {
+ container.appendChild(placeholder);
+ } else {
+ container.insertBefore(placeholder, afterElement);
+ }
+ }
+
+ function onMouseUp(e) {
+ document.removeEventListener('mousemove', onMouseMove);
+ document.removeEventListener('mouseup', onMouseUp);
+ document.removeEventListener('touchmove', onMouseMove, { passive: false });
+ document.removeEventListener('touchend', onMouseUp);
+
+ var clientX = e.clientX;
+ if (e.changedTouches && e.changedTouches.length > 0) {
+ clientX = e.changedTouches[0].clientX;
+ }
+
+ var afterElement = getDragAfterElement(container, clientX);
+ if (afterElement == null) {
+ container.appendChild(element);
+ } else {
+ container.insertBefore(element, afterElement);
+ }
+
+ if (placeholder.parentNode)
+ placeholder.parentNode.removeChild(placeholder);
+
+ element.style.opacity = '1';
+ element.style.zIndex = '';
+ element.style.boxShadow = '';
+ dragHandle.style.cursor = 'move';
+ dragHandle.style.pointerEvents = 'none';
+ document.body.style.cursor = '';
+
+ var newOrder = Array.from(container.children).map(function(el) {
+ return el.__port__;
+ }).filter(function(p) { return p; });
+
+ ports.length = 0;
+ newOrder.forEach(function(p) { ports.push(p); });
+
+ saveUserPorts(ports).then(function() {
+ isDragging = false;
+ draggedElement = null;
+ isTouch = false;
+ showPortsStatusTimeout(_('Port order saved'), 4000);
+ poll.start();
+ }).catch(function(err) {
+ isDragging = false;
+ draggedElement = null;
+ isTouch = false;
+ poll.start();
+ });
+ }
+
+ document.addEventListener('mousemove', onMouseMove);
+ document.addEventListener('mouseup', onMouseUp);
+ document.addEventListener('touchmove', onMouseMove, { passive: false });
+ document.addEventListener('touchend', onMouseUp);
+ }
+
+ function getDragAfterElement(container, x) {
+ var draggableElements = Array.from(container.children).filter(function(child) {
+ return child !== draggedElement && child.classList.contains('ifacebox');
+ });
+
+ return draggableElements.reduce(function(closest, child) {
+ var box = child.getBoundingClientRect();
+ var offset = x - box.left - box.width / 2;
+
+ if (offset < 0 && offset > closest.offset) {
+ return { offset: offset, element: child };
+ } else {
+ return closest;
+ }
+ }, { offset: Number.NEGATIVE_INFINITY }).element;
+ }
+
+ function onPointerDown(ev) {
+ if (ev.target.classList.contains('port-label') || ev.target.closest('.port-label')) {
+ return;
+ }
+
+ isTouch = (ev.type === 'touchstart');
+
+ if (!isTouch && ev.button !== undefined && ev.button !== 0) {
+ return;
+ }
+
+ var clientX = ev.clientX;
+ var clientY = ev.clientY;
+
+ if (isTouch && ev.touches && ev.touches.length > 0) {
+ clientX = ev.touches[0].clientX;
+ clientY = ev.touches[0].clientY;
+ }
+
+ clickStart = { x: clientX, y: clientY };
+ hasMoved = false;
+
+ var delay = isTouch ? 600 : 300;
+
+ clickTimer = setTimeout(function() {
+ if (!hasMoved) {
+ startDrag(ev);
+ }
+ }, delay);
+
+ if (isTouch) {
+ ev.preventDefault();
+ }
+ }
+
+ function onPointerUp(ev) {
+ if (clickTimer) {
+ clearTimeout(clickTimer);
+ clickTimer = null;
+ }
+ hasMoved = false;
+ clickStart = null;
+ }
+
+ function onPointerMove(ev) {
+ if (clickTimer && clickStart) {
+ var clientX = ev.clientX;
+ var clientY = ev.clientY;
+
+ if (isTouch && ev.touches && ev.touches.length > 0) {
+ clientX = ev.touches[0].clientX;
+ clientY = ev.touches[0].clientY;
+ }
+
+ var distance = Math.sqrt(
+ Math.pow(clientX - clickStart.x, 2) +
+ Math.pow(clientY - clickStart.y, 2)
+ );
+
+ if (distance > 10) {
+ hasMoved = true;
+ clearTimeout(clickTimer);
+ clickTimer = null;
+ }
+ }
+ }
+
+ element.addEventListener('mousedown', onPointerDown);
+ element.addEventListener('touchstart', onPointerDown, { passive: false });
+ document.addEventListener('mouseup', onPointerUp);
+ document.addEventListener('touchend', onPointerUp);
+ document.addEventListener('mousemove', onPointerMove);
+ document.addEventListener('touchmove', onPointerMove, { passive: false });
+}
+
+return baseclass.extend({
+ title: _('Port status'),
+
+ load: function() {
+ return Promise.all([
+ L.resolveDefault(callGetBuiltinEthernetPorts(), []),
+ L.resolveDefault(fs.read('/etc/board.json'), '{}'),
+ firewall.getZones(),
+ network.getNetworks(),
+ uci.load('network'),
+ loadUserPorts(),
+ L.resolveDefault(callGetPortsStatus(), {})
+ ]);
+ },
+
+ render: function(data) {
+ if (L.hasSystemFeature('swconfig'))
+ return null;
+
+ var board = JSON.parse(data[1]),
+ detected_ports = [],
+ port_map = buildInterfaceMapping(data[2], data[3]),
+ userConfig = data[5],
+ portsStatus = data[6] || {};
+
+ if (Array.isArray(data[0]) && data[0].length > 0) {
+ detected_ports = data[0].map(function(port) {
+ return {
+ device: port.device,
+ role: port.role,
+ netdev: network.instantiateDevice(port.device),
+ originalLabel: port.label || port.device
+ };
+ });
+ }
+ else {
+ if (L.isObject(board) && L.isObject(board.network)) {
+ for (var k = 'lan'; k != null; k = (k == 'lan') ? 'wan' : null) {
+ if (!L.isObject(board.network[k]))
+ continue;
+
+ if (Array.isArray(board.network[k].ports))
+ for (var i = 0; i < board.network[k].ports.length; i++)
+ detected_ports.push({
+ role: k,
+ device: board.network[k].ports[i],
+ netdev: network.instantiateDevice(board.network[k].ports[i]),
+ originalLabel: board.network[k].ports[i]
+ });
+ else if (typeof(board.network[k].device) == 'string')
+ detected_ports.push({
+ role: k,
+ device: board.network[k].device,
+ netdev: network.instantiateDevice(board.network[k].device),
+ originalLabel: board.network[k].device
+ });
+ }
+ }
+ }
+
+ detected_ports.sort(function(a, b) {
+ return L.naturalCompare(a.device, b.device);
+ });
+
+ if (!userConfig || !validatePortsConfig(userConfig)) {
+ var initialConfig = detected_ports.map(function(p) {
+ return {
+ device: p.device,
+ label: p.device,
+ role: p.role,
+ originalLabel: p.originalLabel || p.device,
+ description: ''
+ };
+ });
+
+ if (initialConfig.length > 0) {
+ console.log('Creating initial port configuration with', initialConfig.length, 'ports');
+ saveUserPorts(initialConfig).then(function() {
+ console.log('Initial configuration created successfully');
+ }).catch(function(err) {
+ console.error('Failed to create initial configuration:', err);
+ });
+
+ userConfig = initialConfig;
+ }
+ } else {
+ console.log('Using existing configuration with', userConfig.length, 'ports');
+ }
+
+ var known_ports = mergePortConfigs(detected_ports, userConfig);
+ originalPorts = known_ports.slice();
+
+ var statusBar = E('div', {
+ 'id': 'ports-operation-status',
+ 'class': 'ports-operation-status'
+ });
+
+ var container = E('div', {
+ 'class': 'ports-container',
+ 'style': 'display:grid;grid-template-columns:repeat(auto-fit, minmax(70px, 1fr));margin-bottom:1em'
+ });
+
+ var wrapper = E('div', {}, [ statusBar, container ]);
+
+ known_ports.forEach(function(port) {
+ var speed = port.netdev.getSpeed(),
+ duplex = port.netdev.getDuplex(),
+ carrier = port.netdev.getCarrier(),
+ pmap = port_map[port.netdev.getName()],
+ pzones = (pmap && pmap.zones.length) ? pmap.zones.sort(function(a, b) { return L.naturalCompare(a.getName(), b.getName()) }) : [ null ];
+
+ var labelDiv = E('div', {
+ 'class': 'ifacebox-head port-label',
+ 'style': 'font-weight:bold; position: relative; z-index: 2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0.25em 0.5em;'
+ }, [ port.label || port.device ]);
+
+ var descriptionDiv = E('div', {
+ 'class': 'ifacebox-body port-description',
+ 'style': 'font-size:70%; color: var(--text-color-secondary); padding: 0.2em 0.5em; min-height: 1.2em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; cursor: help; display: ' + (port.description ? 'block' : 'none'),
+ 'title': port.description || ''
+ }, [ port.description || '' ]);
+
+ var deviceForStatus = port.device.split('@')[0];
+ var operstate = portsStatus[deviceForStatus] || 'unknown';
+
+ var statusColor = '#ccc';
+ var statusText = _('Down');
+ var statusAnimate = '';
+
+ if (operstate === 'disabled') {
+ statusColor = '#FF204E'; // Red
+ statusText = _('Disabled');
+ } else if (operstate === 'down') {
+ statusColor = '#ccc'; // Gray
+ statusText = _('Down');
+ } else if (operstate === 'idle') {
+ statusColor = '#FFA500'; // Orange - idle
+ statusText = _('Idle');
+ } else if (operstate === 'active') {
+ statusColor = '#39FF13'; // Light green - active
+ statusText = _('Active');
+ statusAnimate = 'animation: status-blink 0.8s infinite;';
+ } else {
+ statusColor = '#ccc';
+ statusText = _('Unknown');
+ }
+
+ var statusDot = E('span', {
+ 'style': 'display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;background-color:' + statusColor + ';' + statusAnimate
+ });
+
+ var statusElement = E('span', {
+ 'style': 'font-size: 85%; display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;'
+ }, [ statusDot, statusText ]);
+
+ port._operstate = operstate;
+ port._currentOperstate = operstate;
+ port._isLanPort = true;
+
+ var portBox = E('div', {
+ 'class': 'ifacebox',
+ 'style': 'margin:.25em;min-width:70px;max-width:100px; user-select: none;'
+ }, [
+ labelDiv,
+ descriptionDiv,
+ E('div', {
+ 'class': 'ifacebox-body port-speed-body',
+ 'style': 'overflow: hidden; text-overflow: ellipsis; white-space: nowrap;'
+ }, [
+ E('img', { 'src': L.resource('icons/port_%s.svg').format(carrier ? 'up' : 'down') }),
+ E('br'),
+ E('span', {
+ 'class': 'port-speed-text',
+ 'style': 'display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;',
+ 'title': carrier ?
+ (speed > 0 && duplex ? _('Speed: %d Mibit/s, Duplex: %s').format(speed, duplex) : _('Connected')) :
+ _('no link')
+ }, [
+ formatSpeed(carrier, speed, duplex)
+ ])
+ ]),
+ E('div', { 'class': 'ifacebox-head cbi-tooltip-container', 'style': 'display:flex' }, [
+ E([], pzones.map(function(zone) {
+ return E('div', {
+ 'class': 'zonebadge',
+ 'style': 'cursor:help;flex:1;height:3px;opacity:' + (carrier ? 1 : 0.25) + ';' + firewall.getZoneColorStyle(zone)
+ });
+ })),
+ E('span', { 'class': 'cbi-tooltip left' }, [ renderNetworksTooltip(pmap) ])
+ ]),
+ E('div', {
+ 'class': 'ifacebox-body port-status-body',
+ 'style': 'padding: 0.15em 0.5em; text-align: center; border-top: 1px solid var(--border-color-medium); border-bottom: 1px solid var(--border-color-medium); background: transparent; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;'
+ }, [
+ statusElement
+ ]),
+ E('div', { 'class': 'ifacebox-body port-traffic-body' }, [
+ E('div', { 'class': 'cbi-tooltip-container', 'style': 'text-align:left;font-size:80%' }, [
+ '\u25b2\u202f%1024.1mB'.format(port.netdev.getTXBytes()),
+ E('br'),
+ '\u25bc\u202f%1024.1mB'.format(port.netdev.getRXBytes()),
+ E('span', { 'class': 'cbi-tooltip' }, formatStats(port.netdev))
+ ]),
+ ])
+ ]);
+
+ portBox.__port__ = port;
+
+ makeEditable(labelDiv, descriptionDiv, statusElement, port, known_ports);
+ makeDraggable(portBox, port, container, known_ports);
+
+ container.appendChild(portBox);
+ });
+
+ return wrapper;
+ }
+});
diff --git a/luci-app-ports-status-mod/po/cs/Ports_Status.po b/luci-app-ports-status-mod/po/cs/Ports_Status.po
new file mode 100644
index 000000000..c4dce2c82
--- /dev/null
+++ b/luci-app-ports-status-mod/po/cs/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: cs\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
+
+msgid "Edit Port Label"
+msgstr "Upravit štítek portu"
+
+msgid "Enter new label for this port:"
+msgstr "Zadejte nový štítek pro tento port:"
+
+msgid "Device"
+msgstr "Zařízení"
+
+msgid "Original label"
+msgstr "Původní štítek"
+
+msgid "Restore Original"
+msgstr "Obnovit původní"
+
+msgid "Cancel"
+msgstr "Zrušit"
+
+msgid "Save"
+msgstr "Uložit"
+
+msgid "Port configuration saved successfully"
+msgstr "Konfigurace portu byla úspěšně uložena"
+
+msgid "Port order saved"
+msgstr "Pořadí portů bylo uloženo"
+
+msgid "Click to edit label"
+msgstr "Kliknutím upravíte štítek"
+
+msgid "Hold to drag and reorder"
+msgstr "Podržením přetáhněte a změňte pořadí"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Štítek maximálně 9 znaků, popis maximálně 50 znaků."
+
+msgid "Enter description (optional):"
+msgstr "Zadejte popis (volitelné):"
+
+msgid "Optional description"
+msgstr "Volitelný popis"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Uživatelská nastavení jsou ukládána do souboru /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Konfigurační soubor byl stažen"
+
+msgid "Configuration file not found"
+msgstr "Konfigurační soubor nebyl nalezen"
+
+msgid "Download error: %s"
+msgstr "Chyba stahování: %s"
+
+msgid "Invalid configuration format"
+msgstr "Neplatný formát konfigurace"
+
+msgid "Restore configuration"
+msgstr "Obnovit konfiguraci"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Tato operace přepíše aktuální konfiguraci portů. Pokračovat?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Konfigurace byla úspěšně obnovena. Načítání..."
+
+msgid "File restore failed: %s"
+msgstr "Obnovení souboru selhalo: %s"
+
+msgid "Save .json file"
+msgstr "Uložit soubor .json"
+
+msgid "Upload .json file"
+msgstr "Nahrát soubor .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Nelze uložit prázdnou konfiguraci"
+
+msgid "Cannot save port configuration. "
+msgstr "Nelze uložit konfiguraci portu. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Adresář /etc může být pouze pro čtení nebo má nedostatečná oprávnění. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Zkuste spustit: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Chyba ukládání"
+
+msgid "Original error: %s"
+msgstr "Původní chyba: %s"
+
+msgid "Restore from backup"
+msgstr "Obnovit ze zálohy"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Obnovit konfiguraci ze záložního souboru? Tímto dojde k přepsání aktuálního nastavení."
+
+msgid "Backup contains:"
+msgstr "Záloha obsahuje:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Konfigurace byla obnovena ze zálohy. Načítání..."
+
+msgid "Restore failed: %s"
+msgstr "Obnovení selhalo: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Záložní soubor je poškozen: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Chyba při čtení zálohy: %s"
+
+msgid "Restore backup .bak"
+msgstr "Obnovit zálohu .bak"
+
+msgid "Change port state"
+msgstr "Změnit stav portu"
+
+msgid "Enable this port"
+msgstr "Povolit tento port"
+
+msgid "Enable port"
+msgstr "Povolit port"
+
+msgid "Disable this port"
+msgstr "Zakázat tento port"
+
+msgid "Disable port"
+msgstr "Zakázat port"
+
+msgid "Down"
+msgstr "neaktivní"
+
+msgid "Disabled"
+msgstr "zakázáno"
+
+msgid "Idle"
+msgstr "nečinný"
+
+msgid "Active"
+msgstr "aktivní"
+
+msgid "Unknown"
+msgstr "neznámý"
+
+msgid "No config file to backup"
+msgstr "Žádný konfigurační soubor k zálohování"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Konfigurační soubor je poškozen, nelze vytvořit zálohu"
+
+msgid "Backup file created: %s"
+msgstr "Záložní soubor byl vytvořen: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Ověření zápisu zálohy selhalo!"
+
+msgid "Backup creation failed: %s"
+msgstr "Vytvoření zálohy selhalo: %s"
+
+msgid "Error reading config: %s"
+msgstr "Chyba při čtení konfigurace: %s"
+
+msgid "Create backup .bak"
+msgstr "Vytvořit zálohu .bak"
diff --git a/luci-app-ports-status-mod/po/da/Ports_Status.po b/luci-app-ports-status-mod/po/da/Ports_Status.po
new file mode 100644
index 000000000..92282202e
--- /dev/null
+++ b/luci-app-ports-status-mod/po/da/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Rediger portmærkat"
+
+msgid "Enter new label for this port:"
+msgstr "Indtast ny mærkat for denne port:"
+
+msgid "Device"
+msgstr "Enhed"
+
+msgid "Original label"
+msgstr "Oprindelig mærkat"
+
+msgid "Restore Original"
+msgstr "Gendan oprindelig"
+
+msgid "Cancel"
+msgstr "Annuller"
+
+msgid "Save"
+msgstr "Gem"
+
+msgid "Port configuration saved successfully"
+msgstr "Portkonfigurationen blev gemt"
+
+msgid "Port order saved"
+msgstr "Portrækkefølge gemt"
+
+msgid "Click to edit label"
+msgstr "Klik for at redigere mærkat"
+
+msgid "Hold to drag and reorder"
+msgstr "Hold nede for at trække og omarrangere"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Mærkat maks. 9 tegn, beskrivelse maks. 50 tegn."
+
+msgid "Enter description (optional):"
+msgstr "Indtast beskrivelse (valgfri):"
+
+msgid "Optional description"
+msgstr "Valgfri beskrivelse"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Brugerindstillinger gemmes i filen /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Konfigurationsfil downloadet"
+
+msgid "Configuration file not found"
+msgstr "Konfigurationsfil ikke fundet"
+
+msgid "Download error: %s"
+msgstr "Downloadfejl: %s"
+
+msgid "Invalid configuration format"
+msgstr "Ugyldigt konfigurationsformat"
+
+msgid "Restore configuration"
+msgstr "Gendan konfiguration"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Dette vil overskrive den nuværende portkonfiguration. Fortsæt?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Konfigurationen blev gendannet. Genindlæser..."
+
+msgid "File restore failed: %s"
+msgstr "Gendannelse af fil mislykkedes: %s"
+
+msgid "Save .json file"
+msgstr "Gem .json-fil"
+
+msgid "Upload .json file"
+msgstr "Upload .json-fil"
+
+msgid "Cannot save empty configuration"
+msgstr "Kan ikke gemme en tom konfiguration"
+
+msgid "Cannot save port configuration. "
+msgstr "Kan ikke gemme portkonfiguration. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Mappen /etc er muligvis skrivebeskyttet eller har utilstrækkelige tilladelser. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Prøv at køre: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Fejl ved lagring"
+
+msgid "Original error: %s"
+msgstr "Oprindelig fejl: %s"
+
+msgid "Restore from backup"
+msgstr "Gendan fra sikkerhedskopi"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Gendan konfiguration fra sikkerhedskopifil? Dette vil overskrive de nuværende indstillinger."
+
+msgid "Backup contains:"
+msgstr "Sikkerhedskopi indeholder:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Konfiguration gendannet fra sikkerhedskopi. Genindlæser..."
+
+msgid "Restore failed: %s"
+msgstr "Gendannelse mislykkedes: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Sikkerhedskopifilen er beskadiget: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Fejl ved læsning af sikkerhedskopi: %s"
+
+msgid "Restore backup .bak"
+msgstr "Gendan .bak-sikkerhedskopi"
+
+msgid "Change port state"
+msgstr "Skift portstatus"
+
+msgid "Enable this port"
+msgstr "Aktiver denne port"
+
+msgid "Enable port"
+msgstr "Aktiver port"
+
+msgid "Disable this port"
+msgstr "Deaktiver denne port"
+
+msgid "Disable port"
+msgstr "Deaktiver port"
+
+msgid "Down"
+msgstr "nede"
+
+msgid "Disabled"
+msgstr "deaktiveret"
+
+msgid "Idle"
+msgstr "inaktiv"
+
+msgid "Active"
+msgstr "aktiv"
+
+msgid "Unknown"
+msgstr "ukendt"
+
+msgid "No config file to backup"
+msgstr "Ingen konfigurationsfil at sikkerhedskopiere"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Konfigurationsfilen er beskadiget, kan ikke oprette sikkerhedskopi"
+
+msgid "Backup file created: %s"
+msgstr "Sikkerhedskopifil oprettet: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Skriveverifikation af sikkerhedskopi mislykkedes!"
+
+msgid "Backup creation failed: %s"
+msgstr "Oprettelse af sikkerhedskopi mislykkedes: %s"
+
+msgid "Error reading config: %s"
+msgstr "Fejl ved læsning af konfiguration: %s"
+
+msgid "Create backup .bak"
+msgstr "Opret .bak-sikkerhedskopi"
diff --git a/luci-app-ports-status-mod/po/de/Ports_Status.po b/luci-app-ports-status-mod/po/de/Ports_Status.po
new file mode 100644
index 000000000..f05d72574
--- /dev/null
+++ b/luci-app-ports-status-mod/po/de/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: de\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Port-Beschriftung bearbeiten"
+
+msgid "Enter new label for this port:"
+msgstr "Neue Beschriftung für diesen Port eingeben:"
+
+msgid "Device"
+msgstr "Gerät"
+
+msgid "Original label"
+msgstr "Originalbeschriftung"
+
+msgid "Restore Original"
+msgstr "Original wiederherstellen"
+
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgid "Save"
+msgstr "Speichern"
+
+msgid "Port configuration saved successfully"
+msgstr "Port-Konfiguration erfolgreich gespeichert"
+
+msgid "Port order saved"
+msgstr "Port-Reihenfolge gespeichert"
+
+msgid "Click to edit label"
+msgstr "Klicken Sie, um die Beschriftung zu bearbeiten"
+
+msgid "Hold to drag and reorder"
+msgstr "Halten Sie gedrückt, um zu ziehen und neu anzuordnen"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Beschriftung max. 9 Zeichen, Beschreibung max. 50 Zeichen."
+
+msgid "Enter description (optional):"
+msgstr "Beschreibung eingeben (optional):"
+
+msgid "Optional description"
+msgstr "Optionale Beschreibung"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Benutzereinstellungen werden in der Datei /etc/user_defined_ports.json gespeichert."
+
+msgid "Configuration file downloaded"
+msgstr "Konfigurationsdatei heruntergeladen"
+
+msgid "Configuration file not found"
+msgstr "Konfigurationsdatei nicht gefunden"
+
+msgid "Download error: %s"
+msgstr "Download-Fehler: %s"
+
+msgid "Invalid configuration format"
+msgstr "Ungültiges Konfigurationsformat"
+
+msgid "Restore configuration"
+msgstr "Konfiguration wiederherstellen"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Dies überschreibt die aktuelle Port-Konfiguration. Fortfahren?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Konfiguration erfolgreich wiederhergestellt. Wird neu geladen..."
+
+msgid "File restore failed: %s"
+msgstr "Dateiwiederherstellung fehlgeschlagen: %s"
+
+msgid "Save .json file"
+msgstr ".json-Datei speichern"
+
+msgid "Upload .json file"
+msgstr ".json-Datei hochladen"
+
+msgid "Cannot save empty configuration"
+msgstr "Leere Konfiguration kann nicht gespeichert werden"
+
+msgid "Cannot save port configuration. "
+msgstr "Port-Konfiguration kann nicht gespeichert werden. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Verzeichnis /etc ist möglicherweise schreibgeschützt oder hat unzureichende Berechtigungen. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Versuchen Sie auszuführen: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Speicherfehler"
+
+msgid "Original error: %s"
+msgstr "Ursprünglicher Fehler: %s"
+
+msgid "Restore from backup"
+msgstr "Aus Sicherung wiederherstellen"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Konfiguration aus Sicherungsdatei wiederherstellen? Dies überschreibt die aktuellen Einstellungen."
+
+msgid "Backup contains:"
+msgstr "Sicherung enthält:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Konfiguration aus Sicherung wiederhergestellt. Wird neu geladen..."
+
+msgid "Restore failed: %s"
+msgstr "Wiederherstellung fehlgeschlagen: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Sicherungsdatei ist beschädigt: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Fehler beim Lesen der Sicherung: %s"
+
+msgid "Restore backup .bak"
+msgstr "Sicherung .bak wiederherstellen"
+
+msgid "Change port state"
+msgstr "Portstatus ändern"
+
+msgid "Enable this port"
+msgstr "Diesen Port aktivieren"
+
+msgid "Enable port"
+msgstr "Port aktivieren"
+
+msgid "Disable this port"
+msgstr "Diesen Port deaktivieren"
+
+msgid "Disable port"
+msgstr "Port deaktivieren"
+
+msgid "Down"
+msgstr "inaktiv"
+
+msgid "Disabled"
+msgstr "deaktiviert"
+
+msgid "Idle"
+msgstr "leerlauf"
+
+msgid "Active"
+msgstr "aktiv"
+
+msgid "Unknown"
+msgstr "unbekannt"
+
+msgid "No config file to backup"
+msgstr "Keine Konfigurationsdatei zum Sichern vorhanden"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Konfigurationsdatei ist beschädigt, Sicherung kann nicht erstellt werden"
+
+msgid "Backup file created: %s"
+msgstr "Sicherungsdatei erstellt: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Überprüfung des Sicherungsschreibvorgangs fehlgeschlagen!"
+
+msgid "Backup creation failed: %s"
+msgstr "Erstellung der Sicherung fehlgeschlagen: %s"
+
+msgid "Error reading config: %s"
+msgstr "Fehler beim Lesen der Konfiguration: %s"
+
+msgid "Create backup .bak"
+msgstr "Sicherung .bak erstellen"
diff --git a/luci-app-ports-status-mod/po/es/Ports_Status.po b/luci-app-ports-status-mod/po/es/Ports_Status.po
new file mode 100644
index 000000000..ff7215e87
--- /dev/null
+++ b/luci-app-ports-status-mod/po/es/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: es\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Editar etiqueta del puerto"
+
+msgid "Enter new label for this port:"
+msgstr "Introduzca la nueva etiqueta para este puerto:"
+
+msgid "Device"
+msgstr "Dispositivo"
+
+msgid "Original label"
+msgstr "Etiqueta original"
+
+msgid "Restore Original"
+msgstr "Restaurar original"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Save"
+msgstr "Guardar"
+
+msgid "Port configuration saved successfully"
+msgstr "Configuración del puerto guardada correctamente"
+
+msgid "Port order saved"
+msgstr "Orden de los puertos guardado"
+
+msgid "Click to edit label"
+msgstr "Haga clic para editar la etiqueta"
+
+msgid "Hold to drag and reorder"
+msgstr "Mantenga pulsado para arrastrar y reordenar"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Etiqueta máx. 9 caracteres, descripción máx. 50 caracteres."
+
+msgid "Enter description (optional):"
+msgstr "Introduzca una descripción (opcional):"
+
+msgid "Optional description"
+msgstr "Descripción opcional"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Los ajustes de usuario se guardan en el archivo /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Archivo de configuración descargado"
+
+msgid "Configuration file not found"
+msgstr "Archivo de configuración no encontrado"
+
+msgid "Download error: %s"
+msgstr "Error de descarga: %s"
+
+msgid "Invalid configuration format"
+msgstr "Formato de configuración no válido"
+
+msgid "Restore configuration"
+msgstr "Restaurar configuración"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Esta acción sobrescribirá la configuración actual de los puertos. ¿Continuar?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Configuración restaurada correctamente. Recargando..."
+
+msgid "File restore failed: %s"
+msgstr "Fallo al restaurar el archivo: %s"
+
+msgid "Save .json file"
+msgstr "Guardar archivo .json"
+
+msgid "Upload .json file"
+msgstr "Subir archivo .json"
+
+msgid "Cannot save empty configuration"
+msgstr "No se puede guardar una configuración vacía"
+
+msgid "Cannot save port configuration. "
+msgstr "No se puede guardar la configuración del puerto. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "El directorio /etc puede ser de solo lectura o no tener permisos suficientes. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Intente ejecutar: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Error al guardar"
+
+msgid "Original error: %s"
+msgstr "Error original: %s"
+
+msgid "Restore from backup"
+msgstr "Restaurar desde copia de seguridad"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "¿Restaurar configuración desde el archivo de copia de seguridad? Se sobrescribirán los ajustes actuales."
+
+msgid "Backup contains:"
+msgstr "La copia de seguridad contiene:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Configuración restaurada desde la copia de seguridad. Recargando..."
+
+msgid "Restore failed: %s"
+msgstr "Fallo al restaurar: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "El archivo de copia de seguridad está dañado: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Error al leer la copia de seguridad: %s"
+
+msgid "Restore backup .bak"
+msgstr "Restaurar copia .bak"
+
+msgid "Change port state"
+msgstr "Cambiar estado del puerto"
+
+msgid "Enable this port"
+msgstr "Habilitar este puerto"
+
+msgid "Enable port"
+msgstr "Habilitar puerto"
+
+msgid "Disable this port"
+msgstr "Deshabilitar este puerto"
+
+msgid "Disable port"
+msgstr "Deshabilitar puerto"
+
+msgid "Down"
+msgstr "caído"
+
+msgid "Disabled"
+msgstr "deshabilitado"
+
+msgid "Idle"
+msgstr "inactivo"
+
+msgid "Active"
+msgstr "activo"
+
+msgid "Unknown"
+msgstr "desconocido"
+
+msgid "No config file to backup"
+msgstr "No hay archivo de configuración para respaldar"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "El archivo de configuración está dañado, no se puede crear la copia de seguridad"
+
+msgid "Backup file created: %s"
+msgstr "Archivo de copia de seguridad creado: %s"
+
+msgid "Backup write verification failed!"
+msgstr "¡Falló la verificación de escritura de la copia de seguridad!"
+
+msgid "Backup creation failed: %s"
+msgstr "Fallo al crear la copia de seguridad: %s"
+
+msgid "Error reading config: %s"
+msgstr "Error al leer la configuración: %s"
+
+msgid "Create backup .bak"
+msgstr "Crear copia .bak"
diff --git a/luci-app-ports-status-mod/po/fr/Ports_Status.po b/luci-app-ports-status-mod/po/fr/Ports_Status.po
new file mode 100644
index 000000000..e15765017
--- /dev/null
+++ b/luci-app-ports-status-mod/po/fr/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: fr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Modifier l'étiquette du port"
+
+msgid "Enter new label for this port:"
+msgstr "Entrez une nouvelle étiquette pour ce port :"
+
+msgid "Device"
+msgstr "Périphérique"
+
+msgid "Original label"
+msgstr "Étiquette d'origine"
+
+msgid "Restore Original"
+msgstr "Restaurer l'original"
+
+msgid "Cancel"
+msgstr "Annuler"
+
+msgid "Save"
+msgstr "Enregistrer"
+
+msgid "Port configuration saved successfully"
+msgstr "Configuration du port enregistrée avec succès"
+
+msgid "Port order saved"
+msgstr "Ordre des ports enregistré"
+
+msgid "Click to edit label"
+msgstr "Cliquez pour modifier l'étiquette"
+
+msgid "Hold to drag and reorder"
+msgstr "Maintenez enfoncé pour faire glisser et réorganiser"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Étiquette max. 9 caractères, description max. 50 caractères."
+
+msgid "Enter description (optional):"
+msgstr "Entrez la description (facultatif) :"
+
+msgid "Optional description"
+msgstr "Description facultative"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Les paramètres utilisateur sont enregistrés dans le fichier /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Fichier de configuration téléchargé"
+
+msgid "Configuration file not found"
+msgstr "Fichier de configuration introuvable"
+
+msgid "Download error: %s"
+msgstr "Erreur de téléchargement : %s"
+
+msgid "Invalid configuration format"
+msgstr "Format de configuration non valide"
+
+msgid "Restore configuration"
+msgstr "Restaurer la configuration"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Cela écrasera la configuration actuelle des ports. Continuer ?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Configuration restaurée avec succès. Rechargement..."
+
+msgid "File restore failed: %s"
+msgstr "Échec de la restauration du fichier : %s"
+
+msgid "Save .json file"
+msgstr "Enregistrer le fichier .json"
+
+msgid "Upload .json file"
+msgstr "Téléverser le fichier .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Impossible d'enregistrer une configuration vide"
+
+msgid "Cannot save port configuration. "
+msgstr "Impossible d'enregistrer la configuration des ports. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Le répertoire /etc est peut-être en lecture seule ou les permissions sont insuffisantes. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Essayez d'exécuter : chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Erreur d'enregistrement"
+
+msgid "Original error: %s"
+msgstr "Erreur d'origine : %s"
+
+msgid "Restore from backup"
+msgstr "Restaurer à partir de la sauvegarde"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Restaurer la configuration à partir du fichier de sauvegarde ? Cela écrasera les paramètres actuels."
+
+msgid "Backup contains:"
+msgstr "La sauvegarde contient :"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Configuration restaurée à partir de la sauvegarde. Rechargement..."
+
+msgid "Restore failed: %s"
+msgstr "Échec de la restauration : %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Le fichier de sauvegarde est corrompu : %s"
+
+msgid "Error reading backup: %s"
+msgstr "Erreur de lecture de la sauvegarde : %s"
+
+msgid "Restore backup .bak"
+msgstr "Restaurer la sauvegarde .bak"
+
+msgid "Change port state"
+msgstr "Changer l'état du port"
+
+msgid "Enable this port"
+msgstr "Activer ce port"
+
+msgid "Enable port"
+msgstr "Activer le port"
+
+msgid "Disable this port"
+msgstr "Désactiver ce port"
+
+msgid "Disable port"
+msgstr "Désactiver le port"
+
+msgid "Down"
+msgstr "inactif"
+
+msgid "Disabled"
+msgstr "désactivé"
+
+msgid "Idle"
+msgstr "inactif"
+
+msgid "Active"
+msgstr "actif"
+
+msgid "Unknown"
+msgstr "inconnu"
+
+msgid "No config file to backup"
+msgstr "Aucun fichier de configuration à sauvegarder"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Le fichier de configuration est corrompu, impossible de créer une sauvegarde"
+
+msgid "Backup file created: %s"
+msgstr "Fichier de sauvegarde créé : %s"
+
+msgid "Backup write verification failed!"
+msgstr "Échec de la vérification de l'écriture de la sauvegarde !"
+
+msgid "Backup creation failed: %s"
+msgstr "Échec de la création de la sauvegarde : %s"
+
+msgid "Error reading config: %s"
+msgstr "Erreur lors de la lecture de la configuration : %s"
+
+msgid "Create backup .bak"
+msgstr "Créer une sauvegarde .bak"
diff --git a/luci-app-ports-status-mod/po/id/Ports_Status.po b/luci-app-ports-status-mod/po/id/Ports_Status.po
new file mode 100644
index 000000000..7b2fc6447
--- /dev/null
+++ b/luci-app-ports-status-mod/po/id/Ports_Status.po
@@ -0,0 +1,122 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Edit Port Label"
+msgstr "Edit Label Port"
+
+msgid "Enter new label for this port:"
+msgstr "Masukkan label baru untuk port ini:"
+
+msgid "Device"
+msgstr "Perangkat"
+
+msgid "Original label"
+msgstr "Label asli"
+
+msgid "Restore Original"
+msgstr "Pulihkan Asli"
+
+msgid "Cancel"
+msgstr "Batal"
+
+msgid "Save"
+msgstr "Simpan"
+
+msgid "Port configuration saved successfully"
+msgstr "Konfigurasi port berhasil disimpan"
+
+msgid "Port order saved"
+msgstr "Urutan port tersimpan"
+
+msgid "Click to edit label"
+msgstr "Klik untuk mengedit label"
+
+msgid "Hold to drag and reorder"
+msgstr "Tahan untuk menyeret dan mengurutkan ulang"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Label maks. 9 karakter, deskripsi maks. 50 karakter."
+
+msgid "Enter description (optional):"
+msgstr "Masukkan deskripsi (opsional):"
+
+msgid "Optional description"
+msgstr "Deskripsi opsional"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Pengaturan pengguna disimpan ke file /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "File konfigurasi berhasil diunduh"
+
+msgid "Configuration file not found"
+msgstr "File konfigurasi tidak ditemukan"
+
+msgid "Download error: %s"
+msgstr "Kesalahan unduh: %s"
+
+msgid "Invalid configuration format"
+msgstr "Format konfigurasi tidak valid"
+
+msgid "Restore configuration"
+msgstr "Pulihkan konfigurasi"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Ini akan menimpa konfigurasi port saat ini. Lanjutkan?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Konfigurasi berhasil dipulihkan. Memuat ulang..."
+
+msgid "File restore failed: %s"
+msgstr "Pemulihan file gagal: %s"
+
+msgid "Save .json file"
+msgstr "Simpan file .json"
+
+msgid "Upload .json file"
+msgstr "Unggah file .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Tidak dapat menyimpan konfigurasi kosong"
+
+msgid "Cannot save port configuration. "
+msgstr "Tidak dapat menyimpan konfigurasi port. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Direktori /etc mungkin hanya-baca atau izin tidak mencukupi. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Coba jalankan: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Kesalahan Penyimpanan"
+
+msgid "Original error: %s"
+msgstr "Kesalahan asli: %s"
+
+msgid "Restore from backup"
+msgstr "Pulihkan dari cadangan"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Pulihkan konfigurasi dari file cadangan? Ini akan menimpa pengaturan saat ini."
+
+msgid "Backup contains:"
+msgstr "Cadangan berisi:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Konfigurasi dipulihkan dari cadangan. Memuat ulang..."
+
+msgid "Restore failed: %s"
+msgstr "Pemulihan gagal: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "File cadangan rusak: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Kesalahan membaca cadangan: %s"
+
+msgid "Restore backup .bak"
+msgstr "Pulihkan cadangan .bak"
+
+msgid ""
+msgstr ""
\ No newline at end of file
diff --git a/luci-app-ports-status-mod/po/it/Ports_Status.po b/luci-app-ports-status-mod/po/it/Ports_Status.po
new file mode 100644
index 000000000..b86ee9486
--- /dev/null
+++ b/luci-app-ports-status-mod/po/it/Ports_Status.po
@@ -0,0 +1,176 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: lt\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Edit Port Label"
+msgstr "Modifica etichetta porta"
+
+msgid "Enter new label for this port:"
+msgstr "Inserisci una nuova etichetta per questa porta:"
+
+msgid "Device"
+msgstr "Dispositivo"
+
+msgid "Original label"
+msgstr "Etichetta originale"
+
+msgid "Restore Original"
+msgstr "Ripristina originale"
+
+msgid "Cancel"
+msgstr "Annulla"
+
+msgid "Save"
+msgstr "Salva"
+
+msgid "Port configuration saved successfully"
+msgstr "Configurazione della porta salvata con successo"
+
+msgid "Port order saved"
+msgstr "Ordine delle porte salvato"
+
+msgid "Click to edit label"
+msgstr "Fai clic per modificare l'etichetta"
+
+msgid "Hold to drag and reorder"
+msgstr "Tieni premuto per trascinare e riordinare"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Etichetta max 9 caratteri, descrizione max 50 caratteri."
+
+msgid "Enter description (optional):"
+msgstr "Inserisci descrizione (facoltativo):"
+
+msgid "Optional description"
+msgstr "Descrizione facoltativa"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Le impostazioni utente vengono salvate nel file /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "File di configurazione scaricato"
+
+msgid "Configuration file not found"
+msgstr "File di configurazione non trovato"
+
+msgid "Download error: %s"
+msgstr "Errore di download: %s"
+
+msgid "Invalid configuration format"
+msgstr "Formato di configurazione non valido"
+
+msgid "Restore configuration"
+msgstr "Ripristina configurazione"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Questo sovrascriverà la configurazione attuale delle porte. Continuare?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Configurazione ripristinata con successo. Ricaricamento..."
+
+msgid "File restore failed: %s"
+msgstr "Ripristino del file non riuscito: %s"
+
+msgid "Save .json file"
+msgstr "Salva file .json"
+
+msgid "Upload .json file"
+msgstr "Carica file .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Impossibile salvare una configurazione vuota"
+
+msgid "Cannot save port configuration. "
+msgstr "Impossibile salvare la configurazione delle porte. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "La directory /etc potrebbe essere in sola lettura o avere permessi insufficienti. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Prova a eseguire: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Errore di salvataggio"
+
+msgid "Original error: %s"
+msgstr "Errore originale: %s"
+
+msgid "Restore from backup"
+msgstr "Ripristina dal backup"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Ripristinare la configurazione dal file di backup? Questo sovrascriverà le impostazioni correnti."
+
+msgid "Backup contains:"
+msgstr "Il backup contiene:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Configurazione ripristinata dal backup. Ricaricamento..."
+
+msgid "Restore failed: %s"
+msgstr "Ripristino non riuscito: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Il file di backup è danneggiato: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Errore durante la lettura del backup: %s"
+
+msgid "Restore backup .bak"
+msgstr "Ripristina backup .bak"
+
+msgid "Change port state"
+msgstr "Cambia stato porta"
+
+msgid "Enable this port"
+msgstr "Abilita questa porta"
+
+msgid "Enable port"
+msgstr "Abilita porta"
+
+msgid "Disable this port"
+msgstr "Disabilita questa porta"
+
+msgid "Disable port"
+msgstr "Disabilita porta"
+
+msgid "Down"
+msgstr "inattiva"
+
+msgid "Disabled"
+msgstr "disabilitata"
+
+msgid "Idle"
+msgstr "inattiva"
+
+msgid "Active"
+msgstr "attiva"
+
+msgid "Unknown"
+msgstr "sconosciuto"
+
+msgid "No config file to backup"
+msgstr "Nessun file di configurazione da salvare"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Il file di configurazione è corrotto, impossibile creare il backup"
+
+msgid "Backup file created: %s"
+msgstr "File di backup creato: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Verifica della scrittura del backup non riuscita!"
+
+msgid "Backup creation failed: %s"
+msgstr "Creazione del backup non riuscita: %s"
+
+msgid "Error reading config: %s"
+msgstr "Errore durante la lettura della configurazione: %s"
+
+msgid "Create backup .bak"
+msgstr "Crea backup .bak"
diff --git a/luci-app-ports-status-mod/po/ja/Ports_Status.po b/luci-app-ports-status-mod/po/ja/Ports_Status.po
new file mode 100644
index 000000000..8acf71e42
--- /dev/null
+++ b/luci-app-ports-status-mod/po/ja/Ports_Status.po
@@ -0,0 +1,174 @@
+msgid ""
+msgstr ""
+"Language: ja\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Edit Port Label"
+msgstr "ポートラベルを編集"
+
+msgid "Enter new label for this port:"
+msgstr "このポートの新しいラベルを入力してください:"
+
+msgid "Device"
+msgstr "デバイス"
+
+msgid "Original label"
+msgstr "元のラベル"
+
+msgid "Restore Original"
+msgstr "元に戻す"
+
+msgid "Cancel"
+msgstr "キャンセル"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Port configuration saved successfully"
+msgstr "ポート設定が正常に保存されました"
+
+msgid "Port order saved"
+msgstr "ポート順序が保存されました"
+
+msgid "Click to edit label"
+msgstr "クリックしてラベルを編集"
+
+msgid "Hold to drag and reorder"
+msgstr "ドラッグして順序を変更するには長押し"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "ラベルは最大9文字、説明は最大50文字です。"
+
+msgid "Enter description (optional):"
+msgstr "説明を入力してください (オプション):"
+
+msgid "Optional description"
+msgstr "オプションの説明"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "ユーザー設定は /etc/user_defined_ports.json ファイルに保存されます。"
+
+msgid "Configuration file downloaded"
+msgstr "設定ファイルがダウンロードされました"
+
+msgid "Configuration file not found"
+msgstr "設定ファイルが見つかりません"
+
+msgid "Download error: %s"
+msgstr "ダウンロードエラー: %s"
+
+msgid "Invalid configuration format"
+msgstr "無効な設定形式"
+
+msgid "Restore configuration"
+msgstr "設定を復元"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "これにより現在のポート設定が上書きされます。続行しますか?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "設定が正常に復元されました。リロード中..."
+
+msgid "File restore failed: %s"
+msgstr "ファイルの復元に失敗しました: %s"
+
+msgid "Save .json file"
+msgstr ".json ファイルを保存"
+
+msgid "Upload .json file"
+msgstr ".json ファイルをアップロード"
+
+msgid "Cannot save empty configuration"
+msgstr "空の設定を保存できません"
+
+msgid "Cannot save port configuration. "
+msgstr "ポート設定を保存できません。"
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "ディレクトリ /etc は読み取り専用または権限不足の可能性があります。"
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "次のコマンドを実行してみてください: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "保存エラー"
+
+msgid "Original error: %s"
+msgstr "元のエラー: %s"
+
+msgid "Restore from backup"
+msgstr "バックアップから復元"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "バックアップファイルから設定を復元しますか? これにより現在の設定が上書きされます。"
+
+msgid "Backup contains:"
+msgstr "バックアップに含まれるもの:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "バックアップから設定が復元されました。リロード中..."
+
+msgid "Restore failed: %s"
+msgstr "復元に失敗しました: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "バックアップファイルが破損しています: %s"
+
+msgid "Error reading backup: %s"
+msgstr "バックアップの読み込みエラー: %s"
+
+msgid "Restore backup .bak"
+msgstr "バックアップ .bak を復元"
+
+msgid "Change port state"
+msgstr "ポート状態を変更"
+
+msgid "Enable this port"
+msgstr "このポートを有効にする"
+
+msgid "Enable port"
+msgstr "ポートを有効化"
+
+msgid "Disable this port"
+msgstr "このポートを無効にする"
+
+msgid "Disable port"
+msgstr "ポートを無効化"
+
+msgid "Down"
+msgstr "ダウン"
+
+msgid "Disabled"
+msgstr "無効"
+
+msgid "Idle"
+msgstr "アイドル"
+
+msgid "Active"
+msgstr "アクティブ"
+
+msgid "Unknown"
+msgstr "不明"
+
+msgid "No config file to backup"
+msgstr "バックアップする設定ファイルがありません"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "設定ファイルが破損しているため、バックアップを作成できません"
+
+msgid "Backup file created: %s"
+msgstr "バックアップファイルが作成されました: %s"
+
+msgid "Backup write verification failed!"
+msgstr "バックアップ書き込み検証に失敗しました!"
+
+msgid "Backup creation failed: %s"
+msgstr "バックアップの作成に失敗しました: %s"
+
+msgid "Error reading config: %s"
+msgstr "設定の読み込みエラー: %s"
+
+msgid "Create backup .bak"
+msgstr "バックアップ .bak を作成"
diff --git a/luci-app-ports-status-mod/po/ko/Ports_Status.po b/luci-app-ports-status-mod/po/ko/Ports_Status.po
new file mode 100644
index 000000000..e48b3f42a
--- /dev/null
+++ b/luci-app-ports-status-mod/po/ko/Ports_Status.po
@@ -0,0 +1,174 @@
+msgid ""
+msgstr ""
+"Language: ko\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Edit Port Label"
+msgstr "포트 레이블 편집"
+
+msgid "Enter new label for this port:"
+msgstr "이 포트의 새 레이블을 입력하세요:"
+
+msgid "Device"
+msgstr "장치"
+
+msgid "Original label"
+msgstr "원본 레이블"
+
+msgid "Restore Original"
+msgstr "원본 복원"
+
+msgid "Cancel"
+msgstr "취소"
+
+msgid "Save"
+msgstr "저장"
+
+msgid "Port configuration saved successfully"
+msgstr "포트 설정이 성공적으로 저장되었습니다"
+
+msgid "Port order saved"
+msgstr "포트 순서가 저장되었습니다"
+
+msgid "Click to edit label"
+msgstr "레이블을 편집하려면 클릭"
+
+msgid "Hold to drag and reorder"
+msgstr "드래그하여 순서를 변경하려면 누르고 있기"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "레이블 최대 9자, 설명 최대 50자."
+
+msgid "Enter description (optional):"
+msgstr "설명을 입력하세요 (선택 사항):"
+
+msgid "Optional description"
+msgstr "선택 사항 설명"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "사용자 설정은 /etc/user_defined_ports.json 파일에 저장됩니다."
+
+msgid "Configuration file downloaded"
+msgstr "설정 파일이 다운로드되었습니다"
+
+msgid "Configuration file not found"
+msgstr "설정 파일을 찾을 수 없습니다"
+
+msgid "Download error: %s"
+msgstr "다운로드 오류: %s"
+
+msgid "Invalid configuration format"
+msgstr "잘못된 설정 형식"
+
+msgid "Restore configuration"
+msgstr "설정 복원"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "이 작업은 현재 포트 설정을 덮어씁니다. 계속하시겠습니까?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "설정이 성공적으로 복원되었습니다. 다시 로드 중..."
+
+msgid "File restore failed: %s"
+msgstr "파일 복원 실패: %s"
+
+msgid "Save .json file"
+msgstr ".json 파일 저장"
+
+msgid "Upload .json file"
+msgstr ".json 파일 업로드"
+
+msgid "Cannot save empty configuration"
+msgstr "빈 설정을 저장할 수 없습니다"
+
+msgid "Cannot save port configuration. "
+msgstr "포트 설정을 저장할 수 없습니다. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "/etc 디렉토리가 읽기 전용이거나 권한이 부족할 수 있습니다. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "다음 명령어를 실행해보세요: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "저장 오류"
+
+msgid "Original error: %s"
+msgstr "원본 오류: %s"
+
+msgid "Restore from backup"
+msgstr "백업에서 복원"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "백업 파일에서 설정을 복원하시겠습니까? 이 작업은 현재 설정을 덮어씁니다."
+
+msgid "Backup contains:"
+msgstr "백업에 포함됨:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "백업에서 설정이 복원되었습니다. 다시 로드 중..."
+
+msgid "Restore failed: %s"
+msgstr "복원 실패: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "백업 파일이 손상됨: %s"
+
+msgid "Error reading backup: %s"
+msgstr "백업 읽기 오류: %s"
+
+msgid "Restore backup .bak"
+msgstr "백업 .bak 복원"
+
+msgid "Change port state"
+msgstr "포트 상태 변경"
+
+msgid "Enable this port"
+msgstr "이 포트 활성화"
+
+msgid "Enable port"
+msgstr "포트 활성화"
+
+msgid "Disable this port"
+msgstr "이 포트 비활성화"
+
+msgid "Disable port"
+msgstr "포트 비활성화"
+
+msgid "Down"
+msgstr "다운"
+
+msgid "Disabled"
+msgstr "비활성화됨"
+
+msgid "Idle"
+msgstr "유휴 상태"
+
+msgid "Active"
+msgstr "활성"
+
+msgid "Unknown"
+msgstr "알 수 없음"
+
+msgid "No config file to backup"
+msgstr "백업할 설정 파일이 없습니다"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "설정 파일이 손상되어 백업을 만들 수 없습니다"
+
+msgid "Backup file created: %s"
+msgstr "백업 파일이 생성되었습니다: %s"
+
+msgid "Backup write verification failed!"
+msgstr "백업 쓰기 검증 실패!"
+
+msgid "Backup creation failed: %s"
+msgstr "백업 생성 실패: %s"
+
+msgid "Error reading config: %s"
+msgstr "설정 읽기 오류: %s"
+
+msgid "Create backup .bak"
+msgstr "백업 .bak 생성"
diff --git a/luci-app-ports-status-mod/po/nl/Ports_Status.po b/luci-app-ports-status-mod/po/nl/Ports_Status.po
new file mode 100644
index 000000000..fc55ebebc
--- /dev/null
+++ b/luci-app-ports-status-mod/po/nl/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: nl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Poortlabel bewerken"
+
+msgid "Enter new label for this port:"
+msgstr "Voer nieuw label in voor deze poort:"
+
+msgid "Device"
+msgstr "Apparaat"
+
+msgid "Original label"
+msgstr "Oorspronkelijk label"
+
+msgid "Restore Original"
+msgstr "Oorspronkelijke herstellen"
+
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgid "Save"
+msgstr "Opslaan"
+
+msgid "Port configuration saved successfully"
+msgstr "Poortconfiguratie succesvol opgeslagen"
+
+msgid "Port order saved"
+msgstr "Poortvolgorde opgeslagen"
+
+msgid "Click to edit label"
+msgstr "Klik om label te bewerken"
+
+msgid "Hold to drag and reorder"
+msgstr "Vasthouden om te slepen en de volgorde te wijzigen"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Label max. 9 tekens, beschrijving max. 50 tekens."
+
+msgid "Enter description (optional):"
+msgstr "Voer beschrijving in (optioneel):"
+
+msgid "Optional description"
+msgstr "Optionele beschrijving"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Gebruikersinstellingen worden opgeslagen in het bestand /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Configuratiebestand gedownload"
+
+msgid "Configuration file not found"
+msgstr "Configuratiebestand niet gevonden"
+
+msgid "Download error: %s"
+msgstr "Downloadfout: %s"
+
+msgid "Invalid configuration format"
+msgstr "Ongeldig configuratieformaat"
+
+msgid "Restore configuration"
+msgstr "Configuratie herstellen"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Dit zal de huidige poortconfiguratie overschrijven. Doorgaan?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Configuratie succesvol hersteld. Herladen..."
+
+msgid "File restore failed: %s"
+msgstr "Bestandsherstel mislukt: %s"
+
+msgid "Save .json file"
+msgstr "JSON-bestand opslaan"
+
+msgid "Upload .json file"
+msgstr "JSON-bestand uploaden"
+
+msgid "Cannot save empty configuration"
+msgstr "Kan geen lege configuratie opslaan"
+
+msgid "Cannot save port configuration. "
+msgstr "Kan poortconfiguratie niet opslaan. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "De map /etc is mogelijk alleen-lezen of heeft onvoldoende rechten. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Probeer het volgende uit te voeren: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Opslagfout"
+
+msgid "Original error: %s"
+msgstr "Oorspronkelijke fout: %s"
+
+msgid "Restore from backup"
+msgstr "Herstellen van back-up"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Configuratie herstellen van back-upbestand? Dit zal de huidige instellingen overschrijven."
+
+msgid "Backup contains:"
+msgstr "Back-up bevat:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Configuratie hersteld van back-up. Herladen..."
+
+msgid "Restore failed: %s"
+msgstr "Herstel mislukt: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Back-upbestand is beschadigd: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Fout bij lezen van back-up: %s"
+
+msgid "Restore backup .bak"
+msgstr ".bak-back-up herstellen"
+
+msgid "Change port state"
+msgstr "Poortstatus wijzigen"
+
+msgid "Enable this port"
+msgstr "Deze poort inschakelen"
+
+msgid "Enable port"
+msgstr "Poort inschakelen"
+
+msgid "Disable this port"
+msgstr "Deze poort uitschakelen"
+
+msgid "Disable port"
+msgstr "Poort uitschakelen"
+
+msgid "Down"
+msgstr "down"
+
+msgid "Disabled"
+msgstr "uitgeschakeld"
+
+msgid "Idle"
+msgstr "onactief"
+
+msgid "Active"
+msgstr "actief"
+
+msgid "Unknown"
+msgstr "onbekend"
+
+msgid "No config file to backup"
+msgstr "Geen configuratiebestand om back-up van te maken"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Configuratiebestand is beschadigd, kan geen back-up maken"
+
+msgid "Backup file created: %s"
+msgstr "Back-upbestand aangemaakt: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Schrijfverificatie van back-up mislukt!"
+
+msgid "Backup creation failed: %s"
+msgstr "Aanmaken van back-up mislukt: %s"
+
+msgid "Error reading config: %s"
+msgstr "Fout bij lezen van configuratie: %s"
+
+msgid "Create backup .bak"
+msgstr ".bak-back-up maken"
diff --git a/luci-app-ports-status-mod/po/pl/Ports_Status.po b/luci-app-ports-status-mod/po/pl/Ports_Status.po
new file mode 100644
index 000000000..553a0762a
--- /dev/null
+++ b/luci-app-ports-status-mod/po/pl/Ports_Status.po
@@ -0,0 +1,170 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Edit Port Label"
+msgstr "Edytuj etykietę portu"
+
+msgid "Enter new label for this port:"
+msgstr "Wprowadź nową etykietę dla tego portu:"
+
+msgid "Device"
+msgstr "Urządzenie"
+
+msgid "Original label"
+msgstr "Oryginalna etykieta"
+
+msgid "Restore Original"
+msgstr "Przywróć oryginalną"
+
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgid "Save"
+msgstr "Zapisz"
+
+msgid "Port configuration saved successfully"
+msgstr "Konfiguracja portu została poprawnie zapisana"
+
+msgid "Port order saved"
+msgstr "Zapisano kolejność portu"
+
+msgid "Click to edit label"
+msgstr "Kliknij aby edytować etykietę"
+
+msgid "Hold to drag and reorder"
+msgstr "Przytrzymaj aby przeciągnąć i zmienić kolejność"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Etykieta to maksymalnie 9 znaków, limit dla opisu wynosi 50 znaków."
+
+msgid "Enter description (optional):"
+msgstr "Dodaj opis (opcjonalnie):"
+
+msgid "Optional description"
+msgstr "Opcjonalny opis portu"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Ustawienia użytkownika zapisywane są w pliku /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Pobrano plik z ustawieniami"
+
+msgid "Configuration file not found"
+msgstr "Nie znaleziono pliku z ustawieniami"
+
+msgid "Download error: %s"
+msgstr "Błąd pobierania: %s"
+
+msgid "Invalid configuration format"
+msgstr "Niewłaściwy format pliku"
+
+msgid "Restore configuration"
+msgstr "Przywracanie ustawień"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Operacja nadpisze bieżącą konfigurację portów. Kontynuować?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Konfiguracja została pomyślnie przywrócona. Odświeżanie..."
+
+msgid "File restore failed: %s"
+msgstr "Przywracanie pliku nie powiodło się: %s"
+
+msgid "Save .json file"
+msgstr "Zapisz plik .json"
+
+msgid "Upload .json file"
+msgstr "Załaduj plik .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Nie można zapisać pustej konfiguracji"
+
+msgid "Cannot save port configuration. "
+msgstr "Nie można zapisać konfiguracji portów. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Katalog /etc może być tylko do odczytu lub mieć niewystarczające uprawnienia. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Spróbuj uruchomić: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Błąd zapisu"
+
+msgid "Original error: %s"
+msgstr "Oryginalny błąd: %s"
+
+msgid "Restore from backup"
+msgstr "Przywróć z kopii zapasowej"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Przywrócić konfigurację z pliku kopii zapasowej? Spowoduje to nadpisanie bieżących ustawień."
+
+msgid "Backup contains:"
+msgstr "Kopia zapasowa zawiera:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Konfiguracja przywrócona z kopii zapasowej. Odświeżanie..."
+
+msgid "Restore failed: %s"
+msgstr "Przywracanie nie powiodło się: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Plik kopii zapasowej jest uszkodzony: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Błąd odczytu kopii zapasowej: %s"
+
+msgid "Restore backup .bak"
+msgstr "Przywróć kopię .bak"
+
+msgid "Change port state"
+msgstr "Zmień stan portu"
+
+msgid "Enable this port"
+msgstr "Włącz ten port"
+
+msgid "Enable port"
+msgstr "Włącz port"
+
+msgid "Disable this port"
+msgstr "Wyłącz ten port"
+
+msgid "Disable port"
+msgstr "Wyłącz port"
+
+msgid "Down"
+msgstr "nieaktywny"
+
+msgid "Disabled"
+msgstr "wyłączony"
+
+msgid "Idle"
+msgstr "bezczynny"
+
+msgid "Active"
+msgstr "aktywny"
+
+msgid "Unknown"
+msgstr "nieznany"
+
+msgid "No config file to backup"
+msgstr "Brak pliku konfiguracji do utworzenia kopii zapasowej"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Plik konfiguracji jest uszkodzony, nie można utworzyć kopii zapasowej"
+
+msgid "Backup file created: %s"
+msgstr "Plik kopii zapasowej został utworzony: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Weryfikacja zapisu kopii zapasowej nie powiodła się!"
+
+msgid "Backup creation failed: %s"
+msgstr "Tworzenie kopii zapasowej nie powiodło się: %s"
+
+msgid "Error reading config: %s"
+msgstr "Błąd odczytu konfiguracji: %s"
+
+msgid "Create backup .bak"
+msgstr "Utwórz kopię .bak"
diff --git a/luci-app-ports-status-mod/po/pt_BR/Ports_Status.po b/luci-app-ports-status-mod/po/pt_BR/Ports_Status.po
new file mode 100644
index 000000000..49767370b
--- /dev/null
+++ b/luci-app-ports-status-mod/po/pt_BR/Ports_Status.po
@@ -0,0 +1,174 @@
+msgid ""
+msgstr ""
+"Language: pt_BR\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "Edit Port Label"
+msgstr "Editar rótulo da porta"
+
+msgid "Enter new label for this port:"
+msgstr "Digite um novo rótulo para esta porta:"
+
+msgid "Device"
+msgstr "Dispositivo"
+
+msgid "Original label"
+msgstr "Rótulo original"
+
+msgid "Restore Original"
+msgstr "Restaurar original"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Save"
+msgstr "Salvar"
+
+msgid "Port configuration saved successfully"
+msgstr "Configuração da porta salva com sucesso"
+
+msgid "Port order saved"
+msgstr "Ordem das portas salva"
+
+msgid "Click to edit label"
+msgstr "Clique para editar rótulo"
+
+msgid "Hold to drag and reorder"
+msgstr "Segure para arrastar e reordenar"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Rótulo máximo de 9 caracteres, descrição máximo de 50 caracteres."
+
+msgid "Enter description (optional):"
+msgstr "Digite descrição (opcional):"
+
+msgid "Optional description"
+msgstr "Descrição opcional"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "As configurações do usuário são salvas no arquivo /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Arquivo de configuração baixado"
+
+msgid "Configuration file not found"
+msgstr "Arquivo de configuração não encontrado"
+
+msgid "Download error: %s"
+msgstr "Erro de download: %s"
+
+msgid "Invalid configuration format"
+msgstr "Formato de configuração inválido"
+
+msgid "Restore configuration"
+msgstr "Restaurar configuração"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Isso sobrescreverá a configuração atual das portas. Continuar?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Configuração restaurada com sucesso. Recarregando..."
+
+msgid "File restore failed: %s"
+msgstr "Falha na restauração do arquivo: %s"
+
+msgid "Save .json file"
+msgstr "Salvar arquivo .json"
+
+msgid "Upload .json file"
+msgstr "Carregar arquivo .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Não é possível salvar uma configuração vazia"
+
+msgid "Cannot save port configuration. "
+msgstr "Não é possível salvar a configuração da porta. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "O diretório /etc pode estar somente leitura ou ter permissões insuficientes. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Tente executar: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Erro ao salvar"
+
+msgid "Original error: %s"
+msgstr "Erro original: %s"
+
+msgid "Restore from backup"
+msgstr "Restaurar do backup"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Restaurar configuração do arquivo de backup? Isso sobrescreverá as configurações atuais."
+
+msgid "Backup contains:"
+msgstr "Backup contém:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Configuração restaurada do backup. Recarregando..."
+
+msgid "Restore failed: %s"
+msgstr "Falha na restauração: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Arquivo de backup corrompido: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Erro ao ler backup: %s"
+
+msgid "Restore backup .bak"
+msgstr "Restaurar backup .bak"
+
+msgid "Change port state"
+msgstr "Alterar estado da porta"
+
+msgid "Enable this port"
+msgstr "Ativar esta porta"
+
+msgid "Enable port"
+msgstr "Ativar porta"
+
+msgid "Disable this port"
+msgstr "Desativar esta porta"
+
+msgid "Disable port"
+msgstr "Desativar porta"
+
+msgid "Down"
+msgstr "Inativo"
+
+msgid "Disabled"
+msgstr "Desativado"
+
+msgid "Idle"
+msgstr "Ocioso"
+
+msgid "Active"
+msgstr "Ativo"
+
+msgid "Unknown"
+msgstr "Desconhecido"
+
+msgid "No config file to backup"
+msgstr "Nenhum arquivo de configuração para fazer backup"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Arquivo de configuração corrompido, não é possível criar backup"
+
+msgid "Backup file created: %s"
+msgstr "Arquivo de backup criado: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Falha na verificação de escrita do backup!"
+
+msgid "Backup creation failed: %s"
+msgstr "Falha na criação do backup: %s"
+
+msgid "Error reading config: %s"
+msgstr "Erro ao ler configuração: %s"
+
+msgid "Create backup .bak"
+msgstr "Criar backup .bak"
diff --git a/luci-app-ports-status-mod/po/ru/Ports_Status.po b/luci-app-ports-status-mod/po/ru/Ports_Status.po
new file mode 100644
index 000000000..ff72aad81
--- /dev/null
+++ b/luci-app-ports-status-mod/po/ru/Ports_Status.po
@@ -0,0 +1,176 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: ru\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Edit Port Label"
+msgstr "Редактировать метку порта"
+
+msgid "Enter new label for this port:"
+msgstr "Введите новую метку для этого порта:"
+
+msgid "Device"
+msgstr "Устройство"
+
+msgid "Original label"
+msgstr "Исходная метка"
+
+msgid "Restore Original"
+msgstr "Восстановить исходную"
+
+msgid "Cancel"
+msgstr "Отмена"
+
+msgid "Save"
+msgstr "Сохранить"
+
+msgid "Port configuration saved successfully"
+msgstr "Конфигурация порта успешно сохранена"
+
+msgid "Port order saved"
+msgstr "Порядок портов сохранен"
+
+msgid "Click to edit label"
+msgstr "Нажмите, чтобы изменить метку"
+
+msgid "Hold to drag and reorder"
+msgstr "Удерживайте, чтобы перетащить и изменить порядок"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Метка макс. 9 символов, описание макс. 50 символов."
+
+msgid "Enter description (optional):"
+msgstr "Введите описание (необязательно):"
+
+msgid "Optional description"
+msgstr "Необязательное описание"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Пользовательские настройки сохраняются в файле /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Файл конфигурации загружен"
+
+msgid "Configuration file not found"
+msgstr "Файл конфигурации не найден"
+
+msgid "Download error: %s"
+msgstr "Ошибка загрузки: %s"
+
+msgid "Invalid configuration format"
+msgstr "Неверный формат конфигурации"
+
+msgid "Restore configuration"
+msgstr "Восстановление конфигурации"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Это перезапишет текущую конфигурацию портов. Продолжить?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Конфигурация успешно восстановлена. Перезагрузка..."
+
+msgid "File restore failed: %s"
+msgstr "Не удалось восстановить файл: %s"
+
+msgid "Save .json file"
+msgstr "Сохранить файл .json"
+
+msgid "Upload .json file"
+msgstr "Загрузить файл .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Невозможно сохранить пустую конфигурацию"
+
+msgid "Cannot save port configuration. "
+msgstr "Невозможно сохранить конфигурацию портов. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Каталог /etc может быть доступен только для чтения или иметь недостаточные права доступа. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Попробуйте выполнить: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Ошибка сохранения"
+
+msgid "Original error: %s"
+msgstr "Исходная ошибка: %s"
+
+msgid "Restore from backup"
+msgstr "Восстановить из резервной копии"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Восстановить конфигурацию из файла резервной копии? Это перезапишет текущие настройки."
+
+msgid "Backup contains:"
+msgstr "Резервная копия содержит:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Конфигурация восстановлена из резервной копии. Перезагрузка..."
+
+msgid "Restore failed: %s"
+msgstr "Восстановление не удалось: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Файл резервной копии поврежден: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Ошибка чтения резервной копии: %s"
+
+msgid "Restore backup .bak"
+msgstr "Восстановить резервную копию .bak"
+
+msgid "Change port state"
+msgstr "Изменить состояние порта"
+
+msgid "Enable this port"
+msgstr "Включить этот порт"
+
+msgid "Enable port"
+msgstr "Включить порт"
+
+msgid "Disable this port"
+msgstr "Отключить этот порт"
+
+msgid "Disable port"
+msgstr "Отключить порт"
+
+msgid "Down"
+msgstr "неактивен"
+
+msgid "Disabled"
+msgstr "отключен"
+
+msgid "Idle"
+msgstr "простаивает"
+
+msgid "Active"
+msgstr "активен"
+
+msgid "Unknown"
+msgstr "неизвестно"
+
+msgid "No config file to backup"
+msgstr "Нет файла конфигурации для резервного копирования"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Файл конфигурации повреждён, создание резервной копии невозможно"
+
+msgid "Backup file created: %s"
+msgstr "Резервный файл создан: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Проверка записи резервной копии не удалась!"
+
+msgid "Backup creation failed: %s"
+msgstr "Создание резервной копии не удалось: %s"
+
+msgid "Error reading config: %s"
+msgstr "Ошибка чтения конфигурации: %s"
+
+msgid "Create backup .bak"
+msgstr "Создать резервную копию .bak"
diff --git a/luci-app-ports-status-mod/po/vi/Ports_Status.po b/luci-app-ports-status-mod/po/vi/Ports_Status.po
new file mode 100644
index 000000000..65c2ef6cf
--- /dev/null
+++ b/luci-app-ports-status-mod/po/vi/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: vi\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Edit Port Label"
+msgstr "Chỉnh sửa nhãn cổng"
+
+msgid "Enter new label for this port:"
+msgstr "Nhập nhãn mới cho cổng này:"
+
+msgid "Device"
+msgstr "Thiết bị"
+
+msgid "Original label"
+msgstr "Nhãn gốc"
+
+msgid "Restore Original"
+msgstr "Khôi phục gốc"
+
+msgid "Cancel"
+msgstr "Hủy"
+
+msgid "Save"
+msgstr "Lưu"
+
+msgid "Port configuration saved successfully"
+msgstr "Đã lưu cấu hình cổng thành công"
+
+msgid "Port order saved"
+msgstr "Đã lưu thứ tự cổng"
+
+msgid "Click to edit label"
+msgstr "Nhấp để chỉnh sửa nhãn"
+
+msgid "Hold to drag and reorder"
+msgstr "Giữ để kéo và sắp xếp lại"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Nhãn tối đa 9 ký tự, mô tả tối đa 50 ký tự."
+
+msgid "Enter description (optional):"
+msgstr "Nhập mô tả (tùy chọn):"
+
+msgid "Optional description"
+msgstr "Mô tả tùy chọn"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Cài đặt người dùng được lưu vào tệp /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Đã tải xuống tệp cấu hình"
+
+msgid "Configuration file not found"
+msgstr "Không tìm thấy tệp cấu hình"
+
+msgid "Download error: %s"
+msgstr "Lỗi tải xuống: %s"
+
+msgid "Invalid configuration format"
+msgstr "Định dạng cấu hình không hợp lệ"
+
+msgid "Restore configuration"
+msgstr "Khôi phục cấu hình"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Thao tác này sẽ ghi đè cấu hình cổng hiện tại. Tiếp tục?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Đã khôi phục cấu hình thành công. Đang tải lại..."
+
+msgid "File restore failed: %s"
+msgstr "Khôi phục tệp không thành công: %s"
+
+msgid "Save .json file"
+msgstr "Lưu tệp .json"
+
+msgid "Upload .json file"
+msgstr "Tải lên tệp .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Không thể lưu cấu hình trống"
+
+msgid "Cannot save port configuration. "
+msgstr "Không thể lưu cấu hình cổng. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Thư mục /etc có thể chỉ đọc hoặc không đủ quyền. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Thử chạy: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Lỗi lưu"
+
+msgid "Original error: %s"
+msgstr "Lỗi gốc: %s"
+
+msgid "Restore from backup"
+msgstr "Khôi phục từ bản sao lưu"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Khôi phục cấu hình từ tệp sao lưu? Thao tác này sẽ ghi đè cài đặt hiện tại."
+
+msgid "Backup contains:"
+msgstr "Bản sao lưu chứa:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Đã khôi phục cấu hình từ bản sao lưu. Đang tải lại..."
+
+msgid "Restore failed: %s"
+msgstr "Khôi phục không thành công: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Tệp sao lưu bị hỏng: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Lỗi đọc bản sao lưu: %s"
+
+msgid "Restore backup .bak"
+msgstr "Khôi phục bản sao lưu .bak"
+
+msgid "Change port state"
+msgstr "Thay đổi trạng thái cổng"
+
+msgid "Enable this port"
+msgstr "Bật cổng này"
+
+msgid "Enable port"
+msgstr "Bật cổng"
+
+msgid "Disable this port"
+msgstr "Tắt cổng này"
+
+msgid "Disable port"
+msgstr "Tắt cổng"
+
+msgid "Down"
+msgstr "không hoạt động"
+
+msgid "Disabled"
+msgstr "đã tắt"
+
+msgid "Idle"
+msgstr "rảnh rỗi"
+
+msgid "Active"
+msgstr "hoạt động"
+
+msgid "Unknown"
+msgstr "không rõ"
+
+msgid "No config file to backup"
+msgstr "Không có tệp cấu hình để sao lưu"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "Tệp cấu hình bị hỏng, không thể tạo bản sao lưu"
+
+msgid "Backup file created: %s"
+msgstr "Đã tạo tệp sao lưu: %s"
+
+msgid "Backup write verification failed!"
+msgstr "Xác minh ghi bản sao lưu thất bại!"
+
+msgid "Backup creation failed: %s"
+msgstr "Tạo bản sao lưu thất bại: %s"
+
+msgid "Error reading config: %s"
+msgstr "Lỗi khi đọc cấu hình: %s"
+
+msgid "Create backup .bak"
+msgstr "Tạo bản sao lưu .bak"
diff --git a/luci-app-ports-status-mod/po/vn/Ports_Status.po b/luci-app-ports-status-mod/po/vn/Ports_Status.po
new file mode 100644
index 000000000..d51f2d15b
--- /dev/null
+++ b/luci-app-ports-status-mod/po/vn/Ports_Status.po
@@ -0,0 +1,122 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Edit Port Label"
+msgstr "Chỉnh sửa nhãn cổng"
+
+msgid "Enter new label for this port:"
+msgstr "Nhập nhãn mới cho cổng này:"
+
+msgid "Device"
+msgstr "Thiết bị"
+
+msgid "Original label"
+msgstr "Nhãn gốc"
+
+msgid "Restore Original"
+msgstr "Khôi phục gốc"
+
+msgid "Cancel"
+msgstr "Hủy"
+
+msgid "Save"
+msgstr "Lưu"
+
+msgid "Port configuration saved successfully"
+msgstr "Cấu hình cổng đã được lưu thành công"
+
+msgid "Port order saved"
+msgstr "Thứ tự cổng đã được lưu"
+
+msgid "Click to edit label"
+msgstr "Nhấp để chỉnh sửa nhãn"
+
+msgid "Hold to drag and reorder"
+msgstr "Giữ để kéo và sắp xếp lại"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "Nhãn tối đa 9 ký tự, mô tả tối đa 50 ký tự."
+
+msgid "Enter description (optional):"
+msgstr "Nhập mô tả (tùy chọn):"
+
+msgid "Optional description"
+msgstr "Mô tả tùy chọn"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "Cài đặt người dùng được lưu vào tệp /etc/user_defined_ports.json."
+
+msgid "Configuration file downloaded"
+msgstr "Đã tải xuống tệp cấu hình"
+
+msgid "Configuration file not found"
+msgstr "Không tìm thấy tệp cấu hình"
+
+msgid "Download error: %s"
+msgstr "Lỗi tải xuống: %s"
+
+msgid "Invalid configuration format"
+msgstr "Định dạng cấu hình không hợp lệ"
+
+msgid "Restore configuration"
+msgstr "Khôi phục cấu hình"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "Thao tác này sẽ ghi đè cấu hình cổng hiện tại. Tiếp tục?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "Cấu hình đã được khôi phục thành công. Đang tải lại..."
+
+msgid "File restore failed: %s"
+msgstr "Khôi phục tệp không thành công: %s"
+
+msgid "Save .json file"
+msgstr "Lưu tệp .json"
+
+msgid "Upload .json file"
+msgstr "Tải lên tệp .json"
+
+msgid "Cannot save empty configuration"
+msgstr "Không thể lưu cấu hình trống"
+
+msgid "Cannot save port configuration. "
+msgstr "Không thể lưu cấu hình cổng. "
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "Thư mục /etc có thể chỉ đọc hoặc không đủ quyền. "
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "Thử chạy: chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "Lỗi lưu"
+
+msgid "Original error: %s"
+msgstr "Lỗi gốc: %s"
+
+msgid "Restore from backup"
+msgstr "Khôi phục từ bản sao lưu"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "Khôi phục cấu hình từ tệp sao lưu? Thao tác này sẽ ghi đè các cài đặt hiện tại."
+
+msgid "Backup contains:"
+msgstr "Bản sao lưu chứa:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "Cấu hình đã được khôi phục từ bản sao lưu. Đang tải lại..."
+
+msgid "Restore failed: %s"
+msgstr "Khôi phục không thành công: %s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "Tệp sao lưu bị hỏng: %s"
+
+msgid "Error reading backup: %s"
+msgstr "Lỗi đọc bản sao lưu: %s"
+
+msgid "Restore backup .bak"
+msgstr "Khôi phục bản sao lưu .bak"
+
+msgid ""
+msgstr ""
\ No newline at end of file
diff --git a/luci-app-ports-status-mod/po/zh-cn b/luci-app-ports-status-mod/po/zh-cn
new file mode 120000
index 000000000..8d69574dd
--- /dev/null
+++ b/luci-app-ports-status-mod/po/zh-cn
@@ -0,0 +1 @@
+zh_Hans
\ No newline at end of file
diff --git a/luci-app-ports-status-mod/po/zh_Hans/Ports_Status.po b/luci-app-ports-status-mod/po/zh_Hans/Ports_Status.po
new file mode 100644
index 000000000..72fe95416
--- /dev/null
+++ b/luci-app-ports-status-mod/po/zh_Hans/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: zh_Hans\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Edit Port Label"
+msgstr "编辑端口标签"
+
+msgid "Enter new label for this port:"
+msgstr "输入此端口的新标签:"
+
+msgid "Device"
+msgstr "设备"
+
+msgid "Original label"
+msgstr "原始标签"
+
+msgid "Restore Original"
+msgstr "恢复原始"
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Port configuration saved successfully"
+msgstr "端口配置已成功保存"
+
+msgid "Port order saved"
+msgstr "端口顺序已保存"
+
+msgid "Click to edit label"
+msgstr "点击编辑标签"
+
+msgid "Hold to drag and reorder"
+msgstr "按住以拖动和重新排序"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "标签最多 9 个字符,描述最多 50 个字符。"
+
+msgid "Enter description (optional):"
+msgstr "输入描述(可选):"
+
+msgid "Optional description"
+msgstr "可选描述"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "用户设置保存在 /etc/user_defined_ports.json 文件中。"
+
+msgid "Configuration file downloaded"
+msgstr "配置文件已下载"
+
+msgid "Configuration file not found"
+msgstr "未找到配置文件"
+
+msgid "Download error: %s"
+msgstr "下载错误:%s"
+
+msgid "Invalid configuration format"
+msgstr "无效的配置格式"
+
+msgid "Restore configuration"
+msgstr "恢复配置"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "这将覆盖当前端口配置。继续?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "配置已成功恢复。正在重新加载..."
+
+msgid "File restore failed: %s"
+msgstr "文件恢复失败:%s"
+
+msgid "Save .json file"
+msgstr "保存 .json 文件"
+
+msgid "Upload .json file"
+msgstr "上传 .json 文件"
+
+msgid "Cannot save empty configuration"
+msgstr "无法保存空配置"
+
+msgid "Cannot save port configuration. "
+msgstr "无法保存端口配置。"
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "目录 /etc 可能为只读或权限不足。"
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "尝试运行:chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "保存错误"
+
+msgid "Original error: %s"
+msgstr "原始错误:%s"
+
+msgid "Restore from backup"
+msgstr "从备份恢复"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "从备份文件恢复配置?这将覆盖当前设置。"
+
+msgid "Backup contains:"
+msgstr "备份包含:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "已从备份恢复配置。正在重新加载..."
+
+msgid "Restore failed: %s"
+msgstr "恢复失败:%s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "备份文件已损坏:%s"
+
+msgid "Error reading backup: %s"
+msgstr "读取备份错误:%s"
+
+msgid "Restore backup .bak"
+msgstr "恢复备份 .bak"
+
+msgid "Change port state"
+msgstr "更改端口状态"
+
+msgid "Enable this port"
+msgstr "启用此端口"
+
+msgid "Enable port"
+msgstr "启用端口"
+
+msgid "Disable this port"
+msgstr "禁用此端口"
+
+msgid "Disable port"
+msgstr "禁用端口"
+
+msgid "Down"
+msgstr "未连接"
+
+msgid "Disabled"
+msgstr "已禁用"
+
+msgid "Idle"
+msgstr "空闲"
+
+msgid "Active"
+msgstr "活动"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "No config file to backup"
+msgstr "没有可备份的配置文件"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "配置文件已损坏,无法创建备份"
+
+msgid "Backup file created: %s"
+msgstr "备份文件已创建:%s"
+
+msgid "Backup write verification failed!"
+msgstr "备份写入验证失败!"
+
+msgid "Backup creation failed: %s"
+msgstr "备份创建失败:%s"
+
+msgid "Error reading config: %s"
+msgstr "读取配置时出错:%s"
+
+msgid "Create backup .bak"
+msgstr "创建备份 .bak"
diff --git a/luci-app-ports-status-mod/po/zh_Hant/Ports_Status.po b/luci-app-ports-status-mod/po/zh_Hant/Ports_Status.po
new file mode 100644
index 000000000..15bb8bb8f
--- /dev/null
+++ b/luci-app-ports-status-mod/po/zh_Hant/Ports_Status.po
@@ -0,0 +1,175 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: zh_Hant\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Edit Port Label"
+msgstr "編輯連接埠標籤"
+
+msgid "Enter new label for this port:"
+msgstr "輸入此連接埠的新標籤:"
+
+msgid "Device"
+msgstr "裝置"
+
+msgid "Original label"
+msgstr "原始標籤"
+
+msgid "Restore Original"
+msgstr "恢復原始"
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Save"
+msgstr "儲存"
+
+msgid "Port configuration saved successfully"
+msgstr "連接埠配置已成功儲存"
+
+msgid "Port order saved"
+msgstr "連接埠順序已儲存"
+
+msgid "Click to edit label"
+msgstr "點擊編輯標籤"
+
+msgid "Hold to drag and reorder"
+msgstr "按住以拖曳和重新排序"
+
+msgid "Label max 9 chars, description max 50 chars."
+msgstr "標籤最多 9 個字元,描述最多 50 個字元。"
+
+msgid "Enter description (optional):"
+msgstr "輸入描述(選填):"
+
+msgid "Optional description"
+msgstr "選填描述"
+
+msgid "User settings are saved to the /etc/user_defined_ports.json file."
+msgstr "使用者設定儲存在 /etc/user_defined_ports.json 檔案中。"
+
+msgid "Configuration file downloaded"
+msgstr "配置檔案已下載"
+
+msgid "Configuration file not found"
+msgstr "未找到配置檔案"
+
+msgid "Download error: %s"
+msgstr "下載錯誤:%s"
+
+msgid "Invalid configuration format"
+msgstr "無效的配置格式"
+
+msgid "Restore configuration"
+msgstr "恢復配置"
+
+msgid "This will overwrite current ports configuration. Continue?"
+msgstr "這將覆蓋目前連接埠配置。繼續?"
+
+msgid "Configuration restored successfully. Reloading..."
+msgstr "配置已成功恢復。正在重新載入..."
+
+msgid "File restore failed: %s"
+msgstr "檔案恢復失敗:%s"
+
+msgid "Save .json file"
+msgstr "儲存 .json 檔案"
+
+msgid "Upload .json file"
+msgstr "上傳 .json 檔案"
+
+msgid "Cannot save empty configuration"
+msgstr "無法儲存空白配置"
+
+msgid "Cannot save port configuration. "
+msgstr "無法儲存連接埠配置。"
+
+msgid "Directory /etc may be read-only or insufficient permissions. "
+msgstr "目錄 /etc 可能為唯讀或權限不足。"
+
+msgid "Try running: chmod 755 /etc && touch %s && chmod 644 %s"
+msgstr "嘗試執行:chmod 755 /etc && touch %s && chmod 644 %s"
+
+msgid "Save Error"
+msgstr "儲存錯誤"
+
+msgid "Original error: %s"
+msgstr "原始錯誤:%s"
+
+msgid "Restore from backup"
+msgstr "從備份恢復"
+
+msgid "Restore configuration from backup file? This will overwrite current settings."
+msgstr "從備份檔案恢復配置?這將覆蓋目前設定。"
+
+msgid "Backup contains:"
+msgstr "備份包含:"
+
+msgid "Configuration restored from backup. Reloading..."
+msgstr "已從備份恢復配置。正在重新載入..."
+
+msgid "Restore failed: %s"
+msgstr "恢復失敗:%s"
+
+msgid "Backup file is corrupted: %s"
+msgstr "備份檔案已損壞:%s"
+
+msgid "Error reading backup: %s"
+msgstr "讀取備份錯誤:%s"
+
+msgid "Restore backup .bak"
+msgstr "恢復備份 .bak"
+
+msgid "Change port state"
+msgstr "變更連接埠狀態"
+
+msgid "Enable this port"
+msgstr "啟用此連接埠"
+
+msgid "Enable port"
+msgstr "啟用連接埠"
+
+msgid "Disable this port"
+msgstr "停用此連接埠"
+
+msgid "Disable port"
+msgstr "停用連接埠"
+
+msgid "Down"
+msgstr "未連接"
+
+msgid "Disabled"
+msgstr "已停用"
+
+msgid "Idle"
+msgstr "閒置"
+
+msgid "Active"
+msgstr "活動"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "No config file to backup"
+msgstr "沒有可備份的設定檔"
+
+msgid "Config file is corrupted, cannot create backup"
+msgstr "設定檔已損毀,無法建立備份"
+
+msgid "Backup file created: %s"
+msgstr "備份檔案已建立:%s"
+
+msgid "Backup write verification failed!"
+msgstr "備份寫入驗證失敗!"
+
+msgid "Backup creation failed: %s"
+msgstr "備份建立失敗:%s"
+
+msgid "Error reading config: %s"
+msgstr "讀取設定時發生錯誤:%s"
+
+msgid "Create backup .bak"
+msgstr "建立備份 .bak"
diff --git a/luci-app-ports-status-mod/root/etc/uci-defaults/ports_status_magic.sh b/luci-app-ports-status-mod/root/etc/uci-defaults/ports_status_magic.sh
new file mode 100644
index 000000000..c806e9685
--- /dev/null
+++ b/luci-app-ports-status-mod/root/etc/uci-defaults/ports_status_magic.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright 2025-2026 Rafał Wabik (IceG) - From eko.one.pl forum
+#
+# MIT
+#
+
+PORTS_ORIG="/www/luci-static/resources/view/status/include/29_ports.js"
+PORTS_BAK="/www/luci-static/resources/view/status/include/29_ports.bak"
+PORTS_CUSTOM="/www/luci-static/resources/view/status/include/29_ports_custom.js"
+USER_DEFINED_PORTS="/etc/user_defined_ports.json"
+
+sleep 5
+
+if [ -f "$PORTS_ORIG" ]; then
+ mv "$PORTS_ORIG" "$PORTS_BAK"
+fi
+
+if [ -f "$PORTS_CUSTOM" ]; then
+ mv "$PORTS_CUSTOM" "$PORTS_ORIG"
+fi
+
+if [ -f "$USER_DEFINED_PORTS" ]; then
+ chmod 664 "$USER_DEFINED_PORTS" >/dev/null 2>&1 &
+fi
+
+chmod +x /usr/libexec/rpcd/ports-status-mod >/dev/null 2>&1 &
+
+rm -rf /tmp/luci-indexcache >/dev/null 2>&1 &
+rm -rf /tmp/luci-* >/dev/null 2>&1 &
+rm -rf /tmp/luci-modulecache/ >/dev/null 2>&1 &
+
+exit 0
diff --git a/luci-app-ports-status-mod/root/usr/libexec/rpcd/ports-status-mod b/luci-app-ports-status-mod/root/usr/libexec/rpcd/ports-status-mod
new file mode 100755
index 000000000..8dd12378d
--- /dev/null
+++ b/luci-app-ports-status-mod/root/usr/libexec/rpcd/ports-status-mod
@@ -0,0 +1,203 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+##################################################################################################################
+#
+# Copyright 2026 Rafał Wabik - IceG - From eko.one.pl forum
+#
+# MIT License
+#
+##################################################################################################################
+
+ACTIVITY_THRESHOLD=2000
+
+check_activity() {
+ local port="$1"
+ local port_path="/sys/class/net/$port"
+
+ local rx_bytes_file="$port_path/statistics/rx_bytes"
+ local tx_bytes_file="$port_path/statistics/tx_bytes"
+
+ if [ ! -f "$rx_bytes_file" ] || [ ! -f "$tx_bytes_file" ]; then
+ echo "idle"
+ return
+ fi
+
+ local rx1 tx1 rx2 tx2
+ rx1=$(cat "$rx_bytes_file" 2>/dev/null || echo "0")
+ tx1=$(cat "$tx_bytes_file" 2>/dev/null || echo "0")
+
+ sleep 0.5
+
+ rx2=$(cat "$rx_bytes_file" 2>/dev/null || echo "0")
+ tx2=$(cat "$tx_bytes_file" 2>/dev/null || echo "0")
+
+ local rx_diff=$((rx2 - rx1))
+ local tx_diff=$((tx2 - tx1))
+ local total_diff=$((rx_diff + tx_diff))
+
+ if [ "$total_diff" -gt "$ACTIVITY_THRESHOLD" ]; then
+ echo "active"
+ else
+ echo "idle"
+ fi
+}
+
+get_port_status() {
+ local port="$1"
+ local port_path="/sys/class/net/$port"
+ local operstate="unknown"
+
+ if [ ! -d "$port_path" ]; then
+ echo "unknown"
+ return
+ fi
+
+ if [ -f "$port_path/operstate" ]; then
+ operstate=$(cat "$port_path/operstate" 2>/dev/null || echo "unknown")
+ fi
+
+ local flags=""
+ if [ -f "$port_path/flags" ]; then
+ flags=$(cat "$port_path/flags" 2>/dev/null || echo "0x0")
+ fi
+
+ local carrier=0
+ if [ -f "$port_path/carrier" ]; then
+ carrier=$(cat "$port_path/carrier" 2>/dev/null || echo "0")
+ fi
+
+ if [ "$operstate" = "down" ]; then
+ local flags_decimal=$(printf "%d" "$flags" 2>/dev/null || echo "0")
+ local is_up=$((flags_decimal & 1))
+
+ if [ "$is_up" = "0" ]; then
+ echo "disabled"
+ return
+ fi
+ fi
+
+ if [ "$carrier" != "1" ]; then
+ echo "down"
+ return
+ fi
+
+ if [ "$operstate" = "unknown" ] && [ "$carrier" = "1" ]; then
+ operstate="up"
+ fi
+
+ if [ "$carrier" = "1" ]; then
+ local activity=$(check_activity "$port")
+ echo "$activity"
+ return
+ fi
+
+ echo "$operstate"
+}
+
+get_all_ports_status() {
+ local tmpdir
+ tmpdir=$(mktemp -d)
+ local pids=""
+
+ for port_path in /sys/class/net/*; do
+ if [ -d "$port_path" ]; then
+ port_name=$(basename "$port_path")
+ case "$port_name" in
+ lo|dummy*|tunl*|gre*|gretap*|sit*|ip6tnl*|ip6gre*|br-*)
+ continue
+ ;;
+ eth*|lan*|wan*|en*|sfp*)
+ if [ -f "$port_path/address" ]; then
+ (
+ status=$(get_port_status "$port_name")
+ echo "${port_name}=${status}" > "$tmpdir/$port_name"
+ ) &
+ pids="$pids $!"
+ fi
+ ;;
+ esac
+ fi
+ done
+
+ for pid in $pids; do
+ wait "$pid" 2>/dev/null
+ done
+
+ json_init
+ for result_file in "$tmpdir"/*; do
+ [ -f "$result_file" ] || continue
+ line=$(cat "$result_file")
+ port_name="${line%%=*}"
+ status="${line#*=}"
+ json_add_string "$port_name" "$status"
+ done
+ rm -rf "$tmpdir"
+
+ json_dump
+}
+
+set_port_status() {
+ local port="$1"
+ local status="$2"
+
+ if [ ! -d "/sys/class/net/$port" ]; then
+ json_init
+ json_add_boolean "success" 0
+ json_add_string "error" "Port not found"
+ json_dump
+ return 1
+ fi
+
+ if [ "$status" = "up" ]; then
+ ip link set "$port" up 2>/dev/null
+ elif [ "$status" = "down" ]; then
+ ip link set "$port" down 2>/dev/null
+ else
+ json_init
+ json_add_boolean "success" 0
+ json_add_string "error" "Invalid status"
+ json_dump
+ return 1
+ fi
+
+ if [ $? -eq 0 ]; then
+ json_init
+ json_add_boolean "success" 1
+ json_dump
+ return 0
+ else
+ json_init
+ json_add_boolean "success" 0
+ json_add_string "error" "Failed to change port status"
+ json_dump
+ return 1
+ fi
+}
+
+case "$1" in
+ list)
+ json_init
+ json_add_object "getPortsStatus"
+ json_close_object
+ json_add_object "setPortStatus"
+ json_add_string "port" "port"
+ json_add_string "status" "status"
+ json_close_object
+ json_dump
+ ;;
+ call)
+ case "$2" in
+ getPortsStatus)
+ get_all_ports_status
+ ;;
+ setPortStatus)
+ read input
+ port=$(echo "$input" | jsonfilter -e '@.port')
+ status=$(echo "$input" | jsonfilter -e '@.status')
+ set_port_status "$port" "$status"
+ ;;
+ esac
+ ;;
+esac
diff --git a/luci-app-ports-status-mod/root/usr/share/rpcd/acl.d/luci-app-ports-status-mod.json b/luci-app-ports-status-mod/root/usr/share/rpcd/acl.d/luci-app-ports-status-mod.json
new file mode 100644
index 000000000..ea1d8883e
--- /dev/null
+++ b/luci-app-ports-status-mod/root/usr/share/rpcd/acl.d/luci-app-ports-status-mod.json
@@ -0,0 +1,34 @@
+{
+ "luci-ports": {
+ "description": "Access to custom Ports Status",
+ "read": {
+ "uci": [ "*" ],
+ "ubus": {
+ "luci": [ "getBuiltinEthernetPorts" ],
+ "ports-status-mod": [ "getPortsStatus" ],
+ "file": [ "read" ]
+ },
+ "file": {
+ "/etc/user_defined_ports.json": [ "read" ],
+ "/etc/user_defined_ports.json.bak": [ "read" ],
+ "/www/luci-static/resources/view/status/include/29_ports.js": [ "read" ]
+ }
+ },
+ "write": {
+ "file": {
+ "/etc/user_defined_ports.json": [ "write" ],
+ "/etc/user_defined_ports.json.bak": [ "write" ]
+ },
+ "ubus": {
+ "file": [ "write", "exec" ],
+ "luci": [ "getBuiltinEthernetPorts" ],
+ "ports-status-mod": [ "setPortStatus" ]
+ },
+ "exec": {
+ "/usr/bin/stat": [ "*" ],
+ "/bin/chmod": [ "*" ],
+ "/bin/sh": [ "*" ]
+ }
+ }
+ }
+}
diff --git a/luci-app-sms-tool-js/Makefile b/luci-app-sms-tool-js/Makefile
index 8491eaed1..e13a56a67 100644
--- a/luci-app-sms-tool-js/Makefile
+++ b/luci-app-sms-tool-js/Makefile
@@ -1,25 +1,27 @@
#
-# Copyright 2022-2024 Rafał Wabik - IceG - From eko.one.pl forum
+# Copyright 2022-2026 Rafał Wabik - IceG - From eko.one.pl forum
#
# Licensed to the GNU General Public License v3.0.
#
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=LuCI JS Support for sms-tool
-LUCI_DESCRIPTION:=LuCI JS interface for the sms-tool. The user interface supports SMS / USSD Codes / AT Commands.
-LUCI_DEPENDS:=+sms-tool +kmod-usb-serial +kmod-usb-serial-option +comgt
-
PKG_NAME:=luci-app-sms-tool-js
-PKG_VERSION:=2.0.29
-PKG_RELEASE:=2
+LUCI_TITLE:=LuCI JS Support for sms-tool
PKG_MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
+LUCI_DESCRIPTION:=LuCI JS interface for the sms-tool. The user interface supports SMS / USSD Codes / AT Commands.
+LUCI_PKGARCH:=all
+LUCI_DEPENDS:=+sms-tool +kmod-usb-serial +kmod-usb-serial-option +comgt
+PKG_VERSION:=2.0.43
+PKG_RELEASE:=3
define Package/luci-app-sms-tool-js/conffiles
/etc/config/sms_tool_js
/etc/modem/atcmmds.user
+/etc/modem/atcmmds/*.user
/etc/modem/phonebook.user
/etc/modem/ussdcodes.user
+/etc/modem/ussdcodes/*.user
endef
include $(TOPDIR)/feeds/luci/luci.mk
diff --git a/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/newdelsms.png b/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/newdelsms.png
deleted file mode 100644
index b036e813f..000000000
Binary files a/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/newdelsms.png and /dev/null differ
diff --git a/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/redrawsms.svg b/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/redrawsms.svg
new file mode 100644
index 000000000..15d6df5cd
--- /dev/null
+++ b/luci-app-sms-tool-js/htdocs/luci-static/resources/icons/redrawsms.svg
@@ -0,0 +1,52 @@
+
+
+
diff --git a/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/calllog.js b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/calllog.js
new file mode 100644
index 000000000..5e8ca12ed
--- /dev/null
+++ b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/calllog.js
@@ -0,0 +1,212 @@
+'use strict';
+'require fs';
+'require ui';
+'require uci';
+'require view';
+
+/*
+ Copyright 2022-2026 Rafał Wabik - IceG - From eko.one.pl forum
+
+ Licensed to the GNU General Public License v3.0.
+*/
+
+document.head.append(E('style', {'type': 'text/css'},
+`
+#callLogTable {
+ width: 100%;
+ border: 1px solid var(--border-color-medium) !important;
+}
+
+#callLogTable th,
+#callLogTable td {
+ padding: 10px;
+ text-align: justify !important;
+ vertical-align: top !important;
+}
+
+#callLogTable tr:nth-child(odd) td {
+ background: var(--background-color-medium) !important;
+ border-bottom: 1px solid var(--border-color-medium) !important;
+ border-top: 1px solid var(--border-color-medium) !important;
+}
+
+#callLogTable tr:nth-child(even) td {
+ border-bottom: 1px solid var(--border-color-medium) !important;
+ border-top: 1px solid var(--border-color-medium) !important;
+}
+
+#callLogTable .date {
+ width: 25% !important;
+}
+
+#callLogTable .call-type {
+ width: 15% !important;
+}
+
+#callLogTable .number {
+ width: 25% !important;
+}
+
+#callLogTable .duration {
+ width: 15% !important;
+}
+
+#callLogTable .name {
+ width: 20% !important;
+}
+`));
+
+return view.extend({
+ load: function() {
+ return Promise.all([
+ uci.load('sms_tool_js'),
+ L.resolveDefault(fs.read('/tmp/sms_tool_call_log.json'), '{"calls":[]}')
+ ]);
+ },
+
+ handleRefresh: function() {
+ location.reload();
+ },
+
+ handleClear: function() {
+ if (confirm(_('Clear all call log entries?'))) {
+ return Promise.all([
+ fs.write('/tmp/sms_tool_call_log.json', '{"calls":[]}'),
+ fs.write('/tmp/sms_tool_call_log.lines', '')
+ ]).then(function() {
+ this.handleRefresh();
+ }.bind(this));
+ }
+ },
+
+ setTableMessage: function(message, spinning) {
+ let table = document.getElementById('callLogTable');
+ if (!table)
+ return;
+
+ while (table.rows.length > 1)
+ table.deleteRow(1);
+
+ let row = table.insertRow(-1);
+ let cell = row.insertCell(0);
+ cell.colSpan = 5;
+ cell.style.textAlign = 'center';
+ cell.appendChild(E('span', spinning ? { 'class': 'spinning' } : {}, message));
+ },
+
+ updateCallLogTable: function(calls) {
+ let table = document.getElementById('callLogTable');
+ if (!table)
+ return;
+
+ while (table.rows.length > 1)
+ table.deleteRow(1);
+
+ if (!calls || !calls.length) {
+ this.setTableMessage(_('No call log entries found'), false);
+ return;
+ }
+
+ // Filter by type if needed, but for now show all
+ let select = document.getElementById('call-log-type');
+ let filter = select ? select.value : 'all';
+
+ for (let i = 0; i < calls.length; i++) {
+ if (filter !== 'all' && calls[i].type.toLowerCase() !== filter)
+ continue;
+
+ let row = table.insertRow(-1);
+ row.insertCell(0).textContent = calls[i].date;
+ row.insertCell(1).textContent = _(calls[i].type);
+ row.insertCell(2).textContent = calls[i].number;
+ row.insertCell(3).textContent = calls[i].duration;
+ row.insertCell(4).textContent = '-'; // Name lookup could be added later
+ }
+
+ if (table.rows.length === 1) {
+ this.setTableMessage(_('No matching call log entries found'), false);
+ }
+ },
+
+ render: function(data) {
+ let callLogData;
+
+ try {
+ callLogData = JSON.parse(data[1] || '{"calls":[]}');
+ }
+ catch (e) {
+ callLogData = { calls: [] };
+ }
+
+ let calls = callLogData.calls || [];
+
+ let calllog_enabled = uci.get('sms_tool_js', '@sms_tool_js[0]', 'calllog_enabled') === '1';
+
+ setTimeout(function() {
+ this.updateCallLogTable(calls);
+ }.bind(this), 100);
+
+ return E([], [
+ E('h2', _('Call Log')),
+ E('div', { 'class': 'cbi-map-descr' }, _('User interface for viewing call logs. The log is collected by a background daemon.')),
+
+ (function() {
+ if (!calllog_enabled) {
+ return E('div', { 'class': 'alert-message warning' }, [
+ E('p', {}, _('Call log daemon is disabled. Please enable it in the configuration to start collecting logs.'))
+ ]);
+ }
+ return E('div', { 'style': 'display: none;' });
+ })(),
+
+ E('h3', _('Calls')),
+ E('table', { 'class': 'table' }, [
+ E('tr', { 'class': 'tr' }, [
+ E('td', { 'class': 'td left', 'width': '33%' }, [ _('Filter call type') ]),
+ E('td', { 'class': 'td' }, [
+ E('select', {
+ 'class': 'cbi-input-select',
+ 'id': 'call-log-type',
+ 'change': function() {
+ this.updateCallLogTable(calls);
+ }.bind(this)
+ }, [
+ E('option', { 'value': 'all' }, _('All calls')),
+ E('option', { 'value': 'missed' }, _('Missed calls')),
+ E('option', { 'value': 'received' }, _('Received calls')),
+ E('option', { 'value': 'dialed' }, _('Dialed calls'))
+ ])
+ ])
+ ])
+ ]),
+
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': ui.createHandlerFn(this, 'handleRefresh')
+ }, [ _('Refresh') ]),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-remove',
+ 'click': ui.createHandlerFn(this, 'handleClear')
+ }, [ _('Clear Log') ])
+ ]),
+
+ E('p'),
+
+ E('table', { 'class': 'table', 'id': 'callLogTable' }, [
+ E('tr', { 'class': 'tr table-titles' }, [
+ E('th', { 'class': 'th date' }, _('Date')),
+ E('th', { 'class': 'th call-type' }, _('Type')),
+ E('th', { 'class': 'th number' }, _('Number')),
+ E('th', { 'class': 'th duration' }, _('Duration')),
+ E('th', { 'class': 'th name' }, _('Name'))
+ ])
+ ])
+ ]);
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null
+});
diff --git a/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/readsms.js b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/readsms.js
index 9b4c64bc3..7f5c34b4b 100644
--- a/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/readsms.js
+++ b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/modem/readsms.js
@@ -5,13 +5,20 @@
'require ui';
'require uci';
'require view';
+'require rpc';
/*
- Copyright 2022-2025 Rafał Wabik - IceG - From eko.one.pl forum
-
+ Copyright 2022-2026 Rafał Wabik - IceG - From eko.one.pl forum
+
Licensed to the GNU General Public License v3.0.
*/
+var callForwardSMS = rpc.declare({
+ object: 'sms_forward',
+ method: 'forward',
+ params: ['subject', 'message']
+});
+
document.head.append(E('style', {'type': 'text/css'},
`
#smsTable {
@@ -57,6 +64,15 @@ td input[type="checkbox"] {
#smsTable .message {
width: 88% !important;
}
+
+.sms-row-icon {
+ position: relative;
+ display: inline-block;
+}
+
+:root[data-darkmode="true"] .sms-row-icon {
+ opacity: 0.5;
+}
`));
function msg_bar(v, m) {
@@ -69,6 +85,114 @@ pg.firstElementChild.style.width = pc + '%';
pg.setAttribute('title', '%s'.format(v) + ' / ' + '%s'.format(m) + ' ('+ pc + '%)');
}
+function popTimeout(a, message, timeout, severity) {
+ ui.addTimeLimitedNotification(a, message, timeout, severity);
+}
+
+
+function format_with_modem_index(value) {
+ return uci.load('defmodems').then(function() {
+ var defmodemSections = uci.sections('defmodems', 'defmodems');
+
+ if (!defmodemSections || defmodemSections.length === 0) {
+ // old format
+ return value;
+ }
+
+ var serialModems = defmodemSections.filter(function(s) {
+ return s.modemdata === 'serial';
+ });
+
+ if (serialModems.length === 0) {
+ // old format
+ return value;
+ }
+
+ var currentPort = uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport');
+
+ var modemIndex = -1;
+ for (var i = 0; i < serialModems.length; i++) {
+ if (serialModems[i].comm_port === currentPort) {
+ modemIndex = i + 1;
+ break;
+ }
+ }
+
+ if (modemIndex === -1) {
+ // old format
+ return value;
+ }
+
+ return 'dfm' + modemIndex + '_' + value;
+
+ }).catch(function() {
+ // old format
+ return value;
+ });
+}
+
+function update_sms_count_for_modem(newValue) {
+ return uci.load('defmodems').then(function() {
+ var defmodemSections = uci.sections('defmodems', 'defmodems');
+
+ if (!defmodemSections || defmodemSections.length === 0) {
+ // old format
+ return newValue;
+ }
+
+ var serialModems = defmodemSections.filter(function(s) {
+ return s.modemdata === 'serial';
+ });
+
+ if (serialModems.length === 0) {
+ // old format
+ return newValue;
+ }
+
+ var currentPort = uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport');
+ var currentModemIndex = -1;
+
+ for (var i = 0; i < serialModems.length; i++) {
+ if (serialModems[i].comm_port === currentPort) {
+ currentModemIndex = i + 1;
+ break;
+ }
+ }
+
+ if (currentModemIndex === -1) {
+ // old format
+ return newValue;
+ }
+
+ var existingSmsCount = uci.get('sms_tool_js', '@sms_tool_js[0]', 'sms_count') || '';
+ var parts = existingSmsCount.split(' ').filter(function(p) { return p.trim() !== ''; });
+
+ var updated = {};
+ parts.forEach(function(part) {
+ var match = part.match(/^dfm(\d+)_(\d+)$/);
+ if (match) {
+ var modemIdx = parseInt(match[1]);
+ if (modemIdx > 0 && modemIdx <= serialModems.length) {
+ updated[modemIdx] = match[2];
+ }
+ }
+ });
+
+ updated[currentModemIndex] = newValue;
+
+ var result = [];
+ for (var i = 1; i <= serialModems.length; i++) {
+ var count = updated[i] || '0';
+ result.push('dfm' + i + '_' + count);
+ }
+
+ return result.join(' ');
+
+ }).catch(function() {
+ // old format
+ return newValue;
+ });
+}
function save_count() {
uci.load('sms_tool_js').then(function() {
@@ -83,9 +207,12 @@ function save_count() {
var t = total.replace ( /[^\d.]/g, '' );
var used = res.substring(17, res.indexOf("total"));
var u = used.replace ( /[^\d.]/g, '' );
- uci.set('sms_tool_js', '@sms_tool_js[0]', 'sms_count', L.toArray(u).join(' '));
- uci.save();
- uci.apply();
+
+ update_sms_count_for_modem(u).then(function(updatedValue) {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'sms_count', updatedValue);
+ uci.save();
+ uci.apply();
+ });
}
});
});
@@ -93,7 +220,44 @@ function save_count() {
return view.extend({
load: function() {
- uci.load('sms_tool_js');
+ return Promise.all([
+ uci.load('sms_tool_js'),
+ L.resolveDefault(uci.load('defmodems'))
+ ]);
+ },
+
+ handleModemChange: function(ev) {
+ var sections = uci.sections('defmodems', 'defmodems');
+ if (!sections || sections.length === 0) return;
+
+ var serialModems = sections.filter(function(s) {
+ return s.modemdata === 'serial';
+ });
+
+ if (serialModems.length === 0) return;
+
+ var currentPort = uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport');
+ var currentIndex = serialModems.findIndex(function(s) {
+ return s.comm_port === currentPort;
+ });
+
+ if (currentIndex === -1) currentIndex = 0;
+
+ var direction = ev.currentTarget.classList.contains('next') ? 1 : -1;
+ var newIndex = (currentIndex + direction + serialModems.length) % serialModems.length;
+ var newModem = serialModems[newIndex];
+
+ if (newModem && newModem.comm_port) {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'readport', newModem.comm_port);
+ uci.save();
+ uci.apply().then(function() {
+ var modemText = document.querySelector('.modem-display-text');
+ if (modemText) {
+ var label = newModem.modem + (newModem.user_desc ? ' (' + newModem.user_desc + ')' : '');
+ modemText.textContent = label;
+ }
+ });
+ }
},
handleSWarea: function(ev) {
@@ -111,9 +275,142 @@ return view.extend({
}
},
+ handleForward: function(ev) {
+ var checked = document.querySelectorAll('input[name="smsn"]:checked');
+
+ if (checked.length === 0) {
+ ui.addNotification(null, E('p', _('Please select the message(s) to be forwarded')), 'info');
+ return;
+ }
+
+ var self = this;
+
+ uci.load('sms_tool_js').then(function() {
+ var fwdEnabled = uci.get('sms_tool_js', '@sms_tool_js[0]', 'forward_sms_enabled');
+
+ if (fwdEnabled !== '1') {
+ ui.addNotification(null, E('p', _('SMS forwarding function is not enabled')), 'info');
+ return;
+ }
+
+ var emailSubject = '';
+ var emailBody = '';
+
+ if (checked.length === 1) {
+ var row = checked[0].closest('tr');
+ var cells = row.cells;
+
+ var sender = cells[1].textContent.trim();
+ var timestamp = cells[2].textContent.trim();
+ var message = cells[3].textContent.trim();
+
+ emailSubject = 'SMS ' + timestamp + ' - ' + sender;
+ emailBody = message;
+
+ self.showEmailModal(emailSubject, emailBody);
+ }
+ else {
+ uci.load('system').then(function() {
+ var hostname = uci.get('system', '@system[0]', 'hostname') || _('My Router');
+
+ var messages = [];
+ checked.forEach(function(checkbox) {
+ var row = checkbox.closest('tr');
+ var cells = row.cells;
+
+ var timestamp = cells[2].textContent.trim();
+ var sender = cells[1].textContent.trim();
+ var message = cells[3].textContent.trim();
+
+ messages.push(timestamp + ' - ' + sender + '\n' + message);
+ });
+
+ var emailBody = messages.join('\n\n');
+
+ self.showEmailModal(hostname, emailBody);
+ });
+ }
+ });
+ },
+
+ showEmailModal: function(defaultSubject, defaultBody) {
+ var self = this;
+
+ ui.showModal(_('Forward SMS to E-mail'), [
+ E('p', _('Subject:')),
+ E('input', {
+ 'type': 'text',
+ 'id': 'email-subject',
+ 'class': 'cbi-input-text',
+ 'style': 'width: 100% !important; margin-bottom: 15px;',
+ 'value': defaultSubject
+ }),
+ E('p', _('Message text:')),
+ E('textarea', {
+ 'id': 'email-body',
+ 'class': 'cbi-input-textarea',
+ 'style': 'width: 100% !important; height: 30vh; min-height: 250px;',
+ 'wrap': 'off',
+ 'spellcheck': 'false'
+ }, defaultBody),
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'btn',
+ 'click': ui.hideModal
+ }, _('Cancel')), ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-action important',
+ 'click': ui.createHandlerFn(this, 'sendEmailFromModal')
+ }, _('Send'))
+ ])
+ ], 'cbi-modal');
+ },
+
+ sendEmailFromModal: function() {
+ var subject = document.getElementById('email-subject').value;
+ var body = document.getElementById('email-body').value;
+
+ if (!subject || !body) {
+ ui.addNotification(null, E('p', _('Subject and body cannot be empty')), 'error');
+ return;
+ }
+
+ var self = this;
+
+ ui.hideModal();
+
+ var contentArea = document.getElementById('forward-status');
+ contentArea.style.display = 'block';
+ contentArea.innerHTML = '';
+ contentArea.appendChild(E('div', {'class': 'alert alert-info'},
+ E('span', {'class': 'spinning'}, _('Sending e-mail...'))
+ ));
+
+ callForwardSMS(subject, body).then(function(response) {
+ contentArea.innerHTML = '';
+ if (response.success) {
+ popTimeout(null, E('p', _('Message forwarded successfully')), 5000, 'info');
+ setTimeout(function() {
+ if (contentArea) {
+ contentArea.innerHTML = '';
+ contentArea.style.display = 'none';
+ }
+ }, 5000);
+ } else {
+ contentArea.innerHTML = '';
+ contentArea.style.display = 'none';
+ ui.addNotification(null, E('p', _('Failed to forward message: %s').format(response.error || 'Unknown error')), 'error');
+ }
+ }).catch(function(err) {
+ contentArea.innerHTML = '';
+ contentArea.style.display = 'none';
+ ui.addNotification(null, E('p', _('Error: %s').format(err.message)), 'error');
+ });
+ },
+
handleDelete: function(ev) {
if (document.querySelectorAll('input[name="smsn"]:checked').length == 0){
- ui.addNotification(null, E('p', _('Please select the message(s) to be deleted')), 'info');
+ ui.addNotification(null, E('p', _('Please select the message(s) to be deleted')), 'info');
}
else {
if (document.querySelectorAll('input[name="smsn"]:checked').length === document.querySelectorAll('input[name="smsn"]').length) {
@@ -194,14 +491,14 @@ return view.extend({
inumber = false;
}
}
-
+
var deletelabel = document.getElementById("deleteinfo");
deletelabel.style.display = 'block';
for (var i=0; i < smsnr.length + 2; i++)
{
(function(i) {
- setTimeout(function() {
+ setTimeout(function() {
smsnr[i] = parseInt(smsnr[i], 10);
if (!Number.isNaN(smsnr[i]))
@@ -216,10 +513,11 @@ return view.extend({
var used = res.substring(17, res.indexOf("total"));
var u = used.replace ( /[^\d.]/g, '' );
msg_bar(Math.floor(u), t);
- deletelabel.innerHTML = _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages');
+ deletelabel.innerHTML = '';
+ deletelabel.appendChild(E('span', {'class': 'spinning', 'style': 'font-size: inherit;'}, _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages')));
}
});
-
+
}
L.resolveDefault(fs.exec_direct('/usr/bin/sms_tool', [ '-s' , storeL , '-d' , portR , 'status' ]))
.then(function(res) {
@@ -229,14 +527,34 @@ return view.extend({
var used = res.substring(17, res.indexOf("total"));
var u = used.replace ( /[^\d.]/g, '' );
msg_bar(Math.floor(u), t);
- deletelabel.innerHTML = _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages');
+ deletelabel.innerHTML = '';
+ deletelabel.appendChild(E('span', {'class': 'spinning', 'style': 'font-size: inherit;'}, _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages')));
}
});
if (smsdelcount == smsdeleted) {
setTimeout(function() {
var hidecount = document.getElementById('deleteinfo');
- hidecount.style.display = 'none';
+ uci.load('sms_tool_js').then(function() {
+ var savedCount = uci.get('sms_tool_js', '@sms_tool_js[0]', 'sms_count') || '';
+ L.resolveDefault(fs.exec_direct('/usr/bin/sms_tool', [ '-s' , storeL , '-d' , portR , 'status' ]))
+ .then(function(verifyRes) {
+ if (verifyRes) {
+ var verifyUsed = verifyRes.substring(17, verifyRes.indexOf("total"));
+ var verifyU = verifyUsed.replace( /[^\d.]/g, '' );
+ var savedMatch = savedCount.match(/(?:dfm\d+_)?(\d+)(?:\s|$)/);
+ var savedNum = savedMatch ? savedMatch[1] : savedCount.replace(/[^\d]/g, '');
+ if (savedNum !== verifyU) {
+ update_sms_count_for_modem(verifyU).then(function(correctedValue) {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'sms_count', correctedValue);
+ uci.save();
+ uci.apply();
+ });
+ }
+ }
+ hidecount.style.display = 'none';
+ });
+ });
save_count();
}, 7000);
}
@@ -250,7 +568,8 @@ return view.extend({
var used = res.substring(17, res.indexOf("total"));
var u = used.replace ( /[^\d.]/g, '' );
msg_bar(Math.floor(u), t);
- deletelabel.innerHTML = _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages');
+ deletelabel.innerHTML = '';
+ deletelabel.appendChild(E('span', {'class': 'spinning', 'style': 'font-size: inherit;'}, _('Please wait... deleted')+' '+smsdeleted+' '+_('of')+' '+smsdelcount+' '+_('selected messages')));
}
});
}
@@ -271,23 +590,21 @@ return view.extend({
}
}
},
-
-
+
handleRefresh: function(ev) {
window.location.reload();
},
-
handleSelect: function(ev) {
var checkBox = document.getElementById("ch-all");
- var checkBoxes = document.querySelectorAll('input[type="checkbox"]');
+ var checkBoxes = document.querySelectorAll('input[name="smsn"]');
if (checkBox.checked == true){
for (var i = 0; i < checkBoxes.length; i++)
- checkBoxes[i].setAttribute('checked', 'true');
+ checkBoxes[i].checked = true;
} else {
for (var i = 0; i < checkBoxes.length; i++)
- checkBoxes[i].removeAttribute('checked');
+ checkBoxes[i].checked = false;
}
},
@@ -313,7 +630,7 @@ return view.extend({
1. All ports for communication with the modem.
2. Additional options specific to the given modem (for handling USSD codes).
Important \
Messages are sent without verification and confirmation delivery of the message. \
@@ -185,22 +1260,276 @@ return view.extend({
o.rmempty = false;
//o.default = true;
- o = s.taboption('smstab', form.TextValue, '_tmp2', _('User contacts'),
- _("Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."));
- o.rows = 7;
- o.cfgvalue = function(section_id) {
- return fs.trimmed('/etc/modem/phonebook.user');
+ o = s.taboption('smstab', form.Button, '_phonebook_edit');
+ o.title = _('User contacts');
+ o.description = _("Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user.");
+ o.inputtitle = _('Manage contacts');
+ o.onclick = function() {
+ return fs.trimmed('/etc/modem/phonebook.user').then(function(content) {
+ let dialog = new phonebookEditorDialog(_('Edit User Contacts'), content || '');
+ dialog.show();
+ }).catch(function(e) {
+ let dialog = new phonebookEditorDialog(_('Edit User Contacts'), '');
+ dialog.show();
+ });
};
- o.write = function(section_id, formvalue) {
- return fs.write('/etc/modem/phonebook.user', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
+
+ //TAB FORWARD SMS by E-MAIL
+
+ s.tab('email', _('SMS Forwarding to E-mail Settings'));
+ s.anonymous = true;
+
+ var emailProviders = {
+ 'custom': {
+ name: _('user define'),
+ smtp: '',
+ port: '',
+ security: 'tls'
+ },
+ 'gmail': {
+ name: 'Gmail',
+ smtp: 'smtp.gmail.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'outlook': {
+ name: 'Outlook.com / Hotmail',
+ smtp: 'smtp-mail.outlook.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'yahoo': {
+ name: 'Yahoo Mail',
+ smtp: 'smtp.mail.yahoo.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'icloud': {
+ name: 'iCloud Mail',
+ smtp: 'smtp.mail.me.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'aol': {
+ name: 'AOL Mail',
+ smtp: 'smtp.aol.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'zoho': {
+ name: 'Zoho Mail',
+ smtp: 'smtp.zoho.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'mailru': {
+ name: 'Mail.ru',
+ smtp: 'smtp.mail.ru',
+ port: '465',
+ security: 'ssl'
+ },
+ 'yandex': {
+ name: 'Yandex.Mail',
+ smtp: 'smtp.yandex.com',
+ port: '465',
+ security: 'ssl'
+ },
+ 'gmx': {
+ name: 'GMX Mail',
+ smtp: 'smtp.gmx.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'mailcom': {
+ name: 'Mail.com',
+ smtp: 'smtp.mail.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'fastmail': {
+ name: 'FastMail',
+ smtp: 'smtp.fastmail.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'sina': {
+ name: 'Sina Mail',
+ smtp: 'smtp.sina.com',
+ port: '587',
+ security: 'tls'
+ },
+ 'mailboxorg': {
+ name: 'Mailbox.org',
+ smtp: 'smtp.mailbox.org',
+ port: '587',
+ security: 'tls'
+ },
+ 'o2pl': {
+ name: 'o2.pl',
+ smtp: 'poczta.o2.pl',
+ port: '465',
+ security: 'ssl'
+ },
+ 'wppl': {
+ name: 'wp.pl',
+ smtp: 'smtp.wp.pl',
+ port: '465',
+ security: 'ssl'
+ },
+ 'interia': {
+ name: 'interia.pl',
+ smtp: 'poczta.interia.pl',
+ port: '465',
+ security: 'ssl'
+ }
+ };
+
+ o = s.taboption('email', form.Flag, 'forward_sms_enabled',
+ _('Enable message forwarding'));
+ o.rmempty = false;
+ o.modalonly = true;
+
+ o.write = function(section_id, value) {
+ if (value === '1') {
+ return pkg._isPackageInstalled('mailsend').then(function(isInstalled) {
+ if (!isInstalled) {
+ ui.addNotification(null, E('p', {}, _('Package mailsend is not installed. Please install it first using the Install... button below')), 'info');
+ return form.Flag.prototype.write.apply(this, [section_id, '0']);
+ } else {
+ return form.Flag.prototype.write.apply(this, [section_id, value]);
+ }
+ }.bind(this));
+ }
+ return form.Flag.prototype.write.apply(this, [section_id, value]);
+ };
+
+ o = s.taboption('email', form.ListValue, 'emailprovider', _('E-mail settings'),
+ _('Select a predefined e-mail settings or enter settings manually.'));
+
+ for (var key in emailProviders) {
+ o.value(key, emailProviders[key].name);
+ }
+ o.default = 'custom';
+ o.modalonly = true;
+
+ o.onchange = function(ev, section_id, value) {
+ var provider = emailProviders[value] || emailProviders['custom'];
+ var map = this.map;
+
+ // SMTP server
+ var smtpField = map.lookupOption('forward_sms_mail_smtp', section_id);
+ if (smtpField && smtpField[0]) {
+ smtpField[0].getUIElement(section_id).setValue(provider.smtp);
+ }
+
+ // Update port
+ var portField = map.lookupOption('forward_sms_mail_smtp_port', section_id);
+ if (portField && portField[0]) {
+ portField[0].getUIElement(section_id).setValue(provider.port);
+ }
+
+ // Update security
+ var securityField = map.lookupOption('forward_sms_mail_security', section_id);
+ if (securityField && securityField[0]) {
+ securityField[0].getUIElement(section_id).setValue(provider.security);
+ }
};
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_recipient', _('Recipient'));
+ o.description = _('E-mail address of the recipient.');
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_sender', _('Sender'));
+ o.description = _('E-mail address of the sender.');
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_user', _('User'));
+ o.description = _('Username for SMTP authentication.');
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_password', _('Password'));
+ o.description = _('Google app password / Password for SMTP authentication.');
+ o.password = true;
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_smtp', _('SMTP server'));
+ o.description = _('Hostname/IP address of the SMTP server.');
+ o.datatype = 'host';
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Value,
+ 'forward_sms_mail_smtp_port', _('SMTP server port'));
+ o.datatype = 'port';
+ o.modalonly = true;
+
+ o = s.taboption('email', form.ListValue,
+ 'forward_sms_mail_security', _('Security'));
+ o.description = '%s %s'.format(
+ _('TLS: use STARTTLS if the server supports it.'),
+ _('SSL: SMTP over SSL.'),
+ );
+ o.value('tls', 'TLS');
+ o.value('ssl', 'SSL');
+ o.default = 'tls';
+ o.modalonly = true;
+
+ o = s.taboption('email', form.Flag, 'forward_sms_mail_ehlo', _('Force EHLO'));
+ o.description = _('Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. \
+ Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don\'t properly advertise ESMTP support, which breaks STARTTLS/authentication.');
+ o.rmempty = false;
+ o.default = '0';
+ o.modalonly = true;
+
+ o = s.taboption('email', form.DummyValue, '_dummy_mailsend');
+ o.rawhtml = true;
+ o.render = function() {
+ return E('div', {}, [
+ E('h3', {}, _('Required Package')),
+ E('div', { 'class': 'cbi-map-descr' }, _('The SMS forwarding option requires the mailsend package to be installed.'))
+ ]);
+ };
+
+ o = s.taboption('email', form.DummyValue, '_mailsend_status', _('mailsend package'));
+ o.rawhtml = true;
+ o.cfgvalue = function(section_id) {
+ return '';
+ };
+ o.render = function(option_index, section_id, in_table) {
+ return pkg._isPackageInstalled('mailsend').then(function(isInstalled) {
+ var content;
+
+ if (isInstalled) {
+ content = E('span', {
+ 'class': 'cbi-value-field',
+ 'style': 'font-style: italic;'
+ }, _('Installed'));
+ } else {
+ content = E('button', {
+ 'class': 'cbi-button cbi-button-action',
+ 'click': function() {
+ pkg.openInstallerSearch('mailsend');
+ }
+ }, _('Install…'));
+ }
+
+ return E('div', { 'class': 'cbi-value' }, [
+ E('label', { 'class': 'cbi-value-title' }, _('mailsend')),
+ E('div', { 'class': 'cbi-value-field' }, content)
+ ]);
+ });
+ };
//TAB USSD
s.tab('ussd', _('USSD Codes Settings'));
s.anonymous = true;
- o = s.taboption('ussd', form.Value, 'ussdport', _('USSD sending port'),
+ o = s.taboption('ussd', form.Value, 'ussdport', _('USSD sending port'),
_('Select one of the available ttyUSBX ports.'));
devs.sort((a, b) => a.name > b.name);
devs.forEach(dev => o.value('/dev/' + dev.name));
@@ -224,14 +1553,13 @@ return view.extend({
o.value('2', _('UCS2'));
o.default = 'auto';
- o = s.taboption('ussd', form.TextValue, '_tmp4', _('User USSD codes'),
- _("Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."));
- o.rows = 7;
- o.cfgvalue = function(section_id) {
- return fs.trimmed('/etc/modem/ussdcodes.user');
- };
- o.write = function(section_id, formvalue) {
- return fs.write('/etc/modem/ussdcodes.user', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
+ o = s.taboption('ussd', form.Button, '_ussd_manage');
+ o.title = _('User USSD codes');
+ o.description = _("Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/.");
+ o.inputtitle = _('Manage USSD codes');
+ o.onclick = function() {
+ let dialog = new ussdCodesManagerDialog(_('Manage User USSD Codes'));
+ dialog.show();
};
//TAB AT
@@ -239,7 +1567,7 @@ return view.extend({
s.tab('attab', _('AT Commands Settings'));
s.anonymous = true;
- o = s.taboption('attab' , form.Value, 'atport', _('AT commands sending port'),
+ o = s.taboption('attab' , form.Value, 'atport', _('AT commands sending port'),
_('Select one of the available ttyUSBX ports.'));
devs.sort((a, b) => a.name > b.name);
devs.forEach(dev => o.value('/dev/' + dev.name));
@@ -247,15 +1575,59 @@ return view.extend({
o.placeholder = _('Please select a port');
o.rmempty = false;
- o = s.taboption('attab' , form.TextValue, '_tmp6', _('User AT commands'),
- _("Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."));
- o.rows = 20;
- o.cfgvalue = function(section_id) {
- return fs.trimmed('/etc/modem/atcmmds.user');
- };
- o.write = function(section_id, formvalue) {
- return fs.write('/etc/modem/atcmmds.user', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
+ o = s.taboption('attab', form.Button, '_at_manage');
+ o.title = _('User AT commands');
+ o.description = _("Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/.");
+ o.inputtitle = _('Manage AT commands');
+ o.onclick = function() {
+ let dialog = new atCommandsManagerDialog(_('Manage User AT Commands'));
+ dialog.show();
};
+
+ //TAB CALL LOG
+
+ s.tab('calllogtab', _('Call Log Settings'));
+
+ o = s.taboption('calllogtab' , form.Value, 'callport', _('Call log reading port'),
+ _('Select one of the available ttyUSBX ports.'));
+ devs.sort((a, b) => a.name > b.name);
+ devs.forEach(dev => o.value('/dev/' + dev.name));
+
+ o.placeholder = _('Please select a port');
+ o.rmempty = false;
+
+ o = s.taboption('calllogtab', form.Flag, 'calllog_enabled', _('Enable call log daemon'),
+ _('Background process to log incoming and missed calls. \
+
Important \
+ Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. \
+ Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router.'));
+ o.rmempty = false;
+ o.default = '0';
+ o.write = function(section_id, value) {
+ return uci.load('sms_tool_js').then(function() {
+ if (value == '1') {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'calllog_enabled', '1');
+ return uci.save().then(function() {
+ return fs.exec_direct('/etc/init.d/sms_tool_calllogd', ['enable']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/sms_tool_calllogd', ['start']);
+ });
+ }
+
+ if (value == '0') {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'calllog_enabled', '0');
+ return uci.save().then(function() {
+ return fs.exec_direct('/etc/init.d/sms_tool_calllogd', ['stop']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/sms_tool_calllogd', ['disable']);
+ }).then(function() {
+ return fs.exec_direct('/bin/rm', ['-f', '/tmp/sms_tool_call_log.json']);
+ });
+ }
+ }.bind(this)).then(function() {
+ return form.Flag.prototype.write.apply(this, [section_id, value]);
+ }.bind(this));
+ };
//TAB INFO
@@ -267,53 +1639,89 @@ return view.extend({
);
o.rmempty = false;
o.default = true;
- o.write = function(section_id, value) {
-
- uci.load('sms_tool_js').then(function() {
- let storeL = (uci.get('sms_tool_js', '@sms_tool_js[0]', 'storage'));
- let portR = (uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport'));
- let dsled = (uci.get('sms_tool_js', '@sms_tool_js[0]', 'ledtype'));
-
- L.resolveDefault(fs.exec_direct('/usr/bin/sms_tool', [ '-s' , storeL , '-d' , portR , 'status' ]))
- .then(function(res) {
- if (res) {
- let total = res.substring(res.indexOf('total'));
- let t = total.replace ( /[^\d.]/g, '' );
- let used = res.substring(17, res.indexOf('total'));
- let u = used.replace ( /[^\d.]/g, '' );
-
- let sections = uci.sections('sms_tool_js');
- let led = sections[0].smsled;
-
- if (value == '1') {
- uci.set('sms_tool_js', '@sms_tool_js[0]', 'sms_count', L.toArray(u).join(' '));
- uci.set('sms_tool_js', '@sms_tool_js[0]', 'lednotify', "1");
- uci.save();
- fs.exec_direct('/sbin/new_cron_sync.sh');
- fs.exec_direct('/etc/init.d/my_new_sms', [ 'enable' ]);
- fs.exec('sleep 2');
- fs.exec_direct('/etc/init.d/my_new_sms', [ 'start' ]);
- }
-
- if (value == '0') {
- uci.set('sms_tool_js', '@sms_tool_js[0]', 'lednotify', "0");
- uci.save();
- fs.exec_direct('/sbin/new_cron_sync.sh');
- fs.exec_direct('/etc/init.d/my_new_sms', [ 'stop' ]);
- fs.exec('sleep 2');
- fs.exec_direct('/etc/init.d/my_new_sms', [ 'disable' ]);
- fs.exec_direct('/etc/init.d/my_new_sms', [ 'disable' ]);
-
- if (dsled == 'D') {
- fs.write('/sys/class/leds/'+led+'/brightness', '0');
- }
- }
- }
- });
- });
-
- return form.Flag.prototype.write.apply(this, [section_id, value]);
- };
+ o.write = function(section_id, value) {
+ return uci.load('sms_tool_js').then(function() {
+ let storeL = uci.get('sms_tool_js', '@sms_tool_js[0]', 'storage');
+ let portR = uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport');
+ let dsled = uci.get('sms_tool_js', '@sms_tool_js[0]', 'ledtype');
+
+ if (!portR) {
+ ui.addNotification(null, E('p', {}, _('Please configure SMS reading port first')), 'info');
+ return form.Flag.prototype.write.apply(this, [section_id, value]);
+ }
+
+ return L.resolveDefault(fs.exec_direct('/usr/bin/sms_tool', ['-s', storeL, '-d', portR, 'status']))
+ .then(function(res) {
+ if (!res) return;
+
+ let total = res.substring(res.indexOf('total'));
+ let t = total.replace(/[^\d.]/g, '');
+ let used = res.substring(17, res.indexOf('total'));
+ let u = used.replace(/[^\d.]/g, '');
+
+ if (value == '1') {
+ return update_sms_count_for_modem_sync(u, portR).then(function(updatedValue) {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'sms_count', updatedValue);
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'lednotify', '1');
+ let PTR = uci.get('sms_tool_js', '@sms_tool_js[0]', 'prestart');
+ return uci.save().then(function() {
+ return L.resolveDefault(fs.read('/etc/crontabs/root'), '');
+ }).then(function(crontab) {
+ let lines = (crontab || '').trim().replace(/\r\n/g, '\n').split('\n');
+ let filteredLines = lines.filter(function(line) {
+ return line.trim() !== '' && !line.includes('my_new_sms');
+ });
+ let cronEntry = '1 */' + PTR + ' * * * /etc/init.d/my_new_sms enable && /etc/init.d/my_new_sms restart';
+ filteredLines.push(cronEntry);
+ let newCrontab = filteredLines.join('\n') + '\n';
+ return fs.write('/etc/crontabs/root', newCrontab);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/cron', ['restart']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/my_new_sms', ['enable']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/my_new_sms', ['start']);
+ });
+ });
+ }
+
+ if (value == '0') {
+ uci.set('sms_tool_js', '@sms_tool_js[0]', 'lednotify', '0');
+ return uci.save().then(function() {
+ return L.resolveDefault(fs.read('/etc/crontabs/root'), '');
+ }).then(function(crontab) {
+ let lines = (crontab || '').trim().replace(/\r\n/g, '\n').split('\n');
+ let filteredLines = lines.filter(function(line) {
+ return line.trim() !== '' && !line.includes('my_new_sms');
+ });
+ let newCrontab = filteredLines.join('\n') + '\n';
+ return fs.write('/etc/crontabs/root', newCrontab);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/cron', ['restart']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/my_new_sms', ['stop']);
+ }).then(function() {
+ return fs.exec_direct('/etc/init.d/my_new_sms', ['disable']);
+ }).then(function() {
+ if (dsled == 'D') {
+ let led = uci.get('sms_tool_js', '@sms_tool_js[0]', 'smsled');
+ if (led) {
+ return fs.write('/sys/class/leds/' + led + '/brightness', '0');
+ }
+ }
+ });
+ }
+ }.bind(this));
+ }.bind(this)).then(function() {
+ return form.Flag.prototype.write.apply(this, [section_id, value]);
+ }.bind(this));
+ };
+
+ o = s.taboption('notifytab', form.Flag, 'ontopsms', _('Show notification icon'),
+ _('Show the new message notification icon on the status overview page.')
+ );
+ o.rmempty = false;
+ //o.depends('lednotify', '1');
o = s.taboption('notifytab', form.Value, 'checktime', _('Check inbox every minute(s)'),
_('Specify how many minutes you want your inbox to be checked.'));
diff --git a/luci-app-sms-tool-js/htdocs/luci-static/resources/view/status/include/10_my_sms_info.js b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/status/include/10_my_sms_info.js
new file mode 100644
index 000000000..7d96a5b7c
--- /dev/null
+++ b/luci-app-sms-tool-js/htdocs/luci-static/resources/view/status/include/10_my_sms_info.js
@@ -0,0 +1,709 @@
+'use strict';
+'require baseclass';
+'require dom';
+'require fs';
+'require uci';
+'require poll';
+'require ui';
+
+/*
+ Copyright 2026 Rafał Wabik - IceG - From eko.one.pl forum
+
+ Licensed to the GNU General Public License v3.0.
+*/
+
+
+return baseclass.extend({
+ title: _('Modems'),
+
+ checkInterval: 12, // 12 × 5s = 60s
+
+ restoreAlignmentSettings() {
+ let alignment = localStorage.getItem('luci-modem-tiles-alignment');
+ if (alignment === 'left' || alignment === 'center' || alignment === 'right') {
+ return alignment;
+ }
+ return 'left';
+ },
+
+ saveAlignmentSettings(alignment) {
+ localStorage.setItem('luci-modem-tiles-alignment', alignment);
+ },
+
+ getAlignmentStyle(alignment) {
+ switch(alignment) {
+ case 'center':
+ return 'justify-content:center;';
+ case 'right':
+ return 'justify-content:flex-end;';
+ default:
+ return 'justify-content:flex-start;';
+ }
+ },
+
+ showAlignmentModal(container) {
+ let currentAlignment = this.restoreAlignmentSettings();
+
+ let modalContent = E('div', {}, [
+ E('div', { 'class': 'cbi-section', 'style': 'margin-bottom:1em;' }, [
+ E('div', { 'class': 'cbi-section-node' }, [
+ E('div', { 'class': 'cbi-value' }, [
+ E('label', { 'class': 'cbi-value-title' }, _('Align preview to:')),
+ E('div', { 'class': 'cbi-value-field' }, [
+ E('div', { 'style': 'display:flex;flex-direction:row;gap:20px;align-items:center;' }, [
+ E('label', { 'style': 'display:flex;align-items:center;cursor:pointer;' }, [
+ E('input', {
+ 'type': 'radio',
+ 'name': 'tile-alignment',
+ 'value': 'left',
+ 'id': 'align-left',
+ 'style': 'margin-right:6px;'
+ }),
+ E('span', {}, _('Left'))
+ ]),
+ E('label', { 'style': 'display:flex;align-items:center;cursor:pointer;' }, [
+ E('input', {
+ 'type': 'radio',
+ 'name': 'tile-alignment',
+ 'value': 'center',
+ 'id': 'align-center',
+ 'style': 'margin-right:6px;'
+ }),
+ E('span', {}, _('Center'))
+ ]),
+ E('label', { 'style': 'display:flex;align-items:center;cursor:pointer;' }, [
+ E('input', {
+ 'type': 'radio',
+ 'name': 'tile-alignment',
+ 'value': 'right',
+ 'id': 'align-right',
+ 'style': 'margin-right:6px;'
+ }),
+ E('span', {}, _('Right'))
+ ])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ]);
+
+ ui.showModal(_('New message information block settings'), [
+ modalContent,
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'click': L.bind(function() {
+ ui.hideModal();
+ }, this)
+ }, _('Cancel')),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-positive',
+ 'click': L.bind(function() {
+ let selectedAlignment = document.querySelector('input[name="tile-alignment"]:checked').value;
+ this.saveAlignmentSettings(selectedAlignment);
+
+ let alignmentStyle = this.getAlignmentStyle(selectedAlignment);
+ container.style.cssText = 'display:flex;flex-wrap:wrap;gap:6px;' + alignmentStyle;
+
+ ui.hideModal();
+ ui.addTimeLimitedNotification(null, E('p', _('Alignment settings saved successfully')), 5000, 'info');
+ }, this)
+ }, _('Save'))
+ ])
+ ]);
+
+ requestAnimationFrame(function() {
+ let radioToCheck = document.getElementById('align-' + currentAlignment);
+ if (radioToCheck) {
+ radioToCheck.checked = true;
+ }
+ });
+ },
+
+ addStyles: function() {
+ if (document.getElementById('modem-sms-styles')) return;
+
+ const style = document.createElement('style');
+ style.id = 'modem-sms-styles';
+ style.type = 'text/css';
+ style.textContent = `
+ :root {
+ --sms-side-gap: clamp(4px, 3%, 12px);
+ --sms-badge-bg: #34c759;
+ --sms-badge-text: #ffffff;
+ }
+
+ :root[data-darkmode="true"] {
+ --sms-badge-bg: rgba(46, 204, 113, 0.66);
+ --sms-badge-text: #e5e7eb;
+ }
+
+ .modem-sms-badge {
+ position: absolute;
+ top: -6px;
+ right: -8px;
+ background-color: var(--sms-badge-bg);
+ color: var(--sms-badge-text);
+ text-shadow: 0 1px 2px rgba(0,0,0,.4), 0 2px 6px rgba(0,0,0,.25);
+ padding: 2px 5px;
+ border-radius: 4px;
+ min-width: 18px;
+ text-align: center;
+ white-space: nowrap;
+ font-weight: 500;
+ font-size: 11px;
+ display: inline-block;
+ border: 1px solid transparent;
+ line-height: 1.3;
+ }
+
+ :root[data-darkmode="true"] .modem-sms-badge {
+ background-color: var(--sms-badge-bg);
+ border: 1px solid rgba(46, 204, 113, 0.6);
+ }
+
+ .sms-icon-no-messages img {
+ opacity: 0.7;
+ }
+
+ .sms-icon-with-messages img {
+ opacity: 1;
+ }
+
+ :root[data-darkmode="true"] .sms-icon-no-messages img,
+ :root[data-darkmode="true"] .sms-icon-with-messages img {
+ opacity: 0.5;
+ }
+
+ .modem-info-box .ifacebox-head,
+ .modem-info-box .ifacebox-body {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ cursor: default;
+ }
+
+ .modem-name-truncate {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+ display: block;
+ }
+
+ .modem-info-box .modem-info-content {
+ display: flex !important;
+ flex-direction: row !important;
+ align-items: stretch !important;
+ justify-content: center !important;
+ box-sizing: border-box !important;
+ width: 100% !important;
+ padding-left: var(--sms-side-gap) !important;
+ padding-right: var(--sms-side-gap) !important;
+ }
+
+ .modem-info-box .modem-info-cell {
+ display: flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ box-sizing: border-box !important;
+ min-width: 0 !important;
+ padding: 2px !important;
+ text-align: center !important;
+ }
+
+ .modem-info-box .modem-info-left {
+ flex: 2 1 0 !important;
+ flex-direction: column !important;
+ }
+
+ .modem-info-box .modem-info-right {
+ flex: 1 1 0 !important;
+ }
+
+ .modem-info-box .modem-info-top {
+ display: flex !important;
+ flex-direction: row !important;
+ flex-wrap: nowrap !important;
+ align-items: center !important;
+ justify-content: center !important;
+ gap: 4px !important;
+ max-width: 100% !important;
+ }
+
+ .modem-info-box .modem-info-top img {
+ display: inline-block !important;
+ flex: 0 0 auto !important;
+ width: 28px !important;
+ height: 28px !important;
+ margin: 0 !important;
+ vertical-align: middle !important;
+ }
+
+ .modem-info-box .modem-info-operator {
+ font-size: 12px !important;
+ white-space: nowrap !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ min-width: 0 !important;
+ }
+
+ .modem-info-box .modem-info-tech {
+ display: block !important;
+ width: 100% !important;
+ font-size: 10px !important;
+ text-align: center !important;
+ white-space: nowrap !important;
+ }
+ `;
+ document.head.appendChild(style);
+ },
+
+ getCurrentSmsCount: function(comm_port, storage) {
+ if (!comm_port) return Promise.resolve(0);
+
+ let storageType = storage || 'MS';
+
+ return L.resolveDefault(
+ fs.exec('/usr/bin/sms_tool', ['-s', storageType, '-d', comm_port, 'status']),
+ null
+ ).then(function(res) {
+ if (!res || res.code !== 0) return 0;
+
+ try {
+ let output = res.stdout || '';
+ let stx = output.substring(22, 27);
+ let smsCount = parseInt(stx.replace(/[^0-9]/g, '')) || 0;
+ return smsCount;
+ } catch(e) {
+ return 0;
+ }
+ });
+ },
+
+ getModemData: function(comm_port, forced_plmn_op, mbim_op, modemdata) {
+ let script = '';
+ let args = [];
+
+ if (modemdata === 'serial' || modemdata === 'ecm') {
+ script = '/usr/bin/md_serial_ecm';
+ args = [comm_port, '', forced_plmn_op];
+ } else if (modemdata === 'uqmi') {
+ script = '/usr/bin/md_uqmi';
+ args = [comm_port, '', forced_plmn_op, mbim_op];
+ } else if (modemdata === 'mm') {
+ script = '/usr/bin/md_modemmanager';
+ args = [comm_port, '', forced_plmn_op];
+ } else {
+ return Promise.resolve(null);
+ }
+
+ return L.resolveDefault(fs.exec_direct(script, args), null).then(function(res) {
+ if (!res) return null;
+
+ try {
+ let jsonraw = JSON.parse(res.replace(/[\u0000-\u001F\u007F-\u009F]/g, ""));
+ let json = Object.values(jsonraw);
+
+ if (!json || json.length < 3 || !json[0] || !json[1] || !json[2]) {
+ return null;
+ }
+
+ let signalQuality = 0;
+ if (json[2].csq_per) {
+ signalQuality = parseInt(json[2].csq_per) || 0;
+ } else if (json[2].csq) {
+ let csq = parseInt(json[2].csq);
+ if (!isNaN(csq) && csq >= 0) {
+ signalQuality = Math.min(Math.round((csq / 31) * 100), 100);
+ }
+ }
+
+ return {
+ operator: json[2].operator_name || '-',
+ mode: json[2].mode || '-',
+ signalQuality: signalQuality
+ };
+ } catch(e) {
+ return null;
+ }
+ });
+ },
+
+ getSignalIcon: function(quality) {
+ let icon;
+ if (quality <= 0)
+ icon = L.resource('icons/mobile-signal-000-000.svg');
+ else if (quality < 20)
+ icon = L.resource('icons/mobile-signal-000-020.svg');
+ else if (quality < 40)
+ icon = L.resource('icons/mobile-signal-020-040.svg');
+ else if (quality < 60)
+ icon = L.resource('icons/mobile-signal-040-060.svg');
+ else if (quality < 80)
+ icon = L.resource('icons/mobile-signal-060-080.svg');
+ else
+ icon = L.resource('icons/mobile-signal-080-100.svg');
+ return icon;
+ },
+
+ formatMode: function(modeRaw) {
+ if (!modeRaw || modeRaw.length <= 1 || modeRaw === '-') {
+ return '-';
+ }
+
+ let modeUp = modeRaw.toUpperCase();
+ let modeDisplay;
+
+ if (modeUp.indexOf('LTE') >= 0 || modeUp.indexOf('5G') >= 0) {
+ let tech = '';
+ if (modeUp.indexOf('LTE') >= 0) {
+ tech = modeRaw.split(' ')[0];
+ }
+ if (modeUp.indexOf('5G') >= 0) {
+ tech = modeRaw.split(' ')[0];
+ if (modeRaw.split(' ')[1]) {
+ tech += ' ' + modeRaw.split(' ')[1];
+ }
+ }
+
+ let count = (modeRaw.match(/\//g) || []).length + 1;
+ modeDisplay = (count > 1) ? (tech + ' (' + count + 'CA)') : tech;
+ } else {
+ modeDisplay = modeRaw.split(' ')[0];
+ }
+
+ modeDisplay = modeDisplay.replace('LTE_A', 'LTE-A');
+ return modeDisplay;
+ },
+
+ renderModemBadge: function(modemData, hasFullData, onHeaderClick) {
+ let operator = modemData.operator || '-';
+ let technology = this.formatMode(modemData.mode);
+ let modemName = modemData.modemName || 'Modem';
+ let smsCount = modemData.smsCount || 0;
+ let signalQuality = modemData.signalQuality || 0;
+
+ let truncatedName = modemName;
+ if (modemName.length > 25) {
+ truncatedName = modemName.substring(0, 22) + '...';
+ }
+
+ let signalIcon = this.getSignalIcon(signalQuality);
+ let smsIconUrl = L.resource('icons/redrawsms.svg');
+
+
+ if (!hasFullData) {
+ return E('div', {
+ 'class': 'ifacebox modem-info-box',
+ 'style': 'margin:0.2em;flex:1;min-width:80px;max-width:100px;'
+ }, [
+ E('div', {
+ 'class': 'ifacebox-head port-label',
+ 'style': 'padding:4px 6px;font-weight:normal;font-size:13px;cursor:pointer;',
+ 'click': onHeaderClick
+ }, [
+ E('span', { 'class': 'modem-name-truncate' }, _('SMS Info'))
+ ]),
+ E('div', {
+ 'class': 'ifacebox-body',
+ 'style': 'padding:8px;text-align:center;display:block;'
+ }, [
+ E('span', {
+ 'title': smsCount > 0 ? '%s: %d'.format(_('New SMS'), smsCount) : _('No new SMS'),
+ 'style': 'position:relative;display:inline-block;' + (smsCount === 0 ? 'opacity:1;' : ''),
+ 'class': smsCount > 0 ? 'sms-icon-active' : ''
+ }, [
+ E('img', {
+ 'src': smsIconUrl,
+ 'style': 'width:28px;height:28px;'
+ }),
+ smsCount > 0 ? E('span', {
+ 'class': 'modem-sms-badge'
+ }, String(smsCount)) : ''
+ ])
+ ])
+ ]);
+ }
+
+ return E('div', {
+ 'class': 'ifacebox modem-info-box',
+ 'style': 'margin:0.2em;flex:1;min-width:160px;max-width:220px;'
+ }, [
+ E('div', {
+ 'class': 'ifacebox-head port-label',
+ 'style': 'padding:4px 6px;font-weight:normal;font-size:13px;cursor:pointer;',
+ 'click': onHeaderClick
+ }, [
+ E('span', { 'class': 'modem-name-truncate', 'title': modemName }, truncatedName)
+ ]),
+ E('div', {
+ 'class': 'ifacebox-body modem-info-content',
+ 'style': 'padding-top:8px;padding-bottom:8px;'
+ }, [
+ E('div', {
+ 'class': 'modem-info-cell modem-info-left',
+ 'style': 'text-align:center;',
+ 'title': '%s: %d%%'.format(_('Signal Quality'), signalQuality)
+ }, [
+ E('div', { 'class': 'modem-info-top' }, [
+ E('img', {
+ 'src': signalIcon,
+ 'style': 'width:28px;height:28px;'
+ }),
+ E('span', { 'class': 'modem-info-operator' }, operator)
+ ]),
+ E('small', { 'class': 'modem-info-tech' }, technology)
+ ]),
+ E('div', {
+ 'class': 'modem-info-cell modem-info-right',
+ 'style': 'border-left:1px solid var(--border-color-medium);'
+ }, [
+ E('span', {
+ 'title': smsCount > 0 ? '%s: %d'.format(_('New SMS'), smsCount) : _('No new SMS'),
+ 'style': 'position:relative;display:inline-block;',
+ 'class': smsCount > 0 ? 'sms-icon-with-messages' : 'sms-icon-no-messages'
+ }, [
+ E('img', {
+ 'src': smsIconUrl,
+ 'style': 'width:28px;height:28px;'
+ }),
+ smsCount > 0 ? E('span', {
+ 'class': 'modem-sms-badge'
+ }, String(smsCount)) : ''
+ ])
+ ])
+ ])
+ ]);
+ },
+
+ parseSmsCountUniversal: function(smsCountString, modemIndex) {
+ if (!smsCountString) return 0;
+
+ let parts = smsCountString.split(' ').filter(function(p) { return p.trim() !== ''; });
+
+ let dfmParts = {};
+ let hasDfmFormat = false;
+ for (let i = 0; i < parts.length; i++) {
+ let match = parts[i].match(/^dfm(\d+)_(\d+)$/);
+ if (match) {
+ hasDfmFormat = true;
+ dfmParts[parseInt(match[1])] = parseInt(match[2]) || 0;
+ }
+ }
+
+ if (hasDfmFormat) {
+ if (modemIndex != null) {
+ return dfmParts[modemIndex] || 0;
+ } else {
+ if (dfmParts[1] != null) {
+ return dfmParts[1];
+ }
+ let keys = Object.keys(dfmParts);
+ if (keys.length > 0) {
+ return dfmParts[parseInt(keys[0])] || 0;
+ }
+ return 0;
+ }
+ }
+
+ let simpleMatch = smsCountString.match(/^(\d+)(\s|$)/);
+ if (simpleMatch) {
+ return parseInt(simpleMatch[1]) || 0;
+ }
+
+ return 0;
+ },
+
+ load: function() {
+ return Promise.all([
+ L.resolveDefault(uci.load('sms_tool_js')),
+ L.resolveDefault(uci.load('defmodems'))
+ ]).then(L.bind(function() {
+ let onTopSms = uci.get('sms_tool_js', '@sms_tool_js[0]', 'ontopsms');
+
+ if (onTopSms !== '1') {
+ return null;
+ }
+
+ window.modemDetectorCounter = ('modemDetectorCounter' in window) ?
+ ++window.modemDetectorCounter : 0;
+
+ if (!('modemDetectorData' in window)) {
+ window.modemDetectorData = null;
+ }
+
+ if (window.modemDetectorData !== null &&
+ window.modemDetectorCounter % this.checkInterval !== 0) {
+ return window.modemDetectorData;
+ }
+
+ window.modemDetectorCache = {};
+
+ let defmodemSections = uci.sections('defmodems', 'defmodems') || [];
+ let smsCountString = uci.get('sms_tool_js', '@sms_tool_js[0]', 'sms_count') || '';
+ let storage = uci.get('sms_tool_js', '@sms_tool_js[0]', 'storage') || 'MS';
+ let readport = uci.get('sms_tool_js', '@sms_tool_js[0]', 'readport') || '/dev/ttyUSB2';
+
+ let serialModems = defmodemSections.filter(function(s) {
+ return s.modemdata === 'serial';
+ }).slice(0, 5);
+
+ let hasDefmodems = serialModems.length > 0;
+
+ if (hasDefmodems) {
+ let modemsToLoad = [];
+ for (let i = 0; i < serialModems.length; i++) {
+ let modem = serialModems[i];
+ modemsToLoad.push({
+ index: i + 1,
+ comm_port: modem.comm_port || '',
+ forced_plmn_op: modem.forced_plmn_op || '0',
+ mbim_op: modem.mbim_op || '0',
+ modemdata: modem.modemdata || 'serial',
+ modemName: modem.modem || (_('Modem') + ' ' + (i + 1)),
+ smsCount: this.parseSmsCountUniversal(smsCountString, i + 1),
+ storage: storage,
+ skipModemData: false
+ });
+ }
+ window.modemDetectorData = {
+ modems: modemsToLoad,
+ mode: 'multi'
+ };
+ return window.modemDetectorData;
+ }
+
+ let savedSmsCount = this.parseSmsCountUniversal(smsCountString, null);
+
+ window.modemDetectorData = {
+ modems: [{
+ index: 1,
+ comm_port: readport,
+ forced_plmn_op: '0',
+ mbim_op: '0',
+ modemdata: 'serial',
+ modemName: 'Modem',
+ smsCount: savedSmsCount,
+ storage: storage,
+ skipModemData: false
+ }],
+ mode: 'sms-only'
+ };
+ return window.modemDetectorData;
+
+ }, this));
+ },
+
+ render: function(data) {
+ this.addStyles();
+
+ if (!data || !data.modems || data.modems.length === 0) {
+ return null;
+ }
+
+ let currentAlignment = this.restoreAlignmentSettings();
+ let alignmentStyle = this.getAlignmentStyle(currentAlignment);
+
+ let container = E('div', {
+ 'class': 'network-status-table',
+ 'style': 'display:flex;flex-wrap:wrap;gap:6px;' + alignmentStyle
+ });
+
+ let hasDefmodems = data.mode === 'multi';
+ let isSmsOnly = data.mode === 'sms-only';
+
+ let self = this;
+ let onHeaderClick = function(ev) {
+ ev.stopPropagation();
+ self.showAlignmentModal(container);
+ };
+
+ data.modems.forEach(L.bind(function(modem) {
+ let badgeId = 'modem-badge-' + modem.index;
+ let skipModemData = modem.skipModemData || isSmsOnly;
+
+ if (window.modemDetectorCache && window.modemDetectorCache[modem.index]) {
+ let cached = window.modemDetectorCache[modem.index];
+ container.appendChild(this.renderModemBadge(cached, hasDefmodems && !skipModemData, onHeaderClick));
+ } else {
+ let boxStyle = skipModemData
+ ? 'margin:0.2em;flex:1;min-width:80px;max-width:100px;'
+ : 'margin:0.2em;flex:1;min-width:160px;max-width:220px;';
+
+ container.appendChild(
+ E('div', {
+ 'class': 'ifacebox modem-info-box',
+ 'style': boxStyle,
+ 'id': badgeId
+ }, [
+ E('div', {
+ 'class': 'ifacebox-head port-label',
+ 'style': 'padding:4px 6px;font-weight:normal;font-size:13px;cursor:pointer;',
+ 'click': onHeaderClick
+ }, [
+ E('span', { 'class': 'modem-name-truncate', 'title': modem.modemName || _('Modem') },
+ modem.modemName || (_('Modem') + ': ' + modem.index))
+ ]),
+ E('div', {
+ 'class': 'ifacebox-body',
+ 'style': 'padding:0 8px;padding-top:16px;text-align:center;display:flex;align-items:center;justify-content:center;gap:6px;'
+ }, [
+ E('span', {'class': 'spinning', 'style': 'display:inline-block;'}),
+ E('span', {'style': 'font-size:12px;'}, _('Loading...'))
+ ])
+ ])
+ );
+
+ let modemDataPromise = skipModemData
+ ? Promise.resolve(null)
+ : this.getModemData(modem.comm_port, modem.forced_plmn_op, modem.mbim_op, modem.modemdata);
+
+ let sleepPromise = new Promise(function(resolve) { setTimeout(resolve, 2000); });
+
+ Promise.all([
+ modemDataPromise,
+ this.getCurrentSmsCount(modem.comm_port, modem.storage),
+ sleepPromise
+ ]).then(L.bind(function(results) {
+ let result = results[0];
+ let currentSmsCount = results[1];
+
+ let savedSmsCount = modem.smsCount || 0;
+ let newSmsCount = Math.max(0, currentSmsCount - savedSmsCount);
+
+ let modemInfo = {
+ operator: '-',
+ mode: '-',
+ modemName: modem.modemName || _('Modem'),
+ smsCount: newSmsCount,
+ signalQuality: 0
+ };
+
+ if (result) {
+ modemInfo.operator = result.operator || '-';
+ modemInfo.mode = result.mode || '-';
+ modemInfo.signalQuality = result.signalQuality || 0;
+ }
+
+ if (!window.modemDetectorCache) {
+ window.modemDetectorCache = {};
+ }
+ window.modemDetectorCache[modem.index] = modemInfo;
+
+ let badgeElement = document.getElementById(badgeId);
+ if (badgeElement) {
+ let newBadge = this.renderModemBadge(modemInfo, hasDefmodems && !skipModemData, onHeaderClick);
+ newBadge.id = badgeId;
+ badgeElement.parentNode.replaceChild(newBadge, badgeElement);
+ }
+ }, this));
+ }
+ }, this));
+
+ return container;
+ }
+});
diff --git a/luci-app-sms-tool-js/po/cs/sms-tool-js.po b/luci-app-sms-tool-js/po/cs/sms-tool-js.po
new file mode 100644
index 000000000..a35bc3f46
--- /dev/null
+++ b/luci-app-sms-tool-js/po/cs/sms-tool-js.po
@@ -0,0 +1,888 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: cs\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
+
+msgid "SMS Messages"
+msgstr "SMS zprávy"
+
+msgid "Received Messages"
+msgstr "Přijaté zprávy"
+
+msgid "Send Messages"
+msgstr "Odeslat zprávy"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Odesílatel"
+
+msgid "Received"
+msgstr "Přijato"
+
+msgid "Message"
+msgstr "Zpráva"
+
+msgid "Configuration"
+msgstr "Konfigurace"
+
+msgid "AT Commands"
+msgstr "AT příkazy"
+
+msgid "Please enter phone number"
+msgstr "Zadejte prosím telefonní číslo"
+
+msgid "Please enter a message text"
+msgstr "Zadejte prosím text zprávy"
+
+msgid "Reply"
+msgstr "Odpovědět"
+
+msgid "Please enter a USSD code"
+msgstr "Zadejte prosím USSD kód"
+
+msgid "USSD Codes"
+msgstr "USSD kódy"
+
+msgid "Send to"
+msgstr "Odeslat na"
+
+msgid "Message text"
+msgstr "Text zprávy"
+
+msgid "Send"
+msgstr "Odeslat"
+
+msgid "Send to number"
+msgstr "Odeslat na číslo"
+
+msgid "to number"
+msgstr "na číslo"
+
+msgid "to group"
+msgstr "skupině"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS byla úspěšně odeslána"
+
+msgid "Code to send"
+msgstr "Kód k odeslání"
+
+msgid "Send code"
+msgstr "Odeslat kód"
+
+msgid "SMS Settings"
+msgstr "Nastavení SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Nastavení USSD kódů"
+
+msgid "SMS reading port"
+msgstr "Port pro čtení SMS"
+
+msgid "SMS sending port"
+msgstr "Port pro odesílání SMS"
+
+msgid "AT commands sending port"
+msgstr "Port pro odesílání AT příkazů"
+
+msgid "AT Commands Settings"
+msgstr "Nastavení AT příkazů"
+
+msgid "Merge split messages"
+msgstr "Sloučit rozdělené zprávy"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Zaškrtnutí této možnosti usnadní čtení zpráv, ale způsobí nesoulad mezi počtem zobrazených a skutečně přijatých zpráv."
+
+msgid "USSD sending port"
+msgstr "Port pro odesílání USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Odesílat USSD kód jako prostý text"
+
+msgid "Receive message without PDU decoding"
+msgstr "Přijmout zprávu bez dekódování PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Odesílá USSD kód jako prostý text. Příkaz se nekóduje do formátu PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Přijme a zobrazí zprávu bez jejího dekódování jako PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Vysvětlení čísla a předvolby"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Na kartě pro odesílání SMS zobrazit vysvětlení předvolby a správného tvaru telefonního čísla."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Telefonní číslo by mělo být uvedeno s mezinárodní předvolbou (např. pro Polsko 48, bez znaku '+'). Pokud má číslo 5, 4 nebo 3 znaky, je považováno za 'krátké' a mezinárodní předvolba se k němu nepřidává."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Telefonní číslo by mělo být uvedeno s mezinárodní předvolbou (např. pro Polsko 48, bez znaku +). Pokud má číslo 5, 4 nebo 3 znaky, je považováno za krátké a mezinárodní předvolba se k němu nepřidává."
+
+msgid "Add prefix to phone number"
+msgstr "Přidat předvolbu k telefonnímu číslu"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Automaticky doplnit předvolbu do pole telefonního čísla."
+
+msgid "Prefix number"
+msgstr "Číslo předvolby"
+
+msgid "Please specify the command to send"
+msgstr "Zadejte prosím příkaz k odeslání"
+
+msgid "Please specify the code to send"
+msgstr "Zadejte prosím kód k odeslání"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Nastavte prosím port pro komunikaci s modemem"
+
+msgid "User AT commands"
+msgstr "Uživatelské AT příkazy"
+
+msgid "Command to send"
+msgstr "Příkaz k odeslání"
+
+msgid "Clear form"
+msgstr "Vymazat formulář"
+
+msgid "Send command"
+msgstr "Odeslat příkaz"
+
+msgid "Message storage area"
+msgstr "Úložiště zpráv"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Zprávy se ukládají na konkrétní místo (například na SIM kartu nebo do paměti modemu), ale v závislosti na typu zařízení mohou být k dispozici i jiné oblasti."
+
+msgid "SIM card"
+msgstr "SIM karta"
+
+msgid "Modem memory"
+msgstr "Paměť modemu"
+
+msgid "Storage used / Total capacity"
+msgstr "Využité úložiště / Celková kapacita"
+
+msgid "Delete selected"
+msgstr "Smazat vybrané"
+
+msgid "Delete"
+msgstr "Smazat"
+
+msgid "Delete all"
+msgstr "Smazat vše"
+
+msgid "Refresh"
+msgstr "Obnovit"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Vyberte prosím zprávu/zprávy, které chcete smazat"
+
+msgid "Delete selected message(s)?"
+msgstr "Smazat vybrané zprávy?"
+
+msgid "Delete all the messages?"
+msgstr "Smazat všechny zprávy?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Uživatelské rozhraní pro čtení zpráv pomocí nástroje sms-tool. Více informací o sms-tool naleznete na %sfóru eko.one.pl%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Uživatelské rozhraní pro odesílání zpráv pomocí nástroje sms-tool. Více informací o sms-tool naleznete na %sfóru eko.one.pl%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Uživatelské rozhraní pro odesílání AT příkazů pomocí nástroje sms-tool. Více informací o sms-tool naleznete na %sfóru eko.one.pl%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Uživatelské rozhraní pro odesílání USSD kódů pomocí nástroje sms-tool. Více informací o sms-tool naleznete na %sfóru eko.one.pl%s."
+
+msgid "Configuration sms-tool"
+msgstr "Konfigurace sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Konfigurační panel pro sms-tool a grafické rozhraní."
+
+msgid "Port for communication with the modem"
+msgstr "Port pro komunikaci s modemem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Vyberte jeden z dostupných portů ttyUSBX."
+
+msgid "Please select a port"
+msgstr "Vyberte prosím port"
+
+msgid "User contacts"
+msgstr "Kontakty uživatele"
+
+msgid "Enable group messaging"
+msgstr "Povolit hromadné zprávy"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Tato možnost umožňuje odeslat jednu zprávu všem kontaktům v seznamu kontaktů uživatele."
+
+msgid "Message sending delay"
+msgstr "Zpoždění odesílání zpráv"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Zpráva odeslána na číslo:"
+
+msgid "User USSD codes"
+msgstr "Uživatelské USSD kódy"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Každý řádek musí mít následující formát: 'Jméno kontaktu;telefonní číslo'. Pro usnadnění se soubor ukládá do umístění /etc/modem/phonebook.user."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "Stisknutím [Enter] příkaz odešlete, stisknutím [Delete] jej smažete"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "Stisknutím [Enter] kód odešlete, stisknutím [Delete] jej smažete"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "Stisknutím [Delete] smažete telefonní číslo"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "Stisknutím [Delete] smažete obsah zprávy"
+
+msgid "Notification Settings"
+msgstr "Nastavení oznámení"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED dioda informuje o nové zprávě. Před aktivací této funkce nakonfigurujte a uložte port pro čtení SMS, interval kontroly doručené pošty a vyberte oznamovací LED diodu."
+
+msgid "Check inbox every minute(s)"
+msgstr "Kontrolovat doručené zprávy každých (minut)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Zadejte interval v minutách, ve kterém se má kontrolovat doručená pošta."
+
+msgid "Notification LED"
+msgstr "Oznamovací LED"
+
+msgid "Select the notification LED."
+msgstr "Vyberte oznamovací LED diodu."
+
+msgid "Notify new messages"
+msgstr "Upozorňovat na nové zprávy"
+
+msgid "Restart the inbox checking process every"
+msgstr "Restartovat proces kontroly schránky každé"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Proces se restartuje ve zvoleném časovém intervalu. Tím se eliminuje zpoždění při kontrole doručené pošty."
+
+msgid "4h"
+msgstr "4 hod"
+
+msgid "6h"
+msgstr "6 hod"
+
+msgid "8h"
+msgstr "8 hod"
+
+msgid "12h"
+msgstr "12 hod"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Dioda je vyhrazena pouze pro tato oznámení"
+
+msgid ""
+"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
+"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr ""
+"Zvolte 'Ne' v případě, že router má pouze jednu LED diodu nebo pokud LED dioda plní více úkolů.
Důležité Tato "
+"možnost vyžaduje, aby byla LED dioda definována v systému (pokud je to možné), aby fungovala správně. Tento požadavek platí, pokud dioda podporuje více funkcí."
+
+msgid ""
+"[3 - 59] second(s)
Important Messages "
+"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
+msgstr ""
+"[3 - 59] sekund
Důležité Zprávy "
+"jsou odesílány bez ověření a potvrzení o doručení. Proto existuje riziko, že zpráva nebude doručena."
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Yes"
+msgstr "Ano"
+
+msgid "Merge algorithm"
+msgstr "Algoritmus slučování"
+
+msgid "Simple (merge without sorting)"
+msgstr "Jednoduchý (sloučit bez řazení)"
+
+msgid "Advanced (merges with sorting)"
+msgstr "Pokročilý (sloučit s řazením)"
+
+msgid "Phone number to be blurred"
+msgstr "Telefonní číslo k rozmazání"
+
+msgid "The last 5 digits of this number will be blurred."
+msgstr "Posledních 5 číslic tohoto čísla bude rozmazáno."
+
+msgid "Expect a decimal value between five and fifty-nine"
+msgstr "Očekává se desítková hodnota od pěti do padesáti devíti"
+
+msgid "Expect a decimal value between three and fifty-nine"
+msgstr "Očekává se desítková hodnota od tří do padesáti devíti"
+
+msgid "Expect a decimal value"
+msgstr "Očekává se desítková hodnota"
+
+msgid "Direction of message merging"
+msgstr "Směr slučování zpráv"
+
+msgid "From beginning to end"
+msgstr "Od začátku do konce"
+
+msgid "From end to beginning"
+msgstr "Od konce do začátku"
+
+msgid "Save messages to a text file"
+msgstr "Uložit zprávy do textového souboru"
+
+msgid "Save sms to txt file?"
+msgstr "Uložit SMS do souboru .txt?"
+
+msgid "Save as .txt file"
+msgstr "Uložit jako soubor .txt"
+
+msgid "Saving..."
+msgstr "Ukládání..."
+
+msgid "Please wait.. Process of saving SMS message to a text file is in progress."
+msgstr "Čekejte prosím... Probíhá ukládání SMS zpráv do textového souboru."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Tato možnost umožňuje zálohovat SMS zprávy nebo například ukládat zprávy, které nástroj sms-tool nepodporuje."
+
+msgid "Delete all messages"
+msgstr "Smazat všechny zprávy"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Tato možnost umožňuje smazat všechny SMS zprávy v případě, že nejsou viditelné na kartě 'Přijaté zprávy'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Ukládání SMS zpráv do souboru selhalo. Zkuste to prosím znovu."
+
+msgid "PDU decoding scheme"
+msgstr "Schéma dekódování PDU"
+
+msgid "Autodetect"
+msgstr "Autodetekce"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Zachovat předchozí odpověď při odesílání nového USSD kódu."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Zaškrtněte tuto možnost, pokud potřebujete používat menu postavené na USSD kódech"
+
+msgid "Turn over the replies."
+msgstr "Obrátit pořadí odpovědí."
+
+msgid "View new reply from top"
+msgstr "Zobrazit novou odpověď nahoře"
+
+msgid "Please wait... deleted"
+msgstr "Čekejte prosím... smazáno"
+
+msgid "of"
+msgstr "z"
+
+msgid "selected messages"
+msgstr "vybraných zpráv"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+msgstr ""
+"Balíček vyžaduje konfiguraci uživatelem.
Je nutné "
+"nastavit následující:
1. Všechny porty pro komunikaci s modemem.
2. Další "
+"možnosti specifické pro daný modem (pro zpracování USSD kódů).
3. Oznamovací LED diodu (volitelně).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Jakákoli změna oblasti, ze které se SMS zprávy čtou, vyžaduje obnovení zpráv"
+
+msgid "Characters remaining:"
+msgstr "Zbývá znaků:"
+
+msgid "Encoding standard"
+msgstr "Standard kódování"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 znaků)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 znaků)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Kódování GSM-7 (160 znaků)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Kódování Unicode (70 znaků), nepodporuje odesílání národních znaků (v UTF-8) – pouze ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Tato karta umožňuje uživatelům podpořit vývoj balíčku."
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Informace o luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Nahlásit chybu"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Napište do vlákna o balíčku na fóru eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Napsat na fórum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Nahlásit chybu na GitHub stránce balíčku"
+
+msgid "Open a package discussion on Github"
+msgstr "Otevřít diskusi o balíčku na GitHubu"
+
+msgid "Open discussion"
+msgstr "Otevřít diskusi"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Kupte kávu, pokud chcete podpořit vývoj projektu a autora"
+
+msgid "Buy a coffee"
+msgstr "Koupit kávu"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Staňte se sponzorem, pokud chcete podpořit vývoj projektu a autora"
+
+msgid "Become a sponsor"
+msgstr "Stát se sponzorem"
+
+msgid "Package Info"
+msgstr "Informace o balíčku"
+
+msgid "Author (package maintainer)"
+msgstr "Autor (správce balíčku)"
+
+msgid "Package update and support"
+msgstr "Aktualizace a podpora balíčku"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Nastavení přesměrování SMS na e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "E-mail bude odeslán..."
+
+msgid "Enable message forwarding"
+msgstr "Povolit přesměrování zpráv"
+
+msgid "E-mail settings"
+msgstr "Nastavení e-mailu"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Vyberte předdefinované nastavení e-mailu nebo zadejte nastavení ručně."
+
+msgid "Recipient"
+msgstr "Příjemce"
+
+msgid "E-mail address of the recipient."
+msgstr "E-mailová adresa příjemce."
+
+msgid "E-mail address of the sender."
+msgstr "E-mailová adresa odesílatele."
+
+msgid "User"
+msgstr "Uživatel"
+
+msgid "Username for SMTP authentication."
+msgstr "Uživatelské jméno pro SMTP autentizaci."
+
+msgid "Password"
+msgstr "Heslo"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Heslo aplikace Google / Heslo pro SMTP autentizaci."
+
+msgid "SMTP server"
+msgstr "SMTP server"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Hostitelské jméno / IP adresa SMTP serveru."
+
+msgid "SMTP server port"
+msgstr "Port SMTP serveru"
+
+msgid "Security"
+msgstr "Zabezpečení"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: použít STARTTLS, pokud jej server podporuje."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP přes SSL."
+
+msgid "Required Package"
+msgstr "Vyžadovaný balíček"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Možnost přesměrování SMS vyžaduje nainstalovaný balíček mailsend."
+
+msgid "Check required packages"
+msgstr "Zkontrolovat vyžadované balíčky"
+
+msgid "Check"
+msgstr "Zkontrolovat"
+
+msgid "Mailsend Package"
+msgstr "Balíček mailsend"
+
+msgid "Loading package data…"
+msgstr "Načítání dat balíčku…"
+
+msgid "Installed"
+msgstr "Nainstalováno"
+
+msgid "Install…"
+msgstr "Instalovat…"
+
+msgid "Please select exactly one message to forward"
+msgstr "Vyberte prosím přesně jednu zprávu k přesměrování"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Přesměrovat vybranou zprávu na e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Odesílání e-mailu..."
+
+msgid "Message forwarded successfully"
+msgstr "Zpráva byla úspěšně přesměrována"
+
+msgid "Failed to forward message: %s"
+msgstr "Nepodařilo se přesměrovat zprávu: %s"
+
+msgid "Error: %s"
+msgstr "Chyba: %s"
+
+msgid "user define"
+msgstr "definováno uživatelem"
+
+msgid "Forward SMS"
+msgstr "Přesměrovat SMS"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Vyberte prosím zprávu/zprávy, které chcete přesměrovat"
+
+msgid "SMS forwarding function is not enabled"
+msgstr "Funkce přesměrování SMS není povolena"
+
+msgid "My Router"
+msgstr "Můj router"
+
+msgid "Forward SMS to E-mail"
+msgstr "Přesměrovat SMS na e-mail"
+
+msgid "Subject:"
+msgstr "Předmět:"
+
+msgid "Message text:"
+msgstr "Text zprávy:"
+
+msgid "Subject and body cannot be empty"
+msgstr "Předmět a text zprávy nesmí být prázdné"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Balíček mailsend není nainstalován. Nainstalujte jej prosím nejprve pomocí tlačítka Instalovat... níže"
+
+msgid "Select modem"
+msgstr "Vybrat modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Změna modemu vyžaduje obnovení zpráv"
+
+msgid "Defined AT command files"
+msgstr "Definované soubory AT příkazů"
+
+msgid "Error loading AT commands file: "
+msgstr "Chyba při načítání souboru AT příkazů: "
+
+msgid "Select file with AT commands to load"
+msgstr "Vyberte soubor s AT příkazy k načtení"
+
+msgid "No AT commands available"
+msgstr "Nejsou dostupné žádné AT příkazy"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Chyba při načítání výchozího souboru AT příkazů:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Chyba při načítání souboru USSD kódů: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Chyba při načítání výchozího souboru USSD:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Vyberte soubor s USSD kódy k načtení"
+
+msgid "No USSD codes available"
+msgstr "Nejsou dostupné žádné USSD kódy"
+
+msgid "Defined USSD code files"
+msgstr "Definované soubory USSD kódů"
+
+msgid "File uploaded and saved to"
+msgstr "Soubor byl nahrán a uložen do"
+
+msgid "Unable to upload file"
+msgstr "Nelze nahrát soubor"
+
+msgid "Phonebook saved successfully"
+msgstr "Telefonní seznam byl úspěšně uložen"
+
+msgid "Unable to save the file"
+msgstr "Nelze uložit soubor"
+
+msgid "filename.user"
+msgstr "nazevsouboru.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Vyberte nebo vytvořte soubor k úpravě..."
+
+msgid "Please enter a file name"
+msgstr "Zadejte prosím název souboru"
+
+msgid "File created successfully"
+msgstr "Soubor byl úspěšně vytvořen"
+
+msgid "Unable to create file"
+msgstr "Nelze vytvořit soubor"
+
+msgid "Please select a file to delete"
+msgstr "Vyberte prosím soubor ke smazání"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Opravdu chcete tento soubor smazat?"
+
+msgid "File deleted successfully"
+msgstr "Soubor byl úspěšně smazán"
+
+msgid "Unable to delete file"
+msgstr "Nelze smazat soubor"
+
+msgid "Please select or create a file first"
+msgstr "Nejprve prosím vyberte nebo vytvořte soubor"
+
+msgid "File saved successfully"
+msgstr "Soubor byl úspěšně uložen"
+
+msgid "Unable to save file"
+msgstr "Nelze uložit soubor"
+
+msgid "Load .user file"
+msgstr "Načíst soubor .user"
+
+msgid "Save .user file"
+msgstr "Uložit soubor .user"
+
+msgid "Manage contacts"
+msgstr "Spravovat kontakty"
+
+msgid "Edit User Contacts"
+msgstr "Upravit uživatelské kontakty"
+
+msgid "Manage USSD codes"
+msgstr "Spravovat USSD kódy"
+
+msgid "Manage User USSD Codes"
+msgstr "Správa uživatelských USSD kódů"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Každý řádek musí mít následující formát: 'Popis kódu;kód'. Pro usnadnění se soubor ukládá do umístění /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Každý řádek musí mít následující formát: 'Popis AT příkazu;AT příkaz'. Pro usnadnění se soubor ukládá do umístění /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Spravovat AT příkazy"
+
+msgid "Manage User AT Commands"
+msgstr "Správa uživatelských AT příkazů"
+
+msgid "-- Select file --"
+msgstr "-- Vybrat soubor --"
+
+msgid "Select file"
+msgstr "Vybrat soubor"
+
+msgid "New file name"
+msgstr "Nový název souboru"
+
+msgid "Delete selected file"
+msgstr "Smazat vybraný soubor"
+
+msgid "Show notification icon"
+msgstr "Zobrazit ikonu oznámení"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Zobrazit ikonu upozornění na novou zprávu na stránce s přehledem stavu."
+
+msgid "Loading..."
+msgstr "Načítání..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modemy"
+
+msgid "Signal Quality"
+msgstr "Kvalita signálu"
+
+msgid "Align preview to:"
+msgstr "Zarovnat náhled na:"
+
+msgid "Left"
+msgstr "Vlevo"
+
+msgid "Center"
+msgstr "Na střed"
+
+msgid "Right"
+msgstr "Vpravo"
+
+msgid "New message information block settings"
+msgstr "Nastavení informačního bloku nové zprávy"
+
+msgid "Alignment settings saved successfully"
+msgstr "Nastavení zarovnání bylo úspěšně uloženo"
+
+msgid "SMS Info"
+msgstr "Informace o SMS"
+
+msgid "New SMS"
+msgstr "Nová SMS"
+
+msgid "No new SMS"
+msgstr "Žádné nové SMS"
+
+msgid "Deleting files"
+msgstr "Mazání souborů"
+
+msgid "Delete all files"
+msgstr "Smazat všechny soubory"
+
+msgid "Load .gz archive"
+msgstr "Načíst .gz archiv"
+
+msgid "Save .gz archive"
+msgstr "Uložit .gz archiv"
+
+msgid "Failed to extract archive"
+msgstr "Nepodařilo se rozbalit archiv"
+
+msgid "Archive extracted to"
+msgstr "Archiv byl rozbalen do"
+
+msgid "Upload error"
+msgstr "Chyba při nahrávání"
+
+msgid "Failed to create archive"
+msgstr "Nepodařilo se vytvořit archiv"
+
+msgid "Failed to read archive"
+msgstr "Nepodařilo se přečíst archiv"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Opravdu chcete smazat všechny soubory ve složce?"
+
+msgid "All files deleted successfully"
+msgstr "Všechny soubory byly úspěšně smazány"
+
+msgid "Calls"
+msgstr "Hovory"
+
+msgid "Call Log"
+msgstr "Historie hovorů"
+
+msgid "Clear all call log entries?"
+msgstr "Vymazat celou historii hovorů?"
+
+msgid "No call log entries found"
+msgstr "Nebyly nalezeny žádné záznamy o hovorech"
+
+msgid "No matching call log entries found"
+msgstr "Nebyly nalezeny žádné odpovídající záznamy o hovorech"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Uživatelské rozhraní pro prohlížení historie hovorů. Protokol je shromažďován službou běžící na pozadí."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Služba historie hovorů je zakázána. Povolte ji prosím v konfiguraci, aby se začaly ukládat záznamy."
+
+msgid "Filter call type"
+msgstr "Filtrovat typ hovoru"
+
+msgid "All calls"
+msgstr "Všechny hovory"
+
+msgid "Missed calls"
+msgstr "Zmeškané hovory"
+
+msgid "Received calls"
+msgstr "Přijaté hovory"
+
+msgid "Dialed calls"
+msgstr "Volaná čísla"
+
+msgid "Clear Log"
+msgstr "Vymazat historii"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Type"
+msgstr "Typ"
+
+msgid "Number"
+msgstr "Číslo"
+
+msgid "Duration"
+msgstr "Doba trvání"
+
+msgid "Name"
+msgstr "Jméno"
+
+msgid "Call log reading port"
+msgstr "Port pro čtení historie hovorů"
+
+msgid "Enable call log daemon"
+msgstr "Povolit službu historie hovorů"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Proces na pozadí pro protokolování příchozích a zmeškaných hovorů."
+
+msgid "Call Log Settings"
+msgstr "Nastavení protokolu hovorů"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Proces na pozadí pro zaznamenávání příchozích a zmeškaných hovorů.
Důležité Tato volba je určena pro modemy Qualcomm, které nemají interní paměť historie hovorů a nepodporují standardní příkaz AT+CPBR. Povolení této volby přidá novou záložku. Pokud se záložka nezobrazí, vymažte mezipaměť prohlížeče a restartujte router."
+
+msgid "Force EHLO"
+msgstr "Vynutit EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Vynutí, aby mailsend vždy používal EHLO místo automatické detekce HELO/EHLO. Zapněte pouze v případě, že přeposílání selhává, protože některé servery (např. firemní brány, Microsoft 365 / Exchange Online Protection) řádně neoznamují podporu ESMTP, což narušuje STARTTLS/autentizaci."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Kódování Unicode (výchozí 70 znaků) podporuje přenos národních znaků a vícedílných SMS zpráv"
+
+msgid "Not applicable"
+msgstr "Nevztahuje se"
diff --git a/luci-app-sms-tool-js/po/da/sms-tool-js.po b/luci-app-sms-tool-js/po/da/sms-tool-js.po
new file mode 100644
index 000000000..110695083
--- /dev/null
+++ b/luci-app-sms-tool-js/po/da/sms-tool-js.po
@@ -0,0 +1,888 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "SMS Messages"
+msgstr "SMS-meddelelser"
+
+msgid "Received Messages"
+msgstr "Modtagne meddelelser"
+
+msgid "Send Messages"
+msgstr "Send meddelelser"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Afsender"
+
+msgid "Received"
+msgstr "Modtaget"
+
+msgid "Message"
+msgstr "Meddelelse"
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid "AT Commands"
+msgstr "AT-kommandoer"
+
+msgid "Please enter phone number"
+msgstr "Indtast venligst telefonnummer"
+
+msgid "Please enter a message text"
+msgstr "Indtast venligst en meddelelsestekst"
+
+msgid "Reply"
+msgstr "Besvar"
+
+msgid "Please enter a USSD code"
+msgstr "Indtast venligst en USSD-kode"
+
+msgid "USSD Codes"
+msgstr "USSD-koder"
+
+msgid "Send to"
+msgstr "Send til"
+
+msgid "Message text"
+msgstr "Meddelelsestekst"
+
+msgid "Send"
+msgstr "Send"
+
+msgid "Send to number"
+msgstr "Send til nummer"
+
+msgid "to number"
+msgstr "til nummer"
+
+msgid "to group"
+msgstr "til gruppe"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS blev sendt uden fejl"
+
+msgid "Code to send"
+msgstr "Kode der skal sendes"
+
+msgid "Send code"
+msgstr "Send kode"
+
+msgid "SMS Settings"
+msgstr "SMS-indstillinger"
+
+msgid "USSD Codes Settings"
+msgstr "Indstillinger for USSD-koder"
+
+msgid "SMS reading port"
+msgstr "Port til SMS-læsning"
+
+msgid "SMS sending port"
+msgstr "Port til SMS-afsendelse"
+
+msgid "AT commands sending port"
+msgstr "Port til afsendelse af AT-kommandoer"
+
+msgid "AT Commands Settings"
+msgstr "Indstillinger for AT-kommandoer"
+
+msgid "Merge split messages"
+msgstr "Flet opdelte meddelelser"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Hvis du aktiverer denne indstilling, bliver det nemmere at læse meddelelserne, men det vil skabe en uoverensstemmelse mellem antallet af viste og modtagne meddelelser."
+
+msgid "USSD sending port"
+msgstr "Port til USSD-afsendelse"
+
+msgid "Sending USSD code in plain text"
+msgstr "Send USSD-kode som klartekst"
+
+msgid "Receive message without PDU decoding"
+msgstr "Modtag meddelelse uden PDU-afkodning"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Sender USSD-koden som klartekst. Kommandoen kodes ikke til PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Modtag og vis meddelelsen uden at afkode den som en PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Forklaring af nummer og præfiks"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Vis en forklaring af præfikset og det korrekte telefonnummer på fanen til afsendelse af SMS'er."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Telefonnummeret skal indledes med landekode (f.eks. 45 for Danmark, uden '+'). Hvis nummeret er på 3, 4 eller 5 tegn, behandles det som et 'kortnummer' og skal ikke have landekode."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Telefonnummeret skal indledes med landekode (f.eks. 45 for Danmark, uden +). Hvis nummeret er på 3, 4 eller 5 tegn, behandles det som et kortnummer og skal ikke have landekode."
+
+msgid "Add prefix to phone number"
+msgstr "Tilføj præfiks til telefonnummer"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Tilføj automatisk præfiks til feltet med telefonnummer."
+
+msgid "Prefix number"
+msgstr "Præfiksnummer"
+
+msgid "Please specify the command to send"
+msgstr "Angiv venligst kommandoen, der skal sendes"
+
+msgid "Please specify the code to send"
+msgstr "Angiv venligst koden, der skal sendes"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Indstil venligst porten til kommunikation med modemmet"
+
+msgid "User AT commands"
+msgstr "Brugerdefinerede AT-kommandoer"
+
+msgid "Command to send"
+msgstr "Kommando der skal sendes"
+
+msgid "Clear form"
+msgstr "Ryd formular"
+
+msgid "Send command"
+msgstr "Send kommando"
+
+msgid "Message storage area"
+msgstr "Lagringsområde for meddelelser"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Meddelelser gemmes på en specifik placering (f.eks. på SIM-kortet eller i modemmets hukommelse), men andre områder kan også være tilgængelige afhængigt af enhedstypen."
+
+msgid "SIM card"
+msgstr "SIM-kort"
+
+msgid "Modem memory"
+msgstr "Modemhukommelse"
+
+msgid "Storage used / Total capacity"
+msgstr "Brugt lager / Samlet kapacitet"
+
+msgid "Delete selected"
+msgstr "Slet valgte"
+
+msgid "Delete"
+msgstr "Slet"
+
+msgid "Delete all"
+msgstr "Slet alle"
+
+msgid "Refresh"
+msgstr "Opdater"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Vælg venligst de meddelelser, der skal slettes"
+
+msgid "Delete selected message(s)?"
+msgstr "Slet valgte meddelelse(r)?"
+
+msgid "Delete all the messages?"
+msgstr "Slet alle meddelelser?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Brugergrænseflade til at læse meddelelser med sms-tool. Mere information om sms-tool findes på %seko.one.pl-forummet%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Brugergrænseflade til at sende meddelelser med sms-tool. Mere information om sms-tool findes på %seko.one.pl-forummet%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Brugergrænseflade til at sende AT-kommandoer med sms-tool. Mere information om sms-tool findes på %seko.one.pl-forummet%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Brugergrænseflade til at sende USSD-koder med sms-tool. Mere information om sms-tool findes på %seko.one.pl-forummet%s."
+
+msgid "Configuration sms-tool"
+msgstr "Konfiguration af sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Konfigurationspanel til sms-tool og den grafiske brugerflade."
+
+msgid "Port for communication with the modem"
+msgstr "Port til kommunikation med modemmet"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Vælg en af de tilgængelige ttyUSBX-porte."
+
+msgid "Please select a port"
+msgstr "Vælg venligst en port"
+
+msgid "User contacts"
+msgstr "Brugerkontakter"
+
+msgid "Enable group messaging"
+msgstr "Aktiver gruppemeddelelser"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Denne indstilling lader dig sende én meddelelse til alle kontakter i brugerens kontaktliste."
+
+msgid "Message sending delay"
+msgstr "Forsinkelse ved afsendelse af meddelelser"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Meddelelse sendt til nummer:"
+
+msgid "User USSD codes"
+msgstr "Brugerens USSD-koder"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Hver linje skal have følgende format: 'Kontaktnavn;telefonnummer'. For nemheds skyld gemmes filen på placeringen /etc/modem/phonebook.user."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "Tryk på [Enter] for at sende kommandoen, tryk på [Delete] for at slette kommandoen"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "Tryk på [Enter] for at sende koden, tryk på [Delete] for at slette koden"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "Tryk på [Delete] for at slette telefonnummeret"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "Tryk på [Delete] for at slette meddelelsens indhold"
+
+msgid "Notification Settings"
+msgstr "Indstillinger for meddelelser"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED-lampen informerer om en ny meddelelse. Før du aktiverer denne funktion, skal du konfigurere og gemme porten til SMS-læsning, intervallet for kontrol af indbakken samt vælge en rød/grøn LED-lampe."
+
+msgid "Check inbox every minute(s)"
+msgstr "Tjek indbakke hvert/hovede minut(ter)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Angiv, hvor mange minutters interval der skal være mellem tjek af indbakken."
+
+msgid "Notification LED"
+msgstr "Indikations-LED"
+
+msgid "Select the notification LED."
+msgstr "Vælg indikations-LED-lampen."
+
+msgid "Notify new messages"
+msgstr "Giv besked om nye meddelelser"
+
+msgid "Restart the inbox checking process every"
+msgstr "Genstart indbakketjek-processen hver"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Processen vil genstarte med det valgte tidsinterval. Dette vil eliminere forsinkelser i tjekket af indbakken."
+
+msgid "4h"
+msgstr "4 t"
+
+msgid "6h"
+msgstr "6 t"
+
+msgid "8h"
+msgstr "8 t"
+
+msgid "12h"
+msgstr "12 t"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Dioden er udelukkende dedikeret til disse meddelelser"
+
+msgid ""
+"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
+"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr ""
+"Vælg 'Nej', hvis routeren kun har én LED, eller hvis LED-lampen har flere funktioner.
Vigtigt Denne "
+"indstilling kræver, at LED'en er defineret i systemet (hvis muligt) for at fungere korrekt. Dette gælder, hvis dioden understøtter flere opgaver."
+
+msgid ""
+"[3 - 59] second(s)
Important Messages "
+"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
+msgstr ""
+"[3 - 59] sekund(er)
Vigtigt Meddelelser "
+"sendes uden verifikation og leveringsbekræftelse. Derfor er der risiko for, at meddelelsen ikke kommer frem."
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "Merge algorithm"
+msgstr "Fletningsalgoritme"
+
+msgid "Simple (merge without sorting)"
+msgstr "Simpel (flet uden sortering)"
+
+msgid "Advanced (merges with sorting)"
+msgstr "Avanceret (flet med sortering)"
+
+msgid "Phone number to be blurred"
+msgstr "Telefonnummer der skal sløres"
+
+msgid "The last 5 digits of this number will be blurred."
+msgstr "De sidste 5 cifre i dette nummer vil blive sløret."
+
+msgid "Expect a decimal value between five and fifty-nine"
+msgstr "Forventer en decimalværdi mellem 5 og 59"
+
+msgid "Expect a decimal value between three and fifty-nine"
+msgstr "Forventer en decimalværdi mellem 3 and 59"
+
+msgid "Expect a decimal value"
+msgstr "Forventer en decimalværdi"
+
+msgid "Direction of message merging"
+msgstr "Retning for fletning af meddelelser"
+
+msgid "From beginning to end"
+msgstr "Fra start til slut"
+
+msgid "From end to beginning"
+msgstr "Fra slut til start"
+
+msgid "Save messages to a text file"
+msgstr "Gem meddelelser i en tekstfil"
+
+msgid "Save sms to txt file?"
+msgstr "Gem SMS i en .txt-fil?"
+
+msgid "Save as .txt file"
+msgstr "Gem som .txt-fil"
+
+msgid "Saving..."
+msgstr "Gemmer..."
+
+msgid "Please wait.. Process of saving SMS message to a text file is in progress."
+msgstr "Vent venligst.. Gemmer SMS-meddelelser i en tekstfil."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Denne indstilling gør det muligt at sikkerhedskopiere SMS'er eller f.eks. gemme meddelelser, der ikke understøttes af sms-tool."
+
+msgid "Delete all messages"
+msgstr "Slet alle meddelelser"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Denne indstilling lader dig slette alle SMS-meddelelser, hvis de ikke er synlige på fanen 'Modtagne meddelelser'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Gemning af SMS-meddelelser til en fil mislykkedes. Prøv venligst igen."
+
+msgid "PDU decoding scheme"
+msgstr "PDU-afkodningsskema"
+
+msgid "Autodetect"
+msgstr "Find automatisk"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Behold det forrige svar, når der sendes en ny USSD-kode."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Markér dette felt, hvis du skal bruge en menu, der er baseret på USSD-koder"
+
+msgid "Turn over the replies."
+msgstr "Vend svarene om."
+
+msgid "View new reply from top"
+msgstr "Vis nyt svar øverst"
+
+msgid "Please wait... deleted"
+msgstr "Vent venligst... slettet"
+
+msgid "of"
+msgstr "af"
+
+msgid "selected messages"
+msgstr "valgte meddelelser"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+msgstr ""
+"Pakken kræver brugerkonfiguration.
Følgende "
+"skal indstilles:
1. Alle porte til kommunikation med modemmet.
2. Yderligere "
+"indstillinger, der er specifikke for modemmet (til USSD-koder).
3. Indikations-LED (valgfrit).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Enhver ændring af lagringsområdet, hvorfra SMS-meddelelser læses, kræver en opdatering"
+
+msgid "Characters remaining:"
+msgstr "Resterende tegn:"
+
+msgid "Encoding standard"
+msgstr "Kodningsstandard"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 tegn)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 tegn)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7-kodning (160 tegn)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode-kodning (70 tegn), understøtter ikke afsendelse af nationale specialtegn (i UTF-8) – kun ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Denne fane gør det muligt for brugere at støtte pakken."
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Luci-app-sms-tool-js info"
+
+msgid "Report a bug"
+msgstr "Rapportér en fejl"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Skriv i pakkens tråd på forummet eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Skriv på forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Rapportér en fejl på pakkens GitHub-side"
+
+msgid "Open a package discussion on Github"
+msgstr "Åbn en diskussion om pakken på GitHub"
+
+msgid "Open discussion"
+msgstr "Åbn diskussion"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Køb en kop kaffe, hvis du vil støtte udviklingen af projektet og forfatteren"
+
+msgid "Buy a coffee"
+msgstr "Køb en kaffe"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Bliv sponsor, hvis du vil støtte projektets udvikling og forfatteren"
+
+msgid "Become a sponsor"
+msgstr "Bliv sponsor"
+
+msgid "Package Info"
+msgstr "Pakkeinformation"
+
+msgid "Author (package maintainer)"
+msgstr "Forfatter (pakkeansvarlig)"
+
+msgid "Package update and support"
+msgstr "Opdatering og support af pakken"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Indstillinger for videresendelse af SMS til e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "En e-mail vil blive sendt.."
+
+msgid "Enable message forwarding"
+msgstr "Aktiver videresendelse av meddelelser"
+
+msgid "E-mail settings"
+msgstr "E-mailindstillinger"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Vælg en foruddefineret e-mailindstilling, eller indtast indstillingerne manuelt."
+
+msgid "Recipient"
+msgstr "Modtager"
+
+msgid "E-mail address of the recipient."
+msgstr "Modtagerens e-mailadresse."
+
+msgid "E-mail address of the sender."
+msgstr "Afsenderens e-mailadresse."
+
+msgid "User"
+msgstr "Bruger"
+
+msgid "Username for SMTP authentication."
+msgstr "Brugernavn til SMTP-godkendelse."
+
+msgid "Password"
+msgstr "Adgangskode"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google-app-adgangskode / Adgangskode til SMTP-godkendelse."
+
+msgid "SMTP server"
+msgstr "SMTP-server"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Værtsnavn/IP-adresse på SMTP-serveren."
+
+msgid "SMTP server port"
+msgstr "SMTP-serverport"
+
+msgid "Security"
+msgstr "Sikkerhed"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: brug STARTTLS, hvis serveren understøtter det."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP over SSL."
+
+msgid "Required Package"
+msgstr "Nødvendig pakke"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Muligheden for SMS-videresendelse kræver, at pakken mailsend er installeret."
+
+msgid "Check required packages"
+msgstr "Tjek nødvendige pakker"
+
+msgid "Check"
+msgstr "Tjek"
+
+msgid "Mailsend Package"
+msgstr "Mailsend-pakke"
+
+msgid "Loading package data…"
+msgstr "Indlæser pakkedata…"
+
+msgid "Installed"
+msgstr " installeret"
+
+msgid "Install…"
+msgstr "Installer…"
+
+msgid "Please select exactly one message to forward"
+msgstr "Vælg venligst præcis én meddelelse, der skal videresendes"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Videresend den valgte meddelelse til e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Sender e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Meddelelsen blev videresendt korrekt"
+
+msgid "Failed to forward message: %s"
+msgstr "Kunne ikke videresende meddelelse: %s"
+
+msgid "Error: %s"
+msgstr "Fejl: %s"
+
+msgid "user define"
+msgstr "brugerdefineret"
+
+msgid "Forward SMS"
+msgstr "Videresend SMS"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Vælg venligst de meddelelser, der skal videresendes"
+
+msgid "SMS forwarding function is not enabled"
+msgstr "Funktionen til SMS-videresendelse er ikke aktiveret"
+
+msgid "My Router"
+msgstr "Min router"
+
+msgid "Forward SMS to E-mail"
+msgstr "Videresend SMS til e-mail"
+
+msgid "Subject:"
+msgstr "Emne:"
+
+msgid "Message text:"
+msgstr "Meddelelsestekst:"
+
+msgid "Subject and body cannot be empty"
+msgstr "Emne og beskedtekst må ikke være tomme"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Pakken mailsend er ikke installeret. Installer den venligst først ved hjælp af knappen Installer... nedenfor"
+
+msgid "Select modem"
+msgstr "Vælg modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Skift af modem kræver genindlæsning af meddelelserne"
+
+msgid "Defined AT command files"
+msgstr "Definerede AT-kommandofiler"
+
+msgid "Error loading AT commands file: "
+msgstr "Fejl under indlæsning af AT-kommandofil: "
+
+msgid "Select file with AT commands to load"
+msgstr "Vælg fil med AT-kommandoer, der skal indlæses"
+
+msgid "No AT commands available"
+msgstr "Ingen tilgængelige AT-kommandoer"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Fejl under indlæsning af den oprindelige AT-kommandofil:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Fejl under indlæsning af USSD-kodefil: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Fejl under indlæsning af den oprindelige USSD-fil:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Vælg fil med USSD-koder, der skal indlæses"
+
+msgid "No USSD codes available"
+msgstr "Ingen tilgængelige USSD-koder"
+
+msgid "Defined USSD code files"
+msgstr "Definerede USSD-kommandofiler"
+
+msgid "File uploaded and saved to"
+msgstr "Filen blev uploadet og gemt i"
+
+msgid "Unable to upload file"
+msgstr "Kunne ikke uploade fil"
+
+msgid "Phonebook saved successfully"
+msgstr "Telefonbogen blev gemt korrekt"
+
+msgid "Unable to save the file"
+msgstr "Kunne ikke gemme filen"
+
+msgid "filename.user"
+msgstr "filnavn.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Vælg eller opret en fil, der skal redigeres..."
+
+msgid "Please enter a file name"
+msgstr "Indtast venligst et filnavn"
+
+msgid "File created successfully"
+msgstr "Filen blev oprettet uden fejl"
+
+msgid "Unable to create file"
+msgstr "Kunne ikke oprette fil"
+
+msgid "Please select a file to delete"
+msgstr "Vælg venligst en fil, der skal slettes"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Er du sikker på, at du vil slette denne fil?"
+
+msgid "File deleted successfully"
+msgstr "Filen blev slettet korrekt"
+
+msgid "Unable to delete file"
+msgstr "Kunne ikke slette fil"
+
+msgid "Please select or create a file first"
+msgstr "Vælg eller opret venligst en fil først"
+
+msgid "File saved successfully"
+msgstr "Filen blev gemt korrekt"
+
+msgid "Unable to save file"
+msgstr "Kunne ikke gemme fil"
+
+msgid "Load .user file"
+msgstr "Indlæs .user-fil"
+
+msgid "Save .user file"
+msgstr "Gem .user-fil"
+
+msgid "Manage contacts"
+msgstr "Administrer kontakter"
+
+msgid "Edit User Contacts"
+msgstr "Rediger brugerkontakter"
+
+msgid "Manage USSD codes"
+msgstr "Administrer USSD-koder"
+
+msgid "Manage User USSD Codes"
+msgstr "Administrer brugerens USSD-koder"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Hver linje skal have følgende format: 'Kodebeskrivelse;kode'. For nemheds skyld gemmes filen på placeringen /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Hver linje skal have følgende format: 'AT-kommando beskrivelse;AT-kommando'. For nemheds skyld gemmes filen på placeringen /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Administrer AT-kommandoer"
+
+msgid "Manage User AT Commands"
+msgstr "Administrer brugerens AT-kommandoer"
+
+msgid "-- Select file --"
+msgstr "-- Vælg fil --"
+
+msgid "Select file"
+msgstr "Vælg fil"
+
+msgid "New file name"
+msgstr "Nyt filnavn"
+
+msgid "Delete selected file"
+msgstr "Slet valgte fil"
+
+msgid "Show notification icon"
+msgstr "Vis meddelelsesikon"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Vis ikonet for nye meddelelser på siden for statusoversigt."
+
+msgid "Loading..."
+msgstr "Indlæser..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modemer"
+
+msgid "Signal Quality"
+msgstr "Signalstyrke"
+
+msgid "Align preview to:"
+msgstr "Juster forhåndsvisning til:"
+
+msgid "Left"
+msgstr "Venstre"
+
+msgid "Center"
+msgstr "Centreret"
+
+msgid "Right"
+msgstr "Højre"
+
+msgid "New message information block settings"
+msgstr "Indstillinger for informationsblok til nye meddelelser"
+
+msgid "Alignment settings saved successfully"
+msgstr "Justeringsindstillinger blev gemt korrekt"
+
+msgid "SMS Info"
+msgstr "SMS-info"
+
+msgid "New SMS"
+msgstr "Ny SMS"
+
+msgid "No new SMS"
+msgstr "Ingen nye SMS'er"
+
+msgid "Deleting files"
+msgstr "Sletter filer"
+
+msgid "Delete all files"
+msgstr "Slet alle filer"
+
+msgid "Load .gz archive"
+msgstr "Indlæs .gz-arkiv"
+
+msgid "Save .gz archive"
+msgstr "Gem .gz-arkiv"
+
+msgid "Failed to extract archive"
+msgstr "Kunne ikke udpakke arkiv"
+
+msgid "Archive extracted to"
+msgstr "Arkiv udpakket til"
+
+msgid "Upload error"
+msgstr "Fejl under upload"
+
+msgid "Failed to create archive"
+msgstr "Kunne ikke oprette arkiv"
+
+msgid "Failed to read archive"
+msgstr "Kunne ikke læse arkiv"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Er du sikker på, at du vil slette alle filer i mappen?"
+
+msgid "All files deleted successfully"
+msgstr "Alle filer blev slettet korrekt"
+
+msgid "Calls"
+msgstr "Opkald"
+
+msgid "Call Log"
+msgstr "Opkaldslog"
+
+msgid "Clear all call log entries?"
+msgstr "Ryd alle poster i opkaldsloggen?"
+
+msgid "No call log entries found"
+msgstr "Ingen poster fundet i opkaldsloggen"
+
+msgid "No matching call log entries found"
+msgstr "Ingen matchende poster fundet i opkaldsloggen"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Brugergrænseflade til visning af opkaldslogge. Loggen indsamles af en baggrundstjeneste."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Opkaldslog-tjenesten er deaktiveret. Aktiver den i konfigurationen for at starte indsamling af logge."
+
+msgid "Filter call type"
+msgstr "Filtrer efter opkaldstype"
+
+msgid "All calls"
+msgstr "Alle opkald"
+
+msgid "Missed calls"
+msgstr "Ubesvarede opkald"
+
+msgid "Received calls"
+msgstr "Modtagne opkald"
+
+msgid "Dialed calls"
+msgstr "Foretagne opkald"
+
+msgid "Clear Log"
+msgstr "Ryd log"
+
+msgid "Date"
+msgstr "Dato"
+
+msgid "Type"
+msgstr "Type"
+
+msgid "Number"
+msgstr "Nummer"
+
+msgid "Duration"
+msgstr "Varighed"
+
+msgid "Name"
+msgstr "Navn"
+
+msgid "Call log reading port"
+msgstr "Port til aflæsning af opkaldslog"
+
+msgid "Enable call log daemon"
+msgstr "Aktiver opkaldslog-tjeneste"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Baggrundsproces til at logge indkommende og ubesvarede opkald."
+
+msgid "Call Log Settings"
+msgstr "Indstillinger for opkaldslog"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Baggrundsproces til registrering af indgående og mistede opkald.
Vigtigt Mulighed dedikeret til Qualcomm-modemer, der ikke har intern opkaldshistorikshukommelse og ikke understøtter standardkommandoen AT+CPBR. Aktivering af denne mulighed tilføjer en ny fane. Hvis den dedikerede fane ikke vises, skal du rydde din browsercache og genstarte routeren."
+
+msgid "Force EHLO"
+msgstr "Gennemtving EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Tvinger mailsend til altid at bruge EHLO i stedet for automatisk at registrere HELO/EHLO. Aktiver kun, hvis videresendelse fejler, da nogle servere (f.eks. virksomhedsgateways, Microsoft 365 / Exchange Online Protection) ikke korrekt annoncerer ESMTP-understøttelse, hvilket ødelægger STARTTLS/godkendelse."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicode-kodning (som standard 70 tegn) understøtter overførsel af nationale tegn og sms-beskeder i flere dele"
+
+msgid "Not applicable"
+msgstr "Ikke relevant"
diff --git a/luci-app-sms-tool-js/po/de/sms-tool-js.po b/luci-app-sms-tool-js/po/de/sms-tool-js.po
new file mode 100644
index 000000000..a44911d5f
--- /dev/null
+++ b/luci-app-sms-tool-js/po/de/sms-tool-js.po
@@ -0,0 +1,965 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: de\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "SMS Messages"
+msgstr "SMS-Nachrichten"
+
+msgid "Received Messages"
+msgstr "Empfangene Nachrichten"
+
+msgid "Send Messages"
+msgstr "Nachrichten senden"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Absender"
+
+msgid "Received"
+msgstr "Empfangen"
+
+msgid "Message"
+msgstr "Nachricht"
+
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgid "AT Commands"
+msgstr "AT-Befehle"
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid "Please enter phone number"
+msgstr "Bitte Telefonnummer eingeben"
+
+msgid "Please enter a message text"
+msgstr "Bitte Nachrichtentext eingeben"
+
+msgid "Reply"
+msgstr "Antwort"
+
+msgid "Please enter a USSD code"
+msgstr "Bitte USSD-Code eingeben"
+
+msgid "USSD Codes"
+msgstr "USSD-Codes"
+
+msgid "Send to"
+msgstr "Senden an"
+
+msgid "Message text"
+msgstr "Nachrichtentext"
+
+msgid "Send"
+msgstr "Senden"
+
+msgid "Send to number"
+msgstr "An Nummer senden"
+
+msgid "to number"
+msgstr "an Nummer"
+
+msgid "to group"
+msgstr "an Gruppe"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS erfolgreich gesendet"
+
+msgid "Code to send"
+msgstr "Zu sendender Code"
+
+msgid "Send code"
+msgstr "Code senden"
+
+msgid "SMS Settings"
+msgstr "SMS-Einstellungen"
+
+msgid "USSD Codes Settings"
+msgstr "USSD-Code-Einstellungen"
+
+msgid "SMS reading port"
+msgstr "Port zum Lesen von SMS"
+
+msgid "SMS sending port"
+msgstr "Port zum Senden von SMS"
+
+msgid "AT commands sending port"
+msgstr "Port zum Senden von AT-Befehlen"
+
+msgid "AT Commands Settings"
+msgstr "AT-Befehle-Einstellungen"
+
+msgid "Merge split messages"
+msgstr "Geteilte Nachrichten zusammenführen"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Geteilte Nachrichten werden zusammengeführt. Das Aktivieren dieser Option erleichtert das Lesen von SMS, führt jedoch zu einer Diskrepanz in der Anzahl der angezeigten und empfangenen Nachrichten."
+
+msgid "USSD sending port"
+msgstr "Port zum Senden von USSD-Codes"
+
+msgid "Sending USSD code in plain text"
+msgstr "USSD-Code im Klartext senden"
+
+msgid "Receive message without PDU decoding"
+msgstr "Nachricht ohne PDU-Dekodierung empfangen"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Sendet den USSD-Code im Klartext. Der Befehl wird nicht als PDU kodiert."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Die empfangene Nachricht wird ohne PDU-Dekodierung angezeigt."
+
+msgid "Explanation of number and prefix"
+msgstr "Erklärung zu Nummer und Präfix"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Zeigt im Tab zum Senden von SMS eine Erklärung zum Präfix und zur korrekten Telefonnummer."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Der Telefonnummer sollte die Ländervorwahl vorangestellt werden (für Polen ist es 48, ohne '+'). Wenn die Nummer 5, 4 oder 3 Zeichen lang ist, wird sie als 'kurz' behandelt und sollte keine Ländervorwahl haben."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Der Telefonnummer sollte die Ländervorwahl vorangestellt werden (für Polen ist es 48, ohne +). Wenn die Nummer 5, 4 oder 3 Zeichen lang ist, wird sie als kurz behandelt und sollte keine Ländervorwahl haben."
+
+msgid "Add prefix to phone number"
+msgstr "Präfix zur Telefonnummer hinzufügen"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Fügt automatisch ein Präfix zum Telefonnummernfeld hinzu."
+
+msgid "Prefix number"
+msgstr "Präfixnummer"
+
+msgid "Please specify the command to send"
+msgstr "Bitte Befehl zum Senden angeben"
+
+msgid "Please specify the code to send"
+msgstr "Bitte Code zum Senden angeben"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Bitte Port für die Kommunikation mit dem Modem festlegen"
+
+msgid "User AT commands"
+msgstr "Benutzer-AT-Befehle"
+
+msgid "Command to send"
+msgstr "Zu sendender Befehl"
+
+msgid "Clear form"
+msgstr "Formular leeren"
+
+msgid "Send command"
+msgstr "Befehl senden"
+
+msgid "Send code"
+msgstr "Code senden"
+
+msgid "Reply"
+msgstr "Antwort"
+
+msgid "Message storage area"
+msgstr "Nachrichtenspeicherbereich"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Nachrichten werden an einem bestimmten Ort gespeichert (z. B. auf der SIM-Karte oder im Modemspeicher), je nach Gerätetyp können jedoch auch andere Bereiche verfügbar sein."
+
+msgid "SIM card"
+msgstr "SIM-Karte"
+
+msgid "Modem memory"
+msgstr "Modemspeicher"
+
+msgid "Storage used / Total capacity"
+msgstr "Genutzter Speicher / Gesamtkapazität"
+
+msgid "Delete selected"
+msgstr "Ausgewählte löschen"
+
+msgid "Delete"
+msgstr "Löschen"
+
+msgid "Delete all"
+msgstr "Alle löschen"
+
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Bitte zu löschende Nachricht(en) auswählen"
+
+msgid "Delete selected message(s)?"
+msgstr "Ausgewählte Nachricht(en) löschen?"
+
+msgid "Delete all the messages?"
+msgstr "Alle Nachrichten löschen?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Benutzeroberfläche zum Lesen von SMS-Nachrichten mit sms-tool. Weitere Informationen über sms-tool im %seko.one.pl Forum%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Benutzeroberfläche zum Senden von SMS-Nachrichten mit sms-tool. Weitere Informationen über sms-tool im %seko.one.pl Forum%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Benutzeroberfläche zum Senden von AT-Befehlen mit sms-tool. Weitere Informationen über sms-tool im %seko.one.pl Forum%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Benutzeroberfläche zum Senden von USSD-Codes mit sms-tool. Weitere Informationen über sms-tool im %seko.one.pl Forum%s."
+
+msgid "Configuration sms-tool"
+msgstr "Konfiguration sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Einstellungspanel für sms-tool und GUI-Anwendung."
+
+msgid "Port for communication with the modem"
+msgstr "Port für die Kommunikation mit dem Modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Wählen Sie einen der verfügbaren ttyUSBX-Ports."
+
+msgid "Please select a port"
+msgstr "Bitte Port auswählen"
+
+msgid "User contacts"
+msgstr "Benutzerkontakte"
+
+msgid "Enable group messaging"
+msgstr "Gruppennachrichten aktivieren"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Diese Option ermöglicht das Senden einer Nachricht an alle Kontakte in der Kontaktliste des Benutzers."
+
+msgid "Message sending delay"
+msgstr "Verzögerung beim Nachrichtenversand"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Nachricht gesendet an Nummer:"
+
+msgid "User USSD codes"
+msgstr "Benutzer-USSD-Codes"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Jede Zeile muss folgendes Format haben: 'Kontaktname;Telefonnummer'. Zur Benutzerfreundlichkeit werden die Kontakte in der Datei /etc/modem/phonebook.user gespeichert."
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "Jede Zeile muss folgendes Format haben: 'AT-Befehlsbeschreibung;AT-Befehl'. Zur Benutzerfreundlichkeit werden die Befehle in der Datei /etc/modem/atcmmds.user gespeichert."
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "Jede Zeile muss folgendes Format haben: 'Code-Beschreibung;Code'. Zur Benutzerfreundlichkeit werden die Codes in der Datei /etc/modem/ussdcodes.user gespeichert."
+
+msgid "Display new messages notification on login page"
+msgstr "Benachrichtigung über neue Nachrichten auf der Anmeldeseite anzeigen"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Benachrichtigung anzeigen, wenn neue Nachrichten im ausgewählten Nachrichtenbereich eintreffen."
+
+msgid "new message"
+msgstr "neue Nachricht"
+
+msgid "new messages"
+msgstr "neue Nachrichten"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Show"
+msgstr "Anzeigen"
+
+msgid "Read"
+msgstr "Gelesen"
+
+msgid "Unread"
+msgstr "Ungelesen"
+
+msgid "All / Read / Unread"
+msgstr "Alle / Gelesen / Ungelesen"
+
+msgid "Show all, read or unread messages"
+msgstr "Alle, gelesene oder ungelesene Nachrichten anzeigen"
+
+msgid "Show system messages in the message list"
+msgstr "Systemnachrichten in der Nachrichtenliste anzeigen"
+
+msgid "Mark as read"
+msgstr "Als gelesen markieren"
+
+msgid "Mark as unread"
+msgstr "Als ungelesen markieren"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Bitte zu markierende Nachricht(en) als gelesen auswählen"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Bitte zu markierende Nachricht(en) als ungelesen auswählen"
+
+msgid "Mark selected message(s) as read?"
+msgstr "Ausgewählte Nachricht(en) als gelesen markieren?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "Ausgewählte Nachricht(en) als ungelesen markieren?"
+
+msgid "Message marked as read"
+msgstr "Nachricht als gelesen markiert"
+
+msgid "Messages marked as read"
+msgstr "Nachrichten als gelesen markiert"
+
+msgid "Message marked as unread"
+msgstr "Nachricht als ungelesen markiert"
+
+msgid "Messages marked as unread"
+msgstr "Nachrichten als ungelesen markiert"
+
+msgid "System messages"
+msgstr "Systemnachrichten"
+
+msgid "Diode"
+msgstr "Diode"
+
+msgid "New messages notification LED"
+msgstr "LED-Benachrichtigung für neue Nachrichten"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "SMS-Benachrichtigungs-LED bei neuer Nachricht aktivieren"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Benachrichtigungs-LED aktivieren, wenn neue Nachrichten im ausgewählten Nachrichtenbereich eintreffen."
+
+msgid "Selected LED"
+msgstr "Ausgewählte LED"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Wählen Sie eine LED-Diode für die Benachrichtigung über neue Nachrichten. Die Auswahl erfolgt aus den im System verfügbaren LEDs."
+
+msgid "Automatically select LED"
+msgstr "LED automatisch auswählen"
+
+msgid "Automatically select the first available LED."
+msgstr "Wählt automatisch die erste verfügbare LED aus."
+
+msgid "Advanced settings"
+msgstr "Erweiterte Einstellungen"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "LED-Blinkintervall (in Sekunden)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "LED-Blinkintervall festlegen (in Sekunden)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Blinkdauer (in Sekunden)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Blinkdauer festlegen (in Sekunden). Auf 0 setzen für unbegrenzte Dauer (LED blinkt, bis Nachrichten als gelesen markiert werden)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Bitte warten... SMS-Nachrichten werden in Textdatei gespeichert."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Diese Option ermöglicht das Sichern von SMS-Nachrichten oder z. B. das Speichern von Nachrichten, die von sms-tool nicht unterstützt werden."
+
+msgid "Delete all messages"
+msgstr "Alle Nachrichten löschen"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Diese Option ermöglicht das Löschen aller SMS-Nachrichten, wenn diese im Tab 'Empfangene Nachrichten' nicht sichtbar sind."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Speichern der SMS-Nachrichten in Datei fehlgeschlagen. Bitte erneut versuchen."
+
+msgid "PDU decoding scheme"
+msgstr "PDU-Dekodierungsschema"
+
+msgid "Autodetect"
+msgstr "Automatische Erkennung"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Vorherige Antwort beim Senden eines neuen USSD-Codes beibehalten."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Aktivieren Sie diese Option, wenn Sie das auf USSD-Codes basierende Menü verwenden müssen"
+
+msgid "Turn over the replies."
+msgstr "Antworten umkehren."
+
+msgid "View new reply from top"
+msgstr "Neue Antwort von oben anzeigen"
+
+msgid "Please wait... deleted"
+msgstr "Bitte warten... gelöscht"
+
+msgid "of"
+msgstr "von"
+
+msgid "selected messages"
+msgstr "ausgewählten Nachrichten"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
1. Alle Ports für die Kommunikation mit dem Modem.
2. Zusätzliche "
+"modemspezifische Optionen (für die Handhabung von USSD-Codes).
3. Benachrichtigungs-LED (optional).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Jede Änderung des Bereichs, aus dem SMS-Nachrichten gelesen werden, erfordert eine Aktualisierung der Nachrichten"
+
+msgid "Characters remaining:"
+msgstr "Verbleibende Zeichen:"
+
+msgid "Encoding standard"
+msgstr "Kodierungsstandard"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 Zeichen)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 Zeichen)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7-Kodierung (160 Zeichen)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode-Kodierung (70 Zeichen), unterstützt kein Senden nationaler Zeichen (in utf8) – nur ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Der Tab ermöglicht es Benutzern, das Paket zu unterstützen"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Informationen über luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Fehler melden"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Schreiben Sie im Paket-Thema im Forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Im Forum schreiben"
+
+msgid "Report a bug on the package Github page"
+msgstr "Fehler auf der Github-Seite des Pakets melden"
+
+msgid "Open a package discussion on Github"
+msgstr "Paket-Diskussion auf Github öffnen"
+
+msgid "Open discussion"
+msgstr "Diskussion öffnen"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Spendieren Sie einen Kaffee, wenn Sie die Entwicklung des Projekts und den Autor unterstützen möchten"
+
+msgid "Buy a coffee"
+msgstr "Kaffee spendieren"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Werden Sie Sponsor, wenn Sie die Entwicklung des Projekts und den Autor unterstützen möchten"
+
+msgid "Become a sponsor"
+msgstr "Sponsor werden"
+
+msgid "Package Info"
+msgstr "Paketinformationen"
+
+msgid "Author (package maintainer)"
+msgstr "Autor (Paketbetreuer)"
+
+msgid "Package update and support"
+msgstr "Paketaktualisierung und Support"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Einstellungen für SMS-Weiterleitung an E-Mail"
+
+msgid "An e-mail will be sent.."
+msgstr "Eine E-Mail wird gesendet.."
+
+msgid "Enable message forwarding"
+msgstr "Nachrichtenweiterleitung aktivieren"
+
+msgid "E-mail settings"
+msgstr "E-Mail-Einstellungen"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Wählen Sie vordefinierte E-Mail-Einstellungen aus oder geben Sie die Einstellungen manuell ein."
+
+msgid "Recipient"
+msgstr "Empfänger"
+
+msgid "E-mail address of the recipient."
+msgstr "E-Mail-Adresse des Empfängers."
+
+msgid "Sender"
+msgstr "Absender"
+
+msgid "E-mail address of the sender."
+msgstr "E-Mail-Adresse des Absenders."
+
+msgid "User"
+msgstr "Benutzer"
+
+msgid "Username for SMTP authentication."
+msgstr "Benutzername für SMTP-Authentifizierung."
+
+msgid "Password"
+msgstr "Passwort"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google-App-Passwort / Passwort für SMTP-Authentifizierung."
+
+msgid "SMTP server"
+msgstr "SMTP-Server"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Hostname/IP-Adresse des SMTP-Servers."
+
+msgid "SMTP server port"
+msgstr "SMTP-Server-Port"
+
+msgid "Security"
+msgstr "Sicherheit"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: STARTTLS verwenden, wenn der Server dies unterstützt."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP über SSL."
+
+msgid "Required Package"
+msgstr "Erforderliches Paket"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Die SMS-Weiterleitungsoption erfordert die Installation des mailsend-Pakets."
+
+msgid "Check required packages"
+msgstr "Erforderliche Pakete prüfen"
+
+msgid "Check"
+msgstr "Prüfen"
+
+msgid "Mailsend Package"
+msgstr "Mailsend-Paket"
+
+msgid "Loading package data…"
+msgstr "Paketdaten werden geladen…"
+
+msgid "Installed"
+msgstr "Installiert"
+
+msgid "Install…"
+msgstr "Installieren…"
+
+msgid "Mailsend Package"
+msgstr "Mailsend-Paket"
+
+msgid "Please select exactly one message to forward"
+msgstr "Bitte wählen Sie genau eine Nachricht zum Weiterleiten aus"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Ausgewählte Nachricht an E-Mail weiterleiten?"
+
+msgid "Sending e-mail..."
+msgstr "E-Mail wird gesendet..."
+
+msgid "Message forwarded successfully"
+msgstr "Nachricht erfolgreich weitergeleitet"
+
+msgid "Failed to forward message: %s"
+msgstr "Nachrichtenweiterleitung fehlgeschlagen: %s"
+
+msgid "Error: %s"
+msgstr "Fehler: %s"
+
+msgid "user define"
+msgstr "Benutzereinstellungen"
+
+msgid "Forward"
+msgstr "Weiterleiten"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Wählen Sie die Nachricht(en) aus, die Sie weiterleiten möchten"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "SMS-Weiterleitungsfunktion ist nicht aktiviert. Bitte konfigurieren Sie sie zuerst"
+
+msgid "My Router"
+msgstr "Mein Router"
+
+msgid "Forward SMS to E-mail"
+msgstr "SMS an E-Mail weiterleiten"
+
+msgid "Subject:"
+msgstr "Betreff:"
+
+msgid "Message text:"
+msgstr "Nachrichtentext:"
+
+msgid "Send"
+msgstr "Senden"
+
+msgid "Subject and body cannot be empty"
+msgstr "Betreff und Text dürfen nicht leer sein"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Paket mailsend ist nicht installiert. Bitte installieren Sie es zuerst mit der Schaltfläche Installieren... unten"
+
+msgid "Select modem"
+msgstr "Modem auswählen"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Das Ändern eines Modems erfordert das Aktualisieren der Nachrichten"
+
+msgid "Defined AT command files"
+msgstr "Definierte AT-Befehlsdateien"
+
+msgid "Defined USSD code files"
+msgstr "Definierte USSD-Code-Dateien"
+
+msgid "File uploaded and saved to"
+msgstr "Datei hochgeladen und gespeichert in"
+
+msgid "Unable to upload file"
+msgstr "Datei konnte nicht hochgeladen werden"
+
+msgid "Phonebook saved successfully"
+msgstr "Telefonbuch erfolgreich gespeichert"
+
+msgid "Unable to save the file"
+msgstr "Datei konnte nicht gespeichert werden"
+
+msgid "filename.user"
+msgstr "dateiname.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Datei zum Bearbeiten auswählen oder erstellen..."
+
+msgid "Please enter a file name"
+msgstr "Bitte Dateinamen eingeben"
+
+msgid "File created successfully"
+msgstr "Datei erfolgreich erstellt"
+
+msgid "Unable to create file"
+msgstr "Datei konnte nicht erstellt werden"
+
+msgid "Please select a file to delete"
+msgstr "Bitte Datei zum Löschen auswählen"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Möchten Sie diese Datei wirklich löschen?"
+
+msgid "File deleted successfully"
+msgstr "Datei erfolgreich gelöscht"
+
+msgid "Select or create a file to edit..."
+msgstr "Datei zum Bearbeiten auswählen oder erstellen..."
+
+msgid "Unable to delete file"
+msgstr "Datei konnte nicht gelöscht werden"
+
+msgid "Please select or create a file first"
+msgstr "Bitte zuerst eine Datei auswählen oder erstellen"
+
+msgid "File saved successfully"
+msgstr "Datei erfolgreich gespeichert"
+
+msgid "Unable to save file"
+msgstr "Datei konnte nicht gespeichert werden"
+
+msgid "Load .user file"
+msgstr ".user-Datei laden"
+
+msgid "Save .user file"
+msgstr ".user-Datei speichern"
+
+msgid "Please select a file to delete"
+msgstr "Bitte Datei zum Löschen auswählen"
+
+msgid "Manage contacts"
+msgstr "Kontakte verwalten"
+
+msgid "Edit User Contacts"
+msgstr "Benutzerkontakte bearbeiten"
+
+msgid "Manage USSD codes"
+msgstr "USSD-Codes verwalten"
+
+msgid "Manage User USSD Codes"
+msgstr "Benutzer-USSD-Codes verwalten"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Jede Zeile muss folgendes Format haben: 'Code-Beschreibung;Code'. Zur Benutzerfreundlichkeit wird die Datei unter /etc/modem/ussdcodes/ gespeichert."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Jede Zeile muss folgendes Format haben: 'AT-Befehl-Beschreibung;AT-Befehl'. Zur Benutzerfreundlichkeit wird die Datei unter /etc/modem/atcmmds/ gespeichert."
+
+msgid "Manage AT commands"
+msgstr "AT-Befehle verwalten"
+
+msgid "Manage User AT Commands"
+msgstr "Benutzer-AT-Befehle verwalten"
+
+msgid "-- Select file --"
+msgstr "-- Datei auswählen --"
+
+msgid "Select file"
+msgstr "Datei auswählen"
+
+msgid "New file name"
+msgstr "Neuer Dateiname"
+
+msgid "Delete selected file"
+msgstr "Ausgewählte Datei löschen"
+
+msgid "Select file with AT commands to load"
+msgstr "Datei mit AT-Befehlen zum Laden auswählen"
+
+msgid "Error loading AT commands file: "
+msgstr "Fehler beim Laden der AT-Befehlsdatei: "
+
+msgid "No AT commands available"
+msgstr "Keine AT-Befehle verfügbar"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Fehler beim Laden der initialen AT-Befehlsdatei:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Fehler beim Laden der USSD-Codedatei: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Fehler beim Laden der initialen USSD-Datei:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Datei mit USSD-Codes zum Laden auswählen"
+
+msgid "No USSD codes available"
+msgstr "Keine USSD-Codes verfügbar"
+
+msgid "Show notification icon"
+msgstr "Benachrichtigungssymbol anzeigen"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Das Benachrichtigungssymbol für neue Nachrichten auf der Statusübersichtsseite anzeigen."
+
+msgid "Loading..."
+msgstr "Wird geladen..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modems"
+
+msgid "Signal Quality"
+msgstr "Signalqualität"
+
+msgid "Align preview to:"
+msgstr "Vorschau ausrichten auf:"
+
+msgid "Left"
+msgstr "Links"
+
+msgid "Center"
+msgstr "Mitte"
+
+msgid "Right"
+msgstr "Rechts"
+
+msgid "New message information block settings"
+msgstr "Einstellungen des Informationsblocks für neue Nachrichten"
+
+msgid "Alignment settings saved successfully"
+msgstr "Ausrichtungseinstellungen erfolgreich gespeichert"
+
+msgid "SMS Info"
+msgstr "SMS-Info"
+
+msgid "New SMS"
+msgstr "Neue SMS"
+
+msgid "No new SMS"
+msgstr "Keine neuen SMS"
+
+msgid "Deleting files"
+msgstr "Dateien werden gelöscht"
+
+msgid "Delete all files"
+msgstr "Alle Dateien löschen"
+
+msgid "Load .gz archive"
+msgstr ".gz-Archiv laden"
+
+msgid "Save .gz archive"
+msgstr ".gz-Archiv speichern"
+
+msgid "File uploaded and saved to"
+msgstr "Datei hochgeladen und gespeichert unter"
+
+msgid "Failed to extract archive"
+msgstr "Archiv konnte nicht entpackt werden"
+
+msgid "Archive extracted to"
+msgstr "Archiv entpackt nach"
+
+msgid "Upload error"
+msgstr "Upload-Fehler"
+
+msgid "Failed to create archive"
+msgstr "Archiv konnte nicht erstellt werden"
+
+msgid "Failed to read archive"
+msgstr "Archiv konnte nicht gelesen werden"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Möchten Sie wirklich alle Dateien im Ordner löschen?"
+
+msgid "All files deleted successfully"
+msgstr "Alle Dateien wurden erfolgreich gelöscht"
+
+msgid "Call Log"
+msgstr "Anrufliste"
+
+msgid "Clear all call log entries?"
+msgstr "Alle Einträge in der Anrufliste löschen?"
+
+msgid "No call log entries found"
+msgstr "Keine Einträge in der Anrufliste gefunden"
+
+msgid "No matching call log entries found"
+msgstr "Keine passenden Einträge in der Anrufliste gefunden"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Benutzeroberfläche zur Anzeige von Anruflisten. Die Liste wird von einem Hintergrund-Daemon gesammelt."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Der Anruflisten-Daemon ist deaktiviert. Bitte in der Konfiguration aktivieren, um die Protokollierung zu starten."
+
+msgid "Filter call type"
+msgstr "Anruftyp filtern"
+
+msgid "All calls"
+msgstr "Alle Anrufe"
+
+msgid "Missed calls"
+msgstr "Verpasste Anrufe"
+
+msgid "Received calls"
+msgstr "Angenommene Anrufe"
+
+msgid "Dialed calls"
+msgstr "Gewählte Nummern"
+
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+msgid "Clear Log"
+msgstr "Liste leeren"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Type"
+msgstr "Typ"
+
+msgid "Number"
+msgstr "Nummer"
+
+msgid "Duration"
+msgstr "Dauer"
+
+msgid "Name"
+msgstr "Name"
+
+msgid "Call log reading port"
+msgstr "Port zum Auslesen der Anrufliste"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Wählen Sie einen der verfügbaren ttyUSBX-Ports aus."
+
+msgid "Please select a port"
+msgstr "Bitte wählen Sie einen Port aus"
+
+msgid "Enable call log daemon"
+msgstr "Anruflisten-Daemon aktivieren"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Hintergrundprozess zur Protokollierung eingehender und verpasster Anrufe."
+
+msgid "Call Log Settings"
+msgstr "Anruflisten-Einstellungen"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Hintergrundprozess zur Protokollierung eingehender und verpasster Anrufe.
Wichtig Option für Qualcomm-Modems, die keinen internen Anrufverlaufsspeicher haben und den Standard-AT+CPBR-Befehl nicht unterstützen. Durch Aktivieren dieser Option wird eine neue Registerkarte hinzugefügt. Wenn die Registerkarte nicht erscheint, leeren Sie den Browser-Cache und starten Sie den Router neu."
+
+msgid "Forward SMS"
+msgstr "SMS weiterleiten"
+
+msgid "Calls"
+msgstr "Anrufe"
+
+msgid "Notification Settings"
+msgstr "Benachrichtigungseinstellungen"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "Die LED informiert über eine neue Nachricht. Bevor Sie diese Funktion aktivieren, konfigurieren und speichern Sie bitte den SMS-Leseport, die Zeit zur Überprüfung des SMS-Posteingangs und wählen Sie die Benachrichtigungs-LED aus."
+
+msgid "Check inbox every minute(s)"
+msgstr "Posteingang alle Minute(n) prüfen"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Geben Sie an, alle wie viele Minuten der Posteingang auf neue Nachrichten geprüft werden soll."
+
+msgid "Notification LED"
+msgstr "Benachrichtigungs-LED"
+
+msgid "Select the notification LED."
+msgstr "Wählen Sie die Benachrichtigungs-LED aus."
+
+msgid "Notify new messages"
+msgstr "Benachrichtigung über neue Nachrichten"
+
+msgid "Restart the inbox checking process every"
+msgstr "Prozess zur Posteingangsprüfung neu starten alle"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Der Prozess wird im gewählten Zeitintervall neu gestartet. Dies eliminiert Verzögerungen bei der Posteingangsprüfung."
+
+msgid "4h"
+msgstr "4 Std."
+
+msgid "6h"
+msgstr "6 Std."
+
+msgid "8h"
+msgstr "8 Std."
+
+msgid "12h"
+msgstr "12 Std."
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Die Diode ist nur für diese Benachrichtigungen reserviert"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Wählen Sie 'Nein', falls der Router nur eine LED hat oder wenn die LED mehrfach belegt ist.
Wichtig Diese Option erfordert die Definition der LED im System (falls möglich), um ordnungsgemäß zu funktionieren. Dies gilt, wenn die Diode mehrere Aufgaben unterstützt."
+
+msgid "Force EHLO"
+msgstr "EHLO erzwingen"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Erzwingt, dass mailsend immer EHLO verwendet, anstatt HELO/EHLO automatisch zu erkennen. Nur aktivieren, wenn die Weiterleitung fehlschlägt, da manche Server (z. B. Unternehmens-Gateways, Microsoft 365 / Exchange Online Protection) die ESMTP-Unterstützung nicht korrekt ankündigen, wodurch STARTTLS/Authentifizierung nicht funktioniert."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Die Unicode-Kodierung (standardmäßig 70 Zeichen) unterstützt die Übertragung nationaler Sonderzeichen und mehrteiliger SMS-Nachrichten"
+
+msgid "Not applicable"
+msgstr "Nicht zutreffend"
diff --git a/luci-app-sms-tool-js/po/es/sms-tool-js.po b/luci-app-sms-tool-js/po/es/sms-tool-js.po
new file mode 100644
index 000000000..a3ce65849
--- /dev/null
+++ b/luci-app-sms-tool-js/po/es/sms-tool-js.po
@@ -0,0 +1,965 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: es\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "SMS Messages"
+msgstr "Mensajes SMS"
+
+msgid "Received Messages"
+msgstr "Mensajes Recibidos"
+
+msgid "Send Messages"
+msgstr "Enviar mensajes"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Remitente"
+
+msgid "Received"
+msgstr "Recibido"
+
+msgid "Message"
+msgstr "Mensaje"
+
+msgid "Configuration"
+msgstr "Configuración"
+
+msgid "AT Commands"
+msgstr "Comandos AT"
+
+msgid "Configuration"
+msgstr "Configuración"
+
+msgid "Please enter phone number"
+msgstr "Por favor, ingrese el número de teléfono"
+
+msgid "Please enter a message text"
+msgstr "Por favor, ingrese el texto del mensaje"
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Please enter a USSD code"
+msgstr "Por favor, ingrese un código USSD"
+
+msgid "USSD Codes"
+msgstr "Códigos USSD"
+
+msgid "Send to"
+msgstr "Enviar a"
+
+msgid "Message text"
+msgstr "Texto del mensaje"
+
+msgid "Send"
+msgstr "Enviar"
+
+msgid "Send to number"
+msgstr "Enviar al número"
+
+msgid "to number"
+msgstr "al número"
+
+msgid "to group"
+msgstr "al Grupo"
+
+msgid "SMS sent sucessfully"
+msgstr "Se envió el SMS con exito"
+
+msgid "Code to send"
+msgstr "Códiugo a enviar"
+
+msgid "Send code"
+msgstr "Enviar código"
+
+msgid "SMS Settings"
+msgstr "Configuración de SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Ajustes de códigos USSD"
+
+msgid "SMS reading port"
+msgstr "Puerto de lectura para los SMS"
+
+msgid "SMS sending port"
+msgstr "Puerto de envío para los SMS"
+
+msgid "AT commands sending port"
+msgstr "Comandos AT para el puerto de envío"
+
+msgid "AT Commands Settings"
+msgstr "Ajustes de comandos AT"
+
+msgid "Merge split messages"
+msgstr "Concatenar mensajes divididos"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Al marcar esta opción, le será más sencillo leer los mensajes, sin embargo, causará discrepancias entre el número de mensajes mostrados y recibidos."
+
+msgid "USSD sending port"
+msgstr "Puerto de envío de códigos USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Código USSD de envío en texto plano"
+
+msgid "Receive message without PDU decoding"
+msgstr "Recibir mensaje sin decodificación PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Enviar el código USSD en texto plano. El comando no está siendo codificado al PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Recibir y mostrar el mensaje sin decodificarlo como un PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Explicación del número y el prefijo"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "En la pestaña de envío de SMS, mostrar una explicación del prefico y el número telefónico correcto."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "El número telefónico debe estar precedido por el código de país (para Polonia es 48, sin el '+'). Si el número telefónico tiene 5, 4 ó 3 caracteres de longitud, se considera 'corto' y no debe estar precedido por un código de país."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "El número telefónico debe estar precedido por el código de país (para Polonia es 48, sin el '+'). Si el número telefónico tiene 5, 4 ó 3 caracteres de longitud, se considera como.. corto y no debe estar precedido por un código de país."
+
+msgid "Add prefix to phone number"
+msgstr "Añadir prefijo al número telefónico"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Añ́adir el prefijo automáticamente al campo de número telefónico."
+
+msgid "Prefix number"
+msgstr "Número del prefijo"
+
+msgid "Please specify the command to send"
+msgstr "Por favor, especifique el comando a enviar"
+
+msgid "Please specify the code to send"
+msgstr "Por favor, especifique el código a enviar"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Por favor, establezca el puerto para la comunicación con el módem"
+
+msgid "User AT commands"
+msgstr "Comandos AT de usuario"
+
+msgid "Command to send"
+msgstr "Comando a enviar"
+
+msgid "Clear form"
+msgstr "Limpiar formulario"
+
+msgid "Send command"
+msgstr "Enviar comando"
+
+msgid "Send code"
+msgstr "Enviar código"
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Message storage area"
+msgstr "Área de almacenamiento de mensajes"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Los mensajes se almacenan en un lugar específico (por ejemplo, en la tarjeta SIM o la memoria del módem), pero dependiendo del tipo de dispositivo, otras áreas podrían estar disponibles."
+
+msgid "SIM card"
+msgstr "Tarjeta SIM"
+
+msgid "Modem memory"
+msgstr "Memoria del módem"
+
+msgid "Storage used / Total capacity"
+msgstr "Almacenamiento utilizado / Capacidad total"
+
+msgid "Delete selected"
+msgstr "Eliminar los seleccionados"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+msgid "Delete all"
+msgstr "Eliminar todos"
+
+msgid "Refresh"
+msgstr "Actualizar"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Por favor, seleccione el/los mensaje(s) a eliminar"
+
+msgid "Delete selected message(s)?"
+msgstr "¿Eliminar mensaje(s) seleccionado(s)?"
+
+msgid "Delete all the messages?"
+msgstr "¿Eliminar todos los mensajes?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaz de usuario para lectura de mensajes utilizando sms-tool. Puede encontrar más información sobre sms-tool en el foro %seko.one.pl."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaz de usuario para envío de mensajes utilizando sms-tool. Puede encontrar más información sobre sms-tool en el foro %seko.one.pl."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaz de usuario para envío de comandos AT utilizando sms-tool. Puede encontrar más información sobre sms-tool en el foro %seko.one.pl."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaz de usuario para envío de códigos USSD utilizando sms-tool. Puede encontrar más información sobre sms-tool en el foro %seko.one.pl."
+
+msgid "Configuration sms-tool"
+msgstr "Configuración de sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Panel de configuración para sms-tool y aplicación GUI."
+
+msgid "Port for communication with the modem"
+msgstr "Puerto para comunicación con el módem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Seleccione uno de los puertos ttyUSBX disponibles."
+
+msgid "Please select a port"
+msgstr "Por favor, seleccione un puerto"
+
+msgid "User contacts"
+msgstr "Contactos de usuario"
+
+msgid "Enable group messaging"
+msgstr "Habilitar el envío a grupos"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Esta opción le permite enviar un solo mensaje a todos los contactos en la lista de contactos del usuario."
+
+msgid "Message sending delay"
+msgstr "Retraso de envío de mensajes"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Mensaje enviado al número:"
+
+msgid "User USSD codes"
+msgstr "Códigos USSD de usuario"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Cada línea debe tener el siguiente formato: 'Nombre del contacto;Número telefónico'. Para conveniencia del usuario, el archivo se guara en la ubicación /etc/modem/phonebook.user."
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "Cada línea debe tener el siguiente formato: 'Descripción del comando AT;Comando AT'. Para conveniencia del usuario, el archivo se guara en la ubicación /etc/modem/atcmmds.user."
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "Cada línea debe tener el siguiente formato: 'Descripción del código;Código'. Para conveniencia del usuario, el archivo se guara en la ubicación /etc/modem/ussdcodes.user."
+
+msgid "Display new messages notification on login page"
+msgstr "Mostrar una notificación de mensajes nuevos en la página de inicio de sesión"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Mostrar una notificación cuando lleguen nuevos mensajes en el área de mensajes seleccionada."
+
+msgid "new message"
+msgstr "Nuevo mensaje"
+
+msgid "new messages"
+msgstr "Nuevos mensajes"
+
+msgid "All"
+msgstr "Todos"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Read"
+msgstr "Leídos"
+
+msgid "Unread"
+msgstr "No leídos"
+
+msgid "All / Read / Unread"
+msgstr "Todos / Leídos / No leídos"
+
+msgid "Show all, read or unread messages"
+msgstr "Mostrar todos los mensajes, leídos o no leídos"
+
+msgid "Show system messages in the message list"
+msgstr "Mostrar mensajes del sistema en la lista de mensajes"
+
+msgid "Mark as read"
+msgstr "Marcar como leído"
+
+msgid "Mark as unread"
+msgstr "Marcar como no leído"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Por favor, seleccione el/los mensaje(s) a marcar como leído(s)"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Por favor, seleccione el/los mensaje(s) a marcar como no leído(s)"
+
+msgid "Mark selected message(s) as read?"
+msgstr "¿Marcar el/los mensaje(s) seleccionado(s) como leído(s)?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "¿Marcar el/los mensaje(s) seleccionado(s) como no leído(s)?"
+
+msgid "Message marked as read"
+msgstr "El mensaje se marcó como leído"
+
+msgid "Messages marked as read"
+msgstr "Se marcaron los mensajes como leídos"
+
+msgid "Message marked as unread"
+msgstr "El mensaje se marcó como no leído"
+
+msgid "Messages marked as unread"
+msgstr "Se marcaron los mensajes como no leídos"
+
+msgid "System messages"
+msgstr "Mensajes del sistema"
+
+msgid "Diode"
+msgstr "Diodo"
+
+msgid "New messages notification LED"
+msgstr "LED para notificación de nuevos mensajes"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "Habilitar el LED de notificación para nuevo mensaje"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Habilitar el LED de notificación cuando lleguen nuevos mensajes al área de mensajes seleccionada."
+
+msgid "Selected LED"
+msgstr "LED Seleccionado"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Seleccione un diodo LED para la notificación de nuevos mensajes. La selección se hace a partir de los diodos LED disponibles en el sistema"
+
+msgid "Automatically select LED"
+msgstr "Seleccionar LED automáticamente"
+
+msgid "Automatically select the first available LED."
+msgstr "Seleccionar automáticamente el primer LED."
+
+msgid "Advanced settings"
+msgstr "Ajustes avanzados"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "Intervalo de parpadeo del LED (en segundos)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "Establecer el intervalo de parpadeo del LED (en segundos)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Duración del parpadeo (en segundos)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Establecer la duración del parpadeo (en segundos). Establezca a 0 para duración infinita (el LED parpadeará hasta que los mensajes se marquen como leídos)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Por favor espere... Se están guardando los mensajes SMS a un archivo de texto."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Esta opción permite respaldar los mensajes SMS, o, por ejemplo, guardar los mensajes que no están soportados por sms-tool."
+
+msgid "Delete all messages"
+msgstr "Eliminar todos los mensajes"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Esta opción le permite eliminar todos los mensajes SMS cuando no son visibles en la pestaña 'Mensajes Recibidos'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Fallo al guardar los mensajes a un archivo. Por favor, intente de nuevo"
+
+msgid "PDU decoding scheme"
+msgstr "Esquema de decodificación PDU"
+
+msgid "Autodetect"
+msgstr "Autodetectar"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Mantener la respuesta anterior cuando se envíe un nuevo código USSD."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Marque esta opción si necesita utilizar el menú construido en los códigos USSD"
+
+msgid "Turn over the replies."
+msgstr "Alternar orden de las respuestas."
+
+msgid "View new reply from top"
+msgstr "Mostrar respuestas nuevas arriba"
+
+msgid "Please wait... deleted"
+msgstr "Por favor esperen... eliminado"
+
+msgid "of"
+msgstr "de"
+
+msgid "selected messages"
+msgstr "mensajes seleccionados"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"El paquete requiere configuración del usuario.
Los siguientes elementos "
+"deben configurarse:
1. Todos los puertos de comunicación con el módem.
2. Opciones "
+"adicionales específicas para el módem (para el manejo de códigos USSD).
3. LED de notificación (opcional).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Cualquier cambio en el área desde donde los mensajes serán leídos requiere refrescar los mensajes"
+
+msgid "Characters remaining:"
+msgstr "Caracteres restantes:"
+
+msgid "Encoding standard"
+msgstr "Estándar de codificación"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 caracteres)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 caracteres)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Codificación GSM-7 (160 caracteres)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Codificación Unicode (70 caracteres), no soporta enviar caracteres nacionales (en utf8) - sólo ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Esta pestaña permite a los usuarios darle apoyo al paquete"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Información de luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Reportar un problema"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Escriba en el asunto del paquete en el foro eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Escribir en el foro"
+
+msgid "Report a bug on the package Github page"
+msgstr "Reporte un problema con el paquete en la página Github del mismo"
+
+msgid "Open a package discussion on Github"
+msgstr "Abrir una discusión sobre el paquete en Github"
+
+msgid "Open discussion"
+msgstr "Abrir discusión"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Compre un café si desea apoyar el desarrollo del proyecto y al autor"
+
+msgid "Buy a coffee"
+msgstr "Comprar un café"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Vuélvase patrocinador si quiere apoyar el desarrollo del proyecto y al autor"
+
+msgid "Become a sponsor"
+msgstr "Volverme patrocinador"
+
+msgid "Package Info"
+msgstr "Información del paquete"
+
+msgid "Author (package maintainer)"
+msgstr "Autor (mantenedor del paquete)"
+
+msgid "Package update and support"
+msgstr "Actualizaciones y soporte al paquete"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Ajustes de reenvío de SMS a correo electrónico"
+
+msgid "An e-mail will be sent.."
+msgstr "Se enviará un correo electrónico.."
+
+msgid "Enable message forwarding"
+msgstr "Habilitar el reenvío de correo electrónico"
+
+msgid "E-mail settings"
+msgstr "Ajustes de correo electrónico"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Seleccione unos ajustes predefinidos para el correo o ingrese los mismos manualmente."
+
+msgid "Recipient"
+msgstr "Recipiente"
+
+msgid "E-mail address of the recipient."
+msgstr "Dirección de correo del recipiente."
+
+msgid "Sender"
+msgstr "Remitente"
+
+msgid "E-mail address of the sender."
+msgstr "Dirección de correo electrónico del remitente."
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Username for SMTP authentication."
+msgstr "Usuario para la autenticación SMTP."
+
+msgid "Password"
+msgstr "Contraseña"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Contraseña de app Google / Contraseña para autenticación SMTP."
+
+msgid "SMTP server"
+msgstr "Servidor SMTP"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Nombre de host/Dirección IP del servidor SMTP."
+
+msgid "SMTP server port"
+msgstr "Puerto del servidor SMTP"
+
+msgid "Security"
+msgstr "Seguridad"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: utilizar STARTTLS si el servidor lo soporta."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP sobre SSL."
+
+msgid "Required Package"
+msgstr "Paquete requerido"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "La opción de reenvío de SMS requiere que el paquete mailsend esté instalado."
+
+msgid "Check required packages"
+msgstr "Chequear paquetes requeridos"
+
+msgid "Check"
+msgstr "Chequear"
+
+msgid "Mailsend Package"
+msgstr "Paquete Mailsend"
+
+msgid "Loading package data…"
+msgstr "Cargando datos de paquetes…"
+
+msgid "Installed"
+msgstr "Instalado"
+
+msgid "Install…"
+msgstr "Instalar…"
+
+msgid "Mailsend Package"
+msgstr "Paquete Mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Seleccione exactamente un mensaje para reenviar"
+
+msgid "Forward selected message to e-mail?"
+msgstr "¿Reenviar el mensaje seleccionado por correo electrónico?"
+
+msgid "Sending e-mail..."
+msgstr "Enviando correo electrónico..."
+
+msgid "Message forwarded successfully"
+msgstr "El mensaje se reenvío exitosamente"
+
+msgid "Failed to forward message: %s"
+msgstr "Fallo al reenviar el mensaje: %s"
+
+msgid "Error: %s"
+msgstr "Error: %s"
+
+msgid "user define"
+msgstr "definido por el usuario"
+
+msgid "Forward"
+msgstr "Reenviar"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Por favor, seleccione el/los mensaje(s) a ser reenviado(s)"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "La función de reenvío de mensajes no está activada. Por favor, configure la misma primero"
+
+msgid "My Router"
+msgstr "Mi Router"
+
+msgid "Forward SMS to E-mail"
+msgstr "Reenvíar SMS a Correo electrónico"
+
+msgid "Subject:"
+msgstr "Asunto:"
+
+msgid "Message text:"
+msgstr "Texto del mensaje:"
+
+msgid "Send"
+msgstr "Enviar"
+
+msgid "Subject and body cannot be empty"
+msgstr "El asunto y el cuerpo del mensaje no pueden estar vacíos"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "El paquete mailsend no está instalado. Por favor, instálelo de primero utilizando el botón Instalar... debajo"
+
+msgid "Select modem"
+msgstr "Seleccionar módem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Cambiar el módem requiere refrescar los mensajes"
+
+msgid "Defined AT command files"
+msgstr "Archivo de comandos AT definido"
+
+msgid "Defined USSD code files"
+msgstr "Archivo de códigos USSD definido"
+
+msgid "File uploaded and saved to"
+msgstr "El archivo fue cargado y guardado en"
+
+msgid "Unable to upload file"
+msgstr "No fue posible cargar el archivo"
+
+msgid "Phonebook saved successfully"
+msgstr "Se guardo la libreta telefónica exitosamente"
+
+msgid "Unable to save the file"
+msgstr "No fue posible guardar el archivo"
+
+msgid "filename.user"
+msgstr "archivo.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Seleccione o cree un archivo a editar..."
+
+msgid "Please enter a file name"
+msgstr "Por favor, ingrese un nombre de archivo"
+
+msgid "File created successfully"
+msgstr "El archivo fue creado exitosamente"
+
+msgid "Unable to create file"
+msgstr "No fue posible crear el archivo"
+
+msgid "Please select a file to delete"
+msgstr "Por favor, seleccione un archivo a eliminar"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "¿Está seguro de que quiere eliminar este archivo?"
+
+msgid "File deleted successfully"
+msgstr "Se borró el archivo exitosamente"
+
+msgid "Select or create a file to edit..."
+msgstr "Seleccione o cree un archivo a editar..."
+
+msgid "Unable to delete file"
+msgstr "No fue posible eliminar el archivo"
+
+msgid "Please select or create a file first"
+msgstr "Por favor, seleccione o cree un archivo primero"
+
+msgid "File saved successfully"
+msgstr "Se guardó el archivo exitosamente"
+
+msgid "Unable to save file"
+msgstr "No fue posible guardar el archivo"
+
+msgid "Load .user file"
+msgstr "cargar archivo .user"
+
+msgid "Save .user file"
+msgstr "Guardar archivo .user"
+
+msgid "Please select a file to delete"
+msgstr "Por favor, seleccione un archivo a eliminar"
+
+msgid "Manage contacts"
+msgstr "Administrar contactos"
+
+msgid "Edit User Contacts"
+msgstr "Editar contactos de Usuario"
+
+msgid "Manage USSD codes"
+msgstr "Administrar códigos USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Administrar códigos USSD de Usuario"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Cada línea debe tener el siguiente formato: 'Descripción del código;Código'. Para conveniencia del usuario, el archivo se guarda en la ubicación /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Cada línea debe tener el siguiente formato: 'Descripción del comando AT;Comando AT'. Para conveniencia del usuario, el archivo se guarda en la ubicación /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Administrar comandos AT"
+
+msgid "Manage User AT Commands"
+msgstr "Administrar comandos AT del Usuario"
+
+msgid "-- Select file --"
+msgstr "-- Seleccione el archivo --"
+
+msgid "Select file"
+msgstr "Seleccione el archivo"
+
+msgid "New file name"
+msgstr "Nuevo nombre de archivo"
+
+msgid "Delete selected file"
+msgstr "Eliminar archivo seleccionado"
+
+msgid "Select file with AT commands to load"
+msgstr "Seleccione el archivo con comandos AT a cargar"
+
+msgid "Error loading AT commands file: "
+msgstr "Error al cargar el archivo de comandos AT: "
+
+msgid "No AT commands available"
+msgstr "No hay comandos AT disponibles"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Error al cargar el archivo de comandos AT iniciales:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Error al cargar el archivo de códigos USSD: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Error al cargar el archivo inicial USSD:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Seleccione el archivo con códigos USSD a cargar"
+
+msgid "No USSD codes available"
+msgstr "No hay códigos USSD disponibles"
+
+msgid "Show notification icon"
+msgstr "Mostrar ícono de notificación"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Mostrar la notificación de mensaje nuevo en la página de estado general."
+
+msgid "Loading..."
+msgstr "Cargando..."
+
+msgid "Modem"
+msgstr "Módem"
+
+msgid "Modems"
+msgstr "Módems"
+
+msgid "Signal Quality"
+msgstr "Calidad de la señal"
+
+msgid "Align preview to:"
+msgstr "Alinear vista previa a:"
+
+msgid "Left"
+msgstr "Izquierda"
+
+msgid "Center"
+msgstr "Centro"
+
+msgid "Right"
+msgstr "Derecha"
+
+msgid "New message information block settings"
+msgstr "Ajustes del bloque de información de nuevos mensajes"
+
+msgid "Alignment settings saved successfully"
+msgstr "Los ajustes de alineación se guardaron exitosamente"
+
+msgid "SMS Info"
+msgstr "Info de SMS"
+
+msgid "New SMS"
+msgstr "Nuevo SMS"
+
+msgid "No new SMS"
+msgstr "No hay SMS nuevos"
+
+msgid "Deleting files"
+msgstr "Eliminando archivos"
+
+msgid "Delete all files"
+msgstr "Eliminar todos los archivos"
+
+msgid "Load .gz archive"
+msgstr "Cargar archivo .gz"
+
+msgid "Save .gz archive"
+msgstr "Guardar archivo .gz"
+
+msgid "File uploaded and saved to"
+msgstr "El archivo fue cargado y guardado en"
+
+msgid "Failed to extract archive"
+msgstr "Fallo al extraer archivo"
+
+msgid "Archive extracted to"
+msgstr "El archivador fue extraído en"
+
+msgid "Upload error"
+msgstr "Error de carga"
+
+msgid "Failed to create archive"
+msgstr "Fallo al crear el archivador"
+
+msgid "Failed to read archive"
+msgstr "Fallo al leer el archivador"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "¿Está seguro que quiere borrar todos los archivos en esta carpeta?"
+
+msgid "All files deleted successfully"
+msgstr "Se eliminaron todos los archivos exitosamente"
+
+msgid "Call Log"
+msgstr "Registro de llamadas"
+
+msgid "Clear all call log entries?"
+msgstr "¿Borrar todas las entradas del registro de llamadas?"
+
+msgid "No call log entries found"
+msgstr "No se encontraron entradas en el registro"
+
+msgid "No matching call log entries found"
+msgstr "No se encontraron entradas coincidentes"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Interfaz de usuario para ver los registros de llamadas. El registro es recopilado por un demonio en segundo plano."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "El demonio del registro de llamadas está desactivado. Actívelo en la configuración para empezar a registrar llamadas."
+
+msgid "Filter call type"
+msgstr "Filtrar tipo de llamada"
+
+msgid "All calls"
+msgstr "Todas las llamadas"
+
+msgid "Missed calls"
+msgstr "Llamadas perdidas"
+
+msgid "Received calls"
+msgstr "Llamadas recibidas"
+
+msgid "Dialed calls"
+msgstr "Llamadas realizadas"
+
+msgid "Refresh"
+msgstr "Actualizar"
+
+msgid "Clear Log"
+msgstr "Limpiar registro"
+
+msgid "Date"
+msgstr "Fecha"
+
+msgid "Type"
+msgstr "Tipo"
+
+msgid "Number"
+msgstr "Número"
+
+msgid "Duration"
+msgstr "Duración"
+
+msgid "Name"
+msgstr "Nombre"
+
+msgid "Call log reading port"
+msgstr "Puerto de lectura del registro de llamadas"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Seleccione uno de los puertos ttyUSBX disponibles."
+
+msgid "Please select a port"
+msgstr "Por favor, seleccione un puerto"
+
+msgid "Enable call log daemon"
+msgstr "Activar demonio de registro de llamadas"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Proceso en segundo plano para registrar llamadas entrantes y perdidas."
+
+msgid "Call Log Settings"
+msgstr "Ajustes del registro de llamadas"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Proceso en segundo plano para registrar llamadas entrantes y perdidas.
Importante Opción dedicada a módems Qualcomm que no tienen memoria interna de historial de llamadas y no admiten el comando estándar AT+CPBR. Habilitar esta opción añade una nueva pestaña. Si la pestaña dedicada no aparece, borre la caché del navegador y reinicie el router."
+
+msgid "Forward SMS"
+msgstr "Reenviar SMS"
+
+msgid "Calls"
+msgstr "Llamadas"
+
+msgid "Notification Settings"
+msgstr "Configuración de notificaciones"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "El LED informa sobre un mensaje nuevo. Antes de activar esta función, configure y guarde el puerto de lectura de SMS, el tiempo de verificación de la bandeja de entrada de SMS y seleccione el LED de notificación."
+
+msgid "Check inbox every minute(s)"
+msgstr "Revisar bandeja de entrada cada minuto(s)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Especifique cada cuántos minutos desea que se revise su bandeja de entrada."
+
+msgid "Notification LED"
+msgstr "LED de notificación"
+
+msgid "Select the notification LED."
+msgstr "Seleccione el LED de notificación."
+
+msgid "Notify new messages"
+msgstr "Notificar nuevos mensajes"
+
+msgid "Restart the inbox checking process every"
+msgstr "Reiniciar el proceso de revisión cada"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "El proceso se reiniciará en el intervalo de tiempo seleccionado. Esto eliminará el retraso en la revisión de su bandeja de entrada."
+
+msgid "4h"
+msgstr "4h"
+
+msgid "6h"
+msgstr "6h"
+
+msgid "8h"
+msgstr "8h"
+
+msgid "12h"
+msgstr "12h"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "El diodo está dedicado solo a estas notificaciones"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Seleccione 'No' en caso de que el router tenga solo un LED o si el LED es multitarea.
Importante Esta opción requiere que el LED esté definido en el sistema (si es posible) para funcionar correctamente. Este requisito se aplica cuando el diodo admite múltiples tareas."
+
+msgid "Force EHLO"
+msgstr "Forzar EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Obliga a mailsend a usar siempre EHLO en lugar de detectar automáticamente HELO/EHLO. Actívelo solo si el reenvío falla, ya que algunos servidores (por ejemplo, pasarelas corporativas, Microsoft 365 / Exchange Online Protection) no anuncian correctamente la compatibilidad con ESMTP, lo que impide que funcionen STARTTLS/autenticación."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "La codificación Unicode (70 caracteres por defecto) admite la transmisión de caracteres nacionales y mensajes SMS multiparte"
+
+msgid "Not applicable"
+msgstr "No aplicable"
diff --git a/luci-app-sms-tool-js/po/fr/sms-tool-js.po b/luci-app-sms-tool-js/po/fr/sms-tool-js.po
new file mode 100644
index 000000000..b14d453ed
--- /dev/null
+++ b/luci-app-sms-tool-js/po/fr/sms-tool-js.po
@@ -0,0 +1,965 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: fr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "SMS Messages"
+msgstr "Messages SMS"
+
+msgid "Received Messages"
+msgstr "Messages reçus"
+
+msgid "Send Messages"
+msgstr "Envoyer des messages"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Expéditeur"
+
+msgid "Received"
+msgstr "Reçu"
+
+msgid "Message"
+msgstr "Message"
+
+msgid "Configuration"
+msgstr "Paramètres"
+
+msgid "AT Commands"
+msgstr "Commandes AT"
+
+msgid "Configuration"
+msgstr "Configuration"
+
+msgid "Please enter phone number"
+msgstr "Veuillez saisir le numéro de téléphone"
+
+msgid "Please enter a message text"
+msgstr "Veuillez saisir le texte du message"
+
+msgid "Reply"
+msgstr "Réponse"
+
+msgid "Please enter a USSD code"
+msgstr "Veuillez saisir le code USSD"
+
+msgid "USSD Codes"
+msgstr "Codes USSD"
+
+msgid "Send to"
+msgstr "Envoyer à"
+
+msgid "Message text"
+msgstr "Texte du message"
+
+msgid "Send"
+msgstr "Envoyer"
+
+msgid "Send to number"
+msgstr "Envoyer au numéro"
+
+msgid "to number"
+msgstr "au numéro"
+
+msgid "to group"
+msgstr "au groupe"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS envoyé avec succès"
+
+msgid "Code to send"
+msgstr "Code à envoyer"
+
+msgid "Send code"
+msgstr "Envoyer le code"
+
+msgid "SMS Settings"
+msgstr "Paramètres SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Paramètres des codes USSD"
+
+msgid "SMS reading port"
+msgstr "Port de lecture des SMS"
+
+msgid "SMS sending port"
+msgstr "Port d'envoi des SMS"
+
+msgid "AT commands sending port"
+msgstr "Port d'envoi des commandes AT"
+
+msgid "AT Commands Settings"
+msgstr "Paramètres des commandes AT"
+
+msgid "Merge split messages"
+msgstr "Fusionner les messages divisés"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Les messages divisés seront fusionnés. L'activation de cette option facilitera la lecture des SMS, mais entraînera une différence dans le nombre de messages affichés et reçus."
+
+msgid "USSD sending port"
+msgstr "Port d'envoi des codes USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Envoyer le code USSD en texte clair"
+
+msgid "Receive message without PDU decoding"
+msgstr "Recevoir le message sans décodage PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Envoie le code USSD en texte clair. La commande n'est pas codée en PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Le message reçu s'affiche sans décodage PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Explication du numéro et du préfixe"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Dans l'onglet d'envoi de SMS, afficher une explication concernant le préfixe et le numéro de téléphone correct."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Le numéro de téléphone doit être précédé du préfixe du pays (pour la Pologne, c'est 48, sans '+'). Si le numéro comporte 5, 4 ou 3 caractères, il est traité comme 'court' et ne doit pas être précédé d'un préfixe de pays."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Le numéro de téléphone doit être précédé du préfixe du pays (pour la Pologne, c'est 48, sans +). Si le numéro comporte 5, 4 ou 3 caractères, il est traité comme court et ne doit pas être précédé d'un préfixe de pays."
+
+msgid "Add prefix to phone number"
+msgstr "Ajouter un préfixe au numéro de téléphone"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Ajoute automatiquement un préfixe au champ du numéro de téléphone."
+
+msgid "Prefix number"
+msgstr "Numéro de préfixe"
+
+msgid "Please specify the command to send"
+msgstr "Veuillez spécifier la commande à envoyer"
+
+msgid "Please specify the code to send"
+msgstr "Veuillez spécifier le code à envoyer"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Veuillez définir le port de communication avec le modem"
+
+msgid "User AT commands"
+msgstr "Commandes AT utilisateur"
+
+msgid "Command to send"
+msgstr "Commande à envoyer"
+
+msgid "Clear form"
+msgstr "Effacer le formulaire"
+
+msgid "Send command"
+msgstr "Envoyer la commande"
+
+msgid "Send code"
+msgstr "Envoyer le code"
+
+msgid "Reply"
+msgstr "Réponse"
+
+msgid "Message storage area"
+msgstr "Zone de stockage des messages"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Les messages sont stockés dans un emplacement spécifique (par exemple, sur la carte SIM ou dans la mémoire du modem), mais d'autres zones peuvent également être disponibles selon le type d'appareil."
+
+msgid "SIM card"
+msgstr "Carte SIM"
+
+msgid "Modem memory"
+msgstr "Mémoire du modem"
+
+msgid "Storage used / Total capacity"
+msgstr "Stockage utilisé / Capacité totale"
+
+msgid "Delete selected"
+msgstr "Supprimer la sélection"
+
+msgid "Delete"
+msgstr "Supprimer"
+
+msgid "Delete all"
+msgstr "Tout supprimer"
+
+msgid "Refresh"
+msgstr "Actualiser"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Veuillez sélectionner le(s) message(s) à supprimer"
+
+msgid "Delete selected message(s)?"
+msgstr "Supprimer le(s) message(s) sélectionné(s) ?"
+
+msgid "Delete all the messages?"
+msgstr "Supprimer tous les messages ?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface utilisateur pour lire les messages SMS avec sms-tool. Plus d'informations sur sms-tool sur le %sforum eko.one.pl%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface utilisateur pour envoyer des messages SMS avec sms-tool. Plus d'informations sur sms-tool sur le %sforum eko.one.pl%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface utilisateur pour envoyer des commandes AT avec sms-tool. Plus d'informations sur sms-tool sur le %sforum eko.one.pl%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface utilisateur pour envoyer des codes USSD avec sms-tool. Plus d'informations sur sms-tool sur le %sforum eko.one.pl%s."
+
+msgid "Configuration sms-tool"
+msgstr "Configuration sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Panneau de configuration pour sms-tool et l'interface utilisateur."
+
+msgid "Port for communication with the modem"
+msgstr "Port de communication avec le modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Sélectionnez l'un des ports ttyUSBX disponibles."
+
+msgid "Please select a port"
+msgstr "Veuillez sélectionner un port"
+
+msgid "User contacts"
+msgstr "Contacts utilisateur"
+
+msgid "Enable group messaging"
+msgstr "Activer la messagerie de groupe"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Cette option permet d'envoyer un seul message à tous les contacts de la liste de contacts de l'utilisateur."
+
+msgid "Message sending delay"
+msgstr "Délai d'envoi des messages"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Message envoyé au numéro :"
+
+msgid "User USSD codes"
+msgstr "Codes USSD utilisateur"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Chaque ligne doit avoir le format suivant : 'Nom du contact;numéro de téléphone'. Pour plus de commodité, les contacts sont enregistrés dans le fichier /etc/modem/phonebook.user."
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "Chaque ligne doit avoir le format suivant : 'Description de la commande AT;commande AT'. Pour plus de commodité, les commandes sont enregistrées dans le fichier /etc/modem/atcmmds.user."
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "Chaque ligne doit avoir le format suivant : 'Description du code;code'. Pour plus de commodité, les codes sont enregistrés dans le fichier /etc/modem/ussdcodes.user."
+
+msgid "Display new messages notification on login page"
+msgstr "Afficher la notification de nouveaux messages sur la page de connexion"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Afficher une notification lorsque de nouveaux messages arrivent dans la zone de messages sélectionnée."
+
+msgid "new message"
+msgstr "nouveau message"
+
+msgid "new messages"
+msgstr "nouveaux messages"
+
+msgid "All"
+msgstr "Tous"
+
+msgid "Show"
+msgstr "Afficher"
+
+msgid "Read"
+msgstr "Lu"
+
+msgid "Unread"
+msgstr "Non lu"
+
+msgid "All / Read / Unread"
+msgstr "Tous / Lus / Non lus"
+
+msgid "Show all, read or unread messages"
+msgstr "Afficher tous les messages, lus ou non lus"
+
+msgid "Show system messages in the message list"
+msgstr "Afficher les messages système dans la liste des messages"
+
+msgid "Mark as read"
+msgstr "Marquer comme lu"
+
+msgid "Mark as unread"
+msgstr "Marquer comme non lu"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Veuillez sélectionner le(s) message(s) à marquer comme lus"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Veuillez sélectionner le(s) message(s) à marquer comme non lus"
+
+msgid "Mark selected message(s) as read?"
+msgstr "Marquer le(s) message(s) sélectionné(s) comme lus ?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "Marquer le(s) message(s) sélectionné(s) comme non lus ?"
+
+msgid "Message marked as read"
+msgstr "Message marqué comme lu"
+
+msgid "Messages marked as read"
+msgstr "Messages marqués comme lus"
+
+msgid "Message marked as unread"
+msgstr "Message marqué comme non lu"
+
+msgid "Messages marked as unread"
+msgstr "Messages marqués comme non lus"
+
+msgid "System messages"
+msgstr "Messages système"
+
+msgid "Diode"
+msgstr "Diode"
+
+msgid "New messages notification LED"
+msgstr "LED de notification de nouveaux messages"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "Activer la LED de notification SMS lors d'un nouveau message"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Activer la LED de notification lorsque de nouveaux messages arrivent dans la zone de messages sélectionnée."
+
+msgid "Selected LED"
+msgstr "LED sélectionnée"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Sélectionnez une diode LED pour la notification de nouveaux messages. La sélection se fait parmi les LED disponibles dans le système."
+
+msgid "Automatically select LED"
+msgstr "Sélectionner automatiquement la LED"
+
+msgid "Automatically select the first available LED."
+msgstr "Sélectionne automatiquement la première LED disponible."
+
+msgid "Advanced settings"
+msgstr "Paramètres avancés"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "Intervalle de clignotement de la LED (en secondes)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "Définir l'intervalle de clignotement de la LED (en secondes)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Durée de clignotement (en secondes)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Définir la durée de clignotement (en secondes). Mettre à 0 pour une durée infinie (la LED clignotera jusqu'à ce que les messages soient marqués comme lus)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Veuillez patienter... Enregistrement des messages SMS dans un fichier texte."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Cette option permet de sauvegarder les messages SMS ou, par exemple, d'enregistrer les messages non pris en charge par sms-tool."
+
+msgid "Delete all messages"
+msgstr "Supprimer tous les messages"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Cette option permet de supprimer tous les messages SMS lorsqu'ils ne sont pas visibles dans l'onglet 'Messages reçus'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "L'enregistrement des messages SMS dans un fichier a échoué. Veuillez réessayer."
+
+msgid "PDU decoding scheme"
+msgstr "Schéma de décodage PDU"
+
+msgid "Autodetect"
+msgstr "Détection automatique"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Conserver la réponse précédente lors de l'envoi d'un nouveau code USSD."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Cochez cette option si vous devez utiliser le menu basé sur les codes USSD"
+
+msgid "Turn over the replies."
+msgstr "Inverser les réponses."
+
+msgid "View new reply from top"
+msgstr "Afficher la nouvelle réponse en haut"
+
+msgid "Please wait... deleted"
+msgstr "Veuillez patienter... supprimé"
+
+msgid "of"
+msgstr "sur"
+
+msgid "selected messages"
+msgstr "messages sélectionnés"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"Le paquet nécessite une configuration utilisateur.
Les éléments suivants "
+"doivent être définis :
1. Tous les ports de communication avec le modem.
2. Options "
+"supplémentaires spécifiques au modem (pour la gestion des codes USSD).
3. LED de notification (facultatif).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Tout changement de la zone à partir de laquelle les messages SMS seront lus nécessite d'actualiser les messages"
+
+msgid "Characters remaining:"
+msgstr "Caractères restants :"
+
+msgid "Encoding standard"
+msgstr "Standard de codage"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 caractères)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 caractères)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Codage GSM-7 (160 caractères)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Codage Unicode (70 caractères), ne prend pas en charge l'envoi de caractères nationaux (en utf8) – uniquement ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "L'onglet permet aux utilisateurs de soutenir le paquet"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Informations sur luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Signaler un bug"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Écrire dans le sujet du paquet sur le forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Écrire sur le forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Signaler un bug sur la page Github du paquet"
+
+msgid "Open a package discussion on Github"
+msgstr "Ouvrir une discussion sur le paquet sur Github"
+
+msgid "Open discussion"
+msgstr "Ouvrir une discussion"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Offrez un café si vous souhaitez soutenir le développement du projet et l'auteur"
+
+msgid "Buy a coffee"
+msgstr "Offrir un café"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Devenez sponsor si vous souhaitez soutenir le développement du projet et l'auteur"
+
+msgid "Become a sponsor"
+msgstr "Devenir sponsor"
+
+msgid "Package Info"
+msgstr "Informations sur le paquet"
+
+msgid "Author (package maintainer)"
+msgstr "Auteur (mainteneur du paquet)"
+
+msgid "Package update and support"
+msgstr "Mise à jour et support du paquet"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Paramètres de transfert SMS vers e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "Un e-mail sera envoyé.."
+
+msgid "Enable message forwarding"
+msgstr "Activer le transfert de messages"
+
+msgid "E-mail settings"
+msgstr "Paramètres e-mail"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Sélectionnez des paramètres e-mail prédéfinis ou saisissez les paramètres manuellement."
+
+msgid "Recipient"
+msgstr "Destinataire"
+
+msgid "E-mail address of the recipient."
+msgstr "Adresse e-mail du destinataire."
+
+msgid "Sender"
+msgstr "Expéditeur"
+
+msgid "E-mail address of the sender."
+msgstr "Adresse e-mail de l'expéditeur."
+
+msgid "User"
+msgstr "Utilisateur"
+
+msgid "Username for SMTP authentication."
+msgstr "Nom d'utilisateur pour l'authentification SMTP."
+
+msgid "Password"
+msgstr "Mot de passe"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Mot de passe d'application Google / Mot de passe pour l'authentification SMTP."
+
+msgid "SMTP server"
+msgstr "Serveur SMTP"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Nom d'hôte/adresse IP du serveur SMTP."
+
+msgid "SMTP server port"
+msgstr "Port du serveur SMTP"
+
+msgid "Security"
+msgstr "Sécurité"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS : utiliser STARTTLS si le serveur le prend en charge."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL : SMTP via SSL."
+
+msgid "Required Package"
+msgstr "Paquet requis"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "L'option de transfert SMS nécessite l'installation du paquet mailsend."
+
+msgid "Check required packages"
+msgstr "Vérifier les paquets requis"
+
+msgid "Check"
+msgstr "Vérifier"
+
+msgid "Mailsend Package"
+msgstr "Paquet mailsend"
+
+msgid "Loading package data…"
+msgstr "Chargement des données du paquet…"
+
+msgid "Installed"
+msgstr "Installé"
+
+msgid "Install…"
+msgstr "Installer…"
+
+msgid "Mailsend Package"
+msgstr "Paquet mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Veuillez sélectionner exactement un message à transférer"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Transférer le message sélectionné vers e-mail ?"
+
+msgid "Sending e-mail..."
+msgstr "Envoi de l'e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Message transféré avec succès"
+
+msgid "Failed to forward message: %s"
+msgstr "Échec du transfert du message : %s"
+
+msgid "Error: %s"
+msgstr "Erreur : %s"
+
+msgid "user define"
+msgstr "paramètres utilisateur"
+
+msgid "Forward"
+msgstr "Transférer"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Sélectionnez le(s) message(s) à transférer"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "La fonction de transfert SMS n'est pas activée. Veuillez d'abord la configurer"
+
+msgid "My Router"
+msgstr "Mon routeur"
+
+msgid "Forward SMS to E-mail"
+msgstr "Transférer le(s) message(s) SMS vers e-mail"
+
+msgid "Subject:"
+msgstr "Objet :"
+
+msgid "Message text:"
+msgstr "Texte du message :"
+
+msgid "Send"
+msgstr "Envoyer"
+
+msgid "Subject and body cannot be empty"
+msgstr "L'objet et le corps ne peuvent pas être vides"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Le paquet mailsend n'est pas installé. Veuillez d'abord l'installer en utilisant le bouton Installer... ci-dessous"
+
+msgid "Select modem"
+msgstr "Sélectionner le modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Changer de modem nécessite de rafraîchir les messages"
+
+msgid "Defined AT command files"
+msgstr "Fichiers de commandes AT définis"
+
+msgid "Defined USSD code files"
+msgstr "Fichiers de codes USSD définis"
+
+msgid "File uploaded and saved to"
+msgstr "Fichier téléchargé et enregistré dans"
+
+msgid "Unable to upload file"
+msgstr "Impossible de télécharger le fichier"
+
+msgid "Phonebook saved successfully"
+msgstr "Répertoire enregistré avec succès"
+
+msgid "Unable to save the file"
+msgstr "Impossible d'enregistrer le fichier"
+
+msgid "filename.user"
+msgstr "nomfichier.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Sélectionner ou créer un fichier à modifier..."
+
+msgid "Please enter a file name"
+msgstr "Veuillez entrer un nom de fichier"
+
+msgid "File created successfully"
+msgstr "Fichier créé avec succès"
+
+msgid "Unable to create file"
+msgstr "Impossible de créer le fichier"
+
+msgid "Please select a file to delete"
+msgstr "Veuillez sélectionner un fichier à supprimer"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Êtes-vous sûr de vouloir supprimer ce fichier ?"
+
+msgid "File deleted successfully"
+msgstr "Fichier supprimé avec succès"
+
+msgid "Select or create a file to edit..."
+msgstr "Sélectionner ou créer un fichier à modifier..."
+
+msgid "Unable to delete file"
+msgstr "Impossible de supprimer le fichier"
+
+msgid "Please select or create a file first"
+msgstr "Veuillez d'abord sélectionner ou créer un fichier"
+
+msgid "File saved successfully"
+msgstr "Fichier enregistré avec succès"
+
+msgid "Unable to save file"
+msgstr "Impossible d'enregistrer le fichier"
+
+msgid "Load .user file"
+msgstr "Charger le fichier .user"
+
+msgid "Save .user file"
+msgstr "Enregistrer le fichier .user"
+
+msgid "Please select a file to delete"
+msgstr "Veuillez sélectionner un fichier à supprimer"
+
+msgid "Manage contacts"
+msgstr "Gérer les contacts"
+
+msgid "Edit User Contacts"
+msgstr "Modifier les contacts utilisateur"
+
+msgid "Manage USSD codes"
+msgstr "Gérer les codes USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Gérer les codes USSD utilisateur"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Chaque ligne doit avoir le format suivant : 'Description du code;code'. Pour la commodité de l'utilisateur, le fichier est enregistré à l'emplacement /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Chaque ligne doit avoir le format suivant : 'Description de la commande AT;commande AT'. Pour la commodité de l'utilisateur, le fichier est enregistré à l'emplacement /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Gérer les commandes AT"
+
+msgid "Manage User AT Commands"
+msgstr "Gérer les commandes AT utilisateur"
+
+msgid "-- Select file --"
+msgstr "-- Sélectionner un fichier --"
+
+msgid "Select file"
+msgstr "Sélectionner un fichier"
+
+msgid "New file name"
+msgstr "Nouveau nom de fichier"
+
+msgid "Delete selected file"
+msgstr "Supprimer le fichier sélectionné"
+
+msgid "Select file with AT commands to load"
+msgstr "Sélectionner le fichier avec les commandes AT à charger"
+
+msgid "Error loading AT commands file: "
+msgstr "Erreur lors du chargement du fichier de commandes AT : "
+
+msgid "No AT commands available"
+msgstr "Aucune commande AT disponible"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Erreur lors du chargement du fichier de commandes AT initial :"
+
+msgid "Error loading USSD codes file: "
+msgstr "Erreur lors du chargement du fichier de codes USSD : "
+
+msgid "Error loading initial USSD file:"
+msgstr "Erreur lors du chargement du fichier USSD initial :"
+
+msgid "Select file with USSD codes to load"
+msgstr "Sélectionner le fichier avec les codes USSD à charger"
+
+msgid "No USSD codes available"
+msgstr "Aucun code USSD disponible"
+
+msgid "Show notification icon"
+msgstr "Afficher l’icône de notification"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Afficher l’icône de notification des nouveaux messages sur la page d’aperçu de l’état."
+
+msgid "Loading..."
+msgstr "Chargement..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modems"
+
+msgid "Signal Quality"
+msgstr "Qualité du signal"
+
+msgid "Align preview to:"
+msgstr "Aligner l’aperçu sur :"
+
+msgid "Left"
+msgstr "Gauche"
+
+msgid "Center"
+msgstr "Centre"
+
+msgid "Right"
+msgstr "Droite"
+
+msgid "New message information block settings"
+msgstr "Paramètres du bloc d’informations des nouveaux messages"
+
+msgid "Alignment settings saved successfully"
+msgstr "Paramètres d’alignement enregistrés avec succès"
+
+msgid "SMS Info"
+msgstr "Infos SMS"
+
+msgid "New SMS"
+msgstr "Nouveau SMS"
+
+msgid "No new SMS"
+msgstr "Aucun nouveau SMS"
+
+msgid "Deleting files"
+msgstr "Suppression des fichiers"
+
+msgid "Delete all files"
+msgstr "Supprimer tous les fichiers"
+
+msgid "Load .gz archive"
+msgstr "Charger l'archive .gz"
+
+msgid "Save .gz archive"
+msgstr "Enregistrer l'archive .gz"
+
+msgid "File uploaded and saved to"
+msgstr "Fichier téléversé et enregistré dans"
+
+msgid "Failed to extract archive"
+msgstr "Échec de l'extraction de l'archive"
+
+msgid "Archive extracted to"
+msgstr "Archive extraite vers"
+
+msgid "Upload error"
+msgstr "Erreur de téléversement"
+
+msgid "Failed to create archive"
+msgstr "Impossible de créer l'archive"
+
+msgid "Failed to read archive"
+msgstr "Impossible de lire l'archive"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Êtes-vous sûr de vouloir supprimer tous les fichiers du dossier ?"
+
+msgid "All files deleted successfully"
+msgstr "Tous les fichiers ont été supprimés avec succès"
+
+msgid "Call Log"
+msgstr "Historique d'appels"
+
+msgid "Clear all call log entries?"
+msgstr "Effacer toutes les entrées de l'historique ?"
+
+msgid "No call log entries found"
+msgstr "Aucune entrée trouvée dans l'historique"
+
+msgid "No matching call log entries found"
+msgstr "Aucune entrée correspondante trouvée"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Interface utilisateur pour consulter les journaux d'appels. Le journal est collecté par un démon en arrière-plan."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Le démon de l'historique est désactivé. Veuillez l'activer dans la configuration pour commencer la collecte."
+
+msgid "Filter call type"
+msgstr "Filtrer par type d'appel"
+
+msgid "All calls"
+msgstr "Tous les appels"
+
+msgid "Missed calls"
+msgstr "Appels manqués"
+
+msgid "Received calls"
+msgstr "Appels reçus"
+
+msgid "Dialed calls"
+msgstr "Appels émis"
+
+msgid "Refresh"
+msgstr "Actualiser"
+
+msgid "Clear Log"
+msgstr "Effacer l'historique"
+
+msgid "Date"
+msgstr "Date"
+
+msgid "Type"
+msgstr "Type"
+
+msgid "Number"
+msgstr "Numéro"
+
+msgid "Duration"
+msgstr "Durée"
+
+msgid "Name"
+msgstr "Nom"
+
+msgid "Call log reading port"
+msgstr "Port de lecture du journal d'appels"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Sélectionnez l'un des ports ttyUSBX disponibles."
+
+msgid "Please select a port"
+msgstr "Veuillez sélectionner un port"
+
+msgid "Enable call log daemon"
+msgstr "Activer le démon d'historique d'appels"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Processus en arrière-plan pour enregistrer les appels entrants et manqués."
+
+msgid "Call Log Settings"
+msgstr "Paramètres de l'historique des appels"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Processus en arrière-plan pour enregistrer les appels entrants et manqués.
Important Option dédiée aux modems Qualcomm qui n'ont pas de mémoire interne d'historique des appels et ne prennent pas en charge la commande standard AT+CPBR. L'activation de cette option ajoute un nouvel onglet. Si l'onglet dédié n'apparaît pas, videz le cache de votre navigateur et redémarrez le routeur."
+
+msgid "Forward SMS"
+msgstr "Transférer le SMS"
+
+msgid "Calls"
+msgstr "Appels"
+
+msgid "Notification Settings"
+msgstr "Paramètres de notification"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "La LED informe d'un nouveau message. Avant d'activer cette fonction, veuillez configurer et enregistrer le port de lecture SMS, le délai de vérification de la boîte de réception et sélectionner la LED de notification."
+
+msgid "Check inbox every minute(s)"
+msgstr "Vérifier la boîte de réception toutes les minute(s)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Spécifiez l'intervalle en minutes pour la vérification de votre boîte de réception."
+
+msgid "Notification LED"
+msgstr "LED de notification"
+
+msgid "Select the notification LED."
+msgstr "Sélectionnez la LED de notification."
+
+msgid "Notify new messages"
+msgstr "Notifier les nouveaux messages"
+
+msgid "Restart the inbox checking process every"
+msgstr "Redémarrer le processus de vérification toutes les"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Le processus redémarrera à l'intervalle sélectionné. Cela permettra d'éliminer les délais de vérification de la boîte de réception."
+
+msgid "4h"
+msgstr "4h"
+
+msgid "6h"
+msgstr "6h"
+
+msgid "8h"
+msgstr "8h"
+
+msgid "12h"
+msgstr "12h"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "La diode est dédiée uniquement à ces notifications"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Sélectionnez 'Non' si le routeur n'a qu'une seule LED ou si la LED est multitâche.
Important Cette option nécessite que la LED soit définie dans le système (si possible) pour fonctionner correctement. Cette condition s'applique lorsque la diode gère plusieurs tâches."
+
+msgid "Force EHLO"
+msgstr "Forcer EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Force mailsend à toujours utiliser EHLO au lieu de détecter automatiquement HELO/EHLO. Activez uniquement si le transfert échoue, car certains serveurs (par ex. passerelles d'entreprise, Microsoft 365 / Exchange Online Protection) n'annoncent pas correctement la prise en charge d'ESMTP, ce qui empêche STARTTLS/l'authentification de fonctionner."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "L'encodage Unicode (70 caractères par défaut) prend en charge la transmission de caractères nationaux et des messages SMS multipartites"
+
+msgid "Not applicable"
+msgstr "Non applicable"
diff --git a/luci-app-sms-tool-js/po/it/sms-tool-js.po b/luci-app-sms-tool-js/po/it/sms-tool-js.po
new file mode 100644
index 000000000..16fe7cc32
--- /dev/null
+++ b/luci-app-sms-tool-js/po/it/sms-tool-js.po
@@ -0,0 +1,966 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: lt\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "SMS Messages"
+msgstr "Messaggi SMS"
+
+msgid "Received Messages"
+msgstr "Messaggi ricevuti"
+
+msgid "Send Messages"
+msgstr "Invio messaggi"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Mittente"
+
+msgid "Received"
+msgstr "Ricevuto"
+
+msgid "Message"
+msgstr "Messaggio"
+
+msgid "Configuration"
+msgstr "Impostazioni"
+
+msgid "AT Commands"
+msgstr "Comandi AT"
+
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgid "Please enter phone number"
+msgstr "Inserire il numero di telefono"
+
+msgid "Please enter a message text"
+msgstr "Inserire il testo del messaggio"
+
+msgid "Reply"
+msgstr "Risposta"
+
+msgid "Please enter a USSD code"
+msgstr "Inserire il codice USSD"
+
+msgid "USSD Codes"
+msgstr "Codici USSD"
+
+msgid "Send to"
+msgstr "Invia a"
+
+msgid "Message text"
+msgstr "Testo del messaggio"
+
+msgid "Send"
+msgstr "Invia"
+
+msgid "Send to number"
+msgstr "Invia al numero"
+
+msgid "to number"
+msgstr "al numero"
+
+msgid "to group"
+msgstr "al gruppo"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS inviato con successo"
+
+msgid "Code to send"
+msgstr "Codice da inviare"
+
+msgid "Send code"
+msgstr "Invia codice"
+
+msgid "SMS Settings"
+msgstr "Impostazioni SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Impostazioni codici USSD"
+
+msgid "SMS reading port"
+msgstr "Porta di lettura SMS"
+
+msgid "SMS sending port"
+msgstr "Porta di invio SMS"
+
+msgid "AT commands sending port"
+msgstr "Porta di invio comandi AT"
+
+msgid "AT Commands Settings"
+msgstr "Impostazioni comandi AT"
+
+msgid "Merge split messages"
+msgstr "Unisci messaggi divisi"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "I messaggi divisi verranno uniti. L'attivazione di questa opzione faciliterà la lettura degli SMS, ma causerà una discrepanza nel numero di messaggi visualizzati e ricevuti."
+
+msgid "USSD sending port"
+msgstr "Porta di invio codici USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Invia codice USSD in testo normale"
+
+msgid "Receive message without PDU decoding"
+msgstr "Ricevi messaggio senza decodifica PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Invia il codice USSD in testo normale. Il comando non viene codificato in PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Il messaggio ricevuto viene visualizzato senza decodifica PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Spiegazione di numero e prefisso"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Nella scheda per l'invio di SMS, mostrare una spiegazione relativa al prefisso e al numero di telefono corretto."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Il numero di telefono deve essere preceduto dal prefisso del paese (per la Polonia è 48, senza '+'). Se il numero è di 5, 4 o 3 caratteri, viene trattato come 'breve' e non deve essere preceduto dal prefisso del paese."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Il numero di telefono deve essere preceduto dal prefisso del paese (per la Polonia è 48, senza +). Se il numero è di 5, 4 o 3 caratteri, viene trattato come breve e non deve essere preceduto dal prefisso del paese."
+
+msgid "Add prefix to phone number"
+msgstr "Aggiungi prefisso al numero di telefono"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Aggiunge automaticamente un prefisso al campo del numero di telefono."
+
+msgid "Prefix number"
+msgstr "Numero di prefisso"
+
+msgid "Please specify the command to send"
+msgstr "Specificare il comando da inviare"
+
+msgid "Please specify the code to send"
+msgstr "Specificare il codice da inviare"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Impostare la porta per la comunicazione con il modem"
+
+msgid "User AT commands"
+msgstr "Comandi AT utente"
+
+msgid "Command to send"
+msgstr "Comando da inviare"
+
+msgid "Clear form"
+msgstr "Cancella modulo"
+
+msgid "Send command"
+msgstr "Invia comando"
+
+msgid "Send code"
+msgstr "Invia codice"
+
+msgid "Reply"
+msgstr "Risposta"
+
+msgid "Message storage area"
+msgstr "Area di archiviazione messaggi"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "I messaggi sono archiviati in una posizione specifica (ad esempio, sulla scheda SIM o nella memoria del modem), ma altre aree potrebbero essere disponibili a seconda del tipo di dispositivo."
+
+msgid "SIM card"
+msgstr "Scheda SIM"
+
+msgid "Modem memory"
+msgstr "Memoria del modem"
+
+msgid "Storage used / Total capacity"
+msgstr "Memoria utilizzata / Capacità totale"
+
+msgid "Delete selected"
+msgstr "Elimina selezionato"
+
+msgid "Delete"
+msgstr "Elimina"
+
+msgid "Delete all"
+msgstr "Elimina tutto"
+
+msgid "Refresh"
+msgstr "Aggiorna"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Selezionare il/i messaggio/i da eliminare"
+
+msgid "Delete selected message(s)?"
+msgstr "Eliminare il/i messaggio/i selezionato/i?"
+
+msgid "Delete all the messages?"
+msgstr "Eliminare tutti i messaggi?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaccia utente per la lettura di messaggi SMS tramite sms-tool. Ulteriori informazioni su sms-tool sul %sforum eko.one.pl%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaccia utente per l'invio di messaggi SMS tramite sms-tool. Ulteriori informazioni su sms-tool sul %sforum eko.one.pl%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaccia utente per l'invio di comandi AT tramite sms-tool. Ulteriori informazioni su sms-tool sul %sforum eko.one.pl%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interfaccia utente per l'invio di codici USSD tramite sms-tool. Ulteriori informazioni su sms-tool sul %sforum eko.one.pl%s."
+
+msgid "Configuration sms-tool"
+msgstr "Configurazione sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Pannello di impostazioni per il programma sms-tool e per l'interfaccia utente."
+
+msgid "Port for communication with the modem"
+msgstr "Porta per la comunicazione con il modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Selezionare una delle porte ttyUSBX disponibili."
+
+msgid "Please select a port"
+msgstr "Selezionare una porta"
+
+msgid "User contacts"
+msgstr "Contatti utente"
+
+msgid "Enable group messaging"
+msgstr "Abilita messaggi di gruppo"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Questa opzione consente di inviare un singolo messaggio a tutti i contatti nell'elenco contatti dell'utente."
+
+msgid "Message sending delay"
+msgstr "Ritardo nell'invio dei messaggi"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Messaggio inviato al numero:"
+
+msgid "User USSD codes"
+msgstr "Codici USSD utente"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Ogni riga deve avere il seguente formato: 'Nome contatto;numero di telefono'. Per comodità dell'utente, i contatti vengono salvati nel file /etc/modem/phonebook.user."
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "Ogni riga deve avere il seguente formato: 'Descrizione comando AT;comando AT'. Per comodità dell'utente, i comandi vengono salvati nel file /etc/modem/atcmmds.user."
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "Ogni riga deve avere il seguente formato: 'Descrizione codice;codice'. Per comodità dell'utente, i codici vengono salvati nel file /etc/modem/ussdcodes.user."
+
+msgid "Display new messages notification on login page"
+msgstr "Visualizza notifica di nuovi messaggi sulla pagina di accesso"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Visualizza notifica quando arrivano nuovi messaggi nell'area messaggi selezionata."
+
+msgid "new message"
+msgstr "nuovo messaggio"
+
+msgid "new messages"
+msgstr "nuovi messaggi"
+
+msgid "All"
+msgstr "Tutti"
+
+msgid "Show"
+msgstr "Mostra"
+
+msgid "Read"
+msgstr "Letto"
+
+msgid "Unread"
+msgstr "Non letto"
+
+msgid "All / Read / Unread"
+msgstr "Tutti / Letti / Non letti"
+
+msgid "Show all, read or unread messages"
+msgstr "Mostra tutti i messaggi, letti o non letti"
+
+msgid "Show system messages in the message list"
+msgstr "Mostra messaggi di sistema nell'elenco messaggi"
+
+msgid "Mark as read"
+msgstr "Segna come letto"
+
+msgid "Mark as unread"
+msgstr "Segna come non letto"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Selezionare il/i messaggio/i da contrassegnare come letti"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Selezionare il/i messaggio/i da contrassegnare come non letti"
+
+msgid "Mark selected message(s) as read?"
+msgstr "Contrassegnare il/i messaggio/i selezionato/i come letti?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "Contrassegnare il/i messaggio/i selezionato/i come non letti?"
+
+msgid "Message marked as read"
+msgstr "Messaggio contrassegnato come letto"
+
+msgid "Messages marked as read"
+msgstr "Messaggi contrassegnati come letti"
+
+msgid "Message marked as unread"
+msgstr "Messaggio contrassegnato come non letto"
+
+msgid "Messages marked as unread"
+msgstr "Messaggi contrassegnati come non letti"
+
+msgid "System messages"
+msgstr "Messaggi di sistema"
+
+msgid "Diode"
+msgstr "Diodo"
+
+msgid "New messages notification LED"
+msgstr "LED di notifica nuovi messaggi"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "Abilita LED di notifica SMS su nuovo messaggio"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Abilita LED di notifica quando arrivano nuovi messaggi nell'area messaggi selezionata."
+
+msgid "Selected LED"
+msgstr "LED selezionato"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Selezionare un diodo LED per la notifica di nuovi messaggi. La selezione viene effettuata dai LED disponibili nel sistema."
+
+msgid "Automatically select LED"
+msgstr "Seleziona automaticamente LED"
+
+msgid "Automatically select the first available LED."
+msgstr "Seleziona automaticamente il primo LED disponibile."
+
+msgid "Advanced settings"
+msgstr "Impostazioni avanzate"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "Intervallo di lampeggio LED (in secondi)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "Impostare l'intervallo di lampeggio del LED (in secondi)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Durata del lampeggio (in secondi)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Impostare la durata del lampeggio (in secondi). Impostare a 0 per durata infinita (il LED lampeggerà fino a quando i messaggi vengono contrassegnati come letti)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Attendere... Salvataggio dei messaggi SMS in un file di testo."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Questa opzione consente di eseguire il backup dei messaggi SMS o, ad esempio, di salvare messaggi non supportati da sms-tool."
+
+msgid "Delete all messages"
+msgstr "Elimina tutti i messaggi"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Questa opzione consente di eliminare tutti i messaggi SMS quando non sono visibili nella scheda 'Messaggi ricevuti'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Salvataggio dei messaggi SMS in un file non riuscito. Riprovare."
+
+msgid "PDU decoding scheme"
+msgstr "Schema di decodifica PDU"
+
+msgid "Autodetect"
+msgstr "Rilevamento automatico"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Mantieni la risposta precedente durante l'invio di un nuovo codice USSD."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Selezionare questa opzione se è necessario utilizzare il menu basato sui codici USSD"
+
+msgid "Turn over the replies."
+msgstr "Invertire le risposte."
+
+msgid "View new reply from top"
+msgstr "Visualizza nuova risposta dall'alto"
+
+msgid "Please wait... deleted"
+msgstr "Attendere... eliminato"
+
+msgid "of"
+msgstr "di"
+
+msgid "selected messages"
+msgstr "messaggi selezionati"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"Il pacchetto richiede la configurazione dell'utente.
È necessario "
+"impostare:
1. Tutte le porte per la comunicazione con il modem.
2. Opzioni "
+"aggiuntive specifiche del modem (per la gestione dei codici USSD).
3. LED di notifica (opzionale).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Qualsiasi modifica dell'area da cui verranno letti i messaggi SMS richiede l'aggiornamento dei messaggi"
+
+msgid "Characters remaining:"
+msgstr "Caratteri rimanenti:"
+
+msgid "Encoding standard"
+msgstr "Standard di codifica"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 caratteri)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 caratteri)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Codifica GSM-7 (160 caratteri)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Codifica Unicode (70 caratteri), non supporta l'invio di caratteri nazionali (in utf8) – solo ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "La scheda consente agli utenti di supportare il pacchetto"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Informazioni su luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Segnala un bug"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Scrivi nell'argomento del pacchetto sul forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Scrivi sul forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Segnala un bug sulla pagina Github del pacchetto"
+
+msgid "Open a package discussion on Github"
+msgstr "Apri una discussione sul pacchetto su Github"
+
+msgid "Open discussion"
+msgstr "Apri discussione"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Offri un caffè se vuoi supportare lo sviluppo del progetto e l'autore"
+
+msgid "Buy a coffee"
+msgstr "Offri un caffè"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Diventa sponsor se vuoi supportare lo sviluppo del progetto e l'autore"
+
+msgid "Become a sponsor"
+msgstr "Diventa sponsor"
+
+msgid "Package Info"
+msgstr "Informazioni sul pacchetto"
+
+msgid "Author (package maintainer)"
+msgstr "Autore (manutentore del pacchetto)"
+
+msgid "Package update and support"
+msgstr "Aggiornamento e supporto del pacchetto"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Impostazioni di inoltro SMS a e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "Verrà inviata un'e-mail.."
+
+msgid "Enable message forwarding"
+msgstr "Abilita inoltro messaggi"
+
+msgid "E-mail settings"
+msgstr "Impostazioni e-mail"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Selezionare impostazioni e-mail predefinite o inserire le impostazioni manualmente."
+
+msgid "Recipient"
+msgstr "Destinatario"
+
+msgid "E-mail address of the recipient."
+msgstr "Indirizzo e-mail del destinatario."
+
+msgid "Sender"
+msgstr "Mittente"
+
+msgid "E-mail address of the sender."
+msgstr "Indirizzo e-mail del mittente."
+
+msgid "User"
+msgstr "Utente"
+
+msgid "Username for SMTP authentication."
+msgstr "Nome utente per l'autenticazione SMTP."
+
+msgid "Password"
+msgstr "Password"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Password app Google / Password per l'autenticazione SMTP."
+
+msgid "SMTP server"
+msgstr "Server SMTP"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Nome host/indirizzo IP del server SMTP."
+
+msgid "SMTP server port"
+msgstr "Porta del server SMTP"
+
+msgid "Security"
+msgstr "Sicurezza"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: utilizzare STARTTLS se il server lo supporta."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP tramite SSL."
+
+msgid "Required Package"
+msgstr "Pacchetto richiesto"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "L'opzione di inoltro SMS richiede l'installazione del pacchetto mailsend."
+
+msgid "Check required packages"
+msgstr "Verifica pacchetti richiesti"
+
+msgid "Check"
+msgstr "Verifica"
+
+msgid "Mailsend Package"
+msgstr "Pacchetto mailsend"
+
+msgid "Loading package data…"
+msgstr "Caricamento dati del pacchetto…"
+
+msgid "Installed"
+msgstr "Installato"
+
+msgid "Install…"
+msgstr "Installa…"
+
+msgid "Mailsend Package"
+msgstr "Pacchetto mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Selezionare esattamente un messaggio da inoltrare"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Inoltrare il messaggio selezionato a e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Invio e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Messaggio inoltrato con successo"
+
+msgid "Failed to forward message: %s"
+msgstr "Impossibile inoltrare il messaggio: %s"
+
+msgid "Error: %s"
+msgstr "Errore: %s"
+
+msgid "user define"
+msgstr "impostazioni utente"
+
+msgid "Forward"
+msgstr "Inoltra"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Selezionare il/i messaggio/i da inoltrare"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "La funzione di inoltro SMS non è abilitata. Configurarla prima"
+
+msgid "My Router"
+msgstr "Il mio router"
+
+msgid "Forward SMS to E-mail"
+msgstr "Inoltra messaggio/i SMS a e-mail"
+
+msgid "Subject:"
+msgstr "Oggetto:"
+
+msgid "Message text:"
+msgstr "Testo del messaggio:"
+
+msgid "Send"
+msgstr "Invia"
+
+msgid "Subject and body cannot be empty"
+msgstr "Oggetto e corpo non possono essere vuoti"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Il pacchetto mailsend non è installato. Installarlo prima utilizzando il pulsante Installa... qui sotto"
+
+msgid "Select modem"
+msgstr "Seleziona modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Il cambio di modem richiede l'aggiornamento dei messaggi"
+
+msgid "Defined AT command files"
+msgstr "File di comandi AT definiti"
+
+msgid "Defined USSD code files"
+msgstr "File di codici USSD definiti"
+
+msgid "File uploaded and saved to"
+msgstr "File caricato e salvato in"
+
+msgid "Unable to upload file"
+msgstr "Impossibile caricare il file"
+
+msgid "Phonebook saved successfully"
+msgstr "Rubrica salvata con successo"
+
+msgid "Unable to save the file"
+msgstr "Impossibile salvare il file"
+
+msgid "filename.user"
+msgstr "nomefile.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Seleziona o crea un file da modificare..."
+
+msgid "Please enter a file name"
+msgstr "Inserire un nome file"
+
+msgid "File created successfully"
+msgstr "File creato con successo"
+
+msgid "Unable to create file"
+msgstr "Impossibile creare il file"
+
+msgid "Please select a file to delete"
+msgstr "Selezionare un file da eliminare"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Sei sicuro di voler eliminare questo file?"
+
+msgid "File deleted successfully"
+msgstr "File eliminato con successo"
+
+msgid "Select or create a file to edit..."
+msgstr "Seleziona o crea un file da modificare..."
+
+msgid "Unable to delete file"
+msgstr "Impossibile eliminare il file"
+
+msgid "Please select or create a file first"
+msgstr "Selezionare o creare prima un file"
+
+msgid "File saved successfully"
+msgstr "File salvato con successo"
+
+msgid "Unable to save file"
+msgstr "Impossibile salvare il file"
+
+msgid "Load .user file"
+msgstr "Carica file .user"
+
+msgid "Save .user file"
+msgstr "Salva file .user"
+
+msgid "Please select a file to delete"
+msgstr "Selezionare un file da eliminare"
+
+msgid "Manage contacts"
+msgstr "Gestisci contatti"
+
+msgid "Edit User Contacts"
+msgstr "Modifica contatti utente"
+
+msgid "Manage USSD codes"
+msgstr "Gestisci codici USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Gestisci codici USSD utente"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Ogni riga deve avere il seguente formato: 'Descrizione codice;codice'. Per comodità dell'utente, il file viene salvato nella posizione /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Ogni riga deve avere il seguente formato: 'Descrizione comando AT;comando AT'. Per comodità dell'utente, il file viene salvato nella posizione /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Gestisci comandi AT"
+
+msgid "Manage User AT Commands"
+msgstr "Gestisci comandi AT utente"
+
+msgid "-- Select file --"
+msgstr "-- Seleziona file --"
+
+msgid "Select file"
+msgstr "Seleziona file"
+
+msgid "New file name"
+msgstr "Nuovo nome file"
+
+msgid "Delete selected file"
+msgstr "Elimina file selezionato"
+
+msgid "Select file with AT commands to load"
+msgstr "Seleziona il file con i comandi AT da caricare"
+
+msgid "Error loading AT commands file: "
+msgstr "Errore nel caricamento del file dei comandi AT: "
+
+msgid "No AT commands available"
+msgstr "Nessun comando AT disponibile"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Errore nel caricamento del file iniziale dei comandi AT:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Errore nel caricamento del file dei codici USSD: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Errore nel caricamento del file USSD iniziale:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Seleziona il file con i codici USSD da caricare"
+
+msgid "No USSD codes available"
+msgstr "Nessun codice USSD disponibile"
+
+msgid "Show notification icon"
+msgstr "Mostra icona di notifica"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Mostra l’icona di notifica dei nuovi messaggi nella pagina di panoramica dello stato."
+
+msgid "Loading..."
+msgstr "Caricamento..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modem"
+
+msgid "Signal Quality"
+msgstr "Qualità del segnale"
+
+msgid "Align preview to:"
+msgstr "Allinea anteprima a:"
+
+msgid "Left"
+msgstr "Sinistra"
+
+msgid "Center"
+msgstr "Centro"
+
+msgid "Right"
+msgstr "Destra"
+
+msgid "New message information block settings"
+msgstr "Impostazioni del blocco informazioni sui nuovi messaggi"
+
+msgid "Alignment settings saved successfully"
+msgstr "Impostazioni di allineamento salvate con successo"
+
+msgid "SMS Info"
+msgstr "Info SMS"
+
+msgid "New SMS"
+msgstr "Nuovo SMS"
+
+msgid "No new SMS"
+msgstr "Nessun nuovo SMS"
+
+msgid "Deleting files"
+msgstr "Eliminazione dei file"
+
+msgid "Delete all files"
+msgstr "Elimina tutti i file"
+
+msgid "Load .gz archive"
+msgstr "Carica archivio .gz"
+
+msgid "Save .gz archive"
+msgstr "Salva archivio .gz"
+
+msgid "File uploaded and saved to"
+msgstr "File caricato e salvato in"
+
+msgid "Failed to extract archive"
+msgstr "Impossibile estrarre l'archivio"
+
+msgid "Archive extracted to"
+msgstr "Archivio estratto in"
+
+msgid "Upload error"
+msgstr "Errore di caricamento"
+
+msgid "Failed to create archive"
+msgstr "Impossibile creare l'archivio"
+
+msgid "Failed to read archive"
+msgstr "Impossibile leggere l'archivio"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Sei sicuro di voler eliminare tutti i file nella cartella?"
+
+msgid "All files deleted successfully"
+msgstr "Tutti i file sono stati eliminati correttamente"
+
+msgid "Call Log"
+msgstr "Registro chiamate"
+
+msgid "Clear all call log entries?"
+msgstr "Cancellare tutte le voci del registro chiamate?"
+
+msgid "No call log entries found"
+msgstr "Nessuna voce trovata nel registro chiamate"
+
+msgid "No matching call log entries found"
+msgstr "Nessuna voce corrispondente trovata"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Interfaccia utente per la visualizzazione dei registri chiamate. Il registro è raccolto da un demone in background."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Il demone del registro chiamate è disabilitato. Abilitatelo nella configurazione per iniziare a raccogliere i log."
+
+msgid "Filter call type"
+msgstr "Filtra tipo di chiamata"
+
+msgid "All calls"
+msgstr "Tutte le chiamate"
+
+msgid "Missed calls"
+msgstr "Chiamate perse"
+
+msgid "Received calls"
+msgstr "Chiamate ricevute"
+
+msgid "Dialed calls"
+msgstr "Chiamate effettuate"
+
+msgid "Refresh"
+msgstr "Aggiorna"
+
+msgid "Clear Log"
+msgstr "Cancella registro"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Type"
+msgstr "Tipo"
+
+msgid "Number"
+msgstr "Numero"
+
+msgid "Duration"
+msgstr "Durata"
+
+msgid "Name"
+msgstr "Nome"
+
+msgid "Call log reading port"
+msgstr "Porta di lettura registro chiamate"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Selezionare una delle porte ttyUSBX disponibili."
+
+msgid "Please select a port"
+msgstr "Si prega di selezionare una porta"
+
+msgid "Enable call log daemon"
+msgstr "Abilita demone registro chiamate"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Processo in background per registrare le chiamate in entrata e perse."
+
+msgid "Call Log Settings"
+msgstr "Impostazioni registro chiamate"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Processo in background per registrare le chiamate in entrata e perse.
Importante Opzione dedicata ai modem Qualcomm che non dispongono di memoria interna della cronologia delle chiamate e non supportano il comando standard AT+CPBR. L'abilitazione di questa opzione aggiunge una nuova scheda. Se la scheda dedicata non appare, svuotare la cache del browser e riavviare il router."
+
+msgid "Forward SMS"
+msgstr "Inoltra SMS"
+
+msgid "Calls"
+msgstr "Chiamate"
+
+msgid "Notification Settings"
+msgstr "Impostazioni notifiche"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "Il LED informa di un nuovo messaggio. Prima di attivare questa funzione, configurare e salvare la porta di lettura SMS, il tempo di controllo della posta in arrivo e selezionare il LED di notifica."
+
+msgid "Check inbox every minute(s)"
+msgstr "Controlla posta in arrivo ogni minuto(i)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Specifica ogni quanti minuti controllare la posta in arrivo."
+
+msgid "Notification LED"
+msgstr "LED di notifica"
+
+msgid "Select the notification LED."
+msgstr "Seleziona il LED di notifica."
+
+msgid "Notify new messages"
+msgstr "Notifica nuovi messaggi"
+
+msgid "Restart the inbox checking process every"
+msgstr "Riavvia il processo di controllo ogni"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Il processo verrà riavviato all'intervallo selezionato. Ciò eliminerà il ritardo nel controllo della posta in arrivo."
+
+msgid "4h"
+msgstr "4 ore"
+
+msgid "6h"
+msgstr "6 ore"
+
+msgid "8h"
+msgstr "8 ore"
+
+msgid "12h"
+msgstr "12 ore"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Il diodo è dedicato solo a queste notifiche"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Seleziona 'No' se il router ha un solo LED o se il LED è multi-funzione.
Importante Questa opzione richiede che il LED sia definito nel sistema (se possibile) per funzionare correttamente. Questo requisito si applica quando il diodo supporta più attività."
+
+msgid "Force EHLO"
+msgstr "Forza EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Costringe mailsend a usare sempre EHLO invece di rilevare automaticamente HELO/EHLO. Abilita solo se l'inoltro fallisce, poiché alcuni server (ad es. gateway aziendali, Microsoft 365 / Exchange Online Protection) non annunciano correttamente il supporto ESMTP, impedendo il funzionamento di STARTTLS/autenticazione."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "La codifica Unicode (70 caratteri per impostazione predefinita) supporta la trasmissione di caratteri nazionali e messaggi SMS multiparte"
+
+msgid "Not applicable"
+msgstr "Non applicabile"
diff --git a/luci-app-sms-tool-js/po/ja/sms-tool-js.po b/luci-app-sms-tool-js/po/ja/sms-tool-js.po
new file mode 100644
index 000000000..6920ffb6b
--- /dev/null
+++ b/luci-app-sms-tool-js/po/ja/sms-tool-js.po
@@ -0,0 +1,564 @@
+msgid ""
+msgstr ""
+"Language: ja\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "SMS Messages"
+msgstr "SMS メッセージ"
+
+msgid "Received Messages"
+msgstr "受信メッセージ"
+
+msgid "Send Messages"
+msgstr "メッセージを送信"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "送信者"
+
+msgid "Received"
+msgstr "受信"
+
+msgid "Message"
+msgstr "メッセージ"
+
+msgid "Configuration"
+msgstr "設定"
+
+msgid "AT Commands"
+msgstr "AT コマンド"
+
+msgid "Configuration"
+msgstr "設定"
+
+msgid "Please enter phone number"
+msgstr "電話番号を入力してください"
+
+msgid "Please enter a message text"
+msgstr "メッセージテキストを入力してください"
+
+msgid "Reply"
+msgstr "返信"
+
+msgid "Please enter a USSD code"
+msgstr "USSD コードを入力してください"
+
+msgid "USSD Codes"
+msgstr "USSD コード"
+
+msgid "Send to"
+msgstr "送信先"
+
+msgid "Message text"
+msgstr "メッセージテキスト"
+
+msgid "Send"
+msgstr "送信"
+
+msgid "Send to number"
+msgstr "番号に送信"
+
+msgid "to number"
+msgstr "番号へ"
+
+msgid "to group"
+msgstr "グループへ"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS が正常に送信されました"
+
+msgid "Code to send"
+msgstr "送信するコード"
+
+msgid "Send code"
+msgstr "コードを送信"
+
+msgid "SMS Settings"
+msgstr "SMS 設定"
+
+msgid "USSD Codes Settings"
+msgstr "USSD コード設定"
+
+msgid "SMS reading port"
+msgstr "SMS 読み込みポート"
+
+msgid "SMS sending port"
+msgstr "SMS 送信ポート"
+
+msgid "AT commands sending port"
+msgstr "AT コマンド送信ポート"
+
+msgid "AT Commands Settings"
+msgstr "AT コマンド設定"
+
+msgid "Merge split messages"
+msgstr "分割メッセージをマージ"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "このオプションをチェックするとメッセージの読み取りが容易になりますが、表示されたメッセージ数と受信したメッセージ数に不一致が生じます。"
+
+msgid "USSD sending port"
+msgstr "USSD 送信ポート"
+
+msgid "Sending USSD code in plain text"
+msgstr "USSD コードをプレーンテキストで送信"
+
+msgid "Receive message without PDU decoding"
+msgstr "PDU デコードなしでメッセージを受信"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "USSD コードをプレーンテキストで送信してください。コマンドは PDU にエンコードされていません。"
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "メッセージを PDU としてデコードせずに受信して表示してください。"
+
+msgid "Explanation of number and prefix"
+msgstr "番号とプリフィックスの説明"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "SMS 送信タブにプリフィックスと正しい電話番号の説明を表示します。"
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "電話番号の前には国コード(ポーランドの場合は 48、'+' なし)を付ける必要があります。5、4、3 文字の数字は「短い」と見なされ、国コードを付けてはいけません。"
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "電話番号の前には国コード(ポーランドの場合は 48、+ なし)を付ける必要があります。5、4、3 文字の数字は短いと見なされ、国コードを付けてはいけません。"
+
+msgid "Add prefix to phone number"
+msgstr "電話番号にプリフィックスを追加"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "電話番号フィールドに自動的にプリフィックスを追加します。"
+
+msgid "Prefix number"
+msgstr "プリフィックス番号"
+
+msgid "Please specify the command to send"
+msgstr "送信するコマンドを指定してください"
+
+msgid "Please specify the code to send"
+msgstr "送信するコードを指定してください"
+
+msgid "Please set the port for communication with the modem"
+msgstr "モデムとの通信用ポートを設定してください"
+
+msgid "User AT commands"
+msgstr "ユーザー AT コマンド"
+
+msgid "Command to send"
+msgstr "送信するコマンド"
+
+msgid "Clear form"
+msgstr "フォームをクリア"
+
+msgid "Send command"
+msgstr "コマンドを送信"
+
+msgid "Send code"
+msgstr "コードを送信"
+
+msgid "Reply"
+msgstr "返信"
+
+msgid "Message storage area"
+msgstr "メッセージストレージエリア"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "メッセージは特定の場所(SIM カードまたはモデムメモリなど)に保存されていますが、デバイスの種類によっては他の領域も利用可能です。"
+
+msgid "SIM card"
+msgstr "SIM カード"
+
+msgid "Modem memory"
+msgstr "モデムメモリ"
+
+msgid "Storage used / Total capacity"
+msgstr "使用済みストレージ / 総容量"
+
+msgid "Delete selected"
+msgstr "選択したものを削除"
+
+msgid "Delete"
+msgstr "削除"
+
+msgid "Delete all"
+msgstr "すべて削除"
+
+msgid "Refresh"
+msgstr "更新"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "削除するメッセージを選択してください"
+
+msgid "Delete selected message(s)?"
+msgstr "選択したメッセージを削除しますか?"
+
+msgid "Delete all the messages?"
+msgstr "すべてのメッセージを削除しますか?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool を使用してメッセージを読み取るユーザーインターフェース。sms-tool の詳細については %seko.one.pl フォーラム%s を参照してください。"
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool を使用してメッセージを送信するユーザーインターフェース。sms-tool の詳細については %seko.one.pl フォーラム%s を参照してください。"
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool を使用して AT コマンドを送信するユーザーインターフェース。sms-tool の詳細については %seko.one.pl フォーラム%s を参照してください。"
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool を使用して USSD コードを送信するユーザーインターフェース。sms-tool の詳細については %seko.one.pl フォーラム%s を参照してください。"
+
+msgid "Configuration sms-tool"
+msgstr "sms-tool 設定"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "sms-tool および GUI アプリケーションの設定パネル。"
+
+msgid "Port for communication with the modem"
+msgstr "モデムとの通信用ポート"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "利用可能な ttyUSBX ポートの 1 つを選択します。"
+
+msgid "Please select a port"
+msgstr "ポートを選択してください"
+
+msgid "User contacts"
+msgstr "ユーザーの連絡先"
+
+msgid "Enable group messaging"
+msgstr "グループメッセージングを有効化"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "このオプションを使用すると、ユーザーの連絡先リスト内のすべての連絡先に 1 つのメッセージを送信できます。"
+
+msgid "Message sending delay"
+msgstr "メッセージ送信遅延"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[ボット] メッセージが送信されました:"
+
+msgid "User USSD codes"
+msgstr "ユーザー USSD コード"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "各行には次の形式である必要があります: '連絡先名;電話番号'。ユーザーの便宜のため、ファイルは /etc/modem/phonebook.user に保存されます。"
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "[Enter] キーを押してコマンドを送信し、[Delete] キーを押してコマンドを削除します"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "[Enter] キーを押してコードを送信し、[Delete] キーを押してコードを削除します"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "[Delete] キーを押して電話番号を削除"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "[Delete] キーを押してメッセージの内容を削除"
+
+msgid "Notification Settings"
+msgstr "通知設定"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED が新しいメッセージについて通知します。この機能を有効化する前に、SMS 読み込みポート、SMS 受信トレイをチェックする時間を設定して保存し、通知 LED を選択してください。"
+
+msgid "Check inbox every minute(s)"
+msgstr "受信トレイを毎分確認"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "受信トレイをチェックする間隔(分)を指定します。"
+
+msgid "Error loading AT commands file: "
+msgstr "AT コマンドファイルの読み込みエラー: "
+
+msgid "Select file with AT commands to load"
+msgstr "読み込む AT コマンドのファイルを選択"
+
+msgid "Error loading AT commands file: "
+msgstr "AT コマンドファイルの読み込みエラー: "
+
+msgid "No AT commands available"
+msgstr "利用可能な AT コマンドなし"
+
+msgid "Error loading initial AT commands file:"
+msgstr "初期 AT コマンドファイルの読み込みエラー:"
+
+msgid "Error loading USSD codes file: "
+msgstr "USSD コードファイルの読み込みエラー: "
+
+msgid "Error loading initial USSD file:"
+msgstr "初期 USSD ファイルの読み込みエラー:"
+
+msgid "Select file with USSD codes to load"
+msgstr "読み込む USSD コードのファイルを選択"
+
+msgid "No USSD codes available"
+msgstr "利用可能な USSD コードなし"
+
+msgid "Defined USSD code files"
+msgstr "定義された USSD コードファイル"
+
+msgid "File uploaded and saved to"
+msgstr "ファイルがアップロードされて保存されました:"
+
+msgid "Unable to upload file"
+msgstr "ファイルをアップロードできません"
+
+msgid "Phonebook saved successfully"
+msgstr "電話帳が正常に保存されました"
+
+msgid "Unable to save the file"
+msgstr "ファイルを保存できません"
+
+msgid "filename.user"
+msgstr "ファイル名.user"
+
+msgid "Select or create a file to edit..."
+msgstr "編集するファイルを選択または作成してください..."
+
+msgid "Please enter a file name"
+msgstr "ファイル名を入力してください"
+
+msgid "File created successfully"
+msgstr "ファイルが正常に作成されました"
+
+msgid "Unable to create file"
+msgstr "ファイルを作成できません"
+
+msgid "Please select a file to delete"
+msgstr "削除するファイルを選択してください"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "このファイルを削除してもよろしいですか?"
+
+msgid "File deleted successfully"
+msgstr "ファイルが正常に削除されました"
+
+msgid "Unable to delete file"
+msgstr "ファイルを削除できません"
+
+msgid "Please select or create a file first"
+msgstr "最初にファイルを選択または作成してください"
+
+msgid "File saved successfully"
+msgstr "ファイルが正常に保存されました"
+
+msgid "Unable to save file"
+msgstr "ファイルを保存できません"
+
+msgid "Load .user file"
+msgstr ".user ファイルを読み込む"
+
+msgid "Save .user file"
+msgstr ".user ファイルを保存"
+
+msgid "Manage contacts"
+msgstr "連絡先を管理"
+
+msgid "Edit User Contacts"
+msgstr "ユーザー連絡先を編集"
+
+msgid "Manage USSD codes"
+msgstr "USSD コードを管理"
+
+msgid "Manage User USSD Codes"
+msgstr "ユーザー USSD コードを管理"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "各行には次の形式である必要があります: 'コードの説明;コード'。ユーザーの便宜のため、ファイルは /etc/modem/ussdcodes/ に保存されます。"
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "各行には次の形式である必要があります: 'AT コマンドの説明;AT コマンド'。ユーザーの便宜のため、ファイルは /etc/modem/atcmmds/ に保存されます。"
+
+msgid "Manage AT commands"
+msgstr "AT コマンドを管理"
+
+msgid "Manage User AT Commands"
+msgstr "ユーザー AT コマンドを管理"
+
+msgid "-- Select file --"
+msgstr "-- ファイルを選択 --"
+
+msgid "Select file"
+msgstr "ファイルを選択"
+
+msgid "New file name"
+msgstr "新しいファイル名"
+
+msgid "Delete selected file"
+msgstr "選択したファイルを削除"
+
+msgid "Show notification icon"
+msgstr "通知アイコンを表示"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "ステータス概要ページに新しいメッセージ通知アイコンを表示します。"
+
+msgid "Loading..."
+msgstr "読み込み中..."
+
+msgid "Modem"
+msgstr "モデム"
+
+msgid "Modems"
+msgstr "モデム"
+
+msgid "Signal Quality"
+msgstr "信号品質"
+
+msgid "Align preview to:"
+msgstr "プレビューを配置:"
+
+msgid "Left"
+msgstr "左"
+
+msgid "Center"
+msgstr "中央"
+
+msgid "Right"
+msgstr "右"
+
+msgid "New message information block settings"
+msgstr "新しいメッセージ情報ブロック設定"
+
+msgid "Alignment settings saved successfully"
+msgstr "配置設定が正常に保存されました"
+
+msgid "SMS Info"
+msgstr "SMS 情報"
+
+msgid "New SMS"
+msgstr "新しい SMS"
+
+msgid "No new SMS"
+msgstr "新しい SMS なし"
+
+msgid "Deleting files"
+msgstr "ファイルを削除中"
+
+msgid "Delete all files"
+msgstr "すべてのファイルを削除"
+
+msgid "Load .gz archive"
+msgstr ".gz アーカイブを読み込む"
+
+msgid "Save .gz archive"
+msgstr ".gz アーカイブを保存"
+
+msgid "File uploaded and saved to"
+msgstr "ファイルがアップロードされて保存されました:"
+
+msgid "Failed to extract archive"
+msgstr "アーカイブの抽出に失敗しました"
+
+msgid "Archive extracted to"
+msgstr "アーカイブが抽出されました:"
+
+msgid "Upload error"
+msgstr "アップロードエラー"
+
+msgid "Failed to create archive"
+msgstr "アーカイブの作成に失敗しました"
+
+msgid "Failed to read archive"
+msgstr "アーカイブの読み取りに失敗しました"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "フォルダ内のすべてのファイルを削除してもよろしいですか?"
+
+msgid "All files deleted successfully"
+msgstr "すべてのファイルが正常に削除されました"
+
+msgid "Calls"
+msgstr "通話"
+
+msgid "Call Log"
+msgstr "通話ログ"
+
+msgid "Clear all call log entries?"
+msgstr "すべての通話ログエントリをクリアしますか?"
+
+msgid "No call log entries found"
+msgstr "通話ログエントリが見つかりません"
+
+msgid "No matching call log entries found"
+msgstr "一致する通話ログエントリが見つかりません"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "通話ログを表示するユーザーインターフェース。ログはバックグラウンドデーモンによって収集されます。"
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "通話ログデーモンが無効です。ログの収集を開始するには、設定で有効にしてください。"
+
+msgid "Filter call type"
+msgstr "通話タイプをフィルタリング"
+
+msgid "All calls"
+msgstr "すべての通話"
+
+msgid "Missed calls"
+msgstr "不在着信"
+
+msgid "Received calls"
+msgstr "受信通話"
+
+msgid "Dialed calls"
+msgstr "ダイヤルした通話"
+
+msgid "Refresh"
+msgstr "更新"
+
+msgid "Clear Log"
+msgstr "ログをクリア"
+
+msgid "Date"
+msgstr "日付"
+
+msgid "Type"
+msgstr "タイプ"
+
+msgid "Number"
+msgstr "番号"
+
+msgid "Duration"
+msgstr "期間"
+
+msgid "Name"
+msgstr "名前"
+
+msgid "Call log reading port"
+msgstr "通話ログ読み込みポート"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "利用可能な ttyUSBX ポートの 1 つを選択します。"
+
+msgid "Please select a port"
+msgstr "ポートを選択してください"
+
+msgid "Enable call log daemon"
+msgstr "通話ログデーモンを有効化"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "着信と不在着信をログに記録するバックグラウンドプロセス。"
+
+msgid "Call Log Settings"
+msgstr "通話履歴の設定"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "着信および不在着信を記録するバックグラウンドプロセス。
重要 このオプションは、内部通話履歴メモリを持たず、標準のAT+CPBRコマンドをサポートしないQualcommモデム専用です。このオプションを有効にすると、新しいタブが追加されます。専用タブが表示されない場合は、ブラウザのキャッシュをクリアしてルーターを再起動してください。"
+
+msgid "Force EHLO"
+msgstr "EHLOを強制"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "サーバー応答からHELO/EHLOを自動判定するのではなく、mailsendに常にEHLOを使用させます。 転送に失敗した場合のみ有効にしてください。一部のサーバー(企業ゲートウェイやMicrosoft 365 / Exchange Online Protectionなど)はESMTPサポートを正しく通知せず、STARTTLS/認証が機能しなくなることがあります。"
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicodeエンコーディング(デフォルトで70文字)は、各国の文字とマルチパートSMSメッセージの送信をサポートします"
+
+msgid "Not applicable"
+msgstr "該当なし"
diff --git a/luci-app-sms-tool-js/po/ko/sms-tool-js.po b/luci-app-sms-tool-js/po/ko/sms-tool-js.po
new file mode 100644
index 000000000..34ed271dc
--- /dev/null
+++ b/luci-app-sms-tool-js/po/ko/sms-tool-js.po
@@ -0,0 +1,564 @@
+msgid ""
+msgstr ""
+"Language: ko\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "SMS Messages"
+msgstr "SMS 메시지"
+
+msgid "Received Messages"
+msgstr "수신 메시지"
+
+msgid "Send Messages"
+msgstr "메시지 보내기"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "발신자"
+
+msgid "Received"
+msgstr "수신됨"
+
+msgid "Message"
+msgstr "메시지"
+
+msgid "Configuration"
+msgstr "설정"
+
+msgid "AT Commands"
+msgstr "AT 명령"
+
+msgid "Configuration"
+msgstr "설정"
+
+msgid "Please enter phone number"
+msgstr "전화번호를 입력하세요"
+
+msgid "Please enter a message text"
+msgstr "메시지 텍스트를 입력하세요"
+
+msgid "Reply"
+msgstr "회신"
+
+msgid "Please enter a USSD code"
+msgstr "USSD 코드를 입력하세요"
+
+msgid "USSD Codes"
+msgstr "USSD 코드"
+
+msgid "Send to"
+msgstr "보내기"
+
+msgid "Message text"
+msgstr "메시지 텍스트"
+
+msgid "Send"
+msgstr "보내기"
+
+msgid "Send to number"
+msgstr "번호로 보내기"
+
+msgid "to number"
+msgstr "번호로"
+
+msgid "to group"
+msgstr "그룹으로"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS가 성공적으로 전송되었습니다"
+
+msgid "Code to send"
+msgstr "보낼 코드"
+
+msgid "Send code"
+msgstr "코드 보내기"
+
+msgid "SMS Settings"
+msgstr "SMS 설정"
+
+msgid "USSD Codes Settings"
+msgstr "USSD 코드 설정"
+
+msgid "SMS reading port"
+msgstr "SMS 읽기 포트"
+
+msgid "SMS sending port"
+msgstr "SMS 전송 포트"
+
+msgid "AT commands sending port"
+msgstr "AT 명령 전송 포트"
+
+msgid "AT Commands Settings"
+msgstr "AT 명령 설정"
+
+msgid "Merge split messages"
+msgstr "분할 메시지 병합"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "이 옵션을 선택하면 메시지를 읽기 쉬워지지만 표시된 메시지 수와 수신된 메시지 수의 불일치가 발생합니다."
+
+msgid "USSD sending port"
+msgstr "USSD 전송 포트"
+
+msgid "Sending USSD code in plain text"
+msgstr "USSD 코드를 평문으로 보내기"
+
+msgid "Receive message without PDU decoding"
+msgstr "PDU 디코딩 없이 메시지 수신"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "USSD 코드를 평문으로 보냅니다. 명령이 PDU로 인코딩되지 않습니다."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "메시지를 PDU로 디코딩하지 않고 수신하고 표시합니다."
+
+msgid "Explanation of number and prefix"
+msgstr "번호 및 접두사 설명"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "SMS 전송 탭에서 접두사와 올바른 전화번호에 대한 설명을 표시합니다."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "전화번호 앞에는 국가 코드(폴란드는 48, '+' 제외)가 붙어야 합니다. 숫자가 5, 4, 3자이면 '짧음'으로 간주되며 국가 코드 앞에 붙이지 않아야 합니다."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "전화번호 앞에는 국가 코드(폴란드는 48, + 제외)가 붙어야 합니다. 숫자가 5, 4, 3자이면 짧음으로 간주되며 국가 코드 앞에 붙이지 않아야 합니다."
+
+msgid "Add prefix to phone number"
+msgstr "전화번호에 접두사 추가"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "전화번호 필드에 자동으로 접두사를 추가합니다."
+
+msgid "Prefix number"
+msgstr "접두사 번호"
+
+msgid "Please specify the command to send"
+msgstr "보낼 명령을 지정하세요"
+
+msgid "Please specify the code to send"
+msgstr "보낼 코드를 지정하세요"
+
+msgid "Please set the port for communication with the modem"
+msgstr "모뎀과의 통신 포트를 설정하세요"
+
+msgid "User AT commands"
+msgstr "사용자 AT 명령"
+
+msgid "Command to send"
+msgstr "보낼 명령"
+
+msgid "Clear form"
+msgstr "양식 지우기"
+
+msgid "Send command"
+msgstr "명령 보내기"
+
+msgid "Send code"
+msgstr "코드 보내기"
+
+msgid "Reply"
+msgstr "회신"
+
+msgid "Message storage area"
+msgstr "메시지 저장소"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "메시지는 특정 위치(예: SIM 카드 또는 모뎀 메모리)에 저장되지만 장치 유형에 따라 다른 영역도 사용할 수 있습니다."
+
+msgid "SIM card"
+msgstr "SIM 카드"
+
+msgid "Modem memory"
+msgstr "모뎀 메모리"
+
+msgid "Storage used / Total capacity"
+msgstr "사용된 저장소 / 총 용량"
+
+msgid "Delete selected"
+msgstr "선택 항목 삭제"
+
+msgid "Delete"
+msgstr "삭제"
+
+msgid "Delete all"
+msgstr "모두 삭제"
+
+msgid "Refresh"
+msgstr "새로 고침"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "삭제할 메시지를 선택하세요"
+
+msgid "Delete selected message(s)?"
+msgstr "선택한 메시지를 삭제하시겠습니까?"
+
+msgid "Delete all the messages?"
+msgstr "모든 메시지를 삭제하시겠습니까?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool을 사용하여 메시지를 읽기 위한 사용자 인터페이스입니다. sms-tool에 대한 자세한 내용은 %seko.one.pl 포럼%s을 참조하세요."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool을 사용하여 메시지를 보내기 위한 사용자 인터페이스입니다. sms-tool에 대한 자세한 내용은 %seko.one.pl 포럼%s을 참조하세요."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool을 사용하여 AT 명령을 보내기 위한 사용자 인터페이스입니다. sms-tool에 대한 자세한 내용은 %seko.one.pl 포럼%s을 참조하세요."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool을 사용하여 USSD 코드를 보내기 위한 사용자 인터페이스입니다. sms-tool에 대한 자세한 내용은 %seko.one.pl 포럼%s을 참조하세요."
+
+msgid "Configuration sms-tool"
+msgstr "sms-tool 설정"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "sms-tool 및 gui 응용 프로그램의 설정 패널입니다."
+
+msgid "Port for communication with the modem"
+msgstr "모뎀과의 통신 포트"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "사용 가능한 ttyUSBX 포트 중 하나를 선택합니다."
+
+msgid "Please select a port"
+msgstr "포트를 선택하세요"
+
+msgid "User contacts"
+msgstr "사용자 연락처"
+
+msgid "Enable group messaging"
+msgstr "그룹 메시징 사용"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "이 옵션을 사용하면 사용자의 연락처 목록의 모든 연락처에 하나의 메시지를 보낼 수 있습니다."
+
+msgid "Message sending delay"
+msgstr "메시지 전송 지연"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[봇] 메시지가 전송되었습니다:"
+
+msgid "User USSD codes"
+msgstr "사용자 USSD 코드"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "각 줄의 형식은 다음과 같아야 합니다: '연락처 이름;전화번호'. 사용자의 편의를 위해 파일은 /etc/modem/phonebook.user에 저장됩니다."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "[Enter] 키를 눌러 명령을 보내고, [Delete] 키를 눌러 명령을 삭제합니다"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "[Enter] 키를 눌러 코드를 보내고, [Delete] 키를 눌러 코드를 삭제합니다"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "[Delete] 키를 눌러 전화번호를 삭제합니다"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "[Delete] 키를 눌러 메시지 내용을 삭제합니다"
+
+msgid "Notification Settings"
+msgstr "알림 설정"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED는 새 메시지에 대해 알립니다. 이 기능을 활성화하기 전에 SMS 읽기 포트를 설정하고 저장하고, SMS 받은편지함을 확인할 시간을 설정하고, 알림 LED를 선택하세요."
+
+msgid "Check inbox every minute(s)"
+msgstr "받은편지함 확인 간격(분)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "받은편지함을 확인할 간격(분)을 지정합니다."
+
+msgid "Error loading AT commands file: "
+msgstr "AT 명령 파일 로드 오류: "
+
+msgid "Select file with AT commands to load"
+msgstr "로드할 AT 명령 파일 선택"
+
+msgid "Error loading AT commands file: "
+msgstr "AT 명령 파일 로드 오류: "
+
+msgid "No AT commands available"
+msgstr "사용 가능한 AT 명령 없음"
+
+msgid "Error loading initial AT commands file:"
+msgstr "초기 AT 명령 파일 로드 오류:"
+
+msgid "Error loading USSD codes file: "
+msgstr "USSD 코드 파일 로드 오류: "
+
+msgid "Error loading initial USSD file:"
+msgstr "초기 USSD 파일 로드 오류:"
+
+msgid "Select file with USSD codes to load"
+msgstr "로드할 USSD 코드 파일 선택"
+
+msgid "No USSD codes available"
+msgstr "사용 가능한 USSD 코드 없음"
+
+msgid "Defined USSD code files"
+msgstr "정의된 USSD 코드 파일"
+
+msgid "File uploaded and saved to"
+msgstr "파일이 업로드되고 저장됨:"
+
+msgid "Unable to upload file"
+msgstr "파일을 업로드할 수 없습니다"
+
+msgid "Phonebook saved successfully"
+msgstr "전화번호부가 성공적으로 저장되었습니다"
+
+msgid "Unable to save the file"
+msgstr "파일을 저장할 수 없습니다"
+
+msgid "filename.user"
+msgstr "filename.user"
+
+msgid "Select or create a file to edit..."
+msgstr "편집할 파일을 선택하거나 만듭니다..."
+
+msgid "Please enter a file name"
+msgstr "파일 이름을 입력하세요"
+
+msgid "File created successfully"
+msgstr "파일이 성공적으로 생성되었습니다"
+
+msgid "Unable to create file"
+msgstr "파일을 만들 수 없습니다"
+
+msgid "Please select a file to delete"
+msgstr "삭제할 파일을 선택하세요"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "이 파일을 삭제하시겠습니까?"
+
+msgid "File deleted successfully"
+msgstr "파일이 성공적으로 삭제되었습니다"
+
+msgid "Unable to delete file"
+msgstr "파일을 삭제할 수 없습니다"
+
+msgid "Please select or create a file first"
+msgstr "먼저 파일을 선택하거나 만듭니다"
+
+msgid "File saved successfully"
+msgstr "파일이 성공적으로 저장되었습니다"
+
+msgid "Unable to save file"
+msgstr "파일을 저장할 수 없습니다"
+
+msgid "Load .user file"
+msgstr ".user 파일 로드"
+
+msgid "Save .user file"
+msgstr ".user 파일 저장"
+
+msgid "Manage contacts"
+msgstr "연락처 관리"
+
+msgid "Edit User Contacts"
+msgstr "사용자 연락처 편집"
+
+msgid "Manage USSD codes"
+msgstr "USSD 코드 관리"
+
+msgid "Manage User USSD Codes"
+msgstr "사용자 USSD 코드 관리"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "각 줄의 형식은 다음과 같아야 합니다: '코드 설명;코드'. 사용자의 편의를 위해 파일은 /etc/modem/ussdcodes/에 저장됩니다."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "각 줄의 형식은 다음과 같아야 합니다: 'AT 명령 설명;AT 명령'. 사용자의 편의를 위해 파일은 /etc/modem/atcmmds/에 저장됩니다."
+
+msgid "Manage AT commands"
+msgstr "AT 명령 관리"
+
+msgid "Manage User AT Commands"
+msgstr "사용자 AT 명령 관리"
+
+msgid "-- Select file --"
+msgstr "-- 파일 선택 --"
+
+msgid "Select file"
+msgstr "파일 선택"
+
+msgid "New file name"
+msgstr "새 파일 이름"
+
+msgid "Delete selected file"
+msgstr "선택한 파일 삭제"
+
+msgid "Show notification icon"
+msgstr "알림 아이콘 표시"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "상태 개요 페이지에 새 메시지 알림 아이콘을 표시합니다."
+
+msgid "Loading..."
+msgstr "로드 중..."
+
+msgid "Modem"
+msgstr "모뎀"
+
+msgid "Modems"
+msgstr "모뎀"
+
+msgid "Signal Quality"
+msgstr "신호 품질"
+
+msgid "Align preview to:"
+msgstr "미리 보기 정렬:"
+
+msgid "Left"
+msgstr "왼쪽"
+
+msgid "Center"
+msgstr "중앙"
+
+msgid "Right"
+msgstr "오른쪽"
+
+msgid "New message information block settings"
+msgstr "새 메시지 정보 블록 설정"
+
+msgid "Alignment settings saved successfully"
+msgstr "정렬 설정이 성공적으로 저장되었습니다"
+
+msgid "SMS Info"
+msgstr "SMS 정보"
+
+msgid "New SMS"
+msgstr "새 SMS"
+
+msgid "No new SMS"
+msgstr "새 SMS 없음"
+
+msgid "Deleting files"
+msgstr "파일 삭제 중"
+
+msgid "Delete all files"
+msgstr "모든 파일 삭제"
+
+msgid "Load .gz archive"
+msgstr ".gz 아카이브 로드"
+
+msgid "Save .gz archive"
+msgstr ".gz 아카이브 저장"
+
+msgid "File uploaded and saved to"
+msgstr "파일이 업로드되고 저장됨:"
+
+msgid "Failed to extract archive"
+msgstr "아카이브 추출 실패"
+
+msgid "Archive extracted to"
+msgstr "아카이브가 추출됨:"
+
+msgid "Upload error"
+msgstr "업로드 오류"
+
+msgid "Failed to create archive"
+msgstr "아카이브 생성 실패"
+
+msgid "Failed to read archive"
+msgstr "아카이브 읽기 실패"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "폴더의 모든 파일을 삭제하시겠습니까?"
+
+msgid "All files deleted successfully"
+msgstr "모든 파일이 성공적으로 삭제되었습니다"
+
+msgid "Calls"
+msgstr "통화"
+
+msgid "Call Log"
+msgstr "통화 기록"
+
+msgid "Clear all call log entries?"
+msgstr "모든 통화 기록을 지우시겠습니까?"
+
+msgid "No call log entries found"
+msgstr "통화 기록이 없습니다"
+
+msgid "No matching call log entries found"
+msgstr "일치하는 통화 기록을 찾을 수 없습니다"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "통화 기록을 보기 위한 사용자 인터페이스입니다. 기록은 백그라운드 데몬에서 수집됩니다."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "통화 기록 데몬이 비활성화되었습니다. 기록 수집을 시작하려면 설정에서 활성화하세요."
+
+msgid "Filter call type"
+msgstr "통화 유형 필터"
+
+msgid "All calls"
+msgstr "모든 통화"
+
+msgid "Missed calls"
+msgstr "부재중 전화"
+
+msgid "Received calls"
+msgstr "수신 통화"
+
+msgid "Dialed calls"
+msgstr "발신 통화"
+
+msgid "Refresh"
+msgstr "새로 고침"
+
+msgid "Clear Log"
+msgstr "기록 지우기"
+
+msgid "Date"
+msgstr "날짜"
+
+msgid "Type"
+msgstr "유형"
+
+msgid "Number"
+msgstr "번호"
+
+msgid "Duration"
+msgstr "시간"
+
+msgid "Name"
+msgstr "이름"
+
+msgid "Call log reading port"
+msgstr "통화 기록 읽기 포트"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "사용 가능한 ttyUSBX 포트 중 하나를 선택합니다."
+
+msgid "Please select a port"
+msgstr "포트를 선택하세요"
+
+msgid "Enable call log daemon"
+msgstr "통화 기록 데몬 활성화"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "수신 및 부재중 전화를 기록하는 백그라운드 프로세스입니다."
+
+msgid "Call Log Settings"
+msgstr "통화 기록 설정"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "수신 및 부재중 통화를 기록하는 백그라운드 프로세스입니다.
중요 내부 통화 기록 메모리가 없고 표준 AT+CPBR 명령을 지원하지 않는 Qualcomm 모뎀 전용 옵션입니다. 이 옵션을 활성화하면 새 탭이 추가됩니다. 전용 탭이 나타나지 않으면 브라우저 캐시를 지우고 라우터를 재시작하십시오."
+
+msgid "Force EHLO"
+msgstr "EHLO 강제 사용"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "서버 응답에 따라 HELO/EHLO를 자동 감지하는 대신, mailsend가 항상 EHLO를 사용하도록 강제합니다. 전달이 실패하는 경우에만 활성화하세요. 일부 서버(예: 기업용 게이트웨이, Microsoft 365 / Exchange Online Protection)는 ESMTP 지원을 제대로 알리지 않아 STARTTLS/인증이 작동하지 않을 수 있습니다."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "유니코드 인코딩(기본 70자)은 국가별 문자 및 다중 파트 SMS 메시지 전송을 지원합니다"
+
+msgid "Not applicable"
+msgstr "해당 없음"
diff --git a/luci-app-sms-tool-js/po/nl/sms-tool-js.po b/luci-app-sms-tool-js/po/nl/sms-tool-js.po
new file mode 100644
index 000000000..af031b36f
--- /dev/null
+++ b/luci-app-sms-tool-js/po/nl/sms-tool-js.po
@@ -0,0 +1,888 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: nl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "SMS Messages"
+msgstr "SMS-berichten"
+
+msgid "Received Messages"
+msgstr "Ontvangen berichten"
+
+msgid "Send Messages"
+msgstr "Berichten verzenden"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Afzender"
+
+msgid "Received"
+msgstr "Ontvangen"
+
+msgid "Message"
+msgstr "Bericht"
+
+msgid "Configuration"
+msgstr "Configuratie"
+
+msgid "AT Commands"
+msgstr "AT-commando's"
+
+msgid "Please enter phone number"
+msgstr "Voer een telefoonnummer in"
+
+msgid "Please enter a message text"
+msgstr "Voer de tekst van het bericht in"
+
+msgid "Reply"
+msgstr "Beantwoorden"
+
+msgid "Please enter a USSD code"
+msgstr "Voer een USSD-code in"
+
+msgid "USSD Codes"
+msgstr "USSD-codes"
+
+msgid "Send to"
+msgstr "Verzenden naar"
+
+msgid "Message text"
+msgstr "Berichttekst"
+
+msgid "Send"
+msgstr "Verzenden"
+
+msgid "Send to number"
+msgstr "Verzenden naar nummer"
+
+msgid "to number"
+msgstr "naar nummer"
+
+msgid "to group"
+msgstr "naar groep"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS succesvol verzonden"
+
+msgid "Code to send"
+msgstr "Te verzenden code"
+
+msgid "Send code"
+msgstr "Code verzenden"
+
+msgid "SMS Settings"
+msgstr "SMS-instellingen"
+
+msgid "USSD Codes Settings"
+msgstr "Instellingen USSD-codes"
+
+msgid "SMS reading port"
+msgstr "Poort voor lezen SMS"
+
+msgid "SMS sending port"
+msgstr "Poort voor verzenden SMS"
+
+msgid "AT commands sending port"
+msgstr "Poort voor verzenden AT-commando's"
+
+msgid "AT Commands Settings"
+msgstr "Instellingen AT-commando's"
+
+msgid "Merge split messages"
+msgstr "Gesplitste berichten samenvoegen"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Het inschakelen van deze optie maakt het lezen van berichten gemakkelijker, maar veroorzaakt een verschil tussen het aantal weergegeven en daadwerkelijk ontvangen berichten."
+
+msgid "USSD sending port"
+msgstr "Poort voor verzenden USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "USSD-code als platte tekst verzenden"
+
+msgid "Receive message without PDU decoding"
+msgstr "Bericht ontvangen zonder PDU-decodering"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Verzendt de USSD-code als platte tekst. Het commando wordt niet naar PDU gecodeerd."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Ontvang en toon het bericht zonder het als een PDU te decoderen."
+
+msgid "Explanation of number and prefix"
+msgstr "Uitleg over nummer en prefix"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Toon op het tabblad voor het verzenden van sms'jes een uitleg van het landnummer (prefix) en het juiste telefoonnummer."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Het telefoonnummer moet worden voorafgegaan door het landnummer (voor Nederland bijv. 31, zonder '+'). Als het nummer uit 3, 4 of 5 tekens bestaat, wordt het behandeld als een 'kort nummer' en mag er geen landnummer voor staan."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Het telefoonnummer moet worden voorafgegaan door het landnummer (voor Nederland bijv. 31, zonder +). Als het nummer uit 3, 4 of 5 tekens bestaat, wordt het behandeld als een kort nummer en mag er geen landnummer voor staan."
+
+msgid "Add prefix to phone number"
+msgstr "Prefix aan telefoonnummer toevoegen"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Automatisch de prefix aan het telefoonnummerveld toevoegen."
+
+msgid "Prefix number"
+msgstr "Prefixnummer"
+
+msgid "Please specify the command to send"
+msgstr "Geef het te verzenden commando op"
+
+msgid "Please specify the code to send"
+msgstr "Geef de te verzenden code op"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Stel de poort in voor communicatie met de modem"
+
+msgid "User AT commands"
+msgstr "Gebruikers-AT-commando's"
+
+msgid "Command to send"
+msgstr "Te verzenden commando"
+
+msgid "Clear form"
+msgstr "Formulier wissen"
+
+msgid "Send command"
+msgstr "Commando verzenden"
+
+msgid "Message storage area"
+msgstr "Berichtenopslaglocatie"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Berichten worden op een specifieke locatie opgeslagen (bijvoorbeeld op de SIM-kaart of in het modemgeheugen), maar afhankelijk van het apparaattype kunnen er ook andere locaties beschikbaar zijn."
+
+msgid "SIM card"
+msgstr "SIM-kaart"
+
+msgid "Modem memory"
+msgstr "Modemgeheugen"
+
+msgid "Storage used / Total capacity"
+msgstr "Geheugen in gebruik / Totale capaciteit"
+
+msgid "Delete selected"
+msgstr "Selectie verwijderen"
+
+msgid "Delete"
+msgstr "Verwijderen"
+
+msgid "Delete all"
+msgstr "Alles verwijderen"
+
+msgid "Refresh"
+msgstr "Vernieuwen"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Selecteer de te verwijderen bericht(en)"
+
+msgid "Delete selected message(s)?"
+msgstr "Geselecteerde bericht(en) verwijderen?"
+
+msgid "Delete all the messages?"
+msgstr "Alle berichten verwijderen?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Gebruikersinterface voor het lezen van berichten met behulp van sms-tool. Meer informatie over sms-tool is te vinden op het %seko.one.pl-forum%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Gebruikersinterface voor het verzenden van berichten met behulp van sms-tool. Meer informatie over sms-tool is te vinden op het %seko.one.pl-forum%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Gebruikersinterface voor het verzenden van AT-commando's met behulp van sms-tool. Meer informatie over sms-tool is te vinden op het %seko.one.pl-forum%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Gebruikersinterface voor het verzenden van USSD-codes met behulp van sms-tool. Meer informatie over sms-tool is te vinden op het %seko.one.pl-forum%s."
+
+msgid "Configuration sms-tool"
+msgstr "Configuratie sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Configuratiepaneel voor sms-tool en de grafische interface."
+
+msgid "Port for communication with the modem"
+msgstr "Poort voor communicatie met de modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Selecteer een van de beschikbare ttyUSBX-poorten."
+
+msgid "Please select a port"
+msgstr "Selecteer een poort"
+
+msgid "User contacts"
+msgstr "Gebruikerscontacten"
+
+msgid "Enable group messaging"
+msgstr "Groepsberichten inschakelen"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Met deze optie kunt u één bericht naar alle contacten in de contactlijst van de gebruiker sturen."
+
+msgid "Message sending delay"
+msgstr "Vertraging bij verzenden bericht"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Bericht verzonden naar nummer:"
+
+msgid "User USSD codes"
+msgstr "USSD-codes van gebruiker"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Elke regel moet de volgende indeling hebben: 'Naam contactpersoon;telefoonnummer'. Gemakshalve wordt het bestand opgeslagen op de locatie /etc/modem/phonebook.user."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "Druk op [Enter] om het commando te verzenden, druk op [Delete] om het commando te verwijderen"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "Druk op [Enter] om de code te verzenden, druk op [Delete] om de code te verwijderen"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "Druk op [Delete] om het telefoonnummer te verwijderen"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "Druk op [Delete] om de inhoud van het bericht te verwijderen"
+
+msgid "Notification Settings"
+msgstr "Meldingeninstellingen"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "De LED informeert over een nieuw bericht. Voordat u deze functie activeert, dient u de poort voor het lezen van sms'jes en de controle-interval te configureren en op te slaan, en de meldings-LED te selecteren."
+
+msgid "Check inbox every minute(s)"
+msgstr "Inbox controleren elke minuut/minuten"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Geef op om de hoeveel minuten uw inbox moet worden gecontroleerd op nieuwe berichten."
+
+msgid "Notification LED"
+msgstr "Meldings-LED"
+
+msgid "Select the notification LED."
+msgstr "Selecteer de meldings-LED."
+
+msgid "Notify new messages"
+msgstr "Melding bij nieuwe berichten"
+
+msgid "Restart the inbox checking process every"
+msgstr "Het controleproces van de inbox herstarten elke"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Het proces herstart met het geselecteerde tijdsinterval. Dit elimineert de vertraging bij het controleren van uw inbox."
+
+msgid "4h"
+msgstr "4u"
+
+msgid "6h"
+msgstr "6u"
+
+msgid "8h"
+msgstr "8u"
+
+msgid "12h"
+msgstr "12u"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "De LED is uitsluitend bestemd voor deze meldingen"
+
+msgid ""
+"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
+"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr ""
+"Selecteer 'Nee' als de router slechts één LED heeft of als de LED voor meerdere taken wordt gebruikt.
Belangrijk Deze "
+"optie vereist dat de LED in het systeem is gedefinieerd (indien mogelijk) om correct te werken. Dit is vereist wanneer de LED meerdere functies ondersteunt."
+
+msgid ""
+"[3 - 59] second(s)
Important Messages "
+"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
+msgstr ""
+"[3 - 59] seconden
Belangrijk Berichten "
+"worden verzonden zonder verificatie en afleverbevestiging. Hierdoor bestaat het risico dat een bericht niet aankomt."
+
+msgid "No"
+msgstr "Nee"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "Merge algorithm"
+msgstr "Samenvoegalgoritme"
+
+msgid "Simple (merge without sorting)"
+msgstr "Eenvoudig (samenvoegen zonder sorteren)"
+
+msgid "Advanced (merges with sorting)"
+msgstr "Geavanceerd (samenvoegen met sorteren)"
+
+msgid "Phone number to be blurred"
+msgstr "Te maskeren telefoonnummer"
+
+msgid "The last 5 digits of this number will be blurred."
+msgstr "De laatste 5 cijfers van dit nummer worden onleesbaar gemaakt (vervaagd)."
+
+msgid "Expect a decimal value between five and fifty-nine"
+msgstr "Verwacht een decimale waarde tussen vijf en negenenvijftig"
+
+msgid "Expect a decimal value between three and fifty-nine"
+msgstr "Verwacht een decimale waarde tussen drie en negenenvijftig"
+
+msgid "Expect a decimal value"
+msgstr "Verwacht een decimale waarde"
+
+msgid "Direction of message merging"
+msgstr "Richting van berichtensamenvoeging"
+
+msgid "From beginning to end"
+msgstr "Van begin tot eind"
+
+msgid "From end to beginning"
+msgstr "Van eind to begin"
+
+msgid "Save messages to a text file"
+msgstr "Berichten opslaan in een tekstbestand"
+
+msgid "Save sms to txt file?"
+msgstr "SMS opslaan in .txt-bestand?"
+
+msgid "Save as .txt file"
+msgstr "Opslaan als .txt-bestand"
+
+msgid "Saving..."
+msgstr "Opslaan..."
+
+msgid "Please wait.. Process of saving SMS message to a text file is in progress."
+msgstr "Svp wachten.. Het opslaan van het SMS-bericht in een tekstbestand is bezig."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Met deze optie kunt u een back-up maken van SMS-berichten of bijvoorbeeld berichten opslaan die niet door sms-tool worden ondersteund."
+
+msgid "Delete all messages"
+msgstr "Alle berichten verwijderen"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Met deze optie kunt u alle SMS-berichten verwijderen wanneer ze niet zichtbaar zijn op het tabblad 'Ontvangen berichten'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Opslaan van SMS-berichten naar bestand mislukt. Probeer het opnieuw."
+
+msgid "PDU decoding scheme"
+msgstr "PDU-decoderingsschema"
+
+msgid "Autodetect"
+msgstr "Autodetectie"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Behoud het vorige antwoord bij het verzenden van een nieuwe USSD-code."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Vink deze optie aan als u een menu moet gebruiken dat op USSD-codes is gebaseerd"
+
+msgid "Turn over the replies."
+msgstr "Draai de antwoorden om."
+
+msgid "View new reply from top"
+msgstr "Nieuw antwoord van bovenaf bekijken"
+
+msgid "Please wait... deleted"
+msgstr "Svp wachten... verwijderd"
+
+msgid "of"
+msgstr "van"
+
+msgid "selected messages"
+msgstr "geselecteerde berichten"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+msgstr ""
+"Het pakket vereist configuratie door de gebruiker.
Het volgende "
+"moet worden ingesteld:
1. Alle poorten voor communicatie met de modem.
2. Aanvullende "
+"opties specifiek voor de gegeven modem (voor de afhandeling van USSD-codes).
3. Meldings-LED (optioneel).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Elke wijziging in de locatie waaruit SMS-berichten worden gelezen, vereist het vernieuwen van de berichten"
+
+msgid "Characters remaining:"
+msgstr "Resterende tekens:"
+
+msgid "Encoding standard"
+msgstr "Coderingsstandaard"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 tekens)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 tekens)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7-codering (160 tekens)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode-codering (70 tekens), ondersteunt het verzenden van nationale speciale tekens (in UTF-8) niet – alleen ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Dit tabblad stelt gebruikers in staat om het pakket te ondersteunen."
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Luci-app-sms-tool-js info"
+
+msgid "Report a bug"
+msgstr "Een fout rapporteren"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Schrijf in het topic van het pakket op het forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Schrijf op forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Meld een fout op de GitHub-pagina van het pakket"
+
+msgid "Open a package discussion on Github"
+msgstr "Open een discussie over het pakket op GitHub"
+
+msgid "Open discussion"
+msgstr "Open discussie"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Koop een kop koffie als u de ontwikkeling van het project en de auteur wilt ondersteunen"
+
+msgid "Buy a coffee"
+msgstr "Koop een kop koffie"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Word een sponsor als u de ontwikkeling van het project en de auteur wilt ondersteunen"
+
+msgid "Become a sponsor"
+msgstr "Sponsor worden"
+
+msgid "Package Info"
+msgstr "Pakketinformatie"
+
+msgid "Author (package maintainer)"
+msgstr "Auteur (pakketbeheerder)"
+
+msgid "Package update and support"
+msgstr "Pakketupdate en ondersteuning"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Instellingen voor SMS doorsturen naar e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "Er wordt een e-mail verzonden..."
+
+msgid "Enable message forwarding"
+msgstr "Berichten doorsturen inschakelen"
+
+msgid "E-mail settings"
+msgstr "E-mailinstellingen"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Selecteer vooraf gedefinieerde e-mailinstellingen of voer de instellingen handmatig in."
+
+msgid "Recipient"
+msgstr "Ontvanger"
+
+msgid "E-mail address of the recipient."
+msgstr "E-mailadres van de ontvanger."
+
+msgid "E-mail address of the sender."
+msgstr "E-mailadres van de afzender."
+
+msgid "User"
+msgstr "Gebruiker"
+
+msgid "Username for SMTP authentication."
+msgstr "Gebruikersnaam voor SMTP-authenticatie."
+
+msgid "Password"
+msgstr "Wachtwoord"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google app-wachtwoord / Wachtwoord voor SMTP-authenticatie."
+
+msgid "SMTP server"
+msgstr "SMTP-server"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Hostnaam/IP-adres van de SMTP-server."
+
+msgid "SMTP server port"
+msgstr "SMTP-serverpoort"
+
+msgid "Security"
+msgstr "Beveiliging"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: gebruik STARTTLS als de server dit ondersteunt."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP over SSL."
+
+msgid "Required Package"
+msgstr "Vereist pakket"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "De optie voor het doorsturen van SMS vereist dat het pakket mailsend is geïnstalleerd."
+
+msgid "Check required packages"
+msgstr "Vereiste pakketten controleren"
+
+msgid "Check"
+msgstr "Controleren"
+
+msgid "Mailsend Package"
+msgstr "Mailsend-pakket"
+
+msgid "Loading package data…"
+msgstr "Pakketgegevens laden…"
+
+msgid "Installed"
+msgstr "Geïnstalleerd"
+
+msgid "Install…"
+msgstr "Installeren…"
+
+msgid "Please select exactly one message to forward"
+msgstr "Selecteer exact één bericht om door te sturen"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Geselecteerd bericht doorsturen naar e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "E-mail verzenden..."
+
+msgid "Message forwarded successfully"
+msgstr "Bericht succesvol doorgestuurd"
+
+msgid "Failed to forward message: %s"
+msgstr "Doorsturen van bericht mislukt: %s"
+
+msgid "Error: %s"
+msgstr "Fout: %s"
+
+msgid "user define"
+msgstr "gebruikersdefinitie"
+
+msgid "Forward SMS"
+msgstr "SMS doorsturen"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Selecteer de door te sturen bericht(en)"
+
+msgid "SMS forwarding function is not enabled"
+msgstr "Functie voor het doorsturen van SMS is niet ingeschakeld"
+
+msgid "My Router"
+msgstr "Mijn router"
+
+msgid "Forward SMS to E-mail"
+msgstr "SMS doorsturen naar e-mail"
+
+msgid "Subject:"
+msgstr "Onderwerp:"
+
+msgid "Message text:"
+msgstr "Berichttekst:"
+
+msgid "Subject and body cannot be empty"
+msgstr "Onderwerp en tekst mogen niet leeg zijn"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Het pakket mailsend is niet geïnstalleerd. Installeer dit eerst via de onderstaande knop Installeren..."
+
+msgid "Select modem"
+msgstr "Modem selecteren"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Het wijzigen van een modem vereist het vernieuwen van de berichten"
+
+msgid "Defined AT command files"
+msgstr "Gedefinieerde AT-commandobestanden"
+
+msgid "Error loading AT commands file: "
+msgstr "Fout bij laden van AT-commandobestand: "
+
+msgid "Select file with AT commands to load"
+msgstr "Selecteer het te laden bestand met AT-commando's"
+
+msgid "No AT commands available"
+msgstr "Geen AT-commando's beschikbaar"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Fout bij laden van initieel AT-commandobestand:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Fout bij laden van USSD-codesbestand: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Fout bij laden van initieel USSD-bestand:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Selecteer het te laden bestand met USSD-codes"
+
+msgid "No USSD codes available"
+msgstr "Geen USSD-codes beschikbaar"
+
+msgid "Defined USSD code files"
+msgstr "Gedefinieerde USSD-codebestanden"
+
+msgid "File uploaded and saved to"
+msgstr "Bestand geüpload en opgeslagen in"
+
+msgid "Unable to upload file"
+msgstr "Kan bestand niet uploaden"
+
+msgid "Phonebook saved successfully"
+msgstr "Telefoonboek succesvol opgeslagen"
+
+msgid "Unable to save the file"
+msgstr "Kan het bestand niet opslaan"
+
+msgid "filename.user"
+msgstr "bestandsnaam.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Selecteer of maak een bestand aan om te bewerken..."
+
+msgid "Please enter a file name"
+msgstr "Voer een bestandsnaam in"
+
+msgid "File created successfully"
+msgstr "Bestand succesvol aangemaakt"
+
+msgid "Unable to create file"
+msgstr "Kan bestand niet aanmaken"
+
+msgid "Please select a file to delete"
+msgstr "Selecteer een bestand om te verwijderen"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Weet u zeker dat u dit bestand wilt verwijderen?"
+
+msgid "File deleted successfully"
+msgstr "Bestand succesvol verwijderd"
+
+msgid "Unable to delete file"
+msgstr "Kan bestand niet verwijderen"
+
+msgid "Please select or create a file first"
+msgstr "Selecteer of maak eerst een bestand aan"
+
+msgid "File saved successfully"
+msgstr "Bestand succesvol opgeslagen"
+
+msgid "Unable to save file"
+msgstr "Kan bestand niet opslaan"
+
+msgid "Load .user file"
+msgstr ".user-bestand laden"
+
+msgid "Save .user file"
+msgstr ".user-bestand opslaan"
+
+msgid "Manage contacts"
+msgstr "Contacten beheren"
+
+msgid "Edit User Contacts"
+msgstr "Gebruikerscontacten bewerken"
+
+msgid "Manage USSD codes"
+msgstr "USSD-codes beheren"
+
+msgid "Manage User USSD Codes"
+msgstr "Gebruikers-USSD-codes beheren"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Elke regel moet de volgende indeling hebben: 'Codebeschrijving;code'. Gemakshalve wordt het bestand opgeslagen op de locatie /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Elke regel moet de volgende indeling hebben: 'AT-commandobeschrijving;AT-commando'. Gemakshalve wordt het bestand opgeslagen op de locatie /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "AT-commando's beheren"
+
+msgid "Manage User AT Commands"
+msgstr "Gebruikers-AT-commando's beheren"
+
+msgid "-- Select file --"
+msgstr "-- Selecteer bestand --"
+
+msgid "Select file"
+msgstr "Selecteer bestand"
+
+msgid "New file name"
+msgstr "Nieuwe bestandsnaam"
+
+msgid "Delete selected file"
+msgstr "Geselecteerd bestand verwijderen"
+
+msgid "Show notification icon"
+msgstr "Meldingspictogram tonen"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Toon het meldingspictogram voor nieuwe berichten op de statusoverzichtspagina."
+
+msgid "Loading..."
+msgstr "Laden..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modems"
+
+msgid "Signal Quality"
+msgstr "Signaalkwaliteit"
+
+msgid "Align preview to:"
+msgstr "Voorbeeld uitlijnen naar:"
+
+msgid "Left"
+msgstr "Links"
+
+msgid "Center"
+msgstr "Midden"
+
+msgid "Right"
+msgstr "Rechts"
+
+msgid "New message information block settings"
+msgstr "Instellingen informatieblok voor nieuwe berichten"
+
+msgid "Alignment settings saved successfully"
+msgstr "Uitlijningsinstellingen succesvol opgeslagen"
+
+msgid "SMS Info"
+msgstr "SMS-info"
+
+msgid "New SMS"
+msgstr "Nieuwe SMS"
+
+msgid "No new SMS"
+msgstr "Geen nieuwe SMS"
+
+msgid "Deleting files"
+msgstr "Bestanden verwijderen"
+
+msgid "Delete all files"
+msgstr "Alle bestanden verwijderen"
+
+msgid "Load .gz archive"
+msgstr ".gz-archief laden"
+
+msgid "Save .gz archive"
+msgstr ".gz-archief opslaan"
+
+msgid "Failed to extract archive"
+msgstr "Uitpakken van archief mislukt"
+
+msgid "Archive extracted to"
+msgstr "Archief uitgepakt naar"
+
+msgid "Upload error"
+msgstr "Uploadfout"
+
+msgid "Failed to create archive"
+msgstr "Aanmaken van archief mislukt"
+
+msgid "Failed to read archive"
+msgstr "Lezen van archief mislukt"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Weet u zeker dat u alle bestanden in de map wilt verwijderen?"
+
+msgid "All files deleted successfully"
+msgstr "Alle bestanden succesvol verwijderd"
+
+msgid "Calls"
+msgstr "Oproepen"
+
+msgid "Call Log"
+msgstr "Oproeplogboek"
+
+msgid "Clear all call log entries?"
+msgstr "Alle vermeldingen in het oproeplogboek wissen?"
+
+msgid "No call log entries found"
+msgstr "Geen vermeldingen in het oproeplogboek gevonden"
+
+msgid "No matching call log entries found"
+msgstr "Geen overeenkomende vermeldingen in het oproeplogboek gevonden"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Gebruikersinterface voor het bekijken van oproeplogboeken. Het logboek wordt verzameld door een achtergrondservice."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Oproeplogboekservice is uitgeschakeld. Schakel deze in de configuratie in om te beginnen met het verzamelen van logboeken."
+
+msgid "Filter call type"
+msgstr "Oproeptype filteren"
+
+msgid "All calls"
+msgstr "Alle oproepen"
+
+msgid "Missed calls"
+msgstr "Gemiste oproepen"
+
+msgid "Received calls"
+msgstr "Ontvangen oproepen"
+
+msgid "Dialed calls"
+msgstr "Gekozen nummers"
+
+msgid "Clear Log"
+msgstr "Logboek wissen"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Type"
+msgstr "Type"
+
+msgid "Number"
+msgstr "Nummer"
+
+msgid "Duration"
+msgstr "Duur"
+
+msgid "Name"
+msgstr "Naam"
+
+msgid "Call log reading port"
+msgstr "Poort voor lezen van oproeplogboek"
+
+msgid "Enable call log daemon"
+msgstr "Oproeplogboekservice inschakelen"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Achtergrondproces om binnenkomende en gemiste oproepen te registreren."
+
+msgid "Call Log Settings"
+msgstr "Instellingen voor oproepgeschiedenis"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Achtergrondproces voor het registreren van inkomende en gemiste oproepen.
Belangrijk Optie speciaal voor Qualcomm-modems die geen intern geheugen voor gespreksgeschiedenis hebben en de standaard AT+CPBR-opdracht niet ondersteunen. Het inschakelen van deze optie voegt een nieuw tabblad toe. Als het tabblad niet verschijnt, wis dan de browsercache en herstart de router."
+
+msgid "Force EHLO"
+msgstr "EHLO forceren"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Dwingt mailsend om altijd EHLO te gebruiken in plaats van automatisch HELO/EHLO te detecteren. Schakel dit alleen in als doorsturen mislukt, omdat sommige servers (bijv. bedrijfsgateways, Microsoft 365 / Exchange Online Protection) ESMTP-ondersteuning niet correct aankondigen, waardoor STARTTLS/authenticatie niet werkt."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicode-codering (standaard 70 tekens) ondersteunt de verzending van nationale tekens en meerdelige sms-berichten"
+
+msgid "Not applicable"
+msgstr "Niet van toepassing"
diff --git a/luci-app-sms-tool-js/po/pl/sms-tool-js.po b/luci-app-sms-tool-js/po/pl/sms-tool-js.po
index 6ac9ccb15..153fa53e4 100644
--- a/luci-app-sms-tool-js/po/pl/sms-tool-js.po
+++ b/luci-app-sms-tool-js/po/pl/sms-tool-js.po
@@ -1,5 +1,7 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr ""
+"Project-Id-Version: luci-app-sms-tool-js\n"
+"Language-Team: Rafał Wabik (IceG)\n"
msgid "SMS Messages"
msgstr "Wiadomości SMS"
@@ -13,7 +15,7 @@ msgstr "Wysyłanie wiadomości"
msgid "USSD"
msgstr "USSD"
-msgid "From"
+msgid "Sender"
msgstr "Nadawca"
msgid "Received"
@@ -178,14 +180,14 @@ msgstr "Użyta pamięć / Całkowita pojemność"
msgid "Delete selected"
msgstr "Usuń wybraną"
-msgid "Delete message(s)"
-msgstr "Usuń wiadomość(-ci)"
+msgid "Delete"
+msgstr "Usuń"
msgid "Delete all"
msgstr "Usuń wszystkie"
-msgid "Refresh messages"
-msgstr "Odśwież wiadomości"
+msgid "Refresh"
+msgstr "Odśwież"
msgid "Please select the message(s) to be deleted"
msgstr "Proszę wybrać wiadomość(-ci) do usunięcia"
@@ -244,12 +246,6 @@ msgstr "Kody USSD użytkownika"
msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
msgstr "Każda linijka powinna mieć następujący format: 'Nazwa kontaktu;numer telefonu'. Dla wygody użytkownika kontakty zapisywane są w pliku /etc/modem/phonebook.user."
-msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
-msgstr "Każda linijka powinna mieć następujący format: 'Opis polecenia AT;polecenie AT'. Dla wygody użytkownika polecenia zapisywane są w pliku /etc/modem/atcmmds.user."
-
-msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
-msgstr "Każda linijka powinna mieć następujący format: 'Opis kodu;kod'. Dla wygody użytkownika kody zapisywane są w pliku /etc/modem/ussdcodes.user."
-
msgid "Press [Enter] to send the command, press [Delete] to delete the command"
msgstr "Wciśnij [Enter] aby wysłać polecenie, wciśnij [Delete] aby usunąć"
@@ -423,3 +419,501 @@ msgstr ""
msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
msgstr "Każda zmiana miejsca z którego SMS-y będą odczytywane wymaga odświeżenia wiadomości"
+
+msgid "Characters remaining:"
+msgstr "Pozostało znaków:"
+
+msgid "Encoding standard"
+msgstr "Standard kodowania"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 znaków)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 znaków)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Kodowanie GSM-7 (160 znaków)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Kodowanie Unicode (70 znaków), nie obsługuje wysyłania znaków narodowych (w utf8) – tylko ascii"
+
+msgid "The tab allows users to support the package."
+msgstr "Zakładka umożliwia użytkownikom wsparcie pakietu"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Informacje o pakiecie luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Zgłoś błąd"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Napisz w temacie pakietu na forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Napisz na forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Zgłoś błąd na stronie Github pakietu"
+
+msgid "Open a package discussion on Github"
+msgstr "Otwórz dyskusję na temat pakietu na Github"
+
+msgid "Open discussion"
+msgstr "Otwórz dyskusję"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Postaw kawę jeśli chcesz wesprzeć rozwój projektu oraz autora"
+
+msgid "Buy a coffee"
+msgstr "Postaw kawę"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Zostań sponsorem jeśli chcesz wesprzeć rozwój projektu oraz autora"
+
+msgid "Become a sponsor"
+msgstr "Zostań sponsorem"
+
+msgid "Package Info"
+msgstr "Informacja o pakiecie"
+
+msgid "Author (package maintainer)"
+msgstr "Autor (opiekun pakietu)"
+
+msgid "Package update and support"
+msgstr "Aktualizacja pakietu oraz wsparcie"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Ustawienia przekazywania SMS na e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "E-mail zostanie wysłany.."
+
+msgid "Enable message forwarding"
+msgstr "Włącz przekazywanie wiadomości"
+
+msgid "E-mail settings"
+msgstr "Ustawienia dla poczty e-mail"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Wybierz predefiniowane ustawienia poczty e-mail lub wprowadź ustawienia ręcznie."
+
+msgid "Recipient"
+msgstr "Odbiorca"
+
+msgid "E-mail address of the recipient."
+msgstr "Adres e-mail odbiorcy."
+
+msgid "Sender"
+msgstr "Nadawca"
+
+msgid "E-mail address of the sender."
+msgstr "Adres e-mail nadawcy."
+
+msgid "User"
+msgstr "Użytkownik"
+
+msgid "Username for SMTP authentication."
+msgstr "Nazwa użytkownika do uwierzytelnienia SMTP."
+
+msgid "Password"
+msgstr "Hasło"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Hasło do aplikacji Google / Hasło do uwierzytelnienia SMTP."
+
+msgid "SMTP server"
+msgstr "Serwer SMTP"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Nazwa hosta/adres IP serwera SMTP."
+
+msgid "SMTP server port"
+msgstr "Port serwera SMTP"
+
+msgid "Security"
+msgstr "Bezpieczeństwo"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: użyj STARTTLS jeśli serwer to obsługuje."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP przez SSL."
+
+msgid "Required Package"
+msgstr "Wymagany pakiet"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Opcja przekazywania wiadomości SMS wymaga zainstalowanego pakietu mailsend."
+
+msgid "Check required packages"
+msgstr "Sprawdź wymagane pakiety"
+
+msgid "Check"
+msgstr "Sprawdź"
+
+msgid "Mailsend Package"
+msgstr "Pakiet mailsend"
+
+msgid "Loading package data…"
+msgstr "Ładowanie danych pakietu…"
+
+msgid "Installed"
+msgstr "Zainstalowany"
+
+msgid "Install…"
+msgstr "Instaluj…"
+
+msgid "Mailsend Package"
+msgstr "Pakiet mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Proszę wybrać dokładnie jedną wiadomość do przekazania"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Przekazać wybraną wiadomość na e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Wysyłanie wiadomości e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Wiadomość została pomyślnie przekazana"
+
+msgid "Failed to forward message: %s"
+msgstr "Nie udało się przekazać wiadomości: %s"
+
+msgid "Error: %s"
+msgstr "Błąd: %s"
+
+msgid "user define"
+msgstr "ustawienia użytkownika"
+
+msgid "Forward SMS"
+msgstr "Przekaż SMS"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Wybierz wiadomość(-ci), którą(-e) chcesz przekazać dalej"
+
+msgid "SMS forwarding function is not enabled"
+msgstr "Funkcja przekazywania wiadomości SMS nie jest włączona"
+
+msgid "My Router"
+msgstr "Mój router"
+
+msgid "Forward SMS to E-mail"
+msgstr "Przekaż wiadomość(-ci) SMS na adres e-mail"
+
+msgid "Subject:"
+msgstr "Temat:"
+
+msgid "Message text:"
+msgstr "Treść wiadomości:"
+
+msgid "Send"
+msgstr "Wyślij"
+
+msgid "Subject and body cannot be empty"
+msgstr "Temat i treść nie mogą być puste"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Pakiet mailsend nie jest zainstalowany. Proszę najpierw go zainstalować, używając np. przycisku Instaluj... poniżej"
+
+msgid "Select modem"
+msgstr "Wybierz modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Zmiana modemu wymaga odświeżenia wiadomości"
+
+msgid "Defined AT command files"
+msgstr "Zdefiniowane pliki poleceń AT"
+
+msgid "Error loading AT commands file: "
+msgstr "Błąd wczytywania pliku z poleceniami AT: "
+
+msgid "Select file with AT commands to load"
+msgstr "Wybierz plik z poleceniami AT do wczytania"
+
+msgid "Error loading AT commands file: "
+msgstr "Błąd wczytywania pliku poleceń AT: "
+
+msgid "No AT commands available"
+msgstr "Brak dostępnych poleceń AT"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Błąd wczytywania początkowego pliku poleceń AT:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Błąd wczytywania pliku kodów USSD: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Błąd wczytywania początkowego pliku USSD:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Wybierz plik z kodami USSD do wczytania"
+
+msgid "No USSD codes available"
+msgstr "Brak dostępnych kodów USSD"
+
+msgid "Defined USSD code files"
+msgstr "Zdefiniowane pliki kodów USSD"
+
+msgid "File uploaded and saved to"
+msgstr "Plik przesłany i zapisany w"
+
+msgid "Unable to upload file"
+msgstr "Nie można przesłać pliku"
+
+msgid "Phonebook saved successfully"
+msgstr "Książka telefoniczna została pomyślnie zapisana"
+
+msgid "Unable to save the file"
+msgstr "Nie można zapisać pliku"
+
+msgid "filename.user"
+msgstr "nazwapliku.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Wybierz lub utwórz plik do edycji..."
+
+msgid "Please enter a file name"
+msgstr "Proszę podać nazwę pliku"
+
+msgid "File created successfully"
+msgstr "Plik został pomyślnie utworzony"
+
+msgid "Unable to create file"
+msgstr "Nie można utworzyć pliku"
+
+msgid "Please select a file to delete"
+msgstr "Proszę wybrać plik do usunięcia"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Czy na pewno chcesz usunąć ten plik?"
+
+msgid "File deleted successfully"
+msgstr "Plik został pomyślnie usunięty"
+
+msgid "Unable to delete file"
+msgstr "Nie można usunąć pliku"
+
+msgid "Please select or create a file first"
+msgstr "Najpierw wybierz lub utwórz plik"
+
+msgid "File saved successfully"
+msgstr "Plik został pomyślnie zapisany"
+
+msgid "Unable to save file"
+msgstr "Nie można zapisać pliku"
+
+msgid "Load .user file"
+msgstr "Załaduj plik .user"
+
+msgid "Save .user file"
+msgstr "Zapisz plik .user"
+
+msgid "Manage contacts"
+msgstr "Zarządzaj kontaktami"
+
+msgid "Edit User Contacts"
+msgstr "Edytuj kontakty użytkownika"
+
+msgid "Manage USSD codes"
+msgstr "Zarządzaj kodami USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Zarządzanie kodami USSD użytkownika"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Każda linijka powinna mieć następujący format: 'Opis kodu;kod'. Dla wygody użytkownika plik zapisywany jest w lokalizacji /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Każda linijka powinna mieć następujący format: 'Opis polecenia AT;polecenie AT'. Dla wygody użytkownika plik zapisywany jest w lokalizacji /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Zarządzaj poleceniami AT"
+
+msgid "Manage User AT Commands"
+msgstr "Zarządzanie poleceniami AT użytkownika"
+
+msgid "-- Select file --"
+msgstr "-- Wybierz plik --"
+
+msgid "Select file"
+msgstr "Wybierz plik"
+
+msgid "New file name"
+msgstr "Nazwa nowego pliku"
+
+msgid "Delete selected file"
+msgstr "Usuń wybrany plik"
+
+msgid "Show notification icon"
+msgstr "Pokaż ikonę powiadomień"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Pokaż ikonę powiadomień o nowych wiadomościach na stronie przeglądu stanu."
+
+msgid "Loading..."
+msgstr "Ładowanie..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modemy"
+
+msgid "Signal Quality"
+msgstr "Jakość sygnału"
+
+msgid "Align preview to:"
+msgstr "Wyrównaj podgląd do:"
+
+msgid "Left"
+msgstr "Lewej"
+
+msgid "Center"
+msgstr "Środka"
+
+msgid "Right"
+msgstr "Prawej"
+
+msgid "New message information block settings"
+msgstr "Ustawienia bloku z informacją o nowych wiadomościach"
+
+msgid "Alignment settings saved successfully"
+msgstr "Ustawienia wyrównania zostały pomyślnie zapisane"
+
+msgid "SMS Info"
+msgstr "Info SMS"
+
+msgid "New SMS"
+msgstr "Nowy(-e) SMS(-y)"
+
+msgid "No new SMS"
+msgstr "Brak nowych SMS-ów"
+
+msgid "Deleting files"
+msgstr "Usuwanie plików"
+
+msgid "Delete all files"
+msgstr "Usuń wszystkie pliki"
+
+msgid "Load .gz archive"
+msgstr "Załaduj archiwum .gz"
+
+msgid "Save .gz archive"
+msgstr "Zapisz archiwum .gz"
+
+msgid "File uploaded and saved to"
+msgstr "Plik został przesłany i zapisany w"
+
+msgid "Failed to extract archive"
+msgstr "Nie udało się rozpakować archiwum"
+
+msgid "Archive extracted to"
+msgstr "Archiwum rozpakowano do"
+
+msgid "Upload error"
+msgstr "Błąd przesyłania"
+
+msgid "Failed to create archive"
+msgstr "Nie udało się utworzyć archiwum"
+
+msgid "Failed to read archive"
+msgstr "Nie udało się odczytać archiwum"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Czy na pewno chcesz usunąć wszystkie pliki w folderze?"
+
+msgid "All files deleted successfully"
+msgstr "Wszystkie pliki zostały pomyślnie usunięte"
+
+msgid "Calls"
+msgstr "Połączenia"
+
+msgid "Call Log"
+msgstr "Rejestr połączeń"
+
+msgid "Clear all call log entries?"
+msgstr "Wyczyścić wszystkie wpisy w rejestrze połączeń?"
+
+msgid "No call log entries found"
+msgstr "Nie znaleziono wpisów w rejestrze połączeń"
+
+msgid "No matching call log entries found"
+msgstr "Nie znaleziono pasujących wpisów w rejestrze"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Interfejs użytkownika do przeglądania rejestrów połączeń. Rejestr jest gromadzony przez usługę działającą w tle."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Usługa rejestru połączeń jest wyłączona. Włącz ją w konfiguracji, aby rozpocząć gromadzenie logów."
+
+msgid "Filter call type"
+msgstr "Filtruj typ połączenia"
+
+msgid "All calls"
+msgstr "Wszystkie połączenia"
+
+msgid "Missed calls"
+msgstr "Nieodebrane"
+
+msgid "Received calls"
+msgstr "Odebrane"
+
+msgid "Dialed calls"
+msgstr "Wybrane numery"
+
+msgid "Refresh"
+msgstr "Odśwież"
+
+msgid "Clear Log"
+msgstr "Wyczyść rejestr"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Type"
+msgstr "Typ"
+
+msgid "Number"
+msgstr "Numer"
+
+msgid "Duration"
+msgstr "Czas trwania"
+
+msgid "Name"
+msgstr "Nazwa"
+
+msgid "Call log reading port"
+msgstr "Port odczytu rejestru połączeń"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Wybierz jeden z dostępnych portów ttyUSBX."
+
+msgid "Please select a port"
+msgstr "Proszę wybrać port"
+
+msgid "Enable call log daemon"
+msgstr "Włącz usługę rejestru połączeń"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Proces w tle do rejestrowania połączeń przychodzących i nieodebranych."
+
+msgid "Call Log Settings"
+msgstr "Ustawienia rejestru połączeń"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Proces działający w tle do rejestrowania połączeń przychodzących i nieodebranych.
Ważne Opcja przeznaczona dla modemów Qualcomm, które nie posiadają wewnętrznej pamięci historii połączeń i nie obsługują standardowego polecenia AT+CPBR. Włączenie tej opcji dodaje nową zakładkę. Jeśli dedykowana zakładka nie będzie widoczna, wyczyść pamięć podręczną przeglądarki i uruchom ponownie router."
+
+msgid "Force EHLO"
+msgstr "Wymuś EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Wymusza, aby mailsend zawsze używał EHLO zamiast automatycznie wykrywać HELO/EHLO. Włącz tylko wtedy, gdy przekazywanie wiadomości się nie udaje, ponieważ niektóre serwery (np. bramki firmowe, Microsoft 365 / Exchange Online Protection) niepoprawnie zgłaszają obsługę ESMTP, co uniemożliwia działanie STARTTLS/uwierzytelniania."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Kodowanie Unicode (domyślnie 70 znaków) obsługuje wieloczęściowe wiadomości sms oraz przesyłanie znaków narodowych"
+
+msgid "Not applicable"
+msgstr "Nie dotyczy"
diff --git a/luci-app-sms-tool-js/po/pt_BR/sms-tool-js.po b/luci-app-sms-tool-js/po/pt_BR/sms-tool-js.po
new file mode 100644
index 000000000..64b46f4ff
--- /dev/null
+++ b/luci-app-sms-tool-js/po/pt_BR/sms-tool-js.po
@@ -0,0 +1,564 @@
+msgid ""
+msgstr ""
+"Language: pt_BR\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "SMS Messages"
+msgstr "Mensagens SMS"
+
+msgid "Received Messages"
+msgstr "Mensagens Recebidas"
+
+msgid "Send Messages"
+msgstr "Enviar Mensagens"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Remetente"
+
+msgid "Received"
+msgstr "Recebido"
+
+msgid "Message"
+msgstr "Mensagem"
+
+msgid "Configuration"
+msgstr "Configuração"
+
+msgid "AT Commands"
+msgstr "Comandos AT"
+
+msgid "Configuration"
+msgstr "Configuração"
+
+msgid "Please enter phone number"
+msgstr "Digite o número de telefone"
+
+msgid "Please enter a message text"
+msgstr "Digite o texto da mensagem"
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Please enter a USSD code"
+msgstr "Digite o código USSD"
+
+msgid "USSD Codes"
+msgstr "Códigos USSD"
+
+msgid "Send to"
+msgstr "Enviar para"
+
+msgid "Message text"
+msgstr "Texto da mensagem"
+
+msgid "Send"
+msgstr "Enviar"
+
+msgid "Send to number"
+msgstr "Enviar para número"
+
+msgid "to number"
+msgstr "para número"
+
+msgid "to group"
+msgstr "para grupo"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS enviado com sucesso"
+
+msgid "Code to send"
+msgstr "Código a enviar"
+
+msgid "Send code"
+msgstr "Enviar código"
+
+msgid "SMS Settings"
+msgstr "Configurações de SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Configurações de Códigos USSD"
+
+msgid "SMS reading port"
+msgstr "Porta de leitura de SMS"
+
+msgid "SMS sending port"
+msgstr "Porta de envio de SMS"
+
+msgid "AT commands sending port"
+msgstr "Porta de envio de comandos AT"
+
+msgid "AT Commands Settings"
+msgstr "Configurações de Comandos AT"
+
+msgid "Merge split messages"
+msgstr "Mesclar mensagens divididas"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Marcar esta opção facilitará a leitura das mensagens, mas causará uma discrepância no número de mensagens exibidas e recebidas."
+
+msgid "USSD sending port"
+msgstr "Porta de envio de USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Enviando código USSD em texto simples"
+
+msgid "Receive message without PDU decoding"
+msgstr "Receber mensagem sem decodificação de PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Envie o código USSD em texto simples. O comando não está sendo codificado para PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Receba e exiba a mensagem sem decodificá-la como PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Explicação de número e prefixo"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Na aba para envio de SMS, exiba uma explicação do prefixo e do número de telefone correto."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "O número de telefone deve ser precedido pelo código do país (para a Polônia é 48, sem '+'). Se o número tiver 5, 4 ou 3 caracteres, será tratado como 'curto' e não deve ser precedido pelo código do país."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "O número de telefone deve ser precedido pelo código do país (para a Polônia é 48, sem +). Se o número tiver 5, 4 ou 3 caracteres, será tratado como curto e não deve ser precedido pelo código do país."
+
+msgid "Add prefix to phone number"
+msgstr "Adicionar prefixo ao número de telefone"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Adicionar prefixo automaticamente ao campo de número de telefone."
+
+msgid "Prefix number"
+msgstr "Número de prefixo"
+
+msgid "Please specify the command to send"
+msgstr "Especifique o comando a enviar"
+
+msgid "Please specify the code to send"
+msgstr "Especifique o código a enviar"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Defina a porta para comunicação com o modem"
+
+msgid "User AT commands"
+msgstr "Comandos AT do usuário"
+
+msgid "Command to send"
+msgstr "Comando a enviar"
+
+msgid "Clear form"
+msgstr "Limpar formulário"
+
+msgid "Send command"
+msgstr "Enviar comando"
+
+msgid "Send code"
+msgstr "Enviar código"
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Message storage area"
+msgstr "Área de armazenamento de mensagens"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "As mensagens são armazenadas em um local específico (por exemplo, no cartão SIM ou na memória do modem), mas outras áreas também podem estar disponíveis dependendo do tipo de dispositivo."
+
+msgid "SIM card"
+msgstr "Cartão SIM"
+
+msgid "Modem memory"
+msgstr "Memória do modem"
+
+msgid "Storage used / Total capacity"
+msgstr "Armazenamento usado / Capacidade total"
+
+msgid "Delete selected"
+msgstr "Excluir selecionado"
+
+msgid "Delete"
+msgstr "Excluir"
+
+msgid "Delete all"
+msgstr "Excluir todos"
+
+msgid "Refresh"
+msgstr "Atualizar"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Selecione a(s) mensagem(s) a serem excluídas"
+
+msgid "Delete selected message(s)?"
+msgstr "Excluir mensagem(ns) selecionada(s)?"
+
+msgid "Delete all the messages?"
+msgstr "Excluir todas as mensagens?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface de usuário para ler mensagens usando sms-tool. Mais informações sobre o sms-tool no %sfórum eko.one.pl%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface de usuário para enviar mensagens usando sms-tool. Mais informações sobre o sms-tool no %sfórum eko.one.pl%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface de usuário para enviar comandos AT usando sms-tool. Mais informações sobre o sms-tool no %sfórum eko.one.pl%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Interface de usuário para enviar códigos USSD usando sms-tool. Mais informações sobre o sms-tool no %sfórum eko.one.pl%s."
+
+msgid "Configuration sms-tool"
+msgstr "Configuração sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Painel de configuração para sms-tool e aplicação gui."
+
+msgid "Port for communication with the modem"
+msgstr "Porta para comunicação com o modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Selecione uma das portas ttyUSBX disponíveis."
+
+msgid "Please select a port"
+msgstr "Selecione uma porta"
+
+msgid "User contacts"
+msgstr "Contatos do usuário"
+
+msgid "Enable group messaging"
+msgstr "Ativar mensagens em grupo"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Esta opção permite enviar uma mensagem para todos os contatos na lista de contatos do usuário."
+
+msgid "Message sending delay"
+msgstr "Atraso no envio de mensagens"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Mensagem enviada para o número:"
+
+msgid "User USSD codes"
+msgstr "Códigos USSD do usuário"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Cada linha deve ter o seguinte formato: 'Nome do contato;número de telefone'. Para conveniência do usuário, o arquivo é salvo no local /etc/modem/phonebook.user."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "Pressione [Enter] para enviar o comando, pressione [Delete] para excluir o comando"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "Pressione [Enter] para enviar o código, pressione [Delete] para excluir o código"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "Pressione [Delete] para excluir o número de telefone"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "Pressione [Delete] para excluir o conteúdo da mensagem"
+
+msgid "Notification Settings"
+msgstr "Configurações de Notificação"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "O LED informa sobre uma nova mensagem. Antes de ativar esta função, configure e salve a porta de leitura de SMS, a hora para verificar a caixa de entrada de SMS e selecione o LED de notificação."
+
+msgid "Check inbox every minute(s)"
+msgstr "Verificar caixa de entrada a cada minuto(s)"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Especifique quantos minutos você deseja que sua caixa de entrada seja verificada."
+
+msgid "Error loading AT commands file: "
+msgstr "Erro ao carregar arquivo de comandos AT: "
+
+msgid "Select file with AT commands to load"
+msgstr "Selecione arquivo com comandos AT para carregar"
+
+msgid "Error loading AT commands file: "
+msgstr "Erro ao carregar arquivo de comandos AT: "
+
+msgid "No AT commands available"
+msgstr "Nenhum comando AT disponível"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Erro ao carregar arquivo inicial de comandos AT:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Erro ao carregar arquivo de códigos USSD: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Erro ao carregar arquivo USSD inicial:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Selecione arquivo com códigos USSD para carregar"
+
+msgid "No USSD codes available"
+msgstr "Nenhum código USSD disponível"
+
+msgid "Defined USSD code files"
+msgstr "Arquivos de código USSD definidos"
+
+msgid "File uploaded and saved to"
+msgstr "Arquivo enviado e salvo em"
+
+msgid "Unable to upload file"
+msgstr "Não é possível carregar arquivo"
+
+msgid "Phonebook saved successfully"
+msgstr "Agenda salva com sucesso"
+
+msgid "Unable to save the file"
+msgstr "Não é possível salvar o arquivo"
+
+msgid "filename.user"
+msgstr "filename.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Selecione ou crie um arquivo para editar..."
+
+msgid "Please enter a file name"
+msgstr "Digite um nome de arquivo"
+
+msgid "File created successfully"
+msgstr "Arquivo criado com sucesso"
+
+msgid "Unable to create file"
+msgstr "Não é possível criar arquivo"
+
+msgid "Please select a file to delete"
+msgstr "Selecione um arquivo para excluir"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Tem certeza de que deseja excluir este arquivo?"
+
+msgid "File deleted successfully"
+msgstr "Arquivo excluído com sucesso"
+
+msgid "Unable to delete file"
+msgstr "Não é possível excluir arquivo"
+
+msgid "Please select or create a file first"
+msgstr "Selecione ou crie um arquivo primeiro"
+
+msgid "File saved successfully"
+msgstr "Arquivo salvo com sucesso"
+
+msgid "Unable to save file"
+msgstr "Não é possível salvar arquivo"
+
+msgid "Load .user file"
+msgstr "Carregar arquivo .user"
+
+msgid "Save .user file"
+msgstr "Salvar arquivo .user"
+
+msgid "Manage contacts"
+msgstr "Gerenciar contatos"
+
+msgid "Edit User Contacts"
+msgstr "Editar Contatos do Usuário"
+
+msgid "Manage USSD codes"
+msgstr "Gerenciar códigos USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Gerenciar Códigos USSD do Usuário"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Cada linha deve ter o seguinte formato: 'Descrição do código;código'. Para conveniência do usuário, o arquivo é salvo no local /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Cada linha deve ter o seguinte formato: 'Descrição do comando AT;comando AT'. Para conveniência do usuário, o arquivo é salvo no local /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Gerenciar comandos AT"
+
+msgid "Manage User AT Commands"
+msgstr "Gerenciar Comandos AT do Usuário"
+
+msgid "-- Select file --"
+msgstr "-- Selecionar arquivo --"
+
+msgid "Select file"
+msgstr "Selecionar arquivo"
+
+msgid "New file name"
+msgstr "Novo nome de arquivo"
+
+msgid "Delete selected file"
+msgstr "Excluir arquivo selecionado"
+
+msgid "Show notification icon"
+msgstr "Mostrar ícone de notificação"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Mostrar o ícone de notificação de nova mensagem na página de visão geral do status."
+
+msgid "Loading..."
+msgstr "Carregando..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modems"
+
+msgid "Signal Quality"
+msgstr "Qualidade do Sinal"
+
+msgid "Align preview to:"
+msgstr "Alinhar visualização para:"
+
+msgid "Left"
+msgstr "Esquerda"
+
+msgid "Center"
+msgstr "Centro"
+
+msgid "Right"
+msgstr "Direita"
+
+msgid "New message information block settings"
+msgstr "Configurações do bloco de informações de nova mensagem"
+
+msgid "Alignment settings saved successfully"
+msgstr "Configurações de alinhamento salvas com sucesso"
+
+msgid "SMS Info"
+msgstr "Informações de SMS"
+
+msgid "New SMS"
+msgstr "Novo SMS"
+
+msgid "No new SMS"
+msgstr "Nenhum novo SMS"
+
+msgid "Deleting files"
+msgstr "Excluindo arquivos"
+
+msgid "Delete all files"
+msgstr "Excluir todos os arquivos"
+
+msgid "Load .gz archive"
+msgstr "Carregar arquivo .gz"
+
+msgid "Save .gz archive"
+msgstr "Salvar arquivo .gz"
+
+msgid "File uploaded and saved to"
+msgstr "Arquivo enviado e salvo em"
+
+msgid "Failed to extract archive"
+msgstr "Falha ao extrair arquivo"
+
+msgid "Archive extracted to"
+msgstr "Arquivo extraído para"
+
+msgid "Upload error"
+msgstr "Erro de upload"
+
+msgid "Failed to create archive"
+msgstr "Falha ao criar arquivo"
+
+msgid "Failed to read archive"
+msgstr "Falha ao ler arquivo"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Tem certeza de que deseja excluir todos os arquivos na pasta?"
+
+msgid "All files deleted successfully"
+msgstr "Todos os arquivos foram excluídos com sucesso"
+
+msgid "Calls"
+msgstr "Chamadas"
+
+msgid "Call Log"
+msgstr "Registro de Chamadas"
+
+msgid "Clear all call log entries?"
+msgstr "Limpar todas as entradas do registro de chamadas?"
+
+msgid "No call log entries found"
+msgstr "Nenhuma entrada de registro de chamadas encontrada"
+
+msgid "No matching call log entries found"
+msgstr "Nenhuma entrada de registro de chamadas correspondente encontrada"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Interface de usuário para visualizar registros de chamadas. O registro é coletado por um daemon em background."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Daemon de registro de chamadas está desabilitado. Ative-o na configuração para começar a coletar logs."
+
+msgid "Filter call type"
+msgstr "Filtrar tipo de chamada"
+
+msgid "All calls"
+msgstr "Todas as chamadas"
+
+msgid "Missed calls"
+msgstr "Chamadas perdidas"
+
+msgid "Received calls"
+msgstr "Chamadas recebidas"
+
+msgid "Dialed calls"
+msgstr "Chamadas discadas"
+
+msgid "Refresh"
+msgstr "Atualizar"
+
+msgid "Clear Log"
+msgstr "Limpar Registro"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Type"
+msgstr "Tipo"
+
+msgid "Number"
+msgstr "Número"
+
+msgid "Duration"
+msgstr "Duração"
+
+msgid "Name"
+msgstr "Nome"
+
+msgid "Call log reading port"
+msgstr "Porta de leitura do registro de chamadas"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Selecione uma das portas ttyUSBX disponíveis."
+
+msgid "Please select a port"
+msgstr "Selecione uma porta"
+
+msgid "Enable call log daemon"
+msgstr "Ativar daemon de registro de chamadas"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Processo em background para registrar chamadas recebidas e perdidas."
+
+msgid "Call Log Settings"
+msgstr "Configurações do registro de chamadas"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Processo em segundo plano para registrar chamadas recebidas e perdidas.
Importante Opção dedicada a modems Qualcomm que não possuem memória interna de histórico de chamadas e não suportam o comando padrão AT+CPBR. Ativar esta opção adiciona uma nova aba. Se a aba dedicada não aparecer, limpe o cache do navegador e reinicie o roteador."
+
+msgid "Force EHLO"
+msgstr "Forçar EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Força o mailsend a sempre usar EHLO em vez de detectar automaticamente HELO/EHLO. Ative apenas se o encaminhamento falhar, já que alguns servidores (por exemplo, gateways corporativos, Microsoft 365 / Exchange Online Protection) não anunciam corretamente o suporte a ESMTP, o que impede o funcionamento do STARTTLS/autenticação."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "A codificação Unicode (70 caracteres por padrão) oferece suporte à transmissão de caracteres nacionais e mensagens SMS multipartes"
+
+msgid "Not applicable"
+msgstr "Não aplicável"
diff --git a/luci-app-sms-tool-js/po/ru/sms-tool-js.po b/luci-app-sms-tool-js/po/ru/sms-tool-js.po
index 429101580..7c19bef0f 100644
--- a/luci-app-sms-tool-js/po/ru/sms-tool-js.po
+++ b/luci-app-sms-tool-js/po/ru/sms-tool-js.po
@@ -1,8 +1,14 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: ru\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
msgid "SMS Messages"
-msgstr "Сообщения SMS"
+msgstr "SMS-сообщения"
msgid "Received Messages"
msgstr "Полученные сообщения"
@@ -13,8 +19,8 @@ msgstr "Отправка сообщений"
msgid "USSD"
msgstr "USSD"
-msgid "From"
-msgstr "От"
+msgid "Sender"
+msgstr "Отправитель"
msgid "Received"
msgstr "Получено"
@@ -23,34 +29,34 @@ msgid "Message"
msgstr "Сообщение"
msgid "Configuration"
-msgstr "Настройка"
+msgstr "Настройки"
msgid "AT Commands"
msgstr "AT-команды"
msgid "Configuration"
-msgstr "Настройка"
+msgstr "Конфигурация"
msgid "Please enter phone number"
-msgstr "Введите номер телефона"
+msgstr "Пожалуйста, введите номер телефона"
msgid "Please enter a message text"
-msgstr "Введите текст сообщения"
+msgstr "Пожалуйста, введите текст сообщения"
msgid "Reply"
-msgstr "Ответить"
+msgstr "Ответ"
msgid "Please enter a USSD code"
-msgstr "Введите команду USSD"
+msgstr "Пожалуйста, введите код для отправки"
msgid "USSD Codes"
-msgstr "Команды USSD"
+msgstr "USSD-коды"
msgid "Send to"
-msgstr "Кому"
+msgstr "Отправить на"
msgid "Message text"
-msgstr "Содержание сообщения"
+msgstr "Текст сообщения"
msgid "Send"
msgstr "Отправить"
@@ -62,22 +68,22 @@ msgid "to number"
msgstr "на номер"
msgid "to group"
-msgstr "группе"
+msgstr "в группу"
msgid "SMS sent sucessfully"
-msgstr "SMS успешно отправлено"
+msgstr "SMS отправлено"
msgid "Code to send"
-msgstr "Команда для отправки"
+msgstr "Код для отправки"
msgid "Send code"
-msgstr "Отправить команду"
+msgstr "Отправить код"
msgid "SMS Settings"
-msgstr "Настройки SMS"
+msgstr "Настройки для SMS-сообщений"
msgid "USSD Codes Settings"
-msgstr "Настройки команд USSD"
+msgstr "Настройки для USSD-кодов"
msgid "SMS reading port"
msgstr "Порт для чтения SMS"
@@ -89,61 +95,61 @@ msgid "AT commands sending port"
msgstr "Порт для отправки AT-команд"
msgid "AT Commands Settings"
-msgstr "Настройки AT-команд"
+msgstr "Настройки для AT-команд"
msgid "Merge split messages"
-msgstr "Объединять разделённые сообщения"
+msgstr "Объединить разделенные сообщения"
msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
-msgstr "Разделенные сообщения будут объединены. Установка этого параметра облегчит чтение SMS, но приведет к несоответствию в отображении количества полученных сообщений."
+msgstr "Разделенные сообщения будут объединены. Включение этой опции облегчит чтение SMS, но приведет к несоответствию в количестве отображаемых и полученных сообщений."
msgid "USSD sending port"
-msgstr "Порт для отправки команд USSD"
+msgstr "Порт для отправки USSD-кодов"
msgid "Sending USSD code in plain text"
-msgstr "Отправка команд USSD простым текстом"
+msgstr "Отправить USSD-код открытым текстом"
msgid "Receive message without PDU decoding"
-msgstr "Получение сообщения без декодирования его как PDU"
+msgstr "Получить сообщение без декодирования его как PDU"
msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
-msgstr "Отправка команд USSD в виде обычного текста. Команда не кодируется в PDU."
+msgstr "Отправляет USSD-код открытым текстом. Команда не декодируется в PDU."
msgid "Receive and display the message without decoding it as a PDU."
msgstr "Полученное сообщение отображается без декодирования его как PDU."
msgid "Explanation of number and prefix"
-msgstr "Подсказка по формату номера"
+msgstr "Пояснение относительно номера и префикса"
msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
-msgstr "Отображать на вкладке для отправки SMS-сообщений пояснение о формате префикса и номера телефона."
+msgstr "Во вкладке для отправки SMS показать пояснение относительно префикса и правильного номера телефона."
msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
-msgstr "Перед телефонным номером должен стоять префикс страны (для России это 7, без знака '+'). Если номер состоит из 5, 4 или 3 символов, он считается 'коротким' и не должен предваряться префиксом страны."
+msgstr "Номеру телефона должен предшествовать префикс страны (для Польши это 48, без знака '+'). Если номер состоит из 5, 4 или 3 символов, он рассматривается как 'короткий' и не должен иметь префикс страны."
msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
-msgstr "Перед телефонным номером должен стоять префикс страны (для России это 7, без знака +). Если номер состоит из 5, 4 или 3 символов, он считается коротким и не должен предваряться префиксом страны."
+msgstr "Номеру телефона должен предшествовать префикс страны (для Польши это 48, без знака +). Если номер состоит из 5, 4 или 3 символов, он рассматривается как короткий и не должен иметь префикс страны."
msgid "Add prefix to phone number"
msgstr "Добавить префикс к номеру телефона"
msgid "Automatically add prefix to the phone number field."
-msgstr "Автоматически добавлять префикс в поле номера телефона."
+msgstr "Автоматически добавить префикс в поле номера телефона."
msgid "Prefix number"
-msgstr "Префикс"
+msgstr "Номер префикса"
msgid "Please specify the command to send"
-msgstr "Укажите команду для отправки"
+msgstr "Пожалуйста, укажите команду для отправки"
msgid "Please specify the code to send"
-msgstr "Укажите команду для отправки"
+msgstr "Пожалуйста, укажите код для отправки"
msgid "Please set the port for communication with the modem"
-msgstr "Укажите порт для связи с модемом"
+msgstr "Пожалуйста, укажите порт для связи с модемом"
msgid "User AT commands"
-msgstr "Пользовательские AT-команды"
+msgstr "AT-команды пользователя"
msgid "Command to send"
msgstr "Команда для отправки"
@@ -155,16 +161,16 @@ msgid "Send command"
msgstr "Отправить команду"
msgid "Send code"
-msgstr "Отправить команду"
+msgstr "Отправить код"
msgid "Reply"
-msgstr "Ответить"
+msgstr "Ответ"
msgid "Message storage area"
-msgstr "Где хранить сообщения"
+msgstr "Место хранения сообщений"
msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
-msgstr "Сообщения хранятся в определенном месте (например, на SIM-карте или в памяти модема), но в зависимости от типа устройства могут быть доступны и другие места."
+msgstr "Сообщения хранятся в определенном месте (например, на SIM-карте или в памяти модема), но в зависимости от типа устройства могут быть доступны и другие области."
msgid "SIM card"
msgstr "SIM-карта"
@@ -172,50 +178,47 @@ msgstr "SIM-карта"
msgid "Modem memory"
msgstr "Память модема"
-msgid "Messages store in"
-msgstr "Место хранения сообщений"
-
-msgid "Messages (inbox / maximum)"
-msgstr "Сообщений (в хранилище / максимум)"
+msgid "Storage used / Total capacity"
+msgstr "Используемая память / Общая емкость"
msgid "Delete selected"
-msgstr "Удалить выбранные"
+msgstr "Удалить выбранное"
-msgid "Delete message(s)"
-msgstr "Удалить сообщения"
+msgid "Delete"
+msgstr "Удалить"
msgid "Delete all"
msgstr "Удалить все"
-msgid "Refresh messages"
-msgstr "Проверить сообщения"
+msgid "Refresh"
+msgstr "Обновить"
msgid "Please select the message(s) to be deleted"
-msgstr "Укажите сообщения для удаления"
+msgstr "Пожалуйста, выберите сообщение(-я) для удаления"
msgid "Delete selected message(s)?"
-msgstr "Удалить выбранные сообщения?"
+msgstr "Удалить выбранное(-ые) сообщение(-я)?"
msgid "Delete all the messages?"
-msgstr "Удалить ВСЕ сообщения?"
+msgstr "Удалить все сообщения?"
msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Пользовательский интерфейс для чтения SMS-сообщений с помощью sms-tool. Для получения дополнительной информации о sms-tool посетите %sforum eko.one.pl%s."
+msgstr "Пользовательский интерфейс для чтения SMS-сообщений с помощью sms-tool. Больше информации о программе sms-tool на %sфоруме eko.one.pl%s."
msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Пользовательский интерфейс для отправки SMS-сообщений с помощью sms-tool. Дополнительная информация о sms-tool на %sforum eko.one.pl%s."
+msgstr "Пользовательский интерфейс для отправки SMS-сообщений с помощью sms-tool. Больше информации о программе sms-tool на %sфоруме eko.one.pl%s."
msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Пользовательский интерфейс для отправки AT-команд через sms-tool. Дополнительная информация о программе sms-tool на %sforum eko.one.pl%s."
+msgstr "Пользовательский интерфейс для отправки AT-команд с помощью sms-tool. Больше информации о программе sms-tool на %sфоруме eko.one.pl%s."
msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "Пользовательский интерфейс для отправки команд USSD с помощью программы sms-tool. Дополнительная информация о программе sms-tool на %sforum eko.one.pl%s."
+msgstr "Пользовательский интерфейс для отправки USSD-кодов с помощью sms-tool. Больше информации о программе sms-tool на %sфоруме eko.one.pl%s."
msgid "Configuration sms-tool"
msgstr "Конфигурация sms-tool"
msgid "Configuration panel for sms-tool and gui application."
-msgstr "Панель настроек для sms-tool и пользовательского интерфейса."
+msgstr "Панель настроек для программы sms-tool и для пользовательского интерфейса."
msgid "Port for communication with the modem"
msgstr "Порт для связи с модемом"
@@ -224,73 +227,707 @@ msgid "Select one of the available ttyUSBX ports."
msgstr "Выберите один из доступных портов ttyUSBX."
msgid "Please select a port"
-msgstr "Выберите порт"
+msgstr "Пожалуйста, выберите порт"
msgid "User contacts"
-msgstr "Записная книжка"
+msgstr "Контакты пользователя"
msgid "Enable group messaging"
-msgstr "Включить рассылку группе"
+msgstr "Включить групповые сообщения"
msgid "This option allows you to send one message to all contacts in the user's contact list."
-msgstr "Эта опция позволяет отправить одно сообщение всем контактам из записной книжки."
+msgstr "Опция позволяет отправить одно сообщение всем контактам из списка контактов пользователя."
msgid "Message sending delay"
-msgstr "Задержка отправки сообщения"
+msgstr "Задержка при отправке сообщений"
msgid "[Bot] Message sent to number:"
-msgstr "[Бот] Сообщение отправлено на номер:"
+msgstr "[Bot] Сообщение отправлено на номер:"
msgid "User USSD codes"
-msgstr "Пользовательские команды USSD"
+msgstr "USSD-коды пользователя"
msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
-msgstr "Каждый контакт заносится отдельной строкой в формате: 'Имя контакта;номер телефона'. Для удобства использования сохраняется в файле /etc/modem/phonebook.user."
+msgstr "Каждая строка должна иметь следующий формат: 'Имя контакта;номер телефона'. Для удобства пользователя контакты сохраняются в файле /etc/modem/phonebook.user."
msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
-msgstr "Каждая команда заносится отдельной строкой в формате: 'Описание;AT-команда'. Для удобства использования сохраняется в файле /etc/modem/atcmmds.user."
+msgstr "Каждая строка должна иметь следующий формат: 'Описание AT-команды;AT-команда'. Для удобства пользователя команды сохраняются в файле /etc/modem/atcmmds.user."
msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
-msgstr "Каждая команда заносится отдельной строкой в формате: 'Описание;команда USSD'. Для удобства использования сохраняется в файле /etc/modem/ussdcodes.user."
+msgstr "Каждая строка должна иметь следующий формат: 'Описание кода;код'. Для удобства пользователя коды сохраняются в файле /etc/modem/ussdcodes.user."
-msgid "Press [Enter] to send the command, press [Delete] to delete the command"
-msgstr "Нажмите [Enter] для отправки, или [Delete] чтобы удалить команду"
+msgid "Display new messages notification on login page"
+msgstr "Отображать уведомление о новых сообщениях на странице входа"
-msgid "Press [Enter] to send the code, press [Delete] to delete the code"
-msgstr "Нажмите [Enter] для отправки, или [Delete] чтобы удалить команду"
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Отображать уведомление при поступлении новых сообщений в выбранной области сообщений."
-msgid "Press [Delete] to delete the phone number"
-msgstr "Нажмите [Delete] чтобы удалить номер"
+msgid "new message"
+msgstr "новое сообщение"
-msgid "Press [Delete] to delete the content of the message"
-msgstr "Нажмите [Delete] чтобы удалить содержимое сообщения"
+msgid "new messages"
+msgstr "новых сообщений"
+
+msgid "All"
+msgstr "Все"
+
+msgid "Show"
+msgstr "Показать"
+
+msgid "Read"
+msgstr "Прочитано"
+
+msgid "Unread"
+msgstr "Непрочитано"
+
+msgid "All / Read / Unread"
+msgstr "Все / Прочитанные / Непрочитанные"
+
+msgid "Show all, read or unread messages"
+msgstr "Показать все, прочитанные или непрочитанные сообщения"
+
+msgid "Show system messages in the message list"
+msgstr "Показывать системные сообщения в списке сообщений"
+
+msgid "Mark as read"
+msgstr "Отметить как прочитанное"
+
+msgid "Mark as unread"
+msgstr "Отметить как непрочитанное"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Пожалуйста, выберите сообщение(-я) для отметки как прочитанные"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Пожалуйста, выберите сообщение(-я) для отметки как непрочитанные"
+
+msgid "Mark selected message(s) as read?"
+msgstr "Отметить выбранное(-ые) сообщение(-я) как прочитанные?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "Отметить выбранное(-ые) сообщение(-я) как непрочитанные?"
+
+msgid "Message marked as read"
+msgstr "Сообщение отмечено как прочитанное"
+
+msgid "Messages marked as read"
+msgstr "Сообщения отмечены как прочитанные"
+
+msgid "Message marked as unread"
+msgstr "Сообщение отмечено как непрочитанное"
+
+msgid "Messages marked as unread"
+msgstr "Сообщения отмечены как непрочитанные"
+
+msgid "System messages"
+msgstr "Системные сообщения"
+
+msgid "Diode"
+msgstr "Диод"
+
+msgid "New messages notification LED"
+msgstr "Светодиодное уведомление о новых сообщениях"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "Включить светодиодное уведомление SMS при новом сообщении"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Включить светодиодное уведомление при поступлении новых сообщений в выбранной области сообщений."
+
+msgid "Selected LED"
+msgstr "Выбранный светодиод"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Выберите светодиодный диод для уведомления о новых сообщениях. Выбор производится из доступных светодиодов в системе."
+
+msgid "Automatically select LED"
+msgstr "Автоматически выбрать светодиод"
+
+msgid "Automatically select the first available LED."
+msgstr "Автоматически выбрать первый доступный светодиод."
+
+msgid "Advanced settings"
+msgstr "Расширенные настройки"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "Интервал мигания светодиода (в секундах)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "Установить интервал мигания светодиода (в секундах)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Продолжительность мигания (в секундах)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Установить продолжительность мигания (в секундах). Установить 0 для бесконечной продолжительности (светодиод будет мигать, пока сообщения не будут отмечены как прочитанные)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Пожалуйста, подождите... Идет процесс сохранения SMS-сообщений в текстовый файл."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Опция позволяет выполнить резервное копирование SMS или, например, сохранить сообщения, не поддерживаемые sms-tool."
+
+msgid "Delete all messages"
+msgstr "Удалить все сообщения"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Опция позволяет удалить все SMS-сообщения в случае, если они не видны во вкладке 'Полученные сообщения'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Сохранение SMS-сообщений в файл завершилось неудачей. Пожалуйста, попробуйте снова."
+
+msgid "PDU decoding scheme"
+msgstr "Схема декодирования PDU"
+
+msgid "Autodetect"
+msgstr "Автоопределение"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Сохранить предыдущий ответ при отправке нового USSD-кода."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Отметьте эту опцию, если вам нужно воспользоваться меню, построенным на USSD-кодах"
+
+msgid "Turn over the replies."
+msgstr "Перевернуть ответы."
+
+msgid "View new reply from top"
+msgstr "Показать новый ответ сверху"
+
+msgid "Please wait... deleted"
+msgstr "Пожалуйста, подождите... удалено"
+
+msgid "of"
+msgstr "из"
+
+msgid "selected messages"
+msgstr "выбранных сообщений"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"Пакет требует конфигурации пользователем.
Необходимо "
+"настроить:
1. Все порты для связи с модемом.
2. Дополнительные "
+"опции, специфичные для данного модема (для обработки USSD-кодов).
3. Светодиод уведомлений (опционально).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Любое изменение места, из которого будут читаться SMS, требует обновления сообщений"
+
+msgid "Characters remaining:"
+msgstr "Осталось символов:"
+
+msgid "Encoding standard"
+msgstr "Стандарт кодирования"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 символов)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 символов)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Кодировка GSM-7 (160 символов)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Кодировка Unicode (70 символов), не поддерживает отправку национальных символов (в utf8) – только ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Вкладка позволяет пользователям поддержать пакет"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Информация о пакете luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Сообщить об ошибке"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Написать в теме пакета на форуме eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Написать на форуме"
+
+msgid "Report a bug on the package Github page"
+msgstr "Сообщить об ошибке на странице Github пакета"
+
+msgid "Open a package discussion on Github"
+msgstr "Открыть обсуждение пакета на Github"
+
+msgid "Open discussion"
+msgstr "Открыть обсуждение"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Купите кофе, если хотите поддержать развитие проекта и автора"
+
+msgid "Buy a coffee"
+msgstr "Купить кофе"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Станьте спонсором, если хотите поддержать развитие проекта и автора"
+
+msgid "Become a sponsor"
+msgstr "Стать спонсором"
+
+msgid "Package Info"
+msgstr "Информация о пакете"
+
+msgid "Author (package maintainer)"
+msgstr "Автор (сопровождающий пакета)"
+
+msgid "Package update and support"
+msgstr "Обновление пакета и поддержка"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Настройки пересылки SMS на e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "E-mail будет отправлен.."
+
+msgid "Enable message forwarding"
+msgstr "Включить пересылку сообщений"
+
+msgid "E-mail settings"
+msgstr "Настройки для e-mail"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Выберите предопределенные настройки e-mail или введите настройки вручную."
+
+msgid "Recipient"
+msgstr "Получатель"
+
+msgid "E-mail address of the recipient."
+msgstr "Адрес e-mail получателя."
+
+msgid "Sender"
+msgstr "Отправитель"
+
+msgid "E-mail address of the sender."
+msgstr "Адрес e-mail отправителя."
+
+msgid "User"
+msgstr "Пользователь"
+
+msgid "Username for SMTP authentication."
+msgstr "Имя пользователя для аутентификации SMTP."
+
+msgid "Password"
+msgstr "Пароль"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Пароль приложения Google / Пароль для аутентификации SMTP."
+
+msgid "SMTP server"
+msgstr "SMTP-сервер"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Имя хоста/IP-адрес SMTP-сервера."
+
+msgid "SMTP server port"
+msgstr "Порт SMTP-сервера"
+
+msgid "Security"
+msgstr "Безопасность"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: использовать STARTTLS, если сервер это поддерживает."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP через SSL."
+
+msgid "Required Package"
+msgstr "Требуемый пакет"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Опция пересылки SMS-сообщений требует установленного пакета mailsend."
+
+msgid "Check required packages"
+msgstr "Проверить требуемые пакеты"
+
+msgid "Check"
+msgstr "Проверить"
+
+msgid "Mailsend Package"
+msgstr "Пакет mailsend"
+
+msgid "Loading package data…"
+msgstr "Загрузка данных пакета…"
+
+msgid "Installed"
+msgstr "Установлен"
+
+msgid "Install…"
+msgstr "Установить…"
+
+msgid "Mailsend Package"
+msgstr "Пакет mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Пожалуйста, выберите ровно одно сообщение для пересылки"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Переслать выбранное сообщение на e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Отправка e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Сообщение успешно переслано"
+
+msgid "Failed to forward message: %s"
+msgstr "Не удалось переслать сообщение: %s"
+
+msgid "Error: %s"
+msgstr "Ошибка: %s"
+
+msgid "user define"
+msgstr "пользовательские настройки"
+
+msgid "Forward"
+msgstr "Переслать"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Выберите сообщение(-я), которое(-ые) хотите переслать"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "Функция пересылки SMS-сообщений не включена. Сначала настройте ее"
+
+msgid "My Router"
+msgstr "Мой роутер"
+
+msgid "Forward SMS to E-mail"
+msgstr "Переслать SMS-сообщение(-я) на e-mail"
+
+msgid "Subject:"
+msgstr "Тема:"
+
+msgid "Message text:"
+msgstr "Текст сообщения:"
+
+msgid "Send"
+msgstr "Отправить"
+
+msgid "Subject and body cannot be empty"
+msgstr "Тема и текст не могут быть пустыми"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Пакет mailsend не установлен. Пожалуйста, сначала установите его, используя кнопку Установить... ниже"
+
+msgid "Select modem"
+msgstr "Выбрать модем"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Смена модема требует обновления сообщений"
+
+msgid "Defined AT command files"
+msgstr "Определенные файлы AT-команд"
+
+msgid "Defined USSD code files"
+msgstr "Определённые файлы USSD-кодов"
+
+msgid "File uploaded and saved to"
+msgstr "Файл загружен и сохранен в"
+
+msgid "Unable to upload file"
+msgstr "Не удалось загрузить файл"
+
+msgid "Phonebook saved successfully"
+msgstr "Телефонная книга успешно сохранена"
+
+msgid "Unable to save the file"
+msgstr "Не удалось сохранить файл"
+
+msgid "filename.user"
+msgstr "имяфайла.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Выберите или создайте файл для редактирования..."
+
+msgid "Please enter a file name"
+msgstr "Пожалуйста, введите имя файла"
+
+msgid "File created successfully"
+msgstr "Файл успешно создан"
+
+msgid "Unable to create file"
+msgstr "Не удалось создать файл"
+
+msgid "Please select a file to delete"
+msgstr "Пожалуйста, выберите файл для удаления"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Вы уверены, что хотите удалить этот файл?"
+
+msgid "File deleted successfully"
+msgstr "Файл успешно удален"
+
+msgid "Select or create a file to edit..."
+msgstr "Выберите или создайте файл для редактирования..."
+
+msgid "Unable to delete file"
+msgstr "Не удалось удалить файл"
+
+msgid "Please select or create a file first"
+msgstr "Пожалуйста, сначала выберите или создайте файл"
+
+msgid "File saved successfully"
+msgstr "Файл успешно сохранен"
+
+msgid "Unable to save file"
+msgstr "Не удалось сохранить файл"
+
+msgid "Load .user file"
+msgstr "Загрузить .user файл"
+
+msgid "Save .user file"
+msgstr "Сохранить .user файл"
+
+msgid "Please select a file to delete"
+msgstr "Пожалуйста, выберите файл для удаления"
+
+msgid "Manage contacts"
+msgstr "Управление контактами"
+
+msgid "Edit User Contacts"
+msgstr "Редактировать контакты пользователя"
+
+msgid "Manage USSD codes"
+msgstr "Управление USSD-кодами"
+
+msgid "Manage User USSD Codes"
+msgstr "Управление пользовательскими USSD-кодами"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Каждая строка должна иметь следующий формат: 'Описание кода;код'. Для удобства пользователя файл сохраняется в /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Каждая строка должна иметь следующий формат: 'Описание AT-команды;AT-команда'. Для удобства пользователя файл сохраняется в /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Управление AT-командами"
+
+msgid "Manage User AT Commands"
+msgstr "Управление пользовательскими AT-командами"
+
+msgid "-- Select file --"
+msgstr "-- Выберите файл --"
+
+msgid "Select file"
+msgstr "Выбрать файл"
+
+msgid "New file name"
+msgstr "Новое имя файла"
+
+msgid "Delete selected file"
+msgstr "Удалить выбранный файл"
+
+msgid "Select file with AT commands to load"
+msgstr "Выберите файл с AT-командами для загрузки"
+
+msgid "Error loading AT commands file: "
+msgstr "Ошибка загрузки файла AT-команд: "
+
+msgid "No AT commands available"
+msgstr "AT-команды недоступны"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Ошибка загрузки исходного файла AT-команд:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Ошибка загрузки файла USSD-кодов: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Ошибка загрузки исходного файла USSD:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Выберите файл с USSD-кодами для загрузки"
+
+msgid "No USSD codes available"
+msgstr "USSD-коды недоступны"
+
+msgid "Show notification icon"
+msgstr "Показывать значок уведомлений"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Показывать значок уведомления о новом сообщении на странице обзора состояния."
+
+msgid "Loading..."
+msgstr "Загрузка..."
+
+msgid "Modem"
+msgstr "Модем"
+
+msgid "Modems"
+msgstr "Модемы"
+
+msgid "Signal Quality"
+msgstr "Качество сигнала"
+
+msgid "Align preview to:"
+msgstr "Выровнять предпросмотр по:"
+
+msgid "Left"
+msgstr "Слева"
+
+msgid "Center"
+msgstr "По центру"
+
+msgid "Right"
+msgstr "Справа"
+
+msgid "New message information block settings"
+msgstr "Настройки блока информации о новых сообщениях"
+
+msgid "Alignment settings saved successfully"
+msgstr "Настройки выравнивания успешно сохранены"
+
+msgid "SMS Info"
+msgstr "Информация SMS"
+
+msgid "New SMS"
+msgstr "Новое SMS"
+
+msgid "No new SMS"
+msgstr "Нет новых SMS"
+
+msgid "Deleting files"
+msgstr "Удаление файлов"
+
+msgid "Delete all files"
+msgstr "Удалить все файлы"
+
+msgid "Load .gz archive"
+msgstr "Загрузить архив .gz"
+
+msgid "Save .gz archive"
+msgstr "Сохранить архив .gz"
+
+msgid "File uploaded and saved to"
+msgstr "Файл загружен и сохранён в"
+
+msgid "Failed to extract archive"
+msgstr "Не удалось распаковать архив"
+
+msgid "Archive extracted to"
+msgstr "Архив распакован в"
+
+msgid "Upload error"
+msgstr "Ошибка загрузки"
+
+msgid "Failed to create archive"
+msgstr "Не удалось создать архив"
+
+msgid "Failed to read archive"
+msgstr "Не удалось прочитать архив"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Вы уверены, что хотите удалить все файлы в папке?"
+
+msgid "All files deleted successfully"
+msgstr "Все файлы успешно удалены"
+
+msgid "Call Log"
+msgstr "Журнал вызовов"
+
+msgid "Clear all call log entries?"
+msgstr "Очистить все записи в журнале вызовов?"
+
+msgid "No call log entries found"
+msgstr "Записей в журнале вызовов не найдено"
+
+msgid "No matching call log entries found"
+msgstr "Совпадающих записей в журнале не найдено"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Пользовательский интерфейс для просмотра журналов вызовов. Журнал собирается фоновым процессом (демоном)."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Демон журнала вызовов отключен. Пожалуйста, включите его в конфигурации, чтобы начать сбор логов."
+
+msgid "Filter call type"
+msgstr "Фильтр типа вызова"
+
+msgid "All calls"
+msgstr "Все вызовы"
+
+msgid "Missed calls"
+msgstr "Пропущенные"
+
+msgid "Received calls"
+msgstr "Входящие"
+
+msgid "Dialed calls"
+msgstr "Исходящие"
+
+msgid "Refresh"
+msgstr "Обновить"
+
+msgid "Clear Log"
+msgstr "Очистить журнал"
+
+msgid "Date"
+msgstr "Дата"
+
+msgid "Type"
+msgstr "Тип"
+
+msgid "Number"
+msgstr "Номер"
+
+msgid "Duration"
+msgstr "Длительность"
+
+msgid "Name"
+msgstr "Имя"
+
+msgid "Call log reading port"
+msgstr "Порт чтения журнала вызовов"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Выберите один из доступных портов ttyUSBX."
+
+msgid "Please select a port"
+msgstr "Пожалуйста, выберите порт"
+
+msgid "Enable call log daemon"
+msgstr "Включить демон журнала вызовов"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Фоновый процесс для регистрации входящих и пропущенных вызовов."
+
+msgid "Forward SMS"
+msgstr "Переслать SMS"
+
+msgid "Calls"
+msgstr "Вызовы"
msgid "Notification Settings"
msgstr "Настройки уведомлений"
msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
-msgstr "Уведомление диодом о новых сообщениях. Прежде чем активировать эту функцию, установите порт чтения сообщений, время проверки входящих сообщений и выберите диод уведомления."
+msgstr "Светодиод информирует о новом сообщении. Перед активацией этой функции настройте и сохраните порт чтения SMS, время проверки входящих сообщений и выберите светодиод уведомлений."
msgid "Check inbox every minute(s)"
-msgstr "Интервал проверки входящих (мин.)"
+msgstr "Проверять входящие каждую минуту(ы)"
msgid "Specify how many minutes you want your inbox to be checked."
-msgstr "Укажите интервал проверки папки входящих сообщений на наличие новых сообщений в минутах.."
+msgstr "Укажите, через сколько минут проверять входящие сообщения."
msgid "Notification LED"
-msgstr "Диод уведомлений"
+msgstr "Светодиод уведомлений"
msgid "Select the notification LED."
-msgstr "Выберите диод для уведомлений."
+msgstr "Выберите светодиод уведомлений."
msgid "Notify new messages"
msgstr "Уведомлять о новых сообщениях"
msgid "Restart the inbox checking process every"
-msgstr "Перезагружать процесс проверки входящих сообщений через каждые"
+msgstr "Перезапускать процесс проверки каждые"
msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
-msgstr "Процесс будет перезапускаться через выбранное время. Это устранит задержку при проверке входящих сообщений."
+msgstr "Процесс будет перезапускаться через выбранный интервал времени. Это устранит задержку при проверке входящих сообщений."
msgid "4h"
msgstr "4 ч."
@@ -305,84 +942,25 @@ msgid "12h"
msgstr "12 ч."
msgid "The diode is dedicated only to these notifications"
-msgstr "Диод предназначен только для этих уведомлений"
+msgstr "Светодиод выделен только для этих уведомлений"
-msgid ""
-"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
-"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
-msgstr ""
-"Выберите 'Нет', если маршрутизатор имеет только один диод или если диод поддерживает несколько задач.
Важно Данная "
-"настройка требует для корректной работы, чтобы диод был определен в системе (если это возможно). Это требование применяется, когда диод поддерживает несколько задач."
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Выберите «Нет», если у роутера только один светодиод или если светодиод многофункциональный.
Важно Для корректной работы этой опции светодиод должен быть определен в системе (если это возможно). Это требование применимо, когда диод поддерживает несколько задач."
-msgid ""
-"[3 - 59] second(s)
Important Messages "
-"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
-msgstr ""
-"[3 - 59] секунд(ы)
Важно Сообщения "
-"отправляются без проверки и подтверждения доставки сообщения. Поэтому существует риск, что сообщение не будет доставлено."
+msgid "Call Log Settings"
+msgstr "Настройки журнала звонков"
-msgid "No"
-msgstr "Нет"
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Фоновый процесс для записи входящих и пропущенных звонков.
Важно Опция предназначена для модемов Qualcomm, у которых нет внутренней памяти истории звонков и которые не поддерживают стандартную команду AT+CPBR. Включение этой опции добавляет новую вкладку. Если вкладка не появится, очистите кеш браузера и перезапустите роутер."
-msgid "Yes"
-msgstr "Да"
+msgid "Force EHLO"
+msgstr "Принудительный EHLO"
-msgid "Merge algorithm"
-msgstr "Алгоритм склеивания"
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Заставляет mailsend всегда использовать EHLO вместо автоматического определения HELO/EHLO. Включайте только если пересылка не работает, так как некоторые серверы (например, корпоративные шлюзы, Microsoft 365 / Exchange Online Protection) неправильно сообщают о поддержке ESMTP, из-за чего STARTTLS/аутентификация перестают работать."
-msgid "Simple (merge without sorting)"
-msgstr "Простой (без сортировки)"
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Кодировка Unicode (по умолчанию 70 символов) поддерживает передачу национальных символов и многосоставных SMS-сообщений"
-msgid "Advanced (merges with sorting)"
-msgstr "Продвинутый (с сортировкой)"
-
-msgid "Phone number to be blurred"
-msgstr "Частично скрыть номер"
-
-msgid "The last 5 digits of this number will be blurred."
-msgstr "Последние 5 цифр этого номера будут размыты."
-
-msgid "Expect a decimal value between five and fifty-nine"
-msgstr "Ожидается десятичное значение от пяти до пятидесяти девяти"
-
-msgid "Expect a decimal value between three and fifty-nine"
-msgstr "Ожидается десятичное значение от трёх до пятидесяти девяти"
-
-msgid "Expect a decimal value"
-msgstr "Ожидается десятичное значение"
-
-msgid "Direction of message merging"
-msgstr "Направление склеивания сообщений"
-
-msgid "From beginning to end"
-msgstr "От начала до конца"
-
-msgid "From end to beginning"
-msgstr "От конца к началу"
-
-msgid "Save messages to a text file"
-msgstr "Сохранить сообщения в текстовый файл"
-
-msgid "Save sms to txt file?"
-msgstr "Сохранить SMS в файл txt?"
-
-msgid "Save as .txt file"
-msgstr "Сохранить как файл .txt"
-
-msgid "Saving..."
-msgstr "Сохранение..."
-
-msgid "Please wait.. Process of saving SMS message to a text file is in progress."
-msgstr "Подождите.. SMS сообщения записываются в файл."
-
-msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
-msgstr "Эта опция позволяет создавать резервные копии SMS-сообщений или, например, сохранять сообщения, не поддерживаемые sms-tool."
-
-msgid "Delete all messages"
-msgstr "Удалить все сообщения"
-
-msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
-msgstr "Эта опция позволяет удалить все SMS-сообщения, если они не отображаются на вкладке 'Полученные сообщения'."
-
-msgid "Saving SMS messages to a file failed. Please try again."
-msgstr "Не удалось сохранить SMS в файл. Пожалуйста, попробуйте еще раз."
+msgid "Not applicable"
+msgstr "Не применимо"
diff --git a/luci-app-sms-tool-js/po/tr/sms-tool-js.po b/luci-app-sms-tool-js/po/tr/sms-tool-js.po
new file mode 100644
index 000000000..0064ad6c3
--- /dev/null
+++ b/luci-app-sms-tool-js/po/tr/sms-tool-js.po
@@ -0,0 +1,922 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: tr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "SMS Messages"
+msgstr "SMS Mesajları"
+
+msgid "Received Messages"
+msgstr "Alınan Mesajlar"
+
+msgid "Send Messages"
+msgstr "Mesaj Gönder"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Gönderen"
+
+msgid "Received"
+msgstr "Alındı"
+
+msgid "Message"
+msgstr "Mesaj"
+
+msgid "Configuration"
+msgstr "Ayarlar"
+
+msgid "AT Commands"
+msgstr "AT Komutları"
+
+msgid "Configuration"
+msgstr "Yapılandırma"
+
+msgid "Please enter phone number"
+msgstr "Lütfen telefon numarasını girin"
+
+msgid "Please enter a message text"
+msgstr "Lütfen mesaj metnini girin"
+
+msgid "Reply"
+msgstr "Yanıt"
+
+msgid "Please enter a USSD code"
+msgstr "Lütfen gönderilecek kodu girin"
+
+msgid "USSD Codes"
+msgstr "USSD Kodları"
+
+msgid "Send to"
+msgstr "Şuraya gönder"
+
+msgid "Message text"
+msgstr "Mesaj metni"
+
+msgid "Send"
+msgstr "Gönder"
+
+msgid "Send to number"
+msgstr "Numaraya gönder"
+
+msgid "to number"
+msgstr "numaraya"
+
+msgid "to group"
+msgstr "gruba"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS başarıyla gönderildi"
+
+msgid "Code to send"
+msgstr "Gönderilecek kod"
+
+msgid "Send code"
+msgstr "Kodu gönder"
+
+msgid "SMS Settings"
+msgstr "SMS Mesajları Ayarları"
+
+msgid "USSD Codes Settings"
+msgstr "USSD Kodları Ayarları"
+
+msgid "SMS reading port"
+msgstr "SMS okuma portu"
+
+msgid "SMS sending port"
+msgstr "SMS gönderme portu"
+
+msgid "AT commands sending port"
+msgstr "AT komutlarını gönderme portu"
+
+msgid "AT Commands Settings"
+msgstr "AT Komutları Ayarları"
+
+msgid "Merge split messages"
+msgstr "Bölünmüş mesajları birleştir"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Bu seçeneği işaretlemek mesajların okunmasını kolaylaştırır, ancak gösterilen ve alınan mesaj sayısında tutarsızlığa neden olur."
+
+msgid "USSD sending port"
+msgstr "USSD gönderme portu"
+
+msgid "Sending USSD code in plain text"
+msgstr "USSD kodunu düz metin olarak gönder"
+
+msgid "Receive message without PDU decoding"
+msgstr "Mesajı PDU çözümlemesi yapmadan al"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "USSD kodunu düz metin olarak gönderir. Komut PDU'ya kodlanmaz."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Mesajı PDU olarak çözümlemeden alır ve görüntüler."
+
+msgid "Explanation of number and prefix"
+msgstr "Numara ve önek hakkında açıklama"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "SMS gönderme sekmesinde, önek ve doğru telefon numarası hakkında bir açıklama göster."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Telefon numarasının başında ülke öneki bulunmalıdır (Polonya için bu 48'dir, '+' işareti olmadan). Numara 5, 4 veya 3 karakterden oluşuyorsa 'kısa' olarak kabul edilir ve başında ülke öneki bulunmamalıdır."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Telefon numarasının başında ülke öneki bulunmalıdır (Polonya için bu 48'dir, + işareti olmadan). Numara 5, 4 veya 3 karakterden oluşuyorsa.. kısa olarak kabul edilir ve başında ülke öneki bulunmamalıdır."
+
+msgid "Add prefix to phone number"
+msgstr "Telefon numarasına önek ekle"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Telefon numarası alanına öneki otomatik olarak ekler."
+
+msgid "Prefix number"
+msgstr "Önek numarası"
+
+msgid "Please specify the command to send"
+msgstr "Lütfen gönderilecek komutu belirtin"
+
+msgid "Please specify the code to send"
+msgstr "Lütfen gönderilecek kodu belirtin"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Lütfen modemle iletişim için portu ayarlayın"
+
+msgid "User AT commands"
+msgstr "Kullanıcı AT komutları"
+
+msgid "Command to send"
+msgstr "Gönderilecek komut"
+
+msgid "Clear form"
+msgstr "Formu temizle"
+
+msgid "Send command"
+msgstr "Komutu gönder"
+
+msgid "Send code"
+msgstr "Kodu gönder"
+
+msgid "Reply"
+msgstr "Yanıt"
+
+msgid "Message storage area"
+msgstr "Mesaj depolama alanı"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Mesajlar belirli bir konumda (örneğin SIM kart veya modem belleğinde) saklanır, ancak cihaz türüne bağlı olarak başka alanlar da kullanılabilir."
+
+msgid "SIM card"
+msgstr "SIM kart"
+
+msgid "Modem memory"
+msgstr "Modem belleği"
+
+msgid "Storage used / Total capacity"
+msgstr "Kullanılan alan / Toplam kapasite"
+
+msgid "Delete selected"
+msgstr "Seçileni sil"
+
+msgid "Delete"
+msgstr "Sil"
+
+msgid "Delete all"
+msgstr "Tümünü sil"
+
+msgid "Refresh"
+msgstr "Yenile"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Lütfen silinecek mesaj(lar)ı seçin"
+
+msgid "Delete selected message(s)?"
+msgstr "Seçilen mesaj(lar) silinsin mi?"
+
+msgid "Delete all the messages?"
+msgstr "Tüm mesajlar silinsin mi?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool kullanılarak mesajların okunması için kullanıcı arayüzü. sms-tool hakkında daha fazla bilgi için %seko.one.pl forumuna%s bakın."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool kullanılarak mesaj gönderilmesi için kullanıcı arayüzü. sms-tool hakkında daha fazla bilgi için %seko.one.pl forumuna%s bakın."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool kullanılarak AT komutlarının gönderilmesi için kullanıcı arayüzü. sms-tool hakkında daha fazla bilgi için %seko.one.pl forumuna%s bakın."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "sms-tool kullanılarak USSD kodlarının gönderilmesi için kullanıcı arayüzü. sms-tool hakkında daha fazla bilgi için %seko.one.pl forumuna%s bakın."
+
+msgid "Configuration sms-tool"
+msgstr "sms-tool Yapılandırması"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "sms-tool ve grafik arayüz uygulaması için yapılandırma paneli."
+
+msgid "Port for communication with the modem"
+msgstr "Modemle iletişim için port"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Mevcut ttyUSBX portlarından birini seçin."
+
+msgid "Please select a port"
+msgstr "Lütfen bir port seçin"
+
+msgid "User contacts"
+msgstr "Kullanıcı kişileri"
+
+msgid "Enable group messaging"
+msgstr "Grup mesajlaşmasını etkinleştir"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Bu seçenek, kullanıcının kişi listesindeki tüm kişilere tek bir mesaj göndermenizi sağlar."
+
+msgid "Message sending delay"
+msgstr "Mesaj gönderme gecikmesi"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Mesaj şu numaraya gönderildi:"
+
+msgid "User USSD codes"
+msgstr "Kullanıcı USSD kodları"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Her satır şu biçimde olmalıdır: 'Kişi adı;telefon numarası'. Kullanıcı kolaylığı için dosya /etc/modem/phonebook.user konumuna kaydedilir."
+
+msgid "Press [Enter] to send the command, press [Delete] to delete the command"
+msgstr "Komutu göndermek için [Enter] tuşuna, silmek için [Delete] tuşuna basın"
+
+msgid "Press [Enter] to send the code, press [Delete] to delete the code"
+msgstr "Kodu göndermek için [Enter] tuşuna, silmek için [Delete] tuşuna basın"
+
+msgid "Press [Delete] to delete the phone number"
+msgstr "Telefon numarasını silmek için [Delete] tuşuna basın"
+
+msgid "Press [Delete] to delete the content of the message"
+msgstr "Mesaj içeriğini silmek için [Delete] tuşuna basın"
+
+msgid "Notification Settings"
+msgstr "Bildirim Ayarları"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED, yeni bir mesaj hakkında bilgi verir. Bu işlevi etkinleştirmeden önce lütfen SMS okuma portunu, gelen kutusunu kontrol etme süresini ayarlayıp kaydedin ve bildirim LED'ini seçin."
+
+msgid "Check inbox every minute(s)"
+msgstr "Gelen kutusunu şu kadar dakikada bir kontrol et"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Gelen kutunuzun kaç dakikada bir kontrol edilmesini istediğinizi belirtin."
+
+msgid "Notification LED"
+msgstr "Bildirim LED'i"
+
+msgid "Select the notification LED."
+msgstr "Bildirim LED'ini seçin."
+
+msgid "Notify new messages"
+msgstr "Yeni mesajları bildir"
+
+msgid "Restart the inbox checking process every"
+msgstr "Gelen kutusu kontrol işlemini şu süre sonra yeniden başlat"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "İşlem, seçilen zaman aralığında yeniden başlatılır. Bu, gelen kutunuzun kontrol edilmesindeki gecikmeyi ortadan kaldırır."
+
+msgid "4h"
+msgstr "4 sa."
+
+msgid "6h"
+msgstr "6 sa."
+
+msgid "8h"
+msgstr "8 sa."
+
+msgid "12h"
+msgstr "12 sa."
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Diyot yalnızca bu bildirimlere ayrılmıştır"
+
+msgid ""
+"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
+"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr ""
+"Yönlendiricinizde yalnızca bir LED varsa veya LED birden fazla görev üstleniyorsa 'Hayır' seçeneğini işaretleyin.
Önemli Bu "
+"seçeneğin doğru çalışması için LED'in sistemde tanımlanmış olması gerekir (mümkünse). Bu gereklilik, diyotun birden fazla görevi desteklediği durumlarda geçerlidir."
+
+msgid ""
+"[3 - 59] second(s)
Important Messages "
+"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
+msgstr ""
+"[3 - 59] saniye
Önemli Mesajlar "
+"teslimat doğrulaması ve onayı yapılmadan gönderilir. Bu nedenle mesajın teslim edilmeme riski vardır."
+
+msgid "No"
+msgstr "Hayır"
+
+msgid "Yes"
+msgstr "Evet"
+
+msgid "Merge algorithm"
+msgstr "Birleştirme algoritması"
+
+msgid "Simple (merge without sorting)"
+msgstr "Basit (sıralama yapmadan birleştirir)"
+
+msgid "Advanced (merges with sorting)"
+msgstr "Gelişmiş (sıralayarak birleştirir)"
+
+msgid "Phone number to be blurred"
+msgstr "Bulanıklaştırılacak telefon numarası"
+
+msgid "The last 5 digits of this number will be blurred."
+msgstr "Bu numaranın son 5 hanesi bulanıklaştırılacaktır."
+
+msgid "Expect a decimal value between five and fifty-nine"
+msgstr "Beş ile elli dokuz arasında ondalık bir değer bekleniyor"
+
+msgid "Expect a decimal value between three and fifty-nine"
+msgstr "Üç ile elli dokuz arasında ondalık bir değer bekleniyor"
+
+msgid "Expect a decimal value"
+msgstr "Ondalık bir değer bekleniyor"
+
+msgid "Direction of message merging"
+msgstr "Mesaj birleştirme yönü"
+
+msgid "From beginning to end"
+msgstr "Baştan sona"
+
+msgid "From end to beginning"
+msgstr "Sondan başa"
+
+msgid "Save messages to a text file"
+msgstr "Mesajları metin dosyasına kaydet"
+
+msgid "Save sms to txt file?"
+msgstr "SMS mesajları txt dosyasına kaydedilsin mi?"
+
+msgid "Save as .txt file"
+msgstr ".txt dosyası olarak kaydet"
+
+msgid "Saving..."
+msgstr "Kaydediliyor..."
+
+msgid "Please wait.. Process of saving SMS message to a text file is in progress."
+msgstr "Lütfen bekleyin.. SMS mesajının metin dosyasına kaydedilme işlemi devam ediyor."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Bu seçenek, SMS mesajlarının yedeklenmesine veya örneğin sms-tool tarafından desteklenmeyen mesajların kaydedilmesine olanak tanır."
+
+msgid "Delete all messages"
+msgstr "Tüm mesajları sil"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Bu seçenek, 'Alınan Mesajlar' sekmesinde görünmeyen tüm SMS mesajlarını silmenizi sağlar."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "SMS mesajlarının dosyaya kaydedilmesi başarısız oldu. Lütfen tekrar deneyin."
+
+msgid "PDU decoding scheme"
+msgstr "PDU çözümleme şeması"
+
+msgid "Autodetect"
+msgstr "Otomatik algıla"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Yeni bir USSD kodu gönderirken önceki yanıtı koru."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "USSD kodları üzerine kurulu menüyü kullanmanız gerekiyorsa bu seçeneği işaretleyin"
+
+msgid "Turn over the replies."
+msgstr "Yanıtların sırasını ters çevir."
+
+msgid "View new reply from top"
+msgstr "Yeni yanıtı en üstten görüntüle"
+
+msgid "Please wait... deleted"
+msgstr "Lütfen bekleyin... silindi"
+
+msgid "of"
+msgstr "/"
+
+msgid "selected messages"
+msgstr "seçili mesaj"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
2. Belirli "
+"modeme özgü ek seçenekler (USSD kodlarının işlenmesi için).
3. Bildirim LED'i (isteğe bağlı).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "SMS mesajlarının okunacağı alandaki her değişiklik, mesajların yenilenmesini gerektirir"
+
+msgid "Characters remaining:"
+msgstr "Kalan karakter:"
+
+msgid "Encoding standard"
+msgstr "Kodlama standardı"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 karakter)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 karakter)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7 kodlaması (160 karakter)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode kodlaması (70 karakter), ulusal karakterlerin (utf8 içinde) gönderilmesini desteklemez - yalnızca ascii"
+
+msgid "The tab allows users to support the package."
+msgstr "Bu sekme, kullanıcıların paketi desteklemesine olanak tanır"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Luci-app-sms-tool-js Bilgisi"
+
+msgid "Report a bug"
+msgstr "Hata bildir"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "eko.one.pl forumundaki paket konusuna yazın"
+
+msgid "Write on forum"
+msgstr "Forumda yaz"
+
+msgid "Report a bug on the package Github page"
+msgstr "Paketin Github sayfasında hata bildirin"
+
+msgid "Open a package discussion on Github"
+msgstr "Github'da paket tartışmasını açın"
+
+msgid "Open discussion"
+msgstr "Tartışmayı aç"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Projenin geliştirilmesini ve yazarını desteklemek istiyorsanız bir kahve ısmarlayın"
+
+msgid "Buy a coffee"
+msgstr "Kahve ısmarla"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Projenin geliştirilmesini ve yazarını desteklemek istiyorsanız sponsor olun"
+
+msgid "Become a sponsor"
+msgstr "Sponsor ol"
+
+msgid "Package Info"
+msgstr "Paket Bilgisi"
+
+msgid "Author (package maintainer)"
+msgstr "Yazar (paket bakımcısı)"
+
+msgid "Package update and support"
+msgstr "Paket güncellemesi ve desteği"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "SMS'i E-postaya İletme Ayarları"
+
+msgid "An e-mail will be sent.."
+msgstr "Bir e-posta gönderilecek.."
+
+msgid "Enable message forwarding"
+msgstr "Mesaj iletmeyi etkinleştir"
+
+msgid "E-mail settings"
+msgstr "E-posta ayarları"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Önceden tanımlanmış bir e-posta ayarı seçin veya ayarları manuel olarak girin."
+
+msgid "Recipient"
+msgstr "Alıcı"
+
+msgid "E-mail address of the recipient."
+msgstr "Alıcının e-posta adresi."
+
+msgid "Sender"
+msgstr "Gönderen"
+
+msgid "E-mail address of the sender."
+msgstr "Gönderenin e-posta adresi."
+
+msgid "User"
+msgstr "Kullanıcı"
+
+msgid "Username for SMTP authentication."
+msgstr "SMTP kimlik doğrulaması için kullanıcı adı."
+
+msgid "Password"
+msgstr "Parola"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google uygulama parolası / SMTP kimlik doğrulaması için parola."
+
+msgid "SMTP server"
+msgstr "SMTP sunucusu"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "SMTP sunucusunun ana bilgisayar adı/IP adresi."
+
+msgid "SMTP server port"
+msgstr "SMTP sunucu portu"
+
+msgid "Security"
+msgstr "Güvenlik"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: sunucu destekliyorsa STARTTLS kullanın."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SSL üzerinden SMTP."
+
+msgid "Required Package"
+msgstr "Gerekli Paket"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "SMS iletme seçeneği, mailsend paketinin kurulu olmasını gerektirir."
+
+msgid "Check required packages"
+msgstr "Gerekli paketleri kontrol et"
+
+msgid "Check"
+msgstr "Kontrol et"
+
+msgid "Mailsend Package"
+msgstr "Mailsend Paketi"
+
+msgid "Loading package data…"
+msgstr "Paket verileri yükleniyor…"
+
+msgid "Installed"
+msgstr "Kurulu"
+
+msgid "Install…"
+msgstr "Kur…"
+
+msgid "Mailsend Package"
+msgstr "Mailsend Paketi"
+
+msgid "Please select exactly one message to forward"
+msgstr "Lütfen iletmek için tam olarak bir mesaj seçin"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Seçilen mesaj e-postaya iletilsin mi?"
+
+msgid "Sending e-mail..."
+msgstr "E-posta gönderiliyor..."
+
+msgid "Message forwarded successfully"
+msgstr "Mesaj başarıyla iletildi"
+
+msgid "Failed to forward message: %s"
+msgstr "Mesaj iletilemedi: %s"
+
+msgid "Error: %s"
+msgstr "Hata: %s"
+
+msgid "user define"
+msgstr "kullanıcı tanımlı"
+
+msgid "Forward SMS"
+msgstr "SMS'i ilet"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Lütfen iletilecek mesaj(lar)ı seçin"
+
+msgid "SMS forwarding function is not enabled"
+msgstr "SMS iletme işlevi etkin değil"
+
+msgid "My Router"
+msgstr "Yönlendiricim"
+
+msgid "Forward SMS to E-mail"
+msgstr "SMS'i E-postaya İlet"
+
+msgid "Subject:"
+msgstr "Konu:"
+
+msgid "Message text:"
+msgstr "Mesaj metni:"
+
+msgid "Send"
+msgstr "Gönder"
+
+msgid "Subject and body cannot be empty"
+msgstr "Konu ve mesaj içeriği boş olamaz"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "mailsend paketi kurulu değil. Lütfen önce aşağıdaki Kur... düğmesini kullanarak kurun"
+
+msgid "Select modem"
+msgstr "Modem seç"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Modemi değiştirmek, mesajların yenilenmesini gerektirir"
+
+msgid "Defined AT command files"
+msgstr "Tanımlanmış AT komut dosyaları"
+
+msgid "Error loading AT commands file: "
+msgstr "AT komutları dosyası yüklenirken hata: "
+
+msgid "Select file with AT commands to load"
+msgstr "Yüklenecek AT komutları dosyasını seçin"
+
+msgid "Error loading AT commands file: "
+msgstr "AT komutları dosyası yüklenirken hata: "
+
+msgid "No AT commands available"
+msgstr "Kullanılabilir AT komutu yok"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Başlangıç AT komutları dosyası yüklenirken hata:"
+
+msgid "Error loading USSD codes file: "
+msgstr "USSD kodları dosyası yüklenirken hata: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Başlangıç USSD dosyası yüklenirken hata:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Yüklenecek USSD kodları dosyasını seçin"
+
+msgid "No USSD codes available"
+msgstr "Kullanılabilir USSD kodu yok"
+
+msgid "Defined USSD code files"
+msgstr "Tanımlanmış USSD kod dosyaları"
+
+msgid "File uploaded and saved to"
+msgstr "Dosya yüklendi ve şuraya kaydedildi:"
+
+msgid "Unable to upload file"
+msgstr "Dosya yüklenemiyor"
+
+msgid "Phonebook saved successfully"
+msgstr "Telefon rehberi başarıyla kaydedildi"
+
+msgid "Unable to save the file"
+msgstr "Dosya kaydedilemiyor"
+
+msgid "filename.user"
+msgstr "dosyaadi.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Düzenlemek için bir dosya seçin veya oluşturun..."
+
+msgid "Please enter a file name"
+msgstr "Lütfen bir dosya adı girin"
+
+msgid "File created successfully"
+msgstr "Dosya başarıyla oluşturuldu"
+
+msgid "Unable to create file"
+msgstr "Dosya oluşturulamıyor"
+
+msgid "Please select a file to delete"
+msgstr "Lütfen silinecek bir dosya seçin"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Bu dosyayı silmek istediğinizden emin misiniz?"
+
+msgid "File deleted successfully"
+msgstr "Dosya başarıyla silindi"
+
+msgid "Unable to delete file"
+msgstr "Dosya silinemiyor"
+
+msgid "Please select or create a file first"
+msgstr "Lütfen önce bir dosya seçin veya oluşturun"
+
+msgid "File saved successfully"
+msgstr "Dosya başarıyla kaydedildi"
+
+msgid "Unable to save file"
+msgstr "Dosya kaydedilemiyor"
+
+msgid "Load .user file"
+msgstr ".user dosyasını yükle"
+
+msgid "Save .user file"
+msgstr ".user dosyasını kaydet"
+
+msgid "Manage contacts"
+msgstr "Kişileri yönet"
+
+msgid "Edit User Contacts"
+msgstr "Kullanıcı Kişilerini Düzenle"
+
+msgid "Manage USSD codes"
+msgstr "USSD kodlarını yönet"
+
+msgid "Manage User USSD Codes"
+msgstr "Kullanıcı USSD Kodlarını Yönet"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Her satır şu biçimde olmalıdır: 'Kod açıklaması;kod'. Kullanıcı kolaylığı için dosya /etc/modem/ussdcodes/ konumuna kaydedilir."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Her satır şu biçimde olmalıdır: 'AT komutu açıklaması;AT komutu'. Kullanıcı kolaylığı için dosya /etc/modem/atcmmds/ konumuna kaydedilir."
+
+msgid "Manage AT commands"
+msgstr "AT komutlarını yönet"
+
+msgid "Manage User AT Commands"
+msgstr "Kullanıcı AT Komutlarını Yönet"
+
+msgid "-- Select file --"
+msgstr "-- Dosya seçin --"
+
+msgid "Select file"
+msgstr "Dosya seç"
+
+msgid "New file name"
+msgstr "Yeni dosya adı"
+
+msgid "Delete selected file"
+msgstr "Seçilen dosyayı sil"
+
+msgid "Show notification icon"
+msgstr "Bildirim simgesini göster"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Durum genel görünüm sayfasında yeni mesaj bildirim simgesini göster."
+
+msgid "Loading..."
+msgstr "Yükleniyor..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Modemler"
+
+msgid "Signal Quality"
+msgstr "Sinyal Kalitesi"
+
+msgid "Align preview to:"
+msgstr "Önizlemeyi şuraya hizala:"
+
+msgid "Left"
+msgstr "Sol"
+
+msgid "Center"
+msgstr "Orta"
+
+msgid "Right"
+msgstr "Sağ"
+
+msgid "New message information block settings"
+msgstr "Yeni mesaj bilgi bloğu ayarları"
+
+msgid "Alignment settings saved successfully"
+msgstr "Hizalama ayarları başarıyla kaydedildi"
+
+msgid "SMS Info"
+msgstr "SMS Bilgisi"
+
+msgid "New SMS"
+msgstr "Yeni SMS"
+
+msgid "No new SMS"
+msgstr "Yeni SMS yok"
+
+msgid "Deleting files"
+msgstr "Dosyalar siliniyor"
+
+msgid "Delete all files"
+msgstr "Tüm dosyaları sil"
+
+msgid "Load .gz archive"
+msgstr ".gz arşivini yükle"
+
+msgid "Save .gz archive"
+msgstr ".gz arşivini kaydet"
+
+msgid "File uploaded and saved to"
+msgstr "Dosya yüklendi ve şuraya kaydedildi:"
+
+msgid "Failed to extract archive"
+msgstr "Arşiv çıkartılamadı"
+
+msgid "Archive extracted to"
+msgstr "Arşiv şuraya çıkartıldı:"
+
+msgid "Upload error"
+msgstr "Yükleme hatası"
+
+msgid "Failed to create archive"
+msgstr "Arşiv oluşturulamadı"
+
+msgid "Failed to read archive"
+msgstr "Arşiv okunamadı"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Klasördeki tüm dosyaları silmek istediğinizden emin misiniz?"
+
+msgid "All files deleted successfully"
+msgstr "Tüm dosyalar başarıyla silindi"
+
+msgid "Calls"
+msgstr "Aramalar"
+
+msgid "Call Log"
+msgstr "Arama Kaydı"
+
+msgid "Clear all call log entries?"
+msgstr "Tüm arama kaydı girişleri temizlensin mi?"
+
+msgid "No call log entries found"
+msgstr "Arama kaydı girişi bulunamadı"
+
+msgid "No matching call log entries found"
+msgstr "Eşleşen arama kaydı girişi bulunamadı"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Arama kayıtlarını görüntülemek için kullanıcı arayüzü. Kayıt, arka planda çalışan bir servis tarafından toplanır."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Arama kaydı servisi devre dışı. Kayıt toplamaya başlamak için lütfen yapılandırmadan etkinleştirin."
+
+msgid "Filter call type"
+msgstr "Arama türüne göre filtrele"
+
+msgid "All calls"
+msgstr "Tüm aramalar"
+
+msgid "Missed calls"
+msgstr "Cevapsız aramalar"
+
+msgid "Received calls"
+msgstr "Gelen aramalar"
+
+msgid "Dialed calls"
+msgstr "Yapılan aramalar"
+
+msgid "Refresh"
+msgstr "Yenile"
+
+msgid "Clear Log"
+msgstr "Kaydı temizle"
+
+msgid "Date"
+msgstr "Tarih"
+
+msgid "Type"
+msgstr "Tür"
+
+msgid "Number"
+msgstr "Numara"
+
+msgid "Duration"
+msgstr "Süre"
+
+msgid "Name"
+msgstr "Ad"
+
+msgid "Call log reading port"
+msgstr "Arama kaydı okuma portu"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Mevcut ttyUSBX portlarından birini seçin."
+
+msgid "Please select a port"
+msgstr "Lütfen bir port seçin"
+
+msgid "Enable call log daemon"
+msgstr "Arama kaydı servisini etkinleştir"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Gelen ve cevapsız aramaları kaydetmek için arka planda çalışan işlem."
+
+msgid "Call Log Settings"
+msgstr "Arama Kaydı Ayarları"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Gelen ve cevapsız aramaları kaydetmek için arka planda çalışan işlem.
Önemli Bu seçenek, dahili arama geçmişi belleği bulunmayan ve standart AT+CPBR komutunu desteklemeyen Qualcomm modemleri için ayrılmıştır. Bu seçeneği etkinleştirmek yeni bir sekme ekler. Özel sekme görünmezse tarayıcı önbelleğinizi temizleyin ve yönlendiriciyi yeniden başlatın."
+
+msgid "Force EHLO"
+msgstr "EHLO'yu Zorla"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "mailsend'in HELO/EHLO'yu otomatik algılaması yerine her zaman EHLO kullanmasını zorunlu kılar. Yalnızca iletme başarısız olursa etkinleştirin; çünkü bazı sunucular (ör. kurumsal ağ geçitleri, Microsoft 365 / Exchange Online Protection) ESMTP desteğini doğru şekilde bildirmez ve bu da STARTTLS/kimlik doğrulamasının çalışmamasına neden olur."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicode kodlaması (varsayılan olarak 70 karakter) ulusal karakterlerin ve çok parçalı sms mesajlarının iletilmesini destekler"
+
+msgid "Not applicable"
+msgstr "Uygulanamaz"
diff --git a/luci-app-sms-tool-js/po/vi/sms-tool-js.po b/luci-app-sms-tool-js/po/vi/sms-tool-js.po
new file mode 100644
index 000000000..e44ece44b
--- /dev/null
+++ b/luci-app-sms-tool-js/po/vi/sms-tool-js.po
@@ -0,0 +1,965 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: vi\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "SMS Messages"
+msgstr "Tin nhắn SMS"
+
+msgid "Received Messages"
+msgstr "Tin nhắn đã nhận"
+
+msgid "Send Messages"
+msgstr "Gửi tin nhắn"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "Người gửi"
+
+msgid "Received"
+msgstr "Đã nhận"
+
+msgid "Message"
+msgstr "Tin nhắn"
+
+msgid "Configuration"
+msgstr "Cài đặt"
+
+msgid "AT Commands"
+msgstr "Lệnh AT"
+
+msgid "Configuration"
+msgstr "Cấu hình"
+
+msgid "Please enter phone number"
+msgstr "Vui lòng nhập số điện thoại"
+
+msgid "Please enter a message text"
+msgstr "Vui lòng nhập nội dung tin nhắn"
+
+msgid "Reply"
+msgstr "Trả lời"
+
+msgid "Please enter a USSD code"
+msgstr "Vui lòng nhập mã để gửi"
+
+msgid "USSD Codes"
+msgstr "Mã USSD"
+
+msgid "Send to"
+msgstr "Gửi đến"
+
+msgid "Message text"
+msgstr "Nội dung tin nhắn"
+
+msgid "Send"
+msgstr "Gửi"
+
+msgid "Send to number"
+msgstr "Gửi đến số"
+
+msgid "to number"
+msgstr "đến số"
+
+msgid "to group"
+msgstr "đến nhóm"
+
+msgid "SMS sent sucessfully"
+msgstr "SMS đã được gửi"
+
+msgid "Code to send"
+msgstr "Mã để gửi"
+
+msgid "Send code"
+msgstr "Gửi mã"
+
+msgid "SMS Settings"
+msgstr "Cài đặt cho tin nhắn SMS"
+
+msgid "USSD Codes Settings"
+msgstr "Cài đặt cho mã USSD"
+
+msgid "SMS reading port"
+msgstr "Cổng đọc SMS"
+
+msgid "SMS sending port"
+msgstr "Cổng gửi SMS"
+
+msgid "AT commands sending port"
+msgstr "Cổng gửi lệnh AT"
+
+msgid "AT Commands Settings"
+msgstr "Cài đặt cho lệnh AT"
+
+msgid "Merge split messages"
+msgstr "Hợp nhất tin nhắn bị chia"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "Các tin nhắn bị chia sẽ được hợp nhất. Bật tùy chọn này sẽ giúp đọc SMS dễ dàng hơn, nhưng sẽ gây ra sự khác biệt về số lượng tin nhắn hiển thị và nhận được."
+
+msgid "USSD sending port"
+msgstr "Cổng gửi mã USSD"
+
+msgid "Sending USSD code in plain text"
+msgstr "Gửi mã USSD dạng văn bản thuần túy"
+
+msgid "Receive message without PDU decoding"
+msgstr "Nhận tin nhắn mà không giải mã PDU"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "Gửi mã USSD dạng văn bản thuần túy. Lệnh không được giải mã thành PDU."
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "Tin nhắn nhận được sẽ được hiển thị mà không giải mã nó như PDU."
+
+msgid "Explanation of number and prefix"
+msgstr "Giải thích về số và tiền tố"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "Trong tab cho phép gửi SMS, hiển thị giải thích về tiền tố và số điện thoại đúng."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "Số điện thoại phải có tiền tố quốc gia ở trước (đối với Ba Lan là 48, không có dấu '+'). Nếu số có 5, 4 hoặc 3 ký tự, nó được coi là 'ngắn' và không cần có tiền tố quốc gia ở trước."
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "Số điện thoại phải có tiền tố quốc gia ở trước (đối với Ba Lan là 48, không có dấu +). Nếu số có 5, 4 hoặc 3 ký tự, nó được coi là ngắn và không cần có tiền tố quốc gia ở trước."
+
+msgid "Add prefix to phone number"
+msgstr "Thêm tiền tố vào số điện thoại"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "Tự động điền tiền tố vào trường số điện thoại."
+
+msgid "Prefix number"
+msgstr "Số tiền tố"
+
+msgid "Please specify the command to send"
+msgstr "Vui lòng chỉ định lệnh để gửi"
+
+msgid "Please specify the code to send"
+msgstr "Vui lòng chỉ định mã để gửi"
+
+msgid "Please set the port for communication with the modem"
+msgstr "Vui lòng chỉ định cổng để giao tiếp với modem"
+
+msgid "User AT commands"
+msgstr "Lệnh AT người dùng"
+
+msgid "Command to send"
+msgstr "Lệnh để gửi"
+
+msgid "Clear form"
+msgstr "Xóa biểu mẫu"
+
+msgid "Send command"
+msgstr "Gửi lệnh"
+
+msgid "Send code"
+msgstr "Gửi mã"
+
+msgid "Reply"
+msgstr "Trả lời"
+
+msgid "Message storage area"
+msgstr "Vùng lưu trữ tin nhắn"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "Tin nhắn được lưu trữ ở một vị trí cụ thể (ví dụ: trên thẻ SIM hoặc bộ nhớ modem), nhưng tùy thuộc vào loại thiết bị, các vùng khác cũng có thể có sẵn."
+
+msgid "SIM card"
+msgstr "Thẻ SIM"
+
+msgid "Modem memory"
+msgstr "Bộ nhớ modem"
+
+msgid "Storage used / Total capacity"
+msgstr "Bộ nhớ đã sử dụng / Dung lượng tổng"
+
+msgid "Delete selected"
+msgstr "Xóa mục đã chọn"
+
+msgid "Delete"
+msgstr "Xóa"
+
+msgid "Delete all"
+msgstr "Xóa tất cả"
+
+msgid "Refresh"
+msgstr "Làm mới"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "Vui lòng chọn (các) tin nhắn để xóa"
+
+msgid "Delete selected message(s)?"
+msgstr "Xóa (các) tin nhắn đã chọn?"
+
+msgid "Delete all the messages?"
+msgstr "Xóa tất cả tin nhắn?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Giao diện người dùng để đọc tin nhắn SMS bằng sms-tool. Thêm thông tin về chương trình sms-tool trên %sdiễn đàn eko.one.pl%s."
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Giao diện người dùng để gửi tin nhắn SMS bằng sms-tool. Thêm thông tin về chương trình sms-tool trên %sdiễn đàn eko.one.pl%s."
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Giao diện người dùng để gửi lệnh AT bằng sms-tool. Thêm thông tin về chương trình sms-tool trên %sdiễn đàn eko.one.pl%s."
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "Giao diện người dùng để gửi mã USSD bằng sms-tool. Thêm thông tin về chương trình sms-tool trên %sdiễn đàn eko.one.pl%s."
+
+msgid "Configuration sms-tool"
+msgstr "Cấu hình sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "Bảng cài đặt cho chương trình sms-tool và giao diện người dùng."
+
+msgid "Port for communication with the modem"
+msgstr "Cổng để giao tiếp với modem"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Chọn một trong các cổng ttyUSBX có sẵn."
+
+msgid "Please select a port"
+msgstr "Vui lòng chọn cổng"
+
+msgid "User contacts"
+msgstr "Danh bạ người dùng"
+
+msgid "Enable group messaging"
+msgstr "Bật tin nhắn nhóm"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "Tùy chọn này cho phép gửi một tin nhắn đến tất cả các liên hệ trong danh sách liên hệ của người dùng."
+
+msgid "Message sending delay"
+msgstr "Độ trễ khi gửi tin nhắn"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[Bot] Tin nhắn đã gửi đến số:"
+
+msgid "User USSD codes"
+msgstr "Mã USSD người dùng"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "Mỗi dòng phải có định dạng sau: 'Tên liên hệ;số điện thoại'. Để thuận tiện cho người dùng, các liên hệ được lưu trong tệp /etc/modem/phonebook.user."
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "Mỗi dòng phải có định dạng sau: 'Mô tả lệnh AT;lệnh AT'. Để thuận tiện cho người dùng, các lệnh được lưu trong tệp /etc/modem/atcmmds.user."
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "Mỗi dòng phải có định dạng sau: 'Mô tả mã;mã'. Để thuận tiện cho người dùng, các mã được lưu trong tệp /etc/modem/ussdcodes.user."
+
+msgid "Display new messages notification on login page"
+msgstr "Hiển thị thông báo tin nhắn mới trên trang đăng nhập"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "Hiển thị thông báo khi có tin nhắn mới đến trong vùng tin nhắn đã chọn."
+
+msgid "new message"
+msgstr "tin nhắn mới"
+
+msgid "new messages"
+msgstr "tin nhắn mới"
+
+msgid "All"
+msgstr "Tất cả"
+
+msgid "Show"
+msgstr "Hiển thị"
+
+msgid "Read"
+msgstr "Đã đọc"
+
+msgid "Unread"
+msgstr "Chưa đọc"
+
+msgid "All / Read / Unread"
+msgstr "Tất cả / Đã đọc / Chưa đọc"
+
+msgid "Show all, read or unread messages"
+msgstr "Hiển thị tất cả tin nhắn, đã đọc hoặc chưa đọc"
+
+msgid "Show system messages in the message list"
+msgstr "Hiển thị tin nhắn hệ thống trong danh sách tin nhắn"
+
+msgid "Mark as read"
+msgstr "Đánh dấu là đã đọc"
+
+msgid "Mark as unread"
+msgstr "Đánh dấu là chưa đọc"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "Vui lòng chọn (các) tin nhắn để đánh dấu là đã đọc"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "Vui lòng chọn (các) tin nhắn để đánh dấu là chưa đọc"
+
+msgid "Mark selected message(s) as read?"
+msgstr "Đánh dấu (các) tin nhắn đã chọn là đã đọc?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "Đánh dấu (các) tin nhắn đã chọn là chưa đọc?"
+
+msgid "Message marked as read"
+msgstr "Tin nhắn được đánh dấu là đã đọc"
+
+msgid "Messages marked as read"
+msgstr "Tin nhắn được đánh dấu là đã đọc"
+
+msgid "Message marked as unread"
+msgstr "Tin nhắn được đánh dấu là chưa đọc"
+
+msgid "Messages marked as unread"
+msgstr "Tin nhắn được đánh dấu là chưa đọc"
+
+msgid "System messages"
+msgstr "Tin nhắn hệ thống"
+
+msgid "Diode"
+msgstr "Diode"
+
+msgid "New messages notification LED"
+msgstr "LED thông báo tin nhắn mới"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "Bật LED thông báo SMS khi có tin nhắn mới"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "Bật LED thông báo khi có tin nhắn mới đến trong vùng tin nhắn đã chọn."
+
+msgid "Selected LED"
+msgstr "LED đã chọn"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "Chọn diode LED để thông báo tin nhắn mới. Chọn từ các LED có sẵn trong hệ thống."
+
+msgid "Automatically select LED"
+msgstr "Tự động chọn LED"
+
+msgid "Automatically select the first available LED."
+msgstr "Tự động chọn LED có sẵn đầu tiên."
+
+msgid "Advanced settings"
+msgstr "Cài đặt nâng cao"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "Khoảng thời gian nhấp nháy LED (tính bằng giây)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "Đặt khoảng thời gian nhấp nháy LED (tính bằng giây)."
+
+msgid "Flashing duration (in seconds)"
+msgstr "Thời gian nhấp nháy (tính bằng giây)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "Đặt thời gian nhấp nháy (tính bằng giây). Đặt thành 0 cho thời gian vô hạn (LED sẽ nhấp nháy cho đến khi tin nhắn được đánh dấu là đã đọc)."
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "Vui lòng đợi... Quá trình lưu tin nhắn SMS vào tệp văn bản đang diễn ra."
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "Tùy chọn này cho phép sao lưu tin nhắn SMS hoặc ví dụ, lưu các tin nhắn không được hỗ trợ bởi sms-tool."
+
+msgid "Delete all messages"
+msgstr "Xóa tất cả tin nhắn"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "Tùy chọn này cho phép xóa tất cả tin nhắn SMS trong trường hợp chúng không hiển thị trong tab 'Tin nhắn đã nhận'."
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "Lưu tin nhắn SMS vào tệp không thành công. Vui lòng thử lại."
+
+msgid "PDU decoding scheme"
+msgstr "Lược đồ giải mã PDU"
+
+msgid "Autodetect"
+msgstr "Tự động phát hiện"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "Giữ phản hồi trước đó khi gửi mã USSD mới."
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "Đánh dấu tùy chọn này nếu bạn cần sử dụng menu được xây dựng trên mã USSD"
+
+msgid "Turn over the replies."
+msgstr "Đảo ngược các phản hồi."
+
+msgid "View new reply from top"
+msgstr "Hiển thị phản hồi mới từ trên xuống"
+
+msgid "Please wait... deleted"
+msgstr "Vui lòng đợi... đã xóa"
+
+msgid "of"
+msgstr "trong số"
+
+msgid "selected messages"
+msgstr "tin nhắn đã chọn"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"Gói yêu cầu cấu hình của người dùng.
Cần "
+"cài đặt:
1. Tất cả các cổng để giao tiếp với modem.
2. Các tùy chọn "
+"bổ sung dành riêng cho modem cụ thể (để xử lý mã USSD).
3. LED thông báo (tùy chọn).
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "Bất kỳ thay đổi nào về vùng mà từ đó SMS sẽ được đọc đều yêu cầu làm mới tin nhắn"
+
+msgid "Characters remaining:"
+msgstr "Số ký tự còn lại:"
+
+msgid "Encoding standard"
+msgstr "Tiêu chuẩn mã hóa"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7 (160 ký tự)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode (70 ký tự)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "Mã hóa GSM-7 (160 ký tự)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Mã hóa Unicode (70 ký tự), không hỗ trợ gửi ký tự quốc gia (trong utf8) – chỉ ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "Tab cho phép người dùng hỗ trợ gói"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "Thông tin về gói luci-app-sms-tool-js"
+
+msgid "Report a bug"
+msgstr "Báo cáo lỗi"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Viết trong chủ đề về gói trên diễn đàn eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Viết trên diễn đàn"
+
+msgid "Report a bug on the package Github page"
+msgstr "Báo cáo lỗi trên trang Github của gói"
+
+msgid "Open a package discussion on Github"
+msgstr "Mở cuộc thảo luận về gói trên Github"
+
+msgid "Open discussion"
+msgstr "Mở cuộc thảo luận"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Mua cà phê nếu bạn muốn hỗ trợ sự phát triển của dự án và tác giả"
+
+msgid "Buy a coffee"
+msgstr "Mua cà phê"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Trở thành nhà tài trợ nếu bạn muốn hỗ trợ sự phát triển của dự án và tác giả"
+
+msgid "Become a sponsor"
+msgstr "Trở thành nhà tài trợ"
+
+msgid "Package Info"
+msgstr "Thông tin về gói"
+
+msgid "Author (package maintainer)"
+msgstr "Tác giả (người bảo trì gói)"
+
+msgid "Package update and support"
+msgstr "Cập nhật và hỗ trợ gói"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "Cài đặt chuyển tiếp SMS đến e-mail"
+
+msgid "An e-mail will be sent.."
+msgstr "E-mail sẽ được gửi.."
+
+msgid "Enable message forwarding"
+msgstr "Bật chuyển tiếp tin nhắn"
+
+msgid "E-mail settings"
+msgstr "Cài đặt cho e-mail"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "Chọn cài đặt e-mail được xác định trước hoặc nhập cài đặt thủ công."
+
+msgid "Recipient"
+msgstr "Người nhận"
+
+msgid "E-mail address of the recipient."
+msgstr "Địa chỉ e-mail của người nhận."
+
+msgid "Sender"
+msgstr "Người gửi"
+
+msgid "E-mail address of the sender."
+msgstr "Địa chỉ e-mail của người gửi."
+
+msgid "User"
+msgstr "Người dùng"
+
+msgid "Username for SMTP authentication."
+msgstr "Tên người dùng để xác thực SMTP."
+
+msgid "Password"
+msgstr "Mật khẩu"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Mật khẩu ứng dụng Google / Mật khẩu để xác thực SMTP."
+
+msgid "SMTP server"
+msgstr "Máy chủ SMTP"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "Tên máy chủ/địa chỉ IP của máy chủ SMTP."
+
+msgid "SMTP server port"
+msgstr "Cổng máy chủ SMTP"
+
+msgid "Security"
+msgstr "Bảo mật"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS: sử dụng STARTTLS nếu máy chủ hỗ trợ."
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL: SMTP qua SSL."
+
+msgid "Required Package"
+msgstr "Gói yêu cầu"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "Tùy chọn chuyển tiếp tin nhắn SMS yêu cầu cài đặt gói mailsend."
+
+msgid "Check required packages"
+msgstr "Kiểm tra các gói yêu cầu"
+
+msgid "Check"
+msgstr "Kiểm tra"
+
+msgid "Mailsend Package"
+msgstr "Gói mailsend"
+
+msgid "Loading package data…"
+msgstr "Đang tải dữ liệu gói…"
+
+msgid "Installed"
+msgstr "Đã cài đặt"
+
+msgid "Install…"
+msgstr "Cài đặt…"
+
+msgid "Mailsend Package"
+msgstr "Gói mailsend"
+
+msgid "Please select exactly one message to forward"
+msgstr "Vui lòng chọn chính xác một tin nhắn để chuyển tiếp"
+
+msgid "Forward selected message to e-mail?"
+msgstr "Chuyển tiếp tin nhắn đã chọn đến e-mail?"
+
+msgid "Sending e-mail..."
+msgstr "Đang gửi e-mail..."
+
+msgid "Message forwarded successfully"
+msgstr "Tin nhắn đã được chuyển tiếp thành công"
+
+msgid "Failed to forward message: %s"
+msgstr "Không thể chuyển tiếp tin nhắn: %s"
+
+msgid "Error: %s"
+msgstr "Lỗi: %s"
+
+msgid "user define"
+msgstr "cài đặt người dùng"
+
+msgid "Forward"
+msgstr "Chuyển tiếp"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "Chọn (các) tin nhắn mà bạn muốn chuyển tiếp"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "Chức năng chuyển tiếp tin nhắn SMS chưa được bật. Vui lòng cấu hình nó trước"
+
+msgid "My Router"
+msgstr "Bộ định tuyến của tôi"
+
+msgid "Forward SMS to E-mail"
+msgstr "Chuyển tiếp (các) tin nhắn SMS đến e-mail"
+
+msgid "Subject:"
+msgstr "Chủ đề:"
+
+msgid "Message text:"
+msgstr "Nội dung tin nhắn:"
+
+msgid "Send"
+msgstr "Gửi"
+
+msgid "Subject and body cannot be empty"
+msgstr "Chủ đề và nội dung không được để trống"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "Gói mailsend chưa được cài đặt. Vui lòng cài đặt nó trước bằng nút Cài đặt... bên dưới"
+
+msgid "Select modem"
+msgstr "Chọn modem"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "Thay đổi modem yêu cầu làm mới tin nhắn"
+
+msgid "Defined AT command files"
+msgstr "Tệp lệnh AT đã định nghĩa"
+
+msgid "Defined USSD code files"
+msgstr "Tệp mã USSD đã định nghĩa"
+
+msgid "File uploaded and saved to"
+msgstr "Tệp đã tải lên và lưu vào"
+
+msgid "Unable to upload file"
+msgstr "Không thể tải lên tệp"
+
+msgid "Phonebook saved successfully"
+msgstr "Danh bạ đã lưu thành công"
+
+msgid "Unable to save the file"
+msgstr "Không thể lưu tệp"
+
+msgid "filename.user"
+msgstr "tentệp.user"
+
+msgid "Select or create a file to edit..."
+msgstr "Chọn hoặc tạo tệp để chỉnh sửa..."
+
+msgid "Please enter a file name"
+msgstr "Vui lòng nhập tên tệp"
+
+msgid "File created successfully"
+msgstr "Tệp đã tạo thành công"
+
+msgid "Unable to create file"
+msgstr "Không thể tạo tệp"
+
+msgid "Please select a file to delete"
+msgstr "Vui lòng chọn tệp để xóa"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "Bạn có chắc chắn muốn xóa tệp này không?"
+
+msgid "File deleted successfully"
+msgstr "Tệp đã xóa thành công"
+
+msgid "Select or create a file to edit..."
+msgstr "Chọn hoặc tạo tệp để chỉnh sửa..."
+
+msgid "Unable to delete file"
+msgstr "Không thể xóa tệp"
+
+msgid "Please select or create a file first"
+msgstr "Vui lòng chọn hoặc tạo tệp trước"
+
+msgid "File saved successfully"
+msgstr "Tệp đã lưu thành công"
+
+msgid "Unable to save file"
+msgstr "Không thể lưu tệp"
+
+msgid "Load .user file"
+msgstr "Tải tệp .user"
+
+msgid "Save .user file"
+msgstr "Lưu tệp .user"
+
+msgid "Please select a file to delete"
+msgstr "Vui lòng chọn tệp để xóa"
+
+msgid "Manage contacts"
+msgstr "Quản lý danh bạ"
+
+msgid "Edit User Contacts"
+msgstr "Chỉnh sửa danh bạ người dùng"
+
+msgid "Manage USSD codes"
+msgstr "Quản lý mã USSD"
+
+msgid "Manage User USSD Codes"
+msgstr "Quản lý mã USSD người dùng"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "Mỗi dòng phải có định dạng sau: 'Mô tả mã;mã'. Để thuận tiện cho người dùng, tệp được lưu vào vị trí /etc/modem/ussdcodes/."
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "Mỗi dòng phải có định dạng sau: 'Mô tả lệnh AT;lệnh AT'. Để thuận tiện cho người dùng, tệp được lưu vào vị trí /etc/modem/atcmmds/."
+
+msgid "Manage AT commands"
+msgstr "Quản lý lệnh AT"
+
+msgid "Manage User AT Commands"
+msgstr "Quản lý lệnh AT người dùng"
+
+msgid "-- Select file --"
+msgstr "-- Chọn tệp --"
+
+msgid "Select file"
+msgstr "Chọn tập tin"
+
+msgid "New file name"
+msgstr "Tên tệp mới"
+
+msgid "Delete selected file"
+msgstr "Xóa tệp đã chọn"
+
+msgid "Select file with AT commands to load"
+msgstr "Chọn tệp chứa lệnh AT để tải"
+
+msgid "Error loading AT commands file: "
+msgstr "Lỗi khi tải tệp lệnh AT: "
+
+msgid "No AT commands available"
+msgstr "Không có lệnh AT khả dụng"
+
+msgid "Error loading initial AT commands file:"
+msgstr "Lỗi khi tải tệp lệnh AT ban đầu:"
+
+msgid "Error loading USSD codes file: "
+msgstr "Lỗi khi tải tệp mã USSD: "
+
+msgid "Error loading initial USSD file:"
+msgstr "Lỗi khi tải tệp USSD ban đầu:"
+
+msgid "Select file with USSD codes to load"
+msgstr "Chọn tệp chứa mã USSD để tải"
+
+msgid "No USSD codes available"
+msgstr "Không có mã USSD khả dụng"
+
+msgid "Show notification icon"
+msgstr "Hiển thị biểu tượng thông báo"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "Hiển thị biểu tượng thông báo tin nhắn mới trên trang tổng quan trạng thái."
+
+msgid "Loading..."
+msgstr "Đang tải..."
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Modems"
+msgstr "Các modem"
+
+msgid "Signal Quality"
+msgstr "Chất lượng tín hiệu"
+
+msgid "Align preview to:"
+msgstr "Căn chỉnh bản xem trước theo:"
+
+msgid "Left"
+msgstr "Trái"
+
+msgid "Center"
+msgstr "Giữa"
+
+msgid "Right"
+msgstr "Phải"
+
+msgid "New message information block settings"
+msgstr "Cài đặt khối thông tin tin nhắn mới"
+
+msgid "Alignment settings saved successfully"
+msgstr "Lưu cài đặt căn chỉnh thành công"
+
+msgid "SMS Info"
+msgstr "Thông tin SMS"
+
+msgid "New SMS"
+msgstr "SMS mới"
+
+msgid "No new SMS"
+msgstr "Không có SMS mới"
+
+msgid "Deleting files"
+msgstr "Đang xóa tệp"
+
+msgid "Delete all files"
+msgstr "Xóa tất cả tệp"
+
+msgid "Load .gz archive"
+msgstr "Tải kho lưu trữ .gz"
+
+msgid "Save .gz archive"
+msgstr "Lưu kho lưu trữ .gz"
+
+msgid "File uploaded and saved to"
+msgstr "Tệp đã được tải lên và lưu vào"
+
+msgid "Failed to extract archive"
+msgstr "Không thể giải nén kho lưu trữ"
+
+msgid "Archive extracted to"
+msgstr "Kho lưu trữ đã được giải nén vào"
+
+msgid "Upload error"
+msgstr "Lỗi tải lên"
+
+msgid "Failed to create archive"
+msgstr "Không thể tạo kho lưu trữ"
+
+msgid "Failed to read archive"
+msgstr "Không thể đọc kho lưu trữ"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "Bạn có chắc chắn muốn xóa tất cả các tệp trong thư mục không?"
+
+msgid "All files deleted successfully"
+msgstr "Tất cả các tệp đã được xóa thành công"
+
+msgid "Call Log"
+msgstr "Nhật ký cuộc gọi"
+
+msgid "Clear all call log entries?"
+msgstr "Xóa tất cả các mục nhật ký cuộc gọi?"
+
+msgid "No call log entries found"
+msgstr "Không tìm thấy nhật ký cuộc gọi nào"
+
+msgid "No matching call log entries found"
+msgstr "Không tìm thấy nhật ký cuộc gọi phù hợp"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "Giao diện người dùng để xem nhật ký cuộc gọi. Nhật ký được thu thập bởi một dịch vụ chạy ngầm."
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "Dịch vụ nhật ký cuộc gọi đã bị tắt. Vui lòng bật nó trong cấu hình để bắt đầu thu thập nhật ký."
+
+msgid "Filter call type"
+msgstr "Lọc loại cuộc gọi"
+
+msgid "All calls"
+msgstr "Tất cả cuộc gọi"
+
+msgid "Missed calls"
+msgstr "Cuộc gọi nhỡ"
+
+msgid "Received calls"
+msgstr "Cuộc gọi đã nhận"
+
+msgid "Dialed calls"
+msgstr "Cuộc gọi đã gọi"
+
+msgid "Refresh"
+msgstr "Làm mới"
+
+msgid "Clear Log"
+msgstr "Xóa nhật ký"
+
+msgid "Date"
+msgstr "Ngày"
+
+msgid "Type"
+msgstr "Loại"
+
+msgid "Number"
+msgstr "Số điện thoại"
+
+msgid "Duration"
+msgstr "Thời lượng"
+
+msgid "Name"
+msgstr "Tên"
+
+msgid "Call log reading port"
+msgstr "Cổng đọc nhật ký cuộc gọi"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "Chọn một trong các cổng ttyUSBX có sẵn."
+
+msgid "Please select a port"
+msgstr "Vui lòng chọn một cổng"
+
+msgid "Enable call log daemon"
+msgstr "Bật dịch vụ nhật ký cuộc gọi"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "Quá trình chạy ngầm để ghi lại các cuộc gọi đến và cuộc gọi nhỡ."
+
+msgid "Forward SMS"
+msgstr "Chuyển tiếp SMS"
+
+msgid "Calls"
+msgstr "Cuộc gọi"
+
+msgid "Notification Settings"
+msgstr "Cài đặt thông báo"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "Đèn LED thông báo khi có tin nhắn mới. Trước khi kích hoạt chức năng này, vui lòng cấu hình và lưu cổng đọc SMS, thời gian kiểm tra hộp thư SMS và chọn đèn LED thông báo."
+
+msgid "Check inbox every minute(s)"
+msgstr "Kiểm tra hộp thư mỗi phút"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "Chỉ định số phút bạn muốn kiểm tra hộp thư đến."
+
+msgid "Notification LED"
+msgstr "Đèn LED thông báo"
+
+msgid "Select the notification LED."
+msgstr "Chọn đèn LED thông báo."
+
+msgid "Notify new messages"
+msgstr "Thông báo tin nhắn mới"
+
+msgid "Restart the inbox checking process every"
+msgstr "Khởi động lại quá trình kiểm tra mỗi"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "Quá trình sẽ khởi động lại sau khoảng thời gian đã chọn. Điều này sẽ loại bỏ sự chậm trễ trong việc kiểm tra hộp thư."
+
+msgid "4h"
+msgstr "4 giờ"
+
+msgid "6h"
+msgstr "6 giờ"
+
+msgid "8h"
+msgstr "8 giờ"
+
+msgid "12h"
+msgstr "12 giờ"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "Đèn LED này chỉ dành riêng cho các thông báo này"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "Chọn 'Không' trong trường hợp bộ định tuyến chỉ có một đèn LED hoặc nếu đèn LED là đa nhiệm.
Quan trọng Tùy chọn này yêu cầu đèn LED phải được định nghĩa trong hệ thống (nếu có thể) để hoạt động chính xác. Yêu cầu này áp dụng khi đèn hỗ trợ nhiều tác vụ."
+
+msgid "Call Log Settings"
+msgstr "Cài đặt nhật ký cuộc gọi"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "Tiến trình nền để ghi lại các cuộc gọi đến và cuộc gọi nhỡ.
Quan trọng Tùy chọn dành riêng cho modem Qualcomm không có bộ nhớ lịch sử cuộc gọi nội bộ và không hỗ trợ lệnh AT+CPBR tiêu chuẩn. Bật tùy chọn này sẽ thêm một tab mới. Nếu tab chuyên dụng không xuất hiện, hãy xóa bộ nhớ cache của trình duyệt và khởi động lại bộ định tuyến."
+
+msgid "Force EHLO"
+msgstr "Bắt buộc EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "Buộc mailsend luôn dùng EHLO thay vì tự động phát hiện HELO/EHLO. Chỉ bật khi việc chuyển tiếp thất bại, vì một số máy chủ (ví dụ: cổng doanh nghiệp, Microsoft 365 / Exchange Online Protection) không thông báo đúng về hỗ trợ ESMTP, khiến STARTTLS/xác thực không hoạt động."
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Mã hóa Unicode (mặc định 70 ký tự) hỗ trợ truyền các ký tự quốc gia và tin nhắn SMS nhiều phần"
+
+msgid "Not applicable"
+msgstr "Không áp dụng"
diff --git a/luci-app-sms-tool-js/po/zh_Hans/sms-tool-js.po b/luci-app-sms-tool-js/po/zh_Hans/sms-tool-js.po
index 517b1ebbd..bfedf9e9b 100644
--- a/luci-app-sms-tool-js/po/zh_Hans/sms-tool-js.po
+++ b/luci-app-sms-tool-js/po/zh_Hans/sms-tool-js.po
@@ -1,32 +1,34 @@
msgid ""
msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
"Language: zh_Hans\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
msgid "SMS Messages"
-msgstr "短信"
+msgstr "短信消息"
msgid "Received Messages"
-msgstr "收件箱"
+msgstr "已接收的消息"
msgid "Send Messages"
-msgstr "发短信"
+msgstr "发送消息"
msgid "USSD"
msgstr "USSD"
-msgid "From"
-msgstr "来自"
+msgid "Sender"
+msgstr "发送者"
msgid "Received"
-msgstr "收件时间"
+msgstr "已接收"
msgid "Message"
-msgstr "短信内容"
+msgstr "消息"
msgid "Configuration"
-msgstr "配置"
+msgstr "设置"
msgid "AT Commands"
msgstr "AT命令"
@@ -35,25 +37,25 @@ msgid "Configuration"
msgstr "配置"
msgid "Please enter phone number"
-msgstr "请输入号码"
+msgstr "请输入电话号码"
msgid "Please enter a message text"
-msgstr "请输入短信内容"
+msgstr "请输入消息内容"
msgid "Reply"
msgstr "回复"
msgid "Please enter a USSD code"
-msgstr "请输入USSD码"
+msgstr "请输入要发送的代码"
msgid "USSD Codes"
-msgstr "USSD码"
+msgstr "USSD代码"
msgid "Send to"
-msgstr "发送到"
+msgstr "发送至"
msgid "Message text"
-msgstr "短信内容"
+msgstr "消息内容"
msgid "Send"
msgstr "发送"
@@ -62,25 +64,25 @@ msgid "Send to number"
msgstr "发送至号码"
msgid "to number"
-msgstr "号码"
+msgstr "至号码"
msgid "to group"
-msgstr "群组"
+msgstr "至群组"
msgid "SMS sent sucessfully"
-msgstr "短信发送成功"
+msgstr "短信已发送"
msgid "Code to send"
-msgstr "发送的代码"
+msgstr "要发送的代码"
msgid "Send code"
msgstr "发送代码"
msgid "SMS Settings"
-msgstr "短信设置"
+msgstr "短信消息设置"
msgid "USSD Codes Settings"
-msgstr "USSD码设置"
+msgstr "USSD代码设置"
msgid "SMS reading port"
msgstr "短信读取端口"
@@ -89,49 +91,49 @@ msgid "SMS sending port"
msgstr "短信发送端口"
msgid "AT commands sending port"
-msgstr "发送AT命令端口"
+msgstr "AT命令发送端口"
msgid "AT Commands Settings"
msgstr "AT命令设置"
msgid "Merge split messages"
-msgstr "合并分割短信"
+msgstr "合并拆分的消息"
msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
-msgstr "选中此选项将使阅读短信更容易,但会导致显示和接收的短信数量出现差异。"
+msgstr "拆分的消息将被合并。选中此选项将使阅读短信更容易,但会导致显示和接收的消息数量不一致。"
msgid "USSD sending port"
-msgstr "USSD发送端口"
+msgstr "USSD代码发送端口"
msgid "Sending USSD code in plain text"
-msgstr "纯文本发送USSD码"
+msgstr "以纯文本形式发送USSD代码"
msgid "Receive message without PDU decoding"
-msgstr "接收短信无需PDU解码"
+msgstr "接收消息而不进行PDU解码"
msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
-msgstr "以纯文本形式发送USSD代码,未编码到PDU"
+msgstr "以纯文本形式发送USSD代码。命令不会被解码为PDU。"
msgid "Receive and display the message without decoding it as a PDU."
-msgstr "接收并显示短信而不将其解码为PDU"
+msgstr "接收到的消息将不进行PDU解码而显示。"
msgid "Explanation of number and prefix"
-msgstr "号码和前缀说明"
+msgstr "关于号码和前缀的说明"
msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
-msgstr "在发送短信的选项卡中,显示前缀说明和正确的电话号码。"
+msgstr "在允许发送短信的选项卡中显示关于前缀和正确电话号码的说明。"
msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
-msgstr "电话号码前面应带有国家/地区前缀(波兰为48,不带“+“)。如果号码为5,4或3个字符,则被视为“短”,并且前面不应带有国家/地区前缀。"
+msgstr "电话号码前应加上国家前缀(对于波兰是48,不带'+'号)。如果号码是5、4或3个字符,则视为"短号码",不应加国家前缀。"
msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
-msgstr "电话号码前面应带有国家/地区前缀(波兰为48,不带“+”)。如果号码为5,4或3个字符,则被视为“短”,并且前面不应带有国家/地区前缀。"
+msgstr "电话号码前应加上国家前缀(对于波兰是48,不带+号)。如果号码是5、4或3个字符,则视为短号码,不应加国家前缀。"
msgid "Add prefix to phone number"
-msgstr "为号码添加前缀"
+msgstr "为电话号码添加前缀"
msgid "Automatically add prefix to the phone number field."
-msgstr "自动将前缀添加到电话号码字段"
+msgstr "自动在电话号码字段中添加前缀。"
msgid "Prefix number"
msgstr "前缀号码"
@@ -143,16 +145,16 @@ msgid "Please specify the code to send"
msgstr "请指定要发送的代码"
msgid "Please set the port for communication with the modem"
-msgstr "请设置与调制解调器通信的端口"
+msgstr "请指定与调制解调器通信的端口"
msgid "User AT commands"
-msgstr "用户AT指令库"
+msgstr "用户AT命令"
msgid "Command to send"
-msgstr "发送的命令"
+msgstr "要发送的命令"
msgid "Clear form"
-msgstr "清除表格"
+msgstr "清除表单"
msgid "Send command"
msgstr "发送命令"
@@ -164,10 +166,10 @@ msgid "Reply"
msgstr "回复"
msgid "Message storage area"
-msgstr "短信存储区"
+msgstr "消息存储区域"
msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
-msgstr "短信存储在特定位置(例如, SIM卡或调制解调器内存上),但根据设备类型,其他区域也可能可用"
+msgstr "消息存储在特定位置(例如在SIM卡或调制解调器内存中),但根据设备类型,也可能有其他区域可用。"
msgid "SIM card"
msgstr "SIM卡"
@@ -175,125 +177,756 @@ msgstr "SIM卡"
msgid "Modem memory"
msgstr "调制解调器内存"
-msgid "Messages store in"
-msgstr "短信存储在"
-
-msgid "Messages (inbox / maximum)"
-msgstr "短信条数(收件箱/最多)"
+msgid "Storage used / Total capacity"
+msgstr "已使用的存储 / 总容量"
msgid "Delete selected"
msgstr "删除所选"
-msgid "Delete message(s)"
-msgstr "删除短信"
+msgid "Delete"
+msgstr "删除"
msgid "Delete all"
-msgstr "删除所有"
+msgstr "全部删除"
-msgid "Refresh messages"
-msgstr "刷新短信"
+msgid "Refresh"
+msgstr "刷新"
msgid "Please select the message(s) to be deleted"
-msgstr "请选择要删除的短信"
+msgstr "请选择要删除的消息"
msgid "Delete selected message(s)?"
-msgstr "删除选定的短信?"
+msgstr "删除所选消息?"
msgid "Delete all the messages?"
-msgstr "删除所有短信?"
+msgstr "删除所有消息?"
msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "使用短信工具读取短信的用户界面。有关短信工具的更多信息,请访问%sforum eko.one.pl%s。"
+msgstr "用于使用sms-tool读取短信消息的用户界面。有关sms-tool程序的更多信息,请访问%seko.one.pl论坛%s。"
msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "使用短信工具发送短信的用户界面。有关短信工具的更多信息,请访问%sforum eko.one.pl%s。"
+msgstr "用于使用sms-tool发送短信消息的用户界面。有关sms-tool程序的更多信息,请访问%seko.one.pl论坛%s。"
msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "使用短信工具发送AT命令的用户界面。有关短信工具的更多信息,请访问%sforum eko.one.pl%s。"
+msgstr "用于使用sms-tool发送AT命令的用户界面。有关sms-tool程序的更多信息,请访问%seko.one.pl论坛%s。"
msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
-msgstr "使用短信工具发送USSD码的用户界面。有关短信工具的更多信息,请访问%sforum eko.one.pl%s。"
+msgstr "用于使用sms-tool发送USSD代码的用户界面。有关sms-tool程序的更多信息,请访问%seko.one.pl论坛%s。"
msgid "Configuration sms-tool"
-msgstr "SMS工具配置"
+msgstr "配置sms-tool"
msgid "Configuration panel for sms-tool and gui application."
-msgstr "SMS工具和GUI的配置面板"
+msgstr "sms-tool程序和用户界面的设置面板。"
msgid "Port for communication with the modem"
msgstr "与调制解调器通信的端口"
msgid "Select one of the available ttyUSBX ports."
-msgstr "选择一个可用的ttyUSB端口与调制解调器通信"
+msgstr "选择一个可用的ttyUSBX端口。"
msgid "Please select a port"
msgstr "请选择端口"
msgid "User contacts"
-msgstr "用户联系人库"
+msgstr "用户联系人"
msgid "Enable group messaging"
-msgstr "启用群组短信"
+msgstr "启用群组消息"
msgid "This option allows you to send one message to all contacts in the user's contact list."
-msgstr "此选项允许您向用户联系人列表中的所有联系人发送一条短信"
+msgstr "此选项允许向用户联系人列表中的所有联系人发送一条消息。"
msgid "Message sending delay"
-msgstr "延迟发送短信"
+msgstr "消息发送延迟"
msgid "[Bot] Message sent to number:"
-msgstr "[Bot] 短信已发送至号码:"
+msgstr "[机器人] 消息已发送至号码:"
msgid "User USSD codes"
-msgstr "用户USSD代码库"
+msgstr "用户USSD代码"
msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
-msgstr "每行必须采用以下格式: “联系人姓名;电话号码”。为了方便用户,文件保存到以下位置 /etc/modem/phonebook.user"
+msgstr "每行必须具有以下格式:'联系人姓名;电话号码'。为方便用户,联系人保存在文件/etc/modem/phonebook.user中。"
msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
-msgstr "每行必须具有以下格式:“At 命令描述;AT 命令”。为了方便用户,文件保存到以下位置 /etc/modem/atcmmds.user"
+msgstr "每行必须具有以下格式:'AT命令描述;AT命令'。为方便用户,命令保存在文件/etc/modem/atcmmds.user中。"
msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
-msgstr "每行必须采用以下格式:“代码描述;代码”。为了方便用户,文件保存到以下位置 /etc/modem/ussdcodes.user."
+msgstr "每行必须具有以下格式:'代码描述;代码'。为方便用户,代码保存在文件/etc/modem/ussdcodes.user中。"
-msgid "Press [Enter] to send the command, press [Delete] to delete the command"
-msgstr "按[Enter]发送命令, 按[Delete]删除命令"
+msgid "Display new messages notification on login page"
+msgstr "在登录页面上显示新消息通知"
-msgid "Press [Enter] to send the code, press [Delete] to delete the code"
-msgstr "按[Enter]发送代码, 按[Delete]删除代码"
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "当新消息到达所选消息区域时显示通知。"
-msgid "Press [Delete] to delete the phone number"
-msgstr "按[Delete]删除电话号码"
+msgid "new message"
+msgstr "新消息"
-msgid "Press [Delete] to delete the content of the message"
-msgstr "按[Delete]删除短信内容"
+msgid "new messages"
+msgstr "新消息"
+
+msgid "All"
+msgstr "全部"
+
+msgid "Show"
+msgstr "显示"
+
+msgid "Read"
+msgstr "已读"
+
+msgid "Unread"
+msgstr "未读"
+
+msgid "All / Read / Unread"
+msgstr "全部 / 已读 / 未读"
+
+msgid "Show all, read or unread messages"
+msgstr "显示所有、已读或未读消息"
+
+msgid "Show system messages in the message list"
+msgstr "在消息列表中显示系统消息"
+
+msgid "Mark as read"
+msgstr "标记为已读"
+
+msgid "Mark as unread"
+msgstr "标记为未读"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "请选择要标记为已读的消息"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "请选择要标记为未读的消息"
+
+msgid "Mark selected message(s) as read?"
+msgstr "将所选消息标记为已读?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "将所选消息标记为未读?"
+
+msgid "Message marked as read"
+msgstr "消息已标记为已读"
+
+msgid "Messages marked as read"
+msgstr "消息已标记为已读"
+
+msgid "Message marked as unread"
+msgstr "消息已标记为未读"
+
+msgid "Messages marked as unread"
+msgstr "消息已标记为未读"
+
+msgid "System messages"
+msgstr "系统消息"
+
+msgid "Diode"
+msgstr "二极管"
+
+msgid "New messages notification LED"
+msgstr "新消息通知LED"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "在新消息时启用短信通知LED"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "当新消息到达所选消息区域时启用通知LED。"
+
+msgid "Selected LED"
+msgstr "所选LED"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "选择用于新消息通知的LED二极管。从系统中可用的LED中进行选择。"
+
+msgid "Automatically select LED"
+msgstr "自动选择LED"
+
+msgid "Automatically select the first available LED."
+msgstr "自动选择第一个可用的LED。"
+
+msgid "Advanced settings"
+msgstr "高级设置"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "LED闪烁间隔(秒)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "设置LED闪烁间隔(秒)。"
+
+msgid "Flashing duration (in seconds)"
+msgstr "闪烁持续时间(秒)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "设置闪烁持续时间(秒)。设置为0表示无限持续时间(LED将闪烁直到消息被标记为已读)。"
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "请稍候...正在将短信消息保存到文本文件。"
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "此选项允许备份短信消息或例如保存sms-tool不支持的消息。"
+
+msgid "Delete all messages"
+msgstr "删除所有消息"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "此选项允许在"已接收的消息"选项卡中不可见时删除所有短信消息。"
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "将短信消息保存到文件失败。请重试。"
+
+msgid "PDU decoding scheme"
+msgstr "PDU解码方案"
+
+msgid "Autodetect"
+msgstr "自动检测"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "发送新USSD代码时保留之前的回复。"
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "如果您需要使用基于USSD代码构建的菜单,请选中此选项"
+
+msgid "Turn over the replies."
+msgstr "翻转回复。"
+
+msgid "View new reply from top"
+msgstr "从上往下显示新回复"
+
+msgid "Please wait... deleted"
+msgstr "请稍候...已删除"
+
+msgid "of"
+msgstr "在"
+
+msgid "selected messages"
+msgstr "所选消息中"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"该软件包需要用户配置。
需要"
+"设置:
1. 所有与调制解调器通信的端口。
2. 针对给定调制解调器的附加"
+"选项(用于处理USSD代码)。
3. 通知LED(可选)。
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "读取短信的区域发生任何更改都需要刷新消息"
+
+msgid "Characters remaining:"
+msgstr "剩余字符:"
+
+msgid "Encoding standard"
+msgstr "编码标准"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7(160个字符)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode(70个字符)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7编码(160个字符)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode编码(70个字符),不支持发送国家字符(utf8格式)– 仅限ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "此选项卡允许用户支持该软件包"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "关于luci-app-sms-tool-js软件包的信息"
+
+msgid "Report a bug"
+msgstr "报告错误"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "在eko.one.pl论坛的软件包主题中发帖"
+
+msgid "Write on forum"
+msgstr "在论坛上发帖"
+
+msgid "Report a bug on the package Github page"
+msgstr "在软件包的Github页面上报告错误"
+
+msgid "Open a package discussion on Github"
+msgstr "在Github上打开软件包讨论"
+
+msgid "Open discussion"
+msgstr "打开讨论"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "如果您想支持项目和作者的发展,请请喝杯咖啡"
+
+msgid "Buy a coffee"
+msgstr "请喝咖啡"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "如果您想支持项目和作者的发展,请成为赞助商"
+
+msgid "Become a sponsor"
+msgstr "成为赞助商"
+
+msgid "Package Info"
+msgstr "软件包信息"
+
+msgid "Author (package maintainer)"
+msgstr "作者(软件包维护者)"
+
+msgid "Package update and support"
+msgstr "软件包更新和支持"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "短信转发到电子邮件设置"
+
+msgid "An e-mail will be sent.."
+msgstr "将发送电子邮件.."
+
+msgid "Enable message forwarding"
+msgstr "启用消息转发"
+
+msgid "E-mail settings"
+msgstr "电子邮件设置"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "选择预定义的电子邮件设置或手动输入设置。"
+
+msgid "Recipient"
+msgstr "收件人"
+
+msgid "E-mail address of the recipient."
+msgstr "收件人的电子邮件地址。"
+
+msgid "Sender"
+msgstr "发件人"
+
+msgid "E-mail address of the sender."
+msgstr "发件人的电子邮件地址。"
+
+msgid "User"
+msgstr "用户"
+
+msgid "Username for SMTP authentication."
+msgstr "SMTP身份验证的用户名。"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google应用密码 / SMTP身份验证密码。"
+
+msgid "SMTP server"
+msgstr "SMTP服务器"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "SMTP服务器的主机名/IP地址。"
+
+msgid "SMTP server port"
+msgstr "SMTP服务器端口"
+
+msgid "Security"
+msgstr "安全性"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS:如果服务器支持,使用STARTTLS。"
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL:通过SSL的SMTP。"
+
+msgid "Required Package"
+msgstr "必需的软件包"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "短信转发选项需要安装mailsend软件包。"
+
+msgid "Check required packages"
+msgstr "检查所需软件包"
+
+msgid "Check"
+msgstr "检查"
+
+msgid "Mailsend Package"
+msgstr "mailsend软件包"
+
+msgid "Loading package data…"
+msgstr "正在加载软件包数据…"
+
+msgid "Installed"
+msgstr "已安装"
+
+msgid "Install…"
+msgstr "安装…"
+
+msgid "Mailsend Package"
+msgstr "mailsend软件包"
+
+msgid "Please select exactly one message to forward"
+msgstr "请准确选择一条消息进行转发"
+
+msgid "Forward selected message to e-mail?"
+msgstr "将所选消息转发到电子邮件?"
+
+msgid "Sending e-mail..."
+msgstr "正在发送电子邮件..."
+
+msgid "Message forwarded successfully"
+msgstr "消息已成功转发"
+
+msgid "Failed to forward message: %s"
+msgstr "转发消息失败:%s"
+
+msgid "Error: %s"
+msgstr "错误:%s"
+
+msgid "user define"
+msgstr "用户设置"
+
+msgid "Forward"
+msgstr "转发"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "选择您想要转发的消息"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "短信转发功能未启用。请先进行配置"
+
+msgid "My Router"
+msgstr "我的路由器"
+
+msgid "Forward SMS to E-mail"
+msgstr "将短信消息转发到电子邮件"
+
+msgid "Subject:"
+msgstr "主题:"
+
+msgid "Message text:"
+msgstr "消息内容:"
+
+msgid "Send"
+msgstr "发送"
+
+msgid "Subject and body cannot be empty"
+msgstr "主题和内容不能为空"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "mailsend软件包未安装。请先使用下面的"安装..."按钮进行安装"
+
+msgid "Select modem"
+msgstr "选择调制解调器"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "更改调制解调器需要刷新消息"
+
+msgid "Defined AT command files"
+msgstr "已定义的AT命令文件"
+
+msgid "Defined USSD code files"
+msgstr "已定义的 USSD 代码文件"
+
+msgid "File uploaded and saved to"
+msgstr "文件已上传并保存到"
+
+msgid "Unable to upload file"
+msgstr "无法上传文件"
+
+msgid "Phonebook saved successfully"
+msgstr "电话簿保存成功"
+
+msgid "Unable to save the file"
+msgstr "无法保存文件"
+
+msgid "filename.user"
+msgstr "文件名.user"
+
+msgid "Select or create a file to edit..."
+msgstr "选择或创建要编辑的文件..."
+
+msgid "Please enter a file name"
+msgstr "请输入文件名"
+
+msgid "File created successfully"
+msgstr "文件创建成功"
+
+msgid "Unable to create file"
+msgstr "无法创建文件"
+
+msgid "Please select a file to delete"
+msgstr "请选择要删除的文件"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "您确定要删除此文件吗?"
+
+msgid "File deleted successfully"
+msgstr "文件删除成功"
+
+msgid "Select or create a file to edit..."
+msgstr "选择或创建要编辑的文件..."
+
+msgid "Unable to delete file"
+msgstr "无法删除文件"
+
+msgid "Please select or create a file first"
+msgstr "请先选择或创建文件"
+
+msgid "File saved successfully"
+msgstr "文件保存成功"
+
+msgid "Unable to save file"
+msgstr "无法保存文件"
+
+msgid "Load .user file"
+msgstr "加载.user文件"
+
+msgid "Save .user file"
+msgstr "保存.user文件"
+
+msgid "Please select a file to delete"
+msgstr "请选择要删除的文件"
+
+msgid "Manage contacts"
+msgstr "管理联系人"
+
+msgid "Edit User Contacts"
+msgstr "编辑用户联系人"
+
+msgid "Manage USSD codes"
+msgstr "管理USSD代码"
+
+msgid "Manage User USSD Codes"
+msgstr "管理用户USSD代码"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "每行必须采用以下格式:'代码描述;代码'。为方便用户,文件保存在/etc/modem/ussdcodes/位置。"
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "每行必须采用以下格式:'AT命令描述;AT命令'。为方便用户,文件保存在/etc/modem/atcmmds/位置。"
+
+msgid "Manage AT commands"
+msgstr "管理AT命令"
+
+msgid "Manage User AT Commands"
+msgstr "管理用户AT命令"
+
+msgid "-- Select file --"
+msgstr "-- 选择文件 --"
+
+msgid "Select file"
+msgstr "选择文件"
+
+msgid "New file name"
+msgstr "新文件名"
+
+msgid "Delete selected file"
+msgstr "删除所选文件"
+
+msgid "Select file with AT commands to load"
+msgstr "选择要加载的AT命令文件"
+
+msgid "Error loading AT commands file: "
+msgstr "加载AT命令文件时出错:"
+
+msgid "No AT commands available"
+msgstr "没有可用的AT命令"
+
+msgid "Error loading initial AT commands file:"
+msgstr "加载初始AT命令文件时出错:"
+
+msgid "Error loading USSD codes file: "
+msgstr "加载USSD代码文件时出错:"
+
+msgid "Error loading initial USSD file:"
+msgstr "加载初始USSD文件时出错:"
+
+msgid "Select file with USSD codes to load"
+msgstr "选择要加载的USSD代码文件"
+
+msgid "No USSD codes available"
+msgstr "没有可用的USSD代码"
+
+msgid "Show notification icon"
+msgstr "显示通知图标"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "在状态概览页面上显示新消息通知图标。"
+
+msgid "Loading..."
+msgstr "正在加载…"
+
+msgid "Modem"
+msgstr "调制解调器"
+
+msgid "Modems"
+msgstr "调制解调器"
+
+msgid "Signal Quality"
+msgstr "信号质量"
+
+msgid "Align preview to:"
+msgstr "将预览对齐到:"
+
+msgid "Left"
+msgstr "左"
+
+msgid "Center"
+msgstr "居中"
+
+msgid "Right"
+msgstr "右"
+
+msgid "New message information block settings"
+msgstr "新消息信息块设置"
+
+msgid "Alignment settings saved successfully"
+msgstr "对齐设置已成功保存"
+
+msgid "SMS Info"
+msgstr "短信信息"
+
+msgid "New SMS"
+msgstr "新短信"
+
+msgid "No new SMS"
+msgstr "没有新短信"
+
+msgid "Deleting files"
+msgstr "正在删除文件"
+
+msgid "Delete all files"
+msgstr "删除所有文件"
+
+msgid "Load .gz archive"
+msgstr "加载 .gz 存档"
+
+msgid "Save .gz archive"
+msgstr "保存 .gz 存档"
+
+msgid "File uploaded and saved to"
+msgstr "文件已上传并保存到"
+
+msgid "Failed to extract archive"
+msgstr "解压存档失败"
+
+msgid "Archive extracted to"
+msgstr "存档已解压到"
+
+msgid "Upload error"
+msgstr "上传错误"
+
+msgid "Failed to create archive"
+msgstr "创建存档失败"
+
+msgid "Failed to read archive"
+msgstr "读取存档失败"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "确定要删除文件夹中的所有文件吗?"
+
+msgid "All files deleted successfully"
+msgstr "所有文件已成功删除"
+
+msgid "Call Log"
+msgstr "通话记录"
+
+msgid "Clear all call log entries?"
+msgstr "清除所有通话记录?"
+
+msgid "No call log entries found"
+msgstr "未找到通话记录"
+
+msgid "No matching call log entries found"
+msgstr "未找到匹配的通话记录"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "用于查看通话记录的用户界面。记录由后台守护进程收集。"
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "通话记录守护进程已禁用。请在配置中启用它以开始收集记录。"
+
+msgid "Filter call type"
+msgstr "过滤通话类型"
+
+msgid "All calls"
+msgstr "所有通话"
+
+msgid "Missed calls"
+msgstr "未接来电"
+
+msgid "Received calls"
+msgstr "已接来电"
+
+msgid "Dialed calls"
+msgstr "已拨电话"
+
+msgid "Refresh"
+msgstr "刷新"
+
+msgid "Clear Log"
+msgstr "清除记录"
+
+msgid "Date"
+msgstr "日期"
+
+msgid "Type"
+msgstr "类型"
+
+msgid "Number"
+msgstr "号码"
+
+msgid "Duration"
+msgstr "通话时长"
+
+msgid "Name"
+msgstr "姓名"
+
+msgid "Call log reading port"
+msgstr "通话记录读取端口"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "请选择一个可用的 ttyUSBX 端口。"
+
+msgid "Please select a port"
+msgstr "请选择端口"
+
+msgid "Enable call log daemon"
+msgstr "启用通话记录守护进程"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "用于记录来电和未接来电的后台进程。"
+
+msgid "Forward SMS"
+msgstr "转发短信"
+
+msgid "Calls"
+msgstr "通话"
msgid "Notification Settings"
msgstr "通知设置"
msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
-msgstr "LED通知有新消息。在激活此功能之前,请配置并保存短信读取端口、查看短信收件箱的时间以及选择通知LED。"
+msgstr "LED 指示灯用于通知新消息。在启用此功能之前,请配置并保存短信读取端口、短信收件箱检查时间并选择通知 LED。"
msgid "Check inbox every minute(s)"
-msgstr "每隔多少分钟检查收件箱"
+msgstr "每分钟检查一次收件箱"
msgid "Specify how many minutes you want your inbox to be checked."
-msgstr "这将将按照选定的时间间隔检查收件箱有无新短信。"
+msgstr "指定检查收件箱的时间间隔(分钟)。"
msgid "Notification LED"
-msgstr "通知LED"
+msgstr "通知 LED"
msgid "Select the notification LED."
-msgstr "选择通知LED。"
+msgstr "选择通知 LED。"
msgid "Notify new messages"
msgstr "新消息通知"
msgid "Restart the inbox checking process every"
-msgstr "每隔多少小时重启收件箱进程"
+msgstr "重新启动收件箱检查进程,每隔"
msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
-msgstr "这将将按照选定的时间间隔重新启动,这将消除检查收件箱的延迟。"
+msgstr "该进程将按选定的时间间隔重新启动。这将消除检查收件箱时的延迟。"
msgid "4h"
msgstr "4小时"
@@ -308,85 +941,25 @@ msgid "12h"
msgstr "12小时"
msgid "The diode is dedicated only to these notifications"
-msgstr "LED仅用于短信通知"
+msgstr "该指示灯仅用于此类通知"
-msgid ""
-"Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This "
-"option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
-msgstr ""
-"如果路由器只有一个 LED 或 LED 处于多任务状态,请选择“否”。
这很重要 "
-"选项需要在系统中定义 LED(如果可以)才能正常工作。当二极管支持多个任务时,此要求适用。"
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "如果路由器只有一个 LED 或 LED 是多功能的,请选择“否”。
Important Messages "
-"are sent without verification and confirmation delivery of the message. Therefore, there is a risk of non-delivery of the message."
-msgstr ""
-"[3 - 59] 秒
重要 短信 "
-"在没有验证或确认短信传递的情况下发送,因此存在短信无法送达的风险。"
+msgid "Call Log Settings"
+msgstr "通话记录设置"
-msgid "No"
-msgstr "No"
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "用于记录来电和未接来电的后台进程。
重要 此选项专为没有内部通话记录内存且不支持标准AT+CPBR命令的高通调制解调器而设计。启用此选项将添加新标签页。如果专用标签页未出现,请清除浏览器缓存并重启路由器。"
-msgid "Yes"
-msgstr "Yes"
+msgid "Force EHLO"
+msgstr "强制使用 EHLO"
-msgid "Merge algorithm"
-msgstr "合并算法"
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "强制 mailsend 始终使用 EHLO,而不是自动检测 HELO/EHLO。 仅当转发失败时才启用此选项,因为某些服务器(如企业网关、Microsoft 365 / Exchange Online Protection)未正确声明对 ESMTP 的支持,从而导致 STARTTLS/身份验证无法正常工作。"
-msgid "Simple (merge without sorting)"
-msgstr "简单 (合并而不排序)"
-
-msgid "Advanced (merges with sorting)"
-msgstr "高级 (排序合并)"
-
-msgid "Phone number to be blurred"
-msgstr "电话号码模糊处理"
-
-msgid "The last 5 digits of this number will be blurred."
-msgstr "该号码的最后5位数字将模糊处理"
-
-msgid "Expect a decimal value between five and fifty-nine"
-msgstr "预计小数值介于 5 到 59 之间"
-
-msgid "Expect a decimal value between three and fifty-nine"
-msgstr "预计小数值介于 3 到 59 之间"
-
-msgid "Expect a decimal value"
-msgstr "期望一个十进制值"
-
-msgid "Direction of message merging"
-msgstr "短信合并方向"
-
-msgid "From beginning to end"
-msgstr "从开始到结束"
-
-msgid "From end to beginning"
-msgstr "从结束到开始"
-
-msgid "Save messages to a text file"
-msgstr "将短信保存到文本文件"
-
-msgid "Save sms to txt file?"
-msgstr "短信保存到文本文件?"
-
-msgid "Save as .txt file"
-msgstr "保存为 .txt 文件"
-
-msgid "Saving..."
-msgstr "保存中..."
-
-msgid "Please wait.. Process of saving SMS message to a text file is in progress."
-msgstr "请稍候.. 正在将短信保存到文本文件"
-
-msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
-msgstr "此选项允许备份SMS短信。列如,保存SMS工具不支持的短信"
-
-msgid "Delete all messages"
-msgstr "删除所有短信"
-
-msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
-msgstr "此选项允许您删除“已接收短信”选项卡中不可见的所有短信"
-
-msgid "Saving SMS messages to a file failed. Please try again."
-msgstr "SMS短信保存到文件失败,请再试一次"
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicode 编码(默认70个字符)支持传输民族字符和多部分短信"
+msgid "Not applicable"
+msgstr "不适用"
diff --git a/luci-app-sms-tool-js/po/zh_Hant/sms-tool-js.po b/luci-app-sms-tool-js/po/zh_Hant/sms-tool-js.po
new file mode 100644
index 000000000..d3471ebf7
--- /dev/null
+++ b/luci-app-sms-tool-js/po/zh_Hant/sms-tool-js.po
@@ -0,0 +1,967 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: zh_Hant\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "SMS Messages"
+msgstr "簡訊訊息"
+
+msgid "Received Messages"
+msgstr "已接收的訊息"
+
+msgid "Send Messages"
+msgstr "傳送訊息"
+
+msgid "USSD"
+msgstr "USSD"
+
+msgid "Sender"
+msgstr "寄件人"
+
+msgid "Received"
+msgstr "已接收"
+
+msgid "Message"
+msgstr "訊息"
+
+msgid "Configuration"
+msgstr "設定"
+
+msgid "AT Commands"
+msgstr "AT指令"
+
+msgid "Configuration"
+msgstr "組態"
+
+msgid "Please enter phone number"
+msgstr "請輸入電話號碼"
+
+msgid "Please enter a message text"
+msgstr "請輸入訊息內容"
+
+msgid "Reply"
+msgstr "回覆"
+
+msgid "Please enter a USSD code"
+msgstr "請輸入要傳送的代碼"
+
+msgid "USSD Codes"
+msgstr "USSD代碼"
+
+msgid "Send to"
+msgstr "傳送至"
+
+msgid "Message text"
+msgstr "訊息內容"
+
+msgid "Send"
+msgstr "傳送"
+
+msgid "Send to number"
+msgstr "傳送至號碼"
+
+msgid "to number"
+msgstr "至號碼"
+
+msgid "to group"
+msgstr "至群組"
+
+msgid "SMS sent sucessfully"
+msgstr "簡訊已傳送"
+
+msgid "Code to send"
+msgstr "要傳送的代碼"
+
+msgid "Send code"
+msgstr "傳送代碼"
+
+msgid "SMS Settings"
+msgstr "簡訊訊息設定"
+
+msgid "USSD Codes Settings"
+msgstr "USSD代碼設定"
+
+msgid "SMS reading port"
+msgstr "簡訊讀取埠"
+
+msgid "SMS sending port"
+msgstr "簡訊傳送埠"
+
+msgid "AT commands sending port"
+msgstr "AT指令傳送埠"
+
+msgid "AT Commands Settings"
+msgstr "AT指令設定"
+
+msgid "Merge split messages"
+msgstr "合併拆分的訊息"
+
+msgid "Checking this option will make it easier to read the messages, but it will cause a discrepancy in the number of messages shown and received."
+msgstr "拆分的訊息將被合併。選取此選項將使閱讀簡訊更容易,但會導致顯示和接收的訊息數量不一致。"
+
+msgid "USSD sending port"
+msgstr "USSD代碼傳送埠"
+
+msgid "Sending USSD code in plain text"
+msgstr "以純文字形式傳送USSD代碼"
+
+msgid "Receive message without PDU decoding"
+msgstr "接收訊息而不進行PDU解碼"
+
+msgid "Send the USSD code in plain text. Command is not being coded to the PDU."
+msgstr "以純文字形式傳送USSD代碼。指令不會被解碼為PDU。"
+
+msgid "Receive and display the message without decoding it as a PDU."
+msgstr "接收到的訊息將不進行PDU解碼而顯示。"
+
+msgid "Explanation of number and prefix"
+msgstr "關於號碼和字首的說明"
+
+msgid "In the tab for sending SMSes, show an explanation of the prefix and the correct phone number."
+msgstr "在允許傳送簡訊的選項卡中顯示關於字首和正確電話號碼的說明。"
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without '+'). If the number is 5, 4 or 3 characters, it is treated as 'short' and should not be preceded by a country prefix."
+msgstr "電話號碼前應加上國家字首(對於波蘭是48,不帶'+'號)。如果號碼是5、4或3個字元,則視為「短號碼」,不應加國家字首。"
+
+msgid "The phone number should be preceded by the country prefix (for Poland it is 48, without +). If the number is 5, 4 or 3 characters, it is treated as.. short and should not be preceded by a country prefix."
+msgstr "電話號碼前應加上國家字首(對於波蘭是48,不帶+號)。如果號碼是5、4或3個字元,則視為短號碼,不應加國家字首。"
+
+msgid "Add prefix to phone number"
+msgstr "為電話號碼新增字首"
+
+msgid "Automatically add prefix to the phone number field."
+msgstr "自動在電話號碼欄位中新增字首。"
+
+msgid "Prefix number"
+msgstr "字首號碼"
+
+msgid "Please specify the command to send"
+msgstr "請指定要傳送的指令"
+
+msgid "Please specify the code to send"
+msgstr "請指定要傳送的代碼"
+
+msgid "Please set the port for communication with the modem"
+msgstr "請指定與數據機通訊的埠"
+
+msgid "User AT commands"
+msgstr "使用者AT指令"
+
+msgid "Command to send"
+msgstr "要傳送的指令"
+
+msgid "Clear form"
+msgstr "清除表單"
+
+msgid "Send command"
+msgstr "傳送指令"
+
+msgid "Send code"
+msgstr "傳送代碼"
+
+msgid "Reply"
+msgstr "回覆"
+
+msgid "Message storage area"
+msgstr "訊息儲存區域"
+
+msgid "Messages are stored in a specific location (for example, on the SIM card or modem memory), but other areas may also be available depending on the type of device."
+msgstr "訊息儲存在特定位置(例如在SIM卡或數據機記憶體中),但根據裝置類型,也可能有其他區域可用。"
+
+msgid "SIM card"
+msgstr "SIM卡"
+
+msgid "Modem memory"
+msgstr "數據機記憶體"
+
+msgid "Storage used / Total capacity"
+msgstr "已使用的儲存 / 總容量"
+
+msgid "Delete selected"
+msgstr "刪除所選"
+
+msgid "Delete"
+msgstr "刪除"
+
+msgid "Delete all"
+msgstr "全部刪除"
+
+msgid "Refresh"
+msgstr "重新整理"
+
+msgid "Please select the message(s) to be deleted"
+msgstr "請選擇要刪除的訊息"
+
+msgid "Delete selected message(s)?"
+msgstr "刪除所選訊息?"
+
+msgid "Delete all the messages?"
+msgstr "刪除所有訊息?"
+
+msgid "User interface for reading messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "用於使用sms-tool讀取簡訊訊息的使用者介面。有關sms-tool程式的更多資訊,請訪問%seko.one.pl論壇%s。"
+
+msgid "User interface for sending messages using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "用於使用sms-tool傳送簡訊訊息的使用者介面。有關sms-tool程式的更多資訊,請訪問%seko.one.pl論壇%s。"
+
+msgid "User interface for sending AT commands using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "用於使用sms-tool傳送AT指令的使用者介面。有關sms-tool程式的更多資訊,請訪問%seko.one.pl論壇%s。"
+
+msgid "User interface for sending USSD codes using sms-tool. More information about the sms-tool on the %seko.one.pl forum%s."
+msgstr "用於使用sms-tool傳送USSD代碼的使用者介面。有關sms-tool程式的更多資訊,請訪問%seko.one.pl論壇%s。"
+
+msgid "Configuration sms-tool"
+msgstr "組態sms-tool"
+
+msgid "Configuration panel for sms-tool and gui application."
+msgstr "sms-tool程式和使用者介面的設定面板。"
+
+msgid "Port for communication with the modem"
+msgstr "與數據機通訊的埠"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "選擇一個可用的ttyUSBX埠。"
+
+msgid "Please select a port"
+msgstr "請選擇埠"
+
+msgid "User contacts"
+msgstr "使用者聯絡人"
+
+msgid "Enable group messaging"
+msgstr "啟用群組訊息"
+
+msgid "This option allows you to send one message to all contacts in the user's contact list."
+msgstr "此選項允許向使用者聯絡人清單中的所有聯絡人傳送一條訊息。"
+
+msgid "Message sending delay"
+msgstr "訊息傳送延遲"
+
+msgid "[Bot] Message sent to number:"
+msgstr "[機器人] 訊息已傳送至號碼:"
+
+msgid "User USSD codes"
+msgstr "使用者USSD代碼"
+
+msgid "Each line must have the following format: 'Contact name;phone number'. For user convenience, the file is saved to the location /etc/modem/phonebook.user."
+msgstr "每行必須具有以下格式:'聯絡人姓名;電話號碼'。為方便使用者,聯絡人儲存在檔案/etc/modem/phonebook.user中。"
+
+msgid "Each line must have the following format: 'At command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds.user."
+msgstr "每行必須具有以下格式:'AT指令描述;AT指令'。為方便使用者,指令儲存在檔案/etc/modem/atcmmds.user中。"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes.user."
+msgstr "每行必須具有以下格式:'代碼描述;代碼'。為方便使用者,代碼儲存在檔案/etc/modem/ussdcodes.user中。"
+
+msgid "Display new messages notification on login page"
+msgstr "在登入頁面上顯示新訊息通知"
+
+msgid "Display notification when new messages arrive in the selected message area."
+msgstr "當新訊息到達所選訊息區域時顯示通知。"
+
+msgid "new message"
+msgstr "新訊息"
+
+msgid "new messages"
+msgstr "新訊息"
+
+msgid "All"
+msgstr "全部"
+
+msgid "Show"
+msgstr "顯示"
+
+msgid "Read"
+msgstr "已讀"
+
+msgid "Unread"
+msgstr "未讀"
+
+msgid "All / Read / Unread"
+msgstr "全部 / 已讀 / 未讀"
+
+msgid "Show all, read or unread messages"
+msgstr "顯示所有、已讀或未讀訊息"
+
+msgid "Show system messages in the message list"
+msgstr "在訊息清單中顯示系統訊息"
+
+msgid "Mark as read"
+msgstr "標記為已讀"
+
+msgid "Mark as unread"
+msgstr "標記為未讀"
+
+msgid "Please select the message(s) to be marked as read"
+msgstr "請選擇要標記為已讀的訊息"
+
+msgid "Please select the message(s) to be marked as unread"
+msgstr "請選擇要標記為未讀的訊息"
+
+msgid "Mark selected message(s) as read?"
+msgstr "將所選訊息標記為已讀?"
+
+msgid "Mark selected message(s) as unread?"
+msgstr "將所選訊息標記為未讀?"
+
+msgid "Message marked as read"
+msgstr "訊息已標記為已讀"
+
+msgid "Messages marked as read"
+msgstr "訊息已標記為已讀"
+
+msgid "Message marked as unread"
+msgstr "訊息已標記為未讀"
+
+msgid "Messages marked as unread"
+msgstr "訊息已標記為未讀"
+
+msgid "System messages"
+msgstr "系統訊息"
+
+msgid "Diode"
+msgstr "二極體"
+
+msgid "New messages notification LED"
+msgstr "新訊息通知LED"
+
+msgid "Enable SMS notification LED on new message"
+msgstr "在新訊息時啟用簡訊通知LED"
+
+msgid "Enable notification LED when new messages arrive in the selected message area."
+msgstr "當新訊息到達所選訊息區域時啟用通知LED。"
+
+msgid "Selected LED"
+msgstr "所選LED"
+
+msgid "Select an LED diode for new message notification. The selection is made from the available LEDs in the system."
+msgstr "選擇用於新訊息通知的LED二極體。從系統中可用的LED中進行選擇。"
+
+msgid "Automatically select LED"
+msgstr "自動選擇LED"
+
+msgid "Automatically select the first available LED."
+msgstr "自動選擇第一個可用的LED。"
+
+msgid "Advanced settings"
+msgstr "進階設定"
+
+msgid "LED Flashing interval (in seconds)"
+msgstr "LED閃爍間隔(秒)"
+
+msgid "Set the LED flashing interval (in seconds)."
+msgstr "設定LED閃爍間隔(秒)。"
+
+msgid "Flashing duration (in seconds)"
+msgstr "閃爍持續時間(秒)"
+
+msgid "Set the flashing duration (in seconds). Set to 0 for infinite duration (LED will flash until messages are marked as read)."
+msgstr "設定閃爍持續時間(秒)。設定為0表示無限持續時間(LED將閃爍直到訊息被標記為已讀)。"
+
+msgid "Please wait... Saving SMS messages to a text file."
+msgstr "請稍候...正在將簡訊訊息儲存到文字檔案。"
+
+msgid "This option allows to backup SMS messages or, for example, save messages that are not supported by the sms-tool."
+msgstr "此選項允許備份簡訊訊息或例如儲存sms-tool不支援的訊息。"
+
+msgid "Delete all messages"
+msgstr "刪除所有訊息"
+
+msgid "This option allows you to delete all SMS messages when they are not visible in the 'Received Messages' tab."
+msgstr "此選項允許在「已接收的訊息」選項卡中不可見時刪除所有簡訊訊息。"
+
+msgid "Saving SMS messages to a file failed. Please try again."
+msgstr "將簡訊訊息儲存到檔案失敗。請重試。"
+
+msgid "PDU decoding scheme"
+msgstr "PDU解碼方案"
+
+msgid "Autodetect"
+msgstr "自動偵測"
+
+msgid "Keep the previous reply when sending a new USSD code."
+msgstr "傳送新USSD代碼時保留之前的回覆。"
+
+msgid "Check this option if you need to use the menu built on USSD codes"
+msgstr "如果您需要使用基於USSD代碼建構的選單,請選取此選項"
+
+msgid "Turn over the replies."
+msgstr "翻轉回覆。"
+
+msgid "View new reply from top"
+msgstr "從上往下顯示新回覆"
+
+msgid "Please wait... deleted"
+msgstr "請稍候...已刪除"
+
+msgid "of"
+msgstr "在"
+
+msgid "selected messages"
+msgstr "所選訊息中"
+
+msgid ""
+"The package requires user configuration.
The following "
+"need to be set:
1. All ports for communication with the modem.
2. Additional "
+"options specific to the given modem (for handling USSD codes).
3. Notification LED (optional).
"
+
+msgstr ""
+"該軟體套件需要使用者組態。
需要"
+"設定:
1. 所有與數據機通訊的埠。
2. 針對給定數據機的附加"
+"選項(用於處理USSD代碼)。
3. 通知LED(選用)。
"
+
+msgid "Any change in the area from which SMS messages will be read requires refreshing the messages"
+msgstr "讀取簡訊的區域發生任何變更都需要重新整理訊息"
+
+msgid "Characters remaining:"
+msgstr "剩餘字元:"
+
+msgid "Encoding standard"
+msgstr "編碼標準"
+
+msgid "GSM-7 (160 characters)"
+msgstr "GSM-7(160個字元)"
+
+msgid "Unicode (70 characters)"
+msgstr "Unicode(70個字元)"
+
+msgid "GSM-7 encoding (160 characters)"
+msgstr "GSM-7編碼(160個字元)"
+
+msgid "Unicode encoding (70 characters), does not support sending national characters (in utf8) - only ascii"
+msgstr "Unicode編碼(70個字元),不支援傳送國家字元(utf8格式)– 僅限ASCII"
+
+msgid "The tab allows users to support the package."
+msgstr "此選項卡允許使用者支援該軟體套件"
+
+msgid "Luci-app-sms-tool-js Info"
+msgstr "關於luci-app-sms-tool-js軟體套件的資訊"
+
+msgid "Report a bug"
+msgstr "報告錯誤"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "在eko.one.pl論壇的軟體套件主題中發帖"
+
+msgid "Write on forum"
+msgstr "在論壇上發帖"
+
+msgid "Report a bug on the package Github page"
+msgstr "在軟體套件的Github頁面上報告錯誤"
+
+msgid "Open a package discussion on Github"
+msgstr "在Github上開啟軟體套件討論"
+
+msgid "Open discussion"
+msgstr "開啟討論"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "如果您想支援專案和作者的發展,請請喝杯咖啡"
+
+msgid "Buy a coffee"
+msgstr "請喝咖啡"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "如果您想支援專案和作者的發展,請成為贊助商"
+
+msgid "Become a sponsor"
+msgstr "成為贊助商"
+
+msgid "Package Info"
+msgstr "軟體套件資訊"
+
+msgid "Author (package maintainer)"
+msgstr "作者(軟體套件維護者)"
+
+msgid "Package update and support"
+msgstr "軟體套件更新和支援"
+
+msgid "SMS Forwarding to E-mail Settings"
+msgstr "簡訊轉發到電子郵件設定"
+
+msgid "An e-mail will be sent.."
+msgstr "將傳送電子郵件.."
+
+msgid "Enable message forwarding"
+msgstr "啟用訊息轉發"
+
+msgid "E-mail settings"
+msgstr "電子郵件設定"
+
+msgid "Select a predefined e-mail settings or enter settings manually."
+msgstr "選擇預定義的電子郵件設定或手動輸入設定。"
+
+msgid "Recipient"
+msgstr "收件人"
+
+msgid "E-mail address of the recipient."
+msgstr "收件人的電子郵件地址。"
+
+msgid "Sender"
+msgstr "寄件人"
+
+msgid "E-mail address of the sender."
+msgstr "寄件人的電子郵件地址。"
+
+msgid "User"
+msgstr "使用者"
+
+msgid "Username for SMTP authentication."
+msgstr "SMTP身分驗證的使用者名稱。"
+
+msgid "Password"
+msgstr "密碼"
+
+msgid "Google app password / Password for SMTP authentication."
+msgstr "Google應用程式密碼 / SMTP身分驗證密碼。"
+
+msgid "SMTP server"
+msgstr "SMTP伺服器"
+
+msgid "Hostname/IP address of the SMTP server."
+msgstr "SMTP伺服器的主機名稱/IP位址。"
+
+msgid "SMTP server port"
+msgstr "SMTP伺服器埠"
+
+msgid "Security"
+msgstr "安全性"
+
+msgid "TLS: use STARTTLS if the server supports it."
+msgstr "TLS:如果伺服器支援,使用STARTTLS。"
+
+msgid "SSL: SMTP over SSL."
+msgstr "SSL:透過SSL的SMTP。"
+
+msgid "Required Package"
+msgstr "必需的軟體套件"
+
+msgid "The SMS forwarding option requires the mailsend package to be installed."
+msgstr "簡訊轉發選項需要安裝mailsend軟體套件。"
+
+msgid "Check required packages"
+msgstr "檢查所需軟體套件"
+
+msgid "Check"
+msgstr "檢查"
+
+msgid "Mailsend Package"
+msgstr "mailsend軟體套件"
+
+msgid "Loading package data…"
+msgstr "正在載入軟體套件資料…"
+
+msgid "Installed"
+msgstr "已安裝"
+
+msgid "Install…"
+msgstr "安裝…"
+
+msgid "Mailsend Package"
+msgstr "mailsend軟體套件"
+
+msgid "Please select exactly one message to forward"
+msgstr "請準確選擇一條訊息進行轉發"
+
+msgid "Forward selected message to e-mail?"
+msgstr "將所選訊息轉發到電子郵件?"
+
+msgid "Sending e-mail..."
+msgstr "正在傳送電子郵件..."
+
+msgid "Message forwarded successfully"
+msgstr "訊息已成功轉發"
+
+msgid "Failed to forward message: %s"
+msgstr "轉發訊息失敗:%s"
+
+msgid "Error: %s"
+msgstr "錯誤:%s"
+
+msgid "user define"
+msgstr "使用者設定"
+
+msgid "Forward"
+msgstr "轉發"
+
+msgid "Please select the message(s) to be forwarded"
+msgstr "選擇您想要轉發的訊息"
+
+msgid "SMS forwarding function is not enabled. Please configure it first"
+msgstr "簡訊轉發功能未啟用。請先進行設定"
+
+msgid "My Router"
+msgstr "我的路由器"
+
+msgid "Forward SMS to E-mail"
+msgstr "將簡訊訊息轉發到電子郵件"
+
+msgid "Subject:"
+msgstr "主題:"
+
+msgid "Message text:"
+msgstr "訊息內容:"
+
+msgid "Send"
+msgstr "傳送"
+
+msgid "Subject and body cannot be empty"
+msgstr "主題和內容不能為空"
+
+msgid "Package mailsend is not installed. Please install it first using the Install... button below"
+msgstr "mailsend軟體套件未安裝。請先使用下面的「安裝...」按鈕進行安裝"
+
+msgid "Select modem"
+msgstr "選擇數據機"
+
+msgid "Changing a modem requires refreshing the messages"
+msgstr "變更數據機需要重新整理訊息"
+
+msgid "Defined AT command files"
+msgstr "已定義的AT命令檔案"
+
+msgid "Defined USSD code files"
+msgstr "已定義的 USSD 代碼檔案"
+
+msgid "File uploaded and saved to"
+msgstr "檔案已上傳並儲存至"
+
+msgid "Unable to upload file"
+msgstr "無法上傳檔案"
+
+msgid "Phonebook saved successfully"
+msgstr "電話簿儲存成功"
+
+msgid "Unable to save the file"
+msgstr "無法儲存檔案"
+
+msgid "filename.user"
+msgstr "檔案名稱.user"
+
+msgid "Select or create a file to edit..."
+msgstr "選擇或建立要編輯的檔案..."
+
+msgid "Please enter a file name"
+msgstr "請輸入檔案名稱"
+
+msgid "File created successfully"
+msgstr "檔案建立成功"
+
+msgid "Unable to create file"
+msgstr "無法建立檔案"
+
+msgid "Please select a file to delete"
+msgstr "請選擇要刪除的檔案"
+
+msgid "Are you sure you want to delete this file?"
+msgstr "您確定要刪除此檔案嗎?"
+
+msgid "File deleted successfully"
+msgstr "檔案刪除成功"
+
+msgid "Select or create a file to edit..."
+msgstr "選擇或建立要編輯的檔案..."
+
+msgid "Unable to delete file"
+msgstr "無法刪除檔案"
+
+msgid "Please select or create a file first"
+msgstr "請先選擇或建立檔案"
+
+msgid "File saved successfully"
+msgstr "檔案儲存成功"
+
+msgid "Unable to save file"
+msgstr "無法儲存檔案"
+
+msgid "Load .user file"
+msgstr "載入.user檔案"
+
+msgid "Save .user file"
+msgstr "儲存.user檔案"
+
+msgid "Please select a file to delete"
+msgstr "請選擇要刪除的檔案"
+
+msgid "Manage contacts"
+msgstr "管理聯絡人"
+
+msgid "Edit User Contacts"
+msgstr "編輯使用者聯絡人"
+
+msgid "Manage USSD codes"
+msgstr "管理USSD代碼"
+
+msgid "Manage User USSD Codes"
+msgstr "管理使用者USSD代碼"
+
+msgid "Each line must have the following format: 'Code description;code'. For user convenience, the file is saved to the location /etc/modem/ussdcodes/."
+msgstr "每行必須採用以下格式:'代碼描述;代碼'。為方便使用者,檔案儲存在/etc/modem/ussdcodes/位置。"
+
+msgid "Each line must have the following format: 'AT command description;AT command'. For user convenience, the file is saved to the location /etc/modem/atcmmds/."
+msgstr "每行必須採用以下格式:'AT命令描述;AT命令'。為方便使用者,檔案儲存在/etc/modem/atcmmds/位置。"
+
+msgid "Manage AT commands"
+msgstr "管理AT命令"
+
+msgid "Manage User AT Commands"
+msgstr "管理使用者AT命令"
+
+msgid "-- Select file --"
+msgstr "-- 選擇檔案 --"
+
+msgid "Select file"
+msgstr "選擇檔案"
+
+msgid "New file name"
+msgstr "新檔案名稱"
+
+msgid "Delete selected file"
+msgstr "刪除所選檔案"
+
+msgid "Select file with AT commands to load"
+msgstr "選擇要載入的AT命令檔案"
+
+msgid "Error loading AT commands file: "
+msgstr "載入AT命令檔案時發生錯誤:"
+
+msgid "No AT commands available"
+msgstr "沒有可用的AT命令"
+
+msgid "Error loading initial AT commands file:"
+msgstr "載入初始AT命令檔案時發生錯誤:"
+
+msgid "Error loading USSD codes file: "
+msgstr "載入USSD代碼檔案時發生錯誤:"
+
+msgid "Error loading initial USSD file:"
+msgstr "載入初始USSD檔案時發生錯誤:"
+
+msgid "Select file with USSD codes to load"
+msgstr "選擇要載入的USSD代碼檔案"
+
+msgid "No USSD codes available"
+msgstr "沒有可用的USSD代碼"
+
+msgid "Show notification icon"
+msgstr "顯示通知圖示"
+
+msgid "Show the new message notification icon on the status overview page."
+msgstr "在狀態總覽頁面上顯示新訊息通知圖示。"
+
+msgid "Loading..."
+msgstr "載入中…"
+
+msgid "Modem"
+msgstr "數據機"
+
+msgid "Modems"
+msgstr "數據機"
+
+msgid "Signal Quality"
+msgstr "訊號品質"
+
+msgid "Align preview to:"
+msgstr "將預覽對齊至:"
+
+msgid "Left"
+msgstr "左"
+
+msgid "Center"
+msgstr "置中"
+
+msgid "Right"
+msgstr "右"
+
+msgid "New message information block settings"
+msgstr "新訊息資訊區塊設定"
+
+msgid "Alignment settings saved successfully"
+msgstr "對齊設定已成功儲存"
+
+msgid "SMS Info"
+msgstr "簡訊資訊"
+
+msgid "New SMS"
+msgstr "新簡訊"
+
+msgid "No new SMS"
+msgstr "沒有新簡訊"
+
+msgid "Deleting files"
+msgstr "正在刪除檔案"
+
+msgid "Delete all files"
+msgstr "刪除所有檔案"
+
+msgid "Load .gz archive"
+msgstr "載入 .gz 封存檔"
+
+msgid "Save .gz archive"
+msgstr "儲存 .gz 封存檔"
+
+msgid "File uploaded and saved to"
+msgstr "檔案已上傳並儲存至"
+
+msgid "Failed to extract archive"
+msgstr "無法解壓封存檔"
+
+msgid "Archive extracted to"
+msgstr "封存檔已解壓至"
+
+msgid "Upload error"
+msgstr "上傳錯誤"
+
+msgid "Failed to create archive"
+msgstr "無法建立封存檔"
+
+msgid "Failed to read archive"
+msgstr "無法讀取封存檔"
+
+msgid "Are you sure you want to delete all files in the folder?"
+msgstr "確定要刪除資料夾中的所有檔案嗎?"
+
+msgid "All files deleted successfully"
+msgstr "所有檔案已成功刪除"
+
+msgid "Call Log"
+msgstr "通話紀錄"
+
+msgid "Clear all call log entries?"
+msgstr "清除所有通話紀錄?"
+
+msgid "No call log entries found"
+msgstr "未找到通話紀錄"
+
+msgid "No matching call log entries found"
+msgstr "未找到符合的通話紀錄"
+
+msgid "User interface for viewing call logs. The log is collected by a background daemon."
+msgstr "用於查看通話紀錄的使用者介面。紀錄由背景守護行程收集。"
+
+msgid "Call log daemon is disabled. Please enable it in the configuration to start collecting logs."
+msgstr "通話紀錄守護行程已停用。請在設定中將其啟用以開始收集紀錄。"
+
+msgid "Filter call type"
+msgstr "過濾通話類型"
+
+msgid "All calls"
+msgstr "所有通話"
+
+msgid "Missed calls"
+msgstr "未接來電"
+
+msgid "Received calls"
+msgstr "已接來電"
+
+msgid "Dialed calls"
+msgstr "已撥電話"
+
+msgid "Refresh"
+msgstr "重新整理"
+
+msgid "Clear Log"
+msgstr "清除紀錄"
+
+msgid "Date"
+msgstr "日期"
+
+msgid "Type"
+msgstr "類型"
+
+msgid "Number"
+msgstr "號碼"
+
+msgid "Duration"
+msgstr "通話時長"
+
+msgid "Name"
+msgstr "姓名"
+
+msgid "Call log reading port"
+msgstr "通話紀錄讀取連接埠"
+
+msgid "Select one of the available ttyUSBX ports."
+msgstr "請選擇一個可用的 ttyUSBX 連接埠。"
+
+msgid "Please select a port"
+msgstr "請選擇連接埠"
+
+msgid "Enable call log daemon"
+msgstr "啟用通話紀錄守護行程"
+
+msgid "Background process to log incoming and missed calls."
+msgstr "用於記錄來電與未接來電的背景程序。"
+
+msgid "Forward SMS"
+msgstr "轉寄簡訊"
+
+msgid "Calls"
+msgstr "通話"
+
+msgid "Notification Settings"
+msgstr "通知設定"
+
+msgid "The LED informs about a new message. Before activating this function, please config and save the SMS reading port, time to check SMS inbox and select the notification LED."
+msgstr "LED 指示燈用於通知新訊息。在啟用此功能之前,請設定並儲存簡訊讀取連接埠、簡訊收件匣檢查時間並選擇通知 LED。"
+
+msgid "Check inbox every minute(s)"
+msgstr "每分鐘檢查一次收件匣"
+
+msgid "Specify how many minutes you want your inbox to be checked."
+msgstr "指定檢查收件匣的時間間隔(分鐘)。"
+
+msgid "Notification LED"
+msgstr "通知 LED"
+
+msgid "Select the notification LED."
+msgstr "選擇通知 LED。"
+
+msgid "Notify new messages"
+msgstr "新訊息通知"
+
+msgid "Restart the inbox checking process every"
+msgstr "重新啟動收件匣檢查程序,每隔"
+
+msgid "The process will restart at the selected time interval. This will eliminate the delay in checking your inbox."
+msgstr "該程序將按選定的時間間隔重新啟動。這將消除檢查收件匣時的延遲。"
+
+msgid "4h"
+msgstr "4小時"
+
+msgid "6h"
+msgstr "6小時"
+
+msgid "8h"
+msgstr "8小時"
+
+msgid "12h"
+msgstr "12小時"
+
+msgid "The diode is dedicated only to these notifications"
+msgstr "該指示燈僅用於此類通知"
+
+msgid "Select 'No' in case the router has only one LED or if the LED is multi-tasking.
Important This option requires LED to be defined in the system (if possible) to work properly. This requirement applies when the diode supports multiple tasks."
+msgstr "如果路由器只有一個 LED 或 LED 是多功能的,請選擇「否」。
重要提示 此選項要求在系統中定義 LED(如果可能)才能正常運作。當指示燈支援多個任務時,此要求適用。"
+
+msgid "Call Log Settings"
+msgstr "通話紀錄設定"
+
+msgid "Background process to log incoming and missed calls.
Important Option dedicated to Qualcomm modems that do not have internal call history memory and do not support the standard AT+CPBR command. Enabling this option adds a new tab. If dedicated tab does not appear, clear your browser cache and restart the router."
+msgstr "用於記錄來電和未接來電的背景程序。
重要 此選項專為沒有內部通話記錄記憶體且不支援標準AT+CPBR指令的高通數據機所設計。啟用此選項將新增一個新分頁。如果專用分頁未出現,請清除瀏覽器快取並重新啟動路由器。"
+
+msgid "Force EHLO"
+msgstr "強制使用 EHLO"
+
+msgid "Forces mailsend to always use EHLO instead of auto-detecting HELO/EHLO. Enable only if forwarding fails, since some servers (e.g. corporate gateways, Microsoft 365 / Exchange Online Protection) don't properly advertise ESMTP support, which breaks STARTTLS/authentication."
+msgstr "強制 mailsend 一律使用 EHLO,而不是自動偵測 HELO/EHLO。 僅在轉發失敗時才啟用此選項,因為某些伺服器(例如企業閘道、Microsoft 365 / Exchange Online Protection)未正確宣告支援 ESMTP,導致 STARTTLS/驗證無法正常運作。"
+
+msgid "Unicode encoding (70 characters by default) supports the transmission of national characters and multipart sms messages"
+msgstr "Unicode 編碼(預設70個字元)支援傳輸國家字元及多部分簡訊"
+
+msgid "Not applicable"
+msgstr "不適用"
+
+
diff --git a/luci-app-sms-tool-js/root/etc/config/sms_tool_js b/luci-app-sms-tool-js/root/etc/config/sms_tool_js
index 758baa3f0..fd6a05fa4 100644
--- a/luci-app-sms-tool-js/root/etc/config/sms_tool_js
+++ b/luci-app-sms-tool-js/root/etc/config/sms_tool_js
@@ -13,3 +13,5 @@ config sms_tool_js
option information '1'
option ussdport ''
option atport ''
+ option callport ''
+ option calllog_enabled '0'
diff --git a/luci-app-sms-tool-js/root/etc/init.d/my_new_sms b/luci-app-sms-tool-js/root/etc/init.d/my_new_sms
index b129fe1bb..b710f751f 100755
--- a/luci-app-sms-tool-js/root/etc/init.d/my_new_sms
+++ b/luci-app-sms-tool-js/root/etc/init.d/my_new_sms
@@ -1,5 +1,5 @@
#!/bin/sh /etc/rc.common
-# Copyright 2023 Rafał Wabik (IceG) - From eko.one.pl forum
+# Copyright 2023-2026 Rafał Wabik (IceG) - From eko.one.pl forum
# Licensed to the GNU General Public License v3.0.
@@ -23,7 +23,7 @@ service_triggers()
stop_service() {
for KILLPID in `ps | grep 'my_new_sms' | awk ' { print $1;}'`; do
- (kill -9 $KILLPID >/dev/null 2>&1 )&
+ kill -9 $KILLPID >/dev/null 2>&1 &
done
sleep 1
return 0
diff --git a/luci-app-sms-tool-js/root/etc/init.d/sms_tool_calllogd b/luci-app-sms-tool-js/root/etc/init.d/sms_tool_calllogd
new file mode 100755
index 000000000..47c1a608f
--- /dev/null
+++ b/luci-app-sms-tool-js/root/etc/init.d/sms_tool_calllogd
@@ -0,0 +1,31 @@
+#!/bin/sh /etc/rc.common
+#
+# Copyright 2026 Rafał Wabik (IceG) - From eko.one.pl forum
+# Licensed to the GNU General Public License v3.0.
+#
+
+START=99
+USE_PROCD=1
+
+PROG=/usr/bin/sms_tool_calllogd
+
+start_service() {
+ local enabled=$(uci -q get sms_tool_js.@sms_tool_js[0].calllog_enabled || echo "0")
+ [ "$enabled" = "1" ] || return
+
+ procd_open_instance
+ procd_set_param command "$PROG"
+ procd_set_param respawn
+ procd_set_param stdout 1
+ procd_set_param stderr 1
+ procd_close_instance
+}
+
+reload_service() {
+ stop
+ start
+}
+
+service_triggers() {
+ procd_add_reload_trigger "sms_tool_js"
+}
diff --git a/luci-app-sms-tool-js/root/etc/uci-defaults/off_sms.sh b/luci-app-sms-tool-js/root/etc/uci-defaults/off_sms.sh
index d8342b801..da9e7bc5e 100644
--- a/luci-app-sms-tool-js/root/etc/uci-defaults/off_sms.sh
+++ b/luci-app-sms-tool-js/root/etc/uci-defaults/off_sms.sh
@@ -1,9 +1,15 @@
#!/bin/sh
-# Copyright 2023 Rafał Wabik (IceG) - From eko.one.pl forum
+#
+# Copyright 2023-2026 Rafał Wabik (IceG) - From eko.one.pl forum
# Licensed to the GNU General Public License v3.0.
+#
-/etc/init.d/my_new_sms stop 2>&1 &
-/etc/init.d/my_new_sms disable 2>&1 &
-/etc/init.d/my_new_sms disable 2>&1 &
+/etc/init.d/my_new_sms stop >/dev/null 2>&1 &
+/etc/init.d/my_new_sms disable >/dev/null 2>&1 &
+/etc/init.d/my_new_sms disable >/dev/null 2>&1 &
+sleep 4
+/etc/init.d/sms_tool_calllogd stop >/dev/null 2>&1 &
+/etc/init.d/sms_tool_calllogd disable >/dev/null 2>&1 &
+/etc/init.d/sms_tool_calllogd disable >/dev/null 2>&1 &
exit 0
diff --git a/luci-app-sms-tool-js/root/etc/uci-defaults/setup_sms_tool_js.sh b/luci-app-sms-tool-js/root/etc/uci-defaults/setup_sms_tool_js.sh
index f7380ff56..742ec05a9 100644
--- a/luci-app-sms-tool-js/root/etc/uci-defaults/setup_sms_tool_js.sh
+++ b/luci-app-sms-tool-js/root/etc/uci-defaults/setup_sms_tool_js.sh
@@ -1,14 +1,30 @@
#!/bin/sh
-# Copyright 2023 Rafał Wabik (IceG) - From eko.one.pl forum
+#
+# Copyright 2023-2026 Rafał Wabik (IceG) - From eko.one.pl forum
# Licensed to the GNU General Public License v3.0.
+#
-chmod +x /sbin/sms_led.sh 2>&1 &
-chmod +x /sbin/smstool_led.sh 2>&1 &
-chmod +x /sbin/new_cron_sync.sh 2>&1 &
-chmod +x /etc/uci-defaults/off_sms.sh 2>&1 &
-chmod +x /etc/uci-defaults/setup_sms_tool_js.sh 2>&1 &
-chmod +x /etc/init.d/my_new_sms 2>&1 &
+chmod +x /sbin/sms_led.sh >/dev/null 2>&1 &
+chmod +x /sbin/smstool_led.sh >/dev/null 2>&1 &
+chmod +x /etc/uci-defaults/off_sms.sh >/dev/null 2>&1 &
+chmod +x /etc/uci-defaults/setup_sms_tool_js.sh >/dev/null 2>&1 &
+chmod +x /etc/init.d/my_new_sms >/dev/null 2>&1 &
+chmod +x /etc/init.d/sms_tool_calllogd >/dev/null 2>&1 &
+chmod +x /usr/bin/sms_tool_calllogd >/dev/null 2>&1 &
-rm -rf /tmp/luci-indexcache 2>&1 &
-rm -rf /tmp/luci-modulecache/ 2>&1 &
+mkdir -p /etc/modem/atcmmds >/dev/null 2>&1 &
+mkdir -p /etc/modem/ussdcodes >/dev/null 2>&1 &
+
+chmod +x /usr/libexec/rpcd/sms_forward >/dev/null 2>&1 &
+
+if ! uci -q get sms_tool_js.@sms_tool_js[0] >/dev/null 2>&1; then
+ uci set sms_tool_js.config=sms_tool_js
+fi
+
+uci -q get sms_tool_js.@sms_tool_js[0].callport >/dev/null || uci set sms_tool_js.@sms_tool_js[0].callport=''
+uci -q get sms_tool_js.@sms_tool_js[0].calllog_enabled >/dev/null || uci set sms_tool_js.@sms_tool_js[0].calllog_enabled='0'
+uci commit sms_tool_js >/dev/null 2>&1
+
+rm -rf /tmp/luci-indexcache >/dev/null 2>&1 &
+rm -rf /tmp/luci-modulecache/ >/dev/null 2>&1 &
exit 0
diff --git a/luci-app-sms-tool-js/root/sbin/new_cron_sync.sh b/luci-app-sms-tool-js/root/sbin/new_cron_sync.sh
deleted file mode 100755
index e47719728..000000000
--- a/luci-app-sms-tool-js/root/sbin/new_cron_sync.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-# Copyright 2023-2025 Rafał Wabik (IceG) - From eko.one.pl forum
-# Licensed to the GNU General Public License v3.0.
-
-sleep 2
-
-[ -e /etc/crontabs/root ] || touch /etc/crontabs/root
-
-SLED=$(uci -q get sms_tool_js.@sms_tool_js[0].lednotify)
-if [ "x$SLED" != "x1" ]; then
- if grep -q "my_new_sms" /etc/crontabs/root; then
- grep -v "/etc/init.d/my_new_sms" /etc/crontabs/root > /tmp/new_cron
- mv /tmp/new_cron /etc/crontabs/root
- /etc/init.d/cron restart
- fi
- exit 0
-fi
-
-if ! grep -q "my_new_sms" /etc/crontabs/root; then
-PTR=$(uci -q get sms_tool_js.@sms_tool_js[0].prestart)
- echo "1 */$PTR * * * /etc/init.d/my_new_sms enable && /etc/init.d/my_new_sms restart" >> /etc/crontabs/root
- /etc/init.d/cron restart
-fi
-
-exit 0
diff --git a/luci-app-sms-tool-js/root/sbin/sms_led.sh b/luci-app-sms-tool-js/root/sbin/sms_led.sh
index 9dbda3d58..2acb17055 100755
--- a/luci-app-sms-tool-js/root/sbin/sms_led.sh
+++ b/luci-app-sms-tool-js/root/sbin/sms_led.sh
@@ -1,6 +1,8 @@
#!/bin/sh
-# Copyright 2023-2025 Rafał Wabik (IceG) - From eko.one.pl forum
+#
+# Copyright 2023-2026 Rafał Wabik (IceG) - From eko.one.pl forum
# Licensed to the GNU General Public License v3.0.
+#
sleep 2
CT=$(uci -q get sms_tool_js.@sms_tool_js[0].checktime)
@@ -11,7 +13,7 @@ while [ 1 ]; do
LED=$(uci -q get sms_tool_js.@sms_tool_js[0].lednotify)
if [ $LED == "1" ]; then
sleep $TM
- (/sbin/smstool_led.sh >/dev/null 2>&1 )&
+ /sbin/smstool_led.sh >/dev/null 2>&1 &
continue
fi
sleep 1
diff --git a/luci-app-sms-tool-js/root/sbin/smstool_led.sh b/luci-app-sms-tool-js/root/sbin/smstool_led.sh
index ca493a36c..682d212ed 100755
--- a/luci-app-sms-tool-js/root/sbin/smstool_led.sh
+++ b/luci-app-sms-tool-js/root/sbin/smstool_led.sh
@@ -1,34 +1,186 @@
#!/bin/sh
-# Copyright 2023-2025 Rafał Wabik (IceG) - From eko.one.pl forum
+#
+# Copyright 2023-2026 Rafał Wabik (IceG) - From eko.one.pl forum
+#
# Licensed to the GNU General Public License v3.0.
+#
- DEV=$(uci -q get sms_tool_js.@sms_tool_js[0].readport)
- LEDX=$(uci -q get sms_tool_js.@sms_tool_js[0].smsled)
- MEM=$(uci -q get sms_tool_js.@sms_tool_js[0].storage)
- STX=$(sms_tool -s $MEM -d $DEV status | cut -c23-27)
- SMS=$(echo $STX | tr -dc '0-9')
- SMSC=$(uci -q get sms_tool_js.@sms_tool_js[0].sms_count)
- SMSD=$(echo $SMSC | tr -dc '0-9')
- LEDT="/sys/class/leds/$LEDX/trigger"
- LEDON="/sys/class/leds/$LEDX/delay_on"
- LEDOFF="/sys/class/leds/$LEDX/delay_off"
+DEBUG_FILE="/tmp/my_newsms_log"
- TMON=$((1 * 1000))
- TMOFF=$((5 * 1000))
+debug_log() {
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$DEBUG_FILE"
+}
-if [ $SMS == $SMSD ]; then
+echo "=== START DEBUG $(date '+%Y-%m-%d %H:%M:%S') ===" > "$DEBUG_FILE"
- exit 0
+LEDX=$(uci -q get sms_tool_js.@sms_tool_js[0].smsled)
+debug_log "LEDX: $LEDX"
+
+LEDT="/sys/class/leds/$LEDX/trigger"
+LEDON="/sys/class/leds/$LEDX/delay_on"
+LEDOFF="/sys/class/leds/$LEDX/delay_off"
+
+TMON=$((1 * 1000))
+TMOFF=$((5 * 1000))
+
+debug_log "LED paths: LEDT=$LEDT, LEDON=$LEDON, LEDOFF=$LEDOFF"
+debug_log "Timings: TMON=$TMON, TMOFF=$TMOFF"
+
+is_new_format() {
+ local sms_count="$1"
+ debug_log "Checking format for: '$sms_count'"
+
+ echo "$sms_count" | grep -q "dfm[0-9]\+_[0-9]\+"
+ local result=$?
+
+ debug_log "Format check result: $result (0=new format, 1=old format)"
+ return $result
+}
+
+handle_old_format() {
+ debug_log "=== OLD FORMAT ==="
+
+ DEV=$(uci -q get sms_tool_js.@sms_tool_js[0].readport)
+ debug_log "DEV (readport): $DEV"
+
+ MEM=$(uci -q get sms_tool_js.@sms_tool_js[0].storage)
+ debug_log "MEM (storage): $MEM"
+
+ STX=$(sms_tool -s $MEM -d $DEV status | cut -c23-27)
+ debug_log "STX (raw cut): '$STX'"
+
+ SMS=$(echo $STX | tr -dc '0-9')
+ debug_log "SMS (current count): $SMS"
+
+ SMSC=$(uci -q get sms_tool_js.@sms_tool_js[0].sms_count)
+ debug_log "SMSC (saved raw): '$SMSC'"
+
+ SMSD=$(echo $SMSC | tr -dc '0-9')
+ debug_log "SMSD (saved count): $SMSD"
+
+ if [ "$SMS" = "$SMSD" ]; then
+ debug_log "No new SMS (SMS=$SMS equals SMSD=$SMSD)"
+ return 0
+ fi
+
+ if [ $SMS -gt $SMSD ]; then
+ debug_log "NEW SMS DETECTED! (SMS=$SMS > SMSD=$SMSD)"
+ debug_log "Activating LED..."
+ echo timer > $LEDT
+ echo $TMOFF > $LEDOFF
+ echo $TMON > $LEDON
+ debug_log "LED activated successfully"
+ return 1
+ fi
+
+ debug_log "SMS count decreased or invalid (SMS=$SMS, SMSD=$SMSD)"
+ return 0
+}
+
+handle_new_format() {
+ debug_log "=== NEW FORMAT ==="
+ local has_new_sms=0
+ local modem_count=0
+
+ if [ ! -f /etc/config/defmodems ]; then
+ debug_log "ERROR: /etc/config/defmodems does not exist!"
+ return 0
+ fi
+
+ debug_log "File /etc/config/defmodems exists"
+
+ SMSC=$(uci -q get sms_tool_js.@sms_tool_js[0].sms_count)
+ debug_log "Full sms_count from config: '$SMSC'"
+
+ debug_log "Scanning for serial modems..."
+
+ while uci -q get defmodems.@defmodems[$modem_count] > /dev/null 2>&1; do
+ modem_num=$((modem_count + 1))
+
+ MODEMDATA=$(uci -q get defmodems.@defmodems[$modem_count].modemdata)
+ debug_log "Modem #$modem_num: modemdata='$MODEMDATA'"
+
+ if [ "$MODEMDATA" != "serial" ]; then
+ debug_log "Modem #$modem_num: skipping (not serial)"
+ modem_count=$((modem_count + 1))
+ continue
+ fi
+
+ DEV=$(uci -q get defmodems.@defmodems[$modem_count].comm_port)
+
+ if [ -z "$DEV" ]; then
+ debug_log "Modem #$modem_num: ERROR - no comm_port defined"
+ modem_count=$((modem_count + 1))
+ continue
+ fi
+
+ debug_log "Modem #$modem_num: comm_port='$DEV'"
+
+ MEM=$(uci -q get sms_tool_js.@sms_tool_js[0].storage)
+ [ -z "$MEM" ] && MEM="MS"
+ debug_log "Modem #$modem_num: storage='$MEM'"
+
+ debug_log "Modem #$modem_num: reading SMS count with sms_tool..."
+ STX=$(sms_tool -s $MEM -d $DEV status 2>/dev/null | cut -c23-27)
+ SMS=$(echo $STX | tr -dc '0-9')
+
+ if [ -z "$SMS" ]; then
+ debug_log "Modem #$modem_num: ERROR - failed to read SMS count (STX='$STX')"
+ modem_count=$((modem_count + 1))
+ continue
+ fi
+
+ debug_log "Modem #$modem_num: current SMS count = $SMS"
+
+ SMSD=$(echo "$SMSC" | grep -o "dfm${modem_num}_[0-9]\+" | cut -d'_' -f2)
+
+ [ -z "$SMSD" ] && SMSD=0
+
+ debug_log "Modem #$modem_num: saved SMS count = $SMSD"
+
+ if [ $SMS -gt $SMSD ]; then
+ debug_log "Modem #$modem_num: NEW SMS DETECTED! ($SMS > $SMSD)"
+ has_new_sms=1
+ break
+ else
+ debug_log "Modem #$modem_num: no new SMS ($SMS <= $SMSD)"
+ fi
+
+ modem_count=$((modem_count + 1))
+
+ sleep 3
+ done
+
+ debug_log "Total serial modems checked: $modem_count"
+
+ if [ $has_new_sms -eq 1 ]; then
+ debug_log "Activating LED for new SMS..."
+ echo timer > $LEDT
+ echo $TMOFF > $LEDOFF
+ echo $TMON > $LEDON
+ debug_log "LED activated successfully"
+ return 1
+ fi
+
+ debug_log "No new SMS detected on any modem"
+ return 0
+}
+
+SMSC=$(uci -q get sms_tool_js.@sms_tool_js[0].sms_count)
+debug_log "=== MAIN LOGIC ==="
+debug_log "sms_count value: '$SMSC'"
+
+if is_new_format "$SMSC"; then
+ debug_log "Detected NEW FORMAT - multiple modems"
+ handle_new_format
+ result=$?
+else
+ debug_log "Detected OLD FORMAT - single modem"
+ handle_old_format
+ result=$?
fi
-if [ $SMS -gt $SMSD ]; then
+debug_log "Script finished with exit code: $result"
+debug_log "=== END DEBUG ==="
-echo timer > $LEDT
-echo $TMOFF > $LEDOFF
-echo $TMON > $LEDON
-exit 0
-
-fi
-
-
-exit 0
+exit $result
diff --git a/luci-app-sms-tool-js/root/usr/bin/sms_tool_calllogd b/luci-app-sms-tool-js/root/usr/bin/sms_tool_calllogd
new file mode 100755
index 000000000..e812e7050
--- /dev/null
+++ b/luci-app-sms-tool-js/root/usr/bin/sms_tool_calllogd
@@ -0,0 +1,157 @@
+#!/bin/sh
+#
+# Copyright 2026 Rafał Wabik (IceG) - From eko.one.pl forum
+# Licensed to the GNU General Public License v3.0.
+#
+
+. /usr/share/libubox/jshn.sh
+
+PORT=$(uci -q get sms_tool_js.@sms_tool_js[0].callport)
+[ -n "$PORT" ] || PORT=$(uci -q get sms_tool_js.@sms_tool_js[0].readport)
+[ -z "$PORT" ] && exit 1
+
+LOG_FILE="/tmp/sms_tool_call_log.json"
+LINES_FILE="/tmp/sms_tool_call_log.lines"
+MAX_ENTRIES=50
+LAST_NUMBER=""
+LAST_TIME=0
+
+# Ensure files exist
+[ -f "$LINES_FILE" ] || touch "$LINES_FILE"
+[ -f "$LOG_FILE" ] || echo '{"calls":[]}' > "$LOG_FILE"
+
+add_to_log() {
+ local type="$1"
+ local number="$2"
+ local duration="$3"
+ local date=$(date "+%Y-%m-%d %H:%M:%S")
+ local now=$(date +%s)
+
+ [ -z "$number" ] && number="Unknown"
+ [ -z "$duration" ] && duration="0"
+
+ if [ "$number" = "$LAST_NUMBER" ] && [ $((now - LAST_TIME)) -lt 10 ]; then
+ return
+ fi
+
+ LAST_NUMBER="$number"
+ LAST_TIME="$now"
+
+ json_init
+ json_add_string "type" "$type"
+ json_add_string "number" "$number"
+ json_add_string "date" "$date"
+ json_add_string "duration" "$duration"
+ local new_entry=$(json_dump)
+
+ echo "$new_entry" >> "$LINES_FILE"
+
+ # Keep only last MAX_ENTRIES
+ local count=$(wc -l < "$LINES_FILE")
+ if [ "$count" -gt "$MAX_ENTRIES" ]; then
+ tail -n "$MAX_ENTRIES" "$LINES_FILE" > "${LINES_FILE}.tmp"
+ mv "${LINES_FILE}.tmp" "$LINES_FILE"
+ fi
+
+ # Generate JSON for LuCI
+ echo "{\"calls\":[" > "$LOG_FILE"
+ # Reverse lines to have newest first, add commas
+ if [ -s "$LINES_FILE" ]; then
+ sed '1!G;h;$!d' "$LINES_FILE" | sed '$ ! s/$/,/' >> "$LOG_FILE"
+ fi
+ echo "]}" >> "$LOG_FILE"
+}
+
+handle_event() {
+ local line="$1"
+
+ if echo "$line" | grep -q "\^DSCI:"; then
+ local data=$(echo "$line" | sed 's/\^DSCI: //')
+ local id=$(echo "$data" | cut -d, -f1)
+ local dir=$(echo "$data" | cut -d, -f2)
+ local state=$(echo "$data" | cut -d, -f3)
+ local number=$(echo "$data" | cut -d, -f5 | tr -d '"')
+
+ case "$state" in
+ 0|1) # setup / alerting
+ eval "CALL_${id}_STATE=ringing"
+ [ -n "$number" ] && eval "CALL_${id}_NUMBER=\"$number\""
+ eval "CALL_${id}_START=$(date +%s)"
+ ;;
+ 2) # active
+ eval "CALL_${id}_STATE=active"
+ eval "CALL_${id}_START=$(date +%s)"
+ ;;
+ 3) # released
+ eval "local old_state=\$CALL_${id}_STATE"
+ eval "local old_number=\$CALL_${id}_NUMBER"
+ eval "local old_start=\$CALL_${id}_START"
+
+ [ -z "$old_state" ] && return
+
+ local type="Unknown"
+ if [ "$dir" = "1" ]; then
+ if [ "$old_state" = "ringing" ]; then
+ type="Missed"
+ else
+ type="Received"
+ fi
+ else
+ type="Dialed"
+ fi
+
+ local end=$(date +%s)
+ local duration_sec=$((end - old_start))
+ local duration=$(printf "%02d:%02d:%02d" $((duration_sec/3600)) $(( (duration_sec%3600)/60 )) $((duration_sec%60)) )
+
+ add_to_log "$type" "$old_number" "$duration"
+
+ # Cleanup
+ eval "unset CALL_${id}_STATE"
+ eval "unset CALL_${id}_NUMBER"
+ eval "unset CALL_${id}_START"
+ ;;
+ esac
+ elif echo "$line" | grep -q "+CLIP:"; then
+ local number=$(echo "$line" | cut -d'"' -f2)
+ [ -n "$number" ] && add_to_log "Missed" "$number" "0"
+ elif echo "$line" | grep -q "+CLCC:"; then
+ local number=$(echo "$line" | cut -d'"' -f2)
+ local state=$(echo "$line" | cut -d, -f3)
+
+ if [ "$state" = "4" ] && [ -n "$number" ]; then
+ add_to_log "Missed" "$number" "0"
+ fi
+ fi
+}
+
+# Main
+if command -v stty >/dev/null 2>&1; then
+ stty -F "$PORT" 115200 raw -echo 2>/dev/null
+fi
+
+exec 3<>"$PORT"
+
+printf "ATE0\r" >&3
+sleep 1
+printf "AT+CLIP=1\r" >&3
+sleep 1
+printf "AT+CRC=1\r" >&3
+sleep 1
+printf "AT^DSCI=1\r" >&3
+sleep 1
+
+last_poll=0
+
+while true; do
+ if read -t 1 line <&3; then
+ line=$(printf "%s" "$line" | tr -d '\r\n')
+ [ -n "$line" ] && handle_event "$line"
+ fi
+
+ now=$(date +%s)
+ if [ $((now - last_poll)) -gt 2 ]; then
+ printf "AT+CLCC\r" >&3
+ last_poll=$now
+ fi
+done
diff --git a/luci-app-sms-tool-js/root/usr/bin/usr_script1.sh b/luci-app-sms-tool-js/root/usr/bin/usr_script1.sh
deleted file mode 100755
index f2425e5c2..000000000
--- a/luci-app-sms-tool-js/root/usr/bin/usr_script1.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# Copyright 2023 Rafał Wabik (IceG) - From eko.one.pl forum
-# Licensed to the GNU General Public License v3.0.
diff --git a/luci-app-sms-tool-js/root/usr/libexec/rpcd/sms_forward b/luci-app-sms-tool-js/root/usr/libexec/rpcd/sms_forward
new file mode 100755
index 000000000..40241e708
--- /dev/null
+++ b/luci-app-sms-tool-js/root/usr/libexec/rpcd/sms_forward
@@ -0,0 +1,114 @@
+#!/bin/sh
+#
+# Copyright 2026 Rafał Wabik (IceG) - From eko.one.pl forum
+# Licensed to the GNU General Public License v3.0.
+#
+
+. /usr/share/libubox/jshn.sh
+
+send_email() {
+ local to="$1"
+ local subject="$2"
+ local body="$3"
+ local error_msg=""
+
+ local from=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_sender)
+ local user=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_user)
+ local password=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_password)
+ local smtp=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_smtp)
+ local port=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_smtp_port)
+ local security=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_security)
+ local ehlo=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_ehlo)
+
+ if [ -z "$to" ]; then
+ echo "Recipient email address is not configured"
+ return 1
+ fi
+
+ if [ -z "$from" ]; then
+ echo "Sender email address is not configured"
+ return 1
+ fi
+
+ if [ -z "$user" ]; then
+ echo "Email user (login) is not configured"
+ return 1
+ fi
+
+ if [ -z "$password" ]; then
+ echo "Email password is not configured"
+ return 1
+ fi
+
+ if [ -z "$smtp" ]; then
+ echo "SMTP server is not configured"
+ return 1
+ fi
+
+ if [ -z "$port" ]; then
+ echo "SMTP port is not configured"
+ return 1
+ fi
+
+ local security_opts="-starttls -auth-login"
+ case "$security" in
+ ssl) security_opts="-ssl -auth" ;;
+ tls) security_opts="-starttls -auth-login" ;;
+ *) security_opts="-starttls -auth-login" ;;
+ esac
+
+ if [ "$ehlo" = "1" ]; then
+ security_opts="$security_opts -ehlo"
+ fi
+
+ result=$(mailsend $security_opts \
+ -smtp "$smtp" -port "$port" \
+ -ct 5 -read-timeout 5 \
+ -cs utf-8 \
+ -user "$user" -pass "$password" \
+ -f "$from" -t "$to" \
+ -sub "$subject" \
+ -M "$body" 2>&1)
+
+ local ret=$?
+
+ if [ $ret -ne 0 ]; then
+ echo "$result" | grep -i "error\|failed\|unable\|denied\|authentication\|connection" || echo "$result"
+ return $ret
+ fi
+
+ echo "success"
+ return 0
+}
+
+case "$1" in
+ list)
+ echo '{ "forward": { "subject": "str", "message": "str" } }'
+ ;;
+ call)
+ case "$2" in
+ forward)
+ read input
+ json_load "$input"
+ json_get_var subject subject
+ json_get_var message message
+
+ recipient=$(uci -q get sms_tool_js.@sms_tool_js[0].forward_sms_mail_recipient)
+
+ error_output=$(send_email "$recipient" "$subject" "$message")
+ result_code=$?
+
+ if [ $result_code -eq 0 ]; then
+ json_init
+ json_add_boolean success 1
+ json_dump
+ else
+ json_init
+ json_add_boolean success 0
+ json_add_string error "$error_output"
+ json_dump
+ fi
+ ;;
+ esac
+ ;;
+esac
diff --git a/luci-app-sms-tool-js/root/usr/share/luci/menu.d/luci-app-sms-tool-js.json b/luci-app-sms-tool-js/root/usr/share/luci/menu.d/luci-app-sms-tool-js.json
index 3203ea538..7e2508a23 100644
--- a/luci-app-sms-tool-js/root/usr/share/luci/menu.d/luci-app-sms-tool-js.json
+++ b/luci-app-sms-tool-js/root/usr/share/luci/menu.d/luci-app-sms-tool-js.json
@@ -39,6 +39,18 @@
}
},
+ "admin/modem/luci-app-sms-tool-js/calllog": {
+ "title": "Call Log",
+ "order": 25,
+ "action": {
+ "type": "view",
+ "path": "modem/calllog"
+ },
+ "depends": {
+ "fs": { "/tmp/sms_tool_call_log.json": "file" }
+ }
+ },
+
"admin/modem/luci-app-sms-tool-js/sendussd": {
"title": "USSD Codes",
"order": 30,
@@ -65,5 +77,13 @@
"path": "modem/smsconfig"
}
},
-
+
+ "admin/modem/luci-app-sms-tool-js/sms_support": {
+ "title": "Package update and support",
+ "order": 60,
+ "action": {
+ "type": "view",
+ "path": "modem/sms_support"
+ }
+ }
}
diff --git a/luci-app-sms-tool-js/root/usr/share/rpcd/acl.d/luci-app-sms-tool-js.json b/luci-app-sms-tool-js/root/usr/share/rpcd/acl.d/luci-app-sms-tool-js.json
index fa4c8166b..6c5eb6b67 100644
--- a/luci-app-sms-tool-js/root/usr/share/rpcd/acl.d/luci-app-sms-tool-js.json
+++ b/luci-app-sms-tool-js/root/usr/share/rpcd/acl.d/luci-app-sms-tool-js.json
@@ -1,39 +1,73 @@
{
"luci-app-sms-tool-js": {
- "description": "Grant access to LuCI app sms-tool",
+ "description": "Grant access to LuCI app sms-tool-js",
"read": {
- "cgi-io": [ "exec" ],
- "file": {
- "/sys/class/leds": [ "list" ],
+ "cgi-io": [ "exec", "upload" ],
+ "file": {
+ "/sys/class/leds": [ "list" ],
+ "/dev": [ "list" ],
"/usr/bin/sms_tool": [ "exec" ],
- "/etc/init.d/my_new_sms start" : [ "exec" ],
- "/etc/init.d/my_new_sms stop" : [ "exec" ],
- "/etc/init.d/my_new_sms enable" : [ "exec" ],
- "/etc/init.d/my_new_sms disable" : [ "exec" ],
- "/etc/init.d/my_new_sms restart" : [ "exec" ],
- "/etc/init.d/led restart" : [ "exec" ],
+ "/etc/init.d/my_new_sms": [ "exec" ],
+ "/etc/init.d/sms_tool_calllogd": [ "exec" ],
+ "/etc/init.d/led": [ "exec" ],
+ "/etc/init.d/cron": [ "exec" ],
"/sbin/smstool_led.sh": [ "exec" ],
"/sbin/sms_led.sh": [ "exec" ],
- "/sbin/new_cron_sync.sh": [ "exec" ],
- "/usr/bin/usr_script1.sh": [ "read" ],
+ "/bin/sh": [ "exec" ],
+ "/bin/tar": [ "exec" ],
+ "/bin/mkdir": [ "exec" ],
+ "/bin/rm": [ "exec" ],
+ "/etc/crontabs/root": [ "read" ],
+ "/usr/bin/opkg list-installed": ["exec"],
+ "/usr/libexec/package-manager-call list-installed": [ "exec" ],
+ "/usr/libexec/opkg-list installed": [ "exec" ],
+ "/usr/libexec/opkg-call list-installed": [ "exec" ],
"/etc/sms_tool_js": [ "read" ],
+ "/etc/defmodems": [ "read" ],
"/tmp/mysms.txt": [ "read" ],
+ "/tmp/sms_tool_call_log.json": [ "read" ],
+ "/tmp/sms_tool_call_log.lines": [ "read" ],
"/etc/modem/atcmmds.user": [ "read" ],
+ "/etc/modem/atcmmds": [ "list" ],
+ "/etc/modem/atcmmds/*": [ "read" ],
+ "/etc/modem/atcmmds/*.user": [ "read" ],
"/etc/modem/phonebook.user": [ "read" ],
+ "/etc/modem/ussdcodes": [ "list" ],
+ "/etc/modem/ussdcodes/*": [ "read" ],
+ "/etc/modem/ussdcodes/*.user": [ "read" ],
"/etc/modem/ussdcodes.user": [ "read" ]
},
- "uci": [ "sms_tool_js", "luci-app-sms-tool-js" ]
+ "uci": [ "sms_tool_js", "luci-app-sms-tool-js", "defmodems" ],
+ "ubus": {
+ "file": [ "read" ],
+ "sms_forward": [ "forward" ]
+ }
},
"write": {
+ "cgi-io": [ "upload" ],
"file": {
"/etc/sms_tool_js": [ "write" ],
+ "/etc/crontabs/root": [ "write" ],
+ "/etc/init.d/cron restart": [ "exec" ],
+ "/bin/chmod": [ "exec" ],
+ "/bin/rm": [ "exec" ],
+ "/bin/tar": [ "exec" ],
+ "/bin/mkdir": [ "exec" ],
"/sys/class/leds/*/brightness": [ "write" ],
"/tmp/mysms.txt": [ "write" ],
- "/usr/bin/usr_script1.sh": [ "write" ],
+ "/tmp/sms_tool_call_log.json": [ "write" ],
+ "/tmp/sms_tool_call_log.lines": [ "write" ],
"/etc/modem/atcmmds.user": [ "write" ],
+ "/etc/modem/atcmmds/*.user": [ "write" ],
+ "/etc/modem/atcmmds/*": [ "write" ],
"/etc/modem/phonebook.user": [ "write" ],
+ "/etc/modem/ussdcodes/*.user": [ "write" ],
+ "/etc/modem/ussdcodes/*": [ "write" ],
"/etc/modem/ussdcodes.user": [ "write" ]
},
+ "ubus": {
+ "file": [ "read", "write", "remove" ]
+ },
"uci": [ "sms_tool_js", "luci-app-sms-tool-js" ]
}
}
diff --git a/modemdata/LICENSE b/modemdata/LICENSE
new file mode 100644
index 000000000..67028ac34
--- /dev/null
+++ b/modemdata/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Rafał Wabik (IceG)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/modemdata/README.md b/modemdata/README.md
new file mode 100644
index 000000000..08a31a016
--- /dev/null
+++ b/modemdata/README.md
@@ -0,0 +1,328 @@
+# luci-app-modemdata
+
+
+
+
+
+
+### Languages available / Dostępne języki
+
+
+
+
+
+
+> [!NOTE]
+>
+LuCI JS interface for [modemdata](https://github.com/obsy/modemdata) package. In the future, it will replace luci-app-3ginfo-lite.
+>
+> Interfejs LuCI JS dla pakietu [modemdata](https://github.com/obsy/modemdata). W przyszłości zastąpi on pakiet luci-app-3ginfo-lite.
+
+> [!IMPORTANT]
+> ***Due to the layout, the package is dedicated to the luci-theme-bootstrap.***
+>
+> ***Ze względu na układ pakiet dedykowany jest dla motywu luci-theme-bootstrap.***
+
+> [!IMPORTANT]
+> ***Required Packages:***
+>
+> ***serial:***
+> sms-tool, kmod-usb-serial-option, kmod-usb-serial
+>
+> ***QMI/MBIM protocol:***
+> kmod-usb-net-qmi-wwan / kmod-usb-net-cdc-mbim, uqmi
+>
+> ***ModemManager protocol:***
+> modemmanager
+>
+> ***hilink (ecm):***
+> wget-ssl
+
+### Supported usb devices (serial mode):
+
+
+ Pokaż | Show me
+
+``` bash
+03f0581d
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+03f0a31d
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+05c69026
+# ASKEY WWHC050
+
+05c69215
+# Quectel EC20
+# Quectel EC25
+
+05c69625
+# Yuge CLM920 NC_5
+
+05c6f601
+# MEIG SLM750-V
+
+0e8d7126
+# Fibocom FM350-GL
+
+0e8d7127
+# Fibocom FM350-GL
+
+119968a2
+# Sierra Wireless MC7710
+
+11999071
+# DW5809e Dell Wireless 5809e Gobi 4G LTE Mobile Broadband Card (EM7305)
+# DW5811e Snapdragon X7 LTE (EM7455B)
+# Sierra Wireless EM7455
+
+11999091
+# Sierra Wireless EM7565 (generic)
+
+119990d3
+# Sierra Wireless EM9190
+
+12d11506
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+12d1155e
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+12d1156c
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+12d115c1
+# Huawei E3272/E3276
+# Huawei ME906s-158
+# HP lt4112 Gobi 4G Module (Huawei ME906E)
+# HP lt4132 LTE/HSPA+ 4G Module (Huawei ME906s)
+
+1435d181
+# WNC D18QC
+# WNC D19QA
+
+1435d191
+# WNC D18QC
+# WNC D19QA
+
+16907588
+# ASKEY WWHC050
+
+19d20167
+# ZTE MF821
+
+19d20189
+# ZTE MF28D
+# ZTE MF290
+
+19d21275
+# ZTE P685M
+# ZTE ZM8630A
+
+19d21432
+# ZTE MF286
+# ZTE MF286A
+
+19d21485
+# ZTE MF286D
+# ZTE MF289F
+
+19d21489
+# ZTE MF286R
+
+1bc71040
+# Telit LM940
+
+1bc71201
+# Telit LE910-EUG
+
+1e0e9000
+# SIMCOM SIM7906
+# SIMCOM SIM8200EA-M2
+
+1e0e9001
+# SIMCOM SIM7906
+# SIMCOM SIM8200EA-M2
+
+1e0e9003
+# SIMCOM SIM7906
+# SIMCOM SIM8200EA-M2
+
+1e2d00b3
+# Cinterion MV31-W
+# Thales MV31-W
+# T99W175
+
+1e2d00b7
+# Cinterion MV31-W
+# Thales MV31-W
+# T99W175
+
+20202033
+# BroadMobi BM806U
+
+2c7c0125
+# Quectel EC20
+# Quectel EC25
+
+2c7c0306
+# Quectel EP06
+# Quectel EG06
+# Quectel EM06
+
+2c7c030b
+# Quectel EP06
+# Quectel EG06
+# Quectel EM06
+
+2c7c0512
+# Quectel EG18-EA
+# Quectel EM12-G
+# Quectel EM160R-GL
+
+2c7c0620
+# Quectel EG18-EA
+# Quectel EM12-G
+# Quectel EM160R-GL
+
+2c7c0800
+# Quectel RG500Q-EA
+# Quectel RG502Q-EA
+# Quectel RM500U-CNV
+# Quectel RM520N-GL
+
+2c7c0801
+# Quectel RG500Q-EA
+# Quectel RG502Q-EA
+# Quectel RM500U-CNV
+# Quectel RM520N-GL
+
+2c7c0900
+# Quectel RG500Q-EA
+# Quectel RG502Q-EA
+# Quectel RM500U-CNV
+# Quectel RM520N-GL
+
+2c7c6026
+# Quectel EC200T-EU
+
+2cb70007
+# Fibocom L850
+
+2cb70104
+# Fibocom FM150
+
+2cb70104
+# Fibocom FM190
+
+2cd20001
+# Mikrotik R11e-LTE
+# COPS
+
+2cd20004
+# Mikrotik R11e-LTE6
+
+413c81b1
+# DW5809e Dell Wireless 5809e Gobi 4G LTE Mobile Broadband Card (EM7305)
+# DW5811e Snapdragon X7 LTE (EM7455B)
+# Sierra Wireless EM7455
+
+413c81b6
+# DW5809e Dell Wireless 5809e Gobi 4G LTE Mobile Broadband Card (EM7305)
+# DW5811e Snapdragon X7 LTE (EM7455B)
+# Sierra Wireless EM7455
+
+413c81d7
+# DW5821e Snapdragon X20 LTE
+
+8087095a
+# Fibocom L860
+```
+
+
+### Supported pci devices (serial mode):
+
+
+
+ Pokaż | Show me
+
+``` bash
+105be0b0
+# Dell DW5930e
+# Foxconn T99W175
+
+17cb0306
+# Quectel RM500Q-AE
+
+17cb0308
+# Quectel RG500Q-EA
+# Quectel RG502Q-EA
+# Quectel RM500U-CNV
+# Quectel RM520N-GL
+# Quectel RM520N-GLAP
+
+17cb5201
+# Quectel RG500Q-EA
+# Quectel RG502Q-EA
+# Quectel RM500U-CNV
+# Quectel RM520N-GL
+
+1eac1004
+# Quectel RM520N-GLAP
+```
+
+
+
+### Design concept / Koncepcja wyglądu
+
+> "Modem(s)" window / Okno Modem(-ów):
+
+
+
+
+
+
+
+
+
+
+
+> "Diagnostics" window / Okno diagnostyki:
+
+
+
+> "Defined modems" window / Okno zdefiniowanych modem(-ów):
+
+
+
+
+
+
+
+> "Configuration" window / Okno konfiguracji pakietu:
+
+
+
+> "Package update and support" window / Okno aktualizacji pakietu i wsparcia:
+
+
+
+### Thanks to / Podziękowania dla
+- [obsy (Cezary Jackiewicz)](https://github.com/obsy)
+- [Users of the eko.one.pl forum](https://eko.one.pl/forum/viewtopic.php?id=20096)
diff --git a/modemdata/luci-app-modemdata/LICENSE b/modemdata/luci-app-modemdata/LICENSE
new file mode 100644
index 000000000..67028ac34
--- /dev/null
+++ b/modemdata/luci-app-modemdata/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Rafał Wabik (IceG)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/modemdata/luci-app-modemdata/Makefile b/modemdata/luci-app-modemdata/Makefile
new file mode 100644
index 000000000..f3723c6fa
--- /dev/null
+++ b/modemdata/luci-app-modemdata/Makefile
@@ -0,0 +1,20 @@
+#
+# Copyright 2025-2026 Rafał Wabik - IceG - From eko.one.pl forum
+#
+# MIT License.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-modemdata
+PKG_VERSION:=1.0.32
+PKG_RELEASE:=20260709
+LUCI_TITLE:=LuCI JS Support for modemdata application
+MAINTAINER:=Rafał Wabik <4Rafal@gmail.com>
+LUCI_DESCRIPTION:=Detailed information about the cellular modem and parameters of the mobile internet connection.
+LUCI_DEPENDS:=+sms-tool +comgt +@BUSYBOX_DEFAULT_AWK +modemdata
+LUCI_PKGARCH:=all
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/ctime_new.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/ctime_new.svg
new file mode 100644
index 000000000..cb458f696
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/ctime_new.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-000.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-000.svg
new file mode 100644
index 000000000..65244527b
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-000.svg
@@ -0,0 +1,24 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-020.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-020.svg
new file mode 100644
index 000000000..ad97cff90
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-000-020.svg
@@ -0,0 +1,33 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-020-040.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-020-040.svg
new file mode 100644
index 000000000..c4d7d5a71
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-020-040.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-040-060.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-040-060.svg
new file mode 100644
index 000000000..75d805d8a
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-040-060.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-060-080.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-060-080.svg
new file mode 100644
index 000000000..918d07c06
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-060-080.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-080-100.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-080-100.svg
new file mode 100644
index 000000000..029a04d7f
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mobile-signal-080-100.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mybts.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mybts.svg
new file mode 100644
index 000000000..b3a47c235
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/mybts.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/sim_new.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/sim_new.svg
new file mode 100644
index 000000000..23a92fa90
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/sim_new.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/termometr.svg b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/termometr.svg
new file mode 100644
index 000000000..894a912d6
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/icons/termometr.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemconfig.js b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemconfig.js
new file mode 100644
index 000000000..408fbad94
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemconfig.js
@@ -0,0 +1,177 @@
+'use strict';
+'require baseclass';
+'require form';
+'require fs';
+'require view';
+'require uci';
+'require ui';
+'require tools.widgets as widgets';
+
+/*
+
+ Copyright 2025-2026 Rafał Wabik - IceG - From eko.one.pl forum
+
+ MIT License
+
+*/
+
+let pkg = {
+ get Name() { return 'modemdata'; },
+ get URL() { return 'https://openwrt.org/packages/pkgdata/' + pkg.Name + '/'; },
+
+ // Package Manager
+ get pkgMgrURINew() { return 'admin/system/package-manager'; },
+ // opkg
+ get pkgMgrURIOld() { return 'admin/system/opkg'; },
+
+ get modemdefURI() { return 'admin/modem/modemdata/modemdefine'; },
+
+ bestPkgMgrURI: function () {
+ return L.resolveDefault(
+ fs.stat('/www/luci-static/resources/view/system/package-manager.js'), null
+ ).then(st => {
+ if (st && st.type === 'file')
+ return pkg.pkgMgrURINew;
+
+ return L.resolveDefault(fs.stat('/usr/libexec/package-manager-call'), null)
+ .then(st2 => (st2 ? pkg.pkgMgrURINew : pkg.pkgMgrURIOld));
+ }).catch(() => pkg.pkgMgrURIOld);
+ },
+
+ openInstallerSearch: function (query) {
+ return pkg.bestPkgMgrURI().then(uri => {
+ let q = query ? ('?query=' + encodeURIComponent(query)) : '';
+ window.open(L.url(uri) + q, '_blank', 'noopener');
+ });
+ }
+};
+
+return view.extend({
+
+ option_install_curl: function () {
+ return pkg.openInstallerSearch('curl');
+ },
+
+ checkPackages: function () {
+ return fs.exec_direct('/usr/bin/opkg', ['list-installed'], 'text')
+ .catch(function () {
+ return fs.exec_direct('/usr/libexec/opkg-call', ['list-installed'], 'text')
+ .catch(function () {
+ return fs.exec_direct('/usr/libexec/package-manager-call', ['list-installed'], 'text')
+ .catch(function () { return ''; });
+ });
+ })
+ .then(function (data) {
+ data = (data || '').trim();
+ return data ? data.split('\n') : [];
+ });
+ },
+
+ load: function () {
+ return Promise.all([
+ this.checkPackages()
+ ]);
+ },
+
+ render: function (data) {
+ let installedList = Array.isArray(data[0]) ? data[0] : [];
+ let curlInstalled = installedList.some(function (s) { return s && s.indexOf('curl') !== -1; });
+ let m, s, o;
+
+ m = new form.Map('modemdata', _('Configuration'),
+ _('Configuration panel for modemdata and gui application.')
+ );
+
+ s = m.section(form.TypedSection, 'modemdata', '', null);
+ s.anonymous = true;
+
+ o = s.option(form.ListValue, 'updtime', _('Refresh rate'),
+ _('Set how often the data should be refreshed in the Modem(s) tab. \
+
Important \
+ Not every modem / protocol can communicate quickly with scripts. Too high a polling rate can freeze the modem. \
+ ModemManager and uqmi need more time to respond.')
+ );
+ o.value('-1', _('Disabled'));
+ o.value('5', _('5 seconds'));
+ o.value('10', _('10 seconds'));
+ o.value('30', _('30 seconds'));
+ o.value('45', _('45 seconds'));
+ o.default = '5';
+ o.rmempty = false;
+
+ o = s.option(form.DynamicList, 'hide_data', _('Add data to hide'),
+ _('Enter the data you would like to hide, e.g. IMEI, IMSI.')
+ );
+ o.rmempty = true;
+
+ s = m.section(form.TypedSection, 'modemdata', null);
+ s.anonymous = true;
+ s.addremove = false;
+
+ s.tab('bts1', _('BTS search settings'));
+ s.anonymous = true;
+
+ o = s.taboption('bts1', form.DummyValue, '_dummy');
+ o.rawhtml = true;
+ o.default =
+ '
' +
+ _('Note: The package is fully compatible with the latest, third-generation version of the BTSearch website.') +
+/* --- Downloading data using curl
+ ' ' +
+ _('To download data (via the API), you must have the curl package installed (to do this click on the button added below).') +
+*/
+ '
';
+
+ o = s.taboption('bts1', form.ListValue, 'website',
+ _('Website to search for BTS'),
+ _('Select a website for searching.')
+ );
+ o.value('www.btsearch.pl', _('btsearch.pl'));
+ o.value('lteitaly.it', _('lteitaly.it'));
+ o.default = 'www.btsearch.pl';
+ o.modalonly = true;
+
+ o = s.taboption('bts1', form.ListValue, 'btsaction', _('Action'),
+ _('Select an action after clicking the search button.')
+ );
+ o.value('open', _('Open page'));
+ o.default = 'open';
+ o.modalonly = true;
+ o.depends('website', 'www.btsearch.pl');
+ o.value('download', _('Download data'));
+
+/* --- Downloading data using curl
+
+ if (curlInstalled) {
+ o.value('download', _('Download data'));
+ }
+
+ let sCurl = m.section(form.NamedSection, 'kmods', 'kmods', _());
+ sCurl.render = L.bind(function (view) {
+ return form.NamedSection.prototype.render.apply(this, this.varargs(arguments, 1))
+ .then(L.bind(function (node) {
+ let btn = curlInstalled
+ ? E('button', { 'class': 'edit btn', 'disabled': true }, _('Installed'))
+ : E('button', {
+ 'class': 'btn cbi-button-action',
+ 'click': ui.createHandlerFn(view, 'option_install_curl', this.map),
+ 'title': _('Install a package using package manager')
+ }, [_('Install…')]);
+
+ node.appendChild(E('div', { 'class': 'cbi-value' }, [
+ E('label', { 'class': 'cbi-value-title' }, _('Install curl')),
+ E('div', { 'class': 'cbi-value-field', 'style': 'width:25vw' },
+ E('div', { 'class': 'cbi-section-node' }, [ btn ])
+ )
+ ]));
+ node.appendChild(E('br'));
+ node.appendChild(E('br'));
+ return node;
+ }, this));
+ }, sCurl, this);
+
+*/
+
+ return m.render();
+ }
+});
diff --git a/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemdefine.js b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemdefine.js
new file mode 100644
index 000000000..0e6d0f493
--- /dev/null
+++ b/modemdata/luci-app-modemdata/htdocs/luci-static/resources/view/modem/modemdefine.js
@@ -0,0 +1,656 @@
+'use strict';
+'require baseclass';
+'require form';
+'require fs';
+'require view';
+'require uci';
+'require ui';
+'require tools.widgets as widgets';
+
+/*
+
+ Copyright 2025-2026 Rafał Wabik - IceG - From eko.one.pl forum
+
+ MIT License
+
+*/
+
+function usrdesc(section_id) {
+ return E('span', (uci.get('defmodems', section_id, 'user_desc') || ''));
+}
+
+function getmodem(section_id) {
+ return E('span', (uci.get('defmodems', section_id, 'modem') || ''));
+}
+
+function getmodemdata(section_id) {
+ return E('span', '' + (uci.get('defmodems', section_id, 'comm_port') + '' || '' + '' + ''));
+}
+
+return view.extend({
+ modemPath: '/etc/modem/modemlist.json',
+
+ load: function () {
+ return Promise.all([
+ L.resolveDefault(fs.list('/dev'), null),
+ L.resolveDefault(fs.read_direct('/sys/kernel/debug/usb/devices', ['-r'])),
+ L.resolveDefault(fs.exec_direct('/usr/bin/mmcli', ['-L', '-J']), null),
+ this.checkPackages(),
+ uci.load('defmodems')
+ ]);
+ },
+
+ pkg: {
+ get Name() { return 'defmodems'; },
+ get URL() { return 'https://openwrt.org/packages/pkgdata/' + this.Name + '/'; },
+ get pkgMgrURINew() { return 'admin/system/package-manager'; },
+ get pkgMgrURIOld() { return 'admin/system/opkg'; },
+
+ bestPkgMgrURI: function () {
+ return L.resolveDefault(
+ fs.stat('/www/luci-static/resources/view/system/package-manager.js'), null
+ ).then(function (st) {
+ if (st && st.type === 'file')
+ return 'admin/system/package-manager';
+ return L.resolveDefault(fs.stat('/usr/libexec/package-manager-call'), null)
+ .then(function (st2) {
+ return st2 ? 'admin/system/package-manager' : 'admin/system/opkg';
+ });
+ }).catch(function () { return 'admin/system/opkg'; });
+ },
+
+ openInstallerSearch: function (query) {
+ let self = this;
+ return self.bestPkgMgrURI().then(function (uri) {
+ let q = query ? ('?query=' + encodeURIComponent(query)) : '';
+ window.open(L.url(uri) + q, '_blank', 'noopener');
+ });
+ }
+ },
+
+ fileModemDialog: baseclass.extend({
+ __init__: function (file, title, description, callback, fileExists) {
+ if (fileExists === undefined) fileExists = false;
+ this.file = file;
+ this.title = title;
+ this.description = description;
+ this.callback = callback;
+ this.fileExists = fileExists;
+ },
+
+ load: function () {
+ return L.resolveDefault(fs.read(this.file), '');
+ },
+
+ handleSave: function () {
+ let textarea = document.getElementById('widget.modal_content');
+ let value = textarea.value.trim().replace(/\r\n/g, '\n') + '\n';
+
+ return fs.write(this.file, value)
+ .then(function (rc) {
+ textarea.value = value;
+ return rc;
+ })
+ .catch(function (e) {
+ ui.addNotification(
+ null,
+ E('p', _('Unable to save the contents') + ': %s'.format(e.message))
+ );
+ })
+ .finally(function () {
+ ui.hideModal();
+ });
+ },
+
+ error: function (e) {
+ if (!this.fileExists && e instanceof Error && e.name === 'NotFoundError') {
+ return this.render();
+ } else {
+ ui.showModal(
+ this.title,
+ [
+ E('p', {}, _('Unable to read the contents') + ': %s'.format(e.message)),
+ E('div', { 'class': 'right' }, [
+ E('button', { 'class': 'btn', 'click': ui.hideModal }, _('Dismiss'))
+ ])
+ ],
+ 'cbi-modal'
+ );
+ }
+ },
+
+ show: function () {
+ let self = this;
+ ui.showModal(null, E('p', { 'class': 'spinning' }, _('Loading')));
+ this.load()
+ .then(function (content) {
+ ui.hideModal();
+ return self.render(content);
+ })
+ .catch(function (e) {
+ ui.hideModal();
+ return self.error(e);
+ });
+ },
+
+ render: function (content) {
+ ui.showModal(
+ this.title,
+ [
+ E('p', this.description),
+ E('textarea', {
+ 'id': 'widget.modal_content',
+ 'class': 'cbi-input-textarea',
+ 'style': 'width:100% !important; height: 60vh; min-height: 500px;',
+ 'wrap': 'off',
+ 'readonly': 'true',
+ 'spellcheck': 'false'
+ }, content.trim()),
+ E('div', { 'class': 'right' }, [
+ E('button', { 'class': 'btn', 'click': ui.hideModal }, _('Dismiss'))
+ ])
+ ],
+ 'cbi-modal'
+ );
+ }
+ }),
+
+packageDialog: baseclass.extend({
+ __init__: function (installedList, pkgHelper) {
+ this.installed = Array.isArray(installedList) ? installedList : [];
+ this.pkgHelper = pkgHelper;
+
+ this.sections = {
+ serial: [
+ { name: 'sms-tool', label: 'sms-tool' },
+ { name: 'kmod-usb-serial', label: 'kmod-usb-serial' },
+ { name: 'kmod-usb-serial-option', label: 'kmod-usb-serial-option' }
+ ],
+ ecm: [
+ { name: 'wget-ssl', label: 'wget-ssl' }
+ ],
+ uqmi: [
+ { name: 'uqmi', label: 'uqmi' },
+ { name: 'kmod-usb-net-qmi-wwan', label: 'kmod-usb-net-qmi-wwan' },
+ { name: 'kmod-usb-net-cdc-mbim', label: 'kmod-usb-net-cdc-mbim' }
+ ],
+ ModemManager: [
+ { name: 'modemmanager', label: 'modemmanager' }
+ ]
+ };
+ },
+
+ _isInstalled: function (name) {
+ let list = this.installed || [];
+ return list.find(function (s) { return s && s.indexOf(name) !== -1; }) ? true : false;
+ },
+
+ _row: function (pkgName, installed) {
+ let title = E('label', { 'class': 'cbi-value-title' }, pkgName);
+ let btn = installed
+ ? E('button', { 'class': 'edit btn', 'disabled': true }, _('Installed'))
+ : E('button', {
+ 'class': 'btn cbi-button-positive',
+ 'click': (function (name, ctx) { return function () { ctx.pkgHelper.openInstallerSearch(name); }; })(pkgName, this)
+ }, _('Install…'));
+
+ let field = E('div', { 'class': 'cbi-value-field' }, [ btn ]);
+ return E('div', { 'class': 'cbi-value' }, [ title, field ]);
+ },
+
+ _sectionHeader: function (text) {
+ return E('div', {}, [ E('h4', {}, text) ]);
+ },
+
+ show: function () {
+ ui.showModal(_('Required packages'), [
+ E('p', { 'class': 'spinning' }, _('Loading package data…'))
+ ]);
+
+ let self = this;
+ let loadInstalled = Promise.resolve().then(function () {
+ if (self.installed && self.installed.length)
+ return self.installed;
+ if (typeof checkPackages === 'function')
+ return checkPackages().then(function (list) { self.installed = list || []; return self.installed; });
+ return [];
+ });
+
+ loadInstalled.then(function () {
+ let sectionOrder = ['serial', 'ecm', 'uqmi', 'ModemManager'];
+ let node = [];
+
+ node.push(E('p', {}, _('Please select method for reading data from the modem and install the necessary packages.')));
+
+ for (let si = 0; si < sectionOrder.length; si++) {
+ let key = sectionOrder[si];
+ let pkgs = self.sections[key];
+ if (!pkgs || pkgs.length === 0) continue;
+
+ node.push(self._sectionHeader(_(key)));
+
+ for (let i = 0; i < pkgs.length; i++) {
+ let p = pkgs[i];
+ let installed = self._isInstalled(p.name);
+ node.push(self._row(p.label, installed));
+ }
+ }
+
+ let footer = E('div', { 'class': 'right' }, [
+ E('div', { 'class': 'btn cbi-button-neutral', 'click': ui.hideModal }, _('Dismiss'))
+ ]);
+
+ let body = [
+ E('div', {}, node),
+ footer
+ ];
+
+ ui.showModal(_('Required packages'), body);
+ }).catch(function (err) {
+ ui.showModal(_('Required packages'), [
+ E('p', {}, _('Failed to load package data.')),
+ E('pre', {}, (err && err.toString) ? err.toString() : String(err)),
+ E('div', { 'class': 'right' }, [
+ E('div', { 'class': 'btn cbi-button-neutral', 'click': ui.hideModal }, _('Close'))
+ ])
+ ]);
+ });
+ }
+ }),
+
+ checkPackages: function() {
+ return fs.exec_direct('/usr/bin/opkg', ['list-installed'], 'text')
+ .catch(function () {
+ return fs.exec_direct('/usr/libexec/opkg-call', ['list-installed'], 'text')
+ .catch(function () {
+ return fs.exec_direct('/usr/libexec/package-manager-call', ['list-installed'], 'text')
+ .catch(function () {
+ return '';
+ });
+ });
+ })
+ .then(function (data) {
+ data = (data || '').trim();
+ return data ? data.split('\n') : [];
+ });
+ },
+
+ _isPackageInstalled: function(pkgName) {
+ return this.checkPackages().then(function(installedPackages) {
+ return installedPackages.some(function(pkg) {
+ return pkg.includes(pkgName);
+ });
+ });
+ },
+
+ render: function (data) {
+ let showModemDialog = new this.fileModemDialog(
+ this.modemPath,
+ _('Modems found'),
+ _("List of found modems. Not all modems may be shown.")
+ );
+
+ let installedList = Array.isArray(data[3]) ? data[3] : [];
+ let showPackageDialog = new this.packageDialog(installedList, this.pkg);
+
+ // Modemz config info
+ let dfmodems = uci.sections('defmodems', 'defmodems');
+ if (!dfmodems || dfmodems.length === 0) {
+ ui.addNotification(null, E('p', {}, [
+ _('Proper Modem Configuration.'),
+ E('br'), E('br'),
+ E('b', _('User should remember:')),
+ E('ul', {}, [
+ E('li', _('1. For a specific modem, only one protocol should be set for communication with modem.')),
+ E('li', _('2. Only one package can read data from modem (at the same time).')),
+ E('li', _('3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time).'))
+ ])
+ ]), 'info');
+ }
+
+ fs.write('/etc/modem/modemlist.json', '');
+
+ let dlines = data[1].trim().split(/\n/).map(function (line) {
+ return line.replace(/^<\d+>/, '');
+ });
+ let devslist = dlines.join('\n');
+ let alldevs = devslist.split('\n\n');
+ let results = [];
+
+ for (let ai = 0; ai < alldevs.length; ai++) {
+ let modem = alldevs[ai];
+ let lines = modem.split('\n');
+ let vendor = '';
+ let pid = '';
+ let manufacturer = '';
+ let product = '';
+ let serialnumber = '';
+ let driver = '';
+ let bus = '';
+
+ for (let li = 0; li < lines.length; li++) {
+ let line = lines[li];
+ if (line.indexOf('Driver=hub') !== -1 || line.indexOf('Driver=usb-storage') !== -1 || line.indexOf('Driver=usblp') !== -1) {
+ driver = line.split('Driver=')[1].trim();
+ break;
+ }
+ if (line.indexOf('Spd=') !== -1) {
+ let mSpd = line.match(/Spd=([^ ]+)/);
+ if (mSpd && mSpd[1]) bus = mSpd[1].trim();
+ }
+ if (line.indexOf('Vendor=') !== -1) {
+ let mVen = line.match(/Vendor=([^ ]+)/);
+ if (mVen && mVen[1]) vendor = mVen[1].trim();
+ }
+ if (line.indexOf('ProdID=') !== -1) {
+ let mPid = line.match(/ProdID=([^ ]+)/);
+ if (mPid && mPid[1]) pid = mPid[1].trim();
+ }
+ if (line.indexOf('Manufacturer=') !== -1) {
+ let mMan = line.match(/Manufacturer=(.*)/);
+ if (mMan && mMan[1]) manufacturer = mMan[1].trim();
+ }
+ if (line.indexOf('Product=') !== -1) {
+ let mPro = line.match(/Product=(.*)/);
+ if (mPro && mPro[1]) product = mPro[1].trim();
+ }
+ if (line.indexOf('SerialNumber=') !== -1) {
+ let mSn = line.match(/SerialNumber=(.*)/);
+ if (mSn && mSn[1]) serialnumber = mSn[1].trim();
+ }
+ }
+
+ if (driver === '' && (manufacturer !== '' || product !== '')) {
+ results.push({
+ Manufacturer: manufacturer,
+ Product: product,
+ Vendor: vendor,
+ ProdID: pid,
+ Bus_speed: bus,
+ Serial_Number: serialnumber
+ });
+ }
+ }
+
+ let outputJSON = JSON.stringify(results, null, 2);
+ let countm = Object.keys(results).length;
+
+ fs.write('/etc/modem/modemlist.json', outputJSON + '\n');
+
+ let m, s, o;
+
+ m = new form.Map('defmodems', _('Defined modems'),
+ _('Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI.')
+ );
+
+ s = m.section(form.TypedSection, 'general', _(''));
+ s.anonymous = true;
+ s.addremove = false;
+
+ o = s.option(form.Button, '_show_modem_btn', _('Show modems found'),
+ _('Currently, only modems connected via USB are searched for.')
+ );
+ o.onclick = function () { showModemDialog.show(); };
+ o.inputtitle = _('Show');
+ o.inputstyle = 'edit btn';
+
+ o = s.option(form.Button, '_show_package_btn', _('Check required packages'),
+ _('Before configuring the modem, check if all required packages are installed in the system.')
+ );
+ o.onclick = function () { showPackageDialog.show(); };
+ o.inputtitle = _('Check');
+ o.inputstyle = 'cbi-button cbi-button-action important';
+
+ s = m.section(form.GridSection, 'defmodems', _('Modem(s)'));
+ s.anonymous = true;
+ s.addremove = true;
+ s.sortable = true;
+ s.nodescriptions = true;
+ s.addbtntitle = _('Add new modem settings...');
+
+ s.tab('general', _('Modem Settings'));
+
+ o = s.taboption('general', form.Value, 'modem', _('Manufacturer / Product'),
+ _("Enter modem name manually if the suggested name is not obvious. \
+
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Pokud navrhovaný název není jednoznačný, zadejte název modemu ručně.
Důležité Název modemu se vyhledává pouze u modemů připojených přes USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Vyberte metodu čtení dat z modemu.
sériový port: Vyberte jeden z dostupných "
+"portů ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Zadejte IP adresu 192.168.X.X, pod kterou je modem (Huawei) "
+"dostupný.
uqmi: Vyberte jeden z dostupných portů cdc-wdmX.
ModemManager: Vyberte "
+"jeden z vyhledaných identifikátorů modemu."
+
+msgid "Please select a port"
+msgstr "Vyberte prosím port"
+
+msgid "User description"
+msgstr "Popis uživatele"
+
+msgid "Optional"
+msgstr "Volitelné"
+
+msgid "User description (optional)"
+msgstr "Popis uživatele (volitelný)"
+
+msgid "Excellent"
+msgstr "Vynikající"
+
+msgid "Good"
+msgstr "Dobrý"
+
+msgid "Fair"
+msgstr "Slušný"
+
+msgid "Poor"
+msgstr "Špatný"
+
+msgid "Physical cell ID"
+msgstr "Fyzické ID buňky"
+
+msgid "Bandwidth"
+msgstr "Šířka pásma"
+
+msgid "SIM status"
+msgstr "Stav SIM"
+
+msgid "Not registered"
+msgstr "Neregistrováno"
+
+msgid "Registered, home"
+msgstr "Registrováno, domácí síť"
+
+msgid "Registered (roaming)"
+msgstr "Registrováno (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registrováno, pouze SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registrováno (roaming), pouze SMS"
+
+msgid "Searching.."
+msgstr "Vyhledávání..."
+
+msgid "Connection state"
+msgstr "Stav připojení"
+
+msgid "Connected"
+msgstr "Připojeno"
+
+msgid "Disconnected"
+msgstr "Odpojeno"
+
+msgid "Registering denied"
+msgstr "Registrace odmítnuta"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Čekání na čtení dat z modemu..."
+
+msgid "Waiting for data..."
+msgstr "Čekání na data..."
+
+msgid "BTS Search"
+msgstr "Vyhledávání BTS"
+
+msgid "BTS Information"
+msgstr "Informace o BTS"
+
+msgid "Search"
+msgstr "Hledat"
+
+msgid "Bands"
+msgstr "Pásma"
+
+msgid "Search BTS"
+msgstr "Vyhledat BTS"
+
+msgid "BTS search settings"
+msgstr "Nastavení vyhledávání BTS"
+
+msgid "Website to search for BTS"
+msgstr "Webová stránka pro vyhledávání BTS"
+
+msgid "Select a website for searching."
+msgstr "Vyberte webovou stránku pro vyhledávání."
+
+msgid "Install a package using package manager"
+msgstr "Nainstalujte balíček pomocí správce balíčků"
+
+msgid "Select an action after clicking the search button."
+msgstr "Vyberte akci po kliknutí na tlačítko vyhledávání."
+
+msgid "Install iconv"
+msgstr "Nainstalovat iconv"
+
+msgid "Install qmi-utils"
+msgstr "Nainstalovat qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Slot SIM"
+
+msgid "SIM Card"
+msgstr "SIM karta"
+
+msgid "Slot in use"
+msgstr "Používaný slot"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Problém s registrací do sítě, zkontrolujte SIM kartu."
+
+msgid "SIM PIN required"
+msgstr "Vyžadován SIM PIN"
+
+msgid "SIM PUK required"
+msgstr "Vyžadován SIM PUK"
+
+msgid "SIM failure"
+msgstr "Chyba SIM karty"
+
+msgid "SIM busy"
+msgstr "SIM karta je zaneprázdněna"
+
+msgid "SIM wrong"
+msgstr "Nesprávná SIM karta"
+
+msgid "SIM PIN2 required"
+msgstr "Vyžadován SIM PIN2"
+
+msgid "SIM PUK2 required"
+msgstr "Vyžadován SIM PUK2"
+
+msgid "Information read from the SIM card and device."
+msgstr "Informace načtené ze SIM karty a zařízení."
+
+msgid "No data"
+msgstr "Žádná data"
+
+msgid "Diagnostics"
+msgstr "Diagnostika"
+
+msgid "Modem(s) configuration"
+msgstr "Konfigurace modemu(ů)"
+
+msgid "Package configuration"
+msgstr "Konfigurace balíčku"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Spusťte různé příkazy pro ověření dat načtených z modemu a ladění skriptů."
+
+msgid "USB debug information"
+msgstr "Ladící informace USB"
+
+msgid "Check ttyX ports"
+msgstr "Zkontrolovat porty ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Zkontrolovat sériový a ecm režim"
+
+msgid "Check uqmi mode"
+msgstr "Zkontrolovat uqmi režim"
+
+msgid "Check ModemManager mode"
+msgstr "Zkontrolovat režim ModemManager"
+
+msgid "Clear"
+msgstr "Vyčistit"
+
+msgid "Download"
+msgstr "Stáhnout"
+
+msgid "Notes Update date"
+msgstr "Poznámky Datum aktualizace"
+
+msgid "Band"
+msgstr "Pásmo"
+
+msgid "Package update and support"
+msgstr "Aktualizace balíčku a podpora"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Nepodařilo se stáhnout soubor index.json z externího repozitáře."
+
+msgid "Failed to read downloaded file."
+msgstr "Nepodařilo se přečíst stažený soubor."
+
+msgid "Installed package is up to date."
+msgstr "Nainstalovaný balíček je aktuální."
+
+msgid "Update is available."
+msgstr "Aktualizace je k dispozici."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Soubor index.json neobsahoval žádné informace o balíčku."
+
+msgid "Error parsing version."
+msgstr "Chyba při parsování verze."
+
+msgid "Check repository"
+msgstr "Zkontrolovat repozitář"
+
+msgid "Package update..."
+msgstr "Aktualizace balíčku..."
+
+msgid "Report a bug"
+msgstr "Nahlásit chybu"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Napište do vlákna o balíčku na fóru eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Napsat na fórum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Nahlásit chybu na GitHub stránce balíčku"
+
+msgid "Open a package discussion on Github"
+msgstr "Otevřít diskusi o balíčku na GitHubu"
+
+msgid "Open discussion"
+msgstr "Otevřít diskusi"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Kupte kávu, pokud chcete podpořit vývoj projektu a autora"
+
+msgid "Buy a coffee"
+msgstr "Koupit kávu"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Staňte se sponzorem, pokud chcete podpořit vývoj projektu a autora"
+
+msgid "Become a sponsor"
+msgstr "Stát se sponzorem"
+
+msgid "Download package information from an external repository"
+msgstr "Stáhnout informace o balíčku z externího repozitáře"
+
+msgid "Add repository and download package update"
+msgstr "Přidat repozitář a stáhnout aktualizaci balíčku"
+
+msgid "Package Info"
+msgstr "Informace o balíčku"
+
+msgid "Compiled"
+msgstr "Zkompilováno"
+
+msgid "Repository Info"
+msgstr "Informace o repozitáři"
+
+msgid "Currently installed"
+msgstr "Aktuálně nainstalováno"
+
+msgid "Package in repository"
+msgstr "Balíček v repozitáři"
+
+msgid "Last repository check"
+msgstr "Poslední kontrola repozitáře"
+
+msgid "Poland"
+msgstr "Polsko"
+
+msgid "Force read by"
+msgstr "Vynutit čtení přes"
+
+msgid "Select method for reading data from the modem."
+msgstr "Vyberte metodu čtení dat z modemu."
+
+msgid "inactive"
+msgstr "neaktivní"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "Vynutit PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Vynutit čtení PLMN ze souboru."
+
+msgid "Command result"
+msgstr "Výsledek příkazu"
+
+msgid "Check"
+msgstr "Zkontrolovat"
+
+msgid "Auto update every:"
+msgstr "Automatická aktualizace každé:"
+
+msgid "2 seconds"
+msgstr "2 sekundy"
+
+msgid "3 seconds"
+msgstr "3 sekundy"
+
+msgid "5 seconds"
+msgstr "5 sekund"
+
+msgid "10 seconds"
+msgstr "10 sekund"
+
+msgid "30 seconds"
+msgstr "30 sekund"
+
+msgid "45 seconds"
+msgstr "45 sekund"
+
+msgid "60 seconds"
+msgstr "60 sekund"
+
+msgid "Refresh rate"
+msgstr "Obnovovací frekvence"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Nastavte, jak často se mají data na kartě Modem(y) obnovovat."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Nastavte, jak často se mají data na kartě Modem(y) obnovovat.
Důležité Ne "
+"každý modem / protokol dokáže se skripty komunikovat rychle. "
+"Příliš vysoká frekvence dotazování může způsobit zamrznutí modemu. ModemManager a uqmi potřebují na odpověď více času."
+
+msgid "Updating again in %s second(s)."
+msgstr "Opětovná aktualizace za %s sekund(u)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Čekejte prosím... probíhá sběr dat."
+
+msgid "Modems found"
+msgstr "Nalezené modemy"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Seznam nalezených modemů. Nemusí se zobrazit všechny modemy."
+
+msgid "Show modems found"
+msgstr "Zobrazit nalezené modemy"
+
+msgid "Show"
+msgstr "Zobrazit"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "V současné době jsou vyhledávány pouze modemy připojené přes USB."
+
+msgid "No Modems Detected..."
+msgstr "Nebyly detekovány žádné modemy..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ups.. v nastavení nejsou žádné modemy. Budete přesměrováni na kartu, kde můžete nainstalované modemy definovat."
+
+msgid "Redirecting..."
+msgstr "Přesměrování..."
+
+msgid "Redirecting in"
+msgstr "Přesměrování za"
+
+msgid "seconds..."
+msgstr "sekund..."
+
+msgid "(no data)"
+msgstr "(žádná data)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Zadejte platnou IP adresu ve formátu 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Povolena jsou pouze čísla a tečky"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Každá část musí být číslo od 0 do 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "V budoucnu vám tato karta umožní aktualizovat balíček z externího repozitáře %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Možnost se zobrazí po implementaci apk."
+
+msgid "Author (package maintainer)"
+msgstr "Autor (správce balíčku)"
+
+msgid "Modemdata Info"
+msgstr "Informace o modemdata"
+
+msgid "Modemdata Status"
+msgstr "Stav modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Informace o luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Přejděte na kartu Diagnostika a spusťte kontrolu skriptu. Nejčastěji je chyba způsobena neobvyklým názvem operátora. Chcete-li to napravit, vyberte možnost Vynutit PLMN ze souboru, pokud je k dispozici v možnostech konfigurace modemu."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Pokud data v LuCI nejsou viditelná a jsme si stoprocentně jisti, že modem byl správně definován/nakonfigurován."
+
+msgid "Suggested solution"
+msgstr "Navrhované řešení"
+
+msgid "Troubleshooting / Hints"
+msgstr "Řešení problémů / Tipy"
+
+msgid "Problem"
+msgstr "Problém"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Běžné problémy, které mohou nastat při používání balíčku, a způsoby jejich řešení."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Balíček nezobrazuje data pro modem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Modem je velmi citlivý na data čtená komunikačním portem. Výběr nesprávného komunikačního portu může způsobit zamrznutí nebo restart modemu."
+
+msgid "and"
+msgstr "a"
+
+msgid "packages are recommended for proper modem support."
+msgstr "balíčky jsou doporučeny pro správnou podporu modemu."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Vyberte prosím metodu čtení dat z modemu a nainstalujte potřebné balíčky."
+
+msgid "Required packages"
+msgstr "Vyžadované balíčky"
+
+msgid "Check required packages"
+msgstr "Zkontrolovat vyžadované balíčky"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Před konfigurací modemu zkontrolujte, zda jsou v systému nainstalovány všechny požadované balíčky."
+
+msgid "Loading package data…"
+msgstr "Načítání dat balíčku..."
+
+msgid "Waiting..."
+msgstr "Čekejte..."
+
+msgid "Show signal levels"
+msgstr "Zobrazit úrovně signálu"
+
+msgid "Primary band signal levels"
+msgstr "Úrovně signálu primárního pásma"
+
+msgid "Device is busy"
+msgstr "Zařízení je zaneprázdněno"
+
+msgid "Primary band"
+msgstr "Primární pásmo"
+
+msgid "Available options"
+msgstr "Dostupné možnosti"
+
+msgid "Device not found"
+msgstr "Zařízení nebylo nalezeno"
+
+msgid "Click to view Cell ID details"
+msgstr "Kliknutím zobrazíte podrobnosti o ID buňky"
+
+msgid "Cell ID (dec)"
+msgstr "Cell ID (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "Cell ID (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "Sector ID (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "Sector ID (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "Cell ID (hex) pro CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "Cell ID (dec) pro CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Informace o ID buňky"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Podrobné informace o ID buňky s formáty pro různé nástroje a aplikace."
+
+msgid "Information about package authors and available support options."
+msgstr "Informace o autorech balíčku a dostupných možnostech podpory."
+
+msgid "Package name"
+msgstr "Název balíčku"
+
+msgid "Proper Modem Configuration."
+msgstr "Správná konfigurace modemu."
+
+msgid "User should remember:"
+msgstr "Uživatel by měl mít na paměti:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Pro konkrétní modem by měl být nastaven pouze jeden protokol pro komunikaci s modemem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Pouze jeden balíček může číst data z modemu (ve stejnou dobu)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Příliš časté čtení dat z modemu může způsobit jeho zamrznutí (MM a uqmi potřebují více času)."
+
+msgid "BTS search: no response from server."
+msgstr "Vyhledávání BTS: server neodpovídá."
+
+msgid "BTS search: no results found."
+msgstr "Vyhledávání BTS: nebyly nalezeny žádné výsledky."
+
+msgid "this month"
+msgstr "tento měsíc"
+
+msgid "month ago"
+msgstr "před měsícem"
+
+msgid "months ago"
+msgstr "měsíci"
+
+msgid "Station ID"
+msgstr "ID stanice"
+
+msgid "Confirmed"
+msgstr "Potvrzeno"
+
+msgid "Updated"
+msgstr "Aktualizováno"
+
+msgid "Show on map"
+msgstr "Zobrazit na mapě"
+
+msgid "Download data"
+msgstr "Stáhnout data"
+
+msgid "Install curl"
+msgstr "Nainstalovat curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Poznámka: Balíček je plně kompatibilní s nejnovější, třetí generací webu BTSearch."
+
+msgid "Skip package verification"
+msgstr "Přeskočit ověření balíčků"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Povolením této možnosti přeskočíte kontrolu nainstalovaných balíčků a budete moci vybrat libovolnou metodu ze seznamu níže."
diff --git a/modemdata/luci-app-modemdata/po/da/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/da/luci-app-modemdata.po
new file mode 100644
index 000000000..df20a7a8e
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/da/luci-app-modemdata.po
@@ -0,0 +1,742 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "For mere information om modemdata-pakken, besøg venligst: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Pakken giver brugeren mulighed for at se de data, der læses fra modemmet, for at se parametrene for forbindelsen til mobilnetværket."
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl forum"
+
+msgid "Signal strength"
+msgstr "Signalstyrke"
+
+msgid "Modem(s)"
+msgstr "Modem(er)"
+
+msgid "Ups.. no modems detected."
+msgstr "Ups.. ingen modemer fundet."
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid "General Information"
+msgstr "Generel information"
+
+msgid "Modem Information"
+msgstr "Modeminformation"
+
+msgid "Cell Information"
+msgstr "Celleinformation"
+
+msgid "Connection"
+msgstr "Forbindelse"
+
+msgid "Technology"
+msgstr "Teknologi"
+
+msgid "Operator"
+msgstr "Operatør"
+
+msgid "Location"
+msgstr "Placering"
+
+msgid "Sent"
+msgstr "Sendt"
+
+msgid "Connection time"
+msgstr "Forbindelsestid"
+
+msgid "Modem type"
+msgstr "Modemtype"
+
+msgid "Hide data."
+msgstr "Skjul data."
+
+msgid "Hide selected data"
+msgstr "Skjul valgte data"
+
+msgid "Additional information"
+msgstr "Yderligere information"
+
+msgid "Revision / FW"
+msgstr "Revision / FW"
+
+msgid "IP adress / Port"
+msgstr "IP-adresse / Port"
+
+msgid "Chip Temperature"
+msgstr "Chiptemperatur"
+
+msgid "Configuration modemdata package"
+msgstr "Konfiguration af modemdata-pakke"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Konfigurationspanel til modemdata og GUI-applikation."
+
+msgid "Add data to hide"
+msgstr "Tilføj data, der skal skjules"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Indtast de data, du gerne vil skjule, f.eks. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Åbn side"
+
+msgid "Download data (experimental)"
+msgstr "Download data (eksperimentel)"
+
+msgid "Network"
+msgstr "Netværk"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "IP-adresse / Port til kommunikation med modemmet"
+
+msgid "Defined modems"
+msgstr "Definerede modemer"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Grænseflade til at definere de tilgængelige modemer. Listen over modemer vil gøre det nemmere for brugeren at skifte mellem modemer i LuCI."
+
+msgid "Settings"
+msgstr "Indstillinger"
+
+msgid "Add new modem settings..."
+msgstr "Tilføj nye modemindstillinger..."
+
+msgid "Modem Settings"
+msgstr "Modemindstillinger"
+
+msgid "Manufacturer / Product"
+msgstr "Producent / Produkt"
+
+msgid "Please select a modem"
+msgstr "Vælg venligst et modem"
+
+msgid "IP adress / Port for communication"
+msgstr "IP-adresse / Port til kommunikation"
+
+msgid "Protocol"
+msgstr "Protokol"
+
+msgid "Port for communication"
+msgstr "Port til kommunikation"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Vælg venligst en QMI/MBIM-port"
+
+msgid "Modem id"
+msgstr "Modem-id"
+
+msgid "Please select a modem id"
+msgstr "Vælg venligst et modem-id"
+
+msgid "MBIM device"
+msgstr "MBIM-enhed"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Vælg, hvis du vil læse fra MBIM."
+
+msgid "Assigned interface"
+msgstr "Tildelt grænseflade"
+
+msgid "Interface assigned to modem."
+msgstr "Grænseflade tildelt modemmet."
+
+msgid "Enter IP adress"
+msgstr "Indtast IP-adresse"
+
+msgid "IP adress"
+msgstr "IP-adresse"
+
+msgid "Reading data via"
+msgstr "Læser data via"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Port / IP / Modem-identifikator"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Indtast modemnavn manuelt, hvis det foreslåede navn ikke er "
+"indlysende.
Vigtigt Modemnavnet søges kun for modemer, der er tilsluttet via USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Vælg metode til læsning af data fra modemmet.
seriel port: Vælg en af de tilgængelige "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN-porte.
ModemManager: Vælg "
+"en af de søgte modem-identifikatorer."
+
+msgid "Please select a port"
+msgstr "Vælg venligst en port"
+
+msgid "User description"
+msgstr "Brugerbeskrivelse"
+
+msgid "Optional"
+msgstr "Valgfri"
+
+msgid "User description (optional)"
+msgstr "Brugerbeskrivelse (valgfri)"
+
+msgid "Excellent"
+msgstr "Fremragende"
+
+msgid "Good"
+msgstr "God"
+
+msgid "Fair"
+msgstr "Rimelig"
+
+msgid "Poor"
+msgstr "Dårlig"
+
+msgid "Physical cell ID"
+msgstr "Fysisk celle-ID"
+
+msgid "Bandwidth"
+msgstr "Båndbredde"
+
+msgid "SIM status"
+msgstr "SIM-status"
+
+msgid "Not registered"
+msgstr "Ikke registreret"
+
+msgid "Registered, home"
+msgstr "Registreret, hjemmenetværk"
+
+msgid "Registered (roaming)"
+msgstr "Registreret (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registreret, kun SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registreret (roaming), kun SMS"
+
+msgid "Searching.."
+msgstr "Søger..."
+
+msgid "Connection state"
+msgstr "Forbindelsestilstand"
+
+msgid "Connected"
+msgstr "Forbundet"
+
+msgid "Disconnected"
+msgstr "Afbrudt"
+
+msgid "Registering denied"
+msgstr "Registrering afvist"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Vent her på at læse data fra modemmet..."
+
+msgid "Waiting for data..."
+msgstr "Venter på data..."
+
+msgid "BTS Search"
+msgstr "BTS-søgning"
+
+msgid "BTS Information"
+msgstr "BTS-information"
+
+msgid "Search"
+msgstr "Søg"
+
+msgid "Bands"
+msgstr "Bånd"
+
+msgid "Search BTS"
+msgstr "Søg efter BTS"
+
+msgid "BTS search settings"
+msgstr "BTS-søgeindstillinger"
+
+msgid "Website to search for BTS"
+msgstr "Websted til at søge efter BTS"
+
+msgid "Select a website for searching."
+msgstr "Vælg et websted til søgning."
+
+msgid "Install a package using package manager"
+msgstr "Installer en pakke ved hjælp af pakkestyring"
+
+msgid "Select an action after clicking the search button."
+msgstr "Vælg en handling efter at have klikket på søgeknappen."
+
+msgid "Install iconv"
+msgstr "Installer iconv"
+
+msgid "Install qmi-utils"
+msgstr "Installer qmi-utils"
+
+msgid "SIM Slot"
+msgstr "SIM-slot"
+
+msgid "SIM Card"
+msgstr "SIM-kort"
+
+msgid "Slot in use"
+msgstr "Slot i brug"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Problem med at registrere til netværket, tjek SIM-kortet."
+
+msgid "SIM PIN required"
+msgstr "SIM PIN påkrævet"
+
+msgid "SIM PUK required"
+msgstr "SIM PUK påkrævet"
+
+msgid "SIM failure"
+msgstr "SIM-fejl"
+
+msgid "SIM busy"
+msgstr "SIM optaget"
+
+msgid "SIM wrong"
+msgstr "Forkert SIM-kort"
+
+msgid "SIM PIN2 required"
+msgstr "SIM PIN2 påkrævet"
+
+msgid "SIM PUK2 required"
+msgstr "SIM PUK2 påkrævet"
+
+msgid "Information read from the SIM card and device."
+msgstr "Information læst fra SIM-kortet og enheden."
+
+msgid "No data"
+msgstr "Ingen data"
+
+msgid "Diagnostics"
+msgstr "Diagnostik"
+
+msgid "Modem(s) configuration"
+msgstr "Modem-konfiguration"
+
+msgid "Package configuration"
+msgstr "Pakkekonfiguration"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Kør forskellige kommandoer for at verificere data læst fra modemmet og fejlfinde skripter."
+
+msgid "USB debug information"
+msgstr "USB-fejlfindingsinformation"
+
+msgid "Check ttyX ports"
+msgstr "Tjek ttyX-porte"
+
+msgid "Check serial and ecm mode"
+msgstr "Tjek seriel og ecm-tilstand"
+
+msgid "Check uqmi mode"
+msgstr "Tjek uqmi-tilstand"
+
+msgid "Check ModemManager mode"
+msgstr "Tjek ModemManager-tilstand"
+
+msgid "Clear"
+msgstr "Ryd"
+
+msgid "Download"
+msgstr "Download"
+
+msgid "Notes Update date"
+msgstr "Noter Opdateringsdato"
+
+msgid "Band"
+msgstr "Bånd"
+
+msgid "Package update and support"
+msgstr "Pakkeopdatering og support"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Kunne ikke downloade index.json-filen fra eksternt arkiv."
+
+msgid "Failed to read downloaded file."
+msgstr "Kunne ikke læse den downloadede fil."
+
+msgid "Installed package is up to date."
+msgstr "Den installerede pakke er opdateret."
+
+msgid "Update is available."
+msgstr "Opdatering er tilgængelig."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Index.json-filen indeholdt ikke nogen pakkeinformation."
+
+msgid "Error parsing version."
+msgstr "Fejl ved tolkning af version."
+
+msgid "Check repository"
+msgstr "Tjek arkiv"
+
+msgid "Package update..."
+msgstr "Pakkeopdatering..."
+
+msgid "Report a bug"
+msgstr "Rapporter en fejl"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Skriv i emnet om pakken på forummet eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Skriv på forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Rapporter en fejl på pakkens GitHub-side"
+
+msgid "Open a package discussion on Github"
+msgstr "Åbn en pakkediskussion på GitHub"
+
+msgid "Open discussion"
+msgstr "Åbn diskussion"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Køb en kaffe, hvis du vil støtte udviklingen af projektet og forfatteren"
+
+msgid "Buy a coffee"
+msgstr "Køb en kaffe"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Bliv sponsor, hvis du vil støtte udviklingen af projektet og forfatteren"
+
+msgid "Become a sponsor"
+msgstr "Bliv sponsor"
+
+msgid "Download package information from an external repository"
+msgstr "Download pakkeinformation fra et eksternt arkiv"
+
+msgid "Add repository and download package update"
+msgstr "Tilføj arkiv og download pakkeopdatering"
+
+msgid "Package Info"
+msgstr "Pakkeinfo"
+
+msgid "Compiled"
+msgstr "Kompileret"
+
+msgid "Repository Info"
+msgstr "Arkivinfo"
+
+msgid "Currently installed"
+msgstr "I øjeblikket installeret"
+
+msgid "Package in repository"
+msgstr "Pakke i arkiv"
+
+msgid "Last repository check"
+msgstr "Sidste arkivtjek"
+
+msgid "Poland"
+msgstr "Polen"
+
+msgid "Force read by"
+msgstr "Tving læsning via"
+
+msgid "Select method for reading data from the modem."
+msgstr "Vælg metode til læsning af data fra modemmet."
+
+msgid "inactive"
+msgstr "inaktiv"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "Tving PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Tving læsning af PLMN fra fil."
+
+msgid "Command result"
+msgstr "Kommandoresultat"
+
+msgid "Check"
+msgstr "Tjek"
+
+msgid "Auto update every:"
+msgstr "Automatisk opdatering for hver:"
+
+msgid "2 seconds"
+msgstr "2 sekunder"
+
+msgid "3 seconds"
+msgstr "3 sekunder"
+
+msgid "5 seconds"
+msgstr "5 sekunder"
+
+msgid "10 seconds"
+msgstr "10 sekunder"
+
+msgid "30 seconds"
+msgstr "30 sekunder"
+
+msgid "45 seconds"
+msgstr "45 sekunder"
+
+msgid "60 seconds"
+msgstr "60 sekunder"
+
+msgid "Refresh rate"
+msgstr "Opdateringshastighed"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Indstil hvor ofte dataene skal opdateres i fanen Modem(er)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Indstil hvor ofte dataene skal opdateres i fanen Modem(er).
Vigtigt Ikke "
+"alle modemer / protokoller kan kommunikere hurtigt med skripter. "
+"For høj en polling-hastighed kan fryse modemmet. ModemManager og uqmi har brug for mere tid til at svare."
+
+msgid "Updating again in %s second(s)."
+msgstr "Opdaterer igen om %s sekund(er)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Vent venligst... dataindsamling er i gang."
+
+msgid "Modems found"
+msgstr "Fundne modemer"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Liste over fundne modemer. Det er ikke sikkert, at alle modemer vises."
+
+msgid "Show modems found"
+msgstr "Vis fundne modemer"
+
+msgid "Show"
+msgstr "Vis"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "I øjeblikket søges der kun efter modemer, der er tilsluttet via USB."
+
+msgid "No Modems Detected..."
+msgstr "Ingen modemer fundet..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ups.. der er ingen modemer i indstillingerne. Du vil blive videresendt til en fane, hvor du kan definere de installerede modemer."
+
+msgid "Redirecting..."
+msgstr "Viderestiller..."
+
+msgid "Redirecting in"
+msgstr "Viderestiller om"
+
+msgid "seconds..."
+msgstr "sekunder..."
+
+msgid "(no data)"
+msgstr "(ingen data)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Indtast en gyldig IP-adresse i formatet 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Kun numre og prikker er tilladt"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Hver del skal være et tal fra 0 to 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "I fremtiden vil denne fane tillade dig at opdatere pakken fra %sRafał (IceG) eksternt arkiv%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Muligheden vil dukke op efter apk-implementering."
+
+msgid "Author (package maintainer)"
+msgstr "Forfatter (pakkeansvarlig)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata-info"
+
+msgid "Modemdata Status"
+msgstr "Modemdata-status"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata info"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Gå til fanen Diagnostik og kør et skript-tjek. Oftest skyldes fejlen et mærkeligt operatørnavn. For at løse dette skal du vælge muligheden Tving PLMN fra fil, hvis den er tilgængelig i modemmets konfigurationsmuligheder."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Hvis data i LuCI ikke er synlige, og vi er 100% sikre på, at modemmet er blevet defineret/konfigureret korrekt."
+
+msgid "Suggested solution"
+msgstr "Foreslået løsning"
+
+msgid "Troubleshooting / Hints"
+msgstr "Fejlfinding / Tip"
+
+msgid "Problem"
+msgstr "Problem"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Almindelige problemer, der kan opstå ved brug af pakken, og måder at løse dem på."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Pakken viser ikke data for Fibocom FM350-GL-modemmet."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Modemmet er meget følsomt over for data, der læses af kommunikationsporten. Valg af forkert kommunikationsport kan få modemmet til at fryse eller genstarte."
+
+msgid "and"
+msgstr "og"
+
+msgid "packages are recommended for proper modem support."
+msgstr "-pakker anbefales for korrekt modemunderstøttelse."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Vælg venligst metode til at læse data fra modemmet og installer de nødvendige pakker."
+
+msgid "Required packages"
+msgstr "Påkrævede pakker"
+
+msgid "Check required packages"
+msgstr "Tjek påkrævede pakker"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Før du konfigurerer modemmet, skal du tjekke, om alle påkrævede pakker er installeret i systemet."
+
+msgid "Loading package data…"
+msgstr "Indlæser pakkedata…"
+
+msgid "Waiting..."
+msgstr "Venter..."
+
+msgid "Show signal levels"
+msgstr "Vis signalniveauer"
+
+msgid "Primary band signal levels"
+msgstr "Signalniveauer for primært bånd"
+
+msgid "Device is busy"
+msgstr "Enheden er optaget"
+
+msgid "Primary band"
+msgstr "Primært bånd"
+
+msgid "Available options"
+msgstr "Tilgængelige muligheder"
+
+msgid "Device not found"
+msgstr "Enhed ikke fundet"
+
+msgid "Click to view Cell ID details"
+msgstr "Klik for at se detaljer om celle-ID"
+
+msgid "Cell ID (dec)"
+msgstr "Celle-ID (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "Celle-ID (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB-ID (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "Sektor-ID (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB-ID (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "Sektor-ID (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "Celle-ID (hex) til CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "Celle-ID (dec) til CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Information om celle-ID"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Detaljeret celle-ID-information med formater til forskellige værktøjer og applikationer."
+
+msgid "Information about package authors and available support options."
+msgstr "Information om pakkeforfattere og tilgængelige supportmuligheder."
+
+msgid "Package name"
+msgstr "Pakkenavn"
+
+msgid "Proper Modem Configuration."
+msgstr "Korrekt modemkonfiguration."
+
+msgid "User should remember:"
+msgstr "Brugeren skal huske:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. For et specifikt modem bør der kun indstilles én protokol til kommunikation med modemmet."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Kun én pakke kan læse data fra modemmet (samtidigt)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Læsning af data fra modemmet for ofte kan få det til at fryse (MM og uqmi har brug for mere tid)."
+
+msgid "BTS search: no response from server."
+msgstr "BTS-søgning: intet svar fra server."
+
+msgid "BTS search: no results found."
+msgstr "BTS-søgning: ingen resultater fundet."
+
+msgid "this month"
+msgstr "denne måned"
+
+msgid "month ago"
+msgstr "en måned siden"
+
+msgid "months ago"
+msgstr "måneder siden"
+
+msgid "Station ID"
+msgstr "Stations-ID"
+
+msgid "Confirmed"
+msgstr "Bekræftet"
+
+msgid "Updated"
+msgstr "Opdateret"
+
+msgid "Show on map"
+msgstr "Vis på kort"
+
+msgid "Download data"
+msgstr "Download data"
+
+msgid "Install curl"
+msgstr "Installer curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Bemærk: Pakken er fuldt kompatibel med den seneste, tredje generation af BTSearch-webstedet."
+
+msgid "Skip package verification"
+msgstr "Spring pakkeverificering over"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Aktivér denne indstilling for at springe kontrol af installerede pakker over og tillade valg af enhver metode fra listen nedenfor."
diff --git a/modemdata/luci-app-modemdata/po/de/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/de/luci-app-modemdata.po
new file mode 100644
index 000000000..aa3126f45
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/de/luci-app-modemdata.po
@@ -0,0 +1,649 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: de\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Weitere Informationen zum modemdata-Paket finden Sie unter: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Das Paket ermöglicht es dem Benutzer, die vom Modem gelesenen Daten anzuzeigen und die Parameter der Verbindung zum Mobilfunknetz einzusehen."
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl Forum"
+
+msgid "Signal strength"
+msgstr "Signalstärke"
+
+msgid "Modem(s)"
+msgstr "Modem(s)"
+
+msgid "Ups.. no modems detected."
+msgstr "Ups.. keine Modems erkannt."
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid "General Information"
+msgstr "Allgemeine Informationen"
+
+msgid "Modem Information"
+msgstr "Modem-Informationen"
+
+msgid "Cell Information"
+msgstr "Zelleninformationen"
+
+msgid "Connection"
+msgstr "Verbindung"
+
+msgid "Technology"
+msgstr "Technologie"
+
+msgid "Operator"
+msgstr "Betreiber"
+
+msgid "Location"
+msgstr "Standort"
+
+msgid "Sent"
+msgstr "Gesendet"
+
+msgid "Signal strength"
+msgstr "Signalstärke"
+
+msgid "Connection time"
+msgstr "Verbindungszeit"
+
+msgid "Modem type"
+msgstr "Modemtyp"
+
+msgid "Hide data."
+msgstr "Daten ausblenden."
+
+msgid "Hide selected data"
+msgstr "Ausgewählte Daten ausblenden"
+
+msgid "Additional information"
+msgstr "Zusätzliche Informationen"
+
+msgid "Revision / FW"
+msgstr "Revision / FW"
+
+msgid "IP adress / Port"
+msgstr "IP-Adresse / Port"
+
+msgid "Chip Temperature"
+msgstr "Chip-Temperatur"
+
+msgid "Configuration modemdata package"
+msgstr "Konfiguration des modemdata-Pakets"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Konfigurationspanel für modemdata und GUI-Anwendung."
+
+msgid "Add data to hide"
+msgstr "Daten zum Ausblenden hinzufügen"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Geben Sie die Daten ein, die Sie ausblenden möchten, z.B. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Seite öffnen"
+
+msgid "Download data (experimental)"
+msgstr "Daten herunterladen (experimentell)"
+
+msgid "Network"
+msgstr "Netzwerk"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "IP-Adresse / Port für die Kommunikation mit dem Modem"
+
+msgid "Defined modems"
+msgstr "Definierte Modems"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Schnittstelle zur Definition der verfügbaren Modems. Die Modemliste erleichtert dem Benutzer das Wechseln zwischen Modems in LuCI."
+
+msgid "Settings"
+msgstr "Einstellungen"
+
+msgid "Add new modem settings..."
+msgstr "Neue Modem-Einstellungen hinzufügen..."
+
+msgid "Modem Settings"
+msgstr "Modem-Einstellungen"
+
+msgid "Manufacturer / Product"
+msgstr "Hersteller / Produkt"
+
+msgid "Please select a modem"
+msgstr "Bitte wählen Sie ein Modem aus"
+
+msgid "IP adress / Port for communication"
+msgstr "IP-Adresse / Port für die Kommunikation"
+
+msgid "Protocol"
+msgstr "Protokoll"
+
+msgid "Port for communication"
+msgstr "Port für die Kommunikation"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Bitte wählen Sie einen QMI/MBIM-Port aus"
+
+msgid "Modem id"
+msgstr "Modem-ID"
+
+msgid "Please select a modem id"
+msgstr "Bitte wählen Sie eine Modem-ID aus"
+
+msgid "MBIM device"
+msgstr "MBIM-Gerät"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Wählen Sie aus, wenn Sie von MBIM lesen möchten."
+
+msgid "Assigned interface"
+msgstr "Zugewiesene Schnittstelle"
+
+msgid "Interface assigned to modem."
+msgstr "Dem Modem zugewiesene Schnittstelle."
+
+msgid "Enter IP adress"
+msgstr "IP-Adresse eingeben"
+
+msgid "IP adress"
+msgstr "IP-Adresse"
+
+msgid "Reading data via"
+msgstr "Daten lesen über"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Port / IP / Modem-Kennung"
+
+msgid "Interface assigned to modem."
+msgstr "Dem Modem zugewiesene Schnittstelle."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Geben Sie den Modemnamen manuell ein, wenn der vorgeschlagene Name nicht "
+"eindeutig ist.
Wichtig Der Modemname wird nur für über USB verbundene Modems gesucht."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Wählen Sie die Methode zum Lesen von Daten vom Modem aus.
Serieller Port: Wählen Sie einen der verfügbaren "
+"Ports ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Geben Sie die IP-Adresse 192.168.X.X ein, unter der das Modem (Huawei) "
+"verfügbar ist.
uqmi: Wählen Sie einen der verfügbaren cdc-wdmX-Ports.
ModemManager: Wählen Sie "
+"eine der gesuchten Modem-Kennungen aus."
+
+msgid "Please select a port"
+msgstr "Bitte wählen Sie einen Port aus"
+
+msgid "User description"
+msgstr "Benutzerbeschreibung"
+
+msgid "Optional"
+msgstr "Optional"
+
+msgid "User description (optional)"
+msgstr "Benutzerbeschreibung (optional)"
+
+msgid "Signal strength"
+msgstr "Signalstärke"
+
+msgid "Excellent"
+msgstr "Ausgezeichnet"
+
+msgid "Good"
+msgstr "Gut"
+
+msgid "Fair"
+msgstr "Ausreichend"
+
+msgid "Poor"
+msgstr "Schwach"
+
+msgid "Physical cell ID"
+msgstr "Physische Zell-ID"
+
+msgid "Bandwidth"
+msgstr "Bandbreite"
+
+msgid "SIM status"
+msgstr "SIM-Status"
+
+msgid "Not registered"
+msgstr "Nicht registriert"
+
+msgid "Registered, home"
+msgstr "Registriert, Heimnetz"
+
+msgid "Registered (roaming)"
+msgstr "Registriert (Roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registriert, nur SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registriert (Roaming), nur SMS"
+
+msgid "Searching.."
+msgstr "Suche läuft.."
+
+msgid "Connection state"
+msgstr "Verbindungsstatus"
+
+msgid "Connected"
+msgstr "Verbunden"
+
+msgid "Disconnected"
+msgstr "Getrennt"
+
+msgid "Registering denied"
+msgstr "Registrierung verweigert"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Warte auf Daten vom Modem..."
+
+msgid "Waiting for data..."
+msgstr "Warte auf Daten..."
+
+msgid "BTS Search"
+msgstr "BTS-Suche"
+
+msgid "BTS Information"
+msgstr "BTS-Informationen"
+
+msgid "Search"
+msgstr "Suchen"
+
+msgid "Bands"
+msgstr "Bänder"
+
+msgid "Search BTS"
+msgstr "BTS suchen"
+
+msgid "BTS search settings"
+msgstr "BTS-Sucheinstellungen"
+
+msgid "Website to search for BTS"
+msgstr "Website zur BTS-Suche"
+
+msgid "Select a website for searching."
+msgstr "Wählen Sie eine Website für die Suche aus."
+
+msgid "Install the iconv package"
+msgstr "Installieren Sie das iconv-Paket"
+
+msgid "Support"
+msgstr "Unterstützung"
+
+msgid "Diagnostic"
+msgstr "Diagnose"
+
+msgid "Update"
+msgstr "Aktualisierung"
+
+msgid "About"
+msgstr "Über"
+
+msgid "Donate"
+msgstr "Spenden"
+
+msgid "Run diagnostics on the modemdata package to check for common issues and configuration problems."
+msgstr "Führen Sie eine Diagnose des modemdata-Pakets durch, um häufige Probleme und Konfigurationsprobleme zu überprüfen."
+
+msgid "Diagnostic Tools"
+msgstr "Diagnose-Tools"
+
+msgid "Run script check"
+msgstr "Skriptprüfung ausführen"
+
+msgid "Display modem information"
+msgstr "Modem-Informationen anzeigen"
+
+msgid "Executing command..."
+msgstr "Befehl wird ausgeführt..."
+
+msgid "Modem status"
+msgstr "Modem-Status"
+
+msgid "Please wait..."
+msgstr "Bitte warten..."
+
+msgid "Current package version"
+msgstr "Aktuelle Paketversion"
+
+msgid "Become a sponsor"
+msgstr "Sponsor werden"
+
+msgid "Download package information from an external repository"
+msgstr "Paketinformationen aus einem externen Repository herunterladen"
+
+msgid "Add repository and download package update"
+msgstr "Repository hinzufügen und Paketaktualisierung herunterladen"
+
+msgid "Package Info"
+msgstr "Paketinformationen"
+
+msgid "Compiled"
+msgstr "Kompiliert"
+
+msgid "Repository Info"
+msgstr "Repository-Informationen"
+
+msgid "Currently installed"
+msgstr "Aktuell installiert"
+
+msgid "Package in repository"
+msgstr "Paket im Repository"
+
+msgid "Last repository check"
+msgstr "Letzte Repository-Prüfung"
+
+msgid "Poland"
+msgstr "Polen"
+
+msgid "Force read by"
+msgstr "Lesen erzwingen durch"
+
+msgid "Select method for reading data from the modem."
+msgstr "Wählen Sie die Methode zum Lesen von Daten vom Modem aus."
+
+msgid "inactive"
+msgstr "inaktiv"
+
+msgid "ModemMenager"
+msgstr "Modem-Manager"
+
+msgid "Force PLMN"
+msgstr "PLMN erzwingen"
+
+msgid "Force reading PLMN from file."
+msgstr "PLMN-Lesen aus Datei erzwingen."
+
+msgid "Command result"
+msgstr "Befehlsergebnis"
+
+msgid "Check"
+msgstr "Prüfen"
+
+msgid "Auto update every:"
+msgstr "Automatische Aktualisierung alle:"
+
+msgid "2 seconds"
+msgstr "2 Sekunden"
+
+msgid "3 seconds"
+msgstr "3 Sekunden"
+
+msgid "5 seconds"
+msgstr "5 Sekunden"
+
+msgid "10 seconds"
+msgstr "10 Sekunden"
+
+msgid "30 seconds"
+msgstr "30 Sekunden"
+
+msgid "45 seconds"
+msgstr "45 Sekunden"
+
+msgid "60 seconds"
+msgstr "60 Sekunden"
+
+msgid "Refresh rate"
+msgstr "Aktualisierungsrate"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Legen Sie fest, wie oft die Daten auf der Registerkarte Modem(s) aktualisiert werden sollen."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Legen Sie fest, wie oft die Daten auf der Registerkarte Modem(s) aktualisiert werden sollen.
Wichtig Nicht "
+"jedes Modem / Protokoll kann schnell mit Skripten kommunizieren. "
+"Eine zu hohe Abfragerate kann das Modem einfrieren lassen. ModemManager und uqmi benötigen mehr Zeit zum Antworten."
+
+msgid "Updating again in %s second(s)."
+msgstr "Erneute Aktualisierung in %s Sekunde(n)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Bitte warten... Datenerfassung läuft."
+
+msgid "Modems found"
+msgstr "Modems gefunden"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Liste der gefundenen Modems. Möglicherweise werden nicht alle Modems angezeigt."
+
+msgid "Show modems found"
+msgstr "Gefundene Modems anzeigen"
+
+msgid "Show"
+msgstr "Anzeigen"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Derzeit werden nur über USB verbundene Modems gesucht."
+
+msgid "No Modems Detected..."
+msgstr "Keine Modems erkannt..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ups.. es sind keine Modems in den Einstellungen vorhanden. Sie werden zu einer Registerkarte weitergeleitet, auf der Sie die installierten Modem(s) definieren können."
+
+msgid "Redirecting..."
+msgstr "Weiterleitung..."
+
+msgid "Redirecting in"
+msgstr "Weiterleitung in"
+
+msgid "seconds..."
+msgstr "Sekunden..."
+
+msgid "(no data)"
+msgstr "(keine Daten)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Geben Sie eine gültige IP-Adresse im Format 192.168.X.X ein"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Nur Zahlen und Punkte sind erlaubt"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Jeder Teil muss eine Zahl von 0 bis 255 sein"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "In Zukunft ermöglicht die Registerkarte die Aktualisierung des Pakets aus dem externen Repository von %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Die Option wird nach der apk-Implementierung erscheinen."
+
+msgid "Author (package maintainer)"
+msgstr "Autor (Paket-Maintainer)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata-Info"
+
+msgid "Modemdata Status"
+msgstr "Modemdata-Status"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata-Informationen"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Gehen Sie zur Registerkarte Diagnose und führen Sie eine Skriptprüfung durch. Meistens wird der Fehler durch einen seltsamen Betreibernamen verursacht. Um dies zu beheben, wählen Sie die Option PLMN aus Datei erzwingen, falls diese in den Modem-Konfigurationsoptionen verfügbar ist."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Wenn Daten in LuCI nicht sichtbar sind und wir zu 100 % sicher sind, dass das Modem korrekt definiert/konfiguriert wurde."
+
+msgid "Suggested solution"
+msgstr "Vorgeschlagene Lösung"
+
+msgid "Troubleshooting / Hints"
+msgstr "Fehlerbehebung / Hinweise"
+
+msgid "Problem"
+msgstr "Problem"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Häufige Probleme, die bei der Verwendung des Pakets auftreten können, und Lösungswege."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Das Paket zeigt keine Daten für das Fibocom FM350-GL-Modem an."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Das Modem ist sehr empfindlich gegenüber Daten, die über den Kommunikationsport gelesen werden. Die Auswahl des falschen Kommunikationsports kann zum Einfrieren oder Neustart des Modems führen."
+
+msgid "and"
+msgstr "und"
+
+msgid "packages are recommended for proper modem support."
+msgstr "Pakete werden für die ordnungsgemäße Modem-Unterstützung empfohlen."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Bitte wählen Sie die Methode zum Lesen von Daten vom Modem aus und installieren Sie die erforderlichen Pakete."
+
+msgid "Required packages"
+msgstr "Erforderliche Pakete"
+
+msgid "Check required packages"
+msgstr "Erforderliche Pakete prüfen"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Überprüfen Sie vor der Konfiguration des Modems, ob alle erforderlichen Pakete im System installiert sind."
+
+msgid "Loading package data…"
+msgstr "Paketdaten werden geladen…"
+
+msgid "Waiting..."
+msgstr "Warten..."
+
+msgid "Show signal levels"
+msgstr "Signalpegel anzeigen"
+
+msgid "Primary band signal levels"
+msgstr "Signalpegel des primären Bandes"
+
+msgid "Device is busy"
+msgstr "Gerät ist beschäftigt"
+
+msgid "Primary band"
+msgstr "Primäres Band"
+
+msgid "Available options"
+msgstr "Verfügbare Optionen"
+
+msgid "Device not found"
+msgstr "Gerät nicht gefunden"
+
+msgid "Click to view Cell ID details"
+msgstr "Klicken Sie, um Zell-ID-Details anzuzeigen"
+
+msgid "Cell ID (dec)"
+msgstr "Zell-ID (dez)"
+
+msgid "Cell ID (hex)"
+msgstr "Zell-ID (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB-ID (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "Sektor-ID (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB-ID (dez)"
+
+msgid "Sector ID (dec)"
+msgstr "Sektor-ID (dez)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "Zell-ID (hex) für CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "Zell-ID (dez) für CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Zell-ID-Informationen"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Detaillierte Zell-ID-Informationen mit Formaten für verschiedene Tools und Anwendungen."
+
+msgid "Information about package authors and available support options."
+msgstr "Informationen über Paketautoren und verfügbare Support-Optionen."
+
+msgid "Package name"
+msgstr "Paketname"
+
+msgid "Proper Modem Configuration."
+msgstr "Richtige Modem-Konfiguration."
+
+msgid "User should remember:"
+msgstr "Benutzer sollte beachten:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Für ein bestimmtes Modem sollte nur ein Protokoll für die Kommunikation mit dem Modem festgelegt werden."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Nur ein Paket kann Daten vom Modem lesen (gleichzeitig)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Zu häufiges Lesen von Daten vom Modem kann zum Einfrieren führen (MM und uqmi benötigen mehr Zeit)."
+
+msgid "BTS search: no response from server."
+msgstr "BTS-Suche: Keine Antwort vom Server."
+
+msgid "BTS search: no results found."
+msgstr "BTS-Suche: Keine Ergebnisse gefunden."
+
+msgid "this month"
+msgstr "diesen Monat"
+
+msgid "month ago"
+msgstr "vor einem Monat"
+
+msgid "months ago"
+msgstr "vor Monaten"
+
+msgid "Station ID"
+msgstr "Stations-ID"
+
+msgid "Confirmed"
+msgstr "Bestätigt"
+
+msgid "Updated"
+msgstr "Aktualisiert"
+
+msgid "Show on map"
+msgstr "Auf Karte anzeigen"
+
+msgid "Download data"
+msgstr "Daten herunterladen"
+
+msgid "Install curl"
+msgstr "curl installieren"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Hinweis: Das Paket ist vollständig kompatibel mit der neuesten Version der BTSearch-Website der dritten Generation."
+
+msgid "Skip package verification"
+msgstr "Paketüberprüfung überspringen"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Aktivieren Sie diese Option, um die Überprüfung installierter Pakete zu überspringen und die Auswahl einer beliebigen Methode aus der untenstehenden Liste zu ermöglichen."
diff --git a/modemdata/luci-app-modemdata/po/es/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/es/luci-app-modemdata.po
new file mode 100644
index 000000000..a8e7513c3
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/es/luci-app-modemdata.po
@@ -0,0 +1,742 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: es\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Para obtener más información sobre el paquete modemdata, visite %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "El paquete permite al usuario ver los datos leídos del módem y los parámetros de la conexión a la red móvil."
+
+msgid "eko.one.pl forum"
+msgstr "foro eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Intensidad de señal"
+
+msgid "Modem(s)"
+msgstr "Módem(s)"
+
+msgid "Ups.. no modems detected."
+msgstr "Vaya.. no se detectaron módems."
+
+msgid "Configuration"
+msgstr "Configuración"
+
+msgid "General Information"
+msgstr "Información general"
+
+msgid "Modem Information"
+msgstr "Información del módem"
+
+msgid "Cell Information"
+msgstr "Información de celda"
+
+msgid "Connection"
+msgstr "Conexión"
+
+msgid "Technology"
+msgstr "Tecnología"
+
+msgid "Operator"
+msgstr "Operador"
+
+msgid "Location"
+msgstr "Ubicación"
+
+msgid "Sent"
+msgstr "Enviado"
+
+msgid "Connection time"
+msgstr "Tiempo de conexión"
+
+msgid "Modem type"
+msgstr "Tipo de módem"
+
+msgid "Hide data."
+msgstr "Ocultar datos."
+
+msgid "Hide selected data"
+msgstr "Ocultar datos seleccionados"
+
+msgid "Additional information"
+msgstr "Información adicional"
+
+msgid "Revision / FW"
+msgstr "Revisión / FW"
+
+msgid "IP adress / Port"
+msgstr "Dirección IP / Puerto"
+
+msgid "Chip Temperature"
+msgstr "Temperatura del chip"
+
+msgid "Configuration modemdata package"
+msgstr "Configuración del paquete modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Panel de configuración para el paquete modemdata y la interfaz gráfica."
+
+msgid "Add data to hide"
+msgstr "Agregar datos a ocultar"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Ingrese los datos que desea ocultar, p. ej. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Abrir página"
+
+msgid "Download data (experimental)"
+msgstr "Descargar datos (experimental)"
+
+msgid "Network"
+msgstr "Red"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Dirección IP / Puerto para la comunicación con el módem"
+
+msgid "Defined modems"
+msgstr "Módems definidos"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interfaz para definir los módems disponibles. La lista de módems facilitará al usuario cambiar entre módems en LuCI."
+
+msgid "Settings"
+msgstr "Configuración"
+
+msgid "Add new modem settings..."
+msgstr "Agregar nueva configuración de módem..."
+
+msgid "Modem Settings"
+msgstr "Configuración del módem"
+
+msgid "Manufacturer / Product"
+msgstr "Fabricante / Producto"
+
+msgid "Please select a modem"
+msgstr "Por favor, seleccione un módem"
+
+msgid "IP adress / Port for communication"
+msgstr "Dirección IP / Puerto para la comunicación"
+
+msgid "Protocol"
+msgstr "Protocolo"
+
+msgid "Port for communication"
+msgstr "Puerto para la comunicación"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Por favor, seleccione un puerto QMI/MBIM"
+
+msgid "Modem id"
+msgstr "ID del módem"
+
+msgid "Please select a modem id"
+msgstr "Por favor, seleccione un ID de módem"
+
+msgid "MBIM device"
+msgstr "Dispositivo MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Seleccione si desea leer desde MBIM."
+
+msgid "Assigned interface"
+msgstr "Interfaz asignada"
+
+msgid "Interface assigned to modem."
+msgstr "Interfaz asignada al módem."
+
+msgid "Enter IP adress"
+msgstr "Ingrese la dirección IP"
+
+msgid "IP adress"
+msgstr "Dirección IP"
+
+msgid "Reading data via"
+msgstr "Lectura de datos a través de"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Puerto / IP / Identificador de módem"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Ingrese el nombre del módem manualmente si el nombre sugerido no es "
+"obvio.
Importante El nombre del módem solo se busca para módems conectados por USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Seleccione el método de lectura de datos del módem.
puerto serie: Seleccione uno de los puertos disponibles "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Ingrese la dirección IP 192.168.X.X bajo la cual el módem (Huawei) "
+"está disponible.
uqmi: Seleccione uno de los puertos cdc-wdmX disponibles.
ModemManager: Seleccione "
+"uno de los identificadores de módem encontrados."
+
+msgid "Please select a port"
+msgstr "Por favor, seleccione un puerto"
+
+msgid "User description"
+msgstr "Descripción del usuario"
+
+msgid "Optional"
+msgstr "Opcional"
+
+msgid "User description (optional)"
+msgstr "Descripción del usuario (opcional)"
+
+msgid "Excellent"
+msgstr "Excelente"
+
+msgid "Good"
+msgstr "Bueno"
+
+msgid "Fair"
+msgstr "Regular"
+
+msgid "Poor"
+msgstr "Débil"
+
+msgid "Physical cell ID"
+msgstr "ID de celda física"
+
+msgid "Bandwidth"
+msgstr "Ancho de banda"
+
+msgid "SIM status"
+msgstr "Estado de la SIM"
+
+msgid "Not registered"
+msgstr "No registrado"
+
+msgid "Registered, home"
+msgstr "Registrado, red local"
+
+msgid "Registered (roaming)"
+msgstr "Registrado (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registrado, solo SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registrado (roaming), solo SMS"
+
+msgid "Searching.."
+msgstr "Buscando.."
+
+msgid "Connection state"
+msgstr "Estado de la conexión"
+
+msgid "Connected"
+msgstr "Conectado"
+
+msgid "Disconnected"
+msgstr "Desconectado"
+
+msgid "Registering denied"
+msgstr "Registro denegado"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Esperando leer datos del módem..."
+
+msgid "Waiting for data..."
+msgstr "Esperando datos..."
+
+msgid "BTS Search"
+msgstr "Búsqueda de BTS"
+
+msgid "BTS Information"
+msgstr "Información de BTS"
+
+msgid "Search"
+msgstr "Buscar"
+
+msgid "Bands"
+msgstr "Bandas"
+
+msgid "Search BTS"
+msgstr "Buscar BTS"
+
+msgid "BTS search settings"
+msgstr "Configuración de búsqueda BTS"
+
+msgid "Website to search for BTS"
+msgstr "Sitio web para buscar BTS"
+
+msgid "Select a website for searching."
+msgstr "Seleccione un sitio web para la búsqueda."
+
+msgid "Install a package using package manager"
+msgstr "Instalar un paquete usando el gestor de paquetes"
+
+msgid "Select an action after clicking the search button."
+msgstr "Seleccione una acción después de hacer clic en el botón de búsqueda."
+
+msgid "Install iconv"
+msgstr "Instalar iconv"
+
+msgid "Install qmi-utils"
+msgstr "Instalar qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Ranura SIM"
+
+msgid "SIM Card"
+msgstr "Tarjeta SIM"
+
+msgid "Slot in use"
+msgstr "Ranura en uso"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Problema al registrarse en la red, compruebe la tarjeta SIM."
+
+msgid "SIM PIN required"
+msgstr "Se requiere PIN de la SIM"
+
+msgid "SIM PUK required"
+msgstr "Se requiere PUK de la SIM"
+
+msgid "SIM failure"
+msgstr "Fallo de la SIM"
+
+msgid "SIM busy"
+msgstr "SIM ocupada"
+
+msgid "SIM wrong"
+msgstr "SIM incorrecta"
+
+msgid "SIM PIN2 required"
+msgstr "Se requiere PIN2 de la SIM"
+
+msgid "SIM PUK2 required"
+msgstr "Se requiere PUK2 de la SIM"
+
+msgid "Information read from the SIM card and device."
+msgstr "Información leída de la tarjeta SIM y del dispositivo."
+
+msgid "No data"
+msgstr "Sin datos"
+
+msgid "Diagnostics"
+msgstr "Diagnósticos"
+
+msgid "Modem(s) configuration"
+msgstr "Configuración de módem(s)"
+
+msgid "Package configuration"
+msgstr "Configuración del paquete"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Ejecute varios comandos para verificar los datos leídos del módem y depurar scripts."
+
+msgid "USB debug information"
+msgstr "Información de depuración USB"
+
+msgid "Check ttyX ports"
+msgstr "Comprobar puertos ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Comprobar modo serial y ecm"
+
+msgid "Check uqmi mode"
+msgstr "Comprobar modo uqmi"
+
+msgid "Check ModemManager mode"
+msgstr "Comprobar modo ModemManager"
+
+msgid "Clear"
+msgstr "Limpiar"
+
+msgid "Download"
+msgstr "Descargar"
+
+msgid "Notes Update date"
+msgstr "Notas Fecha de actualización"
+
+msgid "Band"
+msgstr "Banda"
+
+msgid "Package update and support"
+msgstr "Actualización y soporte del paquete"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "No se pudo descargar el archivo index.json del repositorio externo."
+
+msgid "Failed to read downloaded file."
+msgstr "No se pudo leer el archivo descargado."
+
+msgid "Installed package is up to date."
+msgstr "El paquete instalado está actualizado."
+
+msgid "Update is available."
+msgstr "Hay una actualización disponible."
+
+msgid "The index.json file did not contain any package information."
+msgstr "El archivo index.json no contenía ninguna información del paquete."
+
+msgid "Error parsing version."
+msgstr "Error al analizar la versión."
+
+msgid "Check repository"
+msgstr "Comprobar repositorio"
+
+msgid "Package update..."
+msgstr "Actualizar paquete..."
+
+msgid "Report a bug"
+msgstr "Reportar un error"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Escriba en el tema del paquete en el foro eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Escribir en el foro"
+
+msgid "Report a bug on the package Github page"
+msgstr "Reportar un error en la página de Github del paquete"
+
+msgid "Open a package discussion on Github"
+msgstr "Abrir una discusión sobre el paquete en Github"
+
+msgid "Open discussion"
+msgstr "Abrir discusión"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Invita un café si deseas apoyar el desarrollo del proyecto y al autor"
+
+msgid "Buy a coffee"
+msgstr "Invitar un café"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Conviértete en patrocinador si deseas apoyar el desarrollo del proyecto y al autor"
+
+msgid "Become a sponsor"
+msgstr "Convertirse en patrocinador"
+
+msgid "Download package information from an external repository"
+msgstr "Descargar información del paquete desde un repositorio externo"
+
+msgid "Add repository and download package update"
+msgstr "Agregar repositorio y descargar actualización del paquete"
+
+msgid "Package Info"
+msgstr "Información del paquete"
+
+msgid "Compiled"
+msgstr "Compilado"
+
+msgid "Repository Info"
+msgstr "Información del repositorio"
+
+msgid "Currently installed"
+msgstr "Actualmente instalado"
+
+msgid "Package in repository"
+msgstr "Paquete en repositorio"
+
+msgid "Last repository check"
+msgstr "Última comprobación del repositorio"
+
+msgid "Poland"
+msgstr "Polonia"
+
+msgid "Force read by"
+msgstr "Forzar lectura por"
+
+msgid "Select method for reading data from the modem."
+msgstr "Seleccione el método de lectura de datos del módem."
+
+msgid "inactive"
+msgstr "inactivo"
+
+msgid "ModemMenager"
+msgstr "Administrador de módems"
+
+msgid "Force PLMN"
+msgstr "Forzar PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Forzar la lectura del PLMN desde el archivo."
+
+msgid "Command result"
+msgstr "Resultado del comando"
+
+msgid "Check"
+msgstr "Comprobar"
+
+msgid "Auto update every:"
+msgstr "Actualización automática cada:"
+
+msgid "2 seconds"
+msgstr "2 segundos"
+
+msgid "3 seconds"
+msgstr "3 segundos"
+
+msgid "5 seconds"
+msgstr "5 segundos"
+
+msgid "10 seconds"
+msgstr "10 segundos"
+
+msgid "30 seconds"
+msgstr "30 segundos"
+
+msgid "45 seconds"
+msgstr "45 segundos"
+
+msgid "60 seconds"
+msgstr "60 segundos"
+
+msgid "Refresh rate"
+msgstr "Frecuencia de actualización"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Configure con qué frecuencia se deben actualizar los datos en la pestaña Módem(s)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Configure con qué frecuencia se deben actualizar los datos en la pestaña Módem(s).
Importante No "
+"todos los módems / protocolos pueden comunicarse rápidamente con los scripts. "
+"Una tasa de sondeo demasiado alta puede bloquear el módem. ModemManager y uqmi necesitan más tiempo para responder."
+
+msgid "Updating again in %s second(s)."
+msgstr "Actualizando de nuevo en %s segundo(s)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Por favor espere... la recopilación de datos está en progreso."
+
+msgid "Modems found"
+msgstr "Módems encontrados"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Lista de módems encontrados. Es posible que no se muestren todos los módems."
+
+msgid "Show modems found"
+msgstr "Mostrar módems encontrados"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Actualmente, solo se buscan módems conectados por USB."
+
+msgid "No Modems Detected..."
+msgstr "No se detectaron módems..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Vaya... no hay módems en la configuración. Será redirigido a una pestaña donde puede definir el/los módem(s) instalado(s)."
+
+msgid "Redirecting..."
+msgstr "Redirigiendo..."
+
+msgid "Redirecting in"
+msgstr "Redirigiendo en"
+
+msgid "seconds..."
+msgstr "segundos..."
+
+msgid "(no data)"
+msgstr "(sin datos)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Ingrese una dirección IP válida en el formato 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Solo se permiten números y puntos"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Cada parte debe ser un número del 0 al 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "En el futuro, esta pestaña permitirá actualizar el paquete desde el repositorio externo de %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "La opción aparecerá tras la implementación de apk."
+
+msgid "Author (package maintainer)"
+msgstr "Autor (mantenedor del paquete)"
+
+msgid "Modemdata Info"
+msgstr "Información de Modemdata"
+
+msgid "Modemdata Status"
+msgstr "Estado de Modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Información de luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Vaya a la pestaña Diagnósticos y ejecute una comprobación de script. La mayoría de las veces, el error es causado por un nombre de operador inusual. Para solucionarlo, seleccione la opción Forzar PLMN desde archivo si está disponible en las opciones de configuración del módem."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Si los datos en LuCI no son visibles y estamos 100% seguros de que el módem ha sido definido/configurado correctamente."
+
+msgid "Suggested solution"
+msgstr "Solución sugerida"
+
+msgid "Troubleshooting / Hints"
+msgstr "Solución de problemas / Sugerencias"
+
+msgid "Problem"
+msgstr "Problema"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Problemas comunes que pueden surgir al usar el paquete y formas de resolverlos."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "El paquete no muestra datos para el módem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "El módem es muy sensible a los datos leídos por el puerto de comunicación. Seleccionar el puerto de comunicación incorrecto puede causar que el módem se congele o reinicie."
+
+msgid "and"
+msgstr "y"
+
+msgid "packages are recommended for proper modem support."
+msgstr "los paquetes son recomendados para el correcto soporte del módem."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Por favor seleccione el método de lectura de datos del módem e instale los paquetes necesarios."
+
+msgid "Required packages"
+msgstr "Paquetes requeridos"
+
+msgid "Check required packages"
+msgstr "Comprobar paquetes requeridos"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Antes de configurar el módem, compruebe si todos los paquetes requeridos están instalados en el sistema."
+
+msgid "Loading package data…"
+msgstr "Cargando datos del paquete…"
+
+msgid "Waiting..."
+msgstr "Esperando..."
+
+msgid "Show signal levels"
+msgstr "Mostrar niveles de señal"
+
+msgid "Primary band signal levels"
+msgstr "Niveles de señal de la banda primaria"
+
+msgid "Device is busy"
+msgstr "El dispositivo está ocupado"
+
+msgid "Primary band"
+msgstr "Banda primaria"
+
+msgid "Available options"
+msgstr "Opciones disponibles"
+
+msgid "Device not found"
+msgstr "Dispositivo no encontrado"
+
+msgid "Click to view Cell ID details"
+msgstr "Haga clic para ver los detalles del ID de celda"
+
+msgid "Cell ID (dec)"
+msgstr "ID de celda (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "ID de celda (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID de sector (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "ID de sector (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID de celda (hex) para CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID de celda (dec) para CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Información del ID de celda"
+
+msgid "Modem"
+msgstr "Módem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Información detallada del ID de celda en formatos para diferentes herramientas y aplicaciones."
+
+msgid "Information about package authors and available support options."
+msgstr "Información sobre los autores del paquete y las opciones de soporte disponibles."
+
+msgid "Package name"
+msgstr "Nombre del paquete"
+
+msgid "Proper Modem Configuration."
+msgstr "Configuración correcta del módem."
+
+msgid "User should remember:"
+msgstr "El usuario debe recordar:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Para un módem específico, solo debe establecerse un protocolo de comunicación con el módem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Solo un paquete puede leer datos del módem (al mismo tiempo)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Leer datos del módem con demasiada frecuencia puede causar que se congele (MM y uqmi necesitan más tiempo)."
+
+msgid "BTS search: no response from server."
+msgstr "Búsqueda BTS: sin respuesta del servidor."
+
+msgid "BTS search: no results found."
+msgstr "Búsqueda BTS: no se encontraron resultados."
+
+msgid "this month"
+msgstr "este mes"
+
+msgid "month ago"
+msgstr "hace un mes"
+
+msgid "months ago"
+msgstr "hace meses"
+
+msgid "Station ID"
+msgstr "ID de estación"
+
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgid "Updated"
+msgstr "Actualizado"
+
+msgid "Show on map"
+msgstr "Mostrar en el mapa"
+
+msgid "Download data"
+msgstr "Descargar datos"
+
+msgid "Install curl"
+msgstr "Instalar curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Nota: El paquete es totalmente compatible con la última versión de tercera generación del sitio web BTSearch."
+
+msgid "Skip package verification"
+msgstr "Omitir verificación de paquetes"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Active esta opción para omitir la comprobación de los paquetes instalados y permitir seleccionar cualquier método de la lista siguiente."
diff --git a/modemdata/luci-app-modemdata/po/fr/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/fr/luci-app-modemdata.po
new file mode 100644
index 000000000..45c37d22e
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/fr/luci-app-modemdata.po
@@ -0,0 +1,766 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: fr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Pour plus d'informations sur le paquet modemdata, veuillez visiter : %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Le paquet permet à l'utilisateur de visualiser les données lues depuis le modem, d'afficher les paramètres de connexion au réseau mobile."
+
+msgid "eko.one.pl forum"
+msgstr "forum eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Force du signal"
+
+msgid "Modem(s)"
+msgstr "Modem(s)"
+
+msgid "Ups.. no modems detected."
+msgstr "Oups.. aucun modem détecté."
+
+msgid "Configuration"
+msgstr "Configuration"
+
+msgid "General Information"
+msgstr "Informations générales"
+
+msgid "Modem Information"
+msgstr "Informations sur le modem"
+
+msgid "Cell Information"
+msgstr "Informations sur le réseau"
+
+msgid "Connection"
+msgstr "Connexion"
+
+msgid "Technology"
+msgstr "Technologie"
+
+msgid "Operator"
+msgstr "Opérateur"
+
+msgid "Location"
+msgstr "Localisation"
+
+msgid "Sent"
+msgstr "Envoyé"
+
+msgid "Signal strength"
+msgstr "Force du signal"
+
+msgid "Connection time"
+msgstr "Temps de connexion"
+
+msgid "Modem type"
+msgstr "Type de modem"
+
+msgid "Hide data."
+msgstr "Masquer les données."
+
+msgid "Hide selected data"
+msgstr "Masquer les données sélectionnées"
+
+msgid "Additional information"
+msgstr "Informations supplémentaires"
+
+msgid "Revision / FW"
+msgstr "Révision / FW"
+
+msgid "IP adress / Port"
+msgstr "Adresse IP / Port"
+
+msgid "Chip Temperature"
+msgstr "Température du circuit"
+
+msgid "Configuration modemdata package"
+msgstr "Configuration du paquet modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Panneau de configuration pour le paquet modemdata et l'interface utilisateur."
+
+msgid "Add data to hide"
+msgstr "Ajouter des données à masquer"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Entrez les données que vous souhaitez masquer, par ex. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Ouvrir la page"
+
+msgid "Download data (experimental)"
+msgstr "Télécharger les données (expérimental)"
+
+msgid "Network"
+msgstr "Réseau"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Adresse IP / Port pour la communication avec le modem"
+
+msgid "Defined modems"
+msgstr "Modems définis"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interface permettant de définir les modems disponibles. La liste des modems facilitera le basculement entre les modems dans LuCI."
+
+msgid "Settings"
+msgstr "Paramètres"
+
+msgid "Add new modem settings..."
+msgstr "Ajouter les paramètres d'un nouveau modem..."
+
+msgid "Modem Settings"
+msgstr "Paramètres du modem"
+
+msgid "Manufacturer / Product"
+msgstr "Fabricant / Produit"
+
+msgid "Please select a modem"
+msgstr "Veuillez sélectionner un modem"
+
+msgid "IP adress / Port for communication"
+msgstr "Adresse IP / Port pour la communication"
+
+msgid "Protocol"
+msgstr "Protocole"
+
+msgid "Port for communication"
+msgstr "Port pour la communication"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Veuillez sélectionner un port QMI/MBIM"
+
+msgid "Modem id"
+msgstr "Identification du modem"
+
+msgid "Please select a modem id"
+msgstr "Veuillez sélectionner un id de modem"
+
+msgid "MBIM device"
+msgstr "Périphérique MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Sélectionnez si vous souhaitez lire depuis MBIM."
+
+msgid "Assigned interface"
+msgstr "Interface assignée"
+
+msgid "Interface assigned to modem."
+msgstr "Interface assigned to modem."
+
+msgid "Enter IP adress"
+msgstr "Entrez l'adresse IP du modem"
+
+msgid "IP adress"
+msgstr "Adresse IP"
+
+msgid "Reading data via"
+msgstr "Lecture des données via"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Port / Adresse IP / Id du modem"
+
+msgid "Interface assigned to modem."
+msgstr "Interface assignée au modem."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Entrez le nom du modem manuellement si le nom suggéré n'est pas "
+"évident.
Important Le nom du modem n'est recherché que pour les modems connectés via USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Sélectionnez la méthode de lecture des données depuis le modem.
port série : Sélectionnez l'un des "
+"ports ttyUSBX / ttyACMx / wwan0atX / mhi_DUN disponibles.
ecm : Entrez l'adresse IP 192.168.X.X sous laquelle le modem (Huawei) "
+"est disponible.
uqmi : Sélectionnez l'un des ports cdc-wdmX disponibles.
Gestionnaire de modem : Sélectionnez "
+"l'un des identifiants de modem recherchés."
+
+msgid "Please select a port"
+msgstr "Veuillez sélectionner un port"
+
+msgid "User description"
+msgstr "Description de l'utilisateur"
+
+msgid "Optional"
+msgstr "Optionnel"
+
+msgid "User description (optional)"
+msgstr "Description de l'utilisateur (optionnel)"
+
+msgid "Signal strength"
+msgstr "Force du signal"
+
+msgid "Excellent"
+msgstr "Excellent"
+
+msgid "Good"
+msgstr "Bon"
+
+msgid "Fair"
+msgstr "Moyen"
+
+msgid "Poor"
+msgstr "Faible"
+
+msgid "Physical cell ID"
+msgstr "ID phys. de cellule"
+
+msgid "Bandwidth"
+msgstr "Largeur"
+
+msgid "SIM status"
+msgstr "Statut SIM"
+
+msgid "Not registered"
+msgstr "Non enregistrée sur le réseau"
+
+msgid "Registered, home"
+msgstr "Enregistrée sur le réseau local"
+
+msgid "Registered (roaming)"
+msgstr "Enregistrée sur le réseau (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Enregistrée sur le réseau, SMS uniquement"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Enregistrée sur le réseau (roaming), SMS uniquement"
+
+msgid "Searching.."
+msgstr "Recherche.."
+
+msgid "Connection state"
+msgstr "État de connexion"
+
+msgid "Connected"
+msgstr "Connecté"
+
+msgid "Disconnected"
+msgstr "Déconnecté"
+
+msgid "Registering denied"
+msgstr "Enregistrement refusé"
+
+msgid "Waiting to read data from the modem..."
+msgstr "En attente de lecture des données depuis le modem..."
+
+msgid "Waiting for data..."
+msgstr "En attente de données..."
+
+msgid "BTS Search"
+msgstr "Localisation de la station de base"
+
+msgid "BTS Information"
+msgstr "Informations sur la station de base"
+
+msgid "Search"
+msgstr "Rechercher"
+
+msgid "Bands"
+msgstr "Bandes"
+
+msgid "Search BTS"
+msgstr "Rechercher BTS"
+
+msgid "BTS search settings"
+msgstr "Paramètres de recherche de station de base"
+
+msgid "Website to search for BTS"
+msgstr "Site web pour rechercher BTS"
+
+msgid "Select a website for searching."
+msgstr "Sélectionnez un site web pour la recherche."
+
+msgid "Install library to support polish characters"
+msgstr "Installer la bibliothèque pour prendre en charge les caractères polonais"
+
+msgid "Open the selected BTS search site in a new tab"
+msgstr "Ouvrir le site de recherche BTS sélectionné dans un nouvel onglet"
+
+msgid "Open BTS search site"
+msgstr "Ouvrir le site de recherche BTS"
+
+msgid "Show BTS data from external source"
+msgstr "Afficher les données BTS depuis une source externe"
+
+msgid "Collect BTS information..."
+msgstr "Collecter les informations BTS..."
+
+msgid "Downloading data, please wait..."
+msgstr "Téléchargement des données, veuillez patienter..."
+
+msgid "BTS coordinates"
+msgstr "Coordonnées BTS"
+
+msgid "Distance"
+msgstr "Distance"
+
+msgid "Direction"
+msgstr "Direction"
+
+msgid "Update"
+msgstr "Mise à jour"
+
+msgid "No coordinates available"
+msgstr "Aucune coordonnée disponible"
+
+msgid "No data"
+msgstr "Aucune donnée"
+
+msgid "GPS Information"
+msgstr "Informations GPS"
+
+msgid "GPS Position"
+msgstr "Position GPS"
+
+msgid "GPS Data"
+msgstr "Données GPS"
+
+msgid "Latitude"
+msgstr "Latitude"
+
+msgid "Longitude"
+msgstr "Longitude"
+
+msgid "Altitude"
+msgstr "Altitude"
+
+msgid "Speed"
+msgstr "Vitesse"
+
+msgid "Course"
+msgstr "Cap"
+
+msgid "Fix Mode"
+msgstr "Mode de positionnement"
+
+msgid "Satellites"
+msgstr "Satellites"
+
+msgid "GPS Time"
+msgstr "Heure GPS"
+
+msgid "HDOP"
+msgstr "HDOP"
+
+msgid "VDOP"
+msgstr "VDOP"
+
+msgid "PDOP"
+msgstr "PDOP"
+
+msgid "Open in Google Maps"
+msgstr "Ouvrir dans Google Maps"
+
+msgid "Open in OpenStreetMap"
+msgstr "Ouvrir dans OpenStreetMap"
+
+msgid "GPS module is not available"
+msgstr "Le module GPS n'est pas disponible"
+
+msgid "Waiting for GPS data..."
+msgstr "En attente des données GPS..."
+
+msgid "No position fix"
+msgstr "Aucune position fixée"
+
+msgid "2D Fix"
+msgstr "Positionnement 2D"
+
+msgid "3D Fix"
+msgstr "Positionnement 3D"
+
+msgid "Diagnostics"
+msgstr "Diagnostics"
+
+msgid "Modem diagnostic commands"
+msgstr "Commandes de diagnostic du modem"
+
+msgid "Check connection"
+msgstr "Vérifier la connexion"
+
+msgid "Check script"
+msgstr "Vérifier le script"
+
+msgid "Test communication with modem"
+msgstr "Tester la communication avec le modem"
+
+msgid "Verify modem communication script"
+msgstr "Vérifier le script de communication avec le modem"
+
+msgid "Running diagnostics..."
+msgstr "Exécution des diagnostics..."
+
+msgid "Test connection result"
+msgstr "Résultat du test de connexion"
+
+msgid "Script check result"
+msgstr "Résultat de la vérification du script"
+
+msgid "Success"
+msgstr "Succès"
+
+msgid "Failed"
+msgstr "Échec"
+
+msgid "Error details"
+msgstr "Détails de l'erreur"
+
+msgid "Communication OK"
+msgstr "Communication OK"
+
+msgid "Communication failed"
+msgstr "Communication échouée"
+
+msgid "Script is working correctly"
+msgstr "Le script fonctionne correctement"
+
+msgid "Script error detected"
+msgstr "Erreur de script détectée"
+
+msgid "Support / Help"
+msgstr "Support / Aide"
+
+msgid "Package Information and Support Options"
+msgstr "Informations sur le paquet et options de support"
+
+msgid "Buy a coffee"
+msgstr "Offrir un café"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Offrez un café si vous souhaitez soutenir le développement du projet et l'auteur"
+
+msgid "Become a sponsor"
+msgstr "Devenir sponsor"
+
+msgid "Download package information from an external repository"
+msgstr "Télécharger les informations sur le paquet depuis un dépôt externe"
+
+msgid "Add repository and download package update"
+msgstr "Ajouter le dépôt et télécharger la mise à jour du paquet"
+
+msgid "Package Info"
+msgstr "Informations sur le paquet"
+
+msgid "Compiled"
+msgstr "Compilé"
+
+msgid "Repository Info"
+msgstr "Données du dépôt"
+
+msgid "Currently installed"
+msgstr "Actuellement installé"
+
+msgid "Package in repository"
+msgstr "Disponible dans le dépôt"
+
+msgid "Last repository check"
+msgstr "Dernière vérification du dépôt"
+
+msgid "Poland"
+msgstr "Pologne"
+
+msgid "Force read by"
+msgstr "Forcer la lecture par"
+
+msgid "Select method for reading data from the modem."
+msgstr "Sélectionnez la méthode de lecture des données depuis le modem."
+
+msgid "inactive"
+msgstr "inactif"
+
+msgid "ModemMenager"
+msgstr "Gestionnaire de modem"
+
+msgid "Force PLMN"
+msgstr "Forcer PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Forcer la lecture du PLMN depuis le fichier."
+
+msgid "Command result"
+msgstr "Résultat de la commande"
+
+msgid "Check"
+msgstr "Vérifier"
+
+msgid "Auto update every:"
+msgstr "Mise à jour automatique toutes les :"
+
+msgid "2 seconds"
+msgstr "2 secondes"
+
+msgid "3 seconds"
+msgstr "3 secondes"
+
+msgid "5 seconds"
+msgstr "5 secondes"
+
+msgid "10 seconds"
+msgstr "10 secondes"
+
+msgid "30 seconds"
+msgstr "30 secondes"
+
+msgid "45 seconds"
+msgstr "45 secondes"
+
+msgid "60 seconds"
+msgstr "60 secondes"
+
+msgid "Refresh rate"
+msgstr "Fréquence de rafraîchissement"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Définir la fréquence de rafraîchissement des données dans l'onglet Modem(s)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Définir la fréquence de rafraîchissement des données dans l'onglet Modem(s).
Important Tous "
+"les modems / protocoles ne peuvent pas communiquer rapidement avec les scripts. "
+"Une fréquence d'interrogation trop élevée peut bloquer le modem. ModemManager et uqmi nécessitent plus de temps pour répondre."
+
+msgid "Updating again in %s second(s)."
+msgstr "Mise à jour à nouveau dans %s seconde(s)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Veuillez patienter... la collecte de données est en cours."
+
+msgid "Modems found"
+msgstr "Modems trouvés"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Liste des modems trouvés. Tous les modems peuvent ne pas être affichés."
+
+msgid "Show modems found"
+msgstr "Afficher les modems trouvés"
+
+msgid "Show"
+msgstr "Afficher"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Actuellement, seuls les modems connectés via USB sont recherchés."
+
+msgid "No Modems Detected..."
+msgstr "Aucun modem détecté..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Oups... il n'y a pas de modems dans les paramètres. Vous allez être redirigé vers un onglet où vous pourrez définir le(s) modem(s) installé(s)."
+
+msgid "Redirecting..."
+msgstr "Redirection..."
+
+msgid "Redirecting in"
+msgstr "Redirection dans"
+
+msgid "seconds..."
+msgstr "secondes..."
+
+msgid "(no data)"
+msgstr "(aucune donnée)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Entrez une adresse IP valide au format 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Seuls les chiffres et les points sont autorisés."
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Chaque partie doit être un nombre de 0 à 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "À l'avenir, l'onglet permettra de mettre à jour le paquet depuis le dépôt externe de %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "L'option apparaîtra après l'implémentation d'apk."
+
+msgid "Author (package maintainer)"
+msgstr "Auteur (mainteneur du paquet)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata info"
+
+msgid "Modemdata Status"
+msgstr "Modemdata status"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Informations sur le paquet luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Accédez à l'onglet Diagnostics et exécutez une vérification du script. Le plus souvent, l'erreur est causée par un nom d'opérateur étrange. Pour corriger cela, sélectionnez l'option Forcer PLMN depuis le fichier si elle est disponible dans les options de configuration du modem."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Si les données dans LuCI ne sont pas visibles, et que nous sommes sûrs à 100% que le modem a été défini/configuré correctement."
+
+msgid "Suggested solution"
+msgstr "Solution suggérée"
+
+msgid "Troubleshooting / Hints"
+msgstr "Dépannage / Conseils"
+
+msgid "Problem"
+msgstr "Problème"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Problèmes courants pouvant survenir lors de l'utilisation du paquet, et moyens de les résoudre."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Le paquet n'affiche pas de données pour le modem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Le modem est très sensible à la lecture des données par le port de communication. La sélection du mauvais port de communication peut entraîner le blocage ou le redémarrage du modem."
+
+msgid "and"
+msgstr "et"
+
+msgid "packages are recommended for proper modem support."
+msgstr "paquets sont recommandés pour un support approprié du modem."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Veuillez sélectionner la méthode de lecture des données depuis le modem et installer les paquets nécessaires."
+
+msgid "Required packages"
+msgstr "Paquets requis"
+
+msgid "Check required packages"
+msgstr "Vérifier les paquets requis"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Avant de configurer le modem, vérifiez si tous les paquets requis sont installés dans le système."
+
+msgid "Loading package data…"
+msgstr "Chargement des données..."
+
+msgid "Waiting..."
+msgstr "Patientez..."
+
+msgid "Show signal levels"
+msgstr "Afficher les niveaux de signal"
+
+msgid "Primary band signal levels"
+msgstr "Niveaux de signal pour la bande primaire"
+
+msgid "Device is busy"
+msgstr "L'appareil est occupé"
+
+msgid "Primary band"
+msgstr "Bande primaire"
+
+msgid "Available options"
+msgstr "Options disponibles"
+
+msgid "Device not found"
+msgstr "Appareil non trouvé"
+
+msgid "Click to view Cell ID details"
+msgstr "Cliquer pour afficher les détails de l'ID de cellule"
+
+msgid "Cell ID (dec)"
+msgstr "ID de cellule (déc)"
+
+msgid "Cell ID (hex)"
+msgstr "ID de cellule (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID de secteur (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (déc)"
+
+msgid "Sector ID (dec)"
+msgstr "ID de secteur (déc)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID de cellule (hex) pour le site CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID de cellule (déc) pour le site CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Informations sur l'ID de cellule"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Informations détaillées sur l'ID de cellule dans des formats pour différents outils et applications."
+
+msgid "Information about package authors and available support options."
+msgstr "Informations sur les auteurs et les options de support disponibles."
+
+msgid "Package name"
+msgstr "Nom du paquet"
+
+msgid "Proper Modem Configuration."
+msgstr "Configuration correcte du modem."
+
+msgid "User should remember:"
+msgstr "L'utilisateur doit se rappeler :"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Pour un modem spécifique, un seul protocole doit être défini pour la communication avec le modem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Un seul paquet peut lire les données du modem (en même temps)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. La lecture trop fréquente des données du modem peut le bloquer (MM et uqmi nécessitent plus de temps)."
+
+msgid "BTS search: no response from server."
+msgstr "Recherche BTS : aucune réponse du serveur."
+
+msgid "BTS search: no results found."
+msgstr "Recherche BTS : aucun résultat trouvé."
+
+msgid "this month"
+msgstr "ce mois-ci"
+
+msgid "month ago"
+msgstr "il y a un mois"
+
+msgid "months ago"
+msgstr "il y a plusieurs mois"
+
+msgid "Station ID"
+msgstr "ID de la station"
+
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgid "Updated"
+msgstr "Mis à jour"
+
+msgid "Show on map"
+msgstr "Afficher sur la carte"
+
+msgid "Download data"
+msgstr "Télécharger les données"
+
+msgid "Install curl"
+msgstr "Installer curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Remarque : Le package est entièrement compatible avec la dernière version de troisième génération du site Web BTSearch."
+
+msgid "Skip package verification"
+msgstr "Ignorer la vérification des paquets"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Activez cette option pour ignorer la vérification des paquets installés et permettre de sélectionner n'importe quelle méthode dans la liste ci-dessous."
diff --git a/modemdata/luci-app-modemdata/po/it/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/it/luci-app-modemdata.po
new file mode 100644
index 000000000..b17bec518
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/it/luci-app-modemdata.po
@@ -0,0 +1,768 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: lt\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Per maggiori informazione sul pacchetto modemdata, visita %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Il pacchetto permette all'utente di vedere i dati letti dal modem, mostrando i parametri di connessione del network mobile."
+
+msgid "eko.one.pl forum"
+msgstr "forum eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Potenza segnale"
+
+msgid "Modem(s)"
+msgstr "Modem"
+
+msgid "Ups.. no modems detected."
+msgstr "Ops.. nessun modem rilevato."
+
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgid "General Information"
+msgstr "Info genarali"
+
+msgid "Modem Information"
+msgstr "Info modem"
+
+msgid "Cell Information"
+msgstr "Info cella"
+
+msgid "Connection"
+msgstr "Conessione"
+
+msgid "Technology"
+msgstr "Tecnologia"
+
+msgid "Operator"
+msgstr "Operatore"
+
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgid "Sent"
+msgstr "Inviato"
+
+msgid "Signal strength"
+msgstr "Potenza segnale"
+
+msgid "Connection time"
+msgstr "Durata connessione"
+
+msgid "Modem type"
+msgstr "Tipo di modem"
+
+msgid "Hide data."
+msgstr "Nascondi dati."
+
+msgid "Hide selected data"
+msgstr "Nascondi dati selezionati"
+
+msgid "Additional information"
+msgstr "Info aggiuntive"
+
+msgid "Revision / FW"
+msgstr "Revisione / FW"
+
+msgid "IP adress / Port"
+msgstr "Indirizzo IP / Porta"
+
+msgid "Chip Temperature"
+msgstr "Temperatura chip"
+
+msgid "Configuration modemdata package"
+msgstr "Configurazione pacchetto modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Panello di configurazione Modemdata e inferfaccia grafica."
+
+msgid "Add data to hide"
+msgstr "Aggiungi dati da nascondere"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Inserisci dati che vuoi nascondere, ad es. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Apri pagina"
+
+msgid "Download data (experimental)"
+msgstr "Scarica dati (sperimentale)"
+
+msgid "Network"
+msgstr "Network"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Indirizzo IP / Porta di comunicazione con modem"
+
+msgid "Defined modems"
+msgstr "Modem selezionato"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interfaccia per definire modem disponibili. L'elenco dei modem semplificherà la scelta nell'interfaccia LuCI."
+
+msgid "Settings"
+msgstr "Settings"
+
+msgid "Add new modem settings..."
+msgstr "Aggiungi nuovo settaggio modem..."
+
+msgid "Modem Settings"
+msgstr "Settaggio modem"
+
+msgid "Manufacturer / Product"
+msgstr "Produttore / Prodotto"
+
+msgid "Please select a modem"
+msgstr "Seleziona un modem"
+
+msgid "IP adress / Port for communication"
+msgstr "Indirizzo IP / Porta di comunicazione"
+
+msgid "Protocol"
+msgstr "Protocollo"
+
+msgid "Port for communication"
+msgstr "Porta di comunicazione"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Seleziona porta QMI/MBIM"
+
+msgid "Modem id"
+msgstr "Id modem"
+
+msgid "Please select a modem id"
+msgstr "Seleziona un Id modem"
+
+msgid "MBIM device"
+msgstr "Dispositivo MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Seleziona per leggere i dati MBIM."
+
+msgid "Assigned interface"
+msgstr "Interfaccia assegnata"
+
+msgid "Interface assigned to modem."
+msgstr "Interfaccia assegnata al modem."
+
+msgid "Enter IP adress"
+msgstr "Inserisci indirizzo IP"
+
+msgid "IP adress"
+msgstr "Indirizzo IP"
+
+msgid "Reading data via"
+msgstr "Lettura dati via"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Porta / Indirizzo IP / Id modem"
+
+msgid "Interface assigned to modem."
+msgstr "Interfaccia assegnata al modem."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Inserisci modem manualmente qualora il nome suggerito non fosse "
+"esplicito.
Importante In nome modem viene individuato solo per i dispositivi connessi via USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Seleziona il metodo di lettura dati dal modem.
ecm: Inserisci indirizzo IP 192.168.X.X sotto il modem (Huawei) "
+"disponibile.
uqmi: Seleziona una delle porte cdc-wdmX disponibili.
ModemManager: Seleziona "
+"uno dei modem identificati."
+
+msgid "Please select a port"
+msgstr "Seleziona porta"
+
+msgid "User description"
+msgstr "Descrizione utente"
+
+msgid "Optional"
+msgstr "Opzionale"
+
+msgid "User description (optional)"
+msgstr "Descrizione utene (opzionale)"
+
+msgid "Signal strength"
+msgstr "Potenza segnale"
+
+msgid "Excellent"
+msgstr "Eccellente"
+
+msgid "Good"
+msgstr "Buona"
+
+msgid "Fair"
+msgstr "Discreta"
+
+msgid "Poor"
+msgstr "Debole"
+
+msgid "Physical cell ID"
+msgstr "ID cella fisica"
+
+msgid "Bandwidth"
+msgstr "Larghezza banda"
+
+msgid "SIM status"
+msgstr "Stato SIM"
+
+msgid "Not registered"
+msgstr "Non registrato"
+
+msgid "Registered"
+msgstr "Registrato"
+
+msgid "Registered (roaming)"
+msgstr "Registrato (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registrato, solo SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registrato (roaming), solo SMS"
+
+msgid "Searching.."
+msgstr "Ricerca.."
+
+msgid "Connection state"
+msgstr "Stato connessione"
+
+msgid "Connected"
+msgstr "Connesso"
+
+msgid "Disconnected"
+msgstr "Disconnesso"
+
+msgid "Registering denied"
+msgstr "Registrazione negata"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Attesa lettura dati dal modem..."
+
+msgid "Waiting for data..."
+msgstr "Attesa lettura dati..."
+
+msgid "BTS Search"
+msgstr "Cerca BTS"
+
+msgid "BTS Information"
+msgstr "Info BTS"
+
+msgid "Search"
+msgstr "Ricerca"
+
+msgid "Bands"
+msgstr "Bande"
+
+msgid "Search BTS"
+msgstr "Cerca BTS"
+
+msgid "BTS search settings"
+msgstr "Settaggio ricerca BTS"
+
+msgid "Website to search for BTS"
+msgstr "Sito per cercare BTS"
+
+msgid "Select a website for searching."
+msgstr "Seleziona un sito per la richerca."
+
+msgid "Install a package using package manager"
+msgstr "Installa un pacchatto utizzando package manager"
+
+msgid "Select an action after clicking the search button."
+msgstr "Seleziona una scelta dopo aver premuta il tasto di ricerca."
+
+msgid "Install iconv"
+msgstr "Installa iconv"
+
+msgid "Install qmi-utils"
+msgstr "Installa qmi-utils"
+
+msgid "SIM Slot"
+msgstr "SIM Slot"
+
+msgid "SIM Card"
+msgstr "SIM Card"
+
+msgid "Slot in use"
+msgstr "Slot in uso"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Problema di registrazione network, constrolla la SIM card."
+
+msgid "SIM PIN required"
+msgstr "SIM PIN richiesto"
+
+msgid "SIM PUK required"
+msgstr "SIM PUK richiesto"
+
+msgid "SIM failure"
+msgstr "Errore SIM"
+
+msgid "SIM busy"
+msgstr "SIM busy"
+
+msgid "SIM wrong"
+msgstr "SIM errata"
+
+msgid "SIM PIN2 required"
+msgstr "SIM PIN2 richiesto"
+
+msgid "SIM PUK2 required"
+msgstr "SIM PUK2 richiesto"
+
+msgid "Defined modems"
+msgstr "Modem definiti"
+
+msgid "Information read from the SIM card and device."
+msgstr "Info lette da SIM card e dispositivo."
+
+msgid "No data"
+msgstr "Nessun dato"
+
+msgid "Diagnostics"
+msgstr "Diagnostica"
+
+msgid "Modem(s) configuration"
+msgstr "Configurazione modem"
+
+msgid "Package configuration"
+msgstr "Configurazione pacchetto"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Esegui vari comandi per verificare i dati letti dal modem e gli script di debug."
+
+msgid "USB debug information"
+msgstr "Info debug USB"
+
+msgid "Check ttyX ports"
+msgstr "Controlla porte ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Controlla modalità seriale e ecm"
+
+msgid "Check uqmi mode"
+msgstr "Controlla modalità uqmi"
+
+msgid "Check ModemManager mode"
+msgstr "Controlla modalità ModemManager"
+
+msgid "Clear"
+msgstr "Cancella"
+
+msgid "Download"
+msgstr "Scarica"
+
+msgid "Location"
+msgstr "Località"
+
+msgid "Notes Update date"
+msgstr "Notes Update date"
+
+msgid "Band"
+msgstr "Banda"
+
+msgid "Network"
+msgstr "Network"
+
+msgid "Package update and support"
+msgstr "Aggiornamento e supporto pacchetto"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Errore durante il download index.json file dal repository esterno."
+
+msgid "Failed to read downloaded file."
+msgstr "Lettura errata del file scaricato."
+
+msgid "Installed package is up to date."
+msgstr "Il pacchetto installato è aggiornato."
+
+msgid "Update is available."
+msgstr "Aggiornamento disponibile."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Il file index.json non contiene nessuna info per il pacchetto."
+
+msgid "Error parsing version."
+msgstr "Errore durante l'analisi della versione."
+
+msgid "Check repository"
+msgstr "Controlla repository"
+
+msgid "Package update..."
+msgstr "Aggiornamento pacchetto..."
+
+msgid "Report a bug"
+msgstr "Segnala bug"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Scrivi un post nel forum eko.one.pl riguardo al pacchetto"
+
+msgid "Write on forum"
+msgstr "Scrivi sul forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Segnala bug nella pagina Github del pacchetto"
+
+msgid "Open a package discussion on Github"
+msgstr "Apri discussione su Github riguardo al pacchetto"
+
+msgid "Open discussion"
+msgstr "Apri discussione"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Buy a coffee se vuoi supportare lo sviluppo del progetto e l'autore"
+
+msgid "Buy a coffee"
+msgstr "Buy a coffee"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Diventa sponsor se vuoi supportare lo sviluppo del progetto e l'autore"
+
+msgid "Become a sponsor"
+msgstr "Diventa sponsor"
+
+msgid "Download package information from an external repository"
+msgstr "Scarica info sul pacchatto da un repository esterno"
+
+msgid "Add repository and download package update"
+msgstr "Aggiungi repository e scarica aggironamento pacchetto"
+
+msgid "Package Info"
+msgstr "Info pacchetto"
+
+msgid "Compiled"
+msgstr "Compilato"
+
+msgid "Repository Info"
+msgstr "Info repository"
+
+msgid "Currently installed"
+msgstr "Attualmente installato"
+
+msgid "Package in repository"
+msgstr "Pacchetto nel repository"
+
+msgid "Last repository check"
+msgstr "Ultima verifica repository"
+
+msgid "Poland"
+msgstr "Polonia"
+
+msgid "Force read by"
+msgstr "Forza lettura da"
+
+msgid "Select method for reading data from the modem."
+msgstr "Seleziona metodo lettura dati dal modem."
+
+msgid "inactive"
+msgstr "inattivo"
+
+msgid "ModemMenager"
+msgstr "ModemMenager"
+
+msgid "Force PLMN"
+msgstr "Forza PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Forza lettura PLMN da file."
+
+msgid "Command result"
+msgstr "Risultato comando"
+
+msgid "Check"
+msgstr "Verifica"
+
+msgid "Auto update every:"
+msgstr "Auto update ogni:"
+
+msgid "2 seconds"
+msgstr "2 secondi"
+
+msgid "3 seconds"
+msgstr "3 secondi"
+
+msgid "5 seconds"
+msgstr "5 secondi"
+
+msgid "10 seconds"
+msgstr "10 sekund"
+
+msgid "30 seconds"
+msgstr "30 secondi"
+
+msgid "45 seconds"
+msgstr "45 secondi"
+
+msgid "60 seconds"
+msgstr "60 secondi"
+
+msgid "Refresh rate"
+msgstr "Ciclo refresh"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Imposta frequenza refresh dei dati del modem."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Imposta frequenza refresh dei dati del modem.
Importante Non "
+"tutti i modem / protocolli sono in grado di comunicare velocemente con gli scripts. "
+"Una frequenza elevata potrebbe bloccare il modem. ModemManager e uqmi riciedono tempi maggiori per rispondere."
+
+msgid "Updating again in %s second(s)."
+msgstr "Aggiornamento tra %s secondi."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Attendere... lettura dati in corso."
+
+msgid "Modems found"
+msgstr "Modem trovati"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Lista dei modem trovati. Non tutti i modem potrebbero essere mostrati."
+
+msgid "Show modems found"
+msgstr "Mostra modem trovati"
+
+msgid "Show"
+msgstr "Mostra"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Verranno individuati solo i modem connessi via USB."
+
+msgid "No Modems Detected..."
+msgstr "Nessun modem individuato..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ops... non ci sono modem nel settaggio. Verrai redirezionato alla pagina dove poter definire i modem installati."
+
+msgid "Redirecting..."
+msgstr "Reindirizzamento..."
+
+msgid "Redirecting in"
+msgstr "Reindirizzamento tra"
+
+msgid "seconds..."
+msgstr "secondi..."
+
+msgid "(no data)"
+msgstr "(nessun dato)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Inserisci in indirizzo IP valifo nel formato 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Sono consentiti solo numeri e punti"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Ogni parte deve essere una cifra tra 0 e 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "Nei tab futuri verrà permesso di aggiornare il pacchetto dal %sRafała (IceG) repository esterno%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Opzione disponibile dopo l'implementazione apk."
+
+msgid "Author (package maintainer)"
+msgstr "Autore (package maintainer)"
+
+msgid "Modemdata Info"
+msgstr "Info Modemdata"
+
+msgid "Modemdata Status"
+msgstr "Stato Modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Info luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Vai alla Diagnostica ed esegui lo script di verifica. Spesso l'errore è provocato da nomi operatore anomali. Seleziona l'opzione Forza PLMN da file se disponibile."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Qualora i dati LuCI non fossero disponibili e il modem è assolutamente definito/configurato in modo corretto."
+
+msgid "Suggested solution"
+msgstr "Soluzione suggerita"
+
+msgid "Troubleshooting / Hints"
+msgstr "Risoluzione dei problemi / Suggerimenti"
+
+msgid "Problem"
+msgstr "Problema"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Problemi comuni che possono verificarsi durante l'utilizzo del pacchetto e modi per risolverli."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Il pacchetto non mostra i dati per il modem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Il modem è molto sensibile ai dati letti dalla porta di comunicazione. La selezione della porta di comunicazione errata può causare il blocco o il riavvio del modem."
+
+msgid "and"
+msgstr "e"
+
+msgid "packages are recommended for proper modem support."
+msgstr "sono raccomandati per un corretto supporto del modem."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Seleziona un metodo di lettura dati del modem e installa i pacchetti necessari."
+
+msgid "Required packages"
+msgstr "Pacchetti richiesti"
+
+msgid "Check required packages"
+msgstr "Verifica pacchetti richiesti"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Prima di configurare il modem, assicurati di aver installato tutti i pacchetti necessari."
+
+msgid "Loading package data…"
+msgstr "Lettura dati pacchetto..."
+
+msgid "Waiting..."
+msgstr "Attesa..."
+
+msgid "Show signal levels for the primary band"
+msgstr "Mostra livelli del segnale per la banda primaria"
+
+msgid "Primary band signal levels"
+msgstr "Livelli del segnale per la banda primaria"
+
+msgid "Device is busy"
+msgstr "Dispositivo busy"
+
+msgid "Primary band"
+msgstr "Banda primaria"
+
+msgid "Available options"
+msgstr "Opzioni disponibili"
+
+msgid "Device not found"
+msgstr "Dispositivo non trovato"
+
+msgid "Registered, home"
+msgstr "Registrato, rete domestica"
+
+msgid "Show signal levels"
+msgstr "Mostra livelli del segnale"
+
+msgid "Click to view Cell ID details"
+msgstr "Clicca per visualizzare i dettagli dell'ID cella"
+
+msgid "Cell ID (dec)"
+msgstr "ID cella (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "ID cella (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID settore (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "ID settore (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID cella (hex) per CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID cella (dec) per CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Informazioni ID cella"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Informazioni dettagliate ID cella con formati per diversi strumenti e applicazioni."
+
+msgid "Information about package authors and available support options."
+msgstr "Informazioni sugli autori del pacchetto e opzioni di supporto disponibili."
+
+msgid "Package name"
+msgstr "Nome pacchetto"
+
+msgid "Proper Modem Configuration."
+msgstr "Configurazione corretta del modem."
+
+msgid "User should remember:"
+msgstr "L'utente deve ricordare:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Per uno specifico modem, deve essere impostato solo un protocollo per la comunicazione."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Solo un pacchetto può leggere i dati dal modem (allo stesso tempo)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Leggere i dati dal modem troppo spesso può causare il blocco (MM e uqmi richiedono più tempo)."
+
+msgid "BTS search: no response from server."
+msgstr "Ricerca BTS: nessuna risposta dal server."
+
+msgid "BTS search: no results found."
+msgstr "Ricerca BTS: nessun risultato trovato."
+
+msgid "this month"
+msgstr "questo mese"
+
+msgid "month ago"
+msgstr "un mese fa"
+
+msgid "months ago"
+msgstr "mesi fa"
+
+msgid "Station ID"
+msgstr "ID stazione"
+
+msgid "Confirmed"
+msgstr "Confermato"
+
+msgid "Updated"
+msgstr "Aggiornato"
+
+msgid "Show on map"
+msgstr "Mostra sulla mappa"
+
+msgid "Download data"
+msgstr "Scarica dati"
+
+msgid "Install curl"
+msgstr "Installa curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Nota: Il pacchetto è completamente compatibile con l'ultima versione di terza generazione del sito web BTSearch."
+
+msgid "Skip package verification"
+msgstr "Salta la verifica dei pacchetti"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Abilita questa opzione per saltare il controllo dei pacchetti installati e consentire la selezione di qualsiasi metodo dall'elenco sottostante."
+
diff --git a/modemdata/luci-app-modemdata/po/ja/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/ja/luci-app-modemdata.po
new file mode 100644
index 000000000..f208adf73
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/ja/luci-app-modemdata.po
@@ -0,0 +1,607 @@
+msgid ""
+msgstr ""
+"Language: ja\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "modemdata パッケージの詳細については、以下をご覧ください: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "このパッケージを使用すると、モデムから読み込まれたデータを表示し、モバイルネットワークへの接続パラメータを確認できます。"
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl フォーラム"
+
+msgid "Signal strength"
+msgstr "信号強度"
+
+msgid "Modem(s)"
+msgstr "モデム"
+
+msgid "Ups.. no modems detected."
+msgstr "エラー.. モデムが検出されません。"
+
+msgid "Configuration"
+msgstr "設定"
+
+msgid "General Information"
+msgstr "一般情報"
+
+msgid "Modem Information"
+msgstr "モデム情報"
+
+msgid "Cell Information"
+msgstr "セル情報"
+
+msgid "Connection"
+msgstr "接続"
+
+msgid "Technology"
+msgstr "技術"
+
+msgid "Operator"
+msgstr "オペレーター"
+
+msgid "Location"
+msgstr "ロケーション"
+
+msgid "Sent"
+msgstr "送信"
+
+msgid "Signal strength"
+msgstr "信号強度"
+
+msgid "Connection time"
+msgstr "接続時間"
+
+msgid "Modem type"
+msgstr "モデムタイプ"
+
+msgid "Hide data."
+msgstr "データを非表示にする。"
+
+msgid "Hide selected data"
+msgstr "選択したデータを非表示にする"
+
+msgid "Additional information"
+msgstr "追加情報"
+
+msgid "Revision / FW"
+msgstr "リビジョン / ファームウェア"
+
+msgid "IP adress / Port"
+msgstr "IP アドレス / ポート"
+
+msgid "Chip Temperature"
+msgstr "チップ温度"
+
+msgid "Configuration modemdata package"
+msgstr "modemdata パッケージの設定"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "modemdata と GUI アプリケーションの設定パネル。"
+
+msgid "Add data to hide"
+msgstr "非表示にするデータを追加"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "非表示にしたいデータを入力してください。例:IMEI, IMSI。"
+
+msgid "Open page"
+msgstr "ページを開く"
+
+msgid "Download data (experimental)"
+msgstr "データをダウンロード(実験的)"
+
+msgid "Network"
+msgstr "ネットワーク"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "モデムとの通信用 IP アドレス / ポート"
+
+msgid "Defined modems"
+msgstr "定義されたモデム"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "利用可能なモデムを定義するインターフェース。モデムリストにより、LuCI でモデム間の切り替えが容易になります。"
+
+msgid "Settings"
+msgstr "設定"
+
+msgid "Add new modem settings..."
+msgstr "新しいモデム設定を追加..."
+
+msgid "Modem Settings"
+msgstr "モデム設定"
+
+msgid "Manufacturer / Product"
+msgstr "製造元 / 製品"
+
+msgid "Please select a modem"
+msgstr "モデムを選択してください"
+
+msgid "IP adress / Port for communication"
+msgstr "通信用 IP アドレス / ポート"
+
+msgid "Protocol"
+msgstr "プロトコル"
+
+msgid "Port for communication"
+msgstr "通信用ポート"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "QMI/MBIM ポートを選択してください"
+
+msgid "Modem id"
+msgstr "モデム ID"
+
+msgid "Please select a modem id"
+msgstr "モデム ID を選択してください"
+
+msgid "MBIM device"
+msgstr "MBIM デバイス"
+
+msgid "Select if you want to read from MBIM."
+msgstr "MBIM から読み込みたい場合は選択してください。"
+
+msgid "Assigned interface"
+msgstr "割り当てられたインターフェース"
+
+msgid "Interface assigned to modem."
+msgstr "モデムに割り当てられたインターフェース。"
+
+msgid "Enter IP adress"
+msgstr "IP アドレスを入力"
+
+msgid "IP adress"
+msgstr "IP アドレス"
+
+msgid "Reading data via"
+msgstr "データ読み込み方法"
+
+msgid "Port / IP / Modem identifier"
+msgstr "ポート / IP / モデム識別子"
+
+msgid "Interface assigned to modem."
+msgstr "モデムに割り当てられたインターフェース。"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"提案された名前が不明な場合は、モデム名を手動で入力してください。
重要 モデム名は USB 経由で接続されているモデムのみを検索します。"
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"モデムからデータを読み込む方法を選択してください。
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"モデム タブでデータをどのくらいの頻度で更新するかを設定します。
重要 すべてのモデム / プロトコルがスクリプトと迅速に通信できるわけではありません。 "
+"ポーリング レートが高すぎるとモデムがフリーズする可能性があります。 ModemManager と uqmi は応答に時間が必要です。"
+
+msgid "Updating again in %s second(s)."
+msgstr "%s 秒後に再度更新します。"
+
+msgid "Please wait... data collection is in progress."
+msgstr "お待ちください... データ収集進行中です。"
+
+msgid "Modems found"
+msgstr "見つかったモデム"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "見つかったモデムのリスト。すべてのモデムが表示されるとは限りません。"
+
+msgid "Show modems found"
+msgstr "見つかったモデムを表示"
+
+msgid "Show"
+msgstr "表示"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "現在、USB 経由で接続されているモデムのみが検索されます。"
+
+msgid "No Modems Detected..."
+msgstr "モデムが検出されません..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "エラー.. 設定にモデムがありません。インストールされたモデムを定義できるタブにリダイレクトされます。"
+
+msgid "Redirecting..."
+msgstr "リダイレクト中..."
+
+msgid "Redirecting in"
+msgstr "リダイレクト対象:"
+
+msgid "seconds..."
+msgstr "秒..."
+
+msgid "(no data)"
+msgstr "(データなし)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "192.168.X.X の形式で有効な IP アドレスを入力してください"
+
+msgid "Only numbers and dots are allowed"
+msgstr "数字とドットのみが許可されています"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "各部分は 0 から 255 までの数字である必要があります"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "将来的には、%sRafał (IceG) 外部リポジトリ%sからパッケージを更新できるようになります。"
+
+msgid "Option will appear after apk implementation."
+msgstr "apk 実装後にオプションが表示されます。"
+
+msgid "Author (package maintainer)"
+msgstr "作成者 (パッケージメンテナー)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata 情報"
+
+msgid "Modemdata Status"
+msgstr "Modemdata ステータス"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata 情報"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "診断タブに移動してスクリプトチェックを実行してください。通常、エラーは奇妙なオペレータ名が原因です。これを修正するには、モデム設定オプションで利用可能な場合は「ファイルから PLMN を強制」オプションを選択してください。"
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "LuCI のデータが表示されず、モデムが確実に正しく定義/設定されている場合。"
+
+msgid "Suggested solution"
+msgstr "提案された解決策"
+
+msgid "Troubleshooting / Hints"
+msgstr "トラブルシューティング / ヒント"
+
+msgid "Problem"
+msgstr "問題"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "パッケージの使用時に発生する可能性のある一般的な問題と、その解決方法。"
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "パッケージが Fibocom FM350-GL モデムのデータを表示しません。"
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "モデムは通信ポートによって読み込まれたデータに非常に敏感です。間違った通信ポートを選択するとモデムがフリーズまたは再起動する可能性があります。"
+
+msgid "and"
+msgstr "と"
+
+msgid "packages are recommended for proper modem support."
+msgstr "パッケージはモデムの適切なサポートに推奨されます。"
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "モデムからデータを読み込む方法を選択し、必要なパッケージをインストールしてください。"
+
+msgid "Required packages"
+msgstr "必要なパッケージ"
+
+msgid "Check required packages"
+msgstr "必要なパッケージをチェック"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "モデムを設定する前に、必要なすべてのパッケージがシステムにインストールされているかどうかを確認してください。"
+
+msgid "Loading package data…"
+msgstr "パッケージデータを読み込み中…"
+
+msgid "Waiting..."
+msgstr "待機中..."
+
+msgid "Show signal levels for the primary band"
+msgstr "プライマリ バンドの信号レベルを表示"
+
+msgid "Primary band signal levels"
+msgstr "プライマリ バンド信号レベル"
+
+msgid "Device is busy"
+msgstr "デバイスがビジーです"
+
+msgid "Primary band"
+msgstr "プライマリ バンド"
+
+msgid "Available options"
+msgstr "利用可能なオプション"
+
+msgid "Device not found"
+msgstr "デバイスが見つかりません"
+
+msgid "Registered, home"
+msgstr "登録済み、ホーム"
+
+msgid "Show signal levels"
+msgstr "信号レベルを表示"
+
+msgid "Click to view Cell ID details"
+msgstr "クリックしてセル ID の詳細を表示"
+
+msgid "Cell ID (dec)"
+msgstr "セル ID (10 進)"
+
+msgid "Cell ID (hex)"
+msgstr "セル ID (16 進)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID (16 進)"
+
+msgid "Sector ID (hex)"
+msgstr "セクター ID (16 進)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID (10 進)"
+
+msgid "Sector ID (dec)"
+msgstr "セクター ID (10 進)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "CellMapper のセル ID (16 進)"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "CellMapper のセル ID (10 進)"
+
+msgid "Cell ID Information"
+msgstr "セル ID 情報"
+
+msgid "Modem"
+msgstr "モデム"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "さまざまなツールとアプリケーション用のフォーマットを含む、詳細なセル ID 情報。"
+
+msgid "Information about package authors and available support options."
+msgstr "パッケージの作成者と利用可能なサポート オプションに関する情報。"
+
+msgid "Package name"
+msgstr "パッケージ名"
+
+msgid "Proper Modem Configuration."
+msgstr "適切なモデム設定。"
+
+msgid "User should remember:"
+msgstr "ユーザーが覚えておくべきこと:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. 特定のモデムについては、モデムとの通信用に 1 つのプロトコルのみを設定する必要があります。"
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. 1 つのパッケージのみがモデムからデータを読み込むことができます (同時に)。"
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. モデムからデータを頻繁に読み込むとフリーズする可能性があります (MM と uqmi にはより多くの時間が必要です)。"
+
+msgid "BTS search: no response from server."
+msgstr "BTS 検索: サーバーからの応答がありません。"
+
+msgid "BTS search: no results found."
+msgstr "BTS 検索: 結果が見つかりません。"
+
+msgid "this month"
+msgstr "今月"
+
+msgid "month ago"
+msgstr "1 か月前"
+
+msgid "months ago"
+msgstr "か月前"
+
+msgid "Station ID"
+msgstr "ステーション ID"
+
+msgid "Confirmed"
+msgstr "確認済み"
+
+msgid "Updated"
+msgstr "更新済み"
+
+msgid "Show on map"
+msgstr "地図に表示"
+
+msgid "Download data"
+msgstr "データをダウンロード"
+
+msgid "Install curl"
+msgstr "curl をインストール"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "注: このパッケージは、BTSearch ウェブサイトの最新の第 3 世代バージョンと完全に互換性があります。"
+
+msgid "Skip package verification"
+msgstr "パッケージの確認をスキップ"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "このオプションを有効にすると、インストール済みパッケージの確認をスキップし、以下のリストから任意の方法を選択できるようになります。"
diff --git a/modemdata/luci-app-modemdata/po/ko/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/ko/luci-app-modemdata.po
new file mode 100644
index 000000000..447d79b05
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/ko/luci-app-modemdata.po
@@ -0,0 +1,607 @@
+msgid ""
+msgstr ""
+"Language: ko\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "modemdata 패키지에 대한 자세한 내용은 %shttps://github.com/obsy/modemdata%s를 방문하세요."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "이 패키지를 통해 사용자는 모뎀에서 읽은 데이터를 보고 모바일 네트워크에 대한 연결 매개변수를 확인할 수 있습니다."
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl 포럼"
+
+msgid "Signal strength"
+msgstr "신호 강도"
+
+msgid "Modem(s)"
+msgstr "모뎀"
+
+msgid "Ups.. no modems detected."
+msgstr "오류.. 모뎀이 감지되지 않습니다."
+
+msgid "Configuration"
+msgstr "구성"
+
+msgid "General Information"
+msgstr "일반 정보"
+
+msgid "Modem Information"
+msgstr "모뎀 정보"
+
+msgid "Cell Information"
+msgstr "셀 정보"
+
+msgid "Connection"
+msgstr "연결"
+
+msgid "Technology"
+msgstr "기술"
+
+msgid "Operator"
+msgstr "운영자"
+
+msgid "Location"
+msgstr "위치"
+
+msgid "Sent"
+msgstr "전송됨"
+
+msgid "Signal strength"
+msgstr "신호 강도"
+
+msgid "Connection time"
+msgstr "연결 시간"
+
+msgid "Modem type"
+msgstr "모뎀 유형"
+
+msgid "Hide data."
+msgstr "데이터 숨기기."
+
+msgid "Hide selected data"
+msgstr "선택한 데이터 숨기기"
+
+msgid "Additional information"
+msgstr "추가 정보"
+
+msgid "Revision / FW"
+msgstr "수정 / 펌웨어"
+
+msgid "IP adress / Port"
+msgstr "IP 주소 / 포트"
+
+msgid "Chip Temperature"
+msgstr "칩 온도"
+
+msgid "Configuration modemdata package"
+msgstr "modemdata 패키지 구성"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "modemdata 및 GUI 응용 프로그램의 구성 패널입니다."
+
+msgid "Add data to hide"
+msgstr "숨길 데이터 추가"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "숨기려는 데이터를 입력하세요. 예: IMEI, IMSI."
+
+msgid "Open page"
+msgstr "페이지 열기"
+
+msgid "Download data (experimental)"
+msgstr "데이터 다운로드 (실험적)"
+
+msgid "Network"
+msgstr "네트워크"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "모뎀과 통신하기 위한 IP 주소 / 포트"
+
+msgid "Defined modems"
+msgstr "정의된 모뎀"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "사용 가능한 모뎀을 정의하는 인터페이스입니다. 모뎀 목록을 통해 사용자는 LuCI에서 모뎀 간에 쉽게 전환할 수 있습니다."
+
+msgid "Settings"
+msgstr "설정"
+
+msgid "Add new modem settings..."
+msgstr "새 모뎀 설정 추가..."
+
+msgid "Modem Settings"
+msgstr "모뎀 설정"
+
+msgid "Manufacturer / Product"
+msgstr "제조사 / 제품"
+
+msgid "Please select a modem"
+msgstr "모뎀을 선택하세요"
+
+msgid "IP adress / Port for communication"
+msgstr "통신용 IP 주소 / 포트"
+
+msgid "Protocol"
+msgstr "프로토콜"
+
+msgid "Port for communication"
+msgstr "통신 포트"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "QMI/MBIM 포트를 선택하세요"
+
+msgid "Modem id"
+msgstr "모뎀 ID"
+
+msgid "Please select a modem id"
+msgstr "모뎀 ID를 선택하세요"
+
+msgid "MBIM device"
+msgstr "MBIM 장치"
+
+msgid "Select if you want to read from MBIM."
+msgstr "MBIM에서 읽으려면 선택하세요."
+
+msgid "Assigned interface"
+msgstr "할당된 인터페이스"
+
+msgid "Interface assigned to modem."
+msgstr "모뎀에 할당된 인터페이스입니다."
+
+msgid "Enter IP adress"
+msgstr "IP 주소 입력"
+
+msgid "IP adress"
+msgstr "IP 주소"
+
+msgid "Reading data via"
+msgstr "데이터 읽기 방법"
+
+msgid "Port / IP / Modem identifier"
+msgstr "포트 / IP / 모뎀 식별자"
+
+msgid "Interface assigned to modem."
+msgstr "모뎀에 할당된 인터페이스입니다."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"제안된 이름이 명확하지 않으면 모뎀 이름을 수동으로 입력하세요.
중요 모뎀 이름은 USB를 통해 연결된 모뎀에서만 검색됩니다."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"모뎀에서 데이터를 읽는 방법을 선택하세요.
직렬 포트: 사용 가능한 "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN 포트 중 하나를 선택하세요.
ecm: 모뎀 (Huawei)이 "
+"사용 가능한 IP 주소 192.168.X.X를 입력하세요.
uqmi: 사용 가능한 cdc-wdmX 포트 중 하나를 선택하세요.
ModemManager: 검색된 모뎀 식별자 중 하나를 "
+"선택하세요."
+
+msgid "Please select a port"
+msgstr "포트를 선택하세요"
+
+msgid "User description"
+msgstr "사용자 설명"
+
+msgid "Optional"
+msgstr "선택 사항"
+
+msgid "User description (optional)"
+msgstr "사용자 설명 (선택 사항)"
+
+msgid "Signal strength"
+msgstr "신호 강도"
+
+msgid "Excellent"
+msgstr "우수"
+
+msgid "Good"
+msgstr "좋음"
+
+msgid "Fair"
+msgstr "보통"
+
+msgid "Poor"
+msgstr "약함"
+
+msgid "Physical cell ID"
+msgstr "물리 셀 ID"
+
+msgid "Bandwidth"
+msgstr "대역폭"
+
+msgid "SIM status"
+msgstr "SIM 상태"
+
+msgid "Not registered"
+msgstr "등록되지 않음"
+
+msgid "Registered"
+msgstr "등록됨"
+
+msgid "Registered (roaming)"
+msgstr "등록됨 (로밍)"
+
+msgid "Registered, only SMS"
+msgstr "등록됨, SMS만"
+
+msgid "Registered (roaming), only SMS"
+msgstr "등록됨 (로밍), SMS만"
+
+msgid "Searching.."
+msgstr "검색 중.."
+
+msgid "Connection state"
+msgstr "연결 상태"
+
+msgid "Connected"
+msgstr "연결됨"
+
+msgid "Disconnected"
+msgstr "연결 해제됨"
+
+msgid "Registering denied"
+msgstr "등록이 거부됨"
+
+msgid "Waiting to read data from the modem..."
+msgstr "모뎀에서 데이터를 읽을 때까지 대기 중..."
+
+msgid "Waiting for data..."
+msgstr "데이터 대기 중..."
+
+msgid "BTS Search"
+msgstr "BTS 검색"
+
+msgid "BTS Information"
+msgstr "BTS 정보"
+
+msgid "Search"
+msgstr "검색"
+
+msgid "Bands"
+msgstr "대역"
+
+msgid "Search BTS"
+msgstr "BTS 검색"
+
+msgid "BTS search settings"
+msgstr "BTS 검색 설정"
+
+msgid "Website to search for BTS"
+msgstr "BTS를 검색할 웹사이트"
+
+msgid "Select a website for searching."
+msgstr "검색용 웹사이트를 선택하세요."
+
+msgid "Install a package using package manager"
+msgstr "패키지 관리자를 사용하여 패키지 설치"
+
+msgid "Select an action after clicking the search button."
+msgstr "검색 버튼을 클릭한 후 작업을 선택하세요."
+
+msgid "Install iconv"
+msgstr "iconv 설치"
+
+msgid "Install qmi-utils"
+msgstr "qmi-utils 설치"
+
+msgid "SIM Slot"
+msgstr "SIM 슬롯"
+
+msgid "SIM Card"
+msgstr "SIM 카드"
+
+msgid "Slot in use"
+msgstr "사용 중인 슬롯"
+
+msgid "Last repository check"
+msgstr "마지막 저장소 확인"
+
+msgid "Poland"
+msgstr "폴란드"
+
+msgid "Force read by"
+msgstr "읽기 강제"
+
+msgid "Select method for reading data from the modem."
+msgstr "모뎀에서 데이터를 읽는 방법을 선택하세요."
+
+msgid "inactive"
+msgstr "비활성"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "PLMN 강제"
+
+msgid "Force reading PLMN from file."
+msgstr "파일에서 PLMN 읽기를 강제하세요."
+
+msgid "Command result"
+msgstr "명령 결과"
+
+msgid "Check"
+msgstr "확인"
+
+msgid "Auto update every:"
+msgstr "자동 업데이트 간격:"
+
+msgid "2 seconds"
+msgstr "2초"
+
+msgid "3 seconds"
+msgstr "3초"
+
+msgid "5 seconds"
+msgstr "5초"
+
+msgid "10 seconds"
+msgstr "10초"
+
+msgid "30 seconds"
+msgstr "30초"
+
+msgid "45 seconds"
+msgstr "45초"
+
+msgid "60 seconds"
+msgstr "60초"
+
+msgid "Refresh rate"
+msgstr "새로 고침 빈도"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "모뎀 탭에서 데이터를 새로 고쳐야 하는 빈도를 설정합니다."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"모뎀 탭에서 데이터를 새로 고쳐야 하는 빈도를 설정합니다.
중요 모든 모뎀 / 프로토콜이 스크립트와 빠르게 통신할 수 있는 것은 아닙니다. "
+"너무 높은 폴링 속도는 모뎀을 멈추게 할 수 있습니다. ModemManager 및 uqmi는 응답하는 데 더 많은 시간이 필요합니다."
+
+msgid "Updating again in %s second(s)."
+msgstr "%s초 후에 다시 업데이트합니다."
+
+msgid "Please wait... data collection is in progress."
+msgstr "기다려주세요... 데이터 수집이 진행 중입니다."
+
+msgid "Modems found"
+msgstr "발견된 모뎀"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "발견된 모뎀 목록입니다. 모든 모뎀이 표시되지 않을 수 있습니다."
+
+msgid "Show modems found"
+msgstr "발견된 모뎀 표시"
+
+msgid "Show"
+msgstr "표시"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "현재 USB를 통해 연결된 모뎀만 검색됩니다."
+
+msgid "No Modems Detected..."
+msgstr "감지된 모뎀이 없습니다..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "오류.. 설정에 모뎀이 없습니다. 설치된 모뎀을 정의할 수 있는 탭으로 리디렉션됩니다."
+
+msgid "Redirecting..."
+msgstr "리디렉션 중..."
+
+msgid "Redirecting in"
+msgstr "리디렉션:"
+
+msgid "seconds..."
+msgstr "초..."
+
+msgid "(no data)"
+msgstr "(데이터 없음)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "192.168.X.X 형식으로 유효한 IP 주소를 입력하세요"
+
+msgid "Only numbers and dots are allowed"
+msgstr "숫자와 점만 허용됩니다"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "각 부분은 0에서 255 사이의 숫자여야 합니다"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "향후 탭에서 %sRafał (IceG) 외부 저장소%s에서 패키지를 업데이트할 수 있습니다."
+
+msgid "Option will appear after apk implementation."
+msgstr "apk 구현 후 옵션이 표시됩니다."
+
+msgid "Author (package maintainer)"
+msgstr "작성자 (패키지 관리자)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata 정보"
+
+msgid "Modemdata Status"
+msgstr "Modemdata 상태"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata 정보"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "진단 탭으로 이동하여 스크립트 확인을 실행합니다. 대부분의 경우 오류는 이상한 운영자 이름으로 인해 발생합니다. 이를 수정하려면 모뎀 구성 옵션에서 사용 가능한 경우 파일에서 PLMN 강제 옵션을 선택합니다."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "LuCI의 데이터가 표시되지 않고 모뎀이 올바르게 정의/구성되었다고 100% 확신하는 경우."
+
+msgid "Suggested solution"
+msgstr "제안 솔루션"
+
+msgid "Troubleshooting / Hints"
+msgstr "문제 해결 / 힌트"
+
+msgid "Problem"
+msgstr "문제"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "패키지를 사용할 때 발생할 수 있는 일반적인 문제와 해결 방법입니다."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "패키지가 Fibocom FM350-GL 모뎀의 데이터를 표시하지 않습니다."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "모뎀은 통신 포트에서 읽은 데이터에 매우 민감합니다. 잘못된 통신 포트를 선택하면 모뎀이 멈추거나 재시작될 수 있습니다."
+
+msgid "and"
+msgstr "및"
+
+msgid "packages are recommended for proper modem support."
+msgstr "패키지는 적절한 모뎀 지원을 위해 권장됩니다."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "모뎀에서 데이터를 읽는 방법을 선택하고 필요한 패키지를 설치하세요."
+
+msgid "Required packages"
+msgstr "필요한 패키지"
+
+msgid "Check required packages"
+msgstr "필요한 패키지 확인"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "모뎀을 구성하기 전에 필요한 모든 패키지가 시스템에 설치되어 있는지 확인하세요."
+
+msgid "Loading package data…"
+msgstr "패키지 데이터 로드 중…"
+
+msgid "Waiting..."
+msgstr "대기 중..."
+
+msgid "Show signal levels for the primary band"
+msgstr "주 대역의 신호 레벨 표시"
+
+msgid "Primary band signal levels"
+msgstr "주 대역 신호 레벨"
+
+msgid "Device is busy"
+msgstr "장치가 바쁩니다"
+
+msgid "Primary band"
+msgstr "주 대역"
+
+msgid "Available options"
+msgstr "사용 가능한 옵션"
+
+msgid "Device not found"
+msgstr "장치를 찾을 수 없습니다"
+
+msgid "Registered, home"
+msgstr "등록됨, 홈"
+
+msgid "Show signal levels"
+msgstr "신호 레벨 표시"
+
+msgid "Click to view Cell ID details"
+msgstr "셀 ID 세부 정보를 보려면 클릭하세요"
+
+msgid "Cell ID (dec)"
+msgstr "셀 ID (10진)"
+
+msgid "Cell ID (hex)"
+msgstr "셀 ID (16진)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID (16진)"
+
+msgid "Sector ID (hex)"
+msgstr "섹터 ID (16진)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID (10진)"
+
+msgid "Sector ID (dec)"
+msgstr "섹터 ID (10진)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "CellMapper의 셀 ID (16진)"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "CellMapper의 셀 ID (10진)"
+
+msgid "Cell ID Information"
+msgstr "셀 ID 정보"
+
+msgid "Modem"
+msgstr "모뎀"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "다양한 도구 및 응용 프로그램을 위한 형식이 포함된 자세한 셀 ID 정보입니다."
+
+msgid "Information about package authors and available support options."
+msgstr "패키지 작성자 및 사용 가능한 지원 옵션에 대한 정보입니다."
+
+msgid "Package name"
+msgstr "패키지 이름"
+
+msgid "Proper Modem Configuration."
+msgstr "적절한 모뎀 구성입니다."
+
+msgid "User should remember:"
+msgstr "사용자가 기억해야 할 사항:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. 특정 모뎀의 경우 모뎀과 통신하기 위해 하나의 프로토콜만 설정해야 합니다."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. 하나의 패키지만 모뎀에서 데이터를 읽을 수 있습니다 (동시에)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. 모뎀에서 너무 자주 데이터를 읽으면 멈을 수 있습니다 (MM과 uqmi는 더 많은 시간이 필요합니다)."
+
+msgid "BTS search: no response from server."
+msgstr "BTS 검색: 서버에서 응답이 없습니다."
+
+msgid "BTS search: no results found."
+msgstr "BTS 검색: 결과를 찾을 수 없습니다."
+
+msgid "this month"
+msgstr "이번 달"
+
+msgid "month ago"
+msgstr "1개월 전"
+
+msgid "months ago"
+msgstr "개월 전"
+
+msgid "Station ID"
+msgstr "스테이션 ID"
+
+msgid "Confirmed"
+msgstr "확인됨"
+
+msgid "Updated"
+msgstr "업데이트됨"
+
+msgid "Show on map"
+msgstr "지도에 표시"
+
+msgid "Download data"
+msgstr "데이터 다운로드"
+
+msgid "Install curl"
+msgstr "curl 설치"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "참고: 이 패키지는 BTSearch 웹사이트의 최신 제3세대 버전과 완전히 호환됩니다."
+
+msgid "Skip package verification"
+msgstr "패키지 확인 건너뛰기"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "이 옵션을 활성화하면 설치된 패키지 확인을 건너뛰고 아래 목록에서 원하는 방법을 선택할 수 있습니다."
diff --git a/modemdata/luci-app-modemdata/po/nl/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/nl/luci-app-modemdata.po
new file mode 100644
index 000000000..bd9c824c4
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/nl/luci-app-modemdata.po
@@ -0,0 +1,742 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: nl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Voor meer informatie over het modemdata-pakket, bezoek: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Het pakket stelt de gebruiker in staat om de gegevens te bekijken die uit de modem zijn gelezen, om de parameters van de verbinding met het mobiele netwerk te zien."
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl forum"
+
+msgid "Signal strength"
+msgstr "Signaalsterkte"
+
+msgid "Modem(s)"
+msgstr "Modem(s)"
+
+msgid "Ups.. no modems detected."
+msgstr "Oeps.. geen modems gedetecteerd."
+
+msgid "Configuration"
+msgstr "Configuratie"
+
+msgid "General Information"
+msgstr "Algemene informatie"
+
+msgid "Modem Information"
+msgstr "Modeminformatie"
+
+msgid "Cell Information"
+msgstr "Cel-informatie"
+
+msgid "Connection"
+msgstr "Verbinding"
+
+msgid "Technology"
+msgstr "Technologie"
+
+msgid "Operator"
+msgstr "Provider"
+
+msgid "Location"
+msgstr "Locatie"
+
+msgid "Sent"
+msgstr "Verzonden"
+
+msgid "Connection time"
+msgstr "Verbindungstijd"
+
+msgid "Modem type"
+msgstr "Modemtype"
+
+msgid "Hide data."
+msgstr "Gegevens verbergen."
+
+msgid "Hide selected data"
+msgstr "Geselecteerde gegevens verbergen"
+
+msgid "Additional information"
+msgstr "Aanvullende informatie"
+
+msgid "Revision / FW"
+msgstr "Revisie / FW"
+
+msgid "IP adress / Port"
+msgstr "IP-adres / Poort"
+
+msgid "Chip Temperature"
+msgstr "Chiptemperatuur"
+
+msgid "Configuration modemdata package"
+msgstr "Configuratie modemdata-pakket"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Configuratiepaneel voor modemdata en GUI-applicatie."
+
+msgid "Add data to hide"
+msgstr "Te verbergen gegevens toevoegen"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Voer de gegevens in die u wilt verbergen, bijv. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Pagina openen"
+
+msgid "Download data (experimental)"
+msgstr "Gegevens downloaden (experimenteel)"
+
+msgid "Network"
+msgstr "Netwerk"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "IP-adres / Poort voor communicatie met de modem"
+
+msgid "Defined modems"
+msgstr "Gedefinieerde modems"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interface om de beschikbare modems te definiëren. De lijst met modems maakt het voor de gebruiker gemakkelijker om in LuCI tussen modems te schakelen."
+
+msgid "Settings"
+msgstr "Instellingen"
+
+msgid "Add new modem settings..."
+msgstr "Nieuwe modeminstellingen toevoegen..."
+
+msgid "Modem Settings"
+msgstr "Modeminstellingen"
+
+msgid "Manufacturer / Product"
+msgstr "Fabrikant / Product"
+
+msgid "Please select a modem"
+msgstr "Selecteer een modem"
+
+msgid "IP adress / Port for communication"
+msgstr "IP-adres / Poort voor communicatie"
+
+msgid "Protocol"
+msgstr "Protocol"
+
+msgid "Port for communication"
+msgstr "Poort voor communicatie"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Selecteer een QMI/MBIM-poort"
+
+msgid "Modem id"
+msgstr "Modem-ID"
+
+msgid "Please select a modem id"
+msgstr "Selecteer een modem-ID"
+
+msgid "MBIM device"
+msgstr "MBIM-apparaat"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Selecteer als u wilt lezen vanuit MBIM."
+
+msgid "Assigned interface"
+msgstr "Toegewezen interface"
+
+msgid "Interface assigned to modem."
+msgstr "Interface toegewezen aan modem."
+
+msgid "Enter IP adress"
+msgstr "Voer IP-adres in"
+
+msgid "IP adress"
+msgstr "IP-adres"
+
+msgid "Reading data via"
+msgstr "Gegevens lezen via"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Poort / IP / Modem-identificatie"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Voer de modemnaam handmatig in als de voorgestelde naam niet "
+"duidelijk is.
Belangrijk De modemnaam wordt alleen gezocht voor via USB aangesloten modems."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Selecteer de methode voor het lezen van gegevens uit de modem.
seriële poort: Selecteer een van de beschikbare "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN-poorten.
ecm: Voer het IP-adres 192.168.X.X in waaronder de modem (Huawei) "
+"beschikbaar is.
uqmi: Selecteer een van de beschikbare cdc-wdmX-poorten.
ModemManager: Selecteer "
+"een van de gezochte modem-identificaties."
+
+msgid "Please select a port"
+msgstr "Selecteer een poort"
+
+msgid "User description"
+msgstr "Gebruikersbeschrijving"
+
+msgid "Optional"
+msgstr "Optioneel"
+
+msgid "User description (optional)"
+msgstr "Gebruikersbeschrijving (optioneel)"
+
+msgid "Excellent"
+msgstr "Uitstekend"
+
+msgid "Good"
+msgstr "Goed"
+
+msgid "Fair"
+msgstr "Redelijk"
+
+msgid "Poor"
+msgstr "Slecht"
+
+msgid "Physical cell ID"
+msgstr "Fysieke cel-ID"
+
+msgid "Bandwidth"
+msgstr "Bandbreedte"
+
+msgid "SIM status"
+msgstr "SIM-status"
+
+msgid "Not registered"
+msgstr "Niet geregistreerd"
+
+msgid "Registered, home"
+msgstr "Geregistreerd, thuisnetwerk"
+
+msgid "Registered (roaming)"
+msgstr "Geregistreerd (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Geregistreerd, alleen SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Geregistreerd (roaming), alleen SMS"
+
+msgid "Searching.."
+msgstr "Zoeken..."
+
+msgid "Connection state"
+msgstr "Verbindingsstatus"
+
+msgid "Connected"
+msgstr "Verbonden"
+
+msgid "Disconnected"
+msgstr "Verbinding verbroken"
+
+msgid "Registering denied"
+msgstr "Registratie geweigerd"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Wachten om gegevens uit de modem te lezen..."
+
+msgid "Waiting for data..."
+msgstr "Wachten op gegevens..."
+
+msgid "BTS Search"
+msgstr "BTS zoeken"
+
+msgid "BTS Information"
+msgstr "BTS-informatie"
+
+msgid "Search"
+msgstr "Zoeken"
+
+msgid "Bands"
+msgstr "Banden"
+
+msgid "Search BTS"
+msgstr "BTS zoeken"
+
+msgid "BTS search settings"
+msgstr "BTS-zoekinstellingen"
+
+msgid "Website to search for BTS"
+msgstr "Website om naar BTS te zoeken"
+
+msgid "Select a website for searching."
+msgstr "Selecteer een website om te zoeken."
+
+msgid "Install a package using package manager"
+msgstr "Installeer een pakket met behulp van de pakketbeheerder"
+
+msgid "Select an action after clicking the search button."
+msgstr "Selecteer een actie na het klikken op de zoekknop."
+
+msgid "Install iconv"
+msgstr "Installeer iconv"
+
+msgid "Install qmi-utils"
+msgstr "Installeer qmi-utils"
+
+msgid "SIM Slot"
+msgstr "SIM-slot"
+
+msgid "SIM Card"
+msgstr "SIM-kaart"
+
+msgid "Slot in use"
+msgstr "Slot in gebruik"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Probleem met registreren op het netwerk, controleer de SIM-kaart."
+
+msgid "SIM PIN required"
+msgstr "SIM PIN vereist"
+
+msgid "SIM PUK required"
+msgstr "SIM PUK vereist"
+
+msgid "SIM failure"
+msgstr "SIM-storing"
+
+msgid "SIM busy"
+msgstr "SIM bezet"
+
+msgid "SIM wrong"
+msgstr "Onjuiste SIM-kaart"
+
+msgid "SIM PIN2 required"
+msgstr "SIM PIN2 vereist"
+
+msgid "SIM PUK2 required"
+msgstr "SIM PUK2 vereist"
+
+msgid "Information read from the SIM card and device."
+msgstr "Informatie uitgelezen uit de SIM-kaart en het apparaat."
+
+msgid "No data"
+msgstr "Geen gegevens"
+
+msgid "Diagnostics"
+msgstr "Diagnostiek"
+
+msgid "Modem(s) configuration"
+msgstr "Modem(s)configuratie"
+
+msgid "Package configuration"
+msgstr "Pakketconfiguratie"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Voer verschillende opdrachten uit om de uit de modem gelezen gegevens te verifiëren en scripts te debuggen."
+
+msgid "USB debug information"
+msgstr "USB-foutopsporingsinformatie"
+
+msgid "Check ttyX ports"
+msgstr "Controleer ttyX-poorten"
+
+msgid "Check serial and ecm mode"
+msgstr "Controleer seriële en ecm-modus"
+
+msgid "Check uqmi mode"
+msgstr "Controleer uqmi-modus"
+
+msgid "Check ModemManager mode"
+msgstr "Controleer ModemManager-modus"
+
+msgid "Clear"
+msgstr "Wissen"
+
+msgid "Download"
+msgstr "Downloaden"
+
+msgid "Notes Update date"
+msgstr "Notities Updatetatum"
+
+msgid "Band"
+msgstr "Band"
+
+msgid "Package update and support"
+msgstr "Pakketupdate en ondersteuning"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Laden van index.json-bestand van externe repository mislukt."
+
+msgid "Failed to read downloaded file."
+msgstr "Lezen van gedownload bestand mislukt."
+
+msgid "Installed package is up to date."
+msgstr "Geïnstalleerd pakket is up-to-date."
+
+msgid "Update is available."
+msgstr "Update is beschikbaar."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Het index.json-bestand bevatte geen pakketinformatie."
+
+msgid "Error parsing version."
+msgstr "Fout bij het parsen van de versie."
+
+msgid "Check repository"
+msgstr "Repository controleren"
+
+msgid "Package update..."
+msgstr "Pakketupdate..."
+
+msgid "Report a bug"
+msgstr "Een fout melden"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Schrijf in het topic van het pakket op het eko.one.pl forum"
+
+msgid "Write on forum"
+msgstr "Schrijf op forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Meld een fout op de GitHub-pagina van het pakket"
+
+msgid "Open a package discussion on Github"
+msgstr "Open een pakketdiscussie op GitHub"
+
+msgid "Open discussion"
+msgstr "Discussie openen"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Koop een kop koffie als je de ontwikkeling van het project en de auteur wilt ondersteunen"
+
+msgid "Buy a coffee"
+msgstr "Koop een kop koffie"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Word sponsor als je de ontwikkeling van het project en de auteur wilt ondersteunen"
+
+msgid "Become a sponsor"
+msgstr "Word sponsor"
+
+msgid "Download package information from an external repository"
+msgstr "Download pakketinformatie van een externe repository"
+
+msgid "Add repository and download package update"
+msgstr "Repository toevoegen en pakketupdate downloaden"
+
+msgid "Package Info"
+msgstr "Pakketinfo"
+
+msgid "Compiled"
+msgstr "Gecompileerd"
+
+msgid "Repository Info"
+msgstr "Repository-info"
+
+msgid "Currently installed"
+msgstr "Momenteel geïnstalleerd"
+
+msgid "Package in repository"
+msgstr "Pakket in repository"
+
+msgid "Last repository check"
+msgstr "Laatste repository-controle"
+
+msgid "Poland"
+msgstr "Polen"
+
+msgid "Force read by"
+msgstr "Lezen afdwingen via"
+
+msgid "Select method for reading data from the modem."
+msgstr "Selecteer de methode om gegevens uit de modem te lezen."
+
+msgid "inactive"
+msgstr "inactief"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "PLMN afdwingen"
+
+msgid "Force reading PLMN from file."
+msgstr "Lezen van PLMN uit bestand afdwingen."
+
+msgid "Command result"
+msgstr "Opdrachtresultaat"
+
+msgid "Check"
+msgstr "Controleren"
+
+msgid "Auto update every:"
+msgstr "Automatisch bijwerken elke:"
+
+msgid "2 seconds"
+msgstr "2 seconden"
+
+msgid "3 seconds"
+msgstr "3 seconden"
+
+msgid "5 seconds"
+msgstr "5 seconden"
+
+msgid "10 seconds"
+msgstr "10 seconden"
+
+msgid "30 seconds"
+msgstr "30 seconden"
+
+msgid "45 seconds"
+msgstr "45 seconden"
+
+msgid "60 seconds"
+msgstr "60 seconden"
+
+msgid "Refresh rate"
+msgstr "Vernieuwingsfrequentie"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Stel in hoe vaak de gegevens op het tabblad Modem(s) moeten worden vernieuwd."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Stel in hoe vaak de gegevens op het tabblad Modem(s) moeten worden vernieuwd.
Belangrijk Niet "
+"elke modem / elk protocol kan snel met scripts communiceren. "
+"Een te hoge polling-snelheid kan de modem doen vastlopen. ModemManager en uqmi hebben meer tijd nodig om te reageren."
+
+msgid "Updating again in %s second(s)."
+msgstr "Opnieuw bijwerken in %s seconde(n)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Even geduld a.u.b... gegevensverzameling is bezig."
+
+msgid "Modems found"
+msgstr "Modems gevonden"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Lijst met gevonden modems. Mogelijk worden niet alle modems weergegeven."
+
+msgid "Show modems found"
+msgstr "Gevonden modems tonen"
+
+msgid "Show"
+msgstr "Toon"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Momenteel wordt er alleen gezocht naar modems die via USB zijn aangesloten."
+
+msgid "No Modems Detected..."
+msgstr "Geen modems gedetecteerd..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Oeps.. er zijn geen modems in de instellingen. Je wordt doorgestuurd naar een tabblad waar je de geïnstalleerde modem(s) kunt definiëren."
+
+msgid "Redirecting..."
+msgstr "Doorsturen..."
+
+msgid "Redirecting in"
+msgstr "Doorsturen over"
+
+msgid "seconds..."
+msgstr "seconden..."
+
+msgid "(no data)"
+msgstr "(geen gegevens)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Voer een geldig IP-adres in het formaat 192.168.X.X in"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Alleen cijfers en punten zijn toegestaan"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Elk deel moet een getal van 0 tot 255 zijn"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "In de toekomst zal dit tabblad u in staat stellen om het pakket bij te werken vanuit de externe repository van %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Optie verschijnt na apk-implementatie."
+
+msgid "Author (package maintainer)"
+msgstr "Auteur (pakketbeheerder)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata info"
+
+msgid "Modemdata Status"
+msgstr "Modemdata status"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata info"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Ga naar het tabblad Diagnostiek en voer een scriptcontrole uit. Meestal wordt de fout veroorzaakt door een vreemde providernaam. Om dit op te lossen, selecteert u de optie 'PLMN uit bestand afdwingen' als deze beschikbaar is in de modemconfiguratieopties."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Als de gegevens in LuCI niet zichtbaar zijn, en we er 100% zeker van zijn dat de modem correct is gedefinieerd/geconfigureerd."
+
+msgid "Suggested solution"
+msgstr "Voorgestelde oplossing"
+
+msgid "Troubleshooting / Hints"
+msgstr "Probleemoplossing / Hints"
+
+msgid "Problem"
+msgstr "Probleem"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Veelvoorkomende problemen die kunnen optreden bij het gebruik van het pakket, en manieren om ze op te lossen."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Pakket toont geen gegevens voor de Fibocom FM350-GL modem."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "De modem is erg gevoelig voor gegevens die via de communicatiepoort worden gelezen. Het selecteren van de verkeerde communicatiepoort kan ervoor zorgen dat de modem vastloopt of herstart."
+
+msgid "and"
+msgstr "en"
+
+msgid "packages are recommended for proper modem support."
+msgstr "-pakketten worden aanbevolen voor een juiste modem-ondersteuning."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Selecteer de methode voor het lezen van gegevens uit de modem en installeer de benodigde pakketten."
+
+msgid "Required packages"
+msgstr "Vereiste pakketten"
+
+msgid "Check required packages"
+msgstr "Controleer vereiste pakketten"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Controleer voordat u de modem configureert of alle vereiste pakketten in het systeem zijn geïnstalleerd."
+
+msgid "Loading package data…"
+msgstr "Pakketgegevens laden…"
+
+msgid "Waiting..."
+msgstr "Wachten..."
+
+msgid "Show signal levels"
+msgstr "Signaalniveaus tonen"
+
+msgid "Primary band signal levels"
+msgstr "Signaalniveaus primaire band"
+
+msgid "Device is busy"
+msgstr "Apparaat is bezet"
+
+msgid "Primary band"
+msgstr "Primaire band"
+
+msgid "Available options"
+msgstr "Beschikbare opties"
+
+msgid "Device not found"
+msgstr "Apparaat niet gevonden"
+
+msgid "Click to view Cell ID details"
+msgstr "Klik om details van de Cel-ID te bekijken"
+
+msgid "Cell ID (dec)"
+msgstr "Cel-ID (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "Cel-ID (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "Sector-ID (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "Sector-ID (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "Cel-ID (hex) voor CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "Cel-ID (dec) voor CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Cel-ID informatie"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Gedetailleerde Cel-ID informatie met formaten voor verschillende tools en applicaties."
+
+msgid "Information about package authors and available support options."
+msgstr "Informatie over auteurs van het pakket en beschikbare ondersteuningsopties."
+
+msgid "Package name"
+msgstr "Pakketnaam"
+
+msgid "Proper Modem Configuration."
+msgstr "Juiste modemconfiguratie."
+
+msgid "User should remember:"
+msgstr "De gebruiker moet onthouden:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Voor een specifieke modem mag er slechts één protocol worden ingesteld voor communicatie met de modem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Slechts één pakket kan tegelijkertijd gegevens uit de modem lezen."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Te vaak gegevens uit de modem lezen kan ervoor zorgen dat deze vastloopt (MM en uqmi hebben meer tijd nodig)."
+
+msgid "BTS search: no response from server."
+msgstr "BTS zoeken: geen reactie van server."
+
+msgid "BTS search: no results found."
+msgstr "BTS zoeken: geen resultaten gevonden."
+
+msgid "this month"
+msgstr "deze maand"
+
+msgid "month ago"
+msgstr "maand geleden"
+
+msgid "months ago"
+msgstr "maanden geleden"
+
+msgid "Station ID"
+msgstr "Station-ID"
+
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgid "Updated"
+msgstr "Bijgewerkt"
+
+msgid "Show on map"
+msgstr "Op kaart tonen"
+
+msgid "Download data"
+msgstr "Gegevens downloaden"
+
+msgid "Install curl"
+msgstr "Installeer curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Opmerking: Het pakket is volledig compatibel met de nieuwste, derde generatie versie van de BTSearch-website."
+
+msgid "Skip package verification"
+msgstr "Pakketverificatie overslaan"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Schakel deze optie in om de controle van geïnstalleerde pakketten over te slaan en elke methode uit de onderstaande lijst te kunnen selecteren."
diff --git a/modemdata/luci-app-modemdata/po/pl/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/pl/luci-app-modemdata.po
new file mode 100644
index 000000000..d8bb89cb0
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/pl/luci-app-modemdata.po
@@ -0,0 +1,755 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Aby uzyskać więcej informacji o pakiecie modemdata, odwiedź %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Pakiet umożliwia użytkownikowi podgląd danych odczytanych z modemu, wgląd w parametry połączenia z siecią komórkową."
+
+msgid "eko.one.pl forum"
+msgstr "forum eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Siła sygnału"
+
+msgid "Modem(s)"
+msgstr "Modem(-y)"
+
+msgid "Ups.. no modems detected."
+msgstr "Ups.. nie wykryto modemu."
+
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgid "General Information"
+msgstr "Informacje ogólne"
+
+msgid "Modem Information"
+msgstr "Informacje o modemie"
+
+msgid "Cell Information"
+msgstr "Informacje o sieci"
+
+msgid "Connection"
+msgstr "Połączenie"
+
+msgid "Technology"
+msgstr "Technologia"
+
+msgid "Operator"
+msgstr "Operator"
+
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgid "Sent"
+msgstr "Wysłano"
+
+msgid "Signal strength"
+msgstr "Siła sygnału"
+
+msgid "Connection time"
+msgstr "Czas połączenia"
+
+msgid "Modem type"
+msgstr "Typ modemu"
+
+msgid "Hide data."
+msgstr "Ukryj dane."
+
+msgid "Hide selected data"
+msgstr "Ukryj wybrane dane"
+
+msgid "Additional information"
+msgstr "Informacje dodatkowe"
+
+msgid "Revision / FW"
+msgstr "Rewizja / FW"
+
+msgid "IP adress / Port"
+msgstr "Adres IP / Port"
+
+msgid "Chip Temperature"
+msgstr "Temperatura układu"
+
+msgid "Configuration modemdata package"
+msgstr "Konfiguracja pakietu modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Panel konfiguracyjny dla pakietu modemdata oraz interfejsu użytkownika."
+
+msgid "Add data to hide"
+msgstr "Dodaj dane do ukrycia"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Wprowadź dane, które chcesz ukryć, np. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Otwórz stronę"
+
+msgid "Download data (experimental)"
+msgstr "Pobierz dane (eksperymentalne)"
+
+msgid "Network"
+msgstr "Sieć"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Adres IP / Port do komunikacji z modemem"
+
+msgid "Defined modems"
+msgstr "Zdefiniowane modemy"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interfejs umożliwia zdefiniowanie dostępnych modemów. Lista modemów ułatwi użytkownikowi przełączanie się między modemami z poziomu LuCI."
+
+msgid "Settings"
+msgstr "Ustawnienia"
+
+msgid "Add new modem settings..."
+msgstr "Dodaj nowe ustawienia modemu..."
+
+msgid "Modem Settings"
+msgstr "Ustawienia modemu"
+
+msgid "Manufacturer / Product"
+msgstr "Producent / Produkt"
+
+msgid "Please select a modem"
+msgstr "Proszę wybrać modem"
+
+msgid "IP adress / Port for communication"
+msgstr "Adres IP / Port do komunikacji"
+
+msgid "Protocol"
+msgstr "Protokół"
+
+msgid "Port for communication"
+msgstr "Port do komunikacji"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Proszę wybrać port QMI/MBIM"
+
+msgid "Modem id"
+msgstr "Identyfikacja modemu"
+
+msgid "Please select a modem id"
+msgstr "Proszę wybrać id modemu"
+
+msgid "MBIM device"
+msgstr "Urządzenie MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Zaznacz, jeśli chcesz czytać z MBIM."
+
+msgid "Assigned interface"
+msgstr "Przypisany interfejs"
+
+msgid "Interface assigned to modem."
+msgstr "Interface assigned to modem."
+
+msgid "Enter IP adress"
+msgstr "Wprowadź adres IP modemu"
+
+msgid "IP adress"
+msgstr "Adres IP"
+
+msgid "Reading data via"
+msgstr "Odczyt danych przez"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Port / adres IP / Id modemu"
+
+msgid "Interface assigned to modem."
+msgstr "Interfejs przypisany do modemu."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Wpisz nazwę modemu ręcznie jeżeli sugerowana nazwa jest "
+"nieoczywista.
Ważne Nazwa modemu jest wyszukiwana tylko dla modemów podłączonych przez USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Wybierz metodę odczytu danych z modemu.
port szeregowy: Wybierz jeden z dostępnych "
+"portów ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Wprowadź adres IP 192.168.X.X, pod którym modem (Huawei) "
+"jest dostępny.
uqmi: Wybierz jeden z dostępnych portów cdc-wdmX.
Menedżer modemu: Wybierz "
+"jeden z wyszukanych identyfikatorów modemu."
+
+msgid "Please select a port"
+msgstr "Proszę wybrać port"
+
+msgid "User description"
+msgstr "Opis użytkownika"
+
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgid "User description (optional)"
+msgstr "Opis użytkownika (opcjonalny)"
+
+msgid "Signal strength"
+msgstr "Siła sygnału"
+
+msgid "Excellent"
+msgstr "Doskonały"
+
+msgid "Good"
+msgstr "Dobry"
+
+msgid "Fair"
+msgstr "Średni"
+
+msgid "Poor"
+msgstr "Słaby"
+
+msgid "Physical cell ID"
+msgstr "ID fiz. komórki"
+
+msgid "Bandwidth"
+msgstr "Szerokość"
+
+msgid "SIM status"
+msgstr "Status SIM"
+
+msgid "Not registered"
+msgstr "Nie zalogowana do sieci"
+
+msgid "Registered, home"
+msgstr "Zalogowana do sieci macierzystej"
+
+msgid "Registered (roaming)"
+msgstr "Zalogowana do sieci (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Zalogowana do sieci, tylko SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Zalogowana do sieci (roaming), tylko SMS"
+
+msgid "Searching.."
+msgstr "Wyszukiwanie.."
+
+msgid "Connection state"
+msgstr "Status połączenia"
+
+msgid "Connected"
+msgstr "Połączony"
+
+msgid "Disconnected"
+msgstr "Rozłączony"
+
+msgid "Registering denied"
+msgstr "Odmowa zalogowana do sieci"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Oczekiwanie na odczyt danych z modemu..."
+
+msgid "Waiting for data..."
+msgstr "Oczekiwanie na dane..."
+
+msgid "BTS Search"
+msgstr "Lokalizacja stacji bazowej"
+
+msgid "BTS Information"
+msgstr "Informacje o stacji bazowej"
+
+msgid "Search"
+msgstr "Szukaj"
+
+msgid "Bands"
+msgstr "Pasma"
+
+msgid "Search BTS"
+msgstr "Wyszukaj BTS"
+
+msgid "BTS search settings"
+msgstr "Ustawienia wyszukiwania stacji bazowej"
+
+msgid "Website to search for BTS"
+msgstr "Strona do wyszukiwania BTS"
+
+msgid "Select a website for searching."
+msgstr "Wybierz stronę internetową służącą do wyszukiwania."
+
+msgid "Install a package using package manager"
+msgstr "Zainstaluj pakiet za pomocą menedżera pakietów"
+
+msgid "Select an action after clicking the search button."
+msgstr "Wybierz akcję po kliknięciu przycisku wyszukiwania."
+
+msgid "Install iconv"
+msgstr "Zainstaluj iconv"
+
+msgid "Install qmi-utils"
+msgstr "Zainstaluj qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Slot SIM"
+
+msgid "SIM Card"
+msgstr "Karta SIM"
+
+msgid "Slot in use"
+msgstr "Slot w użyciu"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Problem z rejestracją do sieci, sprawdź kartę SIM."
+
+msgid "SIM PIN required"
+msgstr "Wymagany jest kod PIN dla karty SIM"
+
+msgid "SIM PUK required"
+msgstr "Wymagany jest kod PUK dla karty SIM"
+
+msgid "SIM failure"
+msgstr "Awaria karty SIM"
+
+msgid "SIM busy"
+msgstr "Karta SIM jest zajęta"
+
+msgid "SIM wrong"
+msgstr "Nieprawidłowa karta SIM"
+
+msgid "SIM PIN2 required"
+msgstr "Wymagany jest kod PIN2 dla karty SIM"
+
+msgid "SIM PUK2 required"
+msgstr "Wymagany jest kod PUK2 dla karty SIM"
+
+msgid "Defined modems"
+msgstr "Zdefiniowane modemy"
+
+msgid "Information read from the SIM card and device."
+msgstr "Informacje odczytane z karty SIM oraz z urządzenia."
+
+msgid "No data"
+msgstr "Brak danych"
+
+msgid "Diagnostics"
+msgstr "Diagnostyka"
+
+msgid "Modem(s) configuration"
+msgstr "Konfiguracja modemu(-ów)"
+
+msgid "Package configuration"
+msgstr "Konfiguracja pakietu"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Uruchom różne polecenia, aby zweryfikować dane odczytywane z modemu oraz debugować skrypty."
+
+msgid "USB debug information"
+msgstr "Debugowanie portu USB"
+
+msgid "Check ttyX ports"
+msgstr "Sprawdź dostępność portów ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Sprawdź tryb serial oraz ecm"
+
+msgid "Check uqmi mode"
+msgstr "Sprawdź tryb uqmi"
+
+msgid "Check ModemManager mode"
+msgstr "Sprawdź tryb Menedżera modemu"
+
+msgid "Clear"
+msgstr "Wyczyść"
+
+msgid "Download"
+msgstr "Pobierz"
+
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgid "Notes Update date"
+msgstr "Uwagi Data akt."
+
+msgid "Band"
+msgstr "Pasmo"
+
+msgid "Network"
+msgstr "Sieć"
+
+msgid "Package update and support"
+msgstr "Aktualizacja pakietu oraz wsparcie"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Nie udało się pobrać pliku index.json z zewnętrznego repozytorium."
+
+msgid "Failed to read downloaded file."
+msgstr "Nie udało się odczytać pobranego pliku."
+
+msgid "Installed package is up to date."
+msgstr "Zainstalowany pakiet jest aktualny."
+
+msgid "Update is available."
+msgstr "Aktualizacja jest dostępna."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Plik index.json nie zawierał żadnych informacji o pakiecie."
+
+msgid "Error parsing version."
+msgstr "Błąd parsowania wersji."
+
+msgid "Check repository"
+msgstr "Sprawdź repozytorium"
+
+msgid "Package update..."
+msgstr "Aktualizuj pakiet..."
+
+msgid "Report a bug"
+msgstr "Zgłoś błąd"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Napisz w temacie pakietu na forum eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Napisz na forum"
+
+msgid "Report a bug on the package Github page"
+msgstr "Zgłoś błąd na stronie Github pakietu"
+
+msgid "Open a package discussion on Github"
+msgstr "Otwórz dyskusję na temat pakietu na Github"
+
+msgid "Open discussion"
+msgstr "Otwórz dyskusję"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Postaw kawę jeśli chcesz wesprzeć rozwój projektu oraz autora"
+
+msgid "Buy a coffee"
+msgstr "Postaw kawę"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Zostań sponsorem jeśli chcesz wesprzeć rozwój projektu oraz autora"
+
+msgid "Become a sponsor"
+msgstr "Zostań sponsorem"
+
+msgid "Download package information from an external repository"
+msgstr "Pobierz informacje o pakietach z zewnętrznego repozytorium"
+
+msgid "Add repository and download package update"
+msgstr "Dodaj repozytorium i pobierz aktualizację pakietu"
+
+msgid "Package Info"
+msgstr "Informacja o pakiecie"
+
+msgid "Compiled"
+msgstr "Skompilowano"
+
+msgid "Repository Info"
+msgstr "Dane z repozytorium"
+
+msgid "Currently installed"
+msgstr "Aktualnie zainstalowany"
+
+msgid "Package in repository"
+msgstr "Dostępny w repozytorium"
+
+msgid "Last repository check"
+msgstr "Ostatnie sprawdzenie repozytorium"
+
+msgid "Poland"
+msgstr "Polska"
+
+msgid "Force read by"
+msgstr "Wymuś odczyt przez"
+
+msgid "Select method for reading data from the modem."
+msgstr "Wybierz metodę odczytu danych z modemu."
+
+msgid "inactive"
+msgstr "nieaktywne"
+
+msgid "ModemMenager"
+msgstr "Menadżer modemu"
+
+msgid "Force PLMN"
+msgstr "Wymuś PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Wymuś odczyt PLMN z pliku."
+
+msgid "Command result"
+msgstr "Wynik polecenia"
+
+msgid "Check"
+msgstr "Sprawdź"
+
+msgid "Auto update every:"
+msgstr "Automatyczna aktualizacja co:"
+
+msgid "2 seconds"
+msgstr "2 sekundy"
+
+msgid "3 seconds"
+msgstr "3 sekundy"
+
+msgid "5 seconds"
+msgstr "5 sekund"
+
+msgid "10 seconds"
+msgstr "10 sekund"
+
+msgid "30 seconds"
+msgstr "30 sekund"
+
+msgid "45 seconds"
+msgstr "45 sekund"
+
+msgid "60 seconds"
+msgstr "60 sekund"
+
+msgid "Refresh rate"
+msgstr "Częstotliwość odświeżania"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Ustaw jak często mają być odświeżane dane w zakładce Modem(-y)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Ustaw częstotliwość odświeżania danych w zakładce Modem(y).
Ważne Nie "
+"każdy modem / protokół może szybko komunikować się ze skryptami. "
+"Zbyt duża częstotliwość odpytywania może spowodować zawieszenie modemu. Menedżer modemu i uqmi potrzebują więcej czasu na odpowiedź."
+
+msgid "Updating again in %s second(s)."
+msgstr "Aktualizacja ponownie za %s sekund(-y)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Proszę czekać... trwa zbieranie danych."
+
+msgid "Modems found"
+msgstr "Znalezione modemy"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Lista znalezionych modemów. Nie wszystkie modemy mogą tu być pokazane."
+
+msgid "Show modems found"
+msgstr "Pokaż znalezione modemy"
+
+msgid "Show"
+msgstr "Pokaż"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Obecnie wyszukiwane są tylko modemy podłączone przez USB."
+
+msgid "No Modems Detected..."
+msgstr "Nie wykryto modemów..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ups... w ustawieniach nie ma modemów. Za moment zostaniesz przekierowany do zakładki, w której możesz zdefiniować zainstalowane modemy."
+
+msgid "Redirecting..."
+msgstr "Przekierowywanie..."
+
+msgid "Redirecting in"
+msgstr "Przekierowanie za"
+
+msgid "seconds..."
+msgstr "sekund..."
+
+msgid "(no data)"
+msgstr "(brak danych)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Wprowadź prawidłowy adres IP w formacie 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Dozwolone są tylko liczby i kropki."
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Każda część musi być liczbą z zakresu od 0 do 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "W przyszłości zakładka pozwoli zaktualizować pakiet z zewnętrznego repozytorium %sRafała (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Opcja pojawi się po wdrożeniu apk."
+
+msgid "Author (package maintainer)"
+msgstr "Autor (opiekun pakietu)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata info"
+
+msgid "Modemdata Status"
+msgstr "Modemdata status"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Informacje o pakiecie luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Wejdź w zakładkę Diagnostyka i wykonaj sprawdzenie skryptu. Najczęściej błąd wywołuje dziwna nazwa operatora. Aby to naprawić zaznacz opcję wymuś PLMN z pliku jeżeli jest dostępna w opcjach konfiguracji modemu."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Jeżeli dane w LuCI nie są widoczne, a wiemy na 100% że modem został zdefiniowany / skonfigurowany poprawnie."
+
+msgid "Suggested solution"
+msgstr "Sugerowane rozwiązanie"
+
+msgid "Troubleshooting / Hints"
+msgstr "Rozwiązywanie problemów / Porady"
+
+msgid "Problem"
+msgstr "Problem"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Typowe problemy, które mogą pojawić się podczas korzystania z pakietu, oraz sposoby ich rozwiązania."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Pakiet nie wyświetla danych dla modemu Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Modem jest bardzo wrażliwy na odczytywanie danych przez port komunikacyjny. Wybranie niewłaściwego portu komunikacyjnego może spowodować zawieszenie się modemu lub jego ponowne uruchomienie."
+
+msgid "and"
+msgstr "oraz"
+
+msgid "packages are recommended for proper modem support."
+msgstr "zalecane pakiety dla prawidłowej obsługi modemu."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Proszę wybrać metodę odczytu danych z modemu oraz zainstalować niezbędne pakiety."
+
+msgid "Required packages"
+msgstr "Wymagane pakiety"
+
+msgid "Check required packages"
+msgstr "Sprawdź wymagane pakiety"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Przed skonfigurowaniem modemu sprawdź, czy wszystkie wymagane pakiety są zainstalowane w systemie."
+
+msgid "Loading package data…"
+msgstr "Wczytywanie danych..."
+
+msgid "Waiting..."
+msgstr "Czekam..."
+
+msgid "Show signal levels"
+msgstr "Pokaż poziomy sygnałów"
+
+msgid "Primary band signal levels"
+msgstr "Poziomy sygnałów dla pasma podstawowego"
+
+msgid "Device is busy"
+msgstr "Urządzenie jest zajęte"
+
+msgid "Primary band"
+msgstr "Pasmo podstawowe"
+
+msgid "Available options"
+msgstr "Dostępne opcje"
+
+msgid "Device not found"
+msgstr "Urządzenia nie znaleziono"
+
+msgid "Click to view Cell ID details"
+msgstr "Kliknij, aby wyświetlić szczegóły identyfikatora komórki"
+
+msgid "Cell ID (dec)"
+msgstr "Identyfikator komórki (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "Identyfikator komórki (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "Identyfikator eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "Identyfikator sektora (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "Identyfikator eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "Identyfikator sektora (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "Identyfikator komórki (hex) dla strony CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "Identyfikator komórki (dec) dla strony CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Informacje o identyfikatorze komórki"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Szczegółowe informacje o identyfikatorze komórki w formatach dla różnych narzędzi i aplikacji."
+
+msgid "Information about package authors and available support options."
+msgstr "Informacja o autorach i dostępnych opcjach wsparcia."
+
+msgid "Package name"
+msgstr "Nazwa pakietu"
+
+msgid "Proper Modem Configuration."
+msgstr "Poprawna konfiguracja modemu."
+
+msgid "User should remember:"
+msgstr "Użytkownik powinien zapamiętać:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Dla konkretnego modemu należy ustawić tylko jeden protokół komunikacji z modemem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Tylko jeden pakiet może odczytywać dane z modemu (w tym samym czasie)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Zbyt częste odczytywanie danych z modemu może spowodować jego zawieszenie (MM i uqmi potrzebują więcej czasu)."
+
+msgid "BTS search: no response from server."
+msgstr "Wyszukiwanie BTS: brak odpowiedzi z serwera."
+
+msgid "BTS search: no results found."
+msgstr "Wyszukiwanie BTS: nie znaleziono wyników."
+
+msgid "this month"
+msgstr "w tym miesiącu"
+
+msgid "month ago"
+msgstr "miesiąc temu"
+
+msgid "months ago"
+msgstr "miesięcy temu"
+
+msgid "Station ID"
+msgstr "ID stacji"
+
+msgid "Confirmed"
+msgstr "Potwierdzony"
+
+msgid "Updated"
+msgstr "Zaktualizowany"
+
+msgid "Show on map"
+msgstr "Pokaż na mapie"
+
+msgid "Download data"
+msgstr "Pobierz dane"
+
+msgid "Install curl"
+msgstr "Zainstaluj curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Nota: Pakiet jest w pełni kompatybilny z najnowszą, trzecią generację strony BTSearch."
+
+msgid "Skip package verification"
+msgstr "Pomiń weryfikację pakietów"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Włączenie tej opcji pomija sprawdzanie zainstalowanych pakietów i pozwala wybrać dowolną metodę z listy poniżej."
diff --git a/modemdata/luci-app-modemdata/po/pt_BR/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/pt_BR/luci-app-modemdata.po
new file mode 100644
index 000000000..60a83ac01
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/pt_BR/luci-app-modemdata.po
@@ -0,0 +1,608 @@
+msgid ""
+msgstr ""
+"Language: pt_BR\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Para mais informações sobre o pacote modemdata, visite: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "O pacote permite que o usuário visualize os dados lidos do modem e veja os parâmetros de conexão da rede móvel."
+
+msgid "eko.one.pl forum"
+msgstr "fórum eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Força do sinal"
+
+msgid "Modem(s)"
+msgstr "Modem(s)"
+
+msgid "Ups.. no modems detected."
+msgstr "Ops.. nenhum modem detectado."
+
+msgid "Configuration"
+msgstr "Configuração"
+
+msgid "General Information"
+msgstr "Informações Gerais"
+
+msgid "Modem Information"
+msgstr "Informações do Modem"
+
+msgid "Cell Information"
+msgstr "Informações da Célula"
+
+msgid "Connection"
+msgstr "Conexão"
+
+msgid "Technology"
+msgstr "Tecnologia"
+
+msgid "Operator"
+msgstr "Operadora"
+
+msgid "Location"
+msgstr "Localização"
+
+msgid "Sent"
+msgstr "Enviado"
+
+msgid "Signal strength"
+msgstr "Força do sinal"
+
+msgid "Connection time"
+msgstr "Tempo de conexão"
+
+msgid "Modem type"
+msgstr "Tipo de modem"
+
+msgid "Hide data."
+msgstr "Ocultar dados."
+
+msgid "Hide selected data"
+msgstr "Ocultar dados selecionados"
+
+msgid "Additional information"
+msgstr "Informações Adicionais"
+
+msgid "Revision / FW"
+msgstr "Revisão / FW"
+
+msgid "IP adress / Port"
+msgstr "Endereço IP / Porta"
+
+msgid "Chip Temperature"
+msgstr "Temperatura do Chip"
+
+msgid "Configuration modemdata package"
+msgstr "Configuração do pacote modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Painel de configuração para modemdata e aplicação gui."
+
+msgid "Add data to hide"
+msgstr "Adicionar dados a ocultar"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Digite os dados que deseja ocultar, por exemplo IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Abrir página"
+
+msgid "Download data (experimental)"
+msgstr "Baixar dados (experimental)"
+
+msgid "Network"
+msgstr "Rede"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Endereço IP / Porta para comunicação com o modem"
+
+msgid "Defined modems"
+msgstr "Modems definidos"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Interface para definir os modems disponíveis. A lista de modems facilitará para o usuário alternar entre modems no LuCI."
+
+msgid "Settings"
+msgstr "Configurações"
+
+msgid "Add new modem settings..."
+msgstr "Adicionar novas configurações de modem..."
+
+msgid "Modem Settings"
+msgstr "Configurações do Modem"
+
+msgid "Manufacturer / Product"
+msgstr "Fabricante / Produto"
+
+msgid "Please select a modem"
+msgstr "Selecione um modem"
+
+msgid "IP adress / Port for communication"
+msgstr "Endereço IP / Porta para comunicação"
+
+msgid "Protocol"
+msgstr "Protocolo"
+
+msgid "Port for communication"
+msgstr "Porta para comunicação"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Selecione uma porta QMI/MBIM"
+
+msgid "Modem id"
+msgstr "ID do modem"
+
+msgid "Please select a modem id"
+msgstr "Selecione um ID do modem"
+
+msgid "MBIM device"
+msgstr "Dispositivo MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Selecione se deseja ler do MBIM."
+
+msgid "Assigned interface"
+msgstr "Interface atribuída"
+
+msgid "Interface assigned to modem."
+msgstr "Interface atribuída ao modem."
+
+msgid "Enter IP adress"
+msgstr "Digite o endereço IP"
+
+msgid "IP adress"
+msgstr "Endereço IP"
+
+msgid "Reading data via"
+msgstr "Lendo dados via"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Porta / IP / Identificador do modem"
+
+msgid "Interface assigned to modem."
+msgstr "Interface atribuída ao modem."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Digite o nome do modem manualmente se o nome sugerido não for "
+"óbvio.
Importante O nome do modem é procurado apenas para modems conectados via USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Selecione o método para ler dados do modem.
porta serial: Selecione uma das portas "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN disponíveis.
ecm: Digite o endereço IP 192.168.X.X sob o qual o modem (Huawei) "
+"está disponível.
uqmi: Selecione uma das portas cdc-wdmX disponíveis.
ModemManager: Selecione "
+"um dos identificadores de modem pesquisados."
+
+msgid "Please select a port"
+msgstr "Selecione uma porta"
+
+msgid "User description"
+msgstr "Descrição do usuário"
+
+msgid "Optional"
+msgstr "Opcional"
+
+msgid "User description (optional)"
+msgstr "Descrição do usuário (opcional)"
+
+msgid "Signal strength"
+msgstr "Força do sinal"
+
+msgid "Excellent"
+msgstr "Excelente"
+
+msgid "Good"
+msgstr "Bom"
+
+msgid "Fair"
+msgstr "Regular"
+
+msgid "Poor"
+msgstr "Fraco"
+
+msgid "Physical cell ID"
+msgstr "ID de célula física"
+
+msgid "Bandwidth"
+msgstr "Largura de banda"
+
+msgid "SIM status"
+msgstr "Status do SIM"
+
+msgid "Not registered"
+msgstr "Não registrado"
+
+msgid "Registered"
+msgstr "Registrado"
+
+msgid "Registered (roaming)"
+msgstr "Registrado (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Registrado, apenas SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Registrado (roaming), apenas SMS"
+
+msgid "Searching.."
+msgstr "Procurando.."
+
+msgid "Connection state"
+msgstr "Estado da conexão"
+
+msgid "Connected"
+msgstr "Conectado"
+
+msgid "Disconnected"
+msgstr "Desconectado"
+
+msgid "Registering denied"
+msgstr "Registro negado"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Aguardando leitura de dados do modem..."
+
+msgid "Waiting for data..."
+msgstr "Aguardando dados..."
+
+msgid "BTS Search"
+msgstr "Pesquisa de BTS"
+
+msgid "BTS Information"
+msgstr "Informações de BTS"
+
+msgid "Search"
+msgstr "Pesquisar"
+
+msgid "Bands"
+msgstr "Bandas"
+
+msgid "Search BTS"
+msgstr "Pesquisar BTS"
+
+msgid "BTS search settings"
+msgstr "Configurações de pesquisa de BTS"
+
+msgid "Website to search for BTS"
+msgstr "Site para pesquisar BTS"
+
+msgid "Select a website for searching."
+msgstr "Selecione um site para pesquisar."
+
+msgid "Install a package using package manager"
+msgstr "Instalar um pacote usando o gerenciador de pacotes"
+
+msgid "Select an action after clicking the search button."
+msgstr "Selecione uma ação após clicar no botão de pesquisa."
+
+msgid "Install iconv"
+msgstr "Instalar iconv"
+
+msgid "Install qmi-utils"
+msgstr "Instalar qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Slot SIM"
+
+msgid "SIM Card"
+msgstr "Cartão SIM"
+
+msgid "Slot in use"
+msgstr "Slot em uso"
+
+msgid "Last repository check"
+msgstr "Última verificação de repositório"
+
+msgid "Poland"
+msgstr "Polônia"
+
+msgid "Force read by"
+msgstr "Forçar leitura por"
+
+msgid "Select method for reading data from the modem."
+msgstr "Selecione o método para ler dados do modem."
+
+msgid "inactive"
+msgstr "inativo"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "Forçar PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Forçar leitura de PLMN do arquivo."
+
+msgid "Command result"
+msgstr "Resultado do comando"
+
+msgid "Check"
+msgstr "Verificar"
+
+msgid "Auto update every:"
+msgstr "Atualizar automaticamente a cada:"
+
+msgid "2 seconds"
+msgstr "2 segundos"
+
+msgid "3 seconds"
+msgstr "3 segundos"
+
+msgid "5 seconds"
+msgstr "5 segundos"
+
+msgid "10 seconds"
+msgstr "10 segundos"
+
+msgid "30 seconds"
+msgstr "30 segundos"
+
+msgid "45 seconds"
+msgstr "45 segundos"
+
+msgid "60 seconds"
+msgstr "60 segundos"
+
+msgid "Refresh rate"
+msgstr "Taxa de atualização"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Defina com que frequência os dados devem ser atualizados na guia Modem(s)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Defina com que frequência os dados devem ser atualizados na guia Modem(s).
Importante Nem todo modem / protocolo pode se comunicar rapidamente com scripts. "
+"Uma taxa de sondagem muito alta pode congelar o modem. ModemManager e uqmi precisam de mais tempo para responder."
+
+msgid "Updating again in %s second(s)."
+msgstr "Atualizando novamente em %s segundo(s)."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Aguarde... a coleta de dados está em andamento."
+
+msgid "Modems found"
+msgstr "Modems encontrados"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Lista de modems encontrados. Nem todos os modems podem ser mostrados."
+
+msgid "Show modems found"
+msgstr "Mostrar modems encontrados"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Atualmente, apenas modems conectados via USB são pesquisados."
+
+msgid "No Modems Detected..."
+msgstr "Nenhum Modem Detectado..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ops.. não há modems nas configurações. Você será redirecionado para uma guia onde pode definir o(s) modem(s) instalado(s)."
+
+msgid "Redirecting..."
+msgstr "Redirecionando..."
+
+msgid "Redirecting in"
+msgstr "Redirecionando em"
+
+msgid "seconds..."
+msgstr "segundos..."
+
+msgid "(no data)"
+msgstr "(sem dados)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Digite um endereço IP válido no formato 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Apenas números e pontos são permitidos"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Cada parte deve ser um número de 0 a 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "A aba futura permitirá que você atualize o pacote do %srepositório externo de Rafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "A opção aparecerá após a implementação do apk."
+
+msgid "Author (package maintainer)"
+msgstr "Autor (mantenedor do pacote)"
+
+msgid "Modemdata Info"
+msgstr "Informações de Modemdata"
+
+msgid "Modemdata Status"
+msgstr "Status de Modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Informações de Luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Vá para a guia Diagnóstico e execute uma verificação de script. Na maioria das vezes, o erro é causado por um nome de operadora estranho. Para corrigir isso, selecione a opção Forçar PLMN do arquivo se estiver disponível nas opções de configuração do modem."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Se os dados no LuCI não estiverem visíveis e temos 100% de certeza de que o modem foi definido/configurado corretamente."
+
+msgid "Suggested solution"
+msgstr "Solução sugerida"
+
+msgid "Troubleshooting / Hints"
+msgstr "Solução de Problemas / Dicas"
+
+msgid "Problem"
+msgstr "Problema"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Problemas comuns que podem surgir ao usar o pacote e formas de resolvê-los."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "O pacote não exibe dados para o modem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "O modem é muito sensível aos dados lidos pela porta de comunicação. Selecionar a porta de comunicação errada pode fazer com que o modem congele ou reinicie."
+
+msgid "and"
+msgstr "e"
+
+msgid "packages are recommended for proper modem support."
+msgstr "pacotes são recomendados para suporte adequado do modem."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Selecione o método para ler dados do modem e instale os pacotes necessários."
+
+msgid "Required packages"
+msgstr "Pacotes Necessários"
+
+msgid "Check required packages"
+msgstr "Verificar pacotes necessários"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Antes de configurar o modem, verifique se todos os pacotes necessários estão instalados no sistema."
+
+msgid "Loading package data…"
+msgstr "Carregando dados do pacote…"
+
+msgid "Waiting..."
+msgstr "Aguardando..."
+
+msgid "Show signal levels for the primary band"
+msgstr "Mostrar níveis de sinal para a banda primária"
+
+msgid "Primary band signal levels"
+msgstr "Níveis de sinal da banda primária"
+
+msgid "Device is busy"
+msgstr "Dispositivo ocupado"
+
+msgid "Primary band"
+msgstr "Banda primária"
+
+msgid "Available options"
+msgstr "Opções disponíveis"
+
+msgid "Device not found"
+msgstr "Dispositivo não encontrado"
+
+msgid "Registered, home"
+msgstr "Registrado, rede doméstica"
+
+msgid "Show signal levels"
+msgstr "Mostrar níveis de sinal"
+
+msgid "Click to view Cell ID details"
+msgstr "Clique para ver detalhes do ID de célula"
+
+msgid "Cell ID (dec)"
+msgstr "ID de célula (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "ID de célula (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID de setor (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "ID de setor (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID de célula (hex) para CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID de célula (dec) para CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Informações de ID de Célula"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Informações detalhadas de ID de célula com formatos para diferentes ferramentas e aplicações."
+
+msgid "Information about package authors and available support options."
+msgstr "Informações sobre os autores do pacote e opções de suporte disponíveis."
+
+msgid "Package name"
+msgstr "Nome do pacote"
+
+msgid "Proper Modem Configuration."
+msgstr "Configuração Adequada do Modem."
+
+msgid "User should remember:"
+msgstr "O usuário deve lembrar:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Para um modem específico, apenas um protocolo deve ser definido para comunicação com o modem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Apenas um pacote pode ler dados do modem (ao mesmo tempo)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Ler dados do modem com muita frequência pode fazer com que ele congele (MM e uqmi precisam de mais tempo)."
+
+msgid "BTS search: no response from server."
+msgstr "Pesquisa de BTS: nenhuma resposta do servidor."
+
+msgid "BTS search: no results found."
+msgstr "Pesquisa de BTS: nenhum resultado encontrado."
+
+msgid "this month"
+msgstr "este mês"
+
+msgid "month ago"
+msgstr "um mês atrás"
+
+msgid "months ago"
+msgstr "meses atrás"
+
+msgid "Station ID"
+msgstr "ID da Estação"
+
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgid "Updated"
+msgstr "Atualizado"
+
+msgid "Show on map"
+msgstr "Mostrar no mapa"
+
+msgid "Download data"
+msgstr "Baixar dados"
+
+msgid "Install curl"
+msgstr "Instalar curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Nota: O pacote é totalmente compatível com a versão mais recente de terceira geração do site BTSearch."
+
+msgid "Skip package verification"
+msgstr "Ignorar verificação de pacotes"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Ative esta opção para ignorar a verificação de pacotes instalados e permitir selecionar qualquer método da lista abaixo."
diff --git a/modemdata/luci-app-modemdata/po/ru/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/ru/luci-app-modemdata.po
new file mode 100644
index 000000000..5378307d4
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/ru/luci-app-modemdata.po
@@ -0,0 +1,764 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: ru\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Для получения дополнительной информации о пакете modemdata посетите: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Пакет позволяет пользователю просматривать данные, считанные с модема, и параметры подключения к мобильной сети."
+
+msgid "eko.one.pl forum"
+msgstr "форум eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Уровень сигнала"
+
+msgid "Modem(s)"
+msgstr "Модем(ы)"
+
+msgid "Ups.. no modems detected."
+msgstr "Упс... модемы не обнаружены."
+
+msgid "Configuration"
+msgstr "Конфигурация"
+
+msgid "General Information"
+msgstr "Общая информация"
+
+msgid "Modem Information"
+msgstr "Информация о модеме"
+
+msgid "Cell Information"
+msgstr "Информация о сети"
+
+msgid "Connection"
+msgstr "Соединение"
+
+msgid "Technology"
+msgstr "Технология"
+
+msgid "Operator"
+msgstr "Оператор"
+
+msgid "Location"
+msgstr "Местоположение"
+
+msgid "Sent"
+msgstr "Отправлено"
+
+msgid "Signal strength"
+msgstr "Уровень сигнала"
+
+msgid "Connection time"
+msgstr "Время соединения"
+
+msgid "Modem type"
+msgstr "Тип модема"
+
+msgid "Hide data."
+msgstr "Скрыть данные."
+
+msgid "Hide selected data"
+msgstr "Скрыть выбранные данные"
+
+msgid "Additional information"
+msgstr "Дополнительная информация"
+
+msgid "Revision / FW"
+msgstr "Ревизия / Прошивка"
+
+msgid "IP adress / Port"
+msgstr "IP-адрес / Порт"
+
+msgid "Chip Temperature"
+msgstr "Температура чипа"
+
+msgid "Configuration modemdata package"
+msgstr "Конфигурация пакета modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Панель конфигурации для пакета modemdata и графического интерфейса."
+
+msgid "Add data to hide"
+msgstr "Добавить данные для скрытия"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Введите данные, которые вы хотите скрыть, например IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Открыть страницу"
+
+msgid "Download data (experimental)"
+msgstr "Скачать данные (экспериментально)"
+
+msgid "Network"
+msgstr "Сеть"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "IP-адрес / Порт для связи с модемом"
+
+msgid "Defined modems"
+msgstr "Определенные модемы"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Интерфейс для определения доступных модемов. Список модемов облегчит переключение между ними в LuCI."
+
+msgid "Settings"
+msgstr "Настройки"
+
+msgid "Add new modem settings..."
+msgstr "Добавить новые настройки модема..."
+
+msgid "Modem Settings"
+msgstr "Настройки модема"
+
+msgid "Manufacturer / Product"
+msgstr "Производитель / Продукт"
+
+msgid "Please select a modem"
+msgstr "Пожалуйста, выберите модем"
+
+msgid "IP adress / Port for communication"
+msgstr "IP-адрес / Порт для связи"
+
+msgid "Protocol"
+msgstr "Протокол"
+
+msgid "Port for communication"
+msgstr "Порт для связи"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Пожалуйста, выберите порт QMI/MBIM"
+
+msgid "Modem id"
+msgstr "ID модема"
+
+msgid "Please select a modem id"
+msgstr "Пожалуйста, выберите ID модема"
+
+msgid "MBIM device"
+msgstr "Устройство MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Выберите, если хотите считывать данные через MBIM."
+
+msgid "Assigned interface"
+msgstr "Назначенный интерфейс"
+
+msgid "Interface assigned to modem."
+msgstr "Интерфейс, назначенный модему."
+
+msgid "Enter IP adress"
+msgstr "Введите IP-адрес"
+
+msgid "IP adress"
+msgstr "IP-адрес"
+
+msgid "Reading data via"
+msgstr "Чтение данных через"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Порт / IP / ID модема"
+
+msgid "Interface assigned to modem."
+msgstr "Интерфейс, назначенный модему."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Введите имя модема вручную, если предложенное имя не "
+"очевидно.
Важно Имя модема используется только для модемов, подключенных через USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Выберите метод считывания данных с модема.
последовательный порт: Выберите один из доступных "
+"портов ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Введите IP-адрес 192.168.X.X, по которому модем (Huawei) "
+"доступен.
uqmi: Выберите один из доступных портов cdc-wdmX.
ModemManager: Выберите "
+"один из найденных идентификаторов модема."
+
+msgid "Please select a port"
+msgstr "Пожалуйста, выберите порт"
+
+msgid "User description"
+msgstr "Описание пользователя"
+
+msgid "Optional"
+msgstr "Необязательно"
+
+msgid "User description (optional)"
+msgstr "Описание пользователя (необязательно)"
+
+msgid "Signal strength"
+msgstr "Уровень сигнала"
+
+msgid "Excellent"
+msgstr "Отличный"
+
+msgid "Good"
+msgstr "Хороший"
+
+msgid "Fair"
+msgstr "Средний"
+
+msgid "Poor"
+msgstr "Слабый"
+
+msgid "Physical cell ID"
+msgstr "Физический ID ячейки"
+
+msgid "Bandwidth"
+msgstr "Ширина полосы"
+
+msgid "SIM status"
+msgstr "Статус SIM"
+
+msgid "Not registered"
+msgstr "Не зарегистрирована"
+
+msgid "Registered"
+msgstr "Зарегистрирована"
+
+msgid "Registered (roaming)"
+msgstr "Зарегистрирована (роуминг)"
+
+msgid "Registered, only SMS"
+msgstr "Зарегистрирована, только SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Зарегистрирована (роуминг), только SMS"
+
+msgid "Searching.."
+msgstr "Поиск..."
+
+msgid "Connection state"
+msgstr "Состояние соединения"
+
+msgid "Connected"
+msgstr "Подключено"
+
+msgid "Disconnected"
+msgstr "Отключено"
+
+msgid "Registering denied"
+msgstr "Регистрация отклонена"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Ожидание данных от модема..."
+
+msgid "Waiting for data..."
+msgstr "Ожидание данных..."
+
+msgid "BTS Search"
+msgstr "Поиск BTS"
+
+msgid "BTS Information"
+msgstr "Информация о BTS"
+
+msgid "Search"
+msgstr "Поиск"
+
+msgid "Bands"
+msgstr "Диапазоны"
+
+msgid "Search BTS"
+msgstr "Поиск BTS"
+
+msgid "BTS search settings"
+msgstr "Настройки поиска BTS"
+
+msgid "Website to search for BTS"
+msgstr "Сайт для поиска BTS"
+
+msgid "Select a website for searching."
+msgstr "Выберите сайт для поиска."
+
+msgid "Install a package using package manager"
+msgstr "Установите пакет через менеджер пакетов"
+
+msgid "Select an action after clicking the search button."
+msgstr "Выберите действие после нажатия кнопки поиска."
+
+msgid "Install iconv"
+msgstr "Установить iconv"
+
+msgid "Install qmi-utils"
+msgstr "Установить qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Слот SIM"
+
+msgid "SIM Card"
+msgstr "SIM-карта"
+
+msgid "Slot in use"
+msgstr "Используемый слот"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Проблема с регистрацией в сети, проверьте SIM-карту."
+
+msgid "SIM PIN required"
+msgstr "Требуется PIN-код SIM"
+
+msgid "SIM PUK required"
+msgstr "Требуется PUK-код SIM"
+
+msgid "SIM failure"
+msgstr "Ошибка SIM"
+
+msgid "SIM busy"
+msgstr "SIM занята"
+
+msgid "SIM wrong"
+msgstr "Неверная SIM"
+
+msgid "SIM PIN2 required"
+msgstr "Требуется PIN2 SIM"
+
+msgid "SIM PUK2 required"
+msgstr "Требуется PUK2 SIM"
+
+msgid "Defined modems"
+msgstr "Определенные модемы"
+
+msgid "Information read from the SIM card and device."
+msgstr "Информация с SIM-карты и устройства."
+
+msgid "No data"
+msgstr "Нет данных"
+
+msgid "Diagnostics"
+msgstr "Диагностика"
+
+msgid "Modem(s) configuration"
+msgstr "Конфигурация модемов"
+
+msgid "Package configuration"
+msgstr "Конфигурация пакета"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Запустите различные команды для проверки данных модема и отладки скриптов."
+
+msgid "USB debug information"
+msgstr "Отладка USB"
+
+msgid "Check ttyX ports"
+msgstr "Проверка портов ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Проверка режимов serial и ecm"
+
+msgid "Check uqmi mode"
+msgstr "Проверка режима uqmi"
+
+msgid "Check ModemManager mode"
+msgstr "Проверка режима ModemManager"
+
+msgid "Clear"
+msgstr "Очистить"
+
+msgid "Download"
+msgstr "Скачать"
+
+msgid "Location"
+msgstr "Местоположение"
+
+msgid "Notes Update date"
+msgstr "Дата обновления заметок"
+
+msgid "Band"
+msgstr "Диапазон"
+
+msgid "Network"
+msgstr "Сеть"
+
+msgid "Package update and support"
+msgstr "Обновления пакета и поддержка"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Не удалось скачать index.json из внешнего репозитория."
+
+msgid "Failed to read downloaded file."
+msgstr "Не удалось прочитать скачанный файл."
+
+msgid "Installed package is up to date."
+msgstr "Установленный пакет актуален."
+
+msgid "Update is available."
+msgstr "Доступно обновление."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Файл index.json не содержит информации о пакете."
+
+msgid "Error parsing version."
+msgstr "Ошибка разбора версии."
+
+msgid "Check repository"
+msgstr "Проверить репозиторий"
+
+msgid "Package update..."
+msgstr "Обновление пакета..."
+
+msgid "Report a bug"
+msgstr "Сообщить об ошибке"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Напишите в теме пакета на форуме eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Написать на форуме"
+
+msgid "Report a bug on the package Github page"
+msgstr "Сообщить об ошибке на странице пакета на Github"
+
+msgid "Open a package discussion on Github"
+msgstr "Открыть обсуждение пакета на Github"
+
+msgid "Open discussion"
+msgstr "Открыть обсуждение"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Купите кофе, чтобы поддержать разработку проекта и автора"
+
+msgid "Buy a coffee"
+msgstr "Купить кофе"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Станьте спонсором, чтобы поддержать разработку проекта и автора"
+
+msgid "Become a sponsor"
+msgstr "Стать спонсором"
+
+msgid "Download package information from an external repository"
+msgstr "Скачать информацию о пакете из внешнего репозитория"
+
+msgid "Add repository and download package update"
+msgstr "Добавить репозиторий и скачать обновление пакета"
+
+msgid "Package Info"
+msgstr "Информация о пакете"
+
+msgid "Compiled"
+msgstr "Скомпилирован"
+
+msgid "Repository Info"
+msgstr "Информация о репозитории"
+
+msgid "Currently installed"
+msgstr "Установлено"
+
+msgid "Package in repository"
+msgstr "Пакет в репозитории"
+
+msgid "Last repository check"
+msgstr "Последняя проверка репозитория"
+
+msgid "Poland"
+msgstr "Польша"
+
+msgid "Force read by"
+msgstr "Принудительное чтение через"
+
+msgid "Select method for reading data from the modem."
+msgstr "Выберите метод чтения данных с модема."
+
+msgid "inactive"
+msgstr "неактивен"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "Принудительный PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Принудительное чтение PLMN из файла."
+
+msgid "Command result"
+msgstr "Результат команды"
+
+msgid "Check"
+msgstr "Проверить"
+
+msgid "Auto update every:"
+msgstr "Автообновление каждые:"
+
+msgid "2 seconds"
+msgstr "2 секунды"
+
+msgid "3 seconds"
+msgstr "3 секунды"
+
+msgid "5 seconds"
+msgstr "5 секунд"
+
+msgid "10 seconds"
+msgstr "10 секунд"
+
+msgid "30 seconds"
+msgstr "30 секунд"
+
+msgid "45 seconds"
+msgstr "45 секунд"
+
+msgid "60 seconds"
+msgstr "60 секунд"
+
+msgid "Refresh rate"
+msgstr "Частота обновления"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Установите частоту обновления данных на вкладке Модем(ы)."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Установите частоту обновления данных на вкладке Модем(ы).
Важно Не "
+"каждый модем или протокол может быстро отвечать на запросы. "
+"Слишком высокая частота опроса может «повесить» модем. ModemManager и uqmi требуют больше времени для ответа."
+
+msgid "Updating again in %s second(s)."
+msgstr "Обновление через %s секунд."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Пожалуйста, подождите... идёт сбор данных."
+
+msgid "Modems found"
+msgstr "Найденные модемы"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Список найденных модемов. Могут отображаться не все."
+
+msgid "Show modems found"
+msgstr "Показать найденные модемы"
+
+msgid "Show"
+msgstr "Показать"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Сейчас ищутся только модемы, подключённые через USB."
+
+msgid "No Modems Detected..."
+msgstr "Модемы не найдены..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Упс... В настройках нет модемов. Вы будете перенаправлены на вкладку для их добавления."
+
+msgid "Redirecting..."
+msgstr "Перенаправление..."
+
+msgid "Redirecting in"
+msgstr "Перенаправление через"
+
+msgid "seconds..."
+msgstr "секунд..."
+
+msgid "(no data)"
+msgstr "(нет данных)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Введите корректный IP-адрес в формате 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Разрешены только цифры и точки"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Каждая часть должна быть числом от 0 до 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "В будущем вкладка позволит обновлять пакет из внешнего репозитория %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Опция появится после внедрения apk."
+
+msgid "Author (package maintainer)"
+msgstr "Автор (сопровождающий пакета)"
+
+msgid "Modemdata Info"
+msgstr "Информация modemdata"
+
+msgid "Modemdata Status"
+msgstr "Статус modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Информация о пакете luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Перейдите на вкладку «Диагностика» и выполните проверку скрипта. Чаще всего ошибка вызвана нестандартным названием оператора. Чтобы исправить это, включите «Принудительный PLMN из файла», если такая опция доступна в настройках модема."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Если данные в LuCI не отображаются, и вы на 100% уверены, что модем определён/настроен правильно."
+
+msgid "Suggested solution"
+msgstr "Предлагаемое решение"
+
+msgid "Troubleshooting / Hints"
+msgstr "Устранение неполадок / Подсказки"
+
+msgid "Problem"
+msgstr "Проблема"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Распространённые проблемы, которые могут возникнуть при использовании пакета, и способы их решения."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Пакет не отображает данные для модема Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Модем очень чувствителен к данным, считываемым через порт связи. Выбор неправильного порта связи может привести к зависанию или перезагрузке модема."
+
+msgid "and"
+msgstr "и"
+
+msgid "packages are recommended for proper modem support."
+msgstr "рекомендуются для правильной поддержки модема."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Выберите способ чтения данных с модема и установите необходимые пакеты."
+
+msgid "Required packages"
+msgstr "Необходимые пакеты"
+
+msgid "Check required packages"
+msgstr "Проверить необходимые пакеты"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Перед настройкой модема проверьте, установлены ли все необходимые пакеты."
+
+msgid "Loading package data…"
+msgstr "Загрузка данных о пакетах..."
+
+msgid "Waiting..."
+msgstr "Ожидание..."
+
+msgid "Show signal levels for the primary band"
+msgstr "Показать уровни сигнала для основного диапазона"
+
+msgid "Primary band signal levels"
+msgstr "Уровни сигнала для основного диапазона"
+
+msgid "Device is busy"
+msgstr "Устройство занято"
+
+msgid "Primary band"
+msgstr "Основной диапазон"
+
+msgid "Available options"
+msgstr "Доступные опции"
+
+msgid "Device not found"
+msgstr "Устройство не найдено"
+
+msgid "Registered, home"
+msgstr "Зарегистрирована в домашней сети"
+
+msgid "Click to view Cell ID details"
+msgstr "Нажмите для просмотра деталей ID ячейки"
+
+msgid "Cell ID (dec)"
+msgstr "ID ячейки (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "ID ячейки (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID сектора (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "ID сектора (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID ячейки (hex) для CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID ячейки (dec) для CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Информация об ID ячейки"
+
+msgid "Modem"
+msgstr "Модем"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Подробная информация об ID ячейки в форматах для различных инструментов и приложений."
+
+msgid "Information about package authors and available support options."
+msgstr "Информация об авторах пакета и доступных вариантах поддержки."
+
+msgid "Package name"
+msgstr "Название пакета"
+
+msgid "Proper Modem Configuration."
+msgstr "Правильная конфигурация модема."
+
+msgid "User should remember:"
+msgstr "Пользователь должен помнить:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Для конкретного модема должен быть установлен только один протокол связи."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Только один пакет может читать данные с модема (одновременно)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Слишком частое чтение данных с модема может привести к его зависанию (MM и uqmi требуют больше времени)."
+
+msgid "BTS search: no response from server."
+msgstr "Поиск BTS: нет ответа от сервера."
+
+msgid "BTS search: no results found."
+msgstr "Поиск BTS: результаты не найдены."
+
+msgid "this month"
+msgstr "в этом месяце"
+
+msgid "month ago"
+msgstr "месяц назад"
+
+msgid "months ago"
+msgstr "месяцев назад"
+
+msgid "Station ID"
+msgstr "ID станции"
+
+msgid "Confirmed"
+msgstr "Подтверждено"
+
+msgid "Updated"
+msgstr "Обновлено"
+
+msgid "Show on map"
+msgstr "Показать на карте"
+
+msgid "Download data"
+msgstr "Скачать данные"
+
+msgid "Install curl"
+msgstr "Установить curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Примечание: Пакет полностью совместим с последней версией сайта BTSearch третьего поколения."
+
+msgid "Skip package verification"
+msgstr "Пропустить проверку пакетов"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Включите эту опцию, чтобы пропустить проверку установленных пакетов и разрешить выбор любого метода из списка ниже."
diff --git a/modemdata/luci-app-modemdata/po/tr/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/tr/luci-app-modemdata.po
new file mode 100644
index 000000000..0038e2289
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/tr/luci-app-modemdata.po
@@ -0,0 +1,760 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: tr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Modemdata paketi hakkında daha fazla bilgi için lütfen ziyaret edin: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Paket, kullanıcının modemden okunan verileri görüntülemesine ve mobil ağ bağlantı parametrelerini görmesine olanak tanır."
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl forumu"
+
+msgid "Signal strength"
+msgstr "Sinyal gücü"
+
+msgid "Modem(s)"
+msgstr "Modem(ler)"
+
+msgid "Ups.. no modems detected."
+msgstr "Hata.. modem tespit edilemedi."
+
+msgid "Configuration"
+msgstr "Yapılandırma"
+
+msgid "General Information"
+msgstr "Genel Bilgiler"
+
+msgid "Modem Information"
+msgstr "Modem Bilgileri"
+
+msgid "Cell Information"
+msgstr "Hücre Bilgileri"
+
+msgid "Connection"
+msgstr "Bağlantı"
+
+msgid "Technology"
+msgstr "Teknoloji"
+
+msgid "Operator"
+msgstr "Operatör"
+
+msgid "Location"
+msgstr "Konum"
+
+msgid "Sent"
+msgstr "Gönderildi"
+
+msgid "Signal strength"
+msgstr "Sinyal gücü"
+
+msgid "Connection time"
+msgstr "Bağlantı süresi"
+
+msgid "Modem type"
+msgstr "Modem tipi"
+
+msgid "Hide data."
+msgstr "Verileri gizle."
+
+msgid "Hide selected data"
+msgstr "Seçilen verileri gizle"
+
+msgid "Additional information"
+msgstr "Ek bilgiler"
+
+msgid "Revision / FW"
+msgstr "Revizyon / FW"
+
+msgid "IP adress / Port"
+msgstr "IP adresi / Port"
+
+msgid "Chip Temperature"
+msgstr "Çip sıcaklığı"
+
+msgid "Configuration modemdata package"
+msgstr "Modemdata paketi yapılandırması"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Modemdata ve arayüz uygulaması için yapılandırma paneli."
+
+msgid "Add data to hide"
+msgstr "Gizlenecek veri ekle"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Gizlemek istediğiniz verileri girin, örn. IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Sayfayı aç"
+
+msgid "Download data (experimental)"
+msgstr "Verileri indir (deneysel)"
+
+msgid "Network"
+msgstr "Ağ"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Modemle iletişim için IP adresi / Port"
+
+msgid "Defined modems"
+msgstr "Tanımlı modemler"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Mevcut modemleri tanımlamak için arayüz. Modem listesi, kullanıcının LuCI içinde modemler arasında geçiş yapmasını kolaylaştıracaktır."
+
+msgid "Settings"
+msgstr "Ayarlar"
+
+msgid "Add new modem settings..."
+msgstr "Yeni modem ayarları ekle..."
+
+msgid "Modem Settings"
+msgstr "Modem Ayarları"
+
+msgid "Manufacturer / Product"
+msgstr "Üretici / Ürün"
+
+msgid "Please select a modem"
+msgstr "Lütfen bir modem seçin"
+
+msgid "IP adress / Port for communication"
+msgstr "İletişim için IP adresi / Port"
+
+msgid "Protocol"
+msgstr "Protokol"
+
+msgid "Port for communication"
+msgstr "İletişim için port"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Lütfen bir QMI/MBIM portu seçin"
+
+msgid "Modem id"
+msgstr "Modem kimliği"
+
+msgid "Please select a modem id"
+msgstr "Lütfen bir modem kimliği seçin"
+
+msgid "MBIM device"
+msgstr "MBIM cihazı"
+
+msgid "Select if you want to read from MBIM."
+msgstr "MBIM üzerinden okuma yapmak istiyorsanız seçin."
+
+msgid "Assigned interface"
+msgstr "Atanmış arayüz"
+
+msgid "Interface assigned to modem."
+msgstr "Interface assigned to modem."
+
+msgid "Enter IP adress"
+msgstr "Modemin IP adresini girin"
+
+msgid "IP adress"
+msgstr "IP adresi"
+
+msgid "Reading data via"
+msgstr "Veri okuma yöntemi"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Port / IP adresi / Modem kimliği"
+
+msgid "Interface assigned to modem."
+msgstr "Modeme atanmış arayüz."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Önerilen ad belirgin değilse modem adını manuel olarak "
+"girin.
Önemli Modem adı yalnızca USB üzerinden bağlı modemler için aranır."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Modemden veri okumak için bir yöntem seçin.
seri port: Mevcut "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN portlarından birini seçin.
ecm: Modemin (Huawei) erişilebilir olduğu "
+"192.168.X.X IP adresini girin.
uqmi: Mevcut cdc-wdmX portlarından birini seçin.
ModemManager: "
+"Bulunan modem kimliklerinden birini seçin."
+
+msgid "Please select a port"
+msgstr "Lütfen bir port seçin"
+
+msgid "User description"
+msgstr "Kullanıcı açıklaması"
+
+msgid "Optional"
+msgstr "İsteğe bağlı"
+
+msgid "User description (optional)"
+msgstr "Kullanıcı açıklaması (isteğe bağlı)"
+
+msgid "Signal strength"
+msgstr "Sinyal gücü"
+
+msgid "Excellent"
+msgstr "Mükemmel"
+
+msgid "Good"
+msgstr "İyi"
+
+msgid "Fair"
+msgstr "Orta"
+
+msgid "Poor"
+msgstr "Zayıf"
+
+msgid "Physical cell ID"
+msgstr "Fiziksel hücre kimliği"
+
+msgid "Bandwidth"
+msgstr "Bant genişliği"
+
+msgid "SIM status"
+msgstr "SIM durumu"
+
+msgid "Not registered"
+msgstr "Ağa kayıtlı değil"
+
+msgid "Registered, home"
+msgstr "Ana ağa kayıtlı"
+
+msgid "Registered (roaming)"
+msgstr "Ağa kayıtlı (roaming)"
+
+msgid "Registered, only SMS"
+msgstr "Ağa kayıtlı, yalnızca SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Ağa kayıtlı (roaming), yalnızca SMS"
+
+msgid "Searching.."
+msgstr "Aranıyor.."
+
+msgid "Connection state"
+msgstr "Bağlantı durumu"
+
+msgid "Connected"
+msgstr "Bağlı"
+
+msgid "Disconnected"
+msgstr "Bağlantı kesildi"
+
+msgid "Registering denied"
+msgstr "Ağ kaydı reddedildi"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Modemden veri okunması bekleniyor..."
+
+msgid "Waiting for data..."
+msgstr "Veri bekleniyor..."
+
+msgid "BTS Search"
+msgstr "BTS Arama"
+
+msgid "BTS Information"
+msgstr "BTS Bilgileri"
+
+msgid "Search"
+msgstr "Ara"
+
+msgid "Bands"
+msgstr "Bantlar"
+
+msgid "Search BTS"
+msgstr "BTS Ara"
+
+msgid "BTS search settings"
+msgstr "BTS arama ayarları"
+
+msgid "Website to search for BTS"
+msgstr "BTS aramak için web sitesi"
+
+msgid "Select a website for searching."
+msgstr "Arama için bir web sitesi seçin."
+
+msgid "Install a package using package manager"
+msgstr "Paket yöneticisi kullanarak bir paket kurun"
+
+msgid "Select an action after clicking the search button."
+msgstr "Arama düğmesine tıkladıktan sonra yapılacak işlemi seçin."
+
+msgid "Install iconv"
+msgstr "iconv kurun"
+
+msgid "Install qmi-utils"
+msgstr "qmi-utils kurun"
+
+msgid "SIM Slot"
+msgstr "SIM Yuvası"
+
+msgid "SIM Card"
+msgstr "SIM Kart"
+
+msgid "Slot in use"
+msgstr "Kullanılan yuva"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Ağa kayıt sorunu var, SIM kartı kontrol edin."
+
+msgid "SIM PIN required"
+msgstr "SIM PIN kodu gerekli"
+
+msgid "SIM PUK required"
+msgstr "SIM PUK kodu gerekli"
+
+msgid "SIM failure"
+msgstr "SIM hatası"
+
+msgid "SIM busy"
+msgstr "SIM meşgul"
+
+msgid "SIM wrong"
+msgstr "SIM hatalı"
+
+msgid "SIM PIN2 required"
+msgstr "SIM PIN2 kodu gerekli"
+
+msgid "SIM PUK2 required"
+msgstr "SIM PUK2 kodu gerekli"
+
+msgid "Defined modems"
+msgstr "Tanımlı modemler"
+
+msgid "Information read from the SIM card and device."
+msgstr "SIM karttan ve cihazdan okunan bilgiler."
+
+msgid "No data"
+msgstr "Veri yok"
+
+msgid "Diagnostics"
+msgstr "Tanılama"
+
+msgid "Modem(s) configuration"
+msgstr "Modem(ler) yapılandırması"
+
+msgid "Package configuration"
+msgstr "Paket yapılandırması"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Modemden okunan verileri doğrulamak ve betikleri hata ayıklamak için çeşitli komutlar çalıştırın."
+
+msgid "USB debug information"
+msgstr "USB hata ayıklama bilgileri"
+
+msgid "Check ttyX ports"
+msgstr "ttyX portlarının kullanılabilirliğini kontrol edin"
+
+msgid "Check serial and ecm mode"
+msgstr "Seri ve ecm modunu kontrol edin"
+
+msgid "Check uqmi mode"
+msgstr "uqmi modunu kontrol edin"
+
+msgid "Check ModemManager mode"
+msgstr "ModemManager modunu kontrol edin"
+
+msgid "Clear"
+msgstr "Temizle"
+
+msgid "Download"
+msgstr "İndir"
+
+msgid "Location"
+msgstr "Konum"
+
+msgid "Notes Update date"
+msgstr "Notlar Güncelleme tarihi"
+
+msgid "Band"
+msgstr "Bant"
+
+msgid "Network"
+msgstr "Ağ"
+
+msgid "Package update and support"
+msgstr "Paket güncellemesi ve destek"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Harici depodan index.json dosyası indirilemedi."
+
+msgid "Failed to read downloaded file."
+msgstr "İndirilen dosya okunamadı."
+
+msgid "Installed package is up to date."
+msgstr "Kurulu paket güncel."
+
+msgid "Update is available."
+msgstr "Güncelleme mevcut."
+
+msgid "The index.json file did not contain any package information."
+msgstr "index.json dosyası herhangi bir paket bilgisi içermiyordu."
+
+msgid "Error parsing version."
+msgstr "Sürüm ayrıştırma hatası."
+
+msgid "Check repository"
+msgstr "Depoyu kontrol et"
+
+msgid "Package update..."
+msgstr "Paket güncelleniyor..."
+
+msgid "Report a bug"
+msgstr "Hata bildir"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "eko.one.pl forumundaki paket konusuna yazın"
+
+msgid "Write on forum"
+msgstr "Forumda yaz"
+
+msgid "Report a bug on the package Github page"
+msgstr "Paketin Github sayfasında hata bildirin"
+
+msgid "Open a package discussion on Github"
+msgstr "Github'da paket tartışması açın"
+
+msgid "Open discussion"
+msgstr "Tartışmayı aç"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Projenin geliştirilmesini ve yazarı desteklemek isterseniz bir kahve ısmarlayın"
+
+msgid "Buy a coffee"
+msgstr "Kahve ısmarla"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Projenin geliştirilmesini ve yazarı desteklemek isterseniz sponsor olun"
+
+msgid "Become a sponsor"
+msgstr "Sponsor ol"
+
+msgid "Download package information from an external repository"
+msgstr "Harici bir depodan paket bilgilerini indirin"
+
+msgid "Add repository and download package update"
+msgstr "Depo ekleyin ve paket güncellemesini indirin"
+
+msgid "Package Info"
+msgstr "Paket Bilgisi"
+
+msgid "Compiled"
+msgstr "Derlendi"
+
+msgid "Repository Info"
+msgstr "Depo Bilgisi"
+
+msgid "Currently installed"
+msgstr "Şu anda kurulu"
+
+msgid "Package in repository"
+msgstr "Depodaki sürüm"
+
+msgid "Last repository check"
+msgstr "Son depo kontrolü"
+
+msgid "Poland"
+msgstr "Polonya"
+
+msgid "Force read by"
+msgstr "Şununla zorla oku"
+
+msgid "Select method for reading data from the modem."
+msgstr "Modemden veri okuma yöntemini seçin."
+
+msgid "inactive"
+msgstr "etkin değil"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "PLMN'yi zorla"
+
+msgid "Force reading PLMN from file."
+msgstr "PLMN'yi dosyadan zorla oku."
+
+msgid "Command result"
+msgstr "Komut sonucu"
+
+msgid "Check"
+msgstr "Kontrol et"
+
+msgid "Auto update every:"
+msgstr "Otomatik güncelleme sıklığı:"
+
+msgid "2 seconds"
+msgstr "2 saniye"
+
+msgid "3 seconds"
+msgstr "3 saniye"
+
+msgid "5 seconds"
+msgstr "5 saniye"
+
+msgid "10 seconds"
+msgstr "10 saniye"
+
+msgid "30 seconds"
+msgstr "30 saniye"
+
+msgid "45 seconds"
+msgstr "45 saniye"
+
+msgid "60 seconds"
+msgstr "60 saniye"
+
+msgid "Refresh rate"
+msgstr "Yenileme sıklığı"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Modem(ler) sekmesindeki verilerin ne sıklıkla yenileneceğini ayarlayın."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Modem(ler) sekmesindeki verilerin ne sıklıkla yenileneceğini ayarlayın.
Önemli Her "
+"modem / protokol, betiklerle hızlı bir şekilde iletişim kuramaz. "
+"Çok yüksek bir sorgulama sıklığı modemin kilitlenmesine neden olabilir. ModemManager ve uqmi yanıt vermek için daha fazla zamana ihtiyaç duyar."
+
+msgid "Updating again in %s second(s)."
+msgstr "%s saniye sonra tekrar güncellenecek."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Lütfen bekleyin... veri toplama işlemi devam ediyor."
+
+msgid "Modems found"
+msgstr "Bulunan modemler"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Bulunan modemlerin listesi. Tüm modemler burada gösterilmeyebilir."
+
+msgid "Show modems found"
+msgstr "Bulunan modemleri göster"
+
+msgid "Show"
+msgstr "Göster"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Şu anda yalnızca USB üzerinden bağlı modemler aranmaktadır."
+
+msgid "No Modems Detected..."
+msgstr "Modem Tespit Edilemedi..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Hata.. ayarlarda hiç modem yok. Kurulu modem(ler)i tanımlayabileceğiniz bir sekmeye yönlendirileceksiniz."
+
+msgid "Redirecting..."
+msgstr "Yönlendiriliyor..."
+
+msgid "Redirecting in"
+msgstr "Yönlendirme süresi"
+
+msgid "seconds..."
+msgstr "saniye..."
+
+msgid "(no data)"
+msgstr "(veri yok)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "192.168.X.X formatında geçerli bir IP adresi girin"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Yalnızca rakamlara ve noktalara izin verilir"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Her bölüm 0 ile 255 arasında bir sayı olmalıdır"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "Gelecekte bu sekme, paketi %sRafał (IceG) harici deposundan%s güncellemenize olanak tanıyacak."
+
+msgid "Option will appear after apk implementation."
+msgstr "Bu seçenek apk uygulaması sonrasında görünecek."
+
+msgid "Author (package maintainer)"
+msgstr "Yazar (paket sorumlusu)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata Bilgisi"
+
+msgid "Modemdata Status"
+msgstr "Modemdata Durumu"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata Bilgisi"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Tanılama sekmesine gidin ve bir betik kontrolü çalıştırın. Hata çoğunlukla garip bir operatör adından kaynaklanır. Bunu düzeltmek için, modem yapılandırma seçeneklerinde mevcutsa PLMN'yi dosyadan zorla okuma seçeneğini işaretleyin."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "LuCI'de veriler görünmüyorsa ve modemin doğru şekilde tanımlandığından/yapılandırıldığından %100 eminsek."
+
+msgid "Suggested solution"
+msgstr "Önerilen çözüm"
+
+msgid "Troubleshooting / Hints"
+msgstr "Sorun Giderme / İpuçları"
+
+msgid "Problem"
+msgstr "Sorun"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Paketi kullanırken ortaya çıkabilecek yaygın sorunlar ve çözüm yolları."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Paket, Fibocom FM350-GL modemi için veri göstermiyor."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Modem, iletişim portu üzerinden okunan verilere karşı çok hassastır. Yanlış iletişim portunun seçilmesi modemin kilitlenmesine veya yeniden başlamasına neden olabilir."
+
+msgid "and"
+msgstr "ve"
+
+msgid "packages are recommended for proper modem support."
+msgstr "modemin düzgün çalışması için önerilen paketler."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Lütfen modemden veri okuma yöntemini seçin ve gerekli paketleri kurun."
+
+msgid "Required packages"
+msgstr "Gerekli paketler"
+
+msgid "Check required packages"
+msgstr "Gerekli paketleri kontrol et"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Modemi yapılandırmadan önce, gerekli tüm paketlerin sistemde kurulu olup olmadığını kontrol edin."
+
+msgid "Loading package data…"
+msgstr "Paket verileri yükleniyor…"
+
+msgid "Waiting..."
+msgstr "Bekleniyor..."
+
+msgid "Show signal levels"
+msgstr "Sinyal seviyelerini göster"
+
+msgid "Primary band signal levels"
+msgstr "Birincil bant sinyal seviyeleri"
+
+msgid "Device is busy"
+msgstr "Cihaz meşgul"
+
+msgid "Primary band"
+msgstr "Birincil bant"
+
+msgid "Available options"
+msgstr "Mevcut seçenekler"
+
+msgid "Device not found"
+msgstr "Cihaz bulunamadı"
+
+msgid "Click to view Cell ID details"
+msgstr "Hücre kimliği ayrıntılarını görüntülemek için tıklayın"
+
+msgid "Cell ID (dec)"
+msgstr "Hücre kimliği (ondalık)"
+
+msgid "Cell ID (hex)"
+msgstr "Hücre kimliği (onaltılık)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB kimliği (onaltılık)"
+
+msgid "Sector ID (hex)"
+msgstr "Sektör kimliği (onaltılık)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB kimliği (ondalık)"
+
+msgid "Sector ID (dec)"
+msgstr "Sektör kimliği (ondalık)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "CellMapper için hücre kimliği (onaltılık)"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "CellMapper için hücre kimliği (ondalık)"
+
+msgid "Cell ID Information"
+msgstr "Hücre Kimliği Bilgileri"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Farklı araçlar ve uygulamalar için formatlanmış ayrıntılı hücre kimliği bilgileri."
+
+msgid "Information about package authors and available support options."
+msgstr "Paket yazarları ve mevcut destek seçenekleri hakkında bilgi."
+
+msgid "Package name"
+msgstr "Paket adı"
+
+msgid "Proper Modem Configuration."
+msgstr "Doğru Modem Yapılandırması."
+
+msgid "User should remember:"
+msgstr "Kullanıcının hatırlaması gerekenler:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Belirli bir modem için, modemle iletişim üzerine yalnızca tek bir protokol ayarlanmalıdır."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Modemden aynı anda yalnızca bir paket veri okuyabilir."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Modemden çok sık veri okumak kilitlenmesine neden olabilir (MM ve uqmi daha fazla zamana ihtiyaç duyar)."
+
+msgid "BTS search: no response from server."
+msgstr "BTS arama: sunucudan yanıt alınamadı."
+
+msgid "BTS search: no results found."
+msgstr "BTS arama: sonuç bulunamadı."
+
+msgid "this month"
+msgstr "bu ay"
+
+msgid "month ago"
+msgstr "ay önce"
+
+msgid "months ago"
+msgstr "ay önce"
+
+msgid "Station ID"
+msgstr "İstasyon kimliği"
+
+msgid "Confirmed"
+msgstr "Onaylandı"
+
+msgid "Updated"
+msgstr "Güncellendi"
+
+msgid "Show on map"
+msgstr "Haritada göster"
+
+msgid "Download data"
+msgstr "Verileri indir"
+
+msgid "Install curl"
+msgstr "curl kurun"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Not: Paket, BTSearch web sitesinin en yeni, üçüncü nesil sürümüyle tamamen uyumludur."
+
+msgid "Skip package verification"
+msgstr "Paket doğrulamasını atla"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Yüklü paketlerin kontrolünü atlamak ve aşağıdaki listeden herhangi bir yöntemi seçebilmek için bu seçeneği etkinleştirin."
diff --git a/modemdata/luci-app-modemdata/po/vi/luci-app-modemdata.po b/modemdata/luci-app-modemdata/po/vi/luci-app-modemdata.po
new file mode 100644
index 000000000..0227f8ac0
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/vi/luci-app-modemdata.po
@@ -0,0 +1,762 @@
+msgid ""
+msgstr ""
+"Language-Team: Rafał Wabik (IceG)\n"
+"Language: vi\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "Để biết thêm thông tin về gói modemdata, vui lòng truy cập: %shttps://github.com/obsy/modemdata%s."
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "Gói này cho phép người dùng xem dữ liệu đọc từ modem và các thông số của kết nối mạng di động."
+
+msgid "eko.one.pl forum"
+msgstr "diễn đàn eko.one.pl"
+
+msgid "Signal strength"
+msgstr "Cường độ tín hiệu"
+
+msgid "Modem(s)"
+msgstr "Modem"
+
+msgid "Ups.. no modems detected."
+msgstr "Ôi... không tìm thấy modem nào."
+
+msgid "Configuration"
+msgstr "Cấu hình"
+
+msgid "General Information"
+msgstr "Thông tin chung"
+
+msgid "Modem Information"
+msgstr "Thông tin modem"
+
+msgid "Cell Information"
+msgstr "Thông tin cell"
+
+msgid "Connection"
+msgstr "Kết nối"
+
+msgid "Technology"
+msgstr "Công nghệ"
+
+msgid "Operator"
+msgstr "Nhà mạng"
+
+msgid "Location"
+msgstr "Vị trí"
+
+msgid "Sent"
+msgstr "Đã gửi"
+
+msgid "Signal strength"
+msgstr "Cường độ tín hiệu"
+
+msgid "Connection time"
+msgstr "Thời gian kết nối"
+
+msgid "Modem type"
+msgstr "Loại modem"
+
+msgid "Hide data."
+msgstr "Ẩn dữ liệu."
+
+msgid "Hide selected data"
+msgstr "Ẩn dữ liệu đã chọn"
+
+msgid "Additional information"
+msgstr "Thông tin bổ sung"
+
+msgid "Revision / FW"
+msgstr "Phiên bản / Firmware"
+
+msgid "IP adress / Port"
+msgstr "Địa chỉ IP / Cổng"
+
+msgid "Chip Temperature"
+msgstr "Nhiệt độ chip"
+
+msgid "Configuration modemdata package"
+msgstr "Cấu hình gói modemdata"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "Bảng cấu hình cho gói modemdata và ứng dụng giao diện đồ họa."
+
+msgid "Add data to hide"
+msgstr "Thêm dữ liệu cần ẩn"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "Nhập dữ liệu bạn muốn ẩn, ví dụ: IMEI, IMSI."
+
+msgid "Open page"
+msgstr "Mở trang"
+
+msgid "Download data (experimental)"
+msgstr "Tải dữ liệu (thử nghiệm)"
+
+msgid "Network"
+msgstr "Mạng"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "Địa chỉ IP / Cổng để giao tiếp với modem"
+
+msgid "Defined modems"
+msgstr "Các modem đã định nghĩa"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "Giao diện để định nghĩa các modem có sẵn. Danh sách modem sẽ giúp người dùng chuyển đổi giữa các modem trong LuCI dễ dàng hơn."
+
+msgid "Settings"
+msgstr "Cài đặt"
+
+msgid "Add new modem settings..."
+msgstr "Thêm cài đặt modem mới..."
+
+msgid "Modem Settings"
+msgstr "Cài đặt Modem"
+
+msgid "Manufacturer / Product"
+msgstr "Nhà sản xuất / Sản phẩm"
+
+msgid "Please select a modem"
+msgstr "Vui lòng chọn một modem"
+
+msgid "IP adress / Port for communication"
+msgstr "Địa chỉ IP / Cổng để giao tiếp"
+
+msgid "Protocol"
+msgstr "Giao thức"
+
+msgid "Port for communication"
+msgstr "Cổng để giao tiếp"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "Vui lòng chọn một cổng QMI/MBIM"
+
+msgid "Modem id"
+msgstr "ID modem"
+
+msgid "Please select a modem id"
+msgstr "Vui lòng chọn một ID modem"
+
+msgid "MBIM device"
+msgstr "Thiết bị MBIM"
+
+msgid "Select if you want to read from MBIM."
+msgstr "Chọn nếu bạn muốn đọc dữ liệu qua MBIM."
+
+msgid "Assigned interface"
+msgstr "Giao diện được gán"
+
+msgid "Interface assigned to modem."
+msgstr "Giao diện được gán cho modem."
+
+msgid "Enter IP adress"
+msgstr "Nhập địa chỉ IP"
+
+msgid "IP adress"
+msgstr "Địa chỉ IP"
+
+msgid "Reading data via"
+msgstr "Đọc dữ liệu qua"
+
+msgid "Port / IP / Modem identifier"
+msgstr "Cổng / IP / Mã định danh Modem"
+
+msgid "Interface assigned to modem."
+msgstr "Giao diện được gán cho modem."
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"Nhập tên modem thủ công nếu tên được đề xuất không rõ ràng.
Quan trọng Tên modem chỉ được tìm kiếm cho các modem kết nối qua USB."
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"Chọn phương thức đọc dữ liệu từ modem.
cổng nối tiếp: Chọn một trong các cổng có sẵn "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN.
ecm: Nhập địa chỉ IP 192.168.X.X mà modem (Huawei) "
+"đang sử dụng.
uqmi: Chọn một trong các cổng cdc-wdmX có sẵn.
ModemManager: Chọn "
+"một trong các mã định danh modem đã tìm thấy."
+
+msgid "Please select a port"
+msgstr "Vui lòng chọn một cổng"
+
+msgid "User description"
+msgstr "Mô tả người dùng"
+
+msgid "Optional"
+msgstr "Tùy chọn"
+
+msgid "User description (optional)"
+msgstr "Mô tả người dùng (tùy chọn)"
+
+msgid "Signal strength"
+msgstr "Cường độ tín hiệu"
+
+msgid "Excellent"
+msgstr "Tuyệt vời"
+
+msgid "Good"
+msgstr "Tốt"
+
+msgid "Fair"
+msgstr "Trung bình"
+
+msgid "Poor"
+msgstr "Yếu"
+
+msgid "Physical cell ID"
+msgstr "ID cell vật lý"
+
+msgid "Bandwidth"
+msgstr "Băng thông"
+
+msgid "SIM status"
+msgstr "Trạng thái SIM"
+
+msgid "Not registered"
+msgstr "Chưa đăng ký"
+
+msgid "Registered"
+msgstr "Đã đăng ký"
+
+msgid "Registered (roaming)"
+msgstr "Đã đăng ký (chuyển vùng)"
+
+msgid "Registered, only SMS"
+msgstr "Đã đăng ký, chỉ SMS"
+
+msgid "Registered (roaming), only SMS"
+msgstr "Đã đăng ký (chuyển vùng), chỉ SMS"
+
+msgid "Searching.."
+msgstr "Đang tìm kiếm..."
+
+msgid "Connection state"
+msgstr "Trạng thái kết nối"
+
+msgid "Connected"
+msgstr "Đã kết nối"
+
+msgid "Disconnected"
+msgstr "Đã ngắt kết nối"
+
+msgid "Registering denied"
+msgstr "Đăng ký bị từ chối"
+
+msgid "Waiting to read data from the modem..."
+msgstr "Đang chờ đọc dữ liệu từ modem..."
+
+msgid "Waiting for data..."
+msgstr "Đang chờ dữ liệu..."
+
+msgid "BTS Search"
+msgstr "Tìm kiếm BTS"
+
+msgid "BTS Information"
+msgstr "Thông tin BTS"
+
+msgid "Search"
+msgstr "Tìm kiếm"
+
+msgid "Bands"
+msgstr "Các băng tần"
+
+msgid "Search BTS"
+msgstr "Tìm kiếm BTS"
+
+msgid "BTS search settings"
+msgstr "Cài đặt tìm kiếm BTS"
+
+msgid "Website to search for BTS"
+msgstr "Trang web để tìm kiếm BTS"
+
+msgid "Select a website for searching."
+msgstr "Chọn một trang web để tìm kiếm."
+
+msgid "Install a package using package manager"
+msgstr "Cài đặt một gói bằng trình quản lý gói"
+
+msgid "Select an action after clicking the search button."
+msgstr "Chọn một hành động sau khi nhấp vào nút tìm kiếm."
+
+msgid "Install iconv"
+msgstr "Cài đặt iconv"
+
+msgid "Install qmi-utils"
+msgstr "Cài đặt qmi-utils"
+
+msgid "SIM Slot"
+msgstr "Khe cắm SIM"
+
+msgid "SIM Card"
+msgstr "Thẻ SIM"
+
+msgid "Slot in use"
+msgstr "Khe đang sử dụng"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "Sự cố khi đăng ký vào mạng, hãy kiểm tra thẻ SIM."
+
+msgid "SIM PIN required"
+msgstr "Yêu cầu mã PIN của SIM"
+
+msgid "SIM PUK required"
+msgstr "Yêu cầu mã PUK của SIM"
+
+msgid "SIM failure"
+msgstr "Lỗi SIM"
+
+msgid "SIM busy"
+msgstr "SIM đang bận"
+
+msgid "SIM wrong"
+msgstr "SIM sai"
+
+msgid "SIM PIN2 required"
+msgstr "Yêu cầu mã PIN2 của SIM"
+
+msgid "SIM PUK2 required"
+msgstr "Yêu cầu mã PUK2 của SIM"
+
+msgid "Defined modems"
+msgstr "Các modem đã định nghĩa"
+
+msgid "Information read from the SIM card and device."
+msgstr "Thông tin đọc từ thẻ SIM và thiết bị."
+
+msgid "No data"
+msgstr "Không có dữ liệu"
+
+msgid "Diagnostics"
+msgstr "Chẩn đoán"
+
+msgid "Modem(s) configuration"
+msgstr "Cấu hình modem"
+
+msgid "Package configuration"
+msgstr "Cấu hình gói"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "Chạy các lệnh khác nhau để xác minh dữ liệu đọc từ modem và gỡ lỗi kịch bản."
+
+msgid "USB debug information"
+msgstr "Thông tin gỡ lỗi USB"
+
+msgid "Check ttyX ports"
+msgstr "Kiểm tra các cổng ttyX"
+
+msgid "Check serial and ecm mode"
+msgstr "Kiểm tra chế độ serial và ecm"
+
+msgid "Check uqmi mode"
+msgstr "Kiểm tra chế độ uqmi"
+
+msgid "Check ModemManager mode"
+msgstr "Kiểm tra chế độ ModemManager"
+
+msgid "Clear"
+msgstr "Xóa"
+
+msgid "Download"
+msgstr "Tải xuống"
+
+msgid "Location"
+msgstr "Vị trí"
+
+msgid "Notes Update date"
+msgstr "Ngày cập nhật ghi chú"
+
+msgid "Band"
+msgstr "Băng tần"
+
+msgid "Network"
+msgstr "Mạng"
+
+msgid "Package update and support"
+msgstr "Cập nhật gói và hỗ trợ"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "Không thể tải xuống tệp index.json từ kho lưu trữ bên ngoài."
+
+msgid "Failed to read downloaded file."
+msgstr "Không thể đọc tệp đã tải xuống."
+
+msgid "Installed package is up to date."
+msgstr "Gói đã cài đặt là phiên bản mới nhất."
+
+msgid "Update is available."
+msgstr "Có bản cập nhật."
+
+msgid "The index.json file did not contain any package information."
+msgstr "Tệp index.json không chứa thông tin gói nào."
+
+msgid "Error parsing version."
+msgstr "Lỗi khi phân tích phiên bản."
+
+msgid "Check repository"
+msgstr "Kiểm tra kho lưu trữ"
+
+msgid "Package update..."
+msgstr "Đang cập nhật gói..."
+
+msgid "Report a bug"
+msgstr "Báo lỗi"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "Viết trong chủ đề của gói trên diễn đàn eko.one.pl"
+
+msgid "Write on forum"
+msgstr "Viết trên diễn đàn"
+
+msgid "Report a bug on the package Github page"
+msgstr "Báo lỗi trên trang Github của gói"
+
+msgid "Open a package discussion on Github"
+msgstr "Mở một cuộc thảo luận về gói trên Github"
+
+msgid "Open discussion"
+msgstr "Mở thảo luận"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "Mời tôi một ly cà phê nếu bạn muốn hỗ trợ sự phát triển của dự án và tác giả"
+
+msgid "Buy a coffee"
+msgstr "Mời tôi cà phê"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "Trở thành nhà tài trợ nếu bạn muốn hỗ trợ sự phát triển của dự án và tác giả"
+
+msgid "Become a sponsor"
+msgstr "Trở thành nhà tài trợ"
+
+msgid "Download package information from an external repository"
+msgstr "Tải thông tin gói từ kho lưu trữ bên ngoài"
+
+msgid "Add repository and download package update"
+msgstr "Thêm kho lưu trữ và tải bản cập nhật gói"
+
+msgid "Package Info"
+msgstr "Thông tin gói"
+
+msgid "Compiled"
+msgstr "Đã biên dịch"
+
+msgid "Repository Info"
+msgstr "Thông tin kho lưu trữ"
+
+msgid "Currently installed"
+msgstr "Hiện đã cài đặt"
+
+msgid "Package in repository"
+msgstr "Gói trong kho lưu trữ"
+
+msgid "Last repository check"
+msgstr "Lần kiểm tra kho lưu trữ cuối cùng"
+
+msgid "Poland"
+msgstr "Ba Lan"
+
+msgid "Force read by"
+msgstr "Buộc đọc bằng"
+
+msgid "Select method for reading data from the modem."
+msgstr "Chọn phương thức đọc dữ liệu từ modem."
+
+msgid "inactive"
+msgstr "không hoạt động"
+
+msgid "ModemMenager"
+msgstr "ModemManager"
+
+msgid "Force PLMN"
+msgstr "Buộc PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "Buộc đọc PLMN từ tệp."
+
+msgid "Command result"
+msgstr "Kết quả lệnh"
+
+msgid "Check"
+msgstr "Kiểm tra"
+
+msgid "Auto update every:"
+msgstr "Tự động cập nhật mỗi:"
+
+msgid "2 seconds"
+msgstr "2 giây"
+
+msgid "3 seconds"
+msgstr "3 giây"
+
+msgid "5 seconds"
+msgstr "5 giây"
+
+msgid "10 seconds"
+msgstr "10 giây"
+
+msgid "30 seconds"
+msgstr "30 giây"
+
+msgid "45 seconds"
+msgstr "45 giây"
+
+msgid "60 seconds"
+msgstr "60 giây"
+
+msgid "Refresh rate"
+msgstr "Tần suất làm mới"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "Đặt tần suất làm mới dữ liệu trong tab Modem."
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"Đặt tần suất làm mới dữ liệu trong tab Modem.
Quan trọng Không "
+"phải mọi modem / giao thức đều có thể giao tiếp nhanh với các kịch bản. "
+"Tần suất thăm dò quá cao có thể làm treo modem. ModemManager và uqmi cần nhiều thời gian hơn để phản hồi."
+
+msgid "Updating again in %s second(s)."
+msgstr "Cập nhật lại sau %s giây."
+
+msgid "Please wait... data collection is in progress."
+msgstr "Vui lòng đợi... đang thu thập dữ liệu."
+
+msgid "Modems found"
+msgstr "Đã tìm thấy modem"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "Danh sách các modem được tìm thấy. Có thể không phải tất cả modem đều được hiển thị."
+
+msgid "Show modems found"
+msgstr "Hiển thị các modem đã tìm thấy"
+
+msgid "Show"
+msgstr "Hiển thị"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "Hiện tại, chỉ tìm kiếm các modem được kết nối qua USB."
+
+msgid "No Modems Detected..."
+msgstr "Không tìm thấy modem..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "Ôi... không có modem nào trong cài đặt. Bạn sẽ được chuyển hướng đến một tab nơi bạn có thể định nghĩa (các) modem đã cài đặt."
+
+msgid "Redirecting..."
+msgstr "Đang chuyển hướng..."
+
+msgid "Redirecting in"
+msgstr "Chuyển hướng sau"
+
+msgid "seconds..."
+msgstr "giây..."
+
+msgid "(no data)"
+msgstr "(không có dữ liệu)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "Nhập địa chỉ IP hợp lệ theo định dạng 192.168.X.X"
+
+msgid "Only numbers and dots are allowed"
+msgstr "Chỉ cho phép số và dấu chấm"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "Mỗi phần phải là một số từ 0 đến 255"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "Trong tương lai, tab này sẽ cho phép bạn cập nhật gói từ kho lưu trữ bên ngoài của %sRafał (IceG)%s."
+
+msgid "Option will appear after apk implementation."
+msgstr "Tùy chọn sẽ xuất hiện sau khi triển khai apk."
+
+msgid "Author (package maintainer)"
+msgstr "Tác giả (người bảo trì gói)"
+
+msgid "Modemdata Info"
+msgstr "Thông tin Modemdata"
+
+msgid "Modemdata Status"
+msgstr "Trạng thái Modemdata"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Thông tin Luci-app-modemdata"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "Đi tới tab Chẩn đoán và chạy kiểm tra kịch bản. Thông thường, lỗi là do tên nhà mạng lạ. Để khắc phục điều này, hãy chọn tùy chọn 'Buộc đọc PLMN từ tệp' nếu nó có sẵn trong các tùy chọn cấu hình modem."
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "Nếu dữ liệu trong LuCI không hiển thị, và bạn chắc chắn 100% rằng modem đã được định nghĩa/cấu hình chính xác."
+
+msgid "Suggested solution"
+msgstr "Giải pháp đề xuất"
+
+msgid "Troubleshooting / Hints"
+msgstr "Khắc phục sự cố / Gợi ý"
+
+msgid "Problem"
+msgstr "Vấn đề"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "Các vấn đề phổ biến có thể phát sinh khi sử dụng gói và cách giải quyết chúng."
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "Gói không hiển thị dữ liệu cho modem Fibocom FM350-GL."
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "Modem rất nhạy cảm với dữ liệu được đọc bởi cổng giao tiếp. Việc chọn sai cổng giao tiếp có thể khiến modem bị treo hoặc khởi động lại."
+
+msgid "and"
+msgstr "và"
+
+msgid "packages are recommended for proper modem support."
+msgstr "được khuyến nghị để hỗ trợ modem đúng cách."
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "Vui lòng chọn phương thức đọc dữ liệu từ modem và cài đặt các gói cần thiết."
+
+msgid "Required packages"
+msgstr "Các gói yêu cầu"
+
+msgid "Check required packages"
+msgstr "Kiểm tra các gói yêu cầu"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "Trước khi cấu hình modem, hãy kiểm tra xem tất cả các gói yêu cầu đã được cài đặt trong hệ thống chưa."
+
+msgid "Loading package data…"
+msgstr "Đang tải dữ liệu gói..."
+
+msgid "Waiting..."
+msgstr "Đang chờ..."
+
+msgid "Show signal levels for the primary band"
+msgstr "Hiển thị mức tín hiệu cho băng tần chính"
+
+msgid "Primary band signal levels"
+msgstr "Mức tín hiệu băng tần chính"
+
+msgid "Device is busy"
+msgstr "Thiết bị đang bận"
+
+msgid "Primary band"
+msgstr "Băng tần chính"
+
+msgid "Available options"
+msgstr "Các tùy chọn có sẵn"
+
+msgid "Device not found"
+msgstr "Không tìm thấy thiết bị"
+
+msgid "Registered, home"
+msgstr "Đã đăng ký, mạng nhà"
+
+msgid "Click to view Cell ID details"
+msgstr "Nhấp để xem chi tiết ID cell"
+
+msgid "Cell ID (dec)"
+msgstr "ID cell (dec)"
+
+msgid "Cell ID (hex)"
+msgstr "ID cell (hex)"
+
+msgid "eNB ID (hex)"
+msgstr "ID eNB (hex)"
+
+msgid "Sector ID (hex)"
+msgstr "ID sector (hex)"
+
+msgid "eNB ID (dec)"
+msgstr "ID eNB (dec)"
+
+msgid "Sector ID (dec)"
+msgstr "ID sector (dec)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "ID cell (hex) cho CellMapper"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "ID cell (dec) cho CellMapper"
+
+msgid "Cell ID Information"
+msgstr "Thông tin ID cell"
+
+msgid "Modem"
+msgstr "Modem"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "Thông tin chi tiết về ID cell với các định dạng cho các công cụ và ứng dụng khác nhau."
+
+msgid "Information about package authors and available support options."
+msgstr "Thông tin về tác giả gói và các tùy chọn hỗ trợ có sẵn."
+
+msgid "Package name"
+msgstr "Tên gói"
+
+msgid "Proper Modem Configuration."
+msgstr "Cấu hình modem đúng cách."
+
+msgid "User should remember:"
+msgstr "Người dùng nên nhớ:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. Đối với một modem cụ thể, chỉ nên đặt một giao thức để giao tiếp với modem."
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. Chỉ một gói có thể đọc dữ liệu từ modem (cùng một lúc)."
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. Đọc dữ liệu từ modem quá thường xuyên có thể làm treo thiết bị (MM và uqmi cần nhiều thời gian hơn)."
+
+msgid "BTS search: no response from server."
+msgstr "Tìm kiếm BTS: không có phản hồi từ máy chủ."
+
+msgid "BTS search: no results found."
+msgstr "Tìm kiếm BTS: không tìm thấy kết quả."
+
+msgid "this month"
+msgstr "tháng này"
+
+msgid "month ago"
+msgstr "1 tháng trước"
+
+msgid "months ago"
+msgstr "vài tháng trước"
+
+msgid "Station ID"
+msgstr "ID trạm"
+
+msgid "Confirmed"
+msgstr "Đã xác nhận"
+
+msgid "Updated"
+msgstr "Đã cập nhật"
+
+msgid "Show on map"
+msgstr "Hiển thị trên bản đồ"
+
+msgid "Download data"
+msgstr "Tải dữ liệu"
+
+msgid "Install curl"
+msgstr "Cài đặt curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "Lưu ý: Gói này hoàn toàn tương thích với phiên bản mới nhất, thế hệ thứ ba của trang web BTSearch."
+
+msgid "Skip package verification"
+msgstr "Bỏ qua kiểm tra gói"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "Bật tùy chọn này để bỏ qua việc kiểm tra các gói đã cài đặt và cho phép chọn bất kỳ phương thức nào từ danh sách bên dưới."
diff --git a/modemdata/luci-app-modemdata/po/zh_Hans/modemdata.po b/modemdata/luci-app-modemdata/po/zh_Hans/modemdata.po
new file mode 100644
index 000000000..c50b47766
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/zh_Hans/modemdata.po
@@ -0,0 +1,973 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: luci-app-modemdata\n"
+"PO-Revision-Date: 2024-11-04 20:05+0800\n"
+"Last-Translator: \n"
+"Language-Team: Chinese (Simplified)\n"
+"Language: zh_Hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Information about 3G/4G/5G connection"
+msgstr "3G/4G/5G 连接信息"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "有关 modemdata 软件包的更多信息,请访问:%shttps://github.com/obsy/modemdata%s。"
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "该软件包允许用户查看从调制解调器读取的数据,查看移动网络连接参数。"
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl 论坛"
+
+msgid "Signal strength"
+msgstr "信号强度"
+
+msgid "Modem(s)"
+msgstr "调制解调器"
+
+msgid "Ups.. no modems detected."
+msgstr "喔嚯……没找到调制解调器。"
+
+msgid "Configuration"
+msgstr "配置"
+
+msgid "General Information"
+msgstr "常规信息"
+
+msgid "Modem Information"
+msgstr "调制解调器信息"
+
+msgid "Cell Information"
+msgstr "基站信息"
+
+msgid "Connection"
+msgstr "连接"
+
+msgid "Technology"
+msgstr "技术"
+
+msgid "Operator"
+msgstr "运营商"
+
+msgid "Location"
+msgstr "位置"
+
+msgid "Sent"
+msgstr "已发送"
+
+msgid "Connection time"
+msgstr "连接时间"
+
+msgid "Modem type"
+msgstr "调制解调器类型"
+
+msgid "Hide data."
+msgstr "隐藏数据。"
+
+msgid "Hide selected data"
+msgstr "隐藏选定的数据"
+
+msgid "Additional information"
+msgstr "附加信息"
+
+msgid "Revision / FW"
+msgstr "版本 / 固件"
+
+msgid "IP adress / Port"
+msgstr "IP 地址 / 端口"
+
+msgid "Chip Temperature"
+msgstr "芯片温度"
+
+msgid "Configuration modemdata package"
+msgstr "配置 modemdata 软件包"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "modemdata 和图形界面应用程序的配置面板。"
+
+msgid "Add data to hide"
+msgstr "添加要隐藏的数据"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "输入您想要隐藏的数据,例如 IMEI, IMSI。"
+
+msgid "Open page"
+msgstr "打开页面"
+
+msgid "Download data (experimental)"
+msgstr "下载数据(实验性)"
+
+msgid "Network"
+msgstr "网络"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "与调制解调器通信的 IP 地址 / 端口"
+
+msgid "Defined modems"
+msgstr "已定义的调制解调器"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "定义可用调制解调器的界面。调制解调器列表将使用户更容易在 LuCI 中切换调制解调器。"
+
+msgid "Settings"
+msgstr "设置"
+
+msgid "Add new modem settings..."
+msgstr "添加新的调制解调器设置..."
+
+msgid "Modem Settings"
+msgstr "调制解调器设置"
+
+msgid "Manufacturer / Product"
+msgstr "制造商 / 产品"
+
+msgid "Please select a modem"
+msgstr "请选择调制解调器"
+
+msgid "IP adress / Port for communication"
+msgstr "通信的 IP 地址 / 端口"
+
+msgid "Protocol"
+msgstr "协议"
+
+msgid "Port for communication"
+msgstr "通信端口"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "请选择 QMI/MBIM 端口"
+
+msgid "Modem id"
+msgstr "调制解调器 ID"
+
+msgid "Please select a modem id"
+msgstr "请选择调制解调器 ID"
+
+msgid "MBIM device"
+msgstr "MBIM 设备"
+
+msgid "Select if you want to read from MBIM."
+msgstr "如果要从 MBIM 读取,请选择此项。"
+
+msgid "Assigned interface"
+msgstr "分配的接口"
+
+msgid "Interface assigned to modem."
+msgstr "分配给调制解调器的接口。"
+
+msgid "Enter IP adress"
+msgstr "输入 IP 地址"
+
+msgid "IP adress"
+msgstr "IP 地址"
+
+msgid "Reading data via"
+msgstr "通过以下方式读取数据"
+
+msgid "Port / IP / Modem identifier"
+msgstr "端口 / IP / 调制解调器标识符"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"如果建议的名称不明确,请手动输入调制解调器名称。"
+"
重要 仅搜索通过 USB 连接的调制解调器名称。"
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"选择从调制解调器读取数据的方法。
ModemManager: 选择"
+"一个搜索到的调制解调器标识符。"
+
+msgid "Please select a port"
+msgstr "请选择端口"
+
+msgid "User description"
+msgstr "用户描述"
+
+msgid "Optional"
+msgstr "可选"
+
+msgid "User description (optional)"
+msgstr "用户描述(可选)"
+
+msgid "Excellent"
+msgstr "优秀"
+
+msgid "Good"
+msgstr "良好"
+
+msgid "Fair"
+msgstr "一般"
+
+msgid "Poor"
+msgstr "较差"
+
+msgid "Physical cell ID"
+msgstr "物理小区 ID"
+
+msgid "Bandwidth"
+msgstr "带宽"
+
+msgid "SIM status"
+msgstr "SIM 卡状态"
+
+msgid "Not registered"
+msgstr "未注册"
+
+msgid "Registered, home"
+msgstr "已注册,本地网络"
+
+msgid "Registered (roaming)"
+msgstr "已注册(漫游)"
+
+msgid "Registered, only SMS"
+msgstr "已注册,仅短信"
+
+msgid "Registered (roaming), only SMS"
+msgstr "已注册(漫游),仅短信"
+
+msgid "Searching.."
+msgstr "搜索中.."
+
+msgid "Connection state"
+msgstr "连接状态"
+
+msgid "Connected"
+msgstr "已连接"
+
+msgid "Disconnected"
+msgstr "已断开"
+
+msgid "Registering denied"
+msgstr "注册被拒绝"
+
+msgid "Waiting to read data from the modem..."
+msgstr "等待从调制解调器读取数据..."
+
+msgid "Waiting for data..."
+msgstr "等待数据..."
+
+msgid "BTS Search"
+msgstr "基站搜索"
+
+msgid "BTS Information"
+msgstr "基站信息"
+
+msgid "Search"
+msgstr "搜索"
+
+msgid "Bands"
+msgstr "频段"
+
+msgid "Search BTS"
+msgstr "搜索基站"
+
+msgid "BTS search settings"
+msgstr "基站搜索设置"
+
+msgid "Website to search for BTS"
+msgstr "搜索基站的网站"
+
+msgid "Select a website for searching."
+msgstr "选择用于搜索的网站。"
+
+msgid "Install a package using package manager"
+msgstr "使用软件包管理器安装软件包"
+
+msgid "Select an action after clicking the search button."
+msgstr "单击搜索按钮后选择操作。"
+
+msgid "Install iconv"
+msgstr "安装 iconv"
+
+msgid "Install qmi-utils"
+msgstr "安装 qmi-utils"
+
+msgid "SIM Slot"
+msgstr "SIM 卡槽"
+
+msgid "SIM Card"
+msgstr "SIM 卡"
+
+msgid "Slot in use"
+msgstr "使用中的卡槽"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "注册到网络时出现问题,请检查 SIM 卡。"
+
+msgid "SIM PIN required"
+msgstr "需要 SIM 卡 PIN 码"
+
+msgid "SIM PUK required"
+msgstr "需要 SIM 卡 PUK 码"
+
+msgid "SIM failure"
+msgstr "SIM 卡故障"
+
+msgid "SIM busy"
+msgstr "SIM 卡繁忙"
+
+msgid "SIM wrong"
+msgstr "SIM 卡错误"
+
+msgid "SIM PIN2 required"
+msgstr "需要 SIM 卡 PIN2 码"
+
+msgid "SIM PUK2 required"
+msgstr "需要 SIM 卡 PUK2 码"
+
+msgid "Information read from the SIM card and device."
+msgstr "从 SIM 卡和设备读取的信息。"
+
+msgid "No data"
+msgstr "无数据"
+
+msgid "Diagnostics"
+msgstr "诊断"
+
+msgid "Modem(s) configuration"
+msgstr "调制解调器配置"
+
+msgid "Package configuration"
+msgstr "软件包配置"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "运行各种命令以验证从调制解调器读取的数据并调试脚本。"
+
+msgid "USB debug information"
+msgstr "USB 调试信息"
+
+msgid "Check ttyX ports"
+msgstr "检查 ttyX 端口"
+
+msgid "Check serial and ecm mode"
+msgstr "检查串口和 ecm 模式"
+
+msgid "Check uqmi mode"
+msgstr "检查 uqmi 模式"
+
+msgid "Check ModemManager mode"
+msgstr "检查 ModemManager 模式"
+
+msgid "Clear"
+msgstr "清除"
+
+msgid "Download"
+msgstr "下载"
+
+msgid "Notes Update date"
+msgstr "备注 更新日期"
+
+msgid "Band"
+msgstr "频段"
+
+msgid "Package update and support"
+msgstr "软件包更新和支持"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "无法从外部仓库下载 index.json 文件。"
+
+msgid "Failed to read downloaded file."
+msgstr "无法读取下载的文件。"
+
+msgid "Installed package is up to date."
+msgstr "已安装的软件包是最新的。"
+
+msgid "Update is available."
+msgstr "有可用更新。"
+
+msgid "The index.json file did not contain any package information."
+msgstr "index.json 文件不包含任何软件包信息。"
+
+msgid "Error parsing version."
+msgstr "解析版本时出错。"
+
+msgid "Check repository"
+msgstr "检查仓库"
+
+msgid "Package update..."
+msgstr "软件包更新..."
+
+msgid "Report a bug"
+msgstr "报告错误"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "在 eko.one.pl 论坛的软件包主题中发帖"
+
+msgid "Write on forum"
+msgstr "在论坛上发帖"
+
+msgid "Report a bug on the package Github page"
+msgstr "在软件包的 Github 页面上报告错误"
+
+msgid "Open a package discussion on Github"
+msgstr "在 Github 上打开软件包讨论"
+
+msgid "Open discussion"
+msgstr "打开讨论"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "如果您想支持项目和作者的开发,请请我喝杯咖啡"
+
+msgid "Buy a coffee"
+msgstr "请喝咖啡"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "如果您想支持项目和作者的开发,请成为赞助者"
+
+msgid "Become a sponsor"
+msgstr "成为赞助者"
+
+msgid "Download package information from an external repository"
+msgstr "从外部仓库下载软件包信息"
+
+msgid "Add repository and download package update"
+msgstr "添加仓库并下载软件包更新"
+
+msgid "Package Info"
+msgstr "软件包信息"
+
+msgid "Compiled"
+msgstr "编译时间"
+
+msgid "Repository Info"
+msgstr "仓库信息"
+
+msgid "Currently installed"
+msgstr "当前已安装"
+
+msgid "Package in repository"
+msgstr "仓库中的软件包"
+
+msgid "Last repository check"
+msgstr "上次检查仓库"
+
+msgid "Poland"
+msgstr "波兰"
+
+msgid "Force read by"
+msgstr "强制读取方式"
+
+msgid "Select method for reading data from the modem."
+msgstr "选择从调制解调器读取数据的方法。"
+
+msgid "inactive"
+msgstr "未激活"
+
+msgid "ModemMenager"
+msgstr "调制解调器管理器"
+
+msgid "Force PLMN"
+msgstr "强制 PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "强制从文件读取 PLMN。"
+
+msgid "Command result"
+msgstr "命令结果"
+
+msgid "Check"
+msgstr "检查"
+
+msgid "Auto update every:"
+msgstr "自动更新间隔:"
+
+msgid "2 seconds"
+msgstr "2 秒"
+
+msgid "3 seconds"
+msgstr "3 秒"
+
+msgid "5 seconds"
+msgstr "5 秒"
+
+msgid "10 seconds"
+msgstr "10 秒"
+
+msgid "30 seconds"
+msgstr "30 秒"
+
+msgid "45 seconds"
+msgstr "45 秒"
+
+msgid "60 seconds"
+msgstr "60 秒"
+
+msgid "Refresh rate"
+msgstr "刷新频率"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "设置调制解调器选项卡中数据刷新的频率。"
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"设置调制解调器选项卡中数据刷新的频率。
重要 并非"
+"每个调制解调器 / 协议都能与脚本快速通信。"
+"轮询频率过高可能会导致调制解调器冻结。 ModemManager 和 uqmi 需要更多时间响应。"
+
+msgid "Updating again in %s second(s)."
+msgstr "%s 秒后再次更新。"
+
+msgid "Please wait... data collection is in progress."
+msgstr "请稍候... 正在收集数据。"
+
+msgid "Modems found"
+msgstr "找到的调制解调器"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "找到的调制解调器列表。可能不会显示所有调制解调器。"
+
+msgid "Show modems found"
+msgstr "显示找到的调制解调器"
+
+msgid "Show"
+msgstr "显示"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "目前仅搜索通过 USB 连接的调制解调器。"
+
+msgid "No Modems Detected..."
+msgstr "未检测到调制解调器..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "喔嚯……设置中没有调制解调器。您将被重定向到可以定义已安装调制解调器的选项卡。"
+
+msgid "Redirecting..."
+msgstr "重定向中..."
+
+msgid "Redirecting in"
+msgstr "重定向倒计时"
+
+msgid "seconds..."
+msgstr "秒..."
+
+msgid "(no data)"
+msgstr "(无数据)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "以 192.168.X.X 格式输入有效的 IP 地址"
+
+msgid "Only numbers and dots are allowed"
+msgstr "只允许数字和点"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "每部分必须是 0 到 255 之间的数字"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "将来此选项卡将允许您从 %sRafał (IceG) 外部仓库%s 更新软件包。"
+
+msgid "Option will appear after apk implementation."
+msgstr "选项将在 apk 实现后出现。"
+
+msgid "Author (package maintainer)"
+msgstr "作者(软件包维护者)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata 信息"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata 信息"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "转到诊断选项卡并运行脚本检查。通常,错误是由奇怪的运营商名称引起的。要解决此问题,请在调制解调器配置选项中选择从文件强制 PLMN 选项(如果可用)。"
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "如果 LuCI 中的数据不可见,而我们百分之百确定调制解调器已正确定义/配置。"
+
+msgid "Suggested solution"
+msgstr "建议的解决方案"
+
+msgid "Troubleshooting"
+msgstr "故障排除"
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "请选择从调制解调器读取数据的方法并安装必要的软件包。"
+
+msgid "Required packages"
+msgstr "所需软件包"
+
+msgid "Check required packages"
+msgstr "检查所需软件包"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "在配置调制解调器之前,请检查系统中是否安装了所有必需的软件包。"
+
+msgid "Loading package data…"
+msgstr "加载软件包数据..."
+
+msgid "Waiting..."
+msgstr "等待中..."
+
+msgid "Show signal levels"
+msgstr "显示信号电平"
+
+msgid "Primary band signal levels"
+msgstr "主频段信号电平"
+
+msgid "Device is busy"
+msgstr "设备繁忙"
+
+msgid "Primary band"
+msgstr "主频段"
+
+msgid "Available options"
+msgstr "可用选项"
+
+msgid "Device not found"
+msgstr "未找到设备"
+
+msgid "Click to view Cell ID details"
+msgstr "单击以查看小区 ID 详细信息"
+
+msgid "Cell ID (dec)"
+msgstr "小区 ID(十进制)"
+
+msgid "Cell ID (hex)"
+msgstr "小区 ID(十六进制)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID(十六进制)"
+
+msgid "Sector ID (hex)"
+msgstr "扇区 ID(十六进制)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID(十进制)"
+
+msgid "Sector ID (dec)"
+msgstr "扇区 ID(十进制)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "CellMapper 的小区 ID(十六进制)"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "CellMapper 的小区 ID(十进制)"
+
+msgid "Cell ID Information"
+msgstr "小区 ID 信息"
+
+msgid "Modem"
+msgstr "调制解调器"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "详细的小区 ID 信息,包含不同工具和应用程序的格式。"
+
+msgid "Information about package authors and available support options."
+msgstr "有关软件包作者和可用支持选项的信息。"
+
+msgid "Package name"
+msgstr "软件包名称"
+
+msgid "Proper Modem Configuration."
+msgstr "正确的调制解调器配置。"
+
+msgid "User should remember:"
+msgstr "用户应记住:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. 对于特定的调制解调器,只应设置一个与调制解调器通信的协议。"
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. 同时只能有一个软件包从调制解调器读取数据。"
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. 过于频繁地从调制解调器读取数据可能会导致其冻结(MM 和 uqmi 需要更多时间)。"
+
+msgid "Troubleshooting / Hints"
+msgstr "故障排除 / 提示"
+
+msgid "Problem"
+msgstr "问题"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "使用软件包时可能出现的常见问题及其解决方法。"
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "软件包不显示 Fibocom FM350-GL 调制解调器的数据。"
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "调制解调器对通信端口读取的数据非常敏感。选择错误的通信端口可能会导致调制解调器冻结或重启。"
+
+msgid "and"
+msgstr "和"
+
+msgid "packages are recommended for proper modem support."
+msgstr "软件包推荐用于正确支持调制解调器。"
+
+msgid "Modemdata"
+msgstr "Modemdata"
+
+msgid "Luci-app-modemdata"
+msgstr "Luci-app-modemdata"
+
+msgid "Info"
+msgstr "信息"
+
+msgid "Action"
+msgstr "操作"
+
+msgid "Run"
+msgstr "运行"
+
+msgid "Close"
+msgstr "关闭"
+
+msgid "Dismiss"
+msgstr "关闭"
+
+msgid "Unable to clear the file"
+msgstr "无法清除文件"
+
+msgid "Unable to read the contents"
+msgstr "无法读取内容"
+
+msgid "Unable to save the contents"
+msgstr "无法保存内容"
+
+msgid "Error: "
+msgstr "错误:"
+
+msgid "Download error"
+msgstr "下载错误"
+
+msgid "Failed to load package data."
+msgstr "无法加载软件包数据。"
+
+msgid "Failed to download bts data file from site."
+msgstr "无法从网站下载基站数据文件。"
+
+msgid "Failed to process the downloaded file with btsearch.sh."
+msgstr "无法使用 btsearch.sh 处理下载的文件。"
+
+msgid "Error loading Cell ID data: "
+msgstr "加载小区 ID 数据时出错:"
+
+msgid "Loading"
+msgstr "加载中"
+
+msgid "Refreshing"
+msgstr "刷新中"
+
+msgid "Disabled"
+msgstr "已禁用"
+
+msgid "Disabled."
+msgstr "已禁用。"
+
+msgid "Install"
+msgstr "安装"
+
+msgid "Install…"
+msgstr "去安装..."
+
+msgid "Installed"
+msgstr "已安装"
+
+msgid "serial"
+msgstr "串口"
+
+msgid "ecm"
+msgstr "ecm"
+
+msgid "uqmi"
+msgstr "uqmi"
+
+msgid "modemmanager"
+msgstr "调制解调器管理器"
+
+msgid "modem "
+msgstr "调制解调器 "
+
+msgid "Name"
+msgstr "名称"
+
+msgid "Time"
+msgstr "时间"
+
+msgid "Signal"
+msgstr "信号"
+
+msgid "(Signal Strength)"
+msgstr "(信号强度)"
+
+msgid "Received"
+msgstr "已接收"
+
+msgid "Country"
+msgstr "国家"
+
+msgid "ICCID"
+msgstr "ICCID"
+
+msgid "IMSI"
+msgstr "IMSI"
+
+msgid "Modem IMEI"
+msgstr "调制解调器 IMEI"
+
+msgid "Cell ID"
+msgstr "小区 ID"
+
+msgid "CID"
+msgstr "CID"
+
+msgid "LAC"
+msgstr "LAC"
+
+msgid "LAC/TAC"
+msgstr "LAC/TAC"
+
+msgid "TAC"
+msgstr "TAC"
+
+msgid "RSSI"
+msgstr "RSSI"
+
+msgid "RSCP"
+msgstr "RSCP"
+
+msgid "RSRP"
+msgstr "RSRP"
+
+msgid "RSRQ"
+msgstr "RSRQ"
+
+msgid "SINR"
+msgstr "SINR"
+
+msgid "SNR"
+msgstr "SNR"
+
+msgid "EC/IO"
+msgstr "EC/IO"
+
+msgid "EARFCN"
+msgstr "EARFCN"
+
+msgid "UARFCN"
+msgstr "UARFCN"
+
+msgid "RNC/eNBI"
+msgstr "RNC/eNBI"
+
+msgid "UC-Id/ECID"
+msgstr "UC-Id/ECID"
+
+msgid "Duplex"
+msgstr "双工"
+
+msgid "StationID"
+msgstr "站点 ID"
+
+msgid "Cd."
+msgstr "编号"
+
+msgid "Mobile Country Code"
+msgstr "移动国家代码"
+
+msgid "Mobile Network Code"
+msgstr "移动网络代码"
+
+msgid "btsearch.pl"
+msgstr "btsearch.pl"
+
+msgid "lteitaly.it"
+msgstr "lteitaly.it"
+
+msgid "☰"
+msgstr "☰"
+
+msgid "-"
+msgstr "-"
+
+msgid "Signal to Interference+Noise / Signal to Noise"
+msgstr "信号与干扰+噪声比 / 信噪比"
+
+msgid "Received Signal Strength Indicator"
+msgstr "接收信号强度指示"
+
+msgid "Reference Signal Received Power"
+msgstr "参考信号接收功率"
+
+msgid "Reference Signal Received Quality"
+msgstr "参考信号接收质量"
+
+msgid "Received Signal Code Power"
+msgstr "接收信号码功率"
+
+msgid "Energy per Chip / Interference"
+msgstr "每码片能量 / 干扰比"
+
+msgid "Modemdata Status"
+msgstr "调制解调器数据状态"
+
+msgid "(Received Signal Strength Indicator)"
+msgstr "(接收信号强度指示)"
+
+msgid "(Reference Signal Received Power)"
+msgstr "(参考信号接收功率)"
+
+msgid "(Reference Signal Received Quality)"
+msgstr "(参考信号接收质量)"
+
+msgid "(Signal to Interference+Noise / Signal to Noise)"
+msgstr "(信号与干扰+噪声比 / 信噪比)"
+
+msgid "(Received Signal Code Power)"
+msgstr "(接收信号码功率)"
+
+msgid "(Energy per Chip / Interference)"
+msgstr "(每码片能量 / 干扰比)"
+
+msgid "BTS search: no response from server."
+msgstr "BTS搜索:服务器无响应。"
+
+msgid "BTS search: no results found."
+msgstr "BTS搜索:未找到结果。"
+
+msgid "this month"
+msgstr "本月"
+
+msgid "month ago"
+msgstr "1个月前"
+
+msgid "months ago"
+msgstr "几个月前"
+
+msgid "Station ID"
+msgstr "基站ID"
+
+msgid "Confirmed"
+msgstr "已确认"
+
+msgid "Updated"
+msgstr "已更新"
+
+msgid "Show on map"
+msgstr "在地图上显示"
+
+msgid "Download data"
+msgstr "下载数据"
+
+msgid "Install curl"
+msgstr "安装curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "注意:该软件包与最新的第三代 BTSearch 网站完全兼容。"
+
+msgid "Skip package verification"
+msgstr "跳过软件包验证"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "启用此选项可跳过已安装软件包的检查,并允许从下方列表中选择任意方式。"
diff --git a/modemdata/luci-app-modemdata/po/zh_Hant/modemdata.po b/modemdata/luci-app-modemdata/po/zh_Hant/modemdata.po
new file mode 100644
index 000000000..9a15e51c4
--- /dev/null
+++ b/modemdata/luci-app-modemdata/po/zh_Hant/modemdata.po
@@ -0,0 +1,971 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: luci-app-modemdata\n"
+"Language-Team: Chinese (Traditional)\n"
+"Language: zh_Hant\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Information about 3G/4G/5G connection"
+msgstr "3G/4G/5G 連線資訊"
+
+msgid "For more information about the modemdata package, please visit: %shttps://github.com/obsy/modemdata%s."
+msgstr "有關 modemdata 套件的更多資訊,請造訪:%shttps://github.com/obsy/modemdata%s。"
+
+msgid "Package allows the user to view the data read from the modem, to see the parameters of the connection to the mobile network."
+msgstr "此套件允許使用者檢視從數據機讀取的資料,查看行動網路連線參數。"
+
+msgid "eko.one.pl forum"
+msgstr "eko.one.pl 論壇"
+
+msgid "Signal strength"
+msgstr "訊號強度"
+
+msgid "Modem(s)"
+msgstr "數據機"
+
+msgid "Ups.. no modems detected."
+msgstr "哎呀……找不到數據機。"
+
+msgid "Configuration"
+msgstr "設定"
+
+msgid "General Information"
+msgstr "一般資訊"
+
+msgid "Modem Information"
+msgstr "數據機資訊"
+
+msgid "Cell Information"
+msgstr "基地台資訊"
+
+msgid "Connection"
+msgstr "連線"
+
+msgid "Technology"
+msgstr "技術"
+
+msgid "Operator"
+msgstr "電信業者"
+
+msgid "Location"
+msgstr "位置"
+
+msgid "Sent"
+msgstr "已傳送"
+
+msgid "Connection time"
+msgstr "連線時間"
+
+msgid "Modem type"
+msgstr "數據機類型"
+
+msgid "Hide data."
+msgstr "隱藏資料。"
+
+msgid "Hide selected data"
+msgstr "隱藏所選資料"
+
+msgid "Additional information"
+msgstr "附加資訊"
+
+msgid "Revision / FW"
+msgstr "版本 / 韌體"
+
+msgid "IP adress / Port"
+msgstr "IP 位址 / 連接埠"
+
+msgid "Chip Temperature"
+msgstr "晶片溫度"
+
+msgid "Configuration modemdata package"
+msgstr "設定 modemdata 套件"
+
+msgid "Configuration panel for modemdata and gui application."
+msgstr "modemdata 和圖形介面應用程式的設定面板。"
+
+msgid "Add data to hide"
+msgstr "新增要隱藏的資料"
+
+msgid "Enter the data you would like to hide, e.g. IMEI, IMSI."
+msgstr "輸入您想隱藏的資料,例如 IMEI, IMSI。"
+
+msgid "Open page"
+msgstr "開啟頁面"
+
+msgid "Download data (experimental)"
+msgstr "下載資料(實驗性)"
+
+msgid "Network"
+msgstr "網路"
+
+msgid "IP adress / Port for communication with the modem"
+msgstr "與數據機通訊的 IP 位址 / 連接埠"
+
+msgid "Defined modems"
+msgstr "已定義的數據機"
+
+msgid "Interface to define the available modems. The list of modems will make it easier for the user to switch between modems in LuCI."
+msgstr "定義可用數據機的介面。數據機清單將使使用者更容易在 LuCI 中切換數據機。"
+
+msgid "Settings"
+msgstr "設定"
+
+msgid "Add new modem settings..."
+msgstr "新增數據機設定..."
+
+msgid "Modem Settings"
+msgstr "數據機設定"
+
+msgid "Manufacturer / Product"
+msgstr "製造商 / 產品"
+
+msgid "Please select a modem"
+msgstr "請選擇數據機"
+
+msgid "IP adress / Port for communication"
+msgstr "通訊的 IP 位址 / 連接埠"
+
+msgid "Protocol"
+msgstr "通訊協定"
+
+msgid "Port for communication"
+msgstr "通訊連接埠"
+
+msgid "Please select a QMI/MBIM port"
+msgstr "請選擇 QMI/MBIM 連接埠"
+
+msgid "Modem id"
+msgstr "數據機 ID"
+
+msgid "Please select a modem id"
+msgstr "請選擇數據機 ID"
+
+msgid "MBIM device"
+msgstr "MBIM 裝置"
+
+msgid "Select if you want to read from MBIM."
+msgstr "若要從 MBIM 讀取,請選擇此項。"
+
+msgid "Assigned interface"
+msgstr "指派的介面"
+
+msgid "Interface assigned to modem."
+msgstr "指派給數據機的介面。"
+
+msgid "Enter IP adress"
+msgstr "輸入 IP 位址"
+
+msgid "IP adress"
+msgstr "IP 位址"
+
+msgid "Reading data via"
+msgstr "透過以下方式讀取資料"
+
+msgid "Port / IP / Modem identifier"
+msgstr "連接埠 / IP / 數據機識別碼"
+
+msgid ""
+"Enter modem name manually if the suggested name is not "
+"obvious.
Important The modem name is only searched for modems connected via USB."
+msgstr ""
+"如果建議的名稱不明確,請手動輸入數據機名稱。"
+"
重要 僅搜尋透過 USB 連接的數據機名稱。"
+
+msgid ""
+"Select method for reading data from the modem.
serial port: Select one of the available "
+"ttyUSBX / ttyACMx / wwan0atX / mhi_DUN ports.
ecm: Enter the IP address 192.168.X.X under which the modem (Huawei) "
+"is available.
uqmi: Select one of the available cdc-wdmX ports.
ModemManager: Select "
+"one of the searched modem identifiers."
+msgstr ""
+"選擇從數據機讀取資料的方法。
ModemManager: 選擇"
+"一個搜尋到的數據機識別碼。"
+
+msgid "Please select a port"
+msgstr "請選擇連接埠"
+
+msgid "User description"
+msgstr "使用者描述"
+
+msgid "Optional"
+msgstr "選用"
+
+msgid "User description (optional)"
+msgstr "使用者描述(選用)"
+
+msgid "Excellent"
+msgstr "優良"
+
+msgid "Good"
+msgstr "良好"
+
+msgid "Fair"
+msgstr "普通"
+
+msgid "Poor"
+msgstr "較差"
+
+msgid "Physical cell ID"
+msgstr "實體小區 ID"
+
+msgid "Bandwidth"
+msgstr "頻寬"
+
+msgid "SIM status"
+msgstr "SIM 卡狀態"
+
+msgid "Not registered"
+msgstr "未登錄"
+
+msgid "Registered, home"
+msgstr "已登錄,本地網路"
+
+msgid "Registered (roaming)"
+msgstr "已登錄(漫遊)"
+
+msgid "Registered, only SMS"
+msgstr "已登錄,僅簡訊"
+
+msgid "Registered (roaming), only SMS"
+msgstr "已登錄(漫遊),僅簡訊"
+
+msgid "Searching.."
+msgstr "搜尋中.."
+
+msgid "Connection state"
+msgstr "連線狀態"
+
+msgid "Connected"
+msgstr "已連線"
+
+msgid "Disconnected"
+msgstr "已中斷"
+
+msgid "Registering denied"
+msgstr "登錄被拒絕"
+
+msgid "Waiting to read data from the modem..."
+msgstr "等待從數據機讀取資料..."
+
+msgid "Waiting for data..."
+msgstr "等待資料..."
+
+msgid "BTS Search"
+msgstr "基地台搜尋"
+
+msgid "BTS Information"
+msgstr "基地台資訊"
+
+msgid "Search"
+msgstr "搜尋"
+
+msgid "Bands"
+msgstr "頻段"
+
+msgid "Search BTS"
+msgstr "搜尋基地台"
+
+msgid "BTS search settings"
+msgstr "基地台搜尋設定"
+
+msgid "Website to search for BTS"
+msgstr "搜尋基地台的網站"
+
+msgid "Select a website for searching."
+msgstr "選擇用於搜尋的網站。"
+
+msgid "Install a package using package manager"
+msgstr "使用套件管理員安裝套件"
+
+msgid "Select an action after clicking the search button."
+msgstr "點擊搜尋按鈕後選擇操作。"
+
+msgid "Install iconv"
+msgstr "安裝 iconv"
+
+msgid "Install qmi-utils"
+msgstr "安裝 qmi-utils"
+
+msgid "SIM Slot"
+msgstr "SIM 卡槽"
+
+msgid "SIM Card"
+msgstr "SIM 卡"
+
+msgid "Slot in use"
+msgstr "使用中的卡槽"
+
+msgid "Problem with registering to the network, check the SIM card."
+msgstr "登錄網路時出現問題,請檢查 SIM 卡。"
+
+msgid "SIM PIN required"
+msgstr "需要 SIM 卡 PIN 碼"
+
+msgid "SIM PUK required"
+msgstr "需要 SIM 卡 PUK 碼"
+
+msgid "SIM failure"
+msgstr "SIM 卡故障"
+
+msgid "SIM busy"
+msgstr "SIM 卡忙碌"
+
+msgid "SIM wrong"
+msgstr "SIM 卡錯誤"
+
+msgid "SIM PIN2 required"
+msgstr "需要 SIM 卡 PIN2 碼"
+
+msgid "SIM PUK2 required"
+msgstr "需要 SIM 卡 PUK2 碼"
+
+msgid "Information read from the SIM card and device."
+msgstr "從 SIM 卡和裝置讀取的資訊。"
+
+msgid "No data"
+msgstr "無資料"
+
+msgid "Diagnostics"
+msgstr "診斷"
+
+msgid "Modem(s) configuration"
+msgstr "數據機設定"
+
+msgid "Package configuration"
+msgstr "套件設定"
+
+msgid "Run various commands to verify data read from the modem and debug scripts."
+msgstr "執行各種命令以驗證從數據機讀取的資料並偵錯指令碼。"
+
+msgid "USB debug information"
+msgstr "USB 除錯資訊"
+
+msgid "Check ttyX ports"
+msgstr "檢查 ttyX 連接埠"
+
+msgid "Check serial and ecm mode"
+msgstr "檢查序列埠和 ecm 模式"
+
+msgid "Check uqmi mode"
+msgstr "檢查 uqmi 模式"
+
+msgid "Check ModemManager mode"
+msgstr "檢查 ModemManager 模式"
+
+msgid "Clear"
+msgstr "清除"
+
+msgid "Download"
+msgstr "下載"
+
+msgid "Notes Update date"
+msgstr "備註 更新日期"
+
+msgid "Band"
+msgstr "頻段"
+
+msgid "Package update and support"
+msgstr "套件更新與支援"
+
+msgid "Failed to download index.json file from external repository."
+msgstr "無法從外部儲存庫下載 index.json 檔案。"
+
+msgid "Failed to read downloaded file."
+msgstr "無法讀取下載的檔案。"
+
+msgid "Installed package is up to date."
+msgstr "已安裝的套件是最新的。"
+
+msgid "Update is available."
+msgstr "有可用更新。"
+
+msgid "The index.json file did not contain any package information."
+msgstr "index.json 檔案不包含任何套件資訊。"
+
+msgid "Error parsing version."
+msgstr "解析版本時出錯。"
+
+msgid "Check repository"
+msgstr "檢查儲存庫"
+
+msgid "Package update..."
+msgstr "套件更新..."
+
+msgid "Report a bug"
+msgstr "回報錯誤"
+
+msgid "Write in the topic of the package on the forum eko.one.pl"
+msgstr "在 eko.one.pl 論壇的套件主題中發文"
+
+msgid "Write on forum"
+msgstr "在論壇上發文"
+
+msgid "Report a bug on the package Github page"
+msgstr "在套件的 Github 頁面上回報錯誤"
+
+msgid "Open a package discussion on Github"
+msgstr "在 Github 上開啟套件討論"
+
+msgid "Open discussion"
+msgstr "開啟討論"
+
+msgid "Buy a coffee if you want to support the development of the project and the author"
+msgstr "如果您想支持專案和作者的開發,請請我喝杯咖啡"
+
+msgid "Buy a coffee"
+msgstr "請喝咖啡"
+
+msgid "Become a sponsor if you want to support the development of the project and the author"
+msgstr "如果您想支持專案和作者的開發,請成為贊助者"
+
+msgid "Become a sponsor"
+msgstr "成為贊助者"
+
+msgid "Download package information from an external repository"
+msgstr "從外部儲存庫下載套件資訊"
+
+msgid "Add repository and download package update"
+msgstr "新增儲存庫並下載套件更新"
+
+msgid "Package Info"
+msgstr "套件資訊"
+
+msgid "Compiled"
+msgstr "編譯時間"
+
+msgid "Repository Info"
+msgstr "儲存庫資訊"
+
+msgid "Currently installed"
+msgstr "目前已安裝"
+
+msgid "Package in repository"
+msgstr "儲存庫中的套件"
+
+msgid "Last repository check"
+msgstr "上次檢查儲存庫"
+
+msgid "Poland"
+msgstr "波蘭"
+
+msgid "Force read by"
+msgstr "強制讀取方式"
+
+msgid "Select method for reading data from the modem."
+msgstr "選擇從數據機讀取資料的方法。"
+
+msgid "inactive"
+msgstr "未啟用"
+
+msgid "ModemMenager"
+msgstr "數據機管理員"
+
+msgid "Force PLMN"
+msgstr "強制 PLMN"
+
+msgid "Force reading PLMN from file."
+msgstr "強制從檔案讀取 PLMN。"
+
+msgid "Command result"
+msgstr "命令結果"
+
+msgid "Check"
+msgstr "檢查"
+
+msgid "Auto update every:"
+msgstr "自動更新間隔:"
+
+msgid "2 seconds"
+msgstr "2 秒"
+
+msgid "3 seconds"
+msgstr "3 秒"
+
+msgid "5 seconds"
+msgstr "5 秒"
+
+msgid "10 seconds"
+msgstr "10 秒"
+
+msgid "30 seconds"
+msgstr "30 秒"
+
+msgid "45 seconds"
+msgstr "45 秒"
+
+msgid "60 seconds"
+msgstr "60 秒"
+
+msgid "Refresh rate"
+msgstr "重新整理頻率"
+
+msgid "Set how often the data should be refreshed in the Modem(s) tab."
+msgstr "設定數據機索引標籤中資料重新整理的頻率。"
+
+msgid ""
+"Set how often the data should be refreshed in the Modem(s) tab.
Important Not "
+"every modem / protocol can communicate quickly with scripts. "
+"Too high a polling rate can freeze the modem. ModemManager and uqmi need more time to respond."
+msgstr ""
+"設定數據機索引標籤中資料重新整理的頻率。
重要 並非"
+"每個數據機 / 通訊協定都能與指令碼快速通訊。"
+"輪詢頻率過高可能會導致數據機凍結。 ModemManager 和 uqmi 需要更多時間回應。"
+
+msgid "Updating again in %s second(s)."
+msgstr "%s 秒後再次更新。"
+
+msgid "Please wait... data collection is in progress."
+msgstr "請稍候... 正在收集資料。"
+
+msgid "Modems found"
+msgstr "找到的數據機"
+
+msgid "List of found modems. Not all modems may be shown."
+msgstr "找到的數據機清單。可能不會顯示所有數據機。"
+
+msgid "Show modems found"
+msgstr "顯示找到的數據機"
+
+msgid "Show"
+msgstr "顯示"
+
+msgid "Currently, only modems connected via USB are searched for."
+msgstr "目前僅搜尋透過 USB 連接的數據機。"
+
+msgid "No Modems Detected..."
+msgstr "未偵測到數據機..."
+
+msgid "Oops.. there are no modems in settings. You will be redirected to a tab where you can define the installed modem(s)."
+msgstr "哎呀……設定中沒有數據機。您將被重新導向到可以定義已安裝數據機的索引標籤。"
+
+msgid "Redirecting..."
+msgstr "重新導向中..."
+
+msgid "Redirecting in"
+msgstr "重新導向倒數"
+
+msgid "seconds..."
+msgstr "秒..."
+
+msgid "(no data)"
+msgstr "(無資料)"
+
+msgid "Enter a valid IP address in the format 192.168.X.X"
+msgstr "以 192.168.X.X 格式輸入有效的 IP 位址"
+
+msgid "Only numbers and dots are allowed"
+msgstr "只允許數字和點"
+
+msgid "Each part must be a number from 0 to 255"
+msgstr "每部分必須是 0 到 255 之間的數字"
+
+msgid "In the future tab will allow you to update the package from %sRafał (IceG) external repository%s."
+msgstr "將來此索引標籤將允許您從 %sRafał (IceG) 外部儲存庫%s 更新套件。"
+
+msgid "Option will appear after apk implementation."
+msgstr "選項將在 apk 實作後出現。"
+
+msgid "Author (package maintainer)"
+msgstr "作者(套件維護者)"
+
+msgid "Modemdata Info"
+msgstr "Modemdata 資訊"
+
+msgid "Luci-app-modemdata Info"
+msgstr "Luci-app-modemdata 資訊"
+
+msgid "Go to the Diagnostics tab and run a script check. Most often, the error is caused by a strange operator name. To fix this, select the Force PLMN from file option if it is available in the modem configuration options."
+msgstr "前往診斷索引標籤並執行指令碼檢查。通常,錯誤是由奇怪的電信業者名稱引起的。要解決此問題,請在數據機設定選項中選擇從檔案強制 PLMN 選項(如果可用)。"
+
+msgid "If data in LuCI is not visible, and we are 100% sure that the modem has been defined/configured correctly."
+msgstr "如果 LuCI 中的資料不可見,而我們百分之百確定數據機已正確定義/設定。"
+
+msgid "Suggested solution"
+msgstr "建議的解決方案"
+
+msgid "Troubleshooting"
+msgstr "疑難排解"
+
+msgid "Please select method for reading data from the modem and install the necessary packages."
+msgstr "請選擇從數據機讀取資料的方法並安裝必要的套件。"
+
+msgid "Required packages"
+msgstr "所需套件"
+
+msgid "Check required packages"
+msgstr "檢查所需套件"
+
+msgid "Before configuring the modem, check if all required packages are installed in the system."
+msgstr "在設定數據機之前,請檢查系統中是否安裝了所有必要的套件。"
+
+msgid "Loading package data…"
+msgstr "載入套件資料..."
+
+msgid "Waiting..."
+msgstr "等待中..."
+
+msgid "Show signal levels"
+msgstr "顯示訊號電平"
+
+msgid "Primary band signal levels"
+msgstr "主頻段訊號電平"
+
+msgid "Device is busy"
+msgstr "裝置忙碌"
+
+msgid "Primary band"
+msgstr "主頻段"
+
+msgid "Available options"
+msgstr "可用選項"
+
+msgid "Device not found"
+msgstr "找不到裝置"
+
+msgid "Click to view Cell ID details"
+msgstr "點擊以查看小區 ID 詳細資訊"
+
+msgid "Cell ID (dec)"
+msgstr "小區 ID(十進位)"
+
+msgid "Cell ID (hex)"
+msgstr "小區 ID(十六進位)"
+
+msgid "eNB ID (hex)"
+msgstr "eNB ID(十六進位)"
+
+msgid "Sector ID (hex)"
+msgstr "扇區 ID(十六進位)"
+
+msgid "eNB ID (dec)"
+msgstr "eNB ID(十進位)"
+
+msgid "Sector ID (dec)"
+msgstr "扇區 ID(十進位)"
+
+msgid "Cell ID (hex) for CellMapper"
+msgstr "CellMapper 的小區 ID(十六進位)"
+
+msgid "Cell ID (dec) for CellMapper"
+msgstr "CellMapper 的小區 ID(十進位)"
+
+msgid "Cell ID Information"
+msgstr "小區 ID 資訊"
+
+msgid "Modem"
+msgstr "數據機"
+
+msgid "Detailed Cell ID information with formats for different tools and applications."
+msgstr "詳細的小區 ID 資訊,包含不同工具和應用程式的格式。"
+
+msgid "Information about package authors and available support options."
+msgstr "有關套件作者和可用支援選項的資訊。"
+
+msgid "Package name"
+msgstr "套件名稱"
+
+msgid "Proper Modem Configuration."
+msgstr "正確的數據機設定。"
+
+msgid "User should remember:"
+msgstr "使用者應記住:"
+
+msgid "1. For a specific modem, only one protocol should be set for communication with modem."
+msgstr "1. 對於特定的數據機,只應設定一個與數據機通訊的通訊協定。"
+
+msgid "2. Only one package can read data from modem (at the same time)."
+msgstr "2. 同時只能有一個套件從數據機讀取資料。"
+
+msgid "3. Reading data from modem too often may cause it to freeze (MM and uqmi need more time)."
+msgstr "3. 過於頻繁地從數據機讀取資料可能會導致其凍結(MM 和 uqmi 需要更多時間)。"
+
+msgid "Troubleshooting / Hints"
+msgstr "疑難排解 / 提示"
+
+msgid "Problem"
+msgstr "問題"
+
+msgid "Common problems that may arise when using the package, and ways to solve them."
+msgstr "使用套件時可能出現的常見問題及其解決方法。"
+
+msgid "Package does not show data for the Fibocom FM350-GL modem."
+msgstr "套件不顯示 Fibocom FM350-GL 數據機的資料。"
+
+msgid "The modem is very sensitive to data read by the communication port. Selecting the wrong communication port may cause the modem to freeze or restart."
+msgstr "數據機對通訊連接埠讀取的資料非常敏感。選擇錯誤的通訊連接埠可能會導致數據機凍結或重新啟動。"
+
+msgid "and"
+msgstr "和"
+
+msgid "packages are recommended for proper modem support."
+msgstr "套件推薦用於正確支援數據機。"
+
+msgid "Modemdata"
+msgstr "Modemdata"
+
+msgid "Luci-app-modemdata"
+msgstr "Luci-app-modemdata"
+
+msgid "Info"
+msgstr "資訊"
+
+msgid "Action"
+msgstr "操作"
+
+msgid "Run"
+msgstr "執行"
+
+msgid "Close"
+msgstr "關閉"
+
+msgid "Dismiss"
+msgstr "關閉"
+
+msgid "Unable to clear the file"
+msgstr "無法清除檔案"
+
+msgid "Unable to read the contents"
+msgstr "無法讀取內容"
+
+msgid "Unable to save the contents"
+msgstr "無法儲存內容"
+
+msgid "Error: "
+msgstr "錯誤:"
+
+msgid "Download error"
+msgstr "下載錯誤"
+
+msgid "Failed to load package data."
+msgstr "無法載入套件資料。"
+
+msgid "Failed to download bts data file from site."
+msgstr "無法從網站下載基地台資料檔案。"
+
+msgid "Failed to process the downloaded file with btsearch.sh."
+msgstr "無法使用 btsearch.sh 處理下載的檔案。"
+
+msgid "Error loading Cell ID data: "
+msgstr "載入小區 ID 資料時出錯:"
+
+msgid "Loading"
+msgstr "載入中"
+
+msgid "Refreshing"
+msgstr "重新整理中"
+
+msgid "Disabled"
+msgstr "已停用"
+
+msgid "Disabled."
+msgstr "已停用。"
+
+msgid "Install"
+msgstr "安裝"
+
+msgid "Install…"
+msgstr "前往安裝..."
+
+msgid "Installed"
+msgstr "已安裝"
+
+msgid "serial"
+msgstr "序列埠"
+
+msgid "ecm"
+msgstr "ecm"
+
+msgid "uqmi"
+msgstr "uqmi"
+
+msgid "modemmanager"
+msgstr "數據機管理員"
+
+msgid "modem "
+msgstr "调制解调器 "
+
+msgid "Name"
+msgstr "名稱"
+
+msgid "Time"
+msgstr "時間"
+
+msgid "Signal"
+msgstr "訊號"
+
+msgid "(Signal Strength)"
+msgstr "(訊號強度)"
+
+msgid "Received"
+msgstr "已接收"
+
+msgid "Country"
+msgstr "國家"
+
+msgid "ICCID"
+msgstr "ICCID"
+
+msgid "IMSI"
+msgstr "IMSI"
+
+msgid "Modem IMEI"
+msgstr "调制解调器 IMEI"
+
+msgid "Cell ID"
+msgstr "小区 ID"
+
+msgid "CID"
+msgstr "CID"
+
+msgid "LAC"
+msgstr "LAC"
+
+msgid "LAC/TAC"
+msgstr "LAC/TAC"
+
+msgid "TAC"
+msgstr "TAC"
+
+msgid "RSSI"
+msgstr "RSSI"
+
+msgid "RSCP"
+msgstr "RSCP"
+
+msgid "RSRP"
+msgstr "RSRP"
+
+msgid "RSRQ"
+msgstr "RSRQ"
+
+msgid "SINR"
+msgstr "SINR"
+
+msgid "SNR"
+msgstr "SNR"
+
+msgid "EC/IO"
+msgstr "EC/IO"
+
+msgid "EARFCN"
+msgstr "EARFCN"
+
+msgid "UARFCN"
+msgstr "UARFCN"
+
+msgid "RNC/eNBI"
+msgstr "RNC/eNBI"
+
+msgid "UC-Id/ECID"
+msgstr "UC-Id/ECID"
+
+msgid "Duplex"
+msgstr "雙工"
+
+msgid "StationID"
+msgstr "站點 ID"
+
+msgid "Cd."
+msgstr "編號"
+
+msgid "Mobile Country Code"
+msgstr "行動國家代碼"
+
+msgid "Mobile Network Code"
+msgstr "行動網路代碼"
+
+msgid "btsearch.pl"
+msgstr "btsearch.pl"
+
+msgid "lteitaly.it"
+msgstr "lteitaly.it"
+
+msgid "☰"
+msgstr "☰"
+
+msgid "-"
+msgstr "-"
+
+msgid "Signal to Interference+Noise / Signal to Noise"
+msgstr "訊號與干擾+雜訊比 / 訊噪比"
+
+msgid "Received Signal Strength Indicator"
+msgstr "接收訊號強度指示"
+
+msgid "Reference Signal Received Power"
+msgstr "參考訊號接收功率"
+
+msgid "Reference Signal Received Quality"
+msgstr "參考訊號接收品質"
+
+msgid "Received Signal Code Power"
+msgstr "接收訊號碼功率"
+
+msgid "Energy per Chip / Interference"
+msgstr "每碼片能量 / 干擾比"
+
+msgid "Modemdata Status"
+msgstr "數據機資料狀態"
+
+msgid "(Received Signal Strength Indicator)"
+msgstr "(接收訊號強度指示)"
+
+msgid "(Reference Signal Received Power)"
+msgstr "(參考訊號接收功率)"
+
+msgid "(Reference Signal Received Quality)"
+msgstr "(參考訊號接收品質)"
+
+msgid "(Signal to Interference+Noise / Signal to Noise)"
+msgstr "(訊號與干擾+雜訊比 / 訊噪比)"
+
+msgid "(Received Signal Code Power)"
+msgstr "(接收訊號碼功率)"
+
+msgid "(Energy per Chip / Interference)"
+msgstr "(每碼片能量 / 干擾比)"
+
+msgid "BTS search: no response from server."
+msgstr "BTS搜尋:伺服器無回應。"
+
+msgid "BTS search: no results found."
+msgstr "BTS搜尋:找不到結果。"
+
+msgid "this month"
+msgstr "本月"
+
+msgid "month ago"
+msgstr "1個月前"
+
+msgid "months ago"
+msgstr "幾個月前"
+
+msgid "Station ID"
+msgstr "基站ID"
+
+msgid "Confirmed"
+msgstr "已確認"
+
+msgid "Updated"
+msgstr "已更新"
+
+msgid "Show on map"
+msgstr "在地圖上顯示"
+
+msgid "Download data"
+msgstr "下載資料"
+
+msgid "Install curl"
+msgstr "安裝curl"
+
+msgid "Note: The package is fully compatible with the latest, third-generation version of the BTSearch website."
+msgstr "注意:此套件與最新的第三代 BTSearch 網站完全相容。"
+
+msgid "Skip package verification"
+msgstr "跳過套件驗證"
+
+msgid "Enable this option to skip checking for installed packages and allow selecting any method from the list below."
+msgstr "啟用此選項可跳過已安裝套件的檢查,並允許從下方清單中選擇任意方式。"
diff --git a/modemdata/luci-app-modemdata/root/etc/config/defmodems b/modemdata/luci-app-modemdata/root/etc/config/defmodems
new file mode 100644
index 000000000..cc909ad71
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/etc/config/defmodems
@@ -0,0 +1,3 @@
+
+config general
+ option main_modem ''
diff --git a/modemdata/luci-app-modemdata/root/etc/config/modemdata b/modemdata/luci-app-modemdata/root/etc/config/modemdata
new file mode 100644
index 000000000..385a27941
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/etc/config/modemdata
@@ -0,0 +1,11 @@
+
+config modemdata
+ option website 'www.btsearch.pl'
+ option btsaction 'download'
+ option repocheckinfo ''
+ option updtime '5'
+ list hide_data 'IMSI'
+ list hide_data 'IMEI'
+ list hide_data 'ICCID'
+ list hide_data 'Cell ID'
+ list hide_data 'Identyfikator komórki'
diff --git a/modemdata/luci-app-modemdata/root/etc/modem/modemlist.json b/modemdata/luci-app-modemdata/root/etc/modem/modemlist.json
new file mode 100644
index 000000000..e69de29bb
diff --git a/modemdata/luci-app-modemdata/root/etc/uci-defaults/setup_modemdata.sh b/modemdata/luci-app-modemdata/root/etc/uci-defaults/setup_modemdata.sh
new file mode 100644
index 000000000..71ac1cb5e
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/etc/uci-defaults/setup_modemdata.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# (c) 2025-2026 Rafał Wabik - IceG - From eko.one.pl forum
+#
+
+chmod 664 /www/luci-static/resources/icons/ctime_new.svg
+chmod 664 /www/luci-static/resources/icons/mybts.svg
+chmod 664 /www/luci-static/resources/icons/sim_new.svg
+chmod 664 /www/luci-static/resources/icons/termometr.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-000-000.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-000-020.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-020-040.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-040-060.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-060-080.svg
+chmod 664 /www/luci-static/resources/icons/mobile-signal-080-100.svg
+
+chmod +x /usr/bin/md_modemmanager 2>&1 &
+chmod +x /usr/bin/md_serial_ecm 2>&1 &
+chmod +x /usr/bin/md_uqmi 2>&1 &
+
+rm -rf /tmp/luci-indexcache 2>&1 &
+rm -rf /tmp/luci-modulecache/ 2>&1 &
+
+exit 0
+
diff --git a/modemdata/luci-app-modemdata/root/usr/bin/md_modemmanager b/modemdata/luci-app-modemdata/root/usr/bin/md_modemmanager
new file mode 100644
index 000000000..0d7626aae
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/usr/bin/md_modemmanager
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+#
+# (c) 2025 Cezary Jackiewicz
+#
+# (c) 2025-2026 modified by Rafał Wabik - IceG - From eko.one.pl forum
+#
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+ECM=""
+
+RES="/usr/share/modemdata"
+
+device=$1
+network=$2
+forced_plmn=$3
+
+try_params_mm() {
+ local retries=5
+ local delay=1
+ local i
+ local result
+
+ for i in $(seq 1 $retries); do
+ result=$($RES/params_modemmanager.sh "$device" "$forced_plmn")
+ if [ -n "$result" ]; then
+ echo "$result"
+ return 0
+ fi
+ sleep "$delay"
+ done
+ echo "{}"
+}
+
+SEPARATOR=""
+parse_section() {
+ echo "["
+ $RES/product_modemmanager.sh "$device"
+ echo ","
+ $RES/network.sh "$network"
+ echo ","
+ try_params_mm
+ echo "]"
+}
+
+config_load modemdata
+parse_section modemdata
+
+exit 0
diff --git a/modemdata/luci-app-modemdata/root/usr/bin/md_serial_ecm b/modemdata/luci-app-modemdata/root/usr/bin/md_serial_ecm
new file mode 100644
index 000000000..aabc4d7aa
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/usr/bin/md_serial_ecm
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+#
+# (c) 2025 Cezary Jackiewicz
+#
+# (c) 2025-2026 modified by Rafał Wabik - IceG - From eko.one.pl forum
+#
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+ECM=""
+
+RES="/usr/share/modemdata"
+
+device=$1
+network=$2
+forced_plmn=$3
+
+SEPARATOR=""
+parse_section() {
+
+ if echo "x$device" | grep -q "192.168."; then
+ ECM="$RES/addon/ecm/huawei.sh $device"
+ else
+ ECM=""
+ fi
+ echo "["
+ if [ -n "$ECM" ]; then
+ $ECM product
+ echo ","
+ $RES/network.sh "$network"
+ echo ","
+ $ECM params
+ else
+ $RES/product.sh "$device"
+ echo ","
+ $RES/network.sh "$network"
+ echo ","
+ $RES/params.sh "$device" "$forced_plmn"
+ fi
+ echo "]"
+}
+
+config_load modemdata
+parse_section modemdata
+
+exit 0
diff --git a/modemdata/luci-app-modemdata/root/usr/bin/md_uqmi b/modemdata/luci-app-modemdata/root/usr/bin/md_uqmi
new file mode 100644
index 000000000..f3a8c2da6
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/usr/bin/md_uqmi
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+#
+# (c) 2025 Cezary Jackiewicz
+#
+# (c) 2025-2026 modified by Rafał Wabik - IceG - From eko.one.pl forum
+#
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+RES="/usr/share/modemdata"
+
+device=$1
+network=$2
+forced_plmn=$3
+mbim=$4
+
+try_params_uqmi() {
+ local retries=5
+ local delay=1
+ local i
+ local result
+
+ for i in $(seq 1 $retries); do
+ result=$($RES/params_qmi.sh "$device" "$forced_plmn" "$mbim")
+ if [ -n "$result" ]; then
+ echo "$result"
+ return 0
+ fi
+ sleep "$delay"
+ done
+ echo "{}"
+}
+
+SEPARATOR=""
+parse_section() {
+ echo "["
+ $RES/product.sh "$device"
+ echo ","
+ $RES/network.sh "$network"
+ echo ","
+ try_params_uqmi
+ echo "]"
+}
+
+config_load modemdata
+parse_section modemdata
+
+exit 0
diff --git a/modemdata/luci-app-modemdata/root/usr/share/luci/menu.d/luci-app-modemdata.json b/modemdata/luci-app-modemdata/root/usr/share/luci/menu.d/luci-app-modemdata.json
new file mode 100644
index 000000000..d20ff0f05
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/usr/share/luci/menu.d/luci-app-modemdata.json
@@ -0,0 +1,68 @@
+{
+ "admin/modem": {
+ "title": "Modem",
+ "order": 30,
+ "action": {
+ "type": "firstchild",
+ "recurse": true
+ }
+ },
+
+ "admin/modem/modemdata": {
+ "title": "Modemdata Status",
+ "order": 10,
+ "action": {
+ "type": "alias",
+ "path": "admin/modem/modemdata/modempreview"
+ },
+ "depends": {
+ "acl": [ "luci-app-modemdata" ],
+ "uci": { "modemdata": true }
+ }
+ },
+
+ "admin/modem/modemdata/modempreview": {
+ "title": "Modem(s)",
+ "order": 10,
+ "action": {
+ "type": "view",
+ "path": "modem/modempreview"
+ }
+ },
+
+ "admin/modem/modemdata/modemdiagnostics": {
+ "title": "Diagnostics",
+ "order": 20,
+ "action": {
+ "type": "view",
+ "path": "modem/modemdiagnostics"
+ }
+ },
+
+ "admin/modem/modemdata/modemdefine": {
+ "title": "Modem(s) configuration",
+ "order": 30,
+ "action": {
+ "type": "view",
+ "path": "modem/modemdefine"
+ }
+ },
+
+ "admin/modem/modemdata/modemconfig": {
+ "title": "Package configuration",
+ "order": 40,
+ "action": {
+ "type": "view",
+ "path": "modem/modemconfig"
+ }
+ },
+
+ "admin/modem/modemdata/modemupdate": {
+ "title": "Package update and support",
+ "order": 50,
+ "action": {
+ "type": "view",
+ "path": "modem/modemupdate"
+ }
+ }
+}
diff --git a/modemdata/luci-app-modemdata/root/usr/share/rpcd/acl.d/luci-app-modemdata.json b/modemdata/luci-app-modemdata/root/usr/share/rpcd/acl.d/luci-app-modemdata.json
new file mode 100644
index 000000000..2546ee6e2
--- /dev/null
+++ b/modemdata/luci-app-modemdata/root/usr/share/rpcd/acl.d/luci-app-modemdata.json
@@ -0,0 +1,54 @@
+{
+ "luci-app-modemdata": {
+ "description": "Grant access to LuCI JS app modemdata",
+ "read": {
+ "cgi-io": [ "exec" ],
+ "file": {
+ "/usr/share/modemdata/network.sh": [ "exec" ],
+ "/usr/share/modemdata/params.sh": [ "exec" ],
+ "/usr/share/modemdata/params_modemmanager.sh": [ "exec" ],
+ "/usr/share/modemdata/params_qmi.sh": [ "exec" ],
+ "/usr/share/modemdata/product.sh": [ "exec" ],
+ "/usr/share/modemdata/product_modemmanager.sh": [ "exec" ],
+ "/usr/share/modemdata/addon/ecm/huawei.sh": [ "exec" ],
+ "/usr/bin/mmcli": [ "exec" ],
+ "/bin/sh": [ "exec" ],
+ "/usr/bin/md_serial_ecm": [ "exec" ],
+ "/usr/bin/md_modemmanager": [ "exec" ],
+ "/usr/bin/md_uqmi": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/network.sh": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/params.sh": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/params_modemmanager.sh": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/product.sh": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/product_modemmanager.sh": [ "exec" ],
+ "/bin/sh -x /usr/share/modemdata/addon/ecm/huawei.sh": [ "exec" ],
+ "/tmp/debug_result.txt": [ "read" ],
+ "/etc/modemdata": [ "read" ],
+ "/sys/kernel/debug/usb/devices": [ "read" ],
+ "/dev": [ "list" ],
+ "/etc/defmodems": [ "read" ],
+ "/etc/modem/modemlist.json": [ "read" ],
+ "/bin/uclient-fetch": [ "exec" ],
+ "/usr/libexec/package-manager-call list-installed": [ "exec" ],
+ "/usr/libexec/opkg-list installed": [ "exec" ],
+ "/usr/libexec/opkg-call list-installed": [ "exec" ],
+ "/etc/opkg.conf": [ "read" ]
+ },
+ "uci": [ "modemdata" , "defmodems" ]
+ },
+ "write": {
+ "file": {
+ "/bin/cat": [ "exec" ],
+ "/bin/sh": [ "exec" ],
+ "/bin/uclient-fetch": [ "exec" ],
+ "/bin/ls /dev": [ "exec" ],
+ "/bin/sh /usr/bin/md_serial_ecm": [ "exec" ],
+ "/etc/defmodems": [ "write" ],
+ "/tmp/debug_result.txt": [ "write" ],
+ "/etc/modemdata": [ "write" ],
+ "/etc/modem/modemlist.json": [ "write" ]
+ },
+ "uci": [ "modemdata" , "defmodems" ]
+ }
+ }
+}
diff --git a/sms-tool/Makefile b/sms-tool/Makefile
index faf391368..bbe1402db 100644
--- a/sms-tool/Makefile
+++ b/sms-tool/Makefile
@@ -1,24 +1,34 @@
+# 2017 - 2021 Cezary Jackiewicz
+# 2014 lovewilliam
+# SMS tool for 3G/4G/5G modems
+#
+
include $(TOPDIR)/rules.mk
PKG_NAME:=sms-tool
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_SOURCE_URL:=https://github.com/obsy/sms_tool
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_DATE:=2021-08-24
-PKG_SOURCE_VERSION:=57a68d07c3d38fd8766d2705fd2a2c1ae01ee004
+PKG_SOURCE_DATE:=2026-08-15
+PKG_SOURCE_VERSION:=866e7d72d2b7a788ded6c4e4772f4d5f5c55eac9
+PKG_MIRROR_HASH:=skip
+
+PKG_MAINTAINER:=Andrey Butirsky
+PKG_LICENSE:=Apache-2.0
+PKG_LICENSE_FILES:=LICENSE-2.0.txt
include $(INCLUDE_DIR)/package.mk
define Package/sms-tool
SECTION:=utils
CATEGORY:=Utilities
- TITLE:=sms tool
+ TITLE:=SMS tool for 3G/4G/5G modems
URL:=https://github.com/obsy/sms_tool
endef
define Package/sms-tool/description
- SMS Tool for 3G/4G modem
+ SMS tool for 3G/4G/5G modems
endef
define Package/sms-tool/install
diff --git a/sms-tool/patches/0001-Update-sms_main.c.patch b/sms-tool/patches/0001-Update-sms_main.c.patch
deleted file mode 100644
index 709359ea2..000000000
--- a/sms-tool/patches/0001-Update-sms_main.c.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From e59637cdf9d29e23639e7ca4530a4cc9d613ded0 Mon Sep 17 00:00:00 2001
-From: dwj0 <45187345+dwj0@users.noreply.github.com>
-Date: Thu, 14 Oct 2021 12:40:03 +0800
-Subject: [PATCH] Update sms_main.c
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-修正中文编码首字节大于0x80时显示错误
----
- sms_main.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sms_main.c b/sms_main.c
-index 2eb4f5d..f591f6a 100644
---- a/sms_main.c
-+++ b/sms_main.c
-@@ -155,7 +155,7 @@ static void print_json_escape_char(char c1, char c2)
- else if(c2 < ' ') printf("\\u00%02x", c2);
- else printf("%c", c2);
- } else {
-- printf("\\u%02x%02x", c1, c2);
-+ printf("\\u%02x%02x", (unsigned char)c1, (unsigned char)c2);
- }
- }
-
---
-2.25.1
-