From 8d097e3078421892c7950f2164e1db4489ce503b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Mar 2026 12:50:34 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9B=84=20Sync=202026-03-22=2012:50:34?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hickory-dns/Makefile | 10 +- luci-app-netdata/.img/config.png | Bin 33465 -> 0 bytes luci-app-netdata/.img/netdata.png | Bin 82894 -> 0 bytes luci-app-netdata/LICENSE | 674 ---------- luci-app-netdata/Makefile | 22 +- luci-app-netdata/README.md | 50 - .../resources/view/netdata/advanced.js | 35 - .../resources/view/netdata/basic.js | 183 +++ .../resources/view/netdata/config.js | 168 +-- .../resources/view/netdata/main.js | 26 - .../resources/view/netdata/netdata.js | 73 ++ luci-app-netdata/po/templates/netdata.pot | 93 -- luci-app-netdata/po/zh_Hans/netdata.po | 103 +- luci-app-netdata/po/zh_Hant/netdata.po | 104 -- .../root/etc/uci-defaults/luci-app-netdata | 28 + .../share/luci/menu.d/luci-app-netdata.json | 24 +- .../root/usr/share/netdata/webcn/netdata.conf | 33 + .../usr/share/netdata/webcn/netdata.config | 3 + .../root/usr/share/netdata/webcn/netdata.init | 105 ++ .../share/rpcd/acl.d/luci-app-netdata.json | 12 +- .../root/usr/share/rpcd/ucode/luci.netdata | 53 + .../model/cbi/passwall/client/acl_config.lua | 5 + .../model/cbi/passwall/client/global.lua | 3 +- .../model/cbi/passwall/client/type/ray.lua | 2 +- .../cbi/passwall/client/type/sing-box.lua | 2 +- .../luasrc/passwall/util_xray.lua | 2 +- .../root/usr/share/passwall/app.sh | 12 +- .../share/passwall/helper_chinadns_add.lua | 5 +- .../share/passwall/helper_smartdns_add.lua | 2 +- luci-app-ssr-plus/Makefile | 2 +- .../view/shadowsocksr/Sortable.min.js | 2 + .../luasrc/controller/shadowsocksr.lua | 335 ++++- .../model/cbi/shadowsocksr/advanced.lua | 68 +- .../model/cbi/shadowsocksr/client-config.lua | 262 ++-- .../luasrc/model/cbi/shadowsocksr/servers.lua | 159 ++- .../luasrc/view/shadowsocksr/server_list.htm | 952 ++++++++++---- .../luasrc/view/shadowsocksr/socket.htm | 3 + .../luasrc/view/shadowsocksr/ssrurl.htm | 67 +- luci-app-ssr-plus/po/templates/ssr-plus.pot | 1128 ++++++++-------- luci-app-ssr-plus/po/zh_Hans/ssr-plus.po | 1154 +++++++++-------- .../root/etc/init.d/shadowsocksr | 15 +- .../usr/share/shadowsocksr/gen_config.lua | 176 ++- .../root/usr/share/shadowsocksr/hy2_test.sh | 175 +++ .../share/shadowsocksr/shadowsocksr.config | 1 + .../root/usr/share/shadowsocksr/subscribe.lua | 226 +++- 45 files changed, 3598 insertions(+), 2959 deletions(-) delete mode 100644 luci-app-netdata/.img/config.png delete mode 100644 luci-app-netdata/.img/netdata.png delete mode 100644 luci-app-netdata/LICENSE delete mode 100644 luci-app-netdata/README.md delete mode 100644 luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js create mode 100644 luci-app-netdata/htdocs/luci-static/resources/view/netdata/basic.js delete mode 100644 luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js create mode 100644 luci-app-netdata/htdocs/luci-static/resources/view/netdata/netdata.js delete mode 100644 luci-app-netdata/po/templates/netdata.pot delete mode 100644 luci-app-netdata/po/zh_Hant/netdata.po create mode 100644 luci-app-netdata/root/etc/uci-defaults/luci-app-netdata create mode 100644 luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf create mode 100644 luci-app-netdata/root/usr/share/netdata/webcn/netdata.config create mode 100644 luci-app-netdata/root/usr/share/netdata/webcn/netdata.init create mode 100644 luci-app-netdata/root/usr/share/rpcd/ucode/luci.netdata create mode 100644 luci-app-ssr-plus/htdocs/luci-static/resources/view/shadowsocksr/Sortable.min.js create mode 100755 luci-app-ssr-plus/root/usr/share/shadowsocksr/hy2_test.sh diff --git a/hickory-dns/Makefile b/hickory-dns/Makefile index 61bfe9e4..0db82037 100644 --- a/hickory-dns/Makefile +++ b/hickory-dns/Makefile @@ -1,16 +1,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=hickory-dns -PKG_VERSION:=2026.03.13 -PKG_RELEASE:=3 +PKG_VERSION:=2026.03.22 +PKG_RELEASE:=4 -HICKORY_COMMIT:=b6c4944a1884c82716ab41690ce48a3b828618ba +HICKORY_COMMIT:=32a162faa247b6873ab86e6b1605f28154aa5e7a PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/hickory-dns/hickory-dns/tar.gz/b6c4944a1884c82716ab41690ce48a3b828618ba? +PKG_SOURCE_URL:=https://codeload.github.com/hickory-dns/hickory-dns/tar.gz/32a162faa247b6873ab86e6b1605f28154aa5e7a? PKG_HASH:=skip -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-b6c4944a1884c82716ab41690ce48a3b828618ba +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-32a162faa247b6873ab86e6b1605f28154aa5e7a PKG_BUILD_DEPENDS:=rust/host PKG_BUILD_PARALLEL:=1 diff --git a/luci-app-netdata/.img/config.png b/luci-app-netdata/.img/config.png deleted file mode 100644 index debe4d5c9370d7e0602ae1dc33c70df18c2fa030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33465 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 diff --git a/luci-app-netdata/.img/netdata.png b/luci-app-netdata/.img/netdata.png deleted file mode 100644 index 3a4be2f353b1f0e7044331dba58667326a02fa20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82894 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

SWV^lR&C{eK{>@_QljpX?1+NZ$QBX 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 diff --git a/luci-app-netdata/LICENSE b/luci-app-netdata/LICENSE deleted file mode 100644 index f288702d..00000000 --- a/luci-app-netdata/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-netdata/Makefile b/luci-app-netdata/Makefile index e069c485..936f4a1f 100644 --- a/luci-app-netdata/Makefile +++ b/luci-app-netdata/Makefile @@ -1,28 +1,18 @@ # SPDX-License-Identifier: GPL-3.0 # -# Copyright (C) 2022-2025 muink +# Copyright (C) 2021-2025 sirpdboy https://github.com/sirpdboy/luci-app-netdata include $(TOPDIR)/rules.mk -LUCI_NAME:=luci-app-netdata -LUCI_TITLE:=LuCI Netdata -LUCI_DEPENDS:=+netdata-ssl +openssl-util +LUCI_TITLE:=LuCI app for netdata +LUCI_DEPENDS:=+netdata -LUCI_DESCRIPTION:=Real-time performance monitoring - -PKG_MAINTAINER:=Anya Lin +PKG_NAME:=luci-app-netdata +PKG_VERSION:=2.0.4 +PKG_RELEASE:=2 PKG_LICENSE:=GPL-3.0 -define Package/$(LUCI_NAME)/conffiles -endef - -define Package/$(LUCI_NAME)/postinst -endef - -define Package/$(LUCI_NAME)/prerm -endef - include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-netdata/README.md b/luci-app-netdata/README.md deleted file mode 100644 index 8f6f5582..00000000 --- a/luci-app-netdata/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# LuCI Netdata -> [Netdata][] is high-fidelity infrastructure monitoring and troubleshooting. -Open-source, free, preconfigured, opinionated, and always real-time. - -### Screenshots - -![config](.img/config.png "config") -![netdata](.img/netdata.png "netdata") - -### How to install - -1. Goto ~~[releases](https://github.com/muink/luci-app-netdata/tree/releases)~~ [here](https://fantastic-packages.github.io/packages/) -2. Download the latest version of ipk -3. Login router and goto **System --> Software** -4. Upload and install ipk -5. Reboot if the app is not automatically added in page -6. Goto **Status --> Netdata** -7. If after program update. LuCI is not working properly, please reinstall luci-app-netdata. -8. After you upgrade Netdata, you need to reinstall netdata and luci-app-netdata. - -### Build - -- Compile from OpenWrt/LEDE SDK - -``` -# Take the x86_64 platform as an example -tar xjf openwrt-sdk-21.02.3-x86-64_gcc-8.4.0_musl.Linux-x86_64.tar.xz -# Go to the SDK root dir -cd OpenWrt-sdk-*-x86_64_* -# First run to generate a .config file -make menuconfig -./scripts/feeds update -a -./scripts/feeds install -a -# Get Makefile -git clone --depth 1 --branch master --single-branch --no-checkout https://github.com/muink/luci-app-netdata.git package/luci-app-netdata -pushd package/luci-app-netdata -umask 022 -git checkout -popd -# Select the package LuCI -> Applications -> luci-app-netdata -make menuconfig -# Start compiling -make package/luci-app-netdata/compile V=99 -``` - -[Netdata]: https://github.com/netdata/netdata - -### License - -- This project is licensed under the [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js deleted file mode 100644 index 500a231e..00000000 --- a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; -'require view'; -'require fs'; -'require ui'; - -const isReadonlyView = !L.hasViewPermission() || null; - -return view.extend({ -handleSaveApply: null, -handleReset: null, - - load() { - return L.resolveDefault(fs.read('/etc/netdata/netdata.conf'), ''); - }, - - handleSave(ev) { - let value = (document.querySelector('textarea').value || '').trim().replace(/\r\n/g, '\n') + '\n'; - - return fs.write('/etc/netdata/netdata.conf', value).then((rc) => { - document.querySelector('textarea').value = value; - ui.addNotification(null, E('p', _('Contents have been saved.')), 'info'); - - return fs.exec('/etc/init.d/netdata', [ 'reload' ]); - }).catch((e) => { - ui.addNotification(null, E('p', _('Unable to save contents: %s').format(e.message))); - }); - }, - - render(conf) { - return E([ - E('h4', _('Edit Netdata main config: /etc/netdata/netdata.conf')), - E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 25, 'disabled': isReadonlyView }, [ conf != null ? conf : '' ])) - ]); - } -}); diff --git a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/basic.js b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/basic.js new file mode 100644 index 00000000..f0b65728 --- /dev/null +++ b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/basic.js @@ -0,0 +1,183 @@ +// Copyright (C) 2021-2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-netdata +'use strict'; +'require form'; +'require poll'; +'require rpc'; +'require uci'; +'require ui'; +'require view'; +'require fs'; +const getNetdataVersion = rpc.declare({ + object: 'luci.netdata', + method: 'get_version', + expect: { 'version': '' } +}); +async function checkProcess() { + try { + const pidofRes = await fs.exec('/bin/pidof', ['netdata']); + if (pidofRes.code === 0) { + return { + running: true, + pid: pidofRes.stdout.trim() + }; + } + } catch (err) { + // Ignore error + } + try { + const psRes = await fs.exec('/bin/ps', ['-C', 'netdata', '-o', 'pid=']); + const pid = psRes.stdout.trim(); + return { + running: pid !== '', + pid: pid || null + }; + } catch (err) { + return { running: false, pid: null }; + } +} +function getVersionInfo() { + return L.resolveDefault(getNetdataVersion(), {}).then(function(result) { + return result || {}; + }).catch(function(error) { + console.error('Failed to get version:', error); + return {}; + }); +} + +function getServiceStatus() { + return L.resolveDefault(checkProcess(), {}).then(function(res) { + let isRunning = false; + try { + if (res && res.running) { + isRunning = true; + } + } catch (e) { + console.error('Service status error:', e); + } + return isRunning; + }).catch(function(error) { + console.error('Service status check failed:', error); + return false; + }); +} + +function renderStatus(isRunning, webport, protocol, version) { + let statusText = isRunning ? _('RUNNING') : _('NOT RUNNING'); + let color = isRunning ? 'green' : 'red'; + let icon = isRunning ? '✓' : '✗'; + let versionText = version ? `${version}` : ''; + let html = String.format( + '%s %s %s - %s', + color, icon, _('Netdata'),versionText, statusText + ); + + if (isRunning) { + let buttonUrl = String.format('%s//%s:%s/', protocol, window.location.hostname, webport); + + html += String.format( + '', + _('Open Web UI'), + buttonUrl + ); + } + + return html; +} +return view.extend({ + load: function() { + return Promise.all([ + uci.load('netdata') + ]); + }, + + render: function(data) { + let m, s, o; + let webport = uci.get_first('netdata', 'netdata', 'port') || '19999'; + let uci_ssl = uci.get_first('netdata', 'netdata', 'enable_ssl') || '0'; + let protocol = uci_ssl === '1' ? 'https:' : 'http:'; + + m = new form.Map('netdata', _('Netdata'), + _('An open-source real-time performance monitoring and visualization tool')); + + // 状态显示部分 + s = m.section(form.TypedSection); + s.anonymous = true; + s.addremove = false; + + s.render = function() { + poll.add(function() { + return Promise.all([ + getServiceStatus(), + getVersionInfo() + ]).then(function(results) { + var [isRunning, version] = results; + var view = document.getElementById('service_status'); + if (view) { + view.innerHTML = renderStatus(isRunning, webport, protocol, version); + } + }).catch(function(error) { + console.error('Poll error:', error); + }); + }, 5); // 添加轮询间隔5秒 + + return E('div', { class: 'cbi-section', id: 'status_bar' }, [ + E('div', { id: 'service_status' }, + E('p', {}, _('Collecting data...')) + ), + E('div', { 'style': 'text-align: right; font-style: italic;' }, [ + E('span', {}, [ + _('© github '), + E('a', { + 'href': 'https://github.com/sirpdboy', + 'target': '_blank', + 'style': 'text-decoration: none;' + }, 'by sirpdboy') + ]) + ]) + ]); + }; + + // 配置部分 + s = m.section(form.NamedSection, 'netdata', 'netdata'); + + o = s.option(form.Flag, 'enabled', _('Enable')); + o.default = o.disabled; + o.rmempty = false; + + o = s.option(form.Value, 'port', _('Service port')); + o.datatype = 'port'; + o.placeholder = '19999'; + o.rmempty = false; + o.validate = function(section_id, value) { + if (value < 1 || value > 65535) { + return _('Port must be between 1 and 65535'); + } + return true; + }; + + o = s.option(form.Flag, 'enable_ssl', _('Enable SSL')); + o.rmempty = true; + + o = s.option(form.DummyValue, 'cert_file', _('Cert file')); + o.default = '/etc/ssl/ezopwrt.crt'; + o.depends('enable_ssl', '1'); + o.cfgvalue = function(section_id) { + return uci.get('netdata', section_id, 'cert_file') || '/etc/ssl/ezopwrt.crt'; + }; + + o = s.option(form.DummyValue, 'key_file', _('Cert Key file')); + o.default = '/etc/ssl/ezopwrt.key'; + o.depends('enable_ssl', '1'); + o.cfgvalue = function(section_id) { + return uci.get('netdata', section_id, 'key_file') || '/etc/ssl/ezopwrt.key'; + }; + + // o = s.option(form.DummyValue, 'feedback_info', _('feedback info')); + // o.href = 'https://github.com/sirpdboy'; + // o.cfgvalue = function() { + // return 'https://github.com/sirpdboy'; + // }; + + return m.render(); + } +}); \ No newline at end of file diff --git a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js index 855620c5..aa4fcd1d 100644 --- a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js +++ b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js @@ -1,162 +1,36 @@ +// Copyright (C) 2021-2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-netdata 'use strict'; 'require view'; 'require fs'; -'require uci'; 'require ui'; -'require form'; + +const isReadonlyView = !L.hasViewPermission() || null; return view.extend({ -// handleSaveApply: null, -// handleSave: null, -// handleReset: null, +handleSaveApply: null, +handleReset: null, load() { - return Promise.all([ - L.resolveDefault(fs.stat('/usr/sbin/nginx'), {}), - uci.load('netdata') - ]); + return L.resolveDefault(fs.read('/etc/netdata/netdata.conf'), ''); }, - render(res) { - const has_nginx = res[0].path; + handleSave(ev) { + let value = (document.querySelector('textarea').value || '').trim().replace(/\r\n/g, '\n') + '\n'; - let m, s, o; + return fs.write('/etc/netdata/netdata.conf', value).then((rc) => { + document.querySelector('textarea').value = value; + ui.addNotification(null, E('p', _('Contents have been saved.')), 'info'); - m = new form.Map('netdata'); + return fs.exec('/etc/init.d/netdata', [ 'restart' ]); + }).catch((e) => { + ui.addNotification(null, E('p', _('Unable to save contents: %s').format(e.message))); + }); + }, - s = m.section(form.TypedSection, 'netdata'); - s.anonymous = true; - - o = s.option(form.Flag, 'enabled', _('Enable')); - o.rmempty = false; - - o = s.option(form.Value, 'port', _('Service port')); - o.datatype = 'port'; - o.placeholder = '19999'; - o.rmempty = false; - - o = s.option(form.Flag, 'enable_ssl', _('Enable SSL')); - o.rmempty = true; - o.depends('nginx_support', '0'); - - o = s.option(form.Value, 'cert_file', _('Cert file')); - o.placeholder = '/etc/netdata/cert.crt'; - o.rmempty = false; - o.retain = true; - o.depends('enable_ssl', '1'); - - o = s.option(form.Value, 'key_file', _('Cert Key file')); - o.placeholder = '/etc/netdata/cert.key'; - o.rmempty = false; - o.retain = true; - o.depends('enable_ssl', '1'); - - o = s.option(form.Flag, 'nginx_support', _('Nginx Support')); - o.rmempty = true; - if (! has_nginx) { - o.description = _('To enable this feature you need install luci-nginx and luci-ssl-nginx
first'); - o.readonly = true; - } - - o.write = function(section, value) { - uci.set('netdata', section, 'nginx_support', has_nginx ? value : null); - }; - - o = s.option(form.Flag, 'auth', _('Enable Auth')); - o.rmempty = true; - o.depends('nginx_support', '1'); - - o.write = function(section, value) { - uci.set('netdata', section, 'auth', has_nginx ? value : null); - }; - - o = s.option(form.Value, 'user_passwd', _('Login Username and Password hash')); - o.placeholder = 'admin:$apr1$t7qQjoqb$YBHtAb7VGSkjIdObMG.Oy0'; - o.rmempty = false; - o.retain = true; - o.depends('auth', '1'); - - o = s.option(form.Button, '_webui', _('Open Web UI')); - o.inputtitle = _('Open'); - o.inputstyle = 'apply'; - o.onclick = L.bind(function(ev, section_id) { - const port=uci.get('netdata', section_id, 'port') || '19999'; - const ssl=uci.get('netdata', section_id, 'enable_ssl') || '0'; - const nginx=uci.get('netdata', section_id, 'nginx_support') || '0'; - - window.open((nginx === '1' ? window.location.protocol : ssl === '1' ? 'https:' : 'http:') + '//' + window.location.hostname + (nginx === '1' ? '/netdata/' : ':' + port)); - }, o) - - o = s.option(form.Button, '_start', _('Start') + ' ' + _('Netdata')); - o.inputtitle = _('Start'); - o.inputstyle = 'apply'; - o.onclick = function() { - return fs.exec('/etc/init.d/netdata', ['start']) - .catch((e) => { ui.addNotification(null, E('p', e.message), 'error') }); - }; - - o = s.option(form.Button, '_stop', _('Stop') + ' ' + _('Netdata')); - o.inputtitle = _('Stop'); - o.inputstyle = 'reset'; - o.onclick = function() { - return fs.exec('/etc/init.d/netdata', ['stop']) - .catch((e) => { ui.addNotification(null, E('p', e.message), 'error') }); - }; - - s = m.section(form.TypedSection, '_utilities'); - s.render = L.bind(function(view, section_id) { - return E('div',{ 'class': 'cbi-section' }, [ - E('h3', {}, [ _('Password hash generator') ]), - E('div', { 'class': 'generator' }, [ - E('div', { 'class': 'control-group' }, [ - E('button', { - 'class': 'cbi-button cbi-button-neutral', - 'click': ui.createHandlerFn(this, () => { - let npwn = this.map.findElement('id', '_passwd_type'); - - if (npwn.type == 'password') { - npwn.setAttribute('type', 'text'); - } else if (npwn.type == 'text') { - npwn.setAttribute('type', 'password'); - } - }) - }, '*'), - E('input', { - 'id': '_passwd_type', - 'style': 'margin:5px 0', - 'class': 'cbi-input-password', - 'type': 'password', - 'value': 'type new passwd here' - }) - ]), - E('button', { - 'class': 'cbi-button cbi-button-action', - 'click': ui.createHandlerFn(this, () => { - let npw = this.map.findElement('id', '_passwd_type').value, - button = document.querySelector('.generator > .cbi-button'), - out = this.map.findElement('id', '_passwd_hash_out'); - - button.setAttribute('disabled', 'true'); - - return fs.exec('/usr/bin/openssl', [ 'passwd', '-apr1', npw ]).then((res) => { - out.value = res.stdout || ''; - }).catch(e => { - ui.addNotification(null, E('p', e.message), 'error'); - }).finally(() => { - button.removeAttribute('disabled'); - }); - }) - }, [ _('GenNew') ]), - E('input', { - 'id': '_passwd_hash_out', - 'style': 'margin:5px 0; width:320px', - 'type': 'text', - 'readonly': '' - }) - ]) - ]); - }, o, this); - - return m.render(); + render(conf) { + return E([ + E('h4', _('Edit Netdata main config: /etc/netdata/netdata.conf')), + E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 25, 'disabled': isReadonlyView }, [ conf != null ? conf : '' ])) + ]); } }); diff --git a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js deleted file mode 100644 index c931c6fb..00000000 --- a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; -'require view'; -'require uci'; - -return view.extend({ - handleSaveApply: null, - handleSave: null, - handleReset: null, - - load() { - return uci.load('netdata'); - }, - - render() { - var port = uci.get_first('netdata', 'netdata', 'port') || '19999', - ssl = uci.get_first('netdata', 'netdata', 'enable_ssl') || '0', - nginx = uci.get_first('netdata', 'netdata', 'nginx_support') || '0'; - if (port === '0') - return E('div', { class: 'alert-message warning' }, - _('Port 0 is not supported.
Change to a other port and try again.')); - return E('iframe', { - src: (nginx === '1' ? window.location.protocol : ssl === '1' ? 'https:' : 'http:') + '//' + window.location.hostname + (nginx === '1' ? '/netdata/' : ':' + port), - style: 'width: 100%; min-height: 100vh; border: none; border-radius: 3px;' - }); - } -}); diff --git a/luci-app-netdata/htdocs/luci-static/resources/view/netdata/netdata.js b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/netdata.js new file mode 100644 index 00000000..56a2e58a --- /dev/null +++ b/luci-app-netdata/htdocs/luci-static/resources/view/netdata/netdata.js @@ -0,0 +1,73 @@ +// Copyright (C) 2021-2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-netdata +'use strict'; +'require view'; +'require fs'; +'require ui'; +'require uci'; +'require form'; +'require poll'; + +return view.extend({ + + load: function() { + return uci.load('netdata'); + }, + + checkRunning: function() { + return fs.exec('/bin/pidof', ['netdata']).then(function(pidRes) { + if (pidRes.code === 0) return { isRunning: true }; + return fs.exec('/bin/ash', ['-c', 'ps | grep -q "[n]etdata"']).then(function(grepRes) { + return { isRunning: grepRes.code === 0 }; + }); + }); + }, + + render: function() { + var self = this; + return this.checkRunning().then(function(checkResult) { + var isRunning = checkResult.isRunning; + let webport = uci.get_first('netdata', 'netdata', 'port') || '19999'; + let uci_ssl = uci.get_first('netdata', 'netdata', 'enable_ssl') || '0'; + let nginx = uci.get_first('netdata', 'netdata', 'nginx_support') || '0'; + let protocol = nginx === '1' ? window.location.protocol : uci_ssl === '1' ? 'https:' : 'http:'; + let buttonUrl = String.format('%s//%s:%s/#menu_system', protocol, window.location.hostname, webport); + + var container = E('div'); + if (!isRunning) { + var message = _('Netdata Service Not Running'); + container.appendChild(E('div', { + style: 'text-align: center; padding: 2em;' + }, [ + E('img', { + src: 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMjQiIGhlaWdodD0iMTAyNCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZmlsbD0iI2RmMDAwMCIgZD0iTTk0Mi40MjEgMjM0LjYyNGw4MC44MTEtODAuODExLTE1My4wNDUtMTUzLjA0NS04MC44MTEgODAuODExYy03OS45NTctNTEuNjI3LTE3NS4xNDctODEuNTc5LTI3Ny4zNzYtODEuNTc5LTI4Mi43NTIgMC01MTIgMjI5LjI0OC01MTIgNTEyIDAgMTAyLjIyOSAyOS45NTIgMTk3LjQxOSA4MS41NzkgMjc3LjM3NmwtODAuODExIDgwLjgxMSAxNTMuMDQ1IDE1My4wNDUgODAuODExLTgwLjgxMWM3OS45NTcgNTEuNjI3IDE3NS4xNDcgODEuNTc5IDI3Ny4zNzYgODEuNTc5IDI4Mi43NTIgMCA1MTItMjI5LjI0OCA1MTItNTEyIDAtMTAyLjIyOS0yOS45NTItMTk3LjQxOS04MS41NzktMjc3LjM3NnpNMTk0Ljk0NCA1MTJjMC0xNzUuMTA0IDE0MS45NTItMzE3LjA1NiAzMTcuMDU2LTMxNy4wNTYgNDggMCA5My40ODMgMTAuNjY3IDEzNC4yMjkgMjkuNzgxbC00MjEuNTQ3IDQyMS41NDdjLTE5LjA3Mi00MC43ODktMjkuNzM5LTg2LjI3Mi0yOS43MzktMTM0LjI3MnpNNTEyIDgyOS4wNTZjLTQ4IDAtOTMuNDgzLTEwLjY2Ny0xMzQuMjI5LTI5Ljc4MWw0MjEuNTQ3LTQyMS41NDdjMTkuMDcyIDQwLjc4OSAyOS43ODEgODYuMjcyIDI5Ljc4MSAxMzQuMjI5LTAuMDQzIDE3NS4xNDctMTQxLjk5NSAzMTcuMDk5LTMxNy4wOTkgMzE3LjA5OXoiLz48L3N2Zz4=', + style: 'width: 100px; height: 100px; margin-bottom: 1em;' + }), + E('h2', {}, message) + ])); + } else { + var iframe = E('iframe', { + src: buttonUrl, + style: 'width: 100%; min-height: 100vh; border: none;' + }); + container.appendChild(iframe); + } + + poll.add(function() { + return self.checkRunning().then(function(checkResult) { + var newStatus = checkResult.isRunning; + if (newStatus !== isRunning) { + window.location.reload(); + } + }); + }, 5); + + poll.start(); + + return container; + }); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); \ No newline at end of file diff --git a/luci-app-netdata/po/templates/netdata.pot b/luci-app-netdata/po/templates/netdata.pot deleted file mode 100644 index 9bf7e623..00000000 --- a/luci-app-netdata/po/templates/netdata.pot +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:30 -msgid "Advanced" -msgstr "" - -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:22 -msgid "Config" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:21 -msgid "Contents have been saved." -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:31 -msgid "Edit Netdata main config: /etc/netdata/netdata.conf" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:30 -msgid "Enable" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:49 -msgid "Enable Auth" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:38 -msgid "Enable SSL" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:63 -msgid "Enable logger" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:134 -msgid "GenNew" -msgstr "" - -#: applications/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json:3 -msgid "Grant UCI access for netdata" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:57 -msgid "Login Username and Password hash" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:3 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:14 -msgid "Netdata" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:67 -msgid "Open" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:66 -msgid "Open Web UI" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:94 -msgid "Password hash generator" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js:19 -msgid "Port 0 is not supported.
Change to a other port and try again." -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:33 -msgid "Service port" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:76 -msgid "Start" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:84 -msgid "Stop" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:41 -msgid "" -"To enable this feature you need install luci-nginx and luci-ssl-" -"nginx
first" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:25 -msgid "Unable to save contents: %s" -msgstr "" diff --git a/luci-app-netdata/po/zh_Hans/netdata.po b/luci-app-netdata/po/zh_Hans/netdata.po index 315d4658..13c59159 100644 --- a/luci-app-netdata/po/zh_Hans/netdata.po +++ b/luci-app-netdata/po/zh_Hans/netdata.po @@ -1,104 +1,55 @@ msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2023-04-28 11:30+0000\n" -"Last-Translator: muink \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" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:30 -msgid "Advanced" -msgstr "高级" +msgid "Netdata" +msgstr "实时监控" -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:22 -msgid "Config" -msgstr "配置" +msgid "Basic Setting" +msgstr "基本设置" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:21 -msgid "Contents have been saved." -msgstr "" +msgid "Config Setting" +msgstr "配置文件" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:31 msgid "Edit Netdata main config: /etc/netdata/netdata.conf" msgstr "编辑 Netdata 主配置: /etc/netdata/netdata.conf" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:30 msgid "Enable" msgstr "启用" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:49 -msgid "Enable Auth" -msgstr "启用验证" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:38 + msgid "Enable SSL" -msgstr "启用 SSL" +msgstr "SSL启用https访问" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:63 msgid "Enable logger" msgstr "启用日志记录器" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:134 -msgid "GenNew" -msgstr "生成新的" +msgid "An open-source real-time performance monitoring and visualization tool" +msgstr "一款开源的实时性能监控与可视化工具" -#: applications/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json:3 -msgid "Grant UCI access for netdata" -msgstr "授予访问 LuCI 应用 netdata 的权限" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:57 -msgid "Login Username and Password hash" -msgstr "登入用户名和密码哈希" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:3 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:14 -msgid "Netdata" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:67 -msgid "Open" -msgstr "打开" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:66 msgid "Open Web UI" -msgstr "打开 Web UI" +msgstr "打开Web网页" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:94 -msgid "Password hash generator" -msgstr "密码哈希生成器" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js:19 -msgid "Port 0 is not supported.
Change to a other port and try again." -msgstr "不支持端口 0。
改为其他端口然后再试一次。" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:33 msgid "Service port" msgstr "服务端口" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:76 -msgid "Start" -msgstr "启动" +msgid "NOT RUNNING" +msgstr "未运行" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:84 -msgid "Stop" -msgstr "停止" +msgid "RUNNING" +msgstr "运行中" + +msgid "Netdata Service Not Running" +msgstr "Netdata服务未启用" + +msgid "Cert file" +msgstr "Cert文件" + +msgid "Cert Key file" +msgstr "Cert密钥文件" + +msgid "" +msgstr "" -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:41 msgid "" -"To enable this feature you need install luci-nginx and luci-ssl-" -"nginx
first" -msgstr "要启用此功能必须先安装 luci-nginxluci-ssl-nginx
" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:25 -msgid "Unable to save contents: %s" msgstr "" diff --git a/luci-app-netdata/po/zh_Hant/netdata.po b/luci-app-netdata/po/zh_Hant/netdata.po deleted file mode 100644 index 4abb7deb..00000000 --- a/luci-app-netdata/po/zh_Hant/netdata.po +++ /dev/null @@ -1,104 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2023-04-28 11:30+0000\n" -"Last-Translator: muink \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" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" - -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:30 -msgid "Advanced" -msgstr "進階" - -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:22 -msgid "Config" -msgstr "組態" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:21 -msgid "Contents have been saved." -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:31 -msgid "Edit Netdata main config: /etc/netdata/netdata.conf" -msgstr "編輯 Netdata 主要配置: /etc/netdata/netdata.conf" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:30 -msgid "Enable" -msgstr "啟用" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:49 -msgid "Enable Auth" -msgstr "啟用認證" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:38 -msgid "Enable SSL" -msgstr "啟用 SSL" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:63 -msgid "Enable logger" -msgstr "啟用日誌記錄器" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:134 -msgid "GenNew" -msgstr "生成新的" - -#: applications/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json:3 -msgid "Grant UCI access for netdata" -msgstr "授予訪問 LuCI 應用 netdata 的權限" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:57 -msgid "Login Username and Password hash" -msgstr "登入用戶名和密碼雜湊" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:3 -#: applications/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json:14 -msgid "Netdata" -msgstr "" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:67 -msgid "Open" -msgstr "開啟" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:66 -msgid "Open Web UI" -msgstr "開啟 Web UI" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:94 -msgid "Password hash generator" -msgstr "密碼雜湊產生器" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/main.js:19 -msgid "Port 0 is not supported.
Change to a other port and try again." -msgstr "不支援埠號為 0。
變更為其他埠後重試。" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:33 -msgid "Service port" -msgstr "伺服通訊埠" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:75 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:76 -msgid "Start" -msgstr "啟動" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:83 -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:84 -msgid "Stop" -msgstr "停止" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/config.js:41 -msgid "" -"To enable this feature you need install luci-nginx and luci-ssl-" -"nginx
first" -msgstr "要啟用此功能必須先安裝 luci-nginxluci-ssl-nginx
" - -#: applications/luci-app-netdata/htdocs/luci-static/resources/view/netdata/advanced.js:25 -msgid "Unable to save contents: %s" -msgstr "" diff --git a/luci-app-netdata/root/etc/uci-defaults/luci-app-netdata b/luci-app-netdata/root/etc/uci-defaults/luci-app-netdata new file mode 100644 index 00000000..811642b0 --- /dev/null +++ b/luci-app-netdata/root/etc/uci-defaults/luci-app-netdata @@ -0,0 +1,28 @@ +#!/bin/sh +[ ! -f "/usr/share/ucitrack/luci-app-netdata.json" ] && { + cat > /usr/share/ucitrack/luci-app-netdata.json << EEOF +{ + "config": "netdata", + "init": "netdata" +} +EEOF +} +# [ -f /usr/share/netdata/webcn/netdata.conf ] && mv -f /usr/share/netdata/webcn/netdata.conf /etc/netdata/netdata.conf +[ -f /usr/share/netdata/webcn/netdata.config ] && mv -f /usr/share/netdata/webcn/netdata.config /etc/config/netdata +[ -f /usr/share/netdata/webcn/netdata.init ] && mv -f /usr/share/netdata/webcn/netdata.init /etc/init.d/netdata + +[ -f "/etc/config/ucitrack" ] && { +uci -q batch <<-EOF >/dev/null + delete ucitrack.@netdata[-1] + add ucitrack netdata + set ucitrack.@netdata[-1].init=netdata + commit ucitrack +EOF +} + +rm -f /tmp/luci-indexcache* 2>/dev/null +rm -f /tmp/luci-modulecache/* 2>/dev/null # OpenWrt 21.02 +rm -f /tmp/luci-indexcache + +rm -rf /tmp/luci-* +exit 0 \ No newline at end of file diff --git a/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json b/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json index ba3a6ed6..7658c23b 100644 --- a/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json +++ b/luci-app-netdata/root/usr/share/luci/menu.d/luci-app-netdata.json @@ -12,26 +12,26 @@ }, "admin/status/netdata/netdata": { "title": "Netdata", - "order": 1, + "order": 10, "action": { "type": "view", - "path": "netdata/main" + "path": "netdata/netdata" + } + }, + "admin/status/netdata/basic": { + "title": "Basic Setting", + "order": 20, + "action": { + "type": "view", + "path": "netdata/basic" } }, "admin/status/netdata/config": { - "title": "Config", - "order": 2, + "title": "Config Setting", + "order": 30, "action": { "type": "view", "path": "netdata/config" } - }, - "admin/status/netdata/advanced": { - "title": "Advanced", - "order": 3, - "action": { - "type": "view", - "path": "netdata/advanced" - } } } diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf new file mode 100644 index 00000000..28131f6d --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf @@ -0,0 +1,33 @@ +# Full configuration can be retrieved from the running +# server at http://localhost:19999/netdata.conf +# +# Example: +# curl -o /etc/netdata/netdata.conf http://localhost:19999/netdata.conf +# + +[global] + update every = 2 + memory deduplication (ksm) = no + debug log = none + error log = none + access log = none + run as user = root + +[web] + default port = 19999 + allow connections from = * + allow dashboard from = * + +[plugins] + cgroups = no + apps = no + charts.d = no + fping = no + node.d = no + python.d = no + +[health] + enabled = no + +[plugin:proc:ipc] + shared memory totals = no diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.config b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.config new file mode 100644 index 00000000..2db1811b --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.config @@ -0,0 +1,3 @@ +config netdata 'netdata' + option enabled '0' + option port '19999' \ No newline at end of file diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init new file mode 100644 index 00000000..f2db196e --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init @@ -0,0 +1,105 @@ +#!/bin/sh /etc/rc.common + +START=99 +USE_PROCD=1 + +APPBINARY=/usr/sbin/netdata +CONFIGFILE=/etc/netdata/netdata.conf + +config_load 'netdata' + +get_config() { + config_get_bool enabled $1 enabled 0 + config_get port $1 port 19999 + config_get_bool ssl $1 enable_ssl 0 + config_get cert_file $1 cert_file '/etc/ssl/ezopwrt.crt' + config_get key_file $1 key_file '/etc/ssl/ezopwrt.key' + config_get_bool ennginx $1 nginx_support 0 + config_get_bool auth $1 auth 0 + config_get userpw $1 user_passwd 'admin:$apr1$t7qQjoqb$YBHtAb7VGSkjIdObMG.Oy0' + [ "$ennginx" == "1" ] && ssl=0 +} + +#read_option

    " .. + "
  • " .. translate("Linux kernel TUN virtual NIC requires system support and root privileges.") .. "
  • " .. + "
  • " .. translate("When enabled, it occupies IPv6 routing table 1023.") .. "
  • " .. + "
" +) o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) o.default = "0" o.rmempty = true @@ -1108,7 +1167,7 @@ o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) o.rmempty = true o = s:option(DynamicList, "reserved", translate("Reserved bytes(optional)")) -o.description = translate("Wireguard reserved bytes.") +o.description = translate("Decimal numbers separated by \",\" or Base64-encoded strings.") o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) o.rmempty = true @@ -1133,6 +1192,48 @@ o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) o.default = "0.0.0.0/0" o.rmempty = true +-- [[ User-Agent部分 ]]-- +o = s:option(Value, "user_agent", translate("User-Agent")) +o:depends("tcp_guise", "http") +o:depends("transport", "ws") +o:depends("transport", "httpupgrade") +o:depends("transport", "xhttp") +o:depends("transport", "grpc") + +--[[ FinalMask部分 ]]-- +o = s:option(Flag, "enable_finalmask", translate("FinalMask")) +o.rmempty = true +o.default = "0" +o:depends({type = "v2ray", v2ray_protocol = "vless"}) +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) +o:depends({type = "v2ray", v2ray_protocol = "trojan"}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +o:depends({type = "v2ray", v2ray_protocol = "hysteria2"}) + +o = s:option(TextValue, "finalmask", " ") +o.description = translate("An FinalMaskObject in JSON format, used for sharing.") +o:depends("enable_finalmask", true) +o.rows = 10 +o.wrap = "off" +o.custom_cfgvalue = function(self, section, value) + local raw = m:get(section, "finalmask") + if raw then + return base64Decode(raw) + end +end +o.custom_write = function(self, section, value) + m:set(section, "finalmask", base64Encode(value) or "") +end +o.validate = function(self, value) + value = trim(value):gsub("\r\n", "\n"):gsub("^[ \t]*\n", ""):gsub("\n[ \t]*$", ""):gsub("\n[ \t]*\n", "\n") + if luci.jsonc.parse(value) then + return value + else + return nil, "FinalMask " .. translate("Must be JSON text!") + end +end + -- [[ TLS ]]-- o = s:option(Flag, "tls", translate("TLS")) o.rmempty = true @@ -1297,6 +1398,7 @@ o:depends("type", "trojan") o:depends("type", "tuic") o.description = translate("If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.") -- Xray 支持时间判断 +-- if os.time() < os.time({year=2026,month=6,day=1}) then if os.date("%Y.%m.%d") < "2026.06.01" then -- Xray 支持到 26.06.01 o:depends("tls", true) diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua index 33ffc447..65d1a7f1 100644 --- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua @@ -15,24 +15,79 @@ local function is_finded(e) return luci.sys.exec(string.format('type -t -p "%s" 2>/dev/null', e)) ~= "" end +local function is_js_luci() + return luci.sys.call('[ -f "/www/luci-static/resources/uci.js" ]') == 0 +end + +local function url(...) + local url = string.format("admin/services/%s", "shadowsocksr") + local args = { ... } + for i, v in ipairs(args) do + if v and v ~= "" then + url = url .. "/" .. v + end + end + return require "luci.dispatcher".build_url(url) +end + +-- 默认的保存并应用行为 +local function apply_redirect(m) + local tmp_uci_file = "/etc/config/" .. "shadowsocksr" .. "_redirect" + if m.redirect and m.redirect ~= "" then + if nixio.fs.access(tmp_uci_file) then + local redirect + for line in io.lines(tmp_uci_file) do + redirect = line:match("option%s+url%s+['\"]([^'\"]+)['\"]") + if redirect and redirect ~= "" then break end + end + if redirect and redirect ~= "" then + luci.sys.call("/bin/rm -f " .. tmp_uci_file) + luci.http.redirect(redirect) + end + else + nixio.fs.writefile(tmp_uci_file, "config redirect\n") + end + m.on_after_save = function(self) + local redirect = self.redirect + if redirect and redirect ~= "" then + m.uci:set("shadowsocksr" .. "_redirect", "@redirect[0]", "url", redirect) + end + end + else + luci.sys.call("/bin/rm -f " .. tmp_uci_file) + end +end + +local function set_apply_on_parse(map) + if not map then return end + if is_js_luci() then + apply_redirect(map) + local old = map.on_after_save + map.on_after_save = function(self) + if old then old(self) end + map:set("@global[0]", "timestamp", os.time()) + end + end +end + local has_xray = is_finded("xray") local has_hysteria2 = is_finded("hysteria") local hy2_type_list = {} -if has_xray then - table.insert(hy2_type_list, { id = "xray", name = translate("Xray") }) -end if has_hysteria2 then table.insert(hy2_type_list, { id = "hysteria2", name = translate("Hysteria2") }) end +if has_xray then + table.insert(hy2_type_list, { id = "v2ray", name = translate("Xray (Hysteria2)") }) +end -- 如果用户没有手动设置,则自动选择 if not xray_hy2_type or xray_hy2_type == "" then if has_hysteria2 then xray_hy2_type = "hysteria2" elseif has_xray then - xray_hy2_type = "xray" + xray_hy2_type = "v2ray" end end @@ -47,6 +102,9 @@ end if has_ss_libev then table.insert(ss_type_list, { id = "ss-libev", name = translate("ShadowSocks-libev Version") }) end +if has_xray then + table.insert(ss_type_list, { id = "v2ray", name = translate("Xray (ShadowSocks)") }) +end -- 如果用户没有手动设置,则自动选择 if not ss_type or ss_type == "" then @@ -54,6 +112,8 @@ if not ss_type or ss_type == "" then ss_type = "ss-rust" elseif has_ss_libev then ss_type = "ss-libev" + elseif has_xray then + ss_type = "v2ray" end end @@ -108,20 +168,6 @@ if #hy2_type_list > 0 then o:value(v.id, v.name) -- 存储 "Xray" / "Hysteria2",但 UI 显示完整名称 end o.default = xray_hy2_type -- 设置默认值 - o.write = function(self, section, value) - -- 更新 Hysteria 节点的 xray_hy2_type - uci:foreach("shadowsocksr", "servers", function(s) - local node_type = uci:get("shadowsocksr", s[".name"], "type") -- 获取节点类型 - if node_type == "hysteria2" then -- 仅修改 Hysteria 节点 - local old_value = uci:get("shadowsocksr", s[".name"], "xray_hy2_type") - if old_value ~= value then - uci:set("shadowsocksr", s[".name"], "xray_hy2_type", value) - end - end - end) - -- 更新当前 section 的 xray_hy2_type - ListValue.write(self, section, value) - end end -- 确保 ss_type_list 不为空 @@ -132,20 +178,6 @@ if #ss_type_list > 0 then o:value(v.id, v.name) -- 存储 "ss-libev" / "ss-rust",但 UI 显示完整名称 end o.default = ss_type -- 设置默认值 - o.write = function(self, section, value) - -- 更新 Shadowsocks 节点的 has_ss_type - uci:foreach("shadowsocksr", "servers", function(s) - local node_type = uci:get("shadowsocksr", s[".name"], "type") -- 获取节点类型 - if node_type == "ss" then -- 仅修改 Shadowsocks 节点 - local old_value = uci:get("shadowsocksr", s[".name"], "has_ss_type") - if old_value ~= value then - uci:set("shadowsocksr", s[".name"], "has_ss_type", value) - end - end - end) - -- 更新当前 section 的 ss_type - ListValue.write(self, section, value) - end end o = s:option(DynamicList, "subscribe_url", translate("Subscribe URL")) @@ -190,22 +222,19 @@ o = s:option(Button, "delete", translate("Delete All Subscribe Servers")) o.inputstyle = "reset" o.description = string.format(translate("Server Count") .. ": %d", server_count) o.write = function() - uci:delete_all("shadowsocksr", "servers", function(s) - if s.hashkey or s.isSubscribe then - return true - else - return false - end - end) - uci:save("shadowsocksr") - uci:commit("shadowsocksr") - for file in nixio.fs.glob("/tmp/sub_md5_*") do - nixio.fs.remove(file) - end - luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete")) - return + luci.http.redirect(url("delete")) end +o = s:option(Value, "url_test_url", translate("URL Test Address")) +o:value("https://cp.cloudflare.com/", "Cloudflare") +o:value("https://www.gstatic.com/generate_204", "Gstatic") +o:value("https://www.google.com/generate_204", "Google") +o:value("https://www.youtube.com/generate_204", "YouTube") +o:value("https://connect.rom.miui.com/generate_204", "MIUI (CN)") +o:value("https://connectivitycheck.platform.hicloud.com/generate_204", "HiCloud (CN)") +o.default = o.keylist[3] + + o = s:option(Value, "user_agent", translate("User-Agent")) o.default = "v2rayN/9.99" o:value("curl", "Curl") @@ -218,16 +247,23 @@ s = m:section(TypedSection, "servers") s.anonymous = true s.addremove = true s.template = "cbi/tblsection" -s:append(cbi.Template("shadowsocksr" .. "/optimize_cbi_ui")) +set_apply_on_parse(m) s.sortable = true -s.extedit = luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers", "%s") -function s.create(...) - local sid = TypedSection.create(...) - if sid then - luci.http.redirect(s.extedit % sid) - return - end +--[[ +s.extedit = url("servers", "%s") +function s.create(self, ...) + local sid = TypedSection.create(self, ...) + if sid then + local newsid = "cfg" .. sid:sub(-6) + -- 删除匿名 + self.map.uci:delete(self.config, sid) + -- 重命名 section + self.map.uci:section(self.config, self.sectiontype, newsid) + luci.http.redirect(self.extedit % newsid) + return + end end +]]-- o = s:option(DummyValue, "type", translate("Type")) function o.cfgvalue(self, section) @@ -248,10 +284,14 @@ o = s:option(DummyValue, "server_port", translate("Socket Connected")) o.template = "shadowsocksr/socket" o.width = "10%" o.render = function(self, section, scope) - self.transport = s:cfgvalue(section).transport + local cfg = s:cfgvalue(section) or {} + self.transport = cfg.transport + self.type = cfg.type + self.v2ray_protocol = cfg.v2ray_protocol if self.transport == 'ws' then - self.ws_path = s:cfgvalue(section).ws_path - self.tls = s:cfgvalue(section).tls + self.ws_path = cfg.ws_path + self.tls = cfg.tls + self.tls_host = cfg.tls_host end DummyValue.render(self, section, scope) end @@ -276,7 +316,8 @@ node.write = function(self, section) uci:set("shadowsocksr", '@global[0]', 'global_server', section) uci:save("shadowsocksr") uci:commit("shadowsocksr") - luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "restart")) + luci.sys.call("/etc/init.d/shadowsocksr restart >/dev/null 2>&1 &") + luci.http.redirect(url("restart")) end o = s:option(Flag, "switch_enable", translate("Auto Switch")) @@ -285,6 +326,6 @@ function o.cfgvalue(...) return Value.cfgvalue(...) or 1 end -m:append(Template("shadowsocksr/server_list")) +m:append(cbi.Template("shadowsocksr/server_list")) return m diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm index d40da9c6..21f21326 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm @@ -5,53 +5,281 @@ <% require "luci.sys" function is_js_luci() - return luci.sys.call('[ -f "/www/luci-static/resources/uci.js" ]') == 0 + return luci.sys.call('[ -f "/www/luci-static/resources/uci.js" ]') == 0 end -%> + + + + + <% if is_js_luci() then -%> <%- else %> @@ -59,250 +287,444 @@ end + + + + +
<%:Saving the new order...%>
+
+ + +
diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm index 7b7b691f..74c6b1bf 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm @@ -3,4 +3,7 @@ + + + <%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm index dd534aaa..0f3d6e36 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm @@ -116,15 +116,21 @@ function import_ssr_url(btn, urlname, sid) { document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = (ssu[0] === "hy2") ? "hysteria2" : ssu[0]; document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event); - if (params.get("protocol")) { + if (params.get("protocol") && params.get("protocol").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].checked = true; // 设置 flag_transport 为 true document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].dispatchEvent(event); // 触发事件 document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get("protocol") || "udp"; } - if (params.get("pinSHA256")) { + if (params.get("pinSHA256") && params.get("pinSHA256").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get("pinSHA256") || ""; } + if (params.get("fm") && params.get("fm").trim() !== "") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件 + + document.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0].value = params.get("fm") || ""; + } document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : ""; } else { document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray" @@ -163,17 +169,17 @@ function import_ssr_url(btn, urlname, sid) { || (xray_hy2_type !== "hysteria2" && (params.get("pcs") || params.get("vcn")))) { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 tls 为 true document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件 - if (params.get("sni")) { + if (params.get("sni") && params.get("protocol").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni") || ""; } - if (params.get("alpn")) { + if (params.get("alpn") && params.get("alpn").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get("alpn") || ""; } if (xray_hy2_type !== "hysteria2") { - if (params.get("pcs")) { + if (params.get("pcs") && params.get("pcs").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertSha')[0].value = params.get("pcs") || ""; } - if (params.get("vcn")) { + if (params.get("vcn") && params.get("vcn").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertByName')[0].value = params.get("vcn") || ""; } } @@ -212,7 +218,7 @@ function import_ssr_url(btn, urlname, sid) { var params = Object.fromEntries(new URLSearchParams(query)); - if ( ! params.type) { + if ( ss_type !== "v2ray") { // 普通 SS 导入逻辑 // 判断是否 SIP002 格式(即含 @) if (url0.indexOf("@") !== -1) { @@ -307,12 +313,12 @@ function import_ssr_url(btn, urlname, sid) { } // === 填充配置项 === - var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev"; + //var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev"; document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0]; document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event); - document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type; - document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event); + //document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type; + //document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event); document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server; document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port; document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || ""; @@ -331,6 +337,11 @@ function import_ssr_url(btn, urlname, sid) { document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false; } + //if (params.udp === "1") { + // document.getElementsByName('cbid.shadowsocksr.' + sid + '.uot')[0].checked = true; // 设置 uot 为 true + // document.getElementsByName('cbid.shadowsocksr.' + sid + '.uot')[0].dispatchEvent(event); // 触发事件 + //} + if (params.tfo === "1") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].checked = true; // 设置 fast_open 为 true document.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].dispatchEvent(event); // 触发事件 @@ -394,6 +405,20 @@ function import_ssr_url(btn, urlname, sid) { ); dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event); setElementValue('cbid.shadowsocksr.' + sid + '.encrypt_method_ss', method || params.encryption || "none"); + if (params.udp === "1") { + setElementValue('cbid.shadowsocksr.' + sid + '.uot', true); // 设置 uot 为 true + dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.uot', event); // 触发事件 + } + if (params.fm && params.fm.trim() !== "") { + setElementValue('cbid.shadowsocksr.' + sid + '.enable_finalmask', true); // 设置 enable_finalmask 为 true + setElementValue('cbid.shadowsocksr.' + sid + '.enable_finalmask', event); // 触发事件 + + setElementValue('cbid.shadowsocksr.' + sid + '.finalmask', params.fm || ""); + } + if (params.tfo === "1") { + setElementValue('cbid.shadowsocksr.' + sid + '.fast_open', true); // 设置 fast_open 为 true + dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.fast_open', event); // 触发事件 + } if ([ "tls", "xtls", "reality" ].includes(params.security)) { setElementValue('cbid.shadowsocksr.' + sid + '.' + params.security, true); dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.security, event); @@ -578,7 +603,12 @@ function import_ssr_url(btn, urlname, sid) { if (params.get("ech") && params.get("ech").trim() !== "") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].checked = true; // 设置 enable_ech 为 true document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件 - document.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = params.get("ech"); + document.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = params.get("ech") || ""; + } + if (params.get("fm") && params.get("fm").trim() !== "") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件 + document.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0].value = params.get("fm") || ""; } document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value = params.get("type") == "http" ? "h2" : @@ -725,7 +755,15 @@ function import_ssr_url(btn, urlname, sid) { document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_domain')[0].value = ssm.host || ""; document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = ssm.path || ""; } - if (ssm.tls == "tls") { + if (ssm.fm !== "" && ssm.fm !== undefined) { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true + document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件 + var fmElem = document.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0]; + if (fmElem) { + fmElem.value = decodeURI(ssm.fm); + } + } + if (ssm.tls == "tls" || ssm.tls == "1") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); if (ssm.fp !== "" && ssm.fp !== undefined) { @@ -808,6 +846,11 @@ function import_ssr_url(btn, urlname, sid) { setElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get("encryption") || "none"); setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none"); dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event); + if (params.get("fm") && params.get("fm").trim() !== "") { + setElementValue('cbid.shadowsocksr.' + sid + '.enable_finalmask', true); // 设置 enable_finalmask 为 true + dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_finalmask', event); // 触发事件 + setElementValue('cbid.shadowsocksr.' + sid + '.finalmask', params.get("fm") || ""); + } if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) { setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true); dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event); diff --git a/luci-app-ssr-plus/po/templates/ssr-plus.pot b/luci-app-ssr-plus/po/templates/ssr-plus.pot index 0de2e7dd..6092038f 100644 --- a/luci-app-ssr-plus/po/templates/ssr-plus.pot +++ b/luci-app-ssr-plus/po/templates/ssr-plus.pot @@ -1,20 +1,20 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:360 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361 msgid "" "\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "data writes by the client. \"tlshello\" is for TLS client hello packet " "fragmentation." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:210 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:277 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:165 msgid "%s Node Use Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:292 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:346 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:175 msgid "%s Node Use Version" msgstr "" @@ -30,7 +30,7 @@ msgstr "" msgid "128 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1364 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1466 msgid "16" msgstr "" @@ -46,7 +46,7 @@ msgstr "" msgid "32 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1297 msgid "360" msgstr "" @@ -66,7 +66,7 @@ msgstr "" msgid "64 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1351 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1453 msgid "8" msgstr "" @@ -74,13 +74,13 @@ msgstr "" msgid "8 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385 msgid "" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:913 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1211 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:959 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1312 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1339 msgid "" msgstr "" @@ -90,28 +90,33 @@ msgid "" "etc." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:185 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:219 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1344 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1357 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1370 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1155 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1446 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1459 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1472 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:188 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:249 msgid "
  • " msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:15 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:58 msgid "Access Control" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:206 msgid "AdGuard DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:16 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:728 +msgid "Add" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:59 msgid "Advanced Settings" msgstr "" @@ -123,11 +128,11 @@ msgstr "" msgid "AliYun Public DNS (223.5.5.5)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:237 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:273 msgid "Alias" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:280 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:334 msgid "Alias(optional)" msgstr "" @@ -143,16 +148,20 @@ msgstr "" msgid "Allow listed only" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:171 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:203 msgid "Allow subscribe Insecure nodes By default" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:764 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:805 msgid "AlterId" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:141 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1215 +msgid "An FinalMaskObject in JSON format, used for sharing." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:149 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:170 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:201 @@ -160,12 +169,12 @@ msgstr "" msgid "Anti-pollution DNS Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:205 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206 msgid "Anti-pollution DNS Server For Shunt Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243 msgid "Apple Domains DNS" msgstr "" @@ -173,24 +182,28 @@ msgstr "" msgid "Apple Domains Data" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238 msgid "Apple Domains Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:233 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234 msgid "Apple domains optimization" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:265 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:305 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:311 msgid "Apply" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:379 +msgid "Are you sure to delete this node?" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133 msgid "Are you sure you want to restore the client to default settings?" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:323 msgid "Auto Switch" msgstr "" @@ -198,21 +211,21 @@ msgstr "" msgid "Auto Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:70 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:130 msgid "Auto Update" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:72 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:132 msgid "Auto Update Server subscription, GFW list and CHN route" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:698 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1410 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1425 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:739 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1512 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1527 msgid "BBR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1426 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1528 msgid "BRUTAL" msgstr "" @@ -232,12 +245,12 @@ msgstr "" msgid "Baidu Public DNS (180.76.76.76)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:240 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:256 msgid "Base64 sstr failed." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1028 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1038 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1082 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1092 msgid "BitTorrent (uTP)" msgstr "" @@ -245,7 +258,7 @@ msgstr "" msgid "Black Domain List" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:424 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:465 msgid "Bloom Filter" msgstr "" @@ -261,22 +274,22 @@ msgstr "" msgid "CNNIC SDNS (1.2.4.8)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:699 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1429 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1513 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 msgid "CUBIC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1045 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1099 msgid "Camouflage Domain" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:826 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1034 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:867 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1088 msgid "Camouflage Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1320 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1422 msgid "Certificate fingerprint" msgstr "" @@ -294,11 +307,11 @@ msgstr "" msgid "Check Server Port" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:76 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:77 msgid "Check Try Count" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:71 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:72 msgid "Check timout(second)" msgstr "" @@ -315,19 +328,19 @@ msgstr "" msgid "ChinaDNS-NG query protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226 msgid "ChinaDNS-NG shunt query protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:88 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 msgid "Chnroute Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90 msgid "Clang.CN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91 msgid "Clang.CN.CIDR" msgstr "" @@ -335,31 +348,31 @@ msgstr "" msgid "Clear logs" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:192 msgid "Click here to view or manage the DNS list file" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:389 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:915 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1213 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:388 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:961 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1341 msgid "Click to the page" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:176 msgid "Cloudflare DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:160 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:246 msgid "Cloudflare DNS (1.1.1.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:207 msgid "Cloudflare DNSCrypt SDNS" msgstr "" @@ -368,15 +381,15 @@ msgstr "" msgid "Collecting data..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:913 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:959 msgid "Configure XHTTP Extra Settings (JSON format), see:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1094 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1148 msgid "Congestion" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:696 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:737 msgid "Congestion control algorithm" msgstr "" @@ -392,7 +405,7 @@ msgstr "" msgid "Connection Timeout" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1224 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 msgid "" "Controls the policy used when performing DNS queries for ECH configuration." msgstr "" @@ -405,27 +418,27 @@ msgstr "" msgid "Create Backup File" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1457 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559 msgid "Create upload file error." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1477 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1579 msgid "Current Certificate Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:491 msgid "Custom" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:182 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:210 msgid "" "Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query " "and other format)." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:166 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:250 msgid "Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)" @@ -435,14 +448,14 @@ msgstr "" msgid "Custom DNS Server format as IP:PORT (default: disabled)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:149 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:150 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:178 msgid "" "Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT " "(tcp://8.8.8.8 or tls://dns.google:853)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:454 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:495 msgid "Custom Plugin Path" msgstr "" @@ -450,7 +463,7 @@ msgstr "" msgid "Custom Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:102 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:103 msgid "Customize Netflix IP Url" msgstr "" @@ -458,7 +471,7 @@ msgstr "" msgid "DL Backup" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1042 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1096 msgid "DNS" msgstr "" @@ -466,7 +479,7 @@ msgstr "" msgid "DNS Anti-pollution" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106 msgid "DNS Query Mode For Shunt Mode" msgstr "" @@ -474,55 +487,63 @@ msgstr "" msgid "DNSPod Public DNS (119.29.29.29)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1030 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1040 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1084 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1094 msgid "DTLS 1.2" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1261 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1273 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1287 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1170 +msgid "Decimal numbers separated by \",\" or Base64-encoded strings." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1374 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1388 msgid "Default" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1371 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473 msgid "Default reject rejects traffic." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:594 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:635 msgid "Default value 0 indicatesno heartbeat." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1345 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1447 msgid "" "Default: disable. When entering a negative number, such as -1, The Mux " "module will not be used to carry TCP traffic." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1358 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1460 msgid "" "Default:16. When entering a negative number, such as -1, The Mux module will " "not be used to carry UDP traffic, Use original UDP transmission method of " "proxy protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:184 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:212 msgid "Defines the upstreams logic mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:215 msgid "" "Defines the upstreams logic mode, possible values: load_balance, parallel, " "fastest_addr (default: load_balance)." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:427 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:426 msgid "Delay (ms)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:189 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:717 +msgid "Delete" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:221 msgid "Delete All Subscribe Servers" msgstr "" @@ -541,7 +562,7 @@ msgstr "" msgid "Disable ChinaDNS-NG" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152 msgid "Disable IPv6 In MosDNS Query Mode (Shunt Mode)" msgstr "" @@ -549,20 +570,20 @@ msgstr "" msgid "Disable IPv6 in MOSDNS query mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:226 msgid "Disable IPv6 query mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:592 msgid "Disable QUIC path MTU discovery" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:781 msgid "Disable SNI" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:621 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:662 msgid "Disable TCP No_delay" msgstr "" @@ -578,12 +599,12 @@ msgstr "" msgid "Do you want to restore the client to default settings?" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:230 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:259 msgid "DoT upstream (Need use wolfssl version)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:414 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:413 msgid "Domain Strategy" msgstr "" @@ -591,86 +612,94 @@ msgstr "" msgid "Domestic DNS Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1070 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1124 msgid "Downlink Capacity(Default:Mbps)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:751 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:718 +msgid "Drag to reorder" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:792 msgid "Dual-stack Listening Socket" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1310 msgid "ECH Config" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1223 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1324 msgid "ECH Query Policy" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:863 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:909 msgid "Early Data Header Name" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:190 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:716 +msgid "Edit" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:257 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:69 msgid "Edit ShadowSocksR Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:270 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:403 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:402 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:82 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 msgid "Enable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:745 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:786 msgid "Enable 0-RTT QUIC handshake" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:370 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:411 msgid "Enable Authentication" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:62 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1493 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:63 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1595 msgid "Enable Auto Switch" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1305 msgid "Enable ECH(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:527 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:568 msgid "Enable Lazy Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1332 msgid "Enable ML-DSA-65(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1491 msgid "" "Enable Multipath TCP, need to be enabled in both server and client " "configuration." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 msgid "Enable Mux.Cool" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95 msgid "Enable Netflix Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:521 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:562 msgid "Enable Obfuscation" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:430 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:471 msgid "Enable Plugin" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:490 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:531 msgid "Enable Port Hopping" msgstr "" @@ -678,48 +707,48 @@ msgstr "" msgid "Enable Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:503 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:544 msgid "Enable Transport Protocol Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:607 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:648 msgid "Enable V2 protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:606 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:647 msgid "Enable V3 protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:249 msgid "Enable adblock" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:419 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:460 msgid "Enable the SUoT protocol, requires server support." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:906 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:952 msgid "Enable this option to configure XHTTP Extra (JSON format)." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1099 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1153 msgid "Enabled Kernel virtual NIC TUN(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335 msgid "Enabled Mixed" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:616 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585 msgid "Enabling TCP Fast Open Requires Server Support." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:405 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:648 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:659 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:790 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:439 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:446 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:689 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:700 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:831 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:118 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:125 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:122 @@ -730,35 +759,35 @@ msgstr "" msgid "Enter Custom Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:75 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:135 msgid "Every Day" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:80 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:140 msgid "Every Friday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:76 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:136 msgid "Every Monday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:81 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:141 msgid "Every Saturday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:82 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:142 msgid "Every Sunday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:79 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:139 msgid "Every Thursday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:77 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:137 msgid "Every Tuesday" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:78 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:138 msgid "Every Wednesday" msgstr "" @@ -770,33 +799,37 @@ msgstr "" msgid "External Proxy Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529 msgid "FORCE BRUTAL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:156 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:188 msgid "Filter Words splited by /" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1188 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204 +msgid "FinalMask" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1289 msgid "Finger Print" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1276 msgid "Flow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:233 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234 msgid "" "For Apple domains equipped with Chinese mainland CDN, always responsive to " "Chinese CDN IP addresses" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:387 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 msgid "For specific usage, see:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:497 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:538 msgid "" "Format as 10000:20000 or 10000-20000 Multiple groups are separated by commas " "(,)." @@ -806,27 +839,27 @@ msgstr "" msgid "Forward Netflix Proxy through Main Proxy" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358 msgid "Fragment" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375 msgid "Fragment Interval" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:369 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370 msgid "Fragment Length" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:360 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361 msgid "Fragment Packets" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375 msgid "Fragmentation interval (ms)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:369 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370 msgid "Fragmented packet length (byte)" msgstr "" @@ -850,11 +883,11 @@ msgstr "" msgid "Game Mode UDP Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:716 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757 msgid "Garbage collection interval(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:722 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:763 msgid "Garbage collection lifetime(second)" msgstr "" @@ -866,7 +899,7 @@ msgstr "" msgid "Global Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:266 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:152 msgid "Global SOCKS5 Proxy Server" msgstr "" @@ -879,25 +912,25 @@ msgstr "" msgid "Google Connectivity" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:202 msgid "Google DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:171 msgid "Google Public DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:150 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:236 msgid "Google Public DNS (8.8.4.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:151 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:237 msgid "Google Public DNS (8.8.8.8)" @@ -907,67 +940,71 @@ msgstr "" msgid "Grant UCI access for luci-app-ssr-plus" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:969 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023 msgid "Gun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:988 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1042 msgid "H2 Read Idle Timeout" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:983 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1037 msgid "H2/gRPC Health Check" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:341 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:829 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:382 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:870 msgid "HTTP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:833 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:874 msgid "HTTP Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:838 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:879 msgid "HTTP Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1005 msgid "HTTP/2 Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:956 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1010 msgid "HTTP/2 Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1077 msgid "Header" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1000 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1054 msgid "Health Check Timeout" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:704 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:745 msgid "Heartbeat interval(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:872 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:896 +msgid "HeartbeatPeriod(second)" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:918 msgid "Httpupgrade Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:877 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:923 msgid "Httpupgrade Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:218 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:263 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:338 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:27 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:285 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:317 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:379 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:79 msgid "Hysteria2" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:545 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:586 msgid "Hysterir QUIC parameters" msgstr "" @@ -975,55 +1012,51 @@ msgstr "" msgid "IP Route Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1285 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1386 msgid "IP Stack Preference" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:431 -msgid "IP Type" -msgstr "" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243 msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1211 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1312 msgid "" "If it is not empty, it indicates that the Client has enabled Encrypted " "Client, see:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:752 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:793 msgid "If this option is not set, the socket behavior is platform dependent." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1298 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1399 msgid "" "If true, allowss insecure connection at TLS client, e.g., TLS server uses " "unverifiable certificates." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1441 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1543 msgid "If you have a self-signed certificate,please check the box" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:954 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1040 msgid "Import" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:182 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:327 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:475 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:508 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:539 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:633 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:727 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:869 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:945 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:198 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:353 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:516 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:553 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:587 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:692 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:799 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:951 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1031 msgid "Import configuration information successfully." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:976 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1030 msgid "Initial Windows Size" msgstr "" @@ -1035,11 +1068,7 @@ msgstr "" msgid "Interface control" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:942 -msgid "Invalid JSON format" -msgstr "" - -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:948 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1034 msgid "Invalid format." msgstr "" @@ -1047,19 +1076,19 @@ msgstr "" msgid "KcpTun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1605 msgid "KcpTun Enable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1520 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1622 msgid "KcpTun Param" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1515 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1617 msgid "KcpTun Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1509 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1611 msgid "KcpTun Port" msgstr "" @@ -1087,73 +1116,74 @@ msgstr "" msgid "LAN IP AC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:240 msgid "Level 3 Public DNS (209.244.0.3)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:155 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:241 msgid "Level 3 Public DNS (209.244.0.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:156 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:242 msgid "Level 3 Public DNS (4.2.2.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:157 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:243 msgid "Level 3 Public DNS (4.2.2.2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:158 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:244 msgid "Level 3 Public DNS (4.2.2.3)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:159 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:245 msgid "Level 3 Public DNS (4.2.2.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:173 msgid "Level 3 Public DNS-1 (209.244.0.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:174 msgid "Level 3 Public DNS-2 (4.2.2.1-2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:175 msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:377 -msgid "Limit the maximum number of splits." +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1156 +msgid "" +"Linux kernel TUN virtual NIC requires system support and root privileges." msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:22 msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:347 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1497 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:348 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1599 msgid "Local Port" msgstr "" @@ -1161,31 +1191,31 @@ msgstr "" msgid "Local Servers" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1164 msgid "Local addresses" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:23 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:66 msgid "Log" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85 msgid "Loukky/gfwlist-by-loukky" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1236 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1337 msgid "ML-DSA-65 Public key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1491 msgid "MPTCP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1049 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1103 msgid "MTU" msgstr "" @@ -1193,47 +1223,45 @@ msgstr "" msgid "Main Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:856 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:902 msgid "Max Early Data" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:377 -msgid "Max Split" -msgstr "" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:798 msgid "Maximum packet size the socks5 server can receive from external" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1359 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1461 msgid "" "Min value is 1, Max value is 1024. When omitted or set to 0, Will same path " "as TCP traffic." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1346 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1448 msgid "" "Min value is 1, Max value is 128. When omitted or set to 0, it equals 8." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335 msgid "Mixed as an alias of socks, default:Enabled." msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:10 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:714 msgid "Move down" msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:7 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:713 msgid "Move up" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:251 msgid "Muitiple DNS server can saperate with ','" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:970 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1024 msgid "Multi" msgstr "" @@ -1241,11 +1269,16 @@ msgstr "" msgid "Multi Threads Option" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:994 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1233 +msgid "Must be JSON text!" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 msgid "Mux" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253 msgid "NEO DEV HOST" msgstr "" @@ -1253,7 +1286,7 @@ msgstr "" msgid "NOT RUNNING" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:314 msgid "NaiveProxy" msgstr "" @@ -1269,7 +1302,7 @@ msgstr "" msgid "Netflix IP Data" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 msgid "Netflix IP Only" msgstr "" @@ -1277,19 +1310,19 @@ msgstr "" msgid "Netflix Node" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101 msgid "Netflix and AWS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:275 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:329 msgid "Network Tunnel" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:336 msgid "Network interface to use" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:700 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:741 msgid "New Reno" msgstr "" @@ -1303,21 +1336,21 @@ msgstr "" msgid "No new data!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1575 msgid "No specify upload file." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:381 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380 msgid "Noise" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:437 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:828 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1014 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1026 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1036 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:234 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:239 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:478 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:869 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1068 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1080 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1090 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:270 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:275 msgid "None" msgstr "" @@ -1340,35 +1373,35 @@ msgid "" "compatibility issues." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1400 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 msgid "Number of early established connections to reduce latency." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:436 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:472 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:477 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:513 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:139 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:133 msgid "Obfs" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:479 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:520 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:146 msgid "Obfs param (optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1090 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1144 msgid "Obfuscate password (optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:538 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:579 msgid "Obfuscation Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:532 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:573 msgid "Obfuscation Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 msgid "Once set, connects only when the server’s chain fingerprint matches." msgstr "" @@ -1376,28 +1409,28 @@ msgstr "" msgid "Only Common Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324 msgid "Only when Socks5 Auth Mode is password valid, Mandatory." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:328 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329 msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:172 msgid "OpenDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:153 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:239 msgid "OpenDNS (208.67.220.220)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:152 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:238 msgid "OpenDNS (208.67.222.222)" @@ -1415,11 +1448,11 @@ msgstr "" msgid "Oversea Mode DNS-2 (114.114.115.115)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:423 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:422 msgid "Packet" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:384 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:425 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:114 msgid "Password" msgstr "" @@ -1428,7 +1461,7 @@ msgstr "" msgid "Paste sharing link here" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1120 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1179 msgid "Peer public key" msgstr "" @@ -1437,15 +1470,15 @@ msgstr "" msgid "Perform reset" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1006 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1060 msgid "Permit Without Stream" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:259 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:299 msgid "Ping Latency" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1480 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1582 msgid "Please confirm the current certificate path" msgstr "" @@ -1453,23 +1486,23 @@ msgstr "" msgid "Please fill in reset" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:458 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:499 msgid "Plugin Opts" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:514 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:555 msgid "Port Hopping Interval(Unit:Second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:496 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:537 msgid "Port hopping range" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1400 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 msgid "Pre-connections" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1124 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1183 msgid "Pre-shared key" msgstr "" @@ -1477,17 +1510,17 @@ msgstr "" msgid "Prefer firewall tools" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1115 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1174 msgid "Private key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:462 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:503 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:132 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:128 msgid "Protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:469 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510 msgid "Protocol param (optional)" msgstr "" @@ -1495,44 +1528,44 @@ msgstr "" msgid "Proxy Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1162 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1263 msgid "Public key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1019 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1073 msgid "QUIC Key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1012 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1066 msgid "QUIC Security" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:572 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:613 msgid "QUIC initConnReceiveWindow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:558 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:599 msgid "QUIC initStreamReceiveWindow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:579 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:620 msgid "QUIC maxConnReceiveWindow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:627 msgid "QUIC maxIdleTimeout(Unit:second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:565 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:606 msgid "QUIC maxStreamReceiveWindow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:205 msgid "Quad9 DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1258 msgid "REALITY" msgstr "" @@ -1544,7 +1577,7 @@ msgstr "" msgid "RUNNING" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1078 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1132 msgid "Read Buffer Size" msgstr "" @@ -1552,7 +1585,7 @@ msgstr "" msgid "Really reset all changes?" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:269 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:309 msgid "Reapply" msgstr "" @@ -1564,7 +1597,7 @@ msgstr "" msgid "Records" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:289 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:343 msgid "Redirect traffic to this network interface" msgstr "" @@ -1587,20 +1620,20 @@ msgstr "" msgid "Refresh..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:87 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:147 msgid "Regular update (Hour)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:95 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:155 msgid "Regular update (Min)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1412 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1428 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1514 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530 msgid "Reno" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1169 msgid "Reserved bytes(optional)" msgstr "" @@ -1609,7 +1642,7 @@ msgstr "" msgid "Reset complete" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:259 msgid "Reset to defaults" msgstr "" @@ -1647,62 +1680,78 @@ msgstr "" msgid "Running Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:262 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:278 msgid "SS URL base64 sstr format not recognized." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:13 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:56 msgid "SSR Client" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:17 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:60 msgid "SSR Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:277 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:71 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:79 msgid "Same as Global Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:160 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:729 +msgid "Save Order" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:192 msgid "Save Words splited by /" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:472 +msgid "Save failed!" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:470 +msgid "Saved current page order successfully." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:726 +msgid "Saving the new order..." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186 msgid "Select DNS parse Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:293 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:347 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:176 msgid "Selection ShadowSocks Node Use Version." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1433 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1535 msgid "Self-signed Certificate" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:275 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276 msgid "Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:344 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:385 msgid "Server Address" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:223 msgid "Server Count" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:246 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:300 msgid "Server Node Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:96 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:112 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:278 msgid "Server Port" msgstr "" @@ -1715,53 +1764,53 @@ msgstr "" msgid "Server Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:55 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:56 msgid "Server failsafe auto swith and custom update settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:14 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:57 msgid "Servers Nodes" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:64 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:124 msgid "Servers subscription and manage" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1252 msgid "Session Ticket" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:166 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:195 msgid "Set Single DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:269 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:323 msgid "Shadow-TLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:633 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:674 msgid "Shadow-TLS ChainPoxy type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:254 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:333 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:308 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:374 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:89 msgid "ShadowSocks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:300 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:48 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:354 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:103 msgid "ShadowSocks-libev Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:297 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:636 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:45 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:351 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:677 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:100 msgid "ShadowSocks-rust Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:10 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:53 msgid "ShadowSocksR Plus+" msgstr "" @@ -1769,49 +1818,49 @@ msgstr "" msgid "ShadowSocksR Plus+ Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:644 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:685 msgid "Shadowsocks password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:305 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:92 msgid "ShadowsocksR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1166 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267 msgid "Short ID" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:247 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:283 msgid "Socket Connected" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:340 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:381 msgid "Socks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:798 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:839 msgid "Socks Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310 msgid "Socks protocol auth methods, default:noauth." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:272 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:326 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:87 msgid "Socks5" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310 msgid "Socks5 Auth Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:328 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329 msgid "Socks5 Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324 msgid "Socks5 User" msgstr "" @@ -1819,132 +1868,146 @@ msgstr "" msgid "Specifically for edit dnsproxy DNS parse files." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:18 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:61 msgid "Status" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:176 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:208 msgid "Subscribe Default Auto-Switch" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:154 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:186 msgid "Subscribe Filter Words" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:158 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:190 msgid "Subscribe Save Words" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:183 msgid "Subscribe URL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:178 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:210 msgid "Subscribe new add server default Auto-Switch on" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:173 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:205 msgid "Subscribe nodes allows insecure connection as TLS client (insecure)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:256 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:257 msgid "Support AdGuardHome and DNSMASQ format list" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:66 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:67 msgid "Switch check cycly(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:616 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:149 msgid "TCP Fast Open" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358 msgid "" "TCP fragments, which can deceive the censorship system in some cases, such " "as bypassing SNI blacklists." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:257 msgid "TCP upstream" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1137 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 msgid "TLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:611 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:652 msgid "TLS 1.3 Strict mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1259 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1360 msgid "TLS ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1416 msgid "TLS Certificate Name (CertName)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 msgid "TLS Chain Fingerprint (SHA256)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1352 msgid "TLS Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:527 +msgid "TLS handshake test, latency for reference only" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1416 msgid "TLS is used to verify the leaf certificate name." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1056 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1110 msgid "TTI" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:266 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:320 msgid "TUIC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1372 msgid "TUIC ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:676 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:717 msgid "TUIC Server IP Address" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:683 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:724 msgid "TUIC User Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:669 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:710 msgid "TUIC User UUID" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:734 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:775 msgid "TUIC receive window" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:728 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:769 msgid "TUIC send window" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:203 msgid "TWNIC-101 DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:527 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:592 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:616 +msgid "Test" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:569 +msgid "Testing..." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1339 msgid "" "The client has not configured mldsa65Verify, but it will not perform the " "\"additional verification\" step and can still connect normally, see:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:211 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:106 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:166 msgid "" "The configured type also applies to the core specified when manually " "importing nodes." @@ -1954,38 +2017,36 @@ msgstr "" msgid "The content entered is incorrect!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:593 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:634 msgid "The keep-alive period.(Unit:second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:213 msgid "Through proxy update" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:183 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:215 msgid "Through proxy update list, Not Recommended" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:751 msgid "Timeout for establishing a connection to server(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:190 msgid "Tips: Dnsproxy DNS Parse List Path:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:289 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:290 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:715 msgid "To Bottom" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:279 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:280 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:712 msgid "To Top" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385 msgid "To send noise packets, select \"Noise\" in Xray Settings." msgstr "" @@ -1993,48 +2054,48 @@ msgstr "" msgid "Total Records:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:807 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:848 msgid "Transport" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:508 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:549 msgid "Transport Protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:257 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:332 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:311 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:373 msgid "Trojan" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:407 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:232 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:406 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:268 msgid "Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551 msgid "UDP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:381 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380 msgid "" "UDP noise, Under some circumstances it can bypass some UDP based protocol " "restrictions." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:418 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:459 msgid "UDP over TCP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:689 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:730 msgid "UDP relay mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:258 msgid "UDP upstream" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:256 msgid "UDP/TCP upstream" msgstr "" @@ -2043,6 +2104,10 @@ msgstr "" msgid "UL Restore" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:228 +msgid "URL Test Address" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:82 msgid "Unable to copy SSR to clipboard." msgstr "" @@ -2052,38 +2117,38 @@ msgstr "" msgid "Unknown" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:185 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:217 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:16 msgid "Update All Subscribe Servers" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:162 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:194 msgid "Update Subscribe List" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:74 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:134 msgid "Update cycle (Day/Week)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:164 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:196 msgid "Update subscribe url list first" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1062 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1116 msgid "Uplink Capacity(Default:Mbps)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1443 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1545 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3 msgid "Upload" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:120 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:144 msgid "Use ChinaDNS-NG query and cache" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:168 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:196 msgid "Use DNS List File" msgstr "" @@ -2096,12 +2161,12 @@ msgstr "" msgid "Use DNS from WAN and 114DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:132 msgid "Use DNS2SOCKS query and cache" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:111 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:135 msgid "Use DNS2SOCKS-RUST query and cache" msgstr "" @@ -2110,7 +2175,7 @@ msgstr "" msgid "Use DNS2TCP query" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:117 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:141 msgid "Use DNSPROXY query and cache" msgstr "" @@ -2123,11 +2188,11 @@ msgstr "" msgid "Use MOSDNS query (Not Support Oversea Mode)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 msgid "Use MosDNS query" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1046 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1100 msgid "" "Use it together with the DNS disguised type. You can fill in any domain." msgstr "" @@ -2136,69 +2201,64 @@ msgstr "" msgid "User cancelled." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:238 msgid "User-Agent" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:217 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:898 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:233 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:980 msgid "Userinfo format error." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:377 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:418 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:110 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:117 msgid "Username" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:484 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:525 msgid "Users Authentication" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:332 msgid "Using incorrect encryption mothod may causes service fail to start" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:248 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:302 msgid "V2Ray/XRay" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:329 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:370 msgid "V2Ray/XRay protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:330 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:371 msgid "VLESS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:779 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:820 msgid "VLESS Encryption" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:331 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:372 msgid "VMess" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1027 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1037 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1081 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1091 msgid "VideoCall (SRTP)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1100 -msgid "" -"Virtual NIC TUN of Linux kernel can be used only when system supports and " -"have root permission. If used, IPv6 routing table 1023 is occupied." -msgstr "" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:639 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:680 msgid "Vmess Protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:654 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:695 msgid "Vmess UUID" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:771 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:812 msgid "Vmess/VLESS ID (UUID)" msgstr "" @@ -2214,284 +2274,292 @@ msgstr "" msgid "WAN White List IP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:844 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:885 msgid "WebSocket Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:850 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:891 msgid "WebSocket Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1029 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1039 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1083 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1093 msgid "WechatVideo" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:96 msgid "When disabled shunt mode, will same time stopped shunt service." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:227 msgid "When disabled, all AAAA requests are not resolved." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157 +msgid "When enabled, it occupies IPv6 routing table 1023." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:216 msgid "When two or more DNS servers are deployed, enable this function." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:189 msgid "" "When use DNS list file, please ensure list file exists and is formatted " "correctly." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:335 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1041 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:376 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1085 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1095 msgid "WireGuard" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1189 msgid "Wireguard allows only traffic from specific source IP." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1111 -msgid "Wireguard reserved bytes." -msgstr "" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1084 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1138 msgid "Write Buffer Size" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:905 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951 msgid "XHTTP Extra" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:893 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:939 msgid "XHTTP Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:884 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:930 msgid "XHTTP Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:899 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:945 msgid "XHTTP Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:215 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:24 -msgid "Xray" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:82 +msgid "Xray (Hysteria2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:354 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:106 +msgid "Xray (ShadowSocks)" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:355 msgid "Xray Fragment Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:384 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:383 msgid "Xray Noise Packets" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252 msgid "adblock_url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1015 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1069 msgid "aes-128-gcm" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1378 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1480 msgid "allow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1372 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1474 msgid "allow: Allows use Mux connection." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1293 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1394 msgid "allowInsecure" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1188 msgid "allowedIPs(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1194 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1295 msgid "android" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:254 msgid "anti-AD" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1016 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1070 msgid "chacha20-poly1305" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:92 msgid "china-operator-ip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1190 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1291 msgid "chrome" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:180 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:208 msgid "cloudflare-dns.com DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1409 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1424 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1511 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1526 msgid "comment_tcpcongestion_disable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1342 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1444 msgid "concurrency" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1406 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1421 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:666 +msgid "connect" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1508 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1523 msgid "custom_tcpcongestion" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1200 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1350 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1363 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1301 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1465 msgid "disable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:204 msgid "dns.sb DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1195 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1296 msgid "edge" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:192 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:221 msgid "fastest_addr" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:239 msgid "felixonmars/dnsmasq-china-list" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1292 msgid "firefox" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:994 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1048 msgid "gRPC Idle Timeout" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:967 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1021 msgid "gRPC Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:961 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1015 msgid "gRPC Service Name" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:81 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82 msgid "gfwlist Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:86 msgid "gfwlist/gfwlist" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1193 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1294 msgid "ios" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:189 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:219 msgid "load_balance" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:692 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:733 msgid "lossless UDP relay using QUIC streams" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:691 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:732 msgid "native UDP characteristics" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:98 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99 msgid "nfip_url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:409 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1179 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1280 msgid "none" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:439 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:480 msgid "obfs-local" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:220 msgid "parallel" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1197 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1298 msgid "qq" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1198 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1299 msgid "random" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1199 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1300 msgid "randomized" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1377 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 msgid "reject" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1192 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1293 msgid "safari" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:626 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:667 msgid "shadow-TLS SNI" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:448 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:489 msgid "shadow-tls" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:604 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:645 msgid "shadowTLS protocol Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1379 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1481 msgid "skip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1475 msgid "" "skip: Not use Mux module to carry UDP 443 traffic, Use original UDP " "transmission method of proxy protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271 msgid "spiderX" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83 msgid "v2fly/domain-list-community" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:442 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:483 msgid "v2ray-plugin" msgstr "" @@ -2503,14 +2571,14 @@ msgstr "" msgid "warning! Please do not reuse the port!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:445 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:486 msgid "xray-plugin" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1355 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1457 msgid "xudpConcurrency" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1368 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1470 msgid "xudpProxyUDP443" msgstr "" diff --git a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po index a38e7a5c..081c4030 100644 --- a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po +++ b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po @@ -1,7 +1,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8\n" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:360 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361 msgid "" "\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "data writes by the client. \"tlshello\" is for TLS client hello packet " @@ -10,13 +10,13 @@ msgstr "" "\"1-3\" 是 TCP 的流切片,应用于客户端第 1 至第 3 次写数据。\"tlshello\" 是 " "TLS 握手包切片。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:210 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:277 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:165 msgid "%s Node Use Type" msgstr "%s 节点使用类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:292 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:346 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:175 msgid "%s Node Use Version" msgstr "%s 节点使用版本" @@ -32,7 +32,7 @@ msgstr "单线程" msgid "128 Threads" msgstr "128 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1364 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1466 msgid "16" msgstr "" @@ -48,7 +48,7 @@ msgstr "2 线程" msgid "32 Threads" msgstr "32 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1297 msgid "360" msgstr "" @@ -68,7 +68,7 @@ msgstr "4 线程" msgid "64 Threads" msgstr "64 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1351 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1453 msgid "8" msgstr "" @@ -76,13 +76,13 @@ msgstr "" msgid "8 Threads" msgstr "8 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385 msgid "" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:913 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1211 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:959 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1312 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1339 msgid "" msgstr "" @@ -94,28 +94,33 @@ msgstr "" "

    支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/TUN 等协" "议。

    " -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:185 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:219 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1344 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1357 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1370 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1155 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1446 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1459 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1472 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:188 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:249 msgid "
    • " msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:15 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:58 msgid "Access Control" msgstr "访问控制" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:206 msgid "AdGuard DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:16 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:728 +msgid "Add" +msgstr "添加" + +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:59 msgid "Advanced Settings" msgstr "高级设置" @@ -127,11 +132,11 @@ msgstr "【广告屏蔽】数据库" msgid "AliYun Public DNS (223.5.5.5)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:237 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:273 msgid "Alias" msgstr "别名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:280 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:334 msgid "Alias(optional)" msgstr "别名(可选)" @@ -147,16 +152,20 @@ msgstr "除列表外主机皆允许" msgid "Allow listed only" msgstr "仅允许列表内主机" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:171 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:203 msgid "Allow subscribe Insecure nodes By default" msgstr "订阅节点允许不验证 TLS 证书" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:764 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:805 msgid "AlterId" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:141 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1215 +msgid "An FinalMaskObject in JSON format, used for sharing." +msgstr "JSON 格式的 FinalMaskObject,用来实现分享。" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:149 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:170 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:201 @@ -164,12 +173,12 @@ msgstr "" msgid "Anti-pollution DNS Server" msgstr "访问国外域名 DNS 服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:205 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206 msgid "Anti-pollution DNS Server For Shunt Mode" msgstr "分流模式下的访问国外域名 DNS 服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243 msgid "Apple Domains DNS" msgstr "Apple 域名 DNS" @@ -177,24 +186,28 @@ msgstr "Apple 域名 DNS" msgid "Apple Domains Data" msgstr "【Apple 域名】数据库" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238 msgid "Apple Domains Update url" msgstr "Apple 域名更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:233 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234 msgid "Apple domains optimization" msgstr "Apple 域名解析优化" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:265 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:305 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:311 msgid "Apply" msgstr "应用" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:379 +msgid "Are you sure to delete this node?" +msgstr "是否真的要删除该节点?" + #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133 msgid "Are you sure you want to restore the client to default settings?" msgstr "是否真的要恢复客户端默认配置?" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:323 msgid "Auto Switch" msgstr "自动切换" @@ -202,21 +215,21 @@ msgstr "自动切换" msgid "Auto Threads" msgstr "自动(CPU 线程数)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:70 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:130 msgid "Auto Update" msgstr "自动更新" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:72 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:132 msgid "Auto Update Server subscription, GFW list and CHN route" msgstr "自动更新服务器订阅、GFW 列表和中国大陆 IP 段" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:698 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1410 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1425 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:739 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1512 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1527 msgid "BBR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1426 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1528 msgid "BRUTAL" msgstr "" @@ -236,12 +249,12 @@ msgstr "【百度】连通性检查" msgid "Baidu Public DNS (180.76.76.76)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:240 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:256 msgid "Base64 sstr failed." msgstr "Base64 解码失败。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1028 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1038 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1082 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1092 msgid "BitTorrent (uTP)" msgstr "BT 下载(uTP)" @@ -249,7 +262,7 @@ msgstr "BT 下载(uTP)" msgid "Black Domain List" msgstr "强制走代理的域名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:424 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:465 msgid "Bloom Filter" msgstr "布隆过滤器" @@ -265,22 +278,22 @@ msgstr "关闭窗口" msgid "CNNIC SDNS (1.2.4.8)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:699 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1429 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1513 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 msgid "CUBIC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1045 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1099 msgid "Camouflage Domain" msgstr "伪装域名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:826 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1034 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:867 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1088 msgid "Camouflage Type" msgstr "伪装类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1320 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1422 msgid "Certificate fingerprint" msgstr "证书指纹" @@ -298,11 +311,11 @@ msgstr "检查服务器" msgid "Check Server Port" msgstr "【服务器端口】检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:76 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:77 msgid "Check Try Count" msgstr "切换检查重试次数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:71 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:72 msgid "Check timout(second)" msgstr "切换检查超时时间(秒)" @@ -319,19 +332,19 @@ msgstr "【中国大陆 IP 段】数据库" msgid "ChinaDNS-NG query protocol" msgstr "ChinaDNS-NG 查询协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226 msgid "ChinaDNS-NG shunt query protocol" msgstr "ChinaDNS-NG 分流查询协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:88 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 msgid "Chnroute Update url" msgstr "中国大陆 IP 段更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90 msgid "Clang.CN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91 msgid "Clang.CN.CIDR" msgstr "" @@ -339,31 +352,31 @@ msgstr "" msgid "Clear logs" msgstr "清空日志" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:192 msgid "Click here to view or manage the DNS list file" msgstr "点击此处查看或管理 DNS 列表文件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:389 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:915 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1213 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:388 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:961 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1341 msgid "Click to the page" msgstr "点击前往" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:176 msgid "Cloudflare DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:160 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:246 msgid "Cloudflare DNS (1.1.1.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:207 msgid "Cloudflare DNSCrypt SDNS" msgstr "" @@ -372,15 +385,15 @@ msgstr "" msgid "Collecting data..." msgstr "正在收集数据中..." -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:913 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:959 msgid "Configure XHTTP Extra Settings (JSON format), see:" msgstr "配置 XHTTP 额外设置(JSON 格式),具体请参见:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1094 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1148 msgid "Congestion" msgstr "拥塞控制" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:696 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:737 msgid "Congestion control algorithm" msgstr "拥塞控制算法" @@ -396,7 +409,7 @@ msgstr "连接正常" msgid "Connection Timeout" msgstr "连接超时" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1224 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 msgid "" "Controls the policy used when performing DNS queries for ECH configuration." msgstr "控制使用 DNS 查询 ECH 配置时的策略。" @@ -409,19 +422,19 @@ msgstr "成功复制 SSR 网址到剪贴板。" msgid "Create Backup File" msgstr "创建备份文件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1457 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559 msgid "Create upload file error." msgstr "创建上传文件错误。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1477 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1579 msgid "Current Certificate Path" msgstr "当前证书路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:491 msgid "Custom" msgstr "自定义" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:182 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:210 msgid "" "Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query " @@ -430,8 +443,8 @@ msgstr "" "自定义 DNS 服务器(支持格式:IP:端口、tls://IP:端口、https://IP/dns-query 及" "其他格式)。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:166 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:250 msgid "Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)" @@ -441,7 +454,7 @@ msgstr "格式为 IP:Port(默认:8.8.4.4:53)" msgid "Custom DNS Server format as IP:PORT (default: disabled)" msgstr "格式为 IP:PORT(默认:禁用)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:149 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:150 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:178 msgid "" "Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT " @@ -449,7 +462,7 @@ msgid "" msgstr "" "格式为tcp://IP:Port或tls://域名:Port (tcp://8.8.8.8或tls://dns.google:853)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:454 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:495 msgid "Custom Plugin Path" msgstr "自定义插件路径" @@ -457,7 +470,7 @@ msgstr "自定义插件路径" msgid "Custom Ports" msgstr "自定义端口" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:102 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:103 msgid "Customize Netflix IP Url" msgstr "" "自定义 Netflix IP 段更新 URL(默认项目地址:https://github.com/QiuSimons/" @@ -467,7 +480,7 @@ msgstr "" msgid "DL Backup" msgstr "下载备份" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1042 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1096 msgid "DNS" msgstr "" @@ -475,7 +488,7 @@ msgstr "" msgid "DNS Anti-pollution" msgstr "DNS 防污染服务" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106 msgid "DNS Query Mode For Shunt Mode" msgstr "分流模式下的 DNS 查询模式" @@ -483,32 +496,36 @@ msgstr "分流模式下的 DNS 查询模式" msgid "DNSPod Public DNS (119.29.29.29)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1030 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1040 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1084 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1094 msgid "DTLS 1.2" msgstr "DTLS 1.2 数据包" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1261 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1273 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1287 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1170 +msgid "Decimal numbers separated by \",\" or Base64-encoded strings." +msgstr "用“,”隔开的十进制数字或 Base64 编码字符串。" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1374 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1388 msgid "Default" msgstr "默认" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1371 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473 msgid "Default reject rejects traffic." msgstr "默认 reject 拒绝流量。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:594 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:635 msgid "Default value 0 indicatesno heartbeat." msgstr "默认为 0 表示无心跳。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1345 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1447 msgid "" "Default: disable. When entering a negative number, such as -1, The Mux " "module will not be used to carry TCP traffic." msgstr "默认:禁用。填负数时,如 -1,不使用 Mux 模块承载 TCP 流量。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1358 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1460 msgid "" "Default:16. When entering a negative number, such as -1, The Mux module will " "not be used to carry UDP traffic, Use original UDP transmission method of " @@ -517,12 +534,12 @@ msgstr "" "默认值:16。填负数时,如 -1,不使用 Mux 模块承载 UDP 流量。将使用代理协议原本" "的 UDP 传输方式。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:184 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:212 msgid "Defines the upstreams logic mode" msgstr "定义上游逻辑模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:215 msgid "" "Defines the upstreams logic mode, possible values: load_balance, parallel, " @@ -531,11 +548,15 @@ msgstr "" "定义上游逻辑模式,可选择值:负载均衡、并行查询、最快响应(默认值:负载均" "衡)。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:427 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:426 msgid "Delay (ms)" msgstr "延迟(ms)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:189 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:717 +msgid "Delete" +msgstr "删除" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:221 msgid "Delete All Subscribe Servers" msgstr "删除所有订阅服务器节点" @@ -554,7 +575,7 @@ msgstr "停用" msgid "Disable ChinaDNS-NG" msgstr "直通模式(禁用 ChinaDNS-NG)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152 msgid "Disable IPv6 In MosDNS Query Mode (Shunt Mode)" msgstr "禁止 MosDNS 返回 IPv6 记录 (分流模式)" @@ -562,20 +583,20 @@ msgstr "禁止 MosDNS 返回 IPv6 记录 (分流模式)" msgid "Disable IPv6 in MOSDNS query mode" msgstr "禁止 MOSDNS 返回 IPv6 记录" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:226 msgid "Disable IPv6 query mode" msgstr "禁止返回 IPv6 记录" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:592 msgid "Disable QUIC path MTU discovery" msgstr "禁用 QUIC 启用 MTU 探测" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:781 msgid "Disable SNI" msgstr "关闭 SNI 服务器名称指示" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:621 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:662 msgid "Disable TCP No_delay" msgstr "禁用 TCP 无延迟" @@ -591,12 +612,12 @@ msgstr "执行重置" msgid "Do you want to restore the client to default settings?" msgstr "是否要恢复客户端默认配置?" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:230 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:259 msgid "DoT upstream (Need use wolfssl version)" msgstr "DoT 上游(需使用 wolfssl 版本)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:414 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:413 msgid "Domain Strategy" msgstr "域名解析策略" @@ -604,86 +625,94 @@ msgstr "域名解析策略" msgid "Domestic DNS Server" msgstr "国内 DNS 服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1070 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1124 msgid "Downlink Capacity(Default:Mbps)" msgstr "下行链路容量(默认:Mbps)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:751 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:718 +msgid "Drag to reorder" +msgstr "拖动以重排" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:792 msgid "Dual-stack Listening Socket" msgstr "双栈 Socket 监听" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1310 msgid "ECH Config" msgstr "ECH 配置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1223 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1324 msgid "ECH Query Policy" msgstr "ECH 查询策略" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:863 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:909 msgid "Early Data Header Name" msgstr "前置数据标头" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:190 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:716 +msgid "Edit" +msgstr "编辑" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:257 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:69 msgid "Edit ShadowSocksR Server" msgstr "编辑服务器配置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:270 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:403 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:402 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:82 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 msgid "Enable" msgstr "启用" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:745 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:786 msgid "Enable 0-RTT QUIC handshake" msgstr "客户端启用 0-RTT QUIC 连接握手" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:370 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:411 msgid "Enable Authentication" msgstr "启用用户名/密码认证" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:62 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1493 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:63 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1595 msgid "Enable Auto Switch" msgstr "启用自动切换" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1305 msgid "Enable ECH(optional)" msgstr "启用 ECH (可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:527 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:568 msgid "Enable Lazy Mode" msgstr "启用懒狗模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1332 msgid "Enable ML-DSA-65(optional)" msgstr "启用 ML-DSA-65 (可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1491 msgid "" "Enable Multipath TCP, need to be enabled in both server and client " "configuration." msgstr "启用 Multipath TCP,需在服务端和客户端配置中同时启用。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 msgid "Enable Mux.Cool" msgstr "启用 Mux.Cool" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95 msgid "Enable Netflix Mode" msgstr "启用 Netflix 分流模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:521 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:562 msgid "Enable Obfuscation" msgstr "启用混淆功能" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:430 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:471 msgid "Enable Plugin" msgstr "启用插件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:490 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:531 msgid "Enable Port Hopping" msgstr "启用端口跳跃" @@ -691,48 +720,48 @@ msgstr "启用端口跳跃" msgid "Enable Server" msgstr "启动服务端" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:503 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:544 msgid "Enable Transport Protocol Settings" msgstr "启用传输协议设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:607 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:648 msgid "Enable V2 protocol." msgstr "开启 V2 协议。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:606 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:647 msgid "Enable V3 protocol." msgstr "开启 V3 协议。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:249 msgid "Enable adblock" msgstr "启用广告屏蔽" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:419 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:460 msgid "Enable the SUoT protocol, requires server support." msgstr "启用 SUoT 协议,需要服务端支持。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:906 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:952 msgid "Enable this option to configure XHTTP Extra (JSON format)." msgstr "启用此选项配置 XHTTP 附加项(JSON 格式)。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1099 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1153 msgid "Enabled Kernel virtual NIC TUN(optional)" msgstr "启用内核的虚拟网卡 TUN(可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335 msgid "Enabled Mixed" msgstr "启用 Mixed" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:616 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585 msgid "Enabling TCP Fast Open Requires Server Support." msgstr "启用 TCP 快速打开需要服务端支持。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:405 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:648 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:659 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:790 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:439 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:446 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:689 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:700 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:831 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:118 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:125 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:122 @@ -743,35 +772,35 @@ msgstr "加密方式" msgid "Enter Custom Ports" msgstr "输入自定义端口" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:75 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:135 msgid "Every Day" msgstr "每天" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:80 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:140 msgid "Every Friday" msgstr "每周五" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:76 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:136 msgid "Every Monday" msgstr "每周一" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:81 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:141 msgid "Every Saturday" msgstr "每周六" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:82 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:142 msgid "Every Sunday" msgstr "每周日" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:79 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:139 msgid "Every Thursday" msgstr "每周四" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:77 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:137 msgid "Every Tuesday" msgstr "每周二" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:78 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:138 msgid "Every Wednesday" msgstr "每周三" @@ -783,33 +812,37 @@ msgstr "应为:%s" msgid "External Proxy Mode" msgstr "分流服务器(前置)代理" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529 msgid "FORCE BRUTAL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:156 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:188 msgid "Filter Words splited by /" msgstr "命中关键字的节点将被丢弃。多个关键字用 / 分隔" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1188 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204 +msgid "FinalMask" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1289 msgid "Finger Print" msgstr "指纹伪造" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1276 msgid "Flow" msgstr "流控(Flow)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:233 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234 msgid "" "For Apple domains equipped with Chinese mainland CDN, always responsive to " "Chinese CDN IP addresses" msgstr "配备中国大陆 CDN 的 Apple 域名,始终应答中国大陆 CDN 地址" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:387 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 msgid "For specific usage, see:" msgstr "具体使用方法,具体请参见:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:497 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:538 msgid "" "Format as 10000:20000 or 10000-20000 Multiple groups are separated by commas " "(,)." @@ -819,27 +852,27 @@ msgstr "格式为:10000:20000 或 10000-20000 多组时用逗号(,)隔开 msgid "Forward Netflix Proxy through Main Proxy" msgstr "分流服务器流量通过主服务节点中转代理转发" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358 msgid "Fragment" msgstr "分片" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375 msgid "Fragment Interval" msgstr "分片间隔" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:369 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370 msgid "Fragment Length" msgstr "分片包长" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:360 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361 msgid "Fragment Packets" msgstr "分片方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375 msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:369 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370 msgid "Fragmented packet length (byte)" msgstr "分片包长 (byte)" @@ -863,11 +896,11 @@ msgstr "游戏模式 UDP 中继" msgid "Game Mode UDP Server" msgstr "游戏模式 UDP 中继服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:716 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757 msgid "Garbage collection interval(second)" msgstr "UDP 数据包片残片清理间隔(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:722 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:763 msgid "Garbage collection lifetime(second)" msgstr "UDP 数据包残片在服务器的保留时间(单位:秒)" @@ -879,7 +912,7 @@ msgstr "TCP 透明代理" msgid "Global Mode" msgstr "全局模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:266 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:152 msgid "Global SOCKS5 Proxy Server" msgstr "SOCKS5 代理服务端(全局)" @@ -892,25 +925,25 @@ msgstr "全局设置" msgid "Google Connectivity" msgstr "【谷歌】连通性检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:202 msgid "Google DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:171 msgid "Google Public DNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:150 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:236 msgid "Google Public DNS (8.8.4.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:151 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:237 msgid "Google Public DNS (8.8.8.8)" @@ -920,67 +953,71 @@ msgstr "" msgid "Grant UCI access for luci-app-ssr-plus" msgstr "授予访问 luci-app-ssr-plus 配置的权限" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:969 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023 msgid "Gun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:988 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1042 msgid "H2 Read Idle Timeout" msgstr "H2 读取空闲超时" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:983 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1037 msgid "H2/gRPC Health Check" msgstr "H2/gRPC 健康检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:341 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:829 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:382 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:870 msgid "HTTP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:833 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:874 msgid "HTTP Host" msgstr "HTTP 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:838 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:879 msgid "HTTP Path" msgstr "HTTP 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1005 msgid "HTTP/2 Host" msgstr "HTTP/2 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:956 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1010 msgid "HTTP/2 Path" msgstr "HTTP/2 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1077 msgid "Header" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1000 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1054 msgid "Health Check Timeout" msgstr "健康检查超时" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:704 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:745 msgid "Heartbeat interval(second)" msgstr "保活心跳包发送间隔(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:872 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:896 +msgid "HeartbeatPeriod(second)" +msgstr "心跳周期(单位:秒)" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:918 msgid "Httpupgrade Host" msgstr "HTTPUpgrade 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:877 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:923 msgid "Httpupgrade Path" msgstr "HTTPUpgrade 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:218 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:263 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:338 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:27 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:285 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:317 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:379 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:79 msgid "Hysteria2" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:545 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:586 msgid "Hysterir QUIC parameters" msgstr "QUIC 参数" @@ -988,56 +1025,52 @@ msgstr "QUIC 参数" msgid "IP Route Mode" msgstr "绕过中国大陆 IP 模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1285 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1386 msgid "IP Stack Preference" msgstr "IP 栈优先级" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:431 -msgid "IP Type" -msgstr "IP 类型" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243 msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "如果为空,则不更改 Apple 域名解析 DNS(默认为空)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1211 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1312 msgid "" "If it is not empty, it indicates that the Client has enabled Encrypted " "Client, see:" msgstr "如果不为空,表示客户端已启用加密客户端,具体请参见:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:752 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:793 msgid "If this option is not set, the socket behavior is platform dependent." msgstr "如果未设置此选项,则 Socket 行为依赖于平台。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1298 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1399 msgid "" "If true, allowss insecure connection at TLS client, e.g., TLS server uses " "unverifiable certificates." msgstr "" "是否允许不安全连接。当选择时,将不会检查远端主机所提供的 TLS 证书的有效性。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1441 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1543 msgid "If you have a self-signed certificate,please check the box" msgstr "如果你使用自签证书,请选择" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:954 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1040 msgid "Import" msgstr "导入配置信息" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:182 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:327 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:475 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:508 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:539 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:633 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:727 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:869 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:945 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:198 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:353 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:516 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:553 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:587 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:692 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:799 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:951 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1031 msgid "Import configuration information successfully." msgstr "导入配置信息成功。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:976 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1030 msgid "Initial Windows Size" msgstr "初始窗口大小" @@ -1049,11 +1082,7 @@ msgstr "接口" msgid "Interface control" msgstr "接口控制" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:942 -msgid "Invalid JSON format" -msgstr "无效的 JSON 格式" - -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:948 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1034 msgid "Invalid format." msgstr "无效的格式。" @@ -1061,19 +1090,19 @@ msgstr "无效的格式。" msgid "KcpTun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1605 msgid "KcpTun Enable" msgstr "KcpTun 启用" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1520 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1622 msgid "KcpTun Param" msgstr "KcpTun 参数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1515 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1617 msgid "KcpTun Password" msgstr "KcpTun 密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1509 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1611 msgid "KcpTun Port" msgstr "KcpTun 端口" @@ -1101,73 +1130,74 @@ msgstr "内网主机列表" msgid "LAN IP AC" msgstr "LAN IP 访问控制" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:240 msgid "Level 3 Public DNS (209.244.0.3)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:155 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:241 msgid "Level 3 Public DNS (209.244.0.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:156 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:242 msgid "Level 3 Public DNS (4.2.2.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:157 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:243 msgid "Level 3 Public DNS (4.2.2.2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:158 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:244 msgid "Level 3 Public DNS (4.2.2.3)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:159 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:245 msgid "Level 3 Public DNS (4.2.2.4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:173 msgid "Level 3 Public DNS-1 (209.244.0.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:174 msgid "Level 3 Public DNS-2 (4.2.2.1-2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:175 msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:377 -msgid "Limit the maximum number of splits." -msgstr "限制分片的最大数量。" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1156 +msgid "" +"Linux kernel TUN virtual NIC requires system support and root privileges." +msgstr "Linux 内核 TUN 虚拟网卡需要系统支持和 root 权限。" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:22 msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:347 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1497 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:348 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1599 msgid "Local Port" msgstr "本地端口" @@ -1175,31 +1205,31 @@ msgstr "本地端口" msgid "Local Servers" msgstr "本机服务端" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1105 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1164 msgid "Local addresses" msgstr "本地地址" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:23 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:66 msgid "Log" msgstr "日志" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85 msgid "Loukky/gfwlist-by-loukky" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1236 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1337 msgid "ML-DSA-65 Public key" msgstr "ML-DSA-65 公钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1491 msgid "MPTCP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1049 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1103 msgid "MTU" msgstr "最大传输单元" @@ -1207,19 +1237,15 @@ msgstr "最大传输单元" msgid "Main Server" msgstr "主服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:856 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:902 msgid "Max Early Data" msgstr "最大前置数据" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:377 -msgid "Max Split" -msgstr "最大分片数" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:798 msgid "Maximum packet size the socks5 server can receive from external" msgstr "socks5 服务器可以从外部接收的最大数据包大小(单位:字节)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1359 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1461 msgid "" "Min value is 1, Max value is 1024. When omitted or set to 0, Will same path " "as TCP traffic." @@ -1227,29 +1253,31 @@ msgstr "" "最小值 1,最大值 1024。 省略或者填 0 时,将与 TCP 流量走同一条路,也就是传统" "的行为。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1346 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1448 msgid "" "Min value is 1, Max value is 128. When omitted or set to 0, it equals 8." msgstr "最小值 1,最大值 128。省略或者填 0 时都等于 8。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335 msgid "Mixed as an alias of socks, default:Enabled." msgstr "Mixed 作为 SOCKS 的别名,默认:启用。" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:10 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:714 msgid "Move down" msgstr "下移" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:7 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:713 msgid "Move up" msgstr "上移" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:251 msgid "Muitiple DNS server can saperate with ','" msgstr "多个上游 DNS 服务器请用 ',' 分隔(注意用英文逗号)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:970 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1024 msgid "Multi" msgstr "" @@ -1257,11 +1285,16 @@ msgstr "" msgid "Multi Threads Option" msgstr "多线程并发转发" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1325 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:994 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1233 +msgid "Must be JSON text!" +msgstr "必须是 JSON 文本内容!" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1427 msgid "Mux" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253 msgid "NEO DEV HOST" msgstr "" @@ -1269,7 +1302,7 @@ msgstr "" msgid "NOT RUNNING" msgstr "未运行" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:314 msgid "NaiveProxy" msgstr "" @@ -1285,7 +1318,7 @@ msgstr "Netflix 分流域名列表" msgid "Netflix IP Data" msgstr "【Netflix IP 段】数据库" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 msgid "Netflix IP Only" msgstr "" @@ -1293,19 +1326,19 @@ msgstr "" msgid "Netflix Node" msgstr "Netflix 分流服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101 msgid "Netflix and AWS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:275 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:329 msgid "Network Tunnel" msgstr "网络隧道" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:336 msgid "Network interface to use" msgstr "使用的网络接口" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:700 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:741 msgid "New Reno" msgstr "" @@ -1319,21 +1352,21 @@ msgstr "未检查" msgid "No new data!" msgstr "你已经是最新数据,无需更新!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1575 msgid "No specify upload file." msgstr "没有上传证书。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:381 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380 msgid "Noise" msgstr "噪声" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:437 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:828 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1014 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1026 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1036 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:234 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:239 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:478 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:869 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1068 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1080 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1090 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:270 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:275 msgid "None" msgstr "" @@ -1356,35 +1389,35 @@ msgid "" "compatibility issues." msgstr "注意:不同版本间的配置恢复可能会导致兼容性问题。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1400 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 msgid "Number of early established connections to reduce latency." msgstr "预连接的数量,用于降低延迟。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:436 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:472 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:477 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:513 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:139 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:133 msgid "Obfs" msgstr "混淆插件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:479 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:520 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:146 msgid "Obfs param (optional)" msgstr "混淆参数(可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1090 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1144 msgid "Obfuscate password (optional)" msgstr "混淆密码(可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:538 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:579 msgid "Obfuscation Password" msgstr "混淆密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:532 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:573 msgid "Obfuscation Type" msgstr "混淆类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 msgid "Once set, connects only when the server’s chain fingerprint matches." msgstr "设置后,仅在服务器证书链指纹匹配时连接。" @@ -1392,28 +1425,28 @@ msgstr "设置后,仅在服务器证书链指纹匹配时连接。" msgid "Only Common Ports" msgstr "仅常用端口(不走 P2P 流量到代理)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324 msgid "Only when Socks5 Auth Mode is password valid, Mandatory." msgstr "仅当 Socks5 认证方式为 Password 时有效,必填。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:328 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329 msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:172 msgid "OpenDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:153 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:239 msgid "OpenDNS (208.67.220.220)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:152 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:238 msgid "OpenDNS (208.67.222.222)" @@ -1431,11 +1464,11 @@ msgstr "" msgid "Oversea Mode DNS-2 (114.114.115.115)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:423 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:422 msgid "Packet" msgstr "数据包" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:384 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:425 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:114 msgid "Password" msgstr "密码" @@ -1444,7 +1477,7 @@ msgstr "密码" msgid "Paste sharing link here" msgstr "在此处粘贴分享链接" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1120 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1179 msgid "Peer public key" msgstr "节点公钥" @@ -1453,15 +1486,15 @@ msgstr "节点公钥" msgid "Perform reset" msgstr "执行重置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1006 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1060 msgid "Permit Without Stream" msgstr "允许无数据流" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:259 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:299 msgid "Ping Latency" msgstr "Ping 延迟" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1480 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1582 msgid "Please confirm the current certificate path" msgstr "请选择确认所传证书,证书不正确将无法运行" @@ -1469,23 +1502,23 @@ msgstr "请选择确认所传证书,证书不正确将无法运行" msgid "Please fill in reset" msgstr "请填写 reset" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:458 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:499 msgid "Plugin Opts" msgstr "插件参数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:514 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:555 msgid "Port Hopping Interval(Unit:Second)" msgstr "端口跳跃间隔(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:496 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:537 msgid "Port hopping range" msgstr "端口跳跃范围" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1400 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 msgid "Pre-connections" msgstr "预连接" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1124 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1183 msgid "Pre-shared key" msgstr "预共享密钥" @@ -1493,17 +1526,17 @@ msgstr "预共享密钥" msgid "Prefer firewall tools" msgstr "首选防火墙工具" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1115 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1174 msgid "Private key" msgstr "私钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:462 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:503 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:132 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:128 msgid "Protocol" msgstr "传输协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:469 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510 msgid "Protocol param (optional)" msgstr "传输协议参数(可选)" @@ -1511,44 +1544,44 @@ msgstr "传输协议参数(可选)" msgid "Proxy Ports" msgstr "需要代理的端口" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1162 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1263 msgid "Public key" msgstr "公钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1019 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1073 msgid "QUIC Key" msgstr "QUIC 密钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1012 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1066 msgid "QUIC Security" msgstr "QUIC 加密方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:572 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:613 msgid "QUIC initConnReceiveWindow" msgstr "QUIC 初始的连接接收窗口大小" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:558 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:599 msgid "QUIC initStreamReceiveWindow" msgstr "QUIC 初始流接收窗口大小。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:579 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:620 msgid "QUIC maxConnReceiveWindow" msgstr "QUIC 最大的连接接收窗口大小" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:627 msgid "QUIC maxIdleTimeout(Unit:second)" msgstr "QUIC 最长空闲超时时间(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:565 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:606 msgid "QUIC maxStreamReceiveWindow" msgstr "QUIC 最大的流接收窗口大小" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:205 msgid "Quad9 DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1258 msgid "REALITY" msgstr "" @@ -1560,7 +1593,7 @@ msgstr "恢复备份" msgid "RUNNING" msgstr "运行中" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1078 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1132 msgid "Read Buffer Size" msgstr "读取缓冲区大小" @@ -1568,7 +1601,7 @@ msgstr "读取缓冲区大小" msgid "Really reset all changes?" msgstr "真的重置所有更改吗?" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:269 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:309 msgid "Reapply" msgstr "重新应用" @@ -1580,7 +1613,7 @@ msgstr "重新应用" msgid "Records" msgstr "条记录" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:289 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:343 msgid "Redirect traffic to this network interface" msgstr "分流到这个网络接口" @@ -1603,20 +1636,20 @@ msgstr "更新成功!" msgid "Refresh..." msgstr "正在更新,请稍候..." -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:87 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:147 msgid "Regular update (Hour)" msgstr "定时更新(小时)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:95 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:155 msgid "Regular update (Min)" msgstr "定时更新(分钟)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1412 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1428 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1514 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530 msgid "Reno" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1169 msgid "Reserved bytes(optional)" msgstr "保留字节(可选)" @@ -1625,7 +1658,7 @@ msgstr "保留字节(可选)" msgid "Reset complete" msgstr "重置完成" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:259 msgid "Reset to defaults" msgstr "恢复出厂设置" @@ -1663,63 +1696,79 @@ msgstr "运行中" msgid "Running Mode" msgstr "运行模式" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:262 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:278 msgid "SS URL base64 sstr format not recognized." msgstr "无法识别 SS URL 的 Base64 格式。" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:13 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:56 msgid "SSR Client" msgstr "客户端" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:17 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:60 msgid "SSR Server" msgstr "服务端" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:277 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:71 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:79 msgid "Same as Global Server" msgstr "与全局服务器相同" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:160 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:729 +msgid "Save Order" +msgstr "保存当前顺序" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:192 msgid "Save Words splited by /" msgstr "" "命中关键字的节点将被保留。多个关键字用 / 分隔。此项为空则不启用保留匹配" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:472 +msgid "Save failed!" +msgstr "保存失败!" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:470 +msgid "Saved current page order successfully." +msgstr "保存当前页面顺序成功。" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:726 +msgid "Saving the new order..." +msgstr "正在保存新的顺序…" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186 msgid "Select DNS parse Mode" msgstr "选择 DNS 解析方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:293 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:347 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:176 msgid "Selection ShadowSocks Node Use Version." msgstr "选择 ShadowSocks 节点使用版本。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1433 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1535 msgid "Self-signed Certificate" msgstr "自签证书" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:275 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276 msgid "Server" msgstr "服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:344 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:385 msgid "Server Address" msgstr "服务器地址" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:223 msgid "Server Count" msgstr "服务器节点数量" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:246 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:300 msgid "Server Node Type" msgstr "服务器节点类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:96 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:112 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:242 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:278 msgid "Server Port" msgstr "端口" @@ -1732,53 +1781,53 @@ msgstr "服务端配置" msgid "Server Type" msgstr "服务端类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:55 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:56 msgid "Server failsafe auto swith and custom update settings" msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:14 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:57 msgid "Servers Nodes" msgstr "服务器节点" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:64 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:124 msgid "Servers subscription and manage" msgstr "服务器节点订阅与管理" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1252 msgid "Session Ticket" msgstr "会话凭据" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:166 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:195 msgid "Set Single DNS" msgstr "设置单个 DNS" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:269 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:323 msgid "Shadow-TLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:633 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:674 msgid "Shadow-TLS ChainPoxy type" msgstr "代理链类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:254 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:333 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:308 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:374 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:89 msgid "ShadowSocks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:300 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:48 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:354 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:103 msgid "ShadowSocks-libev Version" msgstr "ShadowSocks-libev 版本" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:297 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:636 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:45 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:351 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:677 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:100 msgid "ShadowSocks-rust Version" msgstr "ShadowSocks-rust 版本" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:10 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:53 msgid "ShadowSocksR Plus+" msgstr "" @@ -1786,49 +1835,49 @@ msgstr "" msgid "ShadowSocksR Plus+ Settings" msgstr "ShadowSocksR Plus+ 设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:644 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:685 msgid "Shadowsocks password" msgstr "shadowsocks密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:305 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:92 msgid "ShadowsocksR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1166 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267 msgid "Short ID" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:247 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:283 msgid "Socket Connected" msgstr "连接测试" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:340 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:381 msgid "Socks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:798 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:839 msgid "Socks Version" msgstr "Socks 版本" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310 msgid "Socks protocol auth methods, default:noauth." msgstr "Socks 协议的认证方式,默认值:noauth。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:272 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:326 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:87 msgid "Socks5" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310 msgid "Socks5 Auth Mode" msgstr "Socks5 认证方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:328 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329 msgid "Socks5 Password" msgstr "Socks5 密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324 msgid "Socks5 User" msgstr "Socks5 用户名" @@ -1836,125 +1885,139 @@ msgstr "Socks5 用户名" msgid "Specifically for edit dnsproxy DNS parse files." msgstr "专门用于编辑 DNSPROXY 的 DNS 解析文件。" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:18 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:61 msgid "Status" msgstr "状态" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:176 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:208 msgid "Subscribe Default Auto-Switch" msgstr "订阅新节点自动切换设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:154 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:186 msgid "Subscribe Filter Words" msgstr "订阅节点关键字过滤" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:158 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:190 msgid "Subscribe Save Words" msgstr "订阅节点关键字保留检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:151 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:183 msgid "Subscribe URL" msgstr "SS/SSR/V2/TROJAN/HY2/TUIC 订阅 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:178 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:210 msgid "Subscribe new add server default Auto-Switch on" msgstr "订阅加入的新节点默认开启自动切换" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:173 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:205 msgid "Subscribe nodes allows insecure connection as TLS client (insecure)" msgstr "订阅节点强制开启 不验证TLS客户端证书 (insecure)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:256 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:257 msgid "Support AdGuardHome and DNSMASQ format list" msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:66 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:67 msgid "Switch check cycly(second)" msgstr "自动切换检查周期(秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:616 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:149 msgid "TCP Fast Open" msgstr "TCP 快速打开" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:357 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358 msgid "" "TCP fragments, which can deceive the censorship system in some cases, such " "as bypassing SNI blacklists." msgstr "TCP 分片,在某些情况下可以欺骗审查系统,比如绕过 SNI 黑名单。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:257 msgid "TCP upstream" msgstr "TCP 上游" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1137 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 msgid "TLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:611 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:652 msgid "TLS 1.3 Strict mode" msgstr "TLS 1.3 限定模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1259 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1360 msgid "TLS ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1416 msgid "TLS Certificate Name (CertName)" msgstr "TLS 证书名称(CertName)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1411 msgid "TLS Chain Fingerprint (SHA256)" msgstr "TLS 证书链指纹(SHA256)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1352 msgid "TLS Host" msgstr "TLS 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1314 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:527 +msgid "TLS handshake test, latency for reference only" +msgstr "TLS握手测试,延时仅供参考" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1416 msgid "TLS is used to verify the leaf certificate name." msgstr "TLS 用于验证 leaf 证书的 name。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1056 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1110 msgid "TTI" msgstr "传输时间间隔" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:266 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:320 msgid "TUIC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1372 msgid "TUIC ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:676 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:717 msgid "TUIC Server IP Address" msgstr "TUIC 服务器 IP 地址" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:683 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:724 msgid "TUIC User Password" msgstr "TUIC 用户密钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:669 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:710 msgid "TUIC User UUID" msgstr "TUIC 用户 uuid" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:734 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:775 msgid "TUIC receive window" msgstr "接收窗口(无需确认即可接收的最大字节数:默认8Mb)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:728 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:769 msgid "TUIC send window" msgstr "发送窗口(无需确认即可发送的最大字节数:默认8Mb*2)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:203 msgid "TWNIC-101 DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:527 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:592 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:616 +msgid "Test" +msgstr "测试" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:569 +msgid "Testing..." +msgstr "检测中…" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1339 msgid "" "The client has not configured mldsa65Verify, but it will not perform the " "\"additional verification\" step and can still connect normally, see:" @@ -1962,8 +2025,8 @@ msgstr "" "客户端若未配置 mldsa65Verify,但它不会执行 \"附加验证\" 步骤,仍可以正常连" "接,具体请参见:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:211 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:106 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:166 msgid "" "The configured type also applies to the core specified when manually " "importing nodes." @@ -1973,38 +2036,36 @@ msgstr "配置的类型同样适用于手动导入节点时所指定的核心程 msgid "The content entered is incorrect!" msgstr "输入的内容不正确!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:593 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:634 msgid "The keep-alive period.(Unit:second)" msgstr "心跳包发送间隔(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:213 msgid "Through proxy update" msgstr "通过代理更新" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:183 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:215 msgid "Through proxy update list, Not Recommended" msgstr "通过路由器自身代理更新订阅" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:751 msgid "Timeout for establishing a connection to server(second)" msgstr "连接超时时间(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:190 msgid "Tips: Dnsproxy DNS Parse List Path:" msgstr "提示:Dnsproxy 的 DNS 解析列表路径:" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:289 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:290 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:715 msgid "To Bottom" msgstr "置底" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:279 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:280 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:712 msgid "To Top" msgstr "置顶" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:386 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385 msgid "To send noise packets, select \"Noise\" in Xray Settings." msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" @@ -2012,48 +2073,48 @@ msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" msgid "Total Records:" msgstr "新的总记录数:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:807 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:848 msgid "Transport" msgstr "传输协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:508 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:549 msgid "Transport Protocol" msgstr "传输协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:257 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:332 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:311 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:373 msgid "Trojan" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:407 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:232 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:406 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:268 msgid "Type" msgstr "类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551 msgid "UDP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:381 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380 msgid "" "UDP noise, Under some circumstances it can bypass some UDP based protocol " "restrictions." msgstr "UDP 噪声,在某些情况下可以绕过一些针对 UDP 协议的限制。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:418 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:459 msgid "UDP over TCP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:689 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:730 msgid "UDP relay mode" msgstr "UDP 中继模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:258 msgid "UDP upstream" msgstr "UDP 上游" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:256 msgid "UDP/TCP upstream" msgstr "UDP/TCP 上游" @@ -2062,6 +2123,10 @@ msgstr "UDP/TCP 上游" msgid "UL Restore" msgstr "上传恢复" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:228 +msgid "URL Test Address" +msgstr "URL 测试地址" + #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:82 msgid "Unable to copy SSR to clipboard." msgstr "无法复制 SSR 网址到剪贴板。" @@ -2071,38 +2136,38 @@ msgstr "无法复制 SSR 网址到剪贴板。" msgid "Unknown" msgstr "未知" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:185 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:217 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:16 msgid "Update All Subscribe Servers" msgstr "更新所有订阅服务器节点" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:162 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:194 msgid "Update Subscribe List" msgstr "更新订阅 URL 列表" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:74 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:134 msgid "Update cycle (Day/Week)" msgstr "更新周期(天/周)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:164 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:196 msgid "Update subscribe url list first" msgstr "修改订阅 URL 和节点关键字后,请先点击更新" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1062 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1116 msgid "Uplink Capacity(Default:Mbps)" msgstr "上行链路容量(默认:Mbps)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1443 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1545 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3 msgid "Upload" msgstr "上传" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:120 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:144 msgid "Use ChinaDNS-NG query and cache" msgstr "使用 ChinaDNS-NG 查询并缓存" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:168 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:196 msgid "Use DNS List File" msgstr "使用 DNS 列表文件" @@ -2115,12 +2180,12 @@ msgstr "使用 WAN 下发的 DNS" msgid "Use DNS from WAN and 114DNS" msgstr "使用 WAN 下发的 DNS 和 114DNS" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:132 msgid "Use DNS2SOCKS query and cache" msgstr "使用 DNS2SOCKS 查询并缓存" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:111 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:135 msgid "Use DNS2SOCKS-RUST query and cache" msgstr "使用 DNS2SOCKS-RUST 查询并缓存" @@ -2129,7 +2194,7 @@ msgstr "使用 DNS2SOCKS-RUST 查询并缓存" msgid "Use DNS2TCP query" msgstr "使用 DNS2TCP 查询" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:117 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:141 msgid "Use DNSPROXY query and cache" msgstr "使用 DNSPROXY 查询并缓存" @@ -2142,11 +2207,11 @@ msgstr "使用本机端口为 5335 的 DNS 服务" msgid "Use MOSDNS query (Not Support Oversea Mode)" msgstr "使用 MOSDNS 查询 (不支持海外用户回国模式)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 msgid "Use MosDNS query" msgstr "使用 MosDNS 查询" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1046 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1100 msgid "" "Use it together with the DNS disguised type. You can fill in any domain." msgstr "配合伪装类型 DNS 使用,可随便填一个域名。" @@ -2155,71 +2220,64 @@ msgstr "配合伪装类型 DNS 使用,可随便填一个域名。" msgid "User cancelled." msgstr "用户已取消。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:209 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:238 msgid "User-Agent" msgstr "用户代理(User-Agent)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:217 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:898 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:233 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:980 msgid "Userinfo format error." msgstr "用户信息格式错误。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:377 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:418 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:110 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:117 msgid "Username" msgstr "用户名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:484 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:525 msgid "Users Authentication" msgstr "用户验证" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:332 msgid "Using incorrect encryption mothod may causes service fail to start" msgstr "输入不正确的参数组合可能会导致服务无法启动" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:248 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:302 msgid "V2Ray/XRay" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:329 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:370 msgid "V2Ray/XRay protocol" msgstr "V2Ray/XRay 协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:330 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:371 msgid "VLESS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:779 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:820 msgid "VLESS Encryption" msgstr "VLESS 加密" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:331 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:372 msgid "VMess" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1027 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1037 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1081 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1091 msgid "VideoCall (SRTP)" msgstr "视频通话(SRTP)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1100 -msgid "" -"Virtual NIC TUN of Linux kernel can be used only when system supports and " -"have root permission. If used, IPv6 routing table 1023 is occupied." -msgstr "" -"需要系统支持且有 root 权限才能使用 Linux 内核的虚拟网卡 TUN,使用后会占用 " -"IPv6 的 1023 号路由表。" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:639 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:680 msgid "Vmess Protocol" msgstr "VMESS 协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:654 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:695 msgid "Vmess UUID" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:771 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:812 msgid "Vmess/VLESS ID (UUID)" msgstr "" @@ -2235,285 +2293,293 @@ msgstr "WAN IP 访问控制" msgid "WAN White List IP" msgstr "不走代理的 WAN IP" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:844 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:885 msgid "WebSocket Host" msgstr "WebSocket 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:850 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:891 msgid "WebSocket Path" msgstr "WebSocket 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1029 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1039 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1083 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1093 msgid "WechatVideo" msgstr "微信视频通话" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:96 msgid "When disabled shunt mode, will same time stopped shunt service." msgstr "当停用分流模式时,将同时停止分流服务。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:227 msgid "When disabled, all AAAA requests are not resolved." msgstr "当禁用时,不解析所有 AAAA 请求。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157 +msgid "When enabled, it occupies IPv6 routing table 1023." +msgstr "启用后,将占用 IPv6 路由表 1023。" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:216 msgid "When two or more DNS servers are deployed, enable this function." msgstr "当部署两台或两台以上 DNS 服务器时,需要启用该功能。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:189 msgid "" "When use DNS list file, please ensure list file exists and is formatted " "correctly." msgstr "当使用 DNS 列表文件时,请确保列表文件存在并且格式正确。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:335 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1041 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:376 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1085 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1095 msgid "WireGuard" msgstr "WireGuard 数据包" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1130 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1189 msgid "Wireguard allows only traffic from specific source IP." msgstr "Wireguard 仅允许特定源 IP 的流量。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1111 -msgid "Wireguard reserved bytes." -msgstr "Wireguard 保留字节。" - -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1084 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1138 msgid "Write Buffer Size" msgstr "写入缓冲区大小" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:905 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951 msgid "XHTTP Extra" msgstr "XHTTP 附加项" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:893 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:939 msgid "XHTTP Host" msgstr "XHTTP 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:884 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:930 msgid "XHTTP Mode" msgstr "XHTTP 模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:899 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:945 msgid "XHTTP Path" msgstr "XHTTP 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:215 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:24 -msgid "Xray" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:82 +msgid "Xray (Hysteria2)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:354 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:106 +msgid "Xray (ShadowSocks)" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:355 msgid "Xray Fragment Settings" msgstr "Xray 分片设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:384 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:383 msgid "Xray Noise Packets" msgstr "Xray 噪声数据包" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252 msgid "adblock_url" msgstr "广告屏蔽更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1015 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1069 msgid "aes-128-gcm" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1378 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1480 msgid "allow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1372 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1474 msgid "allow: Allows use Mux connection." msgstr "allow:允许走 Mux 连接。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1293 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1394 msgid "allowInsecure" msgstr "允许不安全连接" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1129 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1188 msgid "allowedIPs(optional)" msgstr "allowedIPs(可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1194 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1295 msgid "android" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:254 msgid "anti-AD" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1016 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1070 msgid "chacha20-poly1305" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:92 msgid "china-operator-ip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1190 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1291 msgid "chrome" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:180 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:208 msgid "cloudflare-dns.com DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1409 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1424 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1511 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1526 msgid "comment_tcpcongestion_disable" msgstr "系统默认值" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1342 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1444 msgid "concurrency" msgstr "TCP 最大并发连接数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1406 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1421 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:666 +msgid "connect" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1508 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1523 msgid "custom_tcpcongestion" msgstr "连接服务器节点的 TCP 拥塞控制算法" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1200 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1350 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1363 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1301 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1465 msgid "disable" msgstr "禁用" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:204 msgid "dns.sb DNSCrypt SDNS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1195 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1296 msgid "edge" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:192 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:221 msgid "fastest_addr" msgstr "最快响应" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:239 msgid "felixonmars/dnsmasq-china-list" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1191 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1292 msgid "firefox" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:994 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1048 msgid "gRPC Idle Timeout" msgstr "gPRC 空闲超时" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:967 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1021 msgid "gRPC Mode" msgstr "gRPC 模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:961 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1015 msgid "gRPC Service Name" msgstr "gRPC 服务名称" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:81 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82 msgid "gfwlist Update url" msgstr "GFW 列表更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:86 msgid "gfwlist/gfwlist" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1193 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1294 msgid "ios" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:189 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:219 msgid "load_balance" msgstr "负载均衡" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:692 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:733 msgid "lossless UDP relay using QUIC streams" msgstr "使用 QUIC 流的无损 UDP 中继" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:691 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:732 msgid "native UDP characteristics" msgstr "原生 UDP 特性" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:98 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99 msgid "nfip_url" msgstr "Netflix IP 段更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:409 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1179 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1280 msgid "none" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:439 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:480 msgid "obfs-local" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:220 msgid "parallel" msgstr "并行查询" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1197 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1298 msgid "qq" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1198 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1299 msgid "random" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1199 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1300 msgid "randomized" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1377 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 msgid "reject" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1192 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1293 msgid "safari" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:626 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:667 msgid "shadow-TLS SNI" msgstr "服务器名称指示" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:448 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:489 msgid "shadow-tls" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:604 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:645 msgid "shadowTLS protocol Version" msgstr "ShadowTLS 协议版本" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1379 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1481 msgid "skip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1373 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1475 msgid "" "skip: Not use Mux module to carry UDP 443 traffic, Use original UDP " "transmission method of proxy protocol." msgstr "" "skip:不使用 Mux 模块承载 UDP 443 流量,将使用代理协议原本的 UDP 传输方式。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271 msgid "spiderX" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83 msgid "v2fly/domain-list-community" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:442 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:483 msgid "v2ray-plugin" msgstr "" @@ -2525,18 +2591,40 @@ msgstr "有效的地址:端口" msgid "warning! Please do not reuse the port!" msgstr "警告!请不要重复使用端口!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:445 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:486 msgid "xray-plugin" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1355 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1457 msgid "xudpConcurrency" msgstr "UDP 最大并发连接数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1368 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1470 msgid "xudpProxyUDP443" msgstr "对被代理的 UDP/443 流量处理方式" +#~ msgid "IP Type" +#~ msgstr "IP 类型" + +#~ msgid "Invalid JSON format" +#~ msgstr "无效的 JSON 格式" + +#~ msgid "Limit the maximum number of splits." +#~ msgstr "限制分片的最大数量。" + +#~ msgid "Max Split" +#~ msgstr "最大分片数" + +#~ msgid "" +#~ "Virtual NIC TUN of Linux kernel can be used only when system supports and " +#~ "have root permission. If used, IPv6 routing table 1023 is occupied." +#~ msgstr "" +#~ "需要系统支持且有 root 权限才能使用 Linux 内核的虚拟网卡 TUN,使用后会占用 " +#~ "IPv6 的 1023 号路由表。" + +#~ msgid "Wireguard reserved bytes." +#~ msgstr "Wireguard 保留字节。" + #~ msgid "Applying configuration changes… %ds" #~ msgstr "正在等待配置被应用… %ds" diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr index 7984417f..90484ee7 100755 --- a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -1478,24 +1478,23 @@ start_xhttp_addr() { local xhttp_addr_file="/etc/ssrplus/xhttp_address.txt" local tmp_file="/tmp/.xhttp_addr.tmp" - # 收集所有 xhttp_extra 地址,去掉空行并去重排序 + # 收集所有节点的 download_address 值,去掉空行并去重排序 { for sec in "$GLOBAL_SERVER" "$SHUNT_SERVER" "$UDP_RELAY_SERVER"; do - local extra - extra=$(uci_get_by_name "$sec" xhttp_extra) - [ -n "$extra" ] && \ - echo "$extra" | sed -n 's/.*"address":[[:space:]]*"\([^"]*\)".*/\1/p' + local addr + addr=$(uci_get_by_name "$sec" download_address) + [ -n "$addr" ] && echo "$addr" done } | grep -v '^$' | sort -u > "$tmp_file" - # 如果没有 xhttp_extra 地址,删除旧文件并退出 + # 如果没有 download_address 地址,删除旧文件并退出 if [ ! -s "$tmp_file" ]; then [ -f "$xhttp_addr_file" ] && rm -f "$xhttp_addr_file" rm -f "$tmp_file" return 0 fi - # 比较 MD5 判断 xhttp_extra 地址是否有变化 + # 比较 MD5 判断 download_address 地址是否有变化 local md5_new md5_old md5_new=$(md5sum "$tmp_file" | awk '{print $1}') if [ -f "$xhttp_addr_file" ]; then @@ -1504,7 +1503,7 @@ start_xhttp_addr() { md5_old="" fi - # MD5 不同更新 xhttp_extra 地址文件 + # MD5 不同更新 download_address 地址文件 if [ "$md5_new" != "$md5_old" ]; then mv -f "$tmp_file" "$xhttp_addr_file" logger -t ssrplus-xhttp "xhttp_address.txt updated" diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index c76db768..a5bb7d9c 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -22,6 +22,35 @@ local xray_version_val = 0 local node_id = server_section local remarks = server.alias or "" +local b64decode = nixio.bin.b64decode + +local function base64Decode(text) + local raw = text + if not text or text == "" then + return '' + end + text = text:gsub("%z", "") + text = text:gsub("_", "/") + text = text:gsub("-", "+") + local mod4 = #text % 4 + text = text .. string.sub('====', mod4 + 1) + local result = b64decode(text) + if result then + return result:gsub("%z", "") + else + return raw + end +end + +local function cleanEmptyTables(t) + if type(t) ~= "table" then return nil end + for k, v in pairs(t) do + if type(v) == "table" then + t[k] = cleanEmptyTables(v) + end + end + return next(t) and t or nil +end -- 确保正确判断程序是否存在 local function is_finded(e) @@ -103,6 +132,25 @@ function socks_http() } end function wireguard() + -- 处理 reserved 字段,支持逗号分隔的数字或 Base64 编码 + local reserved = nil + if server.reserved then + local bytes = {} + if not server.reserved:match("[^%d,]+") then + -- 纯数字和逗号,解析为数字列表 + server.reserved:gsub("%d+", function(b) + bytes[#bytes + 1] = tonumber(b) + end) + else + -- Base64 编码的二进制数据 + local result = base64Decode(server.reserved) + for i = 1, #result do + bytes[i] = result:byte(i) + end + end + reserved = #bytes > 0 and bytes or nil + end + outbound_settings = { secretKey = server.private_key, address = server.local_addresses, @@ -116,7 +164,7 @@ function wireguard() } }, noKernelTun = (server.kernelmode == "1") and true or false, - reserved = server.reserved and { server.reserved } or nil, + reserved = reserved, mtu = tonumber(server.mtu) } end @@ -305,14 +353,22 @@ end mldsa65Verify = (server.enable_mldsa65verify == '1') and server.reality_mldsa65verify or nil, serverName = server.tls_host } or nil, - rawSettings = (server.transport == "raw" or server.transport == "tcp") and { + rawSettings = ((server.transport == "raw" or server.transport == "tcp") and (server.tcp_guise and server.tcp_guise ~= "none")) and { -- tcp header = { type = server.tcp_guise, request = (server.tcp_guise == "http") and { - -- request - path = {server.http_path} or {"/"}, - headers = {Host = {server.http_host} or {}} + path = server.http_path and (function() + local t, r = server.http_path, {} + for _, v in ipairs(t) do + r[#r + 1] = (v == "" and "/" or v) + end + return r + end)() or {"/"}, + headers = (server.http_path or server.user_agent) and { + Host = server.http_path, + ["User-Agent"] = server.user_agent and {server.user_agent} or nil + } or nil } or nil } } or nil, @@ -330,34 +386,45 @@ end -- ws host = server.ws_host or server.tls_host or nil, path = server.ws_path or "/", + headers = server.user_agent and { + ["User-Agent"] = server.user_agent + } or nil, maxEarlyData = tonumber(server.ws_ed) or nil, - earlyDataHeaderName = server.ws_ed_header or nil + earlyDataHeaderName = server.ws_ed_header or nil, + heartbeatPeriod = tonumber(server.ws_heartbeatPeriod) or nil } or nil, httpupgradeSettings = (server.transport == "httpupgrade") and { -- httpupgrade host = (server.httpupgrade_host or server.tls_host) or nil, - path = server.httpupgrade_path or "" + path = server.httpupgrade_path or "", + headers = server.user_agent and { + ["User-Agent"] = server.user_agent + } or nil } or nil, xhttpSettings = (server.transport == "xhttp" or server.transport == "splithttp") and { -- xhttp mode = server.xhttp_mode or "auto", host = (server.xhttp_host or server.tls_host) or nil, path = server.xhttp_path or "/", - extra = (server.enable_xhttp_extra == "1" and server.xhttp_extra) and (function() - local success, parsed = pcall(json.parse, server.xhttp_extra) - if not success or not parsed then return nil end - -- 如果包含 "extra" 节,就使用它,否则直接使用 tbl - local tbl = parsed.extra or parsed - -- 枚举第1层字段,如果值为空表或 nil 就删除(简单容错) - for k, v in pairs(tbl) do - if type(v) == "table" and next(v) == nil then - tbl[k] = nil - elseif v == nil then - tbl[k] = nil + extra = (function() + local extra = {} + -- 解析 xhttp_extra(Base64 编码的 JSON) + if (server.enable_xhttp_extra == "1" and server.xhttp_extra) then + local ok, parsed = pcall(json.parse, base64Decode(server.xhttp_extra)) + if ok and type(parsed) == "table" then + extra = parsed.extra or parsed -- 取 "extra" 节,若无则整个 parsed end end - return tbl - end)() or nil + -- 处理 User-Agent + if server.user_agent and server.user_agent ~= "" then + extra.headers = extra.headers or {} + if not extra.headers["User-Agent"] and not extra.headers["user-agent"] then + extra.headers["User-Agent"] = server.user_agent + end + end + -- 递归清理空表(如空 headers 会被删除) + return cleanEmptyTables(extra) + end)() } or nil, httpSettings = (server.transport == "h2") and { -- h2 @@ -374,12 +441,13 @@ end } or nil, grpcSettings = (server.transport == "grpc") and { -- grpc - serviceName = server.serviceName or "", - multiMode = (server.grpc_mode == "multi") and true or false, - idle_timeout = tonumber(server.idle_timeout) or nil, - health_check_timeout = tonumber(server.health_check_timeout) or nil, + serviceName = (server.serviceName and server.serviceName ~= "") and server.serviceName or nil, + multiMode = (server.grpc_mode == "multi") and true or nil, + idle_timeout = server.idle_timeout and (tonumber(server.idle_timeout) < 10 and 10 or tonumber(server.idle_timeout)) or nil, + health_check_timeout = server.health_check_timeout and tonumber(server.health_check_timeout) or nil, permit_without_stream = (server.permit_without_stream == "1") and true or nil, - initial_windows_size = tonumber(server.initial_windows_size) or nil + initial_windows_size = server.initial_windows_size and tonumber(server.initial_windows_size) or nil, + user_agent = server.user_agent } or nil, hysteriaSettings = (server.v2ray_protocol == "hysteria2") and { -- hysteria2 @@ -409,35 +477,43 @@ end keepAlivePeriod = (server.flag_quicparam == "1" and server.keepaliveperiod) and tonumber(server.keepaliveperiod) or nil, disablePathMTUDiscovery = (server.flag_quicparam == "1" and tostring(server.disablepathmtudiscovery) == "1") and true or nil } or nil, - finalmask = (server.transport == "kcp") and { - udp = (function() - local t = {} + finalmask = (function() + local finalmask + if server.transport == "kcp" then local map = {none = "none", srtp = "header-srtp", utp = "header-utp", ["wechat-video"] = "header-wechat", dtls = "header-dtls", wireguard = "header-wireguard", dns = "header-dns"} + local udp = {} if server.kcp_guise and server.kcp_guise ~= "none" then local g = { type = map[server.kcp_guise] } if server.kcp_guise == "dns" and server.kcp_domain and server.kcp_domain ~= "" then g.settings = { domain = server.kcp_domain } end - t[#t + 1] = g + udp[#udp+1] = g end local c = { type = (server.seed and server.seed ~= "") and "mkcp-aes128gcm" or "mkcp-original" } if server.seed and server.seed ~= "" then c.settings = { password = server.seed } end - t[#t + 1] = c - return t - end)() - } or (server.flag_obfs == "1" and (server.v2ray_protocol == "hysteria2" and server.obfs_type and server.obfs_type ~= "")) and { - udp = { - { - type = server.obfs_type, - settings = server.salamander and { - password = server.salamander - } or nil + udp[#udp+1] = c + finalmask = { udp = udp } + elseif (server.flag_obfs == "1" and (server.v2ray_protocol == "hysteria2" and server.obfs_type and server.obfs_type ~= "")) then + finalmask = { + udp = {{ + type = server.obfs_type, + settings = server.salamander and { + password = server.salamander + } or nil + }} } - } - } or nil, + end + if server.finalmask and server.finalmask ~= "" then + local ok, fm = pcall(json.parse, base64Decode(server.finalmask)) + if ok and type(fm) == "table" then + finalmask = fm + end + end + return cleanEmptyTables(finalmask) + end)(), sockopt = { mark = 250, tcpFastOpen = (function() @@ -474,17 +550,15 @@ if xray_fragment.fragment ~= "0" or (xray_fragment.noise ~= "0" and xray_noise.e settings = { domainStrategy = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and xray_noise.domainStrategy, fragment = (xray_fragment.fragment == "1") and { - packets = (xray_fragment.fragment_packets ~= "") and xray_fragment.fragment_packets or nil, - length = (xray_fragment.fragment_length ~= "") and xray_fragment.fragment_length or nil, - interval = (xray_fragment.fragment_interval ~= "") and xray_fragment.fragment_interval or nil, - maxSplit = (xray_fragment.fragment_maxsplit ~= "") and xray_fragment.fragment_maxsplit or nil + packets = (xray_fragment.fragment_packets and xray_fragment.fragment_packets ~= "") and xray_fragment.fragment_packets or nil, + length = (xray_fragment.fragment_length and xray_fragment.fragment_length ~= "") and xray_fragment.fragment_length or nil, + interval = (xray_fragment.fragment_interval and xray_fragment.fragment_interval ~= "") and xray_fragment.fragment_interval or nil } or nil, noises = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and { { type = xray_noise.type, packet = xray_noise.packet, - delay = xray_noise.delay:find("-") and xray_noise.delay or tonumber(xray_noise.delay), - applyTo = xray_noise.applyto + delay = xray_noise.delay:find("-") and xray_noise.delay or tonumber(xray_noise.delay) } } or nil }, @@ -752,10 +826,10 @@ local tuic = { certificates = server.certificate and { server.certpath } or nil, udp_relay_mode = server.udp_relay_mode, congestion_control = server.congestion_control, - heartbeat = server.heartbeat and server.heartbeat .. "s" or nil, - timeout = server.timeout and server.timeout .. "s" or nil, - gc_interval = server.gc_interval and server.gc_interval .. "s" or nil, - gc_lifetime = server.gc_lifetime and server.gc_lifetime .. "s" or nil, + heartbeat = server.heartbeat and tonumber(server.heartbeat) .. "s" or nil, + timeout = server.timeout and tonumber(server.timeout) .. "s" or nil, + gc_interval = server.gc_interval and tonumber(server.gc_interval) .. "s" or nil, + gc_lifetime = server.gc_lifetime and tonumber(server.gc_lifetime) .. "s" or nil, alpn = (server.tuic_alpn and server.tuic_alpn ~= "") and (function() local alpn = {} string.gsub(server.tuic_alpn, '[^,]+', function(w) diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/hy2_test.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/hy2_test.sh new file mode 100755 index 00000000..1bac264d --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/hy2_test.sh @@ -0,0 +1,175 @@ +#!/bin/sh +# /usr/share/shadowsocksr/test.sh + +CONFIG="shadowsocksr" +LOCK_PATH=/tmp/lock +TMP_PATH=/var/etc/ssrplus + +uci_get_by_name() { + local ret=$(uci -q get $CONFIG.$1.$2 2>/dev/null) + echo "${ret:=$3}" +} + +uci_get_by_type() { + local ret=$(uci -q get $CONFIG.@$1[0].$2 2>/dev/null) + echo "${ret:=$3}" +} + +check_port_exists() { + local port=$1 + local protocol=$2 + [ -n "$protocol" ] || protocol="tcp,udp" + local result= + if [ "$protocol" = "tcp" ]; then + result=$(netstat -tln | grep -c ":$port ") + elif [ "$protocol" = "udp" ]; then + result=$(netstat -uln | grep -c ":$port ") + elif [ "$protocol" = "tcp,udp" ]; then + result=$(netstat -tuln | grep -c ":$port ") + fi + echo "${result}" +} + +set_cache_var() { + local key="${1}" + shift 1 + local val="$@" + [ -n "${key}" ] && [ -n "${val}" ] && { + sed -i "/${key}=/d" $TMP_PATH/var >/dev/null 2>&1 + echo "${key}=\"${val}\"" >> $TMP_PATH/var + eval ${key}=\"${val}\" + } +} + +get_cache_var() { + local key="${1}" + [ -n "${key}" ] && [ -s "$TMP_PATH/var" ] && { + echo $(cat $TMP_PATH/var | grep "^${key}=" | awk -F '=' '{print $2}' | tail -n 1 | awk -F'"' '{print $2}') + } +} + +#uci_get_by_port() { +# local port=$1 +# while netstat -tuln 2>/dev/null | grep -q ":${port} "; do +# port=$((port + 1)) +# done +# echo $port + +uci_get_by_port() { + local default_start_port=2001 + local min_port=1025 + local max_port=49151 + local port="$1" + local protocol=$(echo "$2" | tr 'A-Z' 'a-z') + local LOCK_FILE="${LOCK_PATH}/${CONFIG}_get_prot.lock" + while ! mkdir "$LOCK_FILE" 2>/dev/null; do + sleep 1 + done + if [ "$port" = "auto" ]; then + local now last_time diff last_port + now=$(date +%s 2>/dev/null) + last_time=$(get_cache_var "last_get_new_port_time") + if [ -n "$now" ] && [ -n "$last_time" ]; then + diff=$(expr "$now" - "$last_time") + [ "$diff" -lt 0 ] && diff=$(expr 0 - "$diff") + else + diff=999 + fi + if [ "$diff" -gt 10 ]; then + port=$default_start_port + else + last_port=$(get_cache_var "last_get_new_port_auto") + if [ -n "$last_port" ]; then + port=$(expr "$last_port" + 1) + else + port=$default_start_port + fi + fi + fi + [ "$port" -lt $min_port -o "$port" -gt $max_port ] && port=$default_start_port + local start_port="$port" + while :; do + if [ "$(check_port_exists "$port" "$protocol")" = 0 ]; then + break + fi + port=$(expr "$port" + 1) + if [ "$port" -gt $max_port ]; then + port=$min_port + fi + [ "$port" = "$start_port" ] && { + rmdir "$LOCK_FILE" 2>/dev/null + return 1 + } + done + if [ "$1" = "auto" ]; then + set_cache_var "last_get_new_port_auto" "$port" + [ -n "$now" ] && set_cache_var "last_get_new_port_time" "$now" + fi + rmdir "$LOCK_FILE" 2>/dev/null + echo "$port" +} + +url_test_hy2() { + local node_id=$1 + + # 读取配置 + local server=$(uci_get_by_name ${node_id} server) + local port=$(uci_get_by_name ${node_id} server_port) + local auth=$(uci_get_by_name ${node_id} hy2_auth) + local tls=$(uci_get_by_name ${node_id} tls) + local insecure=$(uci_get_by_name ${node_id} insecure) + local tls_host=$(uci_get_by_name ${node_id} tls_host) + + # 获取本地端口 + # local tmp_port=$(uci_get_by_port 48900 tcp,udp) + local tmp_port=$(uci_get_by_port auto tcp,udp) + + # 生成Hysteria2配置文件 + local config_file="/tmp/hy2_test_${node_id}.yaml" + cat > "$config_file" <<-EOF + server: ${server}:${port} + auth: "${auth}" + tls: + insecure: true + EOF + + # 如果 tls_host 非空,动态添加 sni 行 + [ -n "$tls_host" ] && echo " sni: \"${tls_host}\"" >> "$config_file" + + # 追加 socks5 监听配置 + cat >> "$config_file" <<-EOF + socks5: + listen: 127.0.0.1:${tmp_port} + EOF + + # echo "Debug: 配置文件已生成: $config_file" >&2 + + # 启动Hysteria2客户端 + hysteria client --disable-update-check -c "$config_file" >/dev/null 2>&1 & + local pid=$! + echo $pid > "/tmp/hy2_test_${node_id}.pid" + + # 等待端口启动 + sleep 1 + + # 测试代理 + # local result=$(curl --connect-timeout 3 --max-time 3 -s -o /dev/null -I -w "%{http_code}:%{time_pretransfer}" --socks5 127.0.0.1:${tmp_port} "${probeUrl}" 2>/dev/null) + local curlx="socks5h://127.0.0.1:${tmp_port}" + local probeUrl=$(uci_get_by_type server_subscribe url_test_url https://www.google.com/generate_204) + local result=$(curl --connect-timeout 3 --max-time 5 -o /dev/null -I -skL -w "%{http_code}:%{time_pretransfer}" -x ${curlx} "${probeUrl}" 2>/dev/null) + + # 清理 + # kill -9 $pid 2>/dev/null + local pid_file="/tmp/hy2_test_${node_id}.pid" + [ -s "$pid_file" ] && kill -9 "$(head -n 1 "$pid_file")" >/dev/null 2>&1 + pgrep -af "hysteria.*${config_file}" | awk '! /test\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1 + rm -f "$config_file" "$pid_file" + + echo $result +} + +case $1 in + url_test_hy2) + url_test_hy2 $2 + ;; +esac \ No newline at end of file diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/shadowsocksr.config b/luci-app-ssr-plus/root/usr/share/shadowsocksr/shadowsocksr.config index 8fd94d85..177caac0 100644 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/shadowsocksr.config +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/shadowsocksr.config @@ -28,6 +28,7 @@ config server_subscribe option auto_update_day_time '2' option auto_update_min_time '0' option ss_type 'ss-rust' + option url_test_url 'https://www.google.com/generate_204' option user_agent 'v2rayN/9.99' option xray_hy2_type 'hysteria2' option filter_words '过期/套餐/剩余/QQ群/官网/防失联/回国' diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua index 9ee5a78d..af1bc987 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua @@ -16,6 +16,7 @@ local tinsert = table.insert local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub local jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify local b64decode = nixio.bin.b64decode +local b64encode = nixio.bin.b64encode local URL = require "url" local cache = {} local nodeResult = setmetatable({}, {__index = cache}) -- update result @@ -34,20 +35,34 @@ local ss_type = ucic:get_first(name, 'server_subscribe', 'ss_type', 'ss-rust') -- 根据 ss_type 选择对应的程序 local ss_program = "sslocal" if ss_type == "ss-rust" then - ss_program = "sslocal" -- Rust 版本使用 sslocal + ss_program = "sslocal" elseif ss_type == "ss-libev" then - ss_program = "ss-redir" -- Libev 版本使用 ss-redir + ss_program = "ss-redir" +elseif ss_type == "v2ray" then + ss_program = "xray" end -- 从 UCI 配置读取 xray_hy2_type 设置 local xray_hy2_type = ucic:get_first(name, 'server_subscribe', 'xray_hy2_type', 'hysteria2') local xray_hy2_program = "hysteria" -if xray_hy2_type == "xray" then +if xray_hy2_type == "v2ray" then xray_hy2_program = "xray" -- Hysteria2 使用 Xray elseif xray_hy2_type == "hysteria2" then xray_hy2_program = "hysteria" -- Hysteria2 使用 Hysteria end -local v2_ss = luci.sys.exec('type -t -p ' .. ss_program .. ' 2>/dev/null') ~= "" and "ss" or "v2ray" -local has_ss_type = luci.sys.exec('type -t -p ' .. ss_program .. ' 2>/dev/null') ~= "" and ss_type +local v2_ss_exists = luci.sys.exec('type -t -p ' .. ss_program .. ' 2>/dev/null') ~= "" +-- 初始化变量 +local v2_ss = nil +local has_v2_ss_type = nil +if v2_ss_exists then + if ss_type == "v2ray" then + -- 使用 Xray + v2_ss = "v2ray" + has_v2_ss_type = "shadowsocks" + else + -- 使用 SS (rust 或 libev) + v2_ss = "ss" + end +end local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray" -- 检查程序是否存在 local program_exists = luci.sys.exec('type -t -p ' .. xray_hy2_program .. ' 2>/dev/null') ~= "" @@ -176,6 +191,21 @@ local function base64Decode(text) return raw end end +local function base64Encode(text) + if not text or text == "" then + return '' + end + local result = b64encode(text) + if result then + result = result:gsub("%z", "") + result = result:gsub("/", "_") + result = result:gsub("+", "-") + result = result:gsub("=", "") + return result + else + return text + end +end -- 检查数组(table)中是否存在某个字符值 -- https://www.04007.cn/article/135.html local function checkTabValue(tab) @@ -196,7 +226,7 @@ local function isCompleteJSON(str) return success end -- 处理数据 -local function processData(szType, content) +local function processData(szType, content, cfgid) local result = {type = szType, local_port = 1234, kcp_param = '--nocomp'} -- 检查JSON的格式如不完整丢弃 if not (szType == "sip008" or szType == "ssd") then @@ -215,17 +245,24 @@ local function processData(szType, content) -- log(k.."="..v) -- end - -- 如果 hy2 程序未安装则跳过订阅 - if not (hy2_type or has_xray_hy2_type) then + -- 如果 hy2 或 Xray 程序未安装则跳过订阅 + if not hy2_type then return nil end if xray_hy2_type == "hysteria2" then - if params.protocol then + if params.protocol and params.protocol ~= "" then result.flag_transport = "1" - result.transport_protocol = params.protocol or "udp" + result.transport_protocol = params.protocol + else + result.flag_transport = "1" + result.transport_protocol = "udp" end - if params.pinSHA256 then + if params.fm and params.fm ~= "" then + result.enable_finalmask = "1" + result.finalmask = base64Encode(params.fm) + end + if params.pinSHA256 and params.pinSHA256 ~= "" then result.pinsha256 = params.pinSHA256 end else @@ -233,7 +270,6 @@ local function processData(szType, content) end result.alias = url.fragment and UrlDecode(url.fragment) or nil - result.xray_hy2_type = xray_hy2_type result.type = hy2_type result.server = url.host result.server_port = url.port or 443 @@ -379,14 +415,14 @@ local function processData(szType, content) -- 检查 extra 参数是否存在且非空 if info.extra and info.extra ~= "" then result.enable_xhttp_extra = "1" - result.xhttp_extra = info.extra + result.xhttp_extra = base64Encode(info.extra) end -- 尝试解析 JSON 数据 local success, Data = pcall(jsonParse, info.extra or "") if success and type(Data) == "table" then local address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address) or (Data.downloadSettings and Data.downloadSettings.address) - result.download_address = (address and address ~= "") and address or nil + result.download_address = (address and address ~= "") and address:gsub("^%[", ""):gsub("%]$", "") else -- 如果解析失败,清空下载地址 result.download_address = nil @@ -430,6 +466,11 @@ local function processData(szType, content) if info.security then result.security = info.security end + if info.fm and info.fm ~= "" then + info.fm = UrlDecode(info.fm) + result.enable_finalmask = "1" + result.finalmask = base64Encode(info.fm) + end if info.tls == "tls" or info.tls == "1" then result.tls = "1" result.fingerprint = info.fp @@ -490,7 +531,12 @@ local function processData(szType, content) end end - if not params.type or params.type == "" then + if params.tfo and params.tfo ~= "" then + -- 处理 fast open 参数 + result.fast_open = params.tfo + end + + if v2_ss ~= "v2ray" then local is_old_format = find_index:find("@") and not find_index:find("://.*@") local old_base64, host_port, userinfo, server, port, method, password @@ -557,23 +603,17 @@ local function processData(szType, content) end -- 如果 SS 程序未安装则跳过订阅 - if not (v2_ss or has_ss_type) then + if not v2_ss then return nil end -- 填充 result result.type = v2_ss - result.has_ss_type = has_ss_type result.encrypt_method_ss = method result.password = password result.server = server result.server_port = port - if params.tfo then - -- 处理 fast open 参数 - result.fast_open = params.tfo - end - -- 插件处理 if params.plugin then local plugin_info = UrlDecode(params.plugin) @@ -638,9 +678,13 @@ local function processData(szType, content) local url = URL.parse("http://" .. info) local params = url.query - v2_ss = "v2ray" + -- 如果 Xray 程序未安装则跳过订阅 + if not v2_ss then + return nil + end + result.type = v2_ss - result.v2ray_protocol = "shadowsocks" + result.v2ray_protocol = has_v2_ss_type result.server = url.host result.server_port = url.port @@ -655,6 +699,11 @@ local function processData(szType, content) result.encrypt_method_ss = params.encryption or "none" end + if params.udp then + -- 处理 udp 参数 + result.uot = params.udp + end + result.transport = params.type or "raw" if result.transport == "tcp" then result.transport = "raw" @@ -690,6 +739,11 @@ local function processData(szType, content) result.enable_ech = "1" result.ech_config = params.ech end + -- 检查 finalmaskg 参数是否存在且非空 + if params.fm and params.fm ~= "" then + result.enable_finalmask = "1" + result.finalmaskg = base64Encode(params.fm) + end -- 检查 pqv 参数是否存在且非空 if params.pqv and params.pqv ~= "" then result.enable_mldsa65verify = "1" @@ -714,14 +768,14 @@ local function processData(szType, content) -- 检查 extra 参数是否存在且非空 if params.extra and params.extra ~= "" then result.enable_xhttp_extra = "1" - result.xhttp_extra = params.extra + result.xhttp_extra = base64Encode(params.extra) end -- 尝试解析 JSON 数据 local success, Data = pcall(jsonParse, params.extra or "") if success and type(Data) == "table" then local address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address) or (Data.downloadSettings and Data.downloadSettings.address) - result.download_address = address and address ~= "" and address or nil + result.download_address = (address and address ~= "") and address:gsub("^%[", ""):gsub("%]$", "") else -- 如果解析失败,清空下载地址 result.download_address = nil @@ -760,8 +814,12 @@ local function processData(szType, content) end elseif szType == "sip008" then result.type = v2_ss - result.v2ray_protocol = (v2_ss == "v2ray") and "shadowsocks" or nil - result.has_ss_type = has_ss_type + if v2_ss ~= "v2ray" then + result.has_ss_type = has_ss_type + else + result.xray_has_ss_type = "v2ray" + result.v2ray_protocol = has_v2_ss_type + end result.server = content.server result.server_port = content.server_port result.password = content.password @@ -774,8 +832,12 @@ local function processData(szType, content) end elseif szType == "ssd" then result.type = v2_ss - result.v2ray_protocol = (v2_ss == "v2ray") and "shadowsocks" or nil - result.has_ss_type = has_ss_type + if v2_ss ~= "v2ray" then + result.has_ss_type = has_ss_type + else + result.xray_has_ss_type = "v2ray" + result.v2ray_protocol = has_v2_ss_type + end result.server = content.server result.server_port = content.port result.password = content.password @@ -883,6 +945,11 @@ local function processData(szType, content) result.enable_ech = "1" result.ech_config = params.ech end + -- 检查 finalmaskg 参数是否存在且非空 + if params.fm and params.fm ~= "" then + result.enable_finalmask = "1" + result.finalmaskg = base64Encode(params.fm) + end -- 处理传输协议 result.transport = params.type or "raw" -- 默认传输协议为 raw if result.transport == "tcp" then @@ -910,14 +977,14 @@ local function processData(szType, content) -- 检查 extra 参数是否存在且非空 if params.extra and params.extra ~= "" then result.enable_xhttp_extra = "1" - result.xhttp_extra = params.extra + result.xhttp_extra = base64Encode(params.extra) end -- 尝试解析 JSON 数据 local success, Data = pcall(jsonParse, params.extra or "") if success and type(Data) == "table" then local address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address) or (Data.downloadSettings and Data.downloadSettings.address) - result.download_address = address and address ~= "" and address or nil + result.download_address = (address and address ~= "") and address:gsub("^%[", ""):gsub("%]$", "") else -- 如果解析失败,清空下载地址 result.download_address = nil @@ -1007,6 +1074,18 @@ local function processData(szType, content) end end + -- ECH 参数(TLS 才有) + if security == "tls" and params.ech and params.ech ~= "" then + result.enable_ech = "1" + result.ech_config = params.ech + end + + -- 处理 finalmask 参数 + if params.fm and params.fm ~= "" then + result.enable_finalmask = "1" + result.finalmask = base64Encode(params.fm) + end + -- 处理 pinsha256 参数 if params.pcs and params.pcs ~= "" then result.tls_CertSha = params.pcs @@ -1023,19 +1102,13 @@ local function processData(szType, content) result.reality_shortid = params.sid result.reality_spiderx = params.spx and UrlDecode(params.spx) or nil - -- PQ 验证参数 + -- PQV 验证参数 if params.pqv and params.pqv ~= "" then result.enable_mldsa65verify = "1" result.reality_mldsa65verify = params.pqv end end - -- ECH 参数(TLS 才有) - if security == "tls" and params.ech and params.ech ~= "" then - result.enable_ech = "1" - result.ech_config = params.ech - end - -- 各种传输类型 if result.transport == "ws" then result.ws_host = (result.tls ~= "1" and result.reality ~= "1") and (params.host and UrlDecode(params.host)) or nil @@ -1055,13 +1128,13 @@ local function processData(szType, content) end if params.extra and params.extra ~= "" then result.enable_xhttp_extra = "1" - result.xhttp_extra = params.extra + result.xhttp_extra = base64Encode(params.extra) end local success, Data = pcall(jsonParse, params.extra or "") if success and type(Data) == "table" then local address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address) or (Data.downloadSettings and Data.downloadSettings.address) - result.download_address = address and address ~= "" and address or nil + result.download_address = (address and address ~= "") and address:gsub("^%[", ""):gsub("%]$", "") else result.download_address = nil end @@ -1254,20 +1327,27 @@ local function write_new_md5(groupHash, md5) end -- curl -local function curl(url) - -- 清理 URL 中的隐藏字符 - url = url:gsub("%s+$", ""):gsub("^%s+", ""):gsub("%z", "") - - -- 构建curl命令(确保 user_agent 为空时不添加 -A 参数) +local function curl(url, user_agent) + -- 清理 URL 中的隐藏字符和前后空白 + url = url:gsub("%s+$", ""):gsub("^%s+", ""):gsub("%z", ""):gsub("[\r\n]", "") + -- 处理 user_agent 参数 + local ua_opt = "" + if user_agent and user_agent ~= "" then + -- 转义双引号,防止破坏 -A 参数 + local safe_ua = user_agent:gsub("[\r\n]", ""):gsub('[\\"`$]', '\\%0') -- 安全转义 + ua_opt = '-A "' .. safe_ua .. '"' + end + -- 安全转义 URL:用单引号包裹,并转义内部的单引号 + local safe_url = "'" .. url:gsub("'", "'\\''") .. "'" local cmd = string.format( - 'curl -sSL --connect-timeout 20 --max-time 30 --retry 3 %s --insecure --location "%s"', - user_agent ~= "" and ('-A "' .. user_agent .. '"') or "", -- 添加 or "" 处理 nil 情况 - url:gsub('["$`\\]', '\\%0') -- 安全转义 + 'curl -sSL --connect-timeout 20 --max-time 30 --retry 3 -H "Accept-Encoding: identity" %s --insecure --location %s', + ua_opt, + safe_url ) - + -- 执行命令并获取输出 local stdout = luci.sys.exec(cmd) - stdout = trim(stdout) - local md5 = md5_string(stdout) + stdout = trim(stdout) -- 确保 trim 函数存在 + local md5 = md5_string(stdout) -- 确保 md5_string 函数存在 return stdout, md5 end @@ -1498,13 +1578,43 @@ local execute = function() end end end) - for k, v in ipairs(nodeResult) do - for kk, vv in ipairs(v) do + -- 1583-1620 行为生成 sid + -- 记录已使用编号 + local used_sid = {} + local next_sid = 1 + -- 扫描已有 section + ucic:foreach(name, uciType, function(s) + local num = s[".name"]:match("^cfg(%x%x)") -- 提取两位十六进制序号 + if num then + local n = tonumber(num, 16) + used_sid[n] = true + end + end) + -- 获取下一个可用编号(O(1)) + local function get_next_sid() + while used_sid[next_sid] do + next_sid = next_sid + 1 + end + used_sid[next_sid] = true + return next_sid + end + for _, v in ipairs(nodeResult) do + for _, vv in ipairs(v) do if not vv._ignore then - local section = ucic:add(name, uciType) - ucic:tset(name, section, vv) - ucic:set(name, section, "switch_enable", switch) - add = add + 1 + local sid = ucic:add(name, uciType) + if sid then + local suffix = sid:sub(-4) + ucic:delete(name, sid) + local id = get_next_sid() + local cfgid = string.format("cfg%02x%s", id, suffix) + local section = ucic:section(name, uciType, cfgid) + if section then + ucic:tset(name, section, vv) + ucic:set(name, section, "switch_enable", switch) + add = add + 1 + end + end + end end end