Compare commits

...

24 Commits

Author SHA1 Message Date
semantic-release-bot 7f3cac3c1c 🔖 chore(release): v1.1.5 [skip ci]
## [1.1.5](https://github.com/perfect-panel/ppanel-web/compare/v1.1.4...v1.1.5) (2025-07-26)

### 🐛 Bug Fixes

* **subscribe**: Filter out items that are not marked as visible in subscription list ([32253e3](https://github.com/perfect-panel/ppanel-web/commit/32253e3))
2025-07-26 10:55:38 +00:00
web 32253e3717 🐛 fix(subscribe): Filter out items that are not marked as visible in subscription list 2025-07-26 03:49:53 -07:00
semantic-release-bot a76471a806 🔖 chore(release): v1.1.4 [skip ci]
## [1.1.4](https://github.com/perfect-panel/ppanel-web/compare/v1.1.3...v1.1.4) (2025-07-25)

### 🐛 Bug Fixes

* **locales**: Simplify "show" label in subscription localization files ([d53a006](https://github.com/perfect-panel/ppanel-web/commit/d53a006))
* **order**: Preserve last successful order on error during order creation ([2fb98be](https://github.com/perfect-panel/ppanel-web/commit/2fb98be))
* **subscribe**: Filter out hidden items in subscription list display ([634be37](https://github.com/perfect-panel/ppanel-web/commit/634be37))
2025-07-25 14:22:31 +00:00
web d53a00611e 🐛 fix(locales): Simplify "show" label in subscription localization files 2025-07-25 07:18:54 -07:00
web 2fb98be591 🐛 fix(order): Preserve last successful order on error during order creation 2025-07-25 07:07:31 -07:00
web 634be371b1 🐛 fix(subscribe): Filter out hidden items in subscription list display 2025-07-25 07:06:53 -07:00
semantic-release-bot ffa5c86d23 🔖 chore(release): v1.1.3 [skip ci]
## [1.1.3](https://github.com/perfect-panel/ppanel-web/compare/v1.1.2...v1.1.3) (2025-07-24)

### 🐛 Bug Fixes

* **auth**: Implement user redirection to dashboard upon authentication ([f84f98c](https://github.com/perfect-panel/ppanel-web/commit/f84f98c))
2025-07-24 17:13:32 +00:00
web f84f98c80f 🐛 fix(auth): Implement user redirection to dashboard upon authentication 2025-07-24 10:10:31 -07:00
semantic-release-bot e8ea597664 🔖 chore(release): v1.1.2 [skip ci]
## [1.1.2](https://github.com/perfect-panel/ppanel-web/compare/v1.1.1...v1.1.2) (2025-07-24)

### 🐛 Bug Fixes

* **billing**: Add display for gift amount in subscription billing ([04af2f9](https://github.com/perfect-panel/ppanel-web/commit/04af2f9))
* **order**: Update subscription cell to display name and quantity ([96eba17](https://github.com/perfect-panel/ppanel-web/commit/96eba17))
* **tool**: Added API for obtaining version, updated version information display logic ([2675034](https://github.com/perfect-panel/ppanel-web/commit/2675034))
2025-07-24 13:00:38 +00:00
web 04af2f9433 🐛 fix(billing): Add display for gift amount in subscription billing 2025-07-24 05:55:56 -07:00
web 96eba171d5 🐛 fix(order): Update subscription cell to display name and quantity 2025-07-24 05:34:57 -07:00
web 2675034b75 🐛 fix(tool): Added API for obtaining version, updated version information display logic 2025-07-24 05:15:38 -07:00
semantic-release-bot 8f772c2364 🔖 chore(release): v1.1.1 [skip ci]
## [1.1.1](https://github.com/perfect-panel/ppanel-web/compare/v1.1.0...v1.1.1) (2025-07-20)

### 🐛 Bug Fixes

* **node-table**: Update translations for headers and no data display ([eec0b12](https://github.com/perfect-panel/ppanel-web/commit/eec0b12))
* **rules**: Change rule type from 'auto' to 'default' and update ([3e290d7](https://github.com/perfect-panel/ppanel-web/commit/3e290d7))
* **rules**: Update rule settings ([3304a55](https://github.com/perfect-panel/ppanel-web/commit/3304a55))
* **subscribe-form**: Optimize discount calculation logic and debounce updates ([166e48f](https://github.com/perfect-panel/ppanel-web/commit/166e48f))
* **tutorial**: Comment out unused getVersion function and simplify getVersionPath ([7cdc6bd](https://github.com/perfect-panel/ppanel-web/commit/7cdc6bd))
* **tutorial**: Return latest version in case of fetch error ([1fb305e](https://github.com/perfect-panel/ppanel-web/commit/1fb305e))
2025-07-20 10:24:58 +00:00
web 166e48f442 🐛 fix(subscribe-form): Optimize discount calculation logic and debounce updates 2025-07-20 03:20:59 -07:00
web eec0b12154 🐛 fix(node-table): Update translations for headers and no data display 2025-07-20 03:00:59 -07:00
web 3e290d7cb5 🐛 fix(rules): Change rule type from 'auto' to 'default' and update 2025-07-17 03:30:12 -07:00
web 3304a55fd4 🐛 fix(rules): Update rule settings 2025-07-16 09:16:33 -07:00
web 7cdc6bdd8f 🐛 fix(tutorial): Comment out unused getVersion function and simplify getVersionPath 2025-07-11 02:58:37 -07:00
web 1fb305e7a1 🐛 fix(tutorial): Return latest version in case of fetch error 2025-07-11 01:56:42 -07:00
semantic-release-bot 7f81de31ab 🔖 chore(release): v1.1.0 [skip ci]
# [1.1.0](https://github.com/perfect-panel/ppanel-web/compare/v1.0.2...v1.1.0) (2025-07-06)

###  Features

* **view**: Add AnyTLS protocol support and enhance node configuration options ([bcfb10a](https://github.com/perfect-panel/ppanel-web/commit/bcfb10a))
2025-07-06 11:59:27 +00:00
web bcfb10a6c7 feat(view): Add AnyTLS protocol support and enhance node configuration options 2025-07-06 04:56:00 -07:00
semantic-release-bot 9235fef3c6 🔖 chore(release): v1.0.2 [skip ci]
## [1.0.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.1...v1.0.2) (2025-06-29)

### 🐛 Bug Fixes

* **subscription**: User subscription information ([7d18ff6](https://github.com/perfect-panel/ppanel-web/commit/7d18ff6))
2025-06-29 09:19:10 +00:00
web@ppanel ee0c3371f7 Merge branch 'main' into develop 2025-06-29 08:39:58 +00:00
web@ppanel 7d18ff6825 🐛 fix(subscription): User subscription information 2025-06-29 08:33:43 +00:00
125 changed files with 1810 additions and 908 deletions
+406 -349
View File
@@ -1,389 +1,446 @@
<a name="readme-top"></a>
# Changelog
## [1.0.1](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0...v1.0.1) (2025-04-28)
## [1.1.5](https://github.com/perfect-panel/ppanel-web/compare/v1.1.4...v1.1.5) (2025-07-26)
### 🐛 Bug Fixes
* **payment**: Disable webhook_secret field in PaymentForm component ([d323af8](https://github.com/perfect-panel/ppanel-web/commit/d323af8))
* **recharge**: Set balance prop to false in PaymentMethods component ([356ae5b](https://github.com/perfect-panel/ppanel-web/commit/356ae5b))
* **subscribe**: Filter out items that are not marked as visible in subscription list ([32253e3](https://github.com/perfect-panel/ppanel-web/commit/32253e3))
# 1.0.0 (2025-04-24)
## [1.1.4](https://github.com/perfect-panel/ppanel-web/compare/v1.1.3...v1.1.4) (2025-07-25)
### ♻ Code Refactoring
### 🐛 Bug Fixes
* **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
* **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
* **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
* **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
* **config**: Viewport ([24b8601](https://github.com/perfect-panel/ppanel-web/commit/24b8601))
* **core**: Restructure project for better module separation ([9d0cb8b](https://github.com/perfect-panel/ppanel-web/commit/9d0cb8b))
* **deps**: Update ([19837a1](https://github.com/perfect-panel/ppanel-web/commit/19837a1))
* **empty**: Content ([aa4c667](https://github.com/perfect-panel/ppanel-web/commit/aa4c667))
* **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
* **sbscribe**: Rename and reorganize components for better structure and clarity ([5e5e4ed](https://github.com/perfect-panel/ppanel-web/commit/5e5e4ed))
* **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
* **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
* **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
* Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
* Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
* **locales**: Simplify "show" label in subscription localization files ([d53a006](https://github.com/perfect-panel/ppanel-web/commit/d53a006))
* **order**: Preserve last successful order on error during order creation ([2fb98be](https://github.com/perfect-panel/ppanel-web/commit/2fb98be))
* **subscribe**: Filter out hidden items in subscription list display ([634be37](https://github.com/perfect-panel/ppanel-web/commit/634be37))
## [1.1.3](https://github.com/perfect-panel/ppanel-web/compare/v1.1.2...v1.1.3) (2025-07-24)
### ⚡ Performance Improvements
### 🐛 Bug Fixes
* **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
* **auth**: Implement user redirection to dashboard upon authentication ([f84f98c](https://github.com/perfect-panel/ppanel-web/commit/f84f98c))
## [1.1.2](https://github.com/perfect-panel/ppanel-web/compare/v1.1.1...v1.1.2) (2025-07-24)
### 🐛 Bug Fixes
* **billing**: Add display for gift amount in subscription billing ([04af2f9](https://github.com/perfect-panel/ppanel-web/commit/04af2f9))
* **order**: Update subscription cell to display name and quantity ([96eba17](https://github.com/perfect-panel/ppanel-web/commit/96eba17))
* **tool**: Added API for obtaining version, updated version information display logic ([2675034](https://github.com/perfect-panel/ppanel-web/commit/2675034))
<a name="readme-top"></a>
# Changelog
## [1.1.1](https://github.com/perfect-panel/ppanel-web/compare/v1.1.0...v1.1.1) (2025-07-20)
### 🐛 Bug Fixes
- **node-table**: Update translations for headers and no data display ([eec0b12](https://github.com/perfect-panel/ppanel-web/commit/eec0b12))
- **rules**: Change rule type from 'auto' to 'default' and update ([3e290d7](https://github.com/perfect-panel/ppanel-web/commit/3e290d7))
- **rules**: Update rule settings ([3304a55](https://github.com/perfect-panel/ppanel-web/commit/3304a55))
- **subscribe-form**: Optimize discount calculation logic and debounce updates ([166e48f](https://github.com/perfect-panel/ppanel-web/commit/166e48f))
- **tutorial**: Comment out unused getVersion function and simplify getVersionPath ([7cdc6bd](https://github.com/perfect-panel/ppanel-web/commit/7cdc6bd))
- **tutorial**: Return latest version in case of fetch error ([1fb305e](https://github.com/perfect-panel/ppanel-web/commit/1fb305e))
<a name="readme-top"></a>
# Changelog
# [1.1.0](https://github.com/perfect-panel/ppanel-web/compare/v1.0.2...v1.1.0) (2025-07-06)
### ✨ Features
* **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
* **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
* **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
* **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
* **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17))
* **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430))
* **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
* **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
* **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
* **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
* **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
* **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
* **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
* **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
* **auth**: Add email and SMS code sending functionality with localization updates ([57eaa55](https://github.com/perfect-panel/ppanel-web/commit/57eaa55))
* **auth**: Add Oauth configuration for Telegram, Facebook, Google, Github, and Apple ([18ee600](https://github.com/perfect-panel/ppanel-web/commit/18ee600))
* **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
* **auth**: Add SMS and email configuration options to global store and update localization ([4acf7b1](https://github.com/perfect-panel/ppanel-web/commit/4acf7b1))
* **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
* **auth**: Enhance user registration with invite handling and logo display ([207bc24](https://github.com/perfect-panel/ppanel-web/commit/207bc24))
* **auth**: Redirect user after OAuth login and add logos icon collection ([aa6dda8](https://github.com/perfect-panel/ppanel-web/commit/aa6dda8))
* **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
* **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
* **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
* **config**: Add application selection and encryption settings to configuration form ([88b3504](https://github.com/perfect-panel/ppanel-web/commit/88b3504))
* **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09))
* **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4))
* **config**: Update encryption fields in configuration form and refactor OAuth callback parameters ([652e032](https://github.com/perfect-panel/ppanel-web/commit/652e032))
* **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6))
* **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4))
* **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc))
* **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
* **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
* **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
* **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
* **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
* **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
* **global**: Add SMS configuration options to global store ([39a9ce6](https://github.com/perfect-panel/ppanel-web/commit/39a9ce6))
* **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
* **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
* **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
* **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
* **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
* **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
* **locales**: Add area code and telephone fields to user forms in multiple languages ([9b8258c](https://github.com/perfect-panel/ppanel-web/commit/9b8258c))
* **locales**: Add description information of communication keys and encryption methods to enhance client configuration capabilities ([d1f5a9b](https://github.com/perfect-panel/ppanel-web/commit/d1f5a9b))
* **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
* **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
* **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d))
* **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af))
* **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
* **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
* **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
* **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37))
* **node**: Add NodeStatus ([c712624](https://github.com/perfect-panel/ppanel-web/commit/c712624))
* **node**: Add protocol ([301b635](https://github.com/perfect-panel/ppanel-web/commit/301b635))
* **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
* **node**: Add status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
* **node**: Add tags ([f408fdf](https://github.com/perfect-panel/ppanel-web/commit/f408fdf))
* **node**: Move the node configuration to the server module ([7f0f5ce](https://github.com/perfect-panel/ppanel-web/commit/7f0f5ce))
* **oauth**: Add certification component for handling OAuth login callbacks and improve user authentication flow ([5ed04c0](https://github.com/perfect-panel/ppanel-web/commit/5ed04c0))
* **oauth**: Implement OAuth token retrieval and refactor login callback handling ([40a6f7c](https://github.com/perfect-panel/ppanel-web/commit/40a6f7c))
* **oauth**: Refactor platform parameter handling and improve logout redirection logic ([8346c85](https://github.com/perfect-panel/ppanel-web/commit/8346c85))
* **oauth**: Update OAuth login handling to use callback parameter and improve URL parameter retrieval ([9227411](https://github.com/perfect-panel/ppanel-web/commit/9227411))
* **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
* **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
* **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
* **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
* **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
* **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
* **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
* **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
* **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
* **sms**: Update locales ([938363b](https://github.com/perfect-panel/ppanel-web/commit/938363b))
* **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166))
* **subscribe**: Add 'sold' column to SubscribeTable and update inventory terminology ([19619fd](https://github.com/perfect-panel/ppanel-web/commit/19619fd))
* **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
* **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
* **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
* **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
* **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
* **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
* **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
* **subscribe**: Move subscription configuration and application to subscription module ([f90d4d2](https://github.com/perfect-panel/ppanel-web/commit/f90d4d2))
* **subscribe**: Update SubscribeTable component to use API.SubscribeItem type and ensure proper type casting ([f26f1c2](https://github.com/perfect-panel/ppanel-web/commit/f26f1c2))
* **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1))
* **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
* **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
* **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
* **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
* **table**: Add sorting support for Node and subscription columns ([27924b0](https://github.com/perfect-panel/ppanel-web/commit/27924b0))
* **table**: Supports drag and drop sorting ([2f56ef5](https://github.com/perfect-panel/ppanel-web/commit/2f56ef5))
* **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
* **tos**: Display data ([6024454](https://github.com/perfect-panel/ppanel-web/commit/6024454))
* **tutorial**: Add common tutorial list ([872252c](https://github.com/perfect-panel/ppanel-web/commit/872252c))
* **tutorial**: Fetch the latest tutorial version from GitHub API for dynamic URL generation ([28f8c78](https://github.com/perfect-panel/ppanel-web/commit/28f8c78))
* **ui**: System Tool ([1836980](https://github.com/perfect-panel/ppanel-web/commit/1836980))
* **ui**: Update homepage data ([8425b13](https://github.com/perfect-panel/ppanel-web/commit/8425b13))
* **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
* **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e))
* **user**: Add telephone input with area code selection and update localization ([585b99c](https://github.com/perfect-panel/ppanel-web/commit/585b99c))
* **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
* **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
* **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
* Update Auth Control ([c59742a](https://github.com/perfect-panel/ppanel-web/commit/c59742a))
- **view**: Add AnyTLS protocol support and enhance node configuration options ([bcfb10a](https://github.com/perfect-panel/ppanel-web/commit/bcfb10a))
<a name="readme-top"></a>
### 🎫 Chores
* **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
* **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc))
* **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
* **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
* **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
* **release**: V1.0.0-beta.1 [skip ci] ([7284d1c](https://github.com/perfect-panel/ppanel-web/commit/7284d1c))
* **release**: V1.0.0-beta.10 [skip ci] ([5cf573a](https://github.com/perfect-panel/ppanel-web/commit/5cf573a))
* **release**: V1.0.0-beta.11 [skip ci] ([1f29506](https://github.com/perfect-panel/ppanel-web/commit/1f29506))
* **release**: V1.0.0-beta.12 [skip ci] ([4418c47](https://github.com/perfect-panel/ppanel-web/commit/4418c47))
* **release**: V1.0.0-beta.13 [skip ci] ([23c974a](https://github.com/perfect-panel/ppanel-web/commit/23c974a))
* **release**: V1.0.0-beta.14 [skip ci] ([0fb0d8b](https://github.com/perfect-panel/ppanel-web/commit/0fb0d8b))
* **release**: V1.0.0-beta.15 [skip ci] ([b2e8fad](https://github.com/perfect-panel/ppanel-web/commit/b2e8fad))
* **release**: V1.0.0-beta.16 [skip ci] ([c3eff0a](https://github.com/perfect-panel/ppanel-web/commit/c3eff0a))
* **release**: V1.0.0-beta.17 [skip ci] ([5b64389](https://github.com/perfect-panel/ppanel-web/commit/5b64389))
* **release**: V1.0.0-beta.18 [skip ci] ([4a00233](https://github.com/perfect-panel/ppanel-web/commit/4a00233))
* **release**: V1.0.0-beta.19 [skip ci] ([0f15fb8](https://github.com/perfect-panel/ppanel-web/commit/0f15fb8))
* **release**: V1.0.0-beta.2 [skip ci] ([087c36c](https://github.com/perfect-panel/ppanel-web/commit/087c36c))
* **release**: V1.0.0-beta.20 [skip ci] ([bbd44f0](https://github.com/perfect-panel/ppanel-web/commit/bbd44f0))
* **release**: V1.0.0-beta.21 [skip ci] ([ca642c2](https://github.com/perfect-panel/ppanel-web/commit/ca642c2))
* **release**: V1.0.0-beta.22 [skip ci] ([c0fb34f](https://github.com/perfect-panel/ppanel-web/commit/c0fb34f))
* **release**: V1.0.0-beta.23 [skip ci] ([cf1d66d](https://github.com/perfect-panel/ppanel-web/commit/cf1d66d))
* **release**: V1.0.0-beta.24 [skip ci] ([01a3aa0](https://github.com/perfect-panel/ppanel-web/commit/01a3aa0))
* **release**: V1.0.0-beta.25 [skip ci] ([047a698](https://github.com/perfect-panel/ppanel-web/commit/047a698))
* **release**: V1.0.0-beta.26 [skip ci] ([79edea7](https://github.com/perfect-panel/ppanel-web/commit/79edea7))
* **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
* **release**: V1.0.0-beta.27 [skip ci] ([85fdc36](https://github.com/perfect-panel/ppanel-web/commit/85fdc36))
* **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
* **release**: V1.0.0-beta.28 [skip ci] ([d10ecc9](https://github.com/perfect-panel/ppanel-web/commit/d10ecc9))
* **release**: V1.0.0-beta.29 [skip ci] ([29bc3c7](https://github.com/perfect-panel/ppanel-web/commit/29bc3c7))
* **release**: V1.0.0-beta.3 [skip ci] ([cd49427](https://github.com/perfect-panel/ppanel-web/commit/cd49427))
* **release**: V1.0.0-beta.30 [skip ci] ([db0d9e0](https://github.com/perfect-panel/ppanel-web/commit/db0d9e0))
* **release**: V1.0.0-beta.31 [skip ci] ([aa1d426](https://github.com/perfect-panel/ppanel-web/commit/aa1d426))
* **release**: V1.0.0-beta.32 [skip ci] ([fa56eb8](https://github.com/perfect-panel/ppanel-web/commit/fa56eb8))
* **release**: V1.0.0-beta.33 [skip ci] ([383638f](https://github.com/perfect-panel/ppanel-web/commit/383638f))
* **release**: V1.0.0-beta.34 [skip ci] ([7023875](https://github.com/perfect-panel/ppanel-web/commit/7023875))
* **release**: V1.0.0-beta.4 [skip ci] ([10d322f](https://github.com/perfect-panel/ppanel-web/commit/10d322f))
* **release**: V1.0.0-beta.5 [skip ci] ([f275f01](https://github.com/perfect-panel/ppanel-web/commit/f275f01))
* **release**: V1.0.0-beta.6 [skip ci] ([dd23279](https://github.com/perfect-panel/ppanel-web/commit/dd23279))
* **release**: V1.0.0-beta.7 [skip ci] ([f60d40c](https://github.com/perfect-panel/ppanel-web/commit/f60d40c))
* **release**: V1.0.0-beta.8 [skip ci], closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([a593eac](https://github.com/perfect-panel/ppanel-web/commit/a593eac))
* **release**: V1.0.0-beta.9 [skip ci] ([855d1b0](https://github.com/perfect-panel/ppanel-web/commit/855d1b0))
* **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429))
* Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
* Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
# Changelog
## [1.0.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.1...v1.0.2) (2025-06-29)
### 🐛 Bug Fixes
* **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
* **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
* **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
* **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
* **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5))
* **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30))
* **api**: Remove redundant requestType parameter in appleLoginCallback ([0aa5d5b](https://github.com/perfect-panel/ppanel-web/commit/0aa5d5b))
* **api**: Rename app-related functions and types to application for consistency ([9d8b814](https://github.com/perfect-panel/ppanel-web/commit/9d8b814))
* **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d))
* **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82))
* **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162))
* **api**: Subscribe token ([1932ba7](https://github.com/perfect-panel/ppanel-web/commit/1932ba7))
* **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060))
* **api**: Update Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
* **api**: Update subscription_protocol to subscribe_type for consistency across services ([b6da51b](https://github.com/perfect-panel/ppanel-web/commit/b6da51b))
* **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
* **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
* **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
* **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
* **auth**: Change Textarea value to defaultValue for client_secret in Apple auth page ([69fc670](https://github.com/perfect-panel/ppanel-web/commit/69fc670))
* **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
* **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
* **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0))
* **auth**: Remove unused telephone code login function and update typings for telephone login requests ([7239685](https://github.com/perfect-panel/ppanel-web/commit/7239685))
* **auth**: Require minimum length for invite string when forced invite is enabled ([a604f28](https://github.com/perfect-panel/ppanel-web/commit/a604f28))
* **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
* **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
* **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
* **auth**: Update user authentication flow to include email and phone code verification ([5d078fd](https://github.com/perfect-panel/ppanel-web/commit/5d078fd))
* **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d))
* **billing**: ExpiryDate ([e85e545](https://github.com/perfect-panel/ppanel-web/commit/e85e545))
* **billing**: I18n and styles ([81e0f21](https://github.com/perfect-panel/ppanel-web/commit/81e0f21))
* **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
* **config**: AlipayF2F ([6c07107](https://github.com/perfect-panel/ppanel-web/commit/6c07107))
* **config**: Bugs ([f57e40c](https://github.com/perfect-panel/ppanel-web/commit/f57e40c))
* **config**: Checkout Order ([a31e763](https://github.com/perfect-panel/ppanel-web/commit/a31e763))
* **config**: FormatBytes ([bbc2da0](https://github.com/perfect-panel/ppanel-web/commit/bbc2da0))
* **config**: NoStore ([2cc18cf](https://github.com/perfect-panel/ppanel-web/commit/2cc18cf))
* **config**: Runtime env ([a1e4999](https://github.com/perfect-panel/ppanel-web/commit/a1e4999))
* **config**: Status Percentag ([8f322fb](https://github.com/perfect-panel/ppanel-web/commit/8f322fb))
* **config**: SubLink ([1c61966](https://github.com/perfect-panel/ppanel-web/commit/1c61966))
* **config**: Subscribe Link ([11ea821](https://github.com/perfect-panel/ppanel-web/commit/11ea821))
* **content**: Parse subscription description and display features with icons ([3c5542a](https://github.com/perfect-panel/ppanel-web/commit/3c5542a))
* **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
* **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82))
* **dashboard**: Improve URL encoding for subscription links and enhance success message handling ([4983c33](https://github.com/perfect-panel/ppanel-web/commit/4983c33))
* **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
* **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
* **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
* **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
* **dashboard**: Update icon imports for platform consistency and adjust icon size ([3e8912e](https://github.com/perfect-panel/ppanel-web/commit/3e8912e))
* **dashboard**: Update platform detection logic and improve layout responsiveness ([b0aa364](https://github.com/perfect-panel/ppanel-web/commit/b0aa364))
* **deps**: Remove outdated @iconify/react dependency and add iconify-json packages ([d6fbc38](https://github.com/perfect-panel/ppanel-web/commit/d6fbc38))
* **deps**: Typescript config ([34e24b8](https://github.com/perfect-panel/ppanel-web/commit/34e24b8))
* **deps**: Update clipboard ([5572710](https://github.com/perfect-panel/ppanel-web/commit/5572710))
* **editor**: Change value ([4fdfeb2](https://github.com/perfect-panel/ppanel-web/commit/4fdfeb2))
* **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
* **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
* **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
* **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
* **locale**: Default value ([937408f](https://github.com/perfect-panel/ppanel-web/commit/937408f))
* **locale**: Document ([6f0fa20](https://github.com/perfect-panel/ppanel-web/commit/6f0fa20))
* **locale**: Empty ([3832d20](https://github.com/perfect-panel/ppanel-web/commit/3832d20))
* **locale**: Input Placeholder Webhook Domain ([bca0935](https://github.com/perfect-panel/ppanel-web/commit/bca0935))
* **locale**: Language Select ([0befdb0](https://github.com/perfect-panel/ppanel-web/commit/0befdb0))
* **locales**: Add error message for incorrect user information ([52c1d1f](https://github.com/perfect-panel/ppanel-web/commit/52c1d1f))
* **locales**: Add error message for incorrect user information ([3d92902](https://github.com/perfect-panel/ppanel-web/commit/3d92902))
* **locales**: Add logout message to authentication localization files ([1d0d911](https://github.com/perfect-panel/ppanel-web/commit/1d0d911))
* **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
* **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
* **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
* **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
* **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
* **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
* **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
* **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
* **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
* **logs**: Update log display to render key-value pairs and remove badge ([5ea6489](https://github.com/perfect-panel/ppanel-web/commit/5ea6489))
* **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
* **nav**: Comment out unused social login options to simplify navigation configuration ([cefcb31](https://github.com/perfect-panel/ppanel-web/commit/cefcb31))
* **node-config**: Add null checks for time slots and ensure proper handling of undefined values ([1cdb7e7](https://github.com/perfect-panel/ppanel-web/commit/1cdb7e7))
* **node**: Add country and city fields to the form schema and localization files ([8775fb6](https://github.com/perfect-panel/ppanel-web/commit/8775fb6))
* **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
* **node**: Locale and form ([38be4d5](https://github.com/perfect-panel/ppanel-web/commit/38be4d5))
* **node**: Port config ([a20834a](https://github.com/perfect-panel/ppanel-web/commit/a20834a))
* **node**: Reality config ([fadd17f](https://github.com/perfect-panel/ppanel-web/commit/fadd17f))
* **node**: Service Name config ([d0be685](https://github.com/perfect-panel/ppanel-web/commit/d0be685))
* **node**: TLS config ([57fae12](https://github.com/perfect-panel/ppanel-web/commit/57fae12))
* **node**: Trojan protocol config ([7e1eb90](https://github.com/perfect-panel/ppanel-web/commit/7e1eb90))
* **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
* **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
* **oauth**: Refactor OAuth configuration types and update related API methods ([6227ba9](https://github.com/perfect-panel/ppanel-web/commit/6227ba9))
* **oauth**: Remove redundant checks when updating configuration to simplify logic ([9140b8a](https://github.com/perfect-panel/ppanel-web/commit/9140b8a))
* **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
* **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
* **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
* **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
* **payment**: Refactor payment form placeholder and update localization files ([4a4d364](https://github.com/perfect-panel/ppanel-web/commit/4a4d364))
* **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
* **payment**: Replace window.open with window.location.href for checkout links ([1d8c765](https://github.com/perfect-panel/ppanel-web/commit/1d8c765))
* **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
* **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
* **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
* **phone**: Update SMS expiration time field to use 'sms_expire_time' with default value of 300 ([18b07c7](https://github.com/perfect-panel/ppanel-web/commit/18b07c7))
* **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
* **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
* **redirect**: Simplify redirect URL logic by removing unnecessary condition for sessionStorage ([c53ac61](https://github.com/perfect-panel/ppanel-web/commit/c53ac61))
* **redirect**: Update redirect URL logic to ensure proper handling of OAuth and auth paths ([7954762](https://github.com/perfect-panel/ppanel-web/commit/7954762))
* **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
* **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
* **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
* **rule-form**: Remove redundant rule set display ([6e0c9b6](https://github.com/perfect-panel/ppanel-web/commit/6e0c9b6))
* **rules**: Remove unused MATCH rule ([674a01c](https://github.com/perfect-panel/ppanel-web/commit/674a01c))
* **site**: Add image upload functionality for site logo configuration ([4ea6e4a](https://github.com/perfect-panel/ppanel-web/commit/4ea6e4a))
* **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
* **sort**: Refactor sorting logic in NodeTable and SubscribeTable components for improved clarity and performance ([331bbea](https://github.com/perfect-panel/ppanel-web/commit/331bbea))
* **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
* **subscribe**: Discount ([35a9f69](https://github.com/perfect-panel/ppanel-web/commit/35a9f69))
* **subscribe**: Extract Domain ([40d61a9](https://github.com/perfect-panel/ppanel-web/commit/40d61a9))
* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
* **subscribe**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
* **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
* **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
* **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
* **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
* **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
* **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
* **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
* **subscription**: Add reset functionality for user subscription token ([39e89bf](https://github.com/perfect-panel/ppanel-web/commit/39e89bf))
* **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
* **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
* **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
* **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
* **type**: Fix ts type check error ([3cb0629](https://github.com/perfect-panel/ppanel-web/commit/3cb0629))
* **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a))
* **types**: Checking ([2992824](https://github.com/perfect-panel/ppanel-web/commit/2992824))
* **types**: Order type ([c7e50a9](https://github.com/perfect-panel/ppanel-web/commit/c7e50a9))
* **ui**: Bugs ([b023d0f](https://github.com/perfect-panel/ppanel-web/commit/b023d0f))
* **ui**: Components ([a7927d7](https://github.com/perfect-panel/ppanel-web/commit/a7927d7))
* **ui**: Fix json formatting ([e1ddd94](https://github.com/perfect-panel/ppanel-web/commit/e1ddd94))
* **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
* **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
* **user-nav**: Update user avatar and label to display telephone if email is not available ([7b6bb7b](https://github.com/perfect-panel/ppanel-web/commit/7b6bb7b))
* **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409))
* **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
* **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
* **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
* **user**: Update user identifier field and localizations ([1b6befa](https://github.com/perfect-panel/ppanel-web/commit/1b6befa))
* **user**: Update user subscribe display ([3bb714d](https://github.com/perfect-panel/ppanel-web/commit/3bb714d))
* **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
* More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
- **subscription**: User subscription information ([7d18ff6](https://github.com/perfect-panel/ppanel-web/commit/7d18ff6))
## [1.0.1](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0...v1.0.1) (2025-04-28)
### 🐛 Bug Fixes
- **payment**: Disable webhook_secret field in PaymentForm component ([d323af8](https://github.com/perfect-panel/ppanel-web/commit/d323af8))
- **recharge**: Set balance prop to false in PaymentMethods component ([356ae5b](https://github.com/perfect-panel/ppanel-web/commit/356ae5b))
# 1.0.0 (2025-04-24)
### ♻ Code Refactoring
- **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
- **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
- **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
- **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
- **config**: Viewport ([24b8601](https://github.com/perfect-panel/ppanel-web/commit/24b8601))
- **core**: Restructure project for better module separation ([9d0cb8b](https://github.com/perfect-panel/ppanel-web/commit/9d0cb8b))
- **deps**: Update ([19837a1](https://github.com/perfect-panel/ppanel-web/commit/19837a1))
- **empty**: Content ([aa4c667](https://github.com/perfect-panel/ppanel-web/commit/aa4c667))
- **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
- **sbscribe**: Rename and reorganize components for better structure and clarity ([5e5e4ed](https://github.com/perfect-panel/ppanel-web/commit/5e5e4ed))
- **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
- **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
- **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
- Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
- Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
### ⚡ Performance Improvements
- **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
### ✨ Features
- **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
- **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
- **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
- **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
- **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17))
- **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430))
- **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
- **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
- **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
- **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
- **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
- **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
- **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
- **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
- **auth**: Add email and SMS code sending functionality with localization updates ([57eaa55](https://github.com/perfect-panel/ppanel-web/commit/57eaa55))
- **auth**: Add Oauth configuration for Telegram, Facebook, Google, Github, and Apple ([18ee600](https://github.com/perfect-panel/ppanel-web/commit/18ee600))
- **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
- **auth**: Add SMS and email configuration options to global store and update localization ([4acf7b1](https://github.com/perfect-panel/ppanel-web/commit/4acf7b1))
- **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
- **auth**: Enhance user registration with invite handling and logo display ([207bc24](https://github.com/perfect-panel/ppanel-web/commit/207bc24))
- **auth**: Redirect user after OAuth login and add logos icon collection ([aa6dda8](https://github.com/perfect-panel/ppanel-web/commit/aa6dda8))
- **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
- **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
- **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
- **config**: Add application selection and encryption settings to configuration form ([88b3504](https://github.com/perfect-panel/ppanel-web/commit/88b3504))
- **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09))
- **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4))
- **config**: Update encryption fields in configuration form and refactor OAuth callback parameters ([652e032](https://github.com/perfect-panel/ppanel-web/commit/652e032))
- **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6))
- **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4))
- **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc))
- **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
- **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
- **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
- **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
- **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
- **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
- **global**: Add SMS configuration options to global store ([39a9ce6](https://github.com/perfect-panel/ppanel-web/commit/39a9ce6))
- **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
- **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
- **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
- **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
- **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
- **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
- **locales**: Add area code and telephone fields to user forms in multiple languages ([9b8258c](https://github.com/perfect-panel/ppanel-web/commit/9b8258c))
- **locales**: Add description information of communication keys and encryption methods to enhance client configuration capabilities ([d1f5a9b](https://github.com/perfect-panel/ppanel-web/commit/d1f5a9b))
- **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
- **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
- **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d))
- **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af))
- **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
- **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
- **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
- **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37))
- **node**: Add NodeStatus ([c712624](https://github.com/perfect-panel/ppanel-web/commit/c712624))
- **node**: Add protocol ([301b635](https://github.com/perfect-panel/ppanel-web/commit/301b635))
- **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
- **node**: Add status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
- **node**: Add tags ([f408fdf](https://github.com/perfect-panel/ppanel-web/commit/f408fdf))
- **node**: Move the node configuration to the server module ([7f0f5ce](https://github.com/perfect-panel/ppanel-web/commit/7f0f5ce))
- **oauth**: Add certification component for handling OAuth login callbacks and improve user authentication flow ([5ed04c0](https://github.com/perfect-panel/ppanel-web/commit/5ed04c0))
- **oauth**: Implement OAuth token retrieval and refactor login callback handling ([40a6f7c](https://github.com/perfect-panel/ppanel-web/commit/40a6f7c))
- **oauth**: Refactor platform parameter handling and improve logout redirection logic ([8346c85](https://github.com/perfect-panel/ppanel-web/commit/8346c85))
- **oauth**: Update OAuth login handling to use callback parameter and improve URL parameter retrieval ([9227411](https://github.com/perfect-panel/ppanel-web/commit/9227411))
- **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
- **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
- **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
- **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
- **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
- **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
- **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
- **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
- **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
- **sms**: Update locales ([938363b](https://github.com/perfect-panel/ppanel-web/commit/938363b))
- **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166))
- **subscribe**: Add 'sold' column to SubscribeTable and update inventory terminology ([19619fd](https://github.com/perfect-panel/ppanel-web/commit/19619fd))
- **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
- **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
- **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
- **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
- **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
- **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
- **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
- **subscribe**: Move subscription configuration and application to subscription module ([f90d4d2](https://github.com/perfect-panel/ppanel-web/commit/f90d4d2))
- **subscribe**: Update SubscribeTable component to use API.SubscribeItem type and ensure proper type casting ([f26f1c2](https://github.com/perfect-panel/ppanel-web/commit/f26f1c2))
- **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1))
- **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
- **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
- **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
- **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
- **table**: Add sorting support for Node and subscription columns ([27924b0](https://github.com/perfect-panel/ppanel-web/commit/27924b0))
- **table**: Supports drag and drop sorting ([2f56ef5](https://github.com/perfect-panel/ppanel-web/commit/2f56ef5))
- **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
- **tos**: Display data ([6024454](https://github.com/perfect-panel/ppanel-web/commit/6024454))
- **tutorial**: Add common tutorial list ([872252c](https://github.com/perfect-panel/ppanel-web/commit/872252c))
- **tutorial**: Fetch the latest tutorial version from GitHub API for dynamic URL generation ([28f8c78](https://github.com/perfect-panel/ppanel-web/commit/28f8c78))
- **ui**: System Tool ([1836980](https://github.com/perfect-panel/ppanel-web/commit/1836980))
- **ui**: Update homepage data ([8425b13](https://github.com/perfect-panel/ppanel-web/commit/8425b13))
- **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
- **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e))
- **user**: Add telephone input with area code selection and update localization ([585b99c](https://github.com/perfect-panel/ppanel-web/commit/585b99c))
- **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
- **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
- **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
- Update Auth Control ([c59742a](https://github.com/perfect-panel/ppanel-web/commit/c59742a))
### 🎫 Chores
- **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
- **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc))
- **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
- **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
- **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
- **release**: V1.0.0-beta.1 [skip ci] ([7284d1c](https://github.com/perfect-panel/ppanel-web/commit/7284d1c))
- **release**: V1.0.0-beta.10 [skip ci] ([5cf573a](https://github.com/perfect-panel/ppanel-web/commit/5cf573a))
- **release**: V1.0.0-beta.11 [skip ci] ([1f29506](https://github.com/perfect-panel/ppanel-web/commit/1f29506))
- **release**: V1.0.0-beta.12 [skip ci] ([4418c47](https://github.com/perfect-panel/ppanel-web/commit/4418c47))
- **release**: V1.0.0-beta.13 [skip ci] ([23c974a](https://github.com/perfect-panel/ppanel-web/commit/23c974a))
- **release**: V1.0.0-beta.14 [skip ci] ([0fb0d8b](https://github.com/perfect-panel/ppanel-web/commit/0fb0d8b))
- **release**: V1.0.0-beta.15 [skip ci] ([b2e8fad](https://github.com/perfect-panel/ppanel-web/commit/b2e8fad))
- **release**: V1.0.0-beta.16 [skip ci] ([c3eff0a](https://github.com/perfect-panel/ppanel-web/commit/c3eff0a))
- **release**: V1.0.0-beta.17 [skip ci] ([5b64389](https://github.com/perfect-panel/ppanel-web/commit/5b64389))
- **release**: V1.0.0-beta.18 [skip ci] ([4a00233](https://github.com/perfect-panel/ppanel-web/commit/4a00233))
- **release**: V1.0.0-beta.19 [skip ci] ([0f15fb8](https://github.com/perfect-panel/ppanel-web/commit/0f15fb8))
- **release**: V1.0.0-beta.2 [skip ci] ([087c36c](https://github.com/perfect-panel/ppanel-web/commit/087c36c))
- **release**: V1.0.0-beta.20 [skip ci] ([bbd44f0](https://github.com/perfect-panel/ppanel-web/commit/bbd44f0))
- **release**: V1.0.0-beta.21 [skip ci] ([ca642c2](https://github.com/perfect-panel/ppanel-web/commit/ca642c2))
- **release**: V1.0.0-beta.22 [skip ci] ([c0fb34f](https://github.com/perfect-panel/ppanel-web/commit/c0fb34f))
- **release**: V1.0.0-beta.23 [skip ci] ([cf1d66d](https://github.com/perfect-panel/ppanel-web/commit/cf1d66d))
- **release**: V1.0.0-beta.24 [skip ci] ([01a3aa0](https://github.com/perfect-panel/ppanel-web/commit/01a3aa0))
- **release**: V1.0.0-beta.25 [skip ci] ([047a698](https://github.com/perfect-panel/ppanel-web/commit/047a698))
- **release**: V1.0.0-beta.26 [skip ci] ([79edea7](https://github.com/perfect-panel/ppanel-web/commit/79edea7))
- **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
- **release**: V1.0.0-beta.27 [skip ci] ([85fdc36](https://github.com/perfect-panel/ppanel-web/commit/85fdc36))
- **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
- **release**: V1.0.0-beta.28 [skip ci] ([d10ecc9](https://github.com/perfect-panel/ppanel-web/commit/d10ecc9))
- **release**: V1.0.0-beta.29 [skip ci] ([29bc3c7](https://github.com/perfect-panel/ppanel-web/commit/29bc3c7))
- **release**: V1.0.0-beta.3 [skip ci] ([cd49427](https://github.com/perfect-panel/ppanel-web/commit/cd49427))
- **release**: V1.0.0-beta.30 [skip ci] ([db0d9e0](https://github.com/perfect-panel/ppanel-web/commit/db0d9e0))
- **release**: V1.0.0-beta.31 [skip ci] ([aa1d426](https://github.com/perfect-panel/ppanel-web/commit/aa1d426))
- **release**: V1.0.0-beta.32 [skip ci] ([fa56eb8](https://github.com/perfect-panel/ppanel-web/commit/fa56eb8))
- **release**: V1.0.0-beta.33 [skip ci] ([383638f](https://github.com/perfect-panel/ppanel-web/commit/383638f))
- **release**: V1.0.0-beta.34 [skip ci] ([7023875](https://github.com/perfect-panel/ppanel-web/commit/7023875))
- **release**: V1.0.0-beta.4 [skip ci] ([10d322f](https://github.com/perfect-panel/ppanel-web/commit/10d322f))
- **release**: V1.0.0-beta.5 [skip ci] ([f275f01](https://github.com/perfect-panel/ppanel-web/commit/f275f01))
- **release**: V1.0.0-beta.6 [skip ci] ([dd23279](https://github.com/perfect-panel/ppanel-web/commit/dd23279))
- **release**: V1.0.0-beta.7 [skip ci] ([f60d40c](https://github.com/perfect-panel/ppanel-web/commit/f60d40c))
- **release**: V1.0.0-beta.8 [skip ci], closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([a593eac](https://github.com/perfect-panel/ppanel-web/commit/a593eac))
- **release**: V1.0.0-beta.9 [skip ci] ([855d1b0](https://github.com/perfect-panel/ppanel-web/commit/855d1b0))
- **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429))
- Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
- Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
### 🐛 Bug Fixes
- **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
- **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
- **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
- **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
- **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5))
- **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30))
- **api**: Remove redundant requestType parameter in appleLoginCallback ([0aa5d5b](https://github.com/perfect-panel/ppanel-web/commit/0aa5d5b))
- **api**: Rename app-related functions and types to application for consistency ([9d8b814](https://github.com/perfect-panel/ppanel-web/commit/9d8b814))
- **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d))
- **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82))
- **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162))
- **api**: Subscribe token ([1932ba7](https://github.com/perfect-panel/ppanel-web/commit/1932ba7))
- **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060))
- **api**: Update Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
- **api**: Update subscription_protocol to subscribe_type for consistency across services ([b6da51b](https://github.com/perfect-panel/ppanel-web/commit/b6da51b))
- **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
- **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
- **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
- **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
- **auth**: Change Textarea value to defaultValue for client_secret in Apple auth page ([69fc670](https://github.com/perfect-panel/ppanel-web/commit/69fc670))
- **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
- **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
- **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0))
- **auth**: Remove unused telephone code login function and update typings for telephone login requests ([7239685](https://github.com/perfect-panel/ppanel-web/commit/7239685))
- **auth**: Require minimum length for invite string when forced invite is enabled ([a604f28](https://github.com/perfect-panel/ppanel-web/commit/a604f28))
- **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
- **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
- **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
- **auth**: Update user authentication flow to include email and phone code verification ([5d078fd](https://github.com/perfect-panel/ppanel-web/commit/5d078fd))
- **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d))
- **billing**: ExpiryDate ([e85e545](https://github.com/perfect-panel/ppanel-web/commit/e85e545))
- **billing**: I18n and styles ([81e0f21](https://github.com/perfect-panel/ppanel-web/commit/81e0f21))
- **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
- **config**: AlipayF2F ([6c07107](https://github.com/perfect-panel/ppanel-web/commit/6c07107))
- **config**: Bugs ([f57e40c](https://github.com/perfect-panel/ppanel-web/commit/f57e40c))
- **config**: Checkout Order ([a31e763](https://github.com/perfect-panel/ppanel-web/commit/a31e763))
- **config**: FormatBytes ([bbc2da0](https://github.com/perfect-panel/ppanel-web/commit/bbc2da0))
- **config**: NoStore ([2cc18cf](https://github.com/perfect-panel/ppanel-web/commit/2cc18cf))
- **config**: Runtime env ([a1e4999](https://github.com/perfect-panel/ppanel-web/commit/a1e4999))
- **config**: Status Percentag ([8f322fb](https://github.com/perfect-panel/ppanel-web/commit/8f322fb))
- **config**: SubLink ([1c61966](https://github.com/perfect-panel/ppanel-web/commit/1c61966))
- **config**: Subscribe Link ([11ea821](https://github.com/perfect-panel/ppanel-web/commit/11ea821))
- **content**: Parse subscription description and display features with icons ([3c5542a](https://github.com/perfect-panel/ppanel-web/commit/3c5542a))
- **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
- **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82))
- **dashboard**: Improve URL encoding for subscription links and enhance success message handling ([4983c33](https://github.com/perfect-panel/ppanel-web/commit/4983c33))
- **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
- **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
- **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
- **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
- **dashboard**: Update icon imports for platform consistency and adjust icon size ([3e8912e](https://github.com/perfect-panel/ppanel-web/commit/3e8912e))
- **dashboard**: Update platform detection logic and improve layout responsiveness ([b0aa364](https://github.com/perfect-panel/ppanel-web/commit/b0aa364))
- **deps**: Remove outdated @iconify/react dependency and add iconify-json packages ([d6fbc38](https://github.com/perfect-panel/ppanel-web/commit/d6fbc38))
- **deps**: Typescript config ([34e24b8](https://github.com/perfect-panel/ppanel-web/commit/34e24b8))
- **deps**: Update clipboard ([5572710](https://github.com/perfect-panel/ppanel-web/commit/5572710))
- **editor**: Change value ([4fdfeb2](https://github.com/perfect-panel/ppanel-web/commit/4fdfeb2))
- **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
- **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
- **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
- **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
- **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
- **locale**: Default value ([937408f](https://github.com/perfect-panel/ppanel-web/commit/937408f))
- **locale**: Document ([6f0fa20](https://github.com/perfect-panel/ppanel-web/commit/6f0fa20))
- **locale**: Empty ([3832d20](https://github.com/perfect-panel/ppanel-web/commit/3832d20))
- **locale**: Input Placeholder Webhook Domain ([bca0935](https://github.com/perfect-panel/ppanel-web/commit/bca0935))
- **locale**: Language Select ([0befdb0](https://github.com/perfect-panel/ppanel-web/commit/0befdb0))
- **locales**: Add error message for incorrect user information ([52c1d1f](https://github.com/perfect-panel/ppanel-web/commit/52c1d1f))
- **locales**: Add error message for incorrect user information ([3d92902](https://github.com/perfect-panel/ppanel-web/commit/3d92902))
- **locales**: Add logout message to authentication localization files ([1d0d911](https://github.com/perfect-panel/ppanel-web/commit/1d0d911))
- **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
- **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
- **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
- **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
- **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
- **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
- **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
- **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
- **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
- **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
- **logs**: Update log display to render key-value pairs and remove badge ([5ea6489](https://github.com/perfect-panel/ppanel-web/commit/5ea6489))
- **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
- **nav**: Comment out unused social login options to simplify navigation configuration ([cefcb31](https://github.com/perfect-panel/ppanel-web/commit/cefcb31))
- **node-config**: Add null checks for time slots and ensure proper handling of undefined values ([1cdb7e7](https://github.com/perfect-panel/ppanel-web/commit/1cdb7e7))
- **node**: Add country and city fields to the form schema and localization files ([8775fb6](https://github.com/perfect-panel/ppanel-web/commit/8775fb6))
- **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
- **node**: Locale and form ([38be4d5](https://github.com/perfect-panel/ppanel-web/commit/38be4d5))
- **node**: Port config ([a20834a](https://github.com/perfect-panel/ppanel-web/commit/a20834a))
- **node**: Reality config ([fadd17f](https://github.com/perfect-panel/ppanel-web/commit/fadd17f))
- **node**: Service Name config ([d0be685](https://github.com/perfect-panel/ppanel-web/commit/d0be685))
- **node**: TLS config ([57fae12](https://github.com/perfect-panel/ppanel-web/commit/57fae12))
- **node**: Trojan protocol config ([7e1eb90](https://github.com/perfect-panel/ppanel-web/commit/7e1eb90))
- **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
- **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
- **oauth**: Refactor OAuth configuration types and update related API methods ([6227ba9](https://github.com/perfect-panel/ppanel-web/commit/6227ba9))
- **oauth**: Remove redundant checks when updating configuration to simplify logic ([9140b8a](https://github.com/perfect-panel/ppanel-web/commit/9140b8a))
- **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
- **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
- **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
- **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
- **payment**: Refactor payment form placeholder and update localization files ([4a4d364](https://github.com/perfect-panel/ppanel-web/commit/4a4d364))
- **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
- **payment**: Replace window.open with window.location.href for checkout links ([1d8c765](https://github.com/perfect-panel/ppanel-web/commit/1d8c765))
- **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
- **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
- **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
- **phone**: Update SMS expiration time field to use 'sms_expire_time' with default value of 300 ([18b07c7](https://github.com/perfect-panel/ppanel-web/commit/18b07c7))
- **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
- **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
- **redirect**: Simplify redirect URL logic by removing unnecessary condition for sessionStorage ([c53ac61](https://github.com/perfect-panel/ppanel-web/commit/c53ac61))
- **redirect**: Update redirect URL logic to ensure proper handling of OAuth and auth paths ([7954762](https://github.com/perfect-panel/ppanel-web/commit/7954762))
- **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
- **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
- **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
- **rule-form**: Remove redundant rule set display ([6e0c9b6](https://github.com/perfect-panel/ppanel-web/commit/6e0c9b6))
- **rules**: Remove unused MATCH rule ([674a01c](https://github.com/perfect-panel/ppanel-web/commit/674a01c))
- **site**: Add image upload functionality for site logo configuration ([4ea6e4a](https://github.com/perfect-panel/ppanel-web/commit/4ea6e4a))
- **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
- **sort**: Refactor sorting logic in NodeTable and SubscribeTable components for improved clarity and performance ([331bbea](https://github.com/perfect-panel/ppanel-web/commit/331bbea))
- **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
- **subscribe**: Discount ([35a9f69](https://github.com/perfect-panel/ppanel-web/commit/35a9f69))
- **subscribe**: Extract Domain ([40d61a9](https://github.com/perfect-panel/ppanel-web/commit/40d61a9))
- **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
- **subscribe**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
- **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
- **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
- **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
- **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
- **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
- **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
- **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
- **subscription**: Add reset functionality for user subscription token ([39e89bf](https://github.com/perfect-panel/ppanel-web/commit/39e89bf))
- **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
- **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
- **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
- **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
- **type**: Fix ts type check error ([3cb0629](https://github.com/perfect-panel/ppanel-web/commit/3cb0629))
- **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a))
- **types**: Checking ([2992824](https://github.com/perfect-panel/ppanel-web/commit/2992824))
- **types**: Order type ([c7e50a9](https://github.com/perfect-panel/ppanel-web/commit/c7e50a9))
- **ui**: Bugs ([b023d0f](https://github.com/perfect-panel/ppanel-web/commit/b023d0f))
- **ui**: Components ([a7927d7](https://github.com/perfect-panel/ppanel-web/commit/a7927d7))
- **ui**: Fix json formatting ([e1ddd94](https://github.com/perfect-panel/ppanel-web/commit/e1ddd94))
- **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
- **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
- **user-nav**: Update user avatar and label to display telephone if email is not available ([7b6bb7b](https://github.com/perfect-panel/ppanel-web/commit/7b6bb7b))
- **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409))
- **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
- **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
- **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
- **user**: Update user identifier field and localizations ([1b6befa](https://github.com/perfect-panel/ppanel-web/commit/1b6befa))
- **user**: Update user subscribe display ([3bb714d](https://github.com/perfect-panel/ppanel-web/commit/3bb714d))
- **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
- More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
### 👷 Build System
* **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
- **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
### 💄 Styles
* **dashboard**: Adjust grid layout and update image dimensions in application display ([f3204b7](https://github.com/perfect-panel/ppanel-web/commit/f3204b7))
* **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
* **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
* **globals**: Refactor delete confirmation button and update badge styles in node and subscribe tables ([30ae781](https://github.com/perfect-panel/ppanel-web/commit/30ae781))
* **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
* **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
* **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
* **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
* **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
* **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
* **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
* Update node secret UI and add telephone code field to authentication form ([770932e](https://github.com/perfect-panel/ppanel-web/commit/770932e))
- **dashboard**: Adjust grid layout and update image dimensions in application display ([f3204b7](https://github.com/perfect-panel/ppanel-web/commit/f3204b7))
- **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
- **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
- **globals**: Refactor delete confirmation button and update badge styles in node and subscribe tables ([30ae781](https://github.com/perfect-panel/ppanel-web/commit/30ae781))
- **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
- **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
- **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
- **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
- **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
- **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
- **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
- Update node secret UI and add telephone code field to authentication form ([770932e](https://github.com/perfect-panel/ppanel-web/commit/770932e))
### 📝 Documentation
* **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
- **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
### 🔧 Continuous Integration
* **github**: Release docker ([5af60aa](https://github.com/perfect-panel/ppanel-web/commit/5af60aa))
* **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
- **github**: Release docker ([5af60aa](https://github.com/perfect-panel/ppanel-web/commit/5af60aa))
- **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
<a name="readme-top"></a>
+10 -1
View File
@@ -8,13 +8,22 @@ import LoginLottie from '@workspace/ui/lotties/login.json';
import { useTranslations } from 'next-intl';
import Image from 'next/legacy/image';
import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
import EmailAuthForm from './email/auth-form';
export default function Page() {
const t = useTranslations('auth');
const { common } = useGlobalStore();
const { common, user } = useGlobalStore();
const { site } = common;
const router = useRouter();
useEffect(() => {
if (user) {
router.replace('/dashboard');
}
}, [router, user]);
return (
<main className='bg-muted/50 flex h-full min-h-screen items-center'>
<div className='flex size-full flex-auto flex-col justify-center lg:flex-row'>
@@ -136,14 +136,14 @@ export function Register() {
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<TableRow className='flex flex-col'>
<TableCell className='w-full'>
<Label>{t('trialSubscribePlan')}</Label>
<p className='text-muted-foreground text-xs'>
{t('trialSubscribePlanDescription')}
</p>
</TableCell>
<TableCell className='text-right'>
<TableCell className='max-w-96'>
<EnhancedInput
placeholder={t('trialDuration')}
type='number'
+7 -2
View File
@@ -57,8 +57,13 @@ export default function Page(props: any) {
{
accessorKey: 'subscribe_id',
header: t('subscribe'),
cell: ({ row }) =>
subscribeList?.find((item) => item.id === row.getValue('subscribe_id'))?.name,
cell: ({ row }) => {
const name = subscribeList?.find(
(item) => item.id === row.getValue('subscribe_id'),
)?.name;
const quantity = row.original.quantity;
return name ? `${name} × ${quantity}` : '';
},
},
{
accessorKey: 'amount',
@@ -88,12 +88,32 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
if (!groups[policyGroup]) {
groups[policyGroup] = [];
}
groups[policyGroup].push(cleanRule);
// 不插入 MATCH 规则,只用于标识默认规则组
if (!rule.trim().startsWith('MATCH,')) {
groups[policyGroup].push(cleanRule);
}
}
return groups;
};
const checkIfDefaultRule = (originalRules: string[], groupName: string): boolean => {
return originalRules.some((rule) => {
const trimmedRule = rule.trim();
if (!trimmedRule.startsWith('MATCH,')) return false;
// 检查 MATCH 规则是否属于当前组
const parts = trimmedRule.split(',');
if (parts.length >= 3) {
const ruleGroup = parts[2]?.trim();
return ruleGroup === groupName;
}
return groupName === 'default';
});
};
const handleImport = async () => {
if (!yamlContent) {
toast.error(t('pleaseUploadFile'));
@@ -130,12 +150,17 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
if (!group?.name || !group?.rules.length) continue;
const isDefault = checkIfDefaultRule(allRules, group.name);
await createRuleGroup({
name: group.name,
rules: group?.rules.join('\n'),
enable: false,
tags: [],
icon: '',
type: 'default',
default: isDefault,
});
setImportProgress(i + 1);
}
+49 -17
View File
@@ -50,6 +50,8 @@ export default function Page() {
enable: false,
tags: values.tags || [],
icon: values.icon || '',
type: values.type || 'default',
default: false,
});
toast.success(t('createSuccess'));
ref.current?.refresh();
@@ -100,27 +102,55 @@ export default function Page() {
},
},
{
accessorKey: 'icon',
header: t('appIcon'),
cell: ({ row }) =>
row.getValue('icon') ? (
<Image
src={row.getValue('icon')}
alt={row.getValue('name')}
className='h-8 w-8 rounded-md'
width={32}
height={32}
/>
) : (
<div className='bg-muted flex h-8 w-8 items-center justify-center rounded-md'>
{row.original.name?.slice(0, 2)}
</div>
),
accessorKey: 'default',
header: t('defaultRule'),
cell: ({ row }) => (
<Switch
defaultChecked={row.original.default}
onCheckedChange={async (checked) => {
await updateRuleGroup({
...row.original,
default: checked,
} as API.UpdateRuleGroupRequest);
ref.current?.refresh();
}}
/>
),
},
{
accessorKey: 'type',
header: t('type'),
cell: ({ row }) => {
const type = row.original.type || 'default';
if (type === 'default') {
return <Badge variant='default'>{t('default')}</Badge>;
}
if (type === 'reject') {
return <Badge variant='destructive'>{t('reject')}</Badge>;
}
if (type === 'direct') {
return <Badge variant='secondary'>{t('direct')}</Badge>;
}
return <Badge variant='default'>{t('default')}</Badge>;
},
},
{
accessorKey: 'name',
header: t('name'),
cell: ({ row }) => (
<div className='flex items-center gap-2'>
{row.original.icon && (
<Image
src={row.original.icon}
alt={row.original.name}
className='h-6 w-6 rounded-md'
width={24}
height={24}
/>
)}
<span>{row.original.name}</span>
</div>
),
},
{
accessorKey: 'tags',
@@ -163,6 +193,8 @@ export default function Page() {
rules: values.rules,
enable: row.enable,
icon: values.icon,
type: values.type,
default: row.default,
});
toast.success(t('updateSuccess'));
ref.current?.refresh();
@@ -13,6 +13,13 @@ import {
FormMessage,
} from '@workspace/ui/components/form';
import { ScrollArea } from '@workspace/ui/components/scroll-area';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import {
Sheet,
SheetContent,
@@ -36,6 +43,7 @@ const formSchema = z.object({
tags: z.array(z.string()).default([]),
rules: z.string().default(''),
icon: z.string().default(''),
type: z.string().default('default'),
});
interface RuleFormProps<T> {
@@ -147,6 +155,33 @@ export default function RuleForm<T extends Record<string, any>>({
</FormItem>
)}
/>
<FormField
control={form.control}
name='type'
render={({ field }) => (
<FormItem>
<FormLabel>{t('type')}</FormLabel>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<SelectTrigger>
<SelectValue placeholder={t('selectType')} />
</SelectTrigger>
<SelectContent>
<SelectItem value='default'>{t('default')}</SelectItem>
<SelectItem value='reject'>{t('reject')}</SelectItem>
<SelectItem value='direct'>{t('direct')}</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='tags'
+14 -2
View File
@@ -1,6 +1,6 @@
import { z } from 'zod';
export const protocols = ['shadowsocks', 'vmess', 'vless', 'trojan', 'hysteria2', 'tuic'];
export const protocols = ['shadowsocks', 'vmess', 'vless', 'trojan', 'hysteria2', 'tuic', 'anytls'];
const nullableString = z.string().nullish();
const portSchema = z.number().max(65535).nullish();
@@ -58,7 +58,15 @@ const hysteria2Schema = z.object({
const tuicSchema = z.object({
port: portSchema,
security: z.string(),
disable_sni: z.boolean().default(false),
reduce_rtt: z.boolean().default(false),
udp_relay_mode: z.string().default('native'),
congestion_controller: z.string().default('bbr'),
security_config: securityConfigSchema,
});
const anytlsSchema = z.object({
port: portSchema,
security_config: securityConfigSchema,
});
@@ -87,6 +95,10 @@ const protocolConfigSchema = z.discriminatedUnion('protocol', [
protocol: z.literal('tuic'),
config: tuicSchema,
}),
z.object({
protocol: z.literal('anytls'),
config: anytlsSchema,
}),
]);
const baseFormSchema = z.object({
+311 -194
View File
@@ -110,7 +110,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
{trigger}
</Button>
</SheetTrigger>
<SheetContent className='w-[520px] max-w-full md:max-w-screen-md'>
<SheetContent className='w-[580px] max-w-full md:max-w-screen-md'>
<SheetHeader>
<SheetTitle>{title}</SheetTitle>
</SheetHeader>
@@ -290,7 +290,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
if (['trojan', 'hysteria2', 'tuic'].includes(value)) {
if (['trojan', 'hysteria2', 'tuic', 'anytls'].includes(value)) {
form.setValue('config.security', 'tls');
}
}}
@@ -402,11 +402,11 @@ export default function NodeForm<T extends { [x: string]: any }>({
</div>
)}
{['vmess', 'vless', 'trojan', 'hysteria2', 'tuic'].includes(protocol) && (
{['vmess', 'vless', 'trojan', 'hysteria2', 'tuic', 'anytls'].includes(protocol) && (
<div className='grid gap-4'>
<div
className={cn('flex gap-4 *:flex-1', {
'grid grid-cols-2': ['hysteria2'].includes(protocol),
'grid grid-cols-2': ['hysteria2', 'tuic'].includes(protocol),
})}
>
<FormField
@@ -524,6 +524,109 @@ export default function NodeForm<T extends { [x: string]: any }>({
/>
</>
)}
{protocol === 'tuic' && (
<>
<FormField
control={form.control}
name='config.udp_relay_mode'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.udpRelayMode')}</FormLabel>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.pleaseSelect')} />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='native'>Native</SelectItem>
<SelectItem value='quic'>QUIC</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.congestion_controller'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.congestionController')}</FormLabel>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.pleaseSelect')} />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='bbr'>BBR</SelectItem>
<SelectItem value='cubic'>Cubic</SelectItem>
<SelectItem value='reno'>Reno</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<div className='flex gap-2'>
<FormField
control={form.control}
name='config.disable_sni'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.disableSni')}</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={field.value}
onCheckedChange={(checked) => {
form.setValue(field.name, checked);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.reduce_rtt'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.reduceRtt')}</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={field.value}
onCheckedChange={(checked) => {
form.setValue(field.name, checked);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
</>
)}
</div>
{['vmess', 'vless', 'trojan'].includes(protocol) && (
<Card>
@@ -630,171 +733,17 @@ export default function NodeForm<T extends { [x: string]: any }>({
)}
</Card>
)}
<Card>
<CardHeader className='flex flex-row items-center justify-between p-3'>
<CardTitle>{t('form.securityConfig')}</CardTitle>
<FormField
control={form.control}
name='config.security'
render={({ field }) => (
<FormItem className='!mt-0 min-w-32'>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.pleaseSelect')} />
</SelectTrigger>
</FormControl>
<SelectContent>
{['vmess', 'vless'].includes(protocol) && (
<SelectItem value='none'>NONE</SelectItem>
)}
<SelectItem value='tls'>TLS</SelectItem>
{protocol === 'vless' && (
<SelectItem value='reality'>Reality</SelectItem>
)}
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
</CardHeader>
{security !== 'none' && (
<CardContent className='grid grid-cols-2 gap-4 p-3'>
<FormField
control={form.control}
name='config.security_config.sni'
render={({ field }) => (
<FormItem>
<FormLabel>Server Name(SNI)</FormLabel>
<FormControl>
<EnhancedInput
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{protocol === 'vless' && security === 'reality' && (
<>
<FormField
control={form.control}
name='config.security_config.reality_server_addr'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.serverAddress')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t(
'form.security_config.serverAddressPlaceholder',
)}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_server_port'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.serverPort')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
type='number'
min={1}
max={65535}
placeholder={t('form.security_config.serverPortPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_private_key'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.privateKey')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t('form.security_config.privateKeyPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_public_key'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.publicKey')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t('form.security_config.publicKeyPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_short_id'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.shortId')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t('form.security_config.shortIdPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</>
)}
{protocol === 'vless' && (
{(['vmess', 'vless', 'trojan'].includes(protocol) ||
['anytls', 'tuic', 'hysteria2'].includes(protocol)) && (
<Card>
<CardHeader className='flex flex-row items-center justify-between p-3'>
<CardTitle>{t('form.securityConfig')}</CardTitle>
{['vmess', 'vless', 'trojan'].includes(protocol) && (
<FormField
control={form.control}
name='config.security_config.fingerprint'
name='config.security'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.fingerprint')}</FormLabel>
<FormItem className='!mt-0 min-w-32'>
<Select
value={field.value}
onValueChange={(value) => {
@@ -807,45 +756,213 @@ export default function NodeForm<T extends { [x: string]: any }>({
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='chrome'>Chrome</SelectItem>
<SelectItem value='firefox'>Firefox</SelectItem>
<SelectItem value='safari'>Safari</SelectItem>
<SelectItem value='ios'>IOS</SelectItem>
<SelectItem value='android'>Android</SelectItem>
<SelectItem value='edge'>edge</SelectItem>
<SelectItem value='360'>360</SelectItem>
<SelectItem value='qq'>QQ</SelectItem>
{['vmess', 'vless'].includes(protocol) && (
<SelectItem value='none'>NONE</SelectItem>
)}
<SelectItem value='tls'>TLS</SelectItem>
{protocol === 'vless' && (
<SelectItem value='reality'>Reality</SelectItem>
)}
</SelectContent>
</Select>
<FormMessage />
<FormMessage />
</FormItem>
)}
/>
)}
<FormField
control={form.control}
name='config.security_config.allow_insecure'
render={({ field }) => (
<FormItem>
<FormLabel>Allow Insecure</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={!!field.value}
onCheckedChange={(value) => {
</CardHeader>
{(['anytls', 'tuic', 'hysteria2'].includes(protocol) ||
(['vmess', 'vless', 'trojan'].includes(protocol) &&
security !== 'none')) && (
<CardContent className='grid grid-cols-2 gap-4 p-3'>
<FormField
control={form.control}
name='config.security_config.sni'
render={({ field }) => (
<FormItem>
<FormLabel>Server Name(SNI)</FormLabel>
<FormControl>
<EnhancedInput
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{/* Reality 特殊配置只在 vless + reality 时显示 */}
{protocol === 'vless' && security === 'reality' && (
<>
<FormField
control={form.control}
name='config.security_config.reality_server_addr'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.serverAddress')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t(
'form.security_config.serverAddressPlaceholder',
)}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_server_port'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.serverPort')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
type='number'
min={1}
max={65535}
placeholder={t(
'form.security_config.serverPortPlaceholder',
)}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_private_key'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.privateKey')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t(
'form.security_config.privateKeyPlaceholder',
)}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_public_key'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.publicKey')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t('form.security_config.publicKeyPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='config.security_config.reality_short_id'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.shortId')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
placeholder={t('form.security_config.shortIdPlaceholder')}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</>
)}
/>
</CardContent>
)}
</Card>
{protocol === 'vless' && (
<FormField
control={form.control}
name='config.security_config.fingerprint'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.security_config.fingerprint')}</FormLabel>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.pleaseSelect')} />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='chrome'>Chrome</SelectItem>
<SelectItem value='firefox'>Firefox</SelectItem>
<SelectItem value='safari'>Safari</SelectItem>
<SelectItem value='ios'>IOS</SelectItem>
<SelectItem value='android'>Android</SelectItem>
<SelectItem value='edge'>edge</SelectItem>
<SelectItem value='360'>360</SelectItem>
<SelectItem value='qq'>QQ</SelectItem>
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
)}
<FormField
control={form.control}
name='config.security_config.allow_insecure'
render={({ field }) => (
<FormItem>
<FormLabel>Allow Insecure</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={!!field.value}
onCheckedChange={(checked) => {
form.setValue(field.name, checked);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</CardContent>
)}
</Card>
)}
</div>
)}
@@ -73,7 +73,7 @@ export default function NodeTable() {
columns={[
{
accessorKey: 'id',
header: 'ID',
header: t('id'),
cell: ({ row }) => (
<TooltipProvider>
<Tooltip>
@@ -87,6 +87,7 @@ export default function NodeTable() {
'bg-yellow-500': row.original.protocol === 'trojan',
'bg-purple-500': row.original.protocol === 'hysteria2',
'bg-cyan-500': row.original.protocol === 'tuic',
'bg-gray-500': row.original.protocol === 'anytls',
})}
>
{row.getValue('id')}
@@ -159,7 +160,7 @@ export default function NodeTable() {
header: t('nodeGroup'),
cell: ({ row }) => {
const name = groups?.find((group) => group.id === row.getValue('group_id'))?.name;
return name ? <Badge variant='outline'>{name}</Badge> : '--';
return name ? <Badge variant='outline'>{name}</Badge> : t('noData');
},
},
{
@@ -176,7 +177,7 @@ export default function NodeTable() {
))}
</div>
) : (
'--'
t('noData')
);
},
},
@@ -272,17 +273,17 @@ export default function NodeTable() {
<ConfirmButton
key='delete'
trigger={<Button variant='destructive'>{t('delete')}</Button>}
title={t('group.confirmDelete')}
description={t('group.deleteWarning')}
title={t('confirmDelete')}
description={t('deleteWarning')}
onConfirm={async () => {
await batchDeleteNode({
ids: rows.map((item) => item.id),
});
toast.success(t('group.deleteSuccess'));
toast.success(t('deleteSuccess'));
ref.current?.refresh();
}}
cancelText={t('group.cancel')}
confirmText={t('group.confirm')}
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
];
},
@@ -42,7 +42,7 @@ import { evaluateWithPrecision, unitConversion } from '@workspace/ui/utils';
import { CreditCard, Server, Settings } from 'lucide-react';
import { useTranslations } from 'next-intl';
import { assign, shake } from 'radash';
import { useEffect, useState } from 'react';
import { useCallback, useEffect, useRef, useState } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
import { z } from 'zod';
@@ -81,6 +81,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
}: Readonly<SubscribeFormProps<T>>) {
const t = useTranslations('subscribe');
const [open, setOpen] = useState(false);
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
const formSchema = z.object({
name: z.string(),
@@ -118,12 +119,111 @@ export default function SubscribeForm<T extends Record<string, any>>({
),
});
const debouncedCalculateDiscount = useCallback(
(values: any[], fieldName: string, lastChangedField?: string, changedIndex?: number) => {
if (updateTimeoutRef.current) {
clearTimeout(updateTimeoutRef.current);
}
updateTimeoutRef.current = setTimeout(() => {
const { unit_price } = form.getValues();
if (!unit_price || !values?.length) return;
let hasChanges = false;
const calculatedValues = values.map((item: any, index: number) => {
const result = { ...item };
if (changedIndex !== undefined && index !== changedIndex) {
return result;
}
const quantity = Number(item.quantity) || 0;
const discount = Number(item.discount) || 0;
const price = Number(item.price) || 0;
switch (lastChangedField) {
case 'quantity':
case 'discount':
if (quantity > 0 && discount > 0) {
const newPrice = evaluateWithPrecision(
`${unit_price} * ${quantity} * ${discount} / 100`,
);
if (Math.abs(newPrice - price) > 0.01) {
result.price = newPrice;
hasChanges = true;
}
}
break;
case 'price':
if (quantity > 0 && price > 0) {
const newDiscount = evaluateWithPrecision(
`${price} / ${quantity} / ${unit_price} * 100`,
);
if (Math.abs(newDiscount - discount) > 0.01) {
result.discount = Math.min(100, Math.max(0, newDiscount));
hasChanges = true;
}
} else if (discount > 0 && price > 0) {
const newQuantity = evaluateWithPrecision(
`${price} / ${unit_price} / ${discount} * 100`,
);
if (Math.abs(newQuantity - quantity) > 0.01 && newQuantity > 0) {
result.quantity = Math.max(1, Math.round(newQuantity));
hasChanges = true;
}
}
break;
default:
if (quantity > 0 && discount > 0 && price === 0) {
result.price = evaluateWithPrecision(
`${unit_price} * ${quantity} * ${discount} / 100`,
);
hasChanges = true;
} else if (quantity > 0 && price > 0 && discount === 0) {
const newDiscount = evaluateWithPrecision(
`${price} / ${quantity} / ${unit_price} * 100`,
);
result.discount = Math.min(100, Math.max(0, newDiscount));
hasChanges = true;
} else if (discount > 0 && price > 0 && quantity === 0) {
const newQuantity = evaluateWithPrecision(
`${price} / ${unit_price} / ${discount} * 100`,
);
if (newQuantity > 0) {
result.quantity = Math.max(1, Math.round(newQuantity));
hasChanges = true;
}
}
break;
}
return result;
});
if (hasChanges) {
form.setValue(fieldName, calculatedValues, { shouldDirty: true });
}
}, 300);
},
[form],
);
useEffect(() => {
form?.reset(
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
);
}, [form, initialValues]);
useEffect(() => {
return () => {
if (updateTimeoutRef.current) {
clearTimeout(updateTimeoutRef.current);
}
};
}, []);
async function handleSubmit(data: { [x: string]: any }) {
const bool = await onSubmit(data as T);
if (bool) setOpen(false);
@@ -158,31 +258,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
const unit_time = form.watch('unit_time');
const unit_price = form.watch('unit_price');
const discounts = form.watch('discount');
useEffect(() => {
if (!discounts?.length || !unit_price) return;
const calculatedValues = discounts.map((item: any) => {
const result = { ...item };
if (item.quantity && item.discount) {
result.price = evaluateWithPrecision(
`${unit_price || 0} * ${item.quantity} * ${item.discount} / 100`,
);
} else if (item.quantity && item.price && !item.discount) {
result.discount = evaluateWithPrecision(
`${item.price} / ${item.quantity} / ${unit_price} * 100`,
);
}
return result;
});
if (JSON.stringify(calculatedValues) !== JSON.stringify(discounts)) {
form.setValue('discount', calculatedValues);
}
}, [unit_price, discounts, form]);
return (
<Sheet open={open} onOpenChange={setOpen}>
@@ -581,8 +656,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
{
name: 'discount',
type: 'number',
min: 1,
min: 0.01,
max: 100,
step: 0.01,
placeholder: t('form.discountPercent'),
suffix: '%',
},
@@ -590,51 +666,53 @@ export default function SubscribeForm<T extends Record<string, any>>({
name: 'price',
placeholder: t('form.discount_price'),
type: 'number',
min: 0,
step: 0.01,
formatInput: (value) => unitConversion('centsToDollars', value),
formatOutput: (value) => unitConversion('dollarsToCents', value),
},
]}
value={field.value}
onChange={(newValues) => {
onChange={(
newValues: (API.SubscribeDiscount & { price?: number })[],
) => {
const oldValues = field.value || [];
const { unit_price } = form.getValues();
let lastChangedField: string | undefined;
let changedIndex: number | undefined;
const calculatedValues = newValues.map((newItem, index) => {
const oldItem = oldValues[index] || {};
for (
let i = 0;
i < Math.max(newValues.length, oldValues.length);
i++
) {
const newItem = newValues[i] || {};
const oldItem = oldValues[i] || {};
const result = { ...newItem };
const quantityChanged = newItem.quantity !== oldItem.quantity;
const discountChanged = newItem.discount !== oldItem.discount;
const priceChanged = newItem.price !== oldItem.price;
if (
(quantityChanged || discountChanged) &&
!priceChanged &&
newItem.quantity &&
newItem.discount
) {
result.price = evaluateWithPrecision(
`${unit_price || 0} * ${newItem.quantity} * ${newItem.discount} / 100`,
);
if ((newItem as any).quantity !== (oldItem as any).quantity) {
lastChangedField = 'quantity';
changedIndex = i;
break;
}
if (
priceChanged &&
!discountChanged &&
newItem.price &&
newItem.quantity &&
unit_price
) {
result.discount = evaluateWithPrecision(
`${newItem.price} / ${newItem.quantity} / ${unit_price} * 100`,
);
if ((newItem as any).discount !== (oldItem as any).discount) {
lastChangedField = 'discount';
changedIndex = i;
break;
}
return result;
});
form.setValue(field.name, calculatedValues);
if ((newItem as any).price !== (oldItem as any).price) {
lastChangedField = 'price';
changedIndex = i;
break;
}
}
form.setValue(field.name, newValues, { shouldDirty: true });
if (newValues?.length > 0) {
debouncedCalculateDiscount(
newValues,
field.name,
lastChangedField,
changedIndex,
);
}
}}
/>
</FormControl>
+180 -21
View File
@@ -1,6 +1,6 @@
'use client';
import { getSystemLog, restartSystem } from '@/services/admin/tool';
import { getSystemLog, getVersion, restartSystem } from '@/services/admin/tool';
import { useQuery } from '@tanstack/react-query';
import {
Accordion,
@@ -18,6 +18,7 @@ import {
AlertDialogTitle,
AlertDialogTrigger,
} from '@workspace/ui/components/alert-dialog';
import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button';
import {
Card,
@@ -28,8 +29,10 @@ import {
} from '@workspace/ui/components/card';
import { ScrollArea } from '@workspace/ui/components/scroll-area';
import { Icon } from '@workspace/ui/custom-components/icon';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
import packageJson from '../../../../../package.json';
const getLogLevelColor = (level: string) => {
const colorMap: { [key: string]: string } = {
@@ -57,6 +60,91 @@ export default function Page() {
const [openRestart, setOpenRestart] = useState(false);
const [isRestarting, setIsRestarting] = useState(false);
const { data: latestReleases } = useQuery({
queryKey: ['getLatestReleases'],
queryFn: async () => {
try {
const [webResponse, serverResponse] = await Promise.all([
fetch('https://api.github.com/repos/perfect-panel/ppanel-web/releases/latest'),
fetch('https://api.github.com/repos/perfect-panel/server/releases/latest'),
]);
const webData = webResponse.ok ? await webResponse.json() : null;
const serverData = serverResponse.ok ? await serverResponse.json() : null;
return {
web: webData
? {
version: webData.tag_name,
url: webData.html_url,
publishedAt: webData.published_at,
}
: null,
server: serverData
? {
version: serverData.tag_name,
url: serverData.html_url,
publishedAt: serverData.published_at,
}
: null,
};
} catch (error) {
console.error('Failed to fetch latest releases:', error);
return { web: null, server: null };
}
},
staleTime: 60 * 60 * 1000,
retry: 1,
retryDelay: 10000,
});
// 检查是否有新版本
const hasNewVersion =
latestReleases?.web && packageJson.version !== latestReleases.web.version.replace(/^v/, '');
const { data: systemInfo } = useQuery({
queryKey: ['getVersion'],
queryFn: async () => {
const { data } = await getVersion();
const versionString = data.data?.version || '';
const releaseVersionRegex = /^[Vv]?\d+\.\d+\.\d+$/;
const timeMatch = versionString.match(/\(([^)]+)\)/);
const timeInBrackets = timeMatch ? timeMatch[1] : '';
const versionWithoutTime = versionString.replace(/\([^)]*\)/, '').trim();
const isDevelopment = !releaseVersionRegex.test(versionWithoutTime);
let baseVersion = versionWithoutTime;
let versionSuffix = '';
let lastUpdated = '';
if (isDevelopment && versionWithoutTime.includes('-')) {
const parts = versionWithoutTime.split('-');
baseVersion = parts[0] || versionWithoutTime;
versionSuffix = parts.slice(1).join('-');
}
lastUpdated = formatDate(new Date(timeInBrackets || Date.now())) || '';
const displayVersion =
baseVersion.startsWith('V') || baseVersion.startsWith('v')
? baseVersion
: `V${baseVersion}`;
return {
isRelease: !isDevelopment,
version: displayVersion,
lastUpdated,
};
},
});
const hasServerNewVersion =
latestReleases?.server &&
systemInfo &&
systemInfo.version.replace(/^V/, '') !== latestReleases.server.version.replace(/^v/, '');
return (
<Card className='border-none'>
<CardHeader className='flex flex-col items-start justify-between sm:flex-row sm:items-center'>
@@ -110,15 +198,90 @@ export default function Page() {
</div>
</CardHeader>
<CardContent>
<div className='space-y-6'>
{/* <div className='flex items-center justify-between'>
<div className='text-lg font-semibold'>
{t('currentVersion')} <span>V1.0.0</span>
<div className='space-y-4'>
{/* 版本信息紧凑显示 */}
<div className='flex flex-col space-y-2 sm:flex-row sm:space-x-3 sm:space-y-0'>
{/* 用户端/管理端版本 */}
<div className='bg-muted/30 flex flex-1 items-center justify-between rounded-md p-2'>
<div className='flex items-center'>
<Icon icon='mdi:web' className='mr-2 h-4 w-4 text-green-600' />
<div className='flex items-center space-x-2'>
<span className='text-xs font-medium'>{t('webVersion')}</span>
<Badge variant='default' className='px-1.5 py-0.5 text-xs'>
V{packageJson.version}
</Badge>
{hasNewVersion && (
<Badge variant='destructive' className='animate-pulse px-1.5 py-0.5 text-xs'>
{t('newVersionAvailable')}
</Badge>
)}
</div>
</div>
{hasNewVersion && (
<Button
variant='outline'
size='sm'
className='h-6 px-2 text-xs'
onClick={() =>
window.open(
latestReleases?.web?.url ||
'https://github.com/perfect-panel/ppanel-web/releases',
'_blank',
)
}
>
<Icon icon='mdi:open-in-new' className='mr-1 h-3 w-3' />
{t('viewNewVersion')}
</Button>
)}
</div>
<div className='text-muted-foreground text-sm'>
{t('lastUpdated')} <span>2024-12-16 12:00:00</span>
{/* 服务端版本 */}
<div className='bg-muted/30 flex flex-1 items-center justify-between rounded-md p-2'>
<div className='flex items-center'>
<Icon icon='mdi:server' className='mr-2 h-4 w-4 text-blue-600' />
<div className='flex items-center space-x-2'>
<span className='text-xs font-medium'>{t('serverVersion')}</span>
<Badge
variant={!systemInfo?.isRelease ? 'destructive' : 'default'}
className='px-1.5 py-0.5 text-xs'
>
{systemInfo?.version || 'V1.0.0'}
{!systemInfo?.isRelease && (
<span className='ml-1'>{t('developmentVersion')}</span>
)}
</Badge>
{hasServerNewVersion && (
<Badge variant='destructive' className='animate-pulse px-1.5 py-0.5 text-xs'>
{t('newVersionAvailable')}
</Badge>
)}
</div>
</div>
<div className='flex items-center space-x-2'>
{hasServerNewVersion && (
<Button
variant='outline'
size='sm'
className='h-6 px-2 text-xs'
onClick={() =>
window.open(
latestReleases?.server?.url ||
'https://github.com/perfect-panel/server/releases',
'_blank',
)
}
>
<Icon icon='mdi:open-in-new' className='mr-1 h-3 w-3' />
{t('viewNewVersion')}
</Button>
)}
<div className='text-muted-foreground hidden text-right text-xs sm:block'>
<div className='font-mono'>{systemInfo?.lastUpdated || '--'}</div>
</div>
</div>
</div>
</div> */}
</div>
<Card className='overflow-hidden'>
<CardHeader className='bg-secondary py-1'>
<div className='flex items-center justify-between'>
@@ -148,19 +311,15 @@ export default function Page() {
</div>
</AccordionTrigger>
<AccordionContent className='px-2'>
{
// 直接渲染 key: value
Object.entries(log).map(([key, value]) => (
<div
key={key}
className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'
>
<span className='font-medium'>{key}:</span>
<span className='break-all'>{value as string}</span>
</div>
))
}
{Object.entries(log).map(([key, value]) => (
<div
key={key}
className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'
>
<span className='font-medium'>{key}:</span>
<span className='break-all'>{value as string}</span>
</div>
))}
{/* <div className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'>
<div className='font-medium'>{t('ip')}:</div>
<div>{log.ip}</div>
@@ -45,6 +45,9 @@ const formSchema = z.object({
speed_limit: z.number().optional(),
device_limit: z.number().optional(),
expired_at: z.number().nullish().optional(),
upload: z.number().optional(),
download: z.number().optional(),
id: z.number().optional(),
});
export function SubscriptionForm({ trigger, title, loading, initialData, onSubmit }: Props) {
+11 -10
View File
@@ -9,20 +9,20 @@ import { NextIntlClientProvider } from 'next-intl';
import { getLocale, getMessages } from 'next-intl/server';
import { PublicEnvScript } from 'next-runtime-env';
import { unstable_noStore as noStore } from 'next/cache';
import { Geist, Geist_Mono } from 'next/font/google';
// import { Geist, Geist_Mono } from 'next/font/google';
import { cookies } from 'next/headers';
import NextTopLoader from 'nextjs-toploader';
import React from 'react';
const fontSans = Geist({
subsets: ['latin'],
variable: '--font-sans',
});
// const fontSans = Geist({
// subsets: ['latin'],
// variable: '--font-sans',
// });
const fontMono = Geist_Mono({
subsets: ['latin'],
variable: '--font-mono',
});
// const fontMono = Geist_Mono({
// subsets: ['latin'],
// variable: '--font-mono',
// });
export async function generateMetadata(): Promise<Metadata> {
noStore();
@@ -111,7 +111,8 @@ export default async function RootLayout({
</head>
<body
suppressHydrationWarning
className={`${fontSans.variable} ${fontMono.variable} size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
// ${fontSans.variable} ${fontMono.variable}
className={`size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
>
<NextIntlClientProvider messages={messages}>
<NextTopLoader showSpinner={false} />
-4
View File
@@ -11,7 +11,6 @@
"delete": "Smazat",
"deleteSuccess": "Pravidlo bylo úspěšně smazáno",
"deleteWarning": "Opravdu chcete smazat toto pravidlo? Tato akce není vratná.",
"description": "Popis pravidla",
"downloadTemplate": "Stáhnout šablonu",
"edit": "Upravit",
"editRule": "Upravit pravidlo",
@@ -22,7 +21,6 @@
"import": "Importovat",
"importFailed": "Import se nezdařil",
"importSuccess": "Import byl úspěšný",
"importYaml": "Importovat YAML",
"importYamlDescription": "Importujte pravidla ze souboru YAML, systém automaticky vytvoří skupiny pravidel na základě názvů skupin politiky",
"importYamlRules": "Importovat YAML pravidla",
"importing": "Importuji...",
@@ -31,11 +29,9 @@
"noValidRules": "Nebyly nalezeny žádné platné pravidla",
"pleaseUploadFile": "Prosím, nahrajte soubor YAML",
"preview": "Náhled",
"rules": "Obsah pravidla",
"rulesFormat": "Formát pravidla: typ pravidla, obsah shody, [politika], kde politika je volitelná.\nPokud politika není specifikována, bude automaticky použito aktuální jméno skupiny pravidel. Příklady:",
"rulesLabel": "Obsah pravidla",
"searchRule": "Hledat název pravidla",
"selectFile": "Vybrat soubor",
"selectTags": "Vybrat značky uzlu",
"tags": "Značky uzlu",
"tagsLabel": "Značky uzlu",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Limit na nákup/čas",
"replacement": "Obnovení ceny/krát",
"sell": "Prodej",
"show": "Zobrazit na hlavní stránce",
"show": "Zobrazit",
"sold": "Počet předplatných",
"subscribe": "Předplatit",
"subscribeGroup": "Přihlásit se ke skupině",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Potvrdit aktualizaci systému",
"confirmUpgrade": "Potvrdit aktualizaci",
"currentVersion": "Aktuální verze systému:",
"developmentVersion": "Vývojová verze",
"errors": "Chyby",
"ip": "IP",
"ip": "IP adresa",
"lastUpdated": "Poslední aktualizace:",
"newVersionAvailable": "Nová verze",
"none": "Žádný",
"query": "Dotaz",
"rebootDescription": "Opravdu chcete restartovat systém? Tato akce způsobí krátké přerušení služby.",
"rebooting": "Systém se restartuje...",
"refreshLogs": "Obnovit protokoly",
"request": "Žádost",
"serverVersion": "Server",
"status": "Stav",
"systemLogs": "Systémové protokoly",
"systemReboot": "Restart systému",
@@ -22,5 +25,8 @@
"systemUpgrade": "Aktualizace systému",
"upgradeDescription": "Jste si jisti, že chcete provést aktualizaci systému? Tato operace může trvat několik minut a během ní může být systém neodpovídající.",
"userAgent": "Uživatelský agent",
"viewLogsAndManage": "Zobrazit systémové protokoly, provádět aktualizace systému a restartovat operace"
"versionInfo": "Informace o verzi",
"viewLogsAndManage": "Zobrazit systémové protokoly, provádět aktualizace systému a restartovat operace",
"viewNewVersion": "Zobrazit novou verzi",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Löschen",
"deleteSuccess": "Regel erfolgreich gelöscht",
"deleteWarning": "Sind Sie sicher, dass Sie diese Regel löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"description": "Regelbeschreibung",
"downloadTemplate": "Vorlage herunterladen",
"edit": "Bearbeiten",
"editRule": "Regel bearbeiten",
@@ -22,7 +21,6 @@
"import": "Importieren",
"importFailed": "Import fehlgeschlagen",
"importSuccess": "Import erfolgreich",
"importYaml": "YAML importieren",
"importYamlDescription": "Regeln aus einer YAML-Datei importieren, das System erstellt automatisch Regelgruppen basierend auf den Namen der Richtliniengruppen",
"importYamlRules": "YAML-Regeln importieren",
"importing": "Importiere...",
@@ -31,11 +29,9 @@
"noValidRules": "Keine gültigen Regeln gefunden",
"pleaseUploadFile": "Bitte laden Sie eine YAML-Datei hoch",
"preview": "Vorschau",
"rules": "Regelinhalt",
"rulesFormat": "Regelformat: Regeltyp, Übereinstimmungsinhalt, [Richtlinie], wobei die Richtlinie optional ist.\nWenn keine Richtlinie angegeben ist, wird automatisch der aktuelle Regelgruppenname verwendet. Beispiele:",
"rulesLabel": "Regelinhalt",
"searchRule": "Regelname suchen",
"selectFile": "Datei auswählen",
"selectTags": "Knoten-Tags auswählen",
"tags": "Knoten-Tags",
"tagsLabel": "Knoten-Tags",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Kaufbeschränkung/pro Einkauf",
"replacement": "Preis pro Zurücksetzung",
"sell": "Verkauf",
"show": "Startseite anzeigen",
"show": "Anzeigen",
"sold": "Abonnentenzahl",
"subscribe": "Abonnieren",
"subscribeGroup": "Gruppe abonnieren",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Systemaktualisierung bestätigen",
"confirmUpgrade": "Upgrade bestätigen",
"currentVersion": "Aktuelle Systemversion:",
"developmentVersion": "Entwicklungsversion",
"errors": "Fehler",
"ip": "IP",
"ip": "IP-Adresse",
"lastUpdated": "Zuletzt aktualisiert:",
"newVersionAvailable": "Neue Version",
"none": "Keine",
"query": "Abfrage",
"rebootDescription": "Möchten Sie das System wirklich neu starten? Dieser Vorgang führt zu einer kurzen Unterbrechung des Dienstes.",
"rebooting": "System wird neu gestartet...",
"refreshLogs": "Protokolle aktualisieren",
"request": "Anfrage",
"serverVersion": "Server",
"status": "Status",
"systemLogs": "Systemprotokolle",
"systemReboot": "Systemneustart",
@@ -22,5 +25,8 @@
"systemUpgrade": "Systemaktualisierung",
"upgradeDescription": "Möchten Sie das System-Upgrade wirklich durchführen? Dieser Vorgang kann einige Minuten dauern, währenddessen das System möglicherweise nicht reagiert.",
"userAgent": "Benutzeragent",
"viewLogsAndManage": "Systemprotokolle anzeigen, Systemaktualisierungen durchführen und Neustartvorgänge ausführen"
"versionInfo": "Versionsinformationen",
"viewLogsAndManage": "Systemprotokolle anzeigen, Systemaktualisierungen durchführen und Neustartvorgänge ausführen",
"viewNewVersion": "Neue Version anzeigen",
"webVersion": "Web/Admin"
}
+6 -4
View File
@@ -8,10 +8,12 @@
"createRule": "Add Rule",
"createSuccess": "Rule created successfully",
"createdAt": "Created At",
"default": "Default",
"defaultRule": "Default Rule",
"delete": "Delete",
"deleteSuccess": "Rule deleted successfully",
"deleteWarning": "Are you sure you want to delete this rule? This action cannot be undone.",
"description": "Rule Description",
"direct": "Direct",
"downloadTemplate": "Download Template",
"edit": "Edit",
"editRule": "Edit Rule",
@@ -22,7 +24,6 @@
"import": "Import",
"importFailed": "Import failed",
"importSuccess": "Import successful",
"importYaml": "Import YAML",
"importYamlDescription": "Import rules from YAML file, the system will automatically create rule groups based on policy group names",
"importYamlRules": "Import YAML Rules",
"importing": "Importing...",
@@ -31,13 +32,14 @@
"noValidRules": "No valid rules found",
"pleaseUploadFile": "Please upload a YAML file",
"preview": "Preview",
"rules": "Rule Content",
"reject": "Reject",
"rulesFormat": "Rule format: rule type,match content,[policy], where policy is optional.\nIf policy is not specified, the current rule group name will be used automatically. Examples:",
"rulesLabel": "Rule Content",
"searchRule": "Search rule name",
"selectFile": "Select File",
"selectTags": "Select node tags",
"selectType": "Select rule type",
"tags": "Node Tags",
"tagsLabel": "Node Tags",
"type": "Rule Type",
"updateSuccess": "Rule updated successfully"
}
+7
View File
@@ -63,16 +63,20 @@
"edit": "Edit",
"editNode": "Edit Node",
"enable": "Enable",
"id": "ID",
"form": {
"allowInsecure": "Allow Insecure",
"cancel": "Cancel",
"city": "City",
"confirm": "Confirm",
"congestionController": "Congestion Controller",
"country": "Country",
"disableSni": "Disable SNI",
"edit": "Edit",
"editSecurity": "Edit Security Configuration",
"enableTLS": "Enable TLS",
"encryptionMethod": "Encryption Method",
"fingerprint": "Fingerprint",
"flow": "Flow Control Algorithm",
"groupId": "Node Group",
"hopInterval": "Hop Interval",
@@ -85,6 +89,7 @@
"pleaseSelect": "Please Select",
"port": "Server Port",
"protocol": "Protocol",
"reduceRtt": "Reduce RTT",
"relayHost": "Relay Host",
"relayMode": "Relay Mode",
"relayModeOptions": {
@@ -128,6 +133,7 @@
"transport": "Transport Protocol Configuration",
"transportConfig": "Transport Protocol Configuration",
"transportHost": "Transport Server Address",
"udpRelayMode": "UDP Relay Mode",
"transportPath": "Transport Path",
"transportServerName": "Transport Server Name"
},
@@ -136,6 +142,7 @@
"name": "Name",
"node": "Node",
"nodeGroup": "Node Group",
"noData": "--",
"normal": "Normal",
"onlineCount": "Online users",
"onlineUsers": "Online Users",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Purchase Limit/Time",
"replacement": "Reset Price/Time",
"sell": "Sell",
"show": "Home display",
"show": "Display",
"sold": "Subscription Count",
"subscribe": "Subscribe",
"subscribeGroup": "Subscription Group",
+7 -1
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirm System Upgrade",
"confirmUpgrade": "Confirm Upgrade",
"currentVersion": "Current System Version:",
"developmentVersion": "Dev",
"errors": "Errors",
"ip": "IP",
"lastUpdated": "Last Updated:",
"newVersionAvailable": "New Version",
"none": "None",
"query": "Query",
"rebootDescription": "Are you sure you want to reboot the system? This operation will cause a brief service interruption.",
"rebooting": "Rebooting system...",
"refreshLogs": "Refresh Logs",
"request": "Request",
"serverVersion": "Server",
"status": "Status",
"systemLogs": "System Logs",
"systemReboot": "System Reboot",
@@ -22,5 +25,8 @@
"systemUpgrade": "System Upgrade",
"upgradeDescription": "Are you sure you want to perform a system upgrade? This operation may take a few minutes, during which the system may be unresponsive.",
"userAgent": "User Agent",
"viewLogsAndManage": "View system logs, perform system upgrade and reboot operations"
"versionInfo": "Version Information",
"viewLogsAndManage": "View system logs, perform system upgrade and reboot operations",
"viewNewVersion": "View New Version",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Eliminar",
"deleteSuccess": "Regla eliminada con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
"description": "Descripción de la Regla",
"downloadTemplate": "Descargar Plantilla",
"edit": "Editar",
"editRule": "Editar Regla",
@@ -22,7 +21,6 @@
"import": "Importar",
"importFailed": "Importación fallida",
"importSuccess": "Importación exitosa",
"importYaml": "Importar YAML",
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
"importYamlRules": "Importar Reglas YAML",
"importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "No se encontraron reglas válidas",
"pleaseUploadFile": "Por favor, suba un archivo YAML",
"preview": "Vista Previa",
"rules": "Contenido de la Regla",
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
"rulesLabel": "Contenido de la Regla",
"searchRule": "Buscar nombre de regla",
"selectFile": "Seleccionar Archivo",
"selectTags": "Seleccionar etiquetas de nodo",
"tags": "Etiquetas de Nodo",
"tagsLabel": "Etiquetas de Nodo",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Límite de compra/vez",
"replacement": "Restablecer precio/vez",
"sell": "Venta",
"show": "Mostrar en la página de inicio",
"show": "Mostrar",
"sold": "Conteo de Suscripciones",
"subscribe": "Suscribirse",
"subscribeGroup": "Suscribirse al grupo",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirmar actualización del sistema",
"confirmUpgrade": "Confirmar actualización",
"currentVersion": "Versión actual del sistema:",
"developmentVersion": "Versión de desarrollo",
"errors": "Errores",
"ip": "IP",
"ip": "Dirección IP",
"lastUpdated": "Última actualización:",
"newVersionAvailable": "Nueva versión",
"none": "Ninguno",
"query": "Consulta",
"rebootDescription": "¿Está seguro de que desea reiniciar el sistema? Esta acción provocará una breve interrupción del servicio.",
"rebooting": "Reiniciando el sistema...",
"refreshLogs": "Actualizar registros",
"request": "Solicitud",
"serverVersion": "Servidor",
"status": "Estado",
"systemLogs": "Registros del sistema",
"systemReboot": "Reinicio del sistema",
@@ -22,5 +25,8 @@
"systemUpgrade": "Actualización del sistema",
"upgradeDescription": "¿Está seguro de que desea realizar la actualización del sistema? Esta operación puede tardar unos minutos, durante los cuales el sistema podría no responder.",
"userAgent": "Agente de Usuario",
"viewLogsAndManage": "Ver los registros del sistema, realizar actualizaciones del sistema y reiniciar operaciones"
"versionInfo": "Información de versión",
"viewLogsAndManage": "Ver los registros del sistema, realizar actualizaciones del sistema y reiniciar operaciones",
"viewNewVersion": "Ver nueva versión",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Eliminar",
"deleteSuccess": "Regla eliminada con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
"description": "Descripción de la Regla",
"downloadTemplate": "Descargar Plantilla",
"edit": "Editar",
"editRule": "Editar Regla",
@@ -22,7 +21,6 @@
"import": "Importar",
"importFailed": "Importación fallida",
"importSuccess": "Importación exitosa",
"importYaml": "Importar YAML",
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
"importYamlRules": "Importar Reglas YAML",
"importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "No se encontraron reglas válidas",
"pleaseUploadFile": "Por favor, suba un archivo YAML",
"preview": "Vista Previa",
"rules": "Contenido de la Regla",
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
"rulesLabel": "Contenido de la Regla",
"searchRule": "Buscar nombre de regla",
"selectFile": "Seleccionar Archivo",
"selectTags": "Seleccionar etiquetas de nodo",
"tags": "Etiquetas de Nodo",
"tagsLabel": "Etiquetas de Nodo",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Límite de compra/vez",
"replacement": "Restablecer precio/vez",
"sell": "venta",
"show": "Mostrar en la página de inicio",
"show": "Mostrar",
"sold": "Conteo de Suscripciones",
"subscribe": "Suscribirse",
"subscribeGroup": "Suscribirse al grupo",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirmar actualización del sistema",
"confirmUpgrade": "Confirmar actualización",
"currentVersion": "Versión actual del sistema:",
"developmentVersion": "Versión de desarrollo",
"errors": "Errores",
"ip": "IP",
"ip": "Dirección IP",
"lastUpdated": "Última actualización:",
"newVersionAvailable": "Nueva versión",
"none": "Ninguno",
"query": "Consulta",
"rebootDescription": "¿Está seguro de que desea reiniciar el sistema? Esta acción provocará una breve interrupción del servicio.",
"rebooting": "Reiniciando el sistema...",
"refreshLogs": "Actualizar registros",
"request": "Solicitud",
"serverVersion": "Servidor",
"status": "Estado",
"systemLogs": "Registros del sistema",
"systemReboot": "Reinicio del sistema",
@@ -22,5 +25,8 @@
"systemUpgrade": "Actualización del sistema",
"upgradeDescription": "¿Está seguro de que desea realizar la actualización del sistema? Esta operación puede tardar unos minutos, durante los cuales el sistema podría no responder.",
"userAgent": "Agente de Usuario",
"viewLogsAndManage": "Ver los registros del sistema, realizar actualizaciones del sistema y reiniciar operaciones"
"versionInfo": "Información de versión",
"viewLogsAndManage": "Ver los registros del sistema, realizar actualizaciones del sistema y reiniciar operaciones",
"viewNewVersion": "Ver nueva versión",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "حذف",
"deleteSuccess": "قانون با موفقیت حذف شد",
"deleteWarning": "آیا مطمئن هستید که می‌خواهید این قانون را حذف کنید؟ این عمل قابل بازگشت نیست.",
"description": "توضیحات قانون",
"downloadTemplate": "دانلود الگو",
"edit": "ویرایش",
"editRule": "ویرایش قانون",
@@ -22,7 +21,6 @@
"import": "وارد کردن",
"importFailed": "وارد کردن ناموفق بود",
"importSuccess": "وارد کردن با موفقیت انجام شد",
"importYaml": "وارد کردن YAML",
"importYamlDescription": "وارد کردن قوانین از فایل YAML، سیستم به طور خودکار گروه‌های قانونی را بر اساس نام‌های گروه سیاست ایجاد خواهد کرد",
"importYamlRules": "وارد کردن قوانین YAML",
"importing": "در حال وارد کردن...",
@@ -31,11 +29,9 @@
"noValidRules": "هیچ قانونی یافت نشد",
"pleaseUploadFile": "لطفاً یک فایل YAML بارگذاری کنید",
"preview": "پیش‌نمایش",
"rules": "محتوای قانون",
"rulesFormat": "فرمت قانون: نوع قانون، محتوای تطابق، [سیاست]، که سیاست اختیاری است.\nاگر سیاست مشخص نشود، نام گروه قانونی فعلی به طور خودکار استفاده خواهد شد. مثال‌ها:",
"rulesLabel": "محتوای قانون",
"searchRule": "جستجوی نام قانون",
"selectFile": "انتخاب فایل",
"selectTags": "انتخاب برچسب‌های گره",
"tags": "برچسب‌های گره",
"tagsLabel": "برچسب‌های گره",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "محدودیت خرید/زمان",
"replacement": "تنظیم مجدد قیمت/زمان",
"sell": "فروش",
"show": "نمایش خانه",
"show": "نمایش",
"sold": "تعداد اشتراک",
"subscribe": "اشتراک",
"subscribeGroup": "گروه اشتراک",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "تأیید ارتقاء سیستم",
"confirmUpgrade": "تأیید ارتقاء",
"currentVersion": "نسخه فعلی سیستم:",
"developmentVersion": "نسخه توسعه",
"errors": "خطاها",
"ip": "آی‌پی",
"ip": درس آی‌پی",
"lastUpdated": "آخرین به‌روزرسانی:",
"newVersionAvailable": "نسخه جدید",
"none": "هیچ",
"query": "پرس و جو",
"rebootDescription": "آیا مطمئن هستید که می‌خواهید سیستم را راه‌اندازی مجدد کنید؟ این عملیات باعث وقفه کوتاهی در خدمات خواهد شد.",
"rebooting": "در حال راه‌اندازی مجدد سیستم...",
"refreshLogs": "تازه‌سازی گزارش‌ها",
"request": "درخواست",
"serverVersion": "سرور",
"status": "وضعیت",
"systemLogs": "گزارش‌های سیستم",
"systemReboot": "راه‌اندازی مجدد سیستم",
@@ -22,5 +25,8 @@
"systemUpgrade": "ارتقاء سیستم",
"upgradeDescription": "آیا مطمئن هستید که می‌خواهید ارتقاء سیستم را انجام دهید؟ این عملیات ممکن است چند دقیقه طول بکشد و در این مدت سیستم ممکن است پاسخگو نباشد.",
"userAgent": "عامل کاربر",
"viewLogsAndManage": "مشاهده گزارش‌های سیستم، انجام ارتقاء سیستم و عملیات راه‌اندازی مجدد"
"versionInfo": "اطلاعات نسخه",
"viewLogsAndManage": "مشاهده گزارش‌های سیستم، انجام ارتقاء سیستم و عملیات راه‌اندازی مجدد",
"viewNewVersion": "مشاهده نسخه جدید",
"webVersion": "وب/مدیریت"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Poista",
"deleteSuccess": "Sääntö poistettiin onnistuneesti",
"deleteWarning": "Oletko varma, että haluat poistaa tämän säännön? Tätä toimintoa ei voi peruuttaa.",
"description": "Säännön kuvaus",
"downloadTemplate": "Lataa malli",
"edit": "Muokkaa",
"editRule": "Muokkaa sääntöä",
@@ -22,7 +21,6 @@
"import": "Tuoda",
"importFailed": "Tuonti epäonnistui",
"importSuccess": "Tuonti onnistui",
"importYaml": "Tuo YAML",
"importYamlDescription": "Tuo sääntöjä YAML-tiedostosta, järjestelmä luo automaattisesti sääntöryhmiä politiikkaryhmän nimien perusteella",
"importYamlRules": "Tuo YAML-säännöt",
"importing": "Tuodaan...",
@@ -31,11 +29,9 @@
"noValidRules": "Ei voimassa olevia sääntöjä löytynyt",
"pleaseUploadFile": "Lataa YAML-tiedosto",
"preview": "Esikatselu",
"rules": "Säännön sisältö",
"rulesFormat": "Sääntömuoto: sääntötyyppi, vastaavuus, [politiikka], jossa politiikka on valinnainen.\nJos politiikkaa ei ole määritelty, nykyistä sääntöryhmän nimeä käytetään automaattisesti. Esimerkkejä:",
"rulesLabel": "Säännön sisältö",
"searchRule": "Etsi säännön nimeä",
"selectFile": "Valitse tiedosto",
"selectTags": "Valitse solmun tunnisteet",
"tags": "Solmun tunnisteet",
"tagsLabel": "Solmun tunnisteet",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Ostorajoitus/kerta",
"replacement": "Nollaa hinta/kerta",
"sell": "myydä",
"show": "Etusivun näyt",
"show": "Näytä",
"sold": "Tilausmäärä",
"subscribe": "Tilaa",
"subscribeGroup": "Tilaa ryhmä",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Vahvista järjestelmän päivitys",
"confirmUpgrade": "Vahvista päivitys",
"currentVersion": "Nykyinen järjestelmäversio:",
"developmentVersion": "Kehitysversio",
"errors": "Virheet",
"ip": "IP",
"ip": "IP-osoite",
"lastUpdated": "Viimeksi päivitetty:",
"newVersionAvailable": "Uusi versio",
"none": "Ei mitään",
"query": "Kysely",
"rebootDescription": "Oletko varma, että haluat käynnistää järjestelmän uudelleen? Tämä toimenpide aiheuttaa lyhyen palvelukatkon.",
"rebooting": "Järjestelmä käynnistyy uudelleen...",
"refreshLogs": "Päivitä lokit",
"request": "Pyyntö",
"serverVersion": "Palvelin",
"status": "Tila",
"systemLogs": "Järjestelmän lokit",
"systemReboot": "Järjestelmän uudelleenkäynnistys",
@@ -22,5 +25,8 @@
"systemUpgrade": "Järjestelmän päivitys",
"upgradeDescription": "Haluatko varmasti suorittaa järjestelmäpäivityksen? Tämä toimenpide voi kestää muutaman minuutin, ja sen aikana järjestelmä ei välttämättä vastaa.",
"userAgent": "Käyttäjäagentti",
"viewLogsAndManage": "Tarkastele järjestelmän lokitietoja, suorita järjestelmäpäivityksiä ja uudelleenkäynnistyksiä"
"versionInfo": "Versiotiedot",
"viewLogsAndManage": "Tarkastele järjestelmän lokitietoja, suorita järjestelmäpäivityksiä ja uudelleenkäynnistyksiä",
"viewNewVersion": "Näytä uusi versio",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Supprimer",
"deleteSuccess": "Règle supprimée avec succès",
"deleteWarning": "Êtes-vous sûr de vouloir supprimer cette règle ? Cette action ne peut pas être annulée.",
"description": "Description de la règle",
"downloadTemplate": "Télécharger le modèle",
"edit": "Modifier",
"editRule": "Modifier la règle",
@@ -22,7 +21,6 @@
"import": "Importer",
"importFailed": "Échec de l'importation",
"importSuccess": "Importation réussie",
"importYaml": "Importer YAML",
"importYamlDescription": "Importer des règles à partir d'un fichier YAML, le système créera automatiquement des groupes de règles en fonction des noms de groupes de politiques",
"importYamlRules": "Importer des règles YAML",
"importing": "Importation en cours...",
@@ -31,11 +29,9 @@
"noValidRules": "Aucune règle valide trouvée",
"pleaseUploadFile": "Veuillez télécharger un fichier YAML",
"preview": "Aperçu",
"rules": "Contenu de la règle",
"rulesFormat": "Format de la règle : type de règle, contenu de correspondance, [politique], où la politique est optionnelle.\nSi la politique n'est pas spécifiée, le nom du groupe de règles actuel sera utilisé automatiquement. Exemples :",
"rulesLabel": "Contenu de la règle",
"searchRule": "Rechercher le nom de la règle",
"selectFile": "Sélectionner un fichier",
"selectTags": "Sélectionner des balises de nœud",
"tags": "Balises de nœud",
"tagsLabel": "Balises de nœud",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Limite d'achat/par fois",
"replacement": "Réinitialiser le prix/par fois",
"sell": "Vente",
"show": "Afficher sur la page d'accueil",
"show": "Afficher",
"sold": "Nombre d'abonnements",
"subscribe": "S'abonner",
"subscribeGroup": "S'abonner au groupe",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirmer la mise à niveau du système",
"confirmUpgrade": "Confirmer la mise à niveau",
"currentVersion": "Version actuelle du système :",
"developmentVersion": "Version de développement",
"errors": "Erreurs",
"ip": "IP",
"ip": "Adresse IP",
"lastUpdated": "Dernière mise à jour :",
"newVersionAvailable": "Nouvelle version",
"none": "Aucun",
"query": "Requête",
"rebootDescription": "Êtes-vous sûr de vouloir redémarrer le système ? Cette opération entraînera une interruption temporaire du service.",
"rebooting": "Redémarrage du système...",
"refreshLogs": "Rafraîchir les journaux",
"request": "Demande",
"serverVersion": "Serveur",
"status": "Statut",
"systemLogs": "Journaux système",
"systemReboot": "Redémarrage du système",
@@ -22,5 +25,8 @@
"systemUpgrade": "Mise à niveau du système",
"upgradeDescription": "Êtes-vous sûr de vouloir effectuer la mise à niveau du système ? Cette opération peut prendre quelques minutes, pendant lesquelles le système peut ne pas répondre.",
"userAgent": "Agent utilisateur",
"viewLogsAndManage": "Afficher les journaux système, effectuer des mises à niveau et redémarrer le système"
"versionInfo": "Informations de version",
"viewLogsAndManage": "Afficher les journaux système, effectuer des mises à niveau et redémarrer le système",
"viewNewVersion": "Voir la nouvelle version",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "हटाएं",
"deleteSuccess": "नियम सफलतापूर्वक हटाया गया",
"deleteWarning": "क्या आप वाकई इस नियम को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
"description": "नियम विवरण",
"downloadTemplate": "टेम्पलेट डाउनलोड करें",
"edit": "संपादित करें",
"editRule": "नियम संपादित करें",
@@ -22,7 +21,6 @@
"import": "आयात करें",
"importFailed": "आयात विफल",
"importSuccess": "आयात सफल",
"importYaml": "YAML आयात करें",
"importYamlDescription": "YAML फ़ाइल से नियम आयात करें, प्रणाली स्वचालित रूप से नीति समूह नामों के आधार पर नियम समूह बनाएगी",
"importYamlRules": "YAML नियम आयात करें",
"importing": "आयात कर रहा है...",
@@ -31,11 +29,9 @@
"noValidRules": "कोई मान्य नियम नहीं मिला",
"pleaseUploadFile": "कृपया एक YAML फ़ाइल अपलोड करें",
"preview": "पूर्वावलोकन",
"rules": "नियम सामग्री",
"rulesFormat": "नियम प्रारूप: नियम प्रकार, मिलान सामग्री, [नीति], जहाँ नीति वैकल्पिक है।\nयदि नीति निर्दिष्ट नहीं की गई है, तो वर्तमान नियम समूह का नाम स्वचालित रूप से उपयोग किया जाएगा। उदाहरण:",
"rulesLabel": "नियम सामग्री",
"searchRule": "नियम नाम खोजें",
"selectFile": "फ़ाइल चुनें",
"selectTags": "नोड टैग चुनें",
"tags": "नोड टैग",
"tagsLabel": "नोड टैग",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "प्रति खरीद सीमा",
"replacement": "मूल्य/प्रति बार रीसेट करें",
"sell": "बिक्री",
"show": "मुखपृष्ठ पर दिखाएं",
"show": "दिखाएं",
"sold": "सदस्यता गणना",
"subscribe": "सदस्यता लें",
"subscribeGroup": "सदस्यता समूह",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "सिस्टम उन्नयन की पुष्टि करें",
"confirmUpgrade": "उन्नयन की पुष्टि करें",
"currentVersion": "वर्तमान सिस्टम संस्करण:",
"developmentVersion": "विकास संस्करण",
"errors": "त्रुटियाँ",
"ip": "आईपी",
"ip": "आईपी पता",
"lastUpdated": "अंतिम अपडेट:",
"newVersionAvailable": "नया संस्करण",
"none": "कोई नहीं",
"query": "प्रश्न",
"rebootDescription": "क्या आप वाकई सिस्टम को पुनः आरंभ करना चाहते हैं? इस क्रिया से थोड़े समय के लिए सेवा में बाधा आ सकती है।",
"rebooting": "सिस्टम को पुनः आरंभ किया जा रहा है...",
"refreshLogs": "लॉग्स को ताज़ा करें",
"request": "अनुरोध",
"serverVersion": "सर्वर",
"status": "स्थिति",
"systemLogs": "सिस्टम लॉग्स",
"systemReboot": "सिस्टम पुनरारंभ",
@@ -22,5 +25,8 @@
"systemUpgrade": "सिस्टम उन्नयन",
"upgradeDescription": "क्या आप वाकई सिस्टम अपग्रेड करना चाहते हैं? इस प्रक्रिया में कुछ मिनट लग सकते हैं और इस दौरान सिस्टम प्रतिक्रिया नहीं दे सकता है।",
"userAgent": "उपयोगकर्ता एजेंट",
"viewLogsAndManage": "सिस्टम लॉग देखें, सिस्टम अपग्रेड और पुनरारंभ संचालन करें"
"versionInfo": "संस्करण जानकारी",
"viewLogsAndManage": "सिस्टम लॉग देखें, सिस्टम अपग्रेड और पुनरारंभ संचालन करें",
"viewNewVersion": "नया संस्करण देखें",
"webVersion": "वेब/एडमिन"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Törlés",
"deleteSuccess": "A szabály sikeresen törölve",
"deleteWarning": "Biztosan törölni szeretné ezt a szabályt? Ez a művelet nem vonható vissza.",
"description": "Szabály leírása",
"downloadTemplate": "Sablon letöltése",
"edit": "Szerkesztés",
"editRule": "Szabály szerkesztése",
@@ -22,7 +21,6 @@
"import": "Importálás",
"importFailed": "Importálás sikertelen",
"importSuccess": "Importálás sikeres",
"importYaml": "YAML importálása",
"importYamlDescription": "Szabályok importálása YAML fájlból, a rendszer automatikusan létrehozza a szabálycsoportokat a politikai csoportnevek alapján",
"importYamlRules": "YAML szabályok importálása",
"importing": "Importálás...",
@@ -31,11 +29,9 @@
"noValidRules": "Nincsenek érvényes szabályok",
"pleaseUploadFile": "Kérjük, töltsön fel egy YAML fájlt",
"preview": "Előnézet",
"rules": "Szabály tartalom",
"rulesFormat": "Szabály formátum: szabály típusa, egyezési tartalom, [politika], ahol a politika opcionális.\nHa a politika nincs megadva, az aktuális szabálycsoport neve automatikusan felhasználásra kerül. Példák:",
"rulesLabel": "Szabály tartalom",
"searchRule": "Szabály név keresése",
"selectFile": "Fájl kiválasztása",
"selectTags": "Válassza ki a csomópont címkéket",
"tags": "Csomópont címkék",
"tagsLabel": "Csomópont címkék",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Vásárlási korlát/alkalom",
"replacement": "Ár visszaállítása/alkalom",
"sell": "eladás",
"show": "Kezdőlap megjelenítése",
"show": "Megjelenítés",
"sold": "Előfizetések száma",
"subscribe": "Feliratkozás",
"subscribeGroup": "Feliratkozási csoport",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Rendszerfrissítés megerősítése",
"confirmUpgrade": "Megerősítés frissítése",
"currentVersion": "Jelenlegi rendszerverzió:",
"developmentVersion": "Fejlesztői verzió",
"errors": "Hibák",
"ip": "IP",
"ip": "IP-cím",
"lastUpdated": "Utoljára frissítve:",
"newVersionAvailable": "Új verzió",
"none": "Nincs",
"query": "Lekérdezés",
"rebootDescription": "Biztosan újra akarja indítani a rendszert? Ez a művelet rövid idejű szolgáltatáskimaradást okoz.",
"rebooting": "A rendszer újraindítása folyamatban...",
"refreshLogs": "Naplók frissítése",
"request": "Kérés",
"serverVersion": "Szerver",
"status": "Állapot",
"systemLogs": "Rendszernaplók",
"systemReboot": "Rendszer újraindítása",
@@ -22,5 +25,8 @@
"systemUpgrade": "Rendszerfrissítés",
"upgradeDescription": "Biztosan végre akarja hajtani a rendszerfrissítést? Ez a művelet néhány percet vehet igénybe, és ezalatt a rendszer esetleg nem fog válaszolni.",
"userAgent": "Felhasználói ügynök",
"viewLogsAndManage": "Tekintse meg a rendszer naplóit, hajtsa végre a rendszerfrissítéseket és az újraindítási műveleteket"
"versionInfo": "Verzióinformáció",
"viewLogsAndManage": "Tekintse meg a rendszer naplóit, hajtsa végre a rendszerfrissítéseket és az újraindítási műveleteket",
"viewNewVersion": "Új verzió megtekintése",
"webVersion": "Web/Admin"
}
+3 -4
View File
@@ -8,10 +8,10 @@
"createRule": "ルールを追加",
"createSuccess": "ルールが正常に作成されました",
"createdAt": "作成日時",
"defaultRule": "デフォルトルール",
"delete": "削除",
"deleteSuccess": "ルールが正常に削除されました",
"deleteWarning": "このルールを削除してもよろしいですか?この操作は元に戻せません。",
"description": "ルールの説明",
"downloadTemplate": "テンプレートをダウンロード",
"edit": "編集",
"editRule": "ルールを編集",
@@ -22,7 +22,6 @@
"import": "インポート",
"importFailed": "インポートに失敗しました",
"importSuccess": "インポートが成功しました",
"importYaml": "YAMLをインポート",
"importYamlDescription": "YAMLファイルからルールをインポートします。システムはポリシーグループ名に基づいてルールグループを自動的に作成します。",
"importYamlRules": "YAMLルールをインポート",
"importing": "インポート中...",
@@ -31,13 +30,13 @@
"noValidRules": "有効なルールが見つかりません",
"pleaseUploadFile": "YAMLファイルをアップロードしてください",
"preview": "プレビュー",
"rules": "ルールの内容",
"rulesFormat": "ルール形式: ルールタイプ, マッチ内容, [ポリシー](ポリシーはオプションです)。\nポリシーが指定されていない場合、現在のルールグループ名が自動的に使用されます。例:",
"rulesLabel": "ルールの内容",
"searchRule": "ルール名を検索",
"selectFile": "ファイルを選択",
"selectTags": "ノードタグを選択",
"selectType": "ルールタイプを選択",
"tags": "ノードタグ",
"tagsLabel": "ノードタグ",
"type": "ルールタイプ",
"updateSuccess": "ルールが正常に更新されました"
}
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "購入制限/回",
"replacement": "リセット価格/回",
"sell": "販売",
"show": "ホームページ表示",
"show": "表示",
"sold": "サブスクリプション数",
"subscribe": "購読",
"subscribeGroup": "グループを購読する",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "システムアップグレードを確認",
"confirmUpgrade": "アップグレードを確認",
"currentVersion": "現在のシステムバージョン:",
"developmentVersion": "開発版",
"errors": "エラー",
"ip": "IP",
"ip": "IPアドレス",
"lastUpdated": "最終更新:",
"newVersionAvailable": "新版利用可能",
"none": "なし",
"query": "クエリ",
"rebootDescription": "システムを再起動してもよろしいですか?この操作は一時的なサービス中断を引き起こします。",
"rebooting": "システムを再起動しています...",
"refreshLogs": "ログを更新",
"request": "リクエスト",
"serverVersion": "サーバー",
"status": "ステータス",
"systemLogs": "システムログ",
"systemReboot": "システム再起動",
@@ -22,5 +25,8 @@
"systemUpgrade": "システムアップグレード",
"upgradeDescription": "システムのアップグレードを実行してもよろしいですか?この操作には数分かかる場合があり、その間システムが応答しない可能性があります。",
"userAgent": "ユーザーエージェント",
"viewLogsAndManage": "システムログを表示し、システムのアップグレードと再起動を実行する"
"versionInfo": "バージョン情報",
"viewLogsAndManage": "システムログを表示し、システムのアップグレードと再起動を実行する",
"viewNewVersion": "新版を表示",
"webVersion": "ウェブ/管理者"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "삭제",
"deleteSuccess": "규칙이 성공적으로 삭제되었습니다",
"deleteWarning": "이 규칙을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
"description": "규칙 설명",
"downloadTemplate": "템플릿 다운로드",
"edit": "편집",
"editRule": "규칙 편집",
@@ -22,7 +21,6 @@
"import": "가져오기",
"importFailed": "가져오기에 실패했습니다",
"importSuccess": "가져오기가 성공적으로 완료되었습니다",
"importYaml": "YAML 가져오기",
"importYamlDescription": "YAML 파일에서 규칙을 가져오며, 시스템이 정책 그룹 이름에 따라 규칙 그룹을 자동으로 생성합니다",
"importYamlRules": "YAML 규칙 가져오기",
"importing": "가져오는 중...",
@@ -31,11 +29,9 @@
"noValidRules": "유효한 규칙이 없습니다",
"pleaseUploadFile": "YAML 파일을 업로드해 주세요",
"preview": "미리보기",
"rules": "규칙 내용",
"rulesFormat": "규칙 형식: 규칙 유형, 일치하는 내용, [정책], 여기서 정책은 선택 사항입니다.\n정책이 지정되지 않으면 현재 규칙 그룹 이름이 자동으로 사용됩니다. 예시:",
"rulesLabel": "규칙 내용",
"searchRule": "규칙 이름 검색",
"selectFile": "파일 선택",
"selectTags": "노드 태그 선택",
"tags": "노드 태그",
"tagsLabel": "노드 태그",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "구매 제한/회",
"replacement": "가격 재설정/회",
"sell": "판매",
"show": "홈 화면 표시",
"show": "표시",
"sold": "구독 수",
"subscribe": "구독",
"subscribeGroup": "구독 그룹",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "시스템 업그레이드를 확인",
"confirmUpgrade": "업그레이드 확인",
"currentVersion": "현재 시스템 버전:",
"developmentVersion": "개발 버전",
"errors": "오류",
"ip": "IP",
"ip": "IP 주소",
"lastUpdated": "마지막 업데이트:",
"newVersionAvailable": "새 버전",
"none": "없음",
"query": "쿼리",
"rebootDescription": "시스템을 재부팅하시겠습니까? 이 작업은 일시적인 서비스 중단을 초래할 수 있습니다.",
"rebooting": "시스템을 재부팅 중입니다...",
"refreshLogs": "로그 새로고침",
"request": "요청",
"serverVersion": "서버",
"status": "상태",
"systemLogs": "시스템 로그",
"systemReboot": "시스템 재부팅",
@@ -22,5 +25,8 @@
"systemUpgrade": "시스템 업그레이드",
"upgradeDescription": "시스템 업그레이드를 수행하시겠습니까? 이 작업은 몇 분이 소요될 수 있으며, 그 동안 시스템이 응답하지 않을 수 있습니다.",
"userAgent": "사용자 에이전트",
"viewLogsAndManage": "시스템 로그를 보고 시스템 업그레이드 및 재시작 작업을 수행합니다"
"versionInfo": "버전 정보",
"viewLogsAndManage": "시스템 로그를 보고 시스템 업그레이드 및 재시작 작업을 수행합니다",
"viewNewVersion": "새 버전 보기",
"webVersion": "웹/관리자"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Slett",
"deleteSuccess": "Regel slettet med suksess",
"deleteWarning": "Er du sikker på at du vil slette denne regelen? Denne handlingen kan ikke angres.",
"description": "Regelbeskrivelse",
"downloadTemplate": "Last ned mal",
"edit": "Rediger",
"editRule": "Rediger regel",
@@ -22,7 +21,6 @@
"import": "Importer",
"importFailed": "Import mislyktes",
"importSuccess": "Import vellykket",
"importYaml": "Importer YAML",
"importYamlDescription": "Importer regler fra YAML-fil, systemet vil automatisk opprette regelgrupper basert på policygruppens navn",
"importYamlRules": "Importer YAML-regler",
"importing": "Importer...",
@@ -31,11 +29,9 @@
"noValidRules": "Ingen gyldige regler funnet",
"pleaseUploadFile": "Vennligst last opp en YAML-fil",
"preview": "Forhåndsvisning",
"rules": "Regelinnhold",
"rulesFormat": "Regelformat: regeltype, matchinnhold, [policy], der policy er valgfritt.\nHvis policy ikke er spesifisert, vil det nåværende regelgruppens navn bli brukt automatisk. Eksempler:",
"rulesLabel": "Regelinnhold",
"searchRule": "Søk etter regelnavn",
"selectFile": "Velg fil",
"selectTags": "Velg nodetagger",
"tags": "Nodetagger",
"tagsLabel": "Nodetagger",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Kjøpsgrense/gang",
"replacement": "Tilbakestill pris/gang",
"sell": "Salg",
"show": "Vis på forsiden",
"show": "Vis",
"sold": "Abonnementsantall",
"subscribe": "Abonner",
"subscribeGroup": "Abonner på gruppe",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Bekreft systemoppgradering",
"confirmUpgrade": "Bekreft oppgradering",
"currentVersion": "Nåværende systemversjon:",
"developmentVersion": "Utviklingsversjon",
"errors": "Feil",
"ip": "IP",
"ip": "IP-adresse",
"lastUpdated": "Sist oppdatert:",
"newVersionAvailable": "Ny versjon",
"none": "Ingen",
"query": "Forespørsel",
"rebootDescription": "Er du sikker på at du vil starte systemet på nytt? Denne handlingen vil føre til et kort avbrudd i tjenesten.",
"rebooting": "Starter systemet på nytt...",
"refreshLogs": "Oppdater logger",
"request": "Forespørsel",
"serverVersion": "Server",
"status": "Status",
"systemLogs": "Systemlogger",
"systemReboot": "System omstart",
@@ -22,5 +25,8 @@
"systemUpgrade": "Systemoppgradering",
"upgradeDescription": "Er du sikker på at du vil utføre en systemoppgradering? Denne handlingen kan ta noen minutter, og systemet kan være utilgjengelig i løpet av denne tiden.",
"userAgent": "Brukeragent",
"viewLogsAndManage": "Se systemlogger, utfør systemoppgraderinger og omstart"
"versionInfo": "Versjonsinformasjon",
"viewLogsAndManage": "Se systemlogger, utfør systemoppgraderinger og omstart",
"viewNewVersion": "Se ny versjon",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Usuń",
"deleteSuccess": "Reguła została pomyślnie usunięta",
"deleteWarning": "Czy na pewno chcesz usunąć tę regułę? Ta akcja nie może być cofnięta.",
"description": "Opis Reguły",
"downloadTemplate": "Pobierz Szablon",
"edit": "Edytuj",
"editRule": "Edytuj Regułę",
@@ -22,7 +21,6 @@
"import": "Importuj",
"importFailed": "Import nie powiódł się",
"importSuccess": "Import zakończony sukcesem",
"importYaml": "Importuj YAML",
"importYamlDescription": "Importuj reguły z pliku YAML, system automatycznie utworzy grupy reguł na podstawie nazw grup polityk",
"importYamlRules": "Importuj Reguły YAML",
"importing": "Importowanie...",
@@ -31,11 +29,9 @@
"noValidRules": "Nie znaleziono prawidłowych reguł",
"pleaseUploadFile": "Proszę przesłać plik YAML",
"preview": "Podgląd",
"rules": "Treść Reguły",
"rulesFormat": "Format reguły: typ reguły, treść dopasowania, [polityka], gdzie polityka jest opcjonalna.\nJeśli polityka nie jest określona, aktualna nazwa grupy reguł zostanie użyta automatycznie. Przykłady:",
"rulesLabel": "Treść Reguły",
"searchRule": "Szukaj nazwy reguły",
"selectFile": "Wybierz Plik",
"selectTags": "Wybierz tagi węzła",
"tags": "Tagi Węzła",
"tagsLabel": "Tagi Węzła",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Limit zakupu/raz",
"replacement": "Zresetuj cenę/raz",
"sell": "Sprzedaż",
"show": "Pokaż na stronie głównej",
"show": "Pokaż",
"sold": "Liczba subskrypcji",
"subscribe": "Subskrybuj",
"subscribeGroup": "Subskrybuj grupę",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Potwierdź aktualizację systemu",
"confirmUpgrade": "Potwierdź aktualizację",
"currentVersion": "Obecna wersja systemu:",
"developmentVersion": "Wersja deweloperska",
"errors": "Błędy",
"ip": "IP",
"ip": "Adres IP",
"lastUpdated": "Ostatnia aktualizacja:",
"newVersionAvailable": "Nowa wersja",
"none": "Brak",
"query": "Zapytanie",
"rebootDescription": "Czy na pewno chcesz zrestartować system? Ta operacja spowoduje krótką przerwę w działaniu usług.",
"rebooting": "Trwa ponowne uruchamianie systemu...",
"refreshLogs": "Odśwież dzienniki",
"request": "Prośba",
"serverVersion": "Serwer",
"status": "Status",
"systemLogs": "Dzienniki systemowe",
"systemReboot": "Restart systemu",
@@ -22,5 +25,8 @@
"systemUpgrade": "Aktualizacja systemu",
"upgradeDescription": "Czy na pewno chcesz przeprowadzić aktualizację systemu? Ta operacja może zająć kilka minut, podczas których system może nie odpowiadać.",
"userAgent": "Agent użytkownika",
"viewLogsAndManage": "Przeglądaj dzienniki systemowe, wykonuj aktualizacje systemu i operacje ponownego uruchamiania"
"versionInfo": "Informacje o wersji",
"viewLogsAndManage": "Przeglądaj dzienniki systemowe, wykonuj aktualizacje systemu i operacje ponownego uruchamiania",
"viewNewVersion": "Zobacz nową wersję",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Excluir",
"deleteSuccess": "Regra excluída com sucesso",
"deleteWarning": "Você tem certeza de que deseja excluir esta regra? Esta ação não pode ser desfeita.",
"description": "Descrição da Regra",
"downloadTemplate": "Baixar Modelo",
"edit": "Editar",
"editRule": "Editar Regra",
@@ -22,7 +21,6 @@
"import": "Importar",
"importFailed": "Falha na importação",
"importSuccess": "Importação bem-sucedida",
"importYaml": "Importar YAML",
"importYamlDescription": "Importar regras de um arquivo YAML, o sistema criará automaticamente grupos de regras com base nos nomes dos grupos de políticas",
"importYamlRules": "Importar Regras YAML",
"importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "Nenhuma regra válida encontrada",
"pleaseUploadFile": "Por favor, faça upload de um arquivo YAML",
"preview": "Pré-visualização",
"rules": "Conteúdo da Regra",
"rulesFormat": "Formato da regra: tipo de regra, conteúdo de correspondência, [política], onde a política é opcional.\nSe a política não for especificada, o nome do grupo de regras atual será usado automaticamente. Exemplos:",
"rulesLabel": "Conteúdo da Regra",
"searchRule": "Pesquisar nome da regra",
"selectFile": "Selecionar Arquivo",
"selectTags": "Selecionar tags de nó",
"tags": "Tags de Nó",
"tagsLabel": "Tags de Nó",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Limite de compra/vez",
"replacement": "Redefinir preço/vez",
"sell": "venda",
"show": "Exibição na página inicial",
"show": "Exibir",
"sold": "Contagem de Assinaturas",
"subscribe": "Inscrever-se",
"subscribeGroup": "Inscrever-se no grupo",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirmar atualização do sistema",
"confirmUpgrade": "Confirmar atualização",
"currentVersion": "Versão atual do sistema:",
"developmentVersion": "Versão de desenvolvimento",
"errors": "Erros",
"ip": "IP",
"ip": "Endereço IP",
"lastUpdated": "Última atualização:",
"newVersionAvailable": "Nova versão",
"none": "Nenhum",
"query": "Consulta",
"rebootDescription": "Você tem certeza de que deseja reiniciar o sistema? Esta ação causará uma breve interrupção no serviço.",
"rebooting": "Reiniciando o sistema...",
"refreshLogs": "Atualizar Logs",
"request": "Solicitação",
"serverVersion": "Servidor",
"status": "Status",
"systemLogs": "Logs do sistema",
"systemReboot": "Reinicialização do sistema",
@@ -22,5 +25,8 @@
"systemUpgrade": "Atualização do sistema",
"upgradeDescription": "Você tem certeza de que deseja realizar a atualização do sistema? Esta operação pode levar alguns minutos e, durante esse tempo, o sistema pode não responder.",
"userAgent": "Agente do Usuário",
"viewLogsAndManage": "Visualizar logs do sistema, executar atualizações e reiniciar o sistema"
"versionInfo": "Informações da versão",
"viewLogsAndManage": "Visualizar logs do sistema, executar atualizações e reiniciar o sistema",
"viewNewVersion": "Ver nova versão",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Șterge",
"deleteSuccess": "Regula a fost ștersă cu succes",
"deleteWarning": "Ești sigur că vrei să ștergi această regulă? Această acțiune nu poate fi anulată.",
"description": "Descrierea Regulii",
"downloadTemplate": "Descarcă Șablon",
"edit": "Editează",
"editRule": "Editează Regulă",
@@ -22,7 +21,6 @@
"import": "Importă",
"importFailed": "Importul a eșuat",
"importSuccess": "Importul a fost realizat cu succes",
"importYaml": "Importă YAML",
"importYamlDescription": "Importă reguli din fișier YAML, sistemul va crea automat grupuri de reguli pe baza numelui grupului de politici",
"importYamlRules": "Importă Reguli YAML",
"importing": "Se importă...",
@@ -31,11 +29,9 @@
"noValidRules": "Nu au fost găsite reguli valide",
"pleaseUploadFile": "Te rugăm să încarci un fișier YAML",
"preview": "Previzualizare",
"rules": "Conținutul Regulii",
"rulesFormat": "Formatul regulii: tip regulă, conținut de potrivire, [politică], unde politica este opțională.\nDacă politica nu este specificată, numele grupului de reguli curent va fi folosit automat. Exemple:",
"rulesLabel": "Conținutul Regulii",
"searchRule": "Caută numele regulii",
"selectFile": "Selectează Fișier",
"selectTags": "Selectează etichetele nodului",
"tags": "Etichete Nod",
"tagsLabel": "Etichete Nod",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Limită de achiziție/pe tranzacție",
"replacement": "Resetare preț/pe utilizare",
"sell": "Vânzare",
"show": "Afișare pe pagina principală",
"show": "Afișare",
"sold": "Număr de abonamente",
"subscribe": "Abonare",
"subscribeGroup": "Abonare grup",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Confirmați actualizarea sistemului",
"confirmUpgrade": "Confirmă actualizarea",
"currentVersion": "Versiunea curentă a sistemului:",
"developmentVersion": "Versiunea de dezvoltare",
"errors": "Erori",
"ip": "IP",
"ip": "Adresă IP",
"lastUpdated": "Ultima actualizare:",
"newVersionAvailable": "Versiune nouă",
"none": "Niciunul",
"query": "Interogare",
"rebootDescription": "Sunteți sigur că doriți să reporniți sistemul? Această acțiune va provoca o întrerupere temporară a serviciului.",
"rebooting": "Se repornește sistemul...",
"refreshLogs": "Reîmprospătează jurnalele",
"request": "Cerere",
"serverVersion": "Server",
"status": "Stare",
"systemLogs": "Jurnale de sistem",
"systemReboot": "Repornire sistem",
@@ -22,5 +25,8 @@
"systemUpgrade": "Actualizare sistem",
"upgradeDescription": "Sunteți sigur că doriți să efectuați o actualizare a sistemului? Această operațiune poate dura câteva minute, timp în care sistemul poate să nu răspundă.",
"userAgent": "Agent Utilizator",
"viewLogsAndManage": "Vizualizați jurnalele de sistem, efectuați actualizări de sistem și operațiuni de repornire"
"versionInfo": "Informații despre versiune",
"viewLogsAndManage": "Vizualizați jurnalele de sistem, efectuați actualizări de sistem și operațiuni de repornire",
"viewNewVersion": "Vezi versiunea nouă",
"webVersion": "Web/Admin"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Удалить",
"deleteSuccess": "Правило успешно удалено",
"deleteWarning": "Вы уверены, что хотите удалить это правило? Это действие нельзя отменить.",
"description": "Описание правила",
"downloadTemplate": "Скачать шаблон",
"edit": "Редактировать",
"editRule": "Редактировать правило",
@@ -22,7 +21,6 @@
"import": "Импортировать",
"importFailed": "Ошибка импорта",
"importSuccess": "Импорт успешен",
"importYaml": "Импортировать YAML",
"importYamlDescription": "Импорт правил из файла YAML, система автоматически создаст группы правил на основе имен групп политик",
"importYamlRules": "Импортировать правила YAML",
"importing": "Импортирую...",
@@ -31,11 +29,9 @@
"noValidRules": "Не найдено действительных правил",
"pleaseUploadFile": "Пожалуйста, загрузите файл YAML",
"preview": "Предварительный просмотр",
"rules": "Содержание правила",
"rulesFormat": "Формат правила: тип правила, содержание совпадения, [политика], где политика является необязательной.\nЕсли политика не указана, будет автоматически использовано текущее имя группы правил. Примеры:",
"rulesLabel": "Содержание правила",
"searchRule": "Поиск имени правила",
"selectFile": "Выбрать файл",
"selectTags": "Выбрать теги узлов",
"tags": "Теги узлов",
"tagsLabel": "Теги узлов",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Лимит/раз",
"replacement": "Сбросить цену/раз",
"sell": "Продажа",
"show": "Показать на главной странице",
"show": "Показать",
"sold": "Количество подписок",
"subscribe": "Подписаться",
"subscribeGroup": "Подписаться на группу",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Подтвердить обновление системы",
"confirmUpgrade": "Подтвердить обновление",
"currentVersion": "Текущая версия системы:",
"developmentVersion": "Версия разработки",
"errors": "Ошибки",
"ip": "IP",
"ip": "IP-адрес",
"lastUpdated": "Последнее обновление:",
"newVersionAvailable": "Новая версия",
"none": "Нет",
"query": "Запрос",
"rebootDescription": "Вы уверены, что хотите перезагрузить систему? Это действие приведет к кратковременному прерыванию обслуживания.",
"rebooting": "Перезагрузка системы...",
"refreshLogs": "Обновить журналы",
"request": "Запрос",
"serverVersion": "Сервер",
"status": "Статус",
"systemLogs": "Системные журналы",
"systemReboot": "Перезагрузка системы",
@@ -22,5 +25,8 @@
"systemUpgrade": "Обновление системы",
"upgradeDescription": "Вы уверены, что хотите выполнить обновление системы? Эта операция может занять несколько минут, в течение которых система может не отвечать.",
"userAgent": "Пользовательский агент",
"viewLogsAndManage": "Просмотр системных журналов, выполнение обновлений и перезагрузка системы"
"versionInfo": "Информация о версии",
"viewLogsAndManage": "Просмотр системных журналов, выполнение обновлений и перезагрузка системы",
"viewNewVersion": "Посмотреть новую версию",
"webVersion": "Веб/Админ"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "ลบ",
"deleteSuccess": "ลบกฎเรียบร้อยแล้ว",
"deleteWarning": "คุณแน่ใจหรือว่าต้องการลบกฎนี้? การกระทำนี้ไม่สามารถย้อนกลับได้.",
"description": "คำอธิบายกฎ",
"downloadTemplate": "ดาวน์โหลดเทมเพลต",
"edit": "แก้ไข",
"editRule": "แก้ไขกฎ",
@@ -22,7 +21,6 @@
"import": "นำเข้า",
"importFailed": "นำเข้าล้มเหลว",
"importSuccess": "นำเข้าสำเร็จ",
"importYaml": "นำเข้า YAML",
"importYamlDescription": "นำเข้ากฎจากไฟล์ YAML, ระบบจะสร้างกลุ่มกฎโดยอัตโนมัติตามชื่อกลุ่มนโยบาย",
"importYamlRules": "นำเข้ากฎ YAML",
"importing": "กำลังนำเข้า...",
@@ -31,11 +29,9 @@
"noValidRules": "ไม่พบกฎที่ถูกต้อง",
"pleaseUploadFile": "กรุณาอัปโหลดไฟล์ YAML",
"preview": "ตัวอย่าง",
"rules": "เนื้อหากฎ",
"rulesFormat": "รูปแบบกฎ: ประเภทกฎ, เนื้อหาที่ตรงกัน, [นโยบาย], โดยที่นโยบายเป็นทางเลือก.\nหากไม่ได้ระบุนโยบาย, ชื่อกลุ่มกฎปัจจุบันจะถูกใช้โดยอัตโนมัติ. ตัวอย่าง:",
"rulesLabel": "เนื้อหากฎ",
"searchRule": "ค้นหาชื่อกฎ",
"selectFile": "เลือกไฟล์",
"selectTags": "เลือกแท็กโหนด",
"tags": "แท็กโหนด",
"tagsLabel": "แท็กโหนด",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "จำกัดการซื้อ/ครั้ง",
"replacement": "รีเซ็ตราคา/ครั้ง",
"sell": "ขาย",
"show": "แสดงหน้าแรก",
"show": "แสดง",
"sold": "จำนวนการสมัครสมาชิก",
"subscribe": "สมัครสมาชิก",
"subscribeGroup": "สมัครกลุ่ม",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "ยืนยันการอัปเกรดระบบ",
"confirmUpgrade": "ยืนยันการอัปเกรด",
"currentVersion": "เวอร์ชันปัจจุบันของระบบ:",
"developmentVersion": "เวอร์ชันการพัฒนา",
"errors": "ข้อผิดพลาด",
"ip": "IP",
"ip": "ที่อยู่ IP",
"lastUpdated": "อัปเดตล่าสุด:",
"newVersionAvailable": "เวอร์ชันใหม่",
"none": "ไม่มี",
"query": "ค้นหา",
"rebootDescription": "คุณแน่ใจหรือไม่ว่าต้องการรีบูตระบบ? การดำเนินการนี้จะทำให้บริการหยุดชะงักชั่วคราว.",
"rebooting": "กำลังรีบูตระบบ...",
"refreshLogs": "รีเฟรชบันทึก",
"request": "คำขอ",
"serverVersion": "เซิร์ฟเวอร์",
"status": "สถานะ",
"systemLogs": "บันทึกระบบ",
"systemReboot": "ระบบรีบูต",
@@ -22,5 +25,8 @@
"systemUpgrade": "ระบบอัปเกรด",
"upgradeDescription": "คุณแน่ใจหรือไม่ว่าต้องการดำเนินการอัปเกรดระบบ? การดำเนินการนี้อาจใช้เวลาสักครู่ และในระหว่างนี้ระบบอาจไม่ตอบสนอง",
"userAgent": "ตัวแทนผู้ใช้",
"viewLogsAndManage": "ดูบันทึกของระบบ ดำเนินการอัปเกรดระบบและรีสตาร์ท"
"versionInfo": "ข้อมูลเวอร์ชัน",
"viewLogsAndManage": "ดูบันทึกของระบบ ดำเนินการอัปเกรดระบบและรีสตาร์ท",
"viewNewVersion": "ดูเวอร์ชันใหม่",
"webVersion": "เว็บ/ผู้ดูแล"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Sil",
"deleteSuccess": "Kural başarıyla silindi",
"deleteWarning": "Bu kuralı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
"description": "Kural Açıklaması",
"downloadTemplate": "Şablonu İndir",
"edit": "Düzenle",
"editRule": "Kuralı Düzenle",
@@ -22,7 +21,6 @@
"import": "İçe Aktar",
"importFailed": "İçe aktarma başarısız oldu",
"importSuccess": "İçe aktarma başarılı",
"importYaml": "YAML İçe Aktar",
"importYamlDescription": "YAML dosyasından kuralları içe aktarın, sistem otomatik olarak politika grup adlarına göre kural grupları oluşturacaktır",
"importYamlRules": "YAML Kurallarını İçe Aktar",
"importing": "İçe aktarılıyor...",
@@ -31,11 +29,9 @@
"noValidRules": "Geçerli kural bulunamadı",
"pleaseUploadFile": "Lütfen bir YAML dosyası yükleyin",
"preview": "Önizleme",
"rules": "Kural İçeriği",
"rulesFormat": "Kural formatı: kural türü, eşleşme içeriği,[politika], burada politika isteğe bağlıdır.\nEğer politika belirtilmemişse, mevcut kural grup adı otomatik olarak kullanılacaktır. Örnekler:",
"rulesLabel": "Kural İçeriği",
"searchRule": "Kural adını ara",
"selectFile": "Dosya Seç",
"selectTags": "Düğüm etiketlerini seç",
"tags": "Düğüm Etiketleri",
"tagsLabel": "Düğüm Etiketleri",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Kota/satın alma",
"replacement": "Fiyatı sıfırla/kez",
"sell": "satış",
"show": "Ana sayfada göster",
"show": "Göster",
"sold": "Abonelik Sayısı",
"subscribe": "Abone Ol",
"subscribeGroup": "Gruba Abone Ol",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Sistem yükseltmesini onayla",
"confirmUpgrade": "Yükseltmeyi Onayla",
"currentVersion": "Mevcut Sistem Sürümü:",
"developmentVersion": "Geliştirme Sürümü",
"errors": "Hatalar",
"ip": "IP",
"ip": "IP Adresi",
"lastUpdated": "Son Güncelleme:",
"newVersionAvailable": "Yeni Sürüm",
"none": "Hiçbiri",
"query": "Sorgu",
"rebootDescription": "Sistemi yeniden başlatmak istediğinizden emin misiniz? Bu işlem kısa süreli hizmet kesintisine neden olacaktır.",
"rebooting": "Sistem yeniden başlatılıyor...",
"refreshLogs": "Günlükleri Yenile",
"request": "İstek",
"serverVersion": "Sunucu",
"status": "Durum",
"systemLogs": "Sistem Günlükleri",
"systemReboot": "Sistem Yeniden Başlatma",
@@ -22,5 +25,8 @@
"systemUpgrade": "Sistem Yükseltmesi",
"upgradeDescription": "Sistem yükseltmesi yapmak istediğinizden emin misiniz? Bu işlem birkaç dakika sürebilir ve bu süre zarfında sistem yanıt vermeyebilir.",
"userAgent": "Kullanıcı Aracısı",
"viewLogsAndManage": "Sistem günlüklerini görüntüleyin, sistem yükseltmelerini gerçekleştirin ve yeniden başlatma işlemlerini yönetin"
"versionInfo": "Sürüm Bilgisi",
"viewLogsAndManage": "Sistem günlüklerini görüntüleyin, sistem yükseltmelerini gerçekleştirin ve yeniden başlatma işlemlerini yönetin",
"viewNewVersion": "Yeni Sürümü Görüntüle",
"webVersion": "Web/Yönetici"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Видалити",
"deleteSuccess": "Правило успішно видалено",
"deleteWarning": "Ви впевнені, що хочете видалити це правило? Цю дію не можна скасувати.",
"description": "Опис правила",
"downloadTemplate": "Завантажити шаблон",
"edit": "Редагувати",
"editRule": "Редагувати правило",
@@ -22,7 +21,6 @@
"import": "Імпортувати",
"importFailed": "Імпорт не вдався",
"importSuccess": "Імпорт успішний",
"importYaml": "Імпортувати YAML",
"importYamlDescription": "Імпортуйте правила з файлу YAML, система автоматично створить групи правил на основі назв груп політик",
"importYamlRules": "Імпортувати правила YAML",
"importing": "Імпортується...",
@@ -31,11 +29,9 @@
"noValidRules": "Не знайдено дійсних правил",
"pleaseUploadFile": "Будь ласка, завантажте файл YAML",
"preview": "Попередній перегляд",
"rules": "Вміст правила",
"rulesFormat": "Формат правила: тип правила, вміст збігу, [політика], де політика є необов'язковою.\nЯкщо політика не вказана, автоматично буде використано назву поточної групи правил. Приклади:",
"rulesLabel": "Вміст правила",
"searchRule": "Шукати назву правила",
"selectFile": "Вибрати файл",
"selectTags": "Вибрати теги вузлів",
"tags": "Теги вузлів",
"tagsLabel": "Теги вузлів",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Обмеження на покупку/раз",
"replacement": "Скидання ціни/раз",
"sell": "продаж",
"show": "Показати на головній сторінці",
"show": "Показати",
"sold": "Кількість підписок",
"subscribe": "Підписатися",
"subscribeGroup": "Підписатися на групу",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Підтвердити оновлення системи",
"confirmUpgrade": "Підтвердити оновлення",
"currentVersion": "Поточна версія системи:",
"developmentVersion": "Версія розробки",
"errors": "Помилки",
"ip": "IP",
"ip": "IP-адреса",
"lastUpdated": "Останнє оновлення:",
"newVersionAvailable": "Нова версія",
"none": "Жоден",
"query": "Запит",
"rebootDescription": "Ви впевнені, що хочете перезавантажити систему? Ця дія призведе до короткочасного переривання обслуговування.",
"rebooting": "Перезавантаження системи...",
"refreshLogs": "Оновити журнали",
"request": "Запит",
"serverVersion": "Сервер",
"status": "Статус",
"systemLogs": "Системні журнали",
"systemReboot": "Перезавантаження системи",
@@ -22,5 +25,8 @@
"systemUpgrade": "Оновлення системи",
"upgradeDescription": "Ви впевнені, що хочете виконати оновлення системи? Ця операція може зайняти кілька хвилин, протягом яких система може не відповідати.",
"userAgent": "Агент користувача",
"viewLogsAndManage": "Перегляд системних журналів, виконання оновлень системи та операцій перезавантаження"
"versionInfo": "Інформація про версію",
"viewLogsAndManage": "Перегляд системних журналів, виконання оновлень системи та операцій перезавантаження",
"viewNewVersion": "Переглянути нову версію",
"webVersion": "Веб/Адмін"
}
-4
View File
@@ -11,7 +11,6 @@
"delete": "Xóa",
"deleteSuccess": "Quy tắc đã được xóa thành công",
"deleteWarning": "Bạn có chắc chắn muốn xóa quy tắc này không? Hành động này không thể hoàn tác.",
"description": "Mô tả Quy tắc",
"downloadTemplate": "Tải Mẫu",
"edit": "Chỉnh sửa",
"editRule": "Chỉnh sửa Quy tắc",
@@ -22,7 +21,6 @@
"import": "Nhập khẩu",
"importFailed": "Nhập khẩu không thành công",
"importSuccess": "Nhập khẩu thành công",
"importYaml": "Nhập YAML",
"importYamlDescription": "Nhập quy tắc từ tệp YAML, hệ thống sẽ tự động tạo nhóm quy tắc dựa trên tên nhóm chính sách",
"importYamlRules": "Nhập Quy tắc YAML",
"importing": "Đang nhập khẩu...",
@@ -31,11 +29,9 @@
"noValidRules": "Không tìm thấy quy tắc hợp lệ",
"pleaseUploadFile": "Vui lòng tải lên một tệp YAML",
"preview": "Xem trước",
"rules": "Nội dung Quy tắc",
"rulesFormat": "Định dạng quy tắc: loại quy tắc, nội dung khớp, [chính sách], trong đó chính sách là tùy chọn.\nNếu không chỉ định chính sách, tên nhóm quy tắc hiện tại sẽ được sử dụng tự động. Ví dụ:",
"rulesLabel": "Nội dung Quy tắc",
"searchRule": "Tìm kiếm tên quy tắc",
"selectFile": "Chọn Tệp",
"selectTags": "Chọn thẻ nút",
"tags": "Thẻ Nút",
"tagsLabel": "Thẻ Nút",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "Giới hạn mua/lần",
"replacement": "Đặt lại giá/lần",
"sell": "Bán hàng",
"show": "Hiển thị trang chủ",
"show": "Hiển thị",
"sold": "Số lượng đăng ký",
"subscribe": "Đăng ký",
"subscribeGroup": "Nhóm đăng ký",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "Xác nhận nâng cấp hệ thống",
"confirmUpgrade": "Xác nhận nâng cấp",
"currentVersion": "Phiên bản hệ thống hiện tại:",
"developmentVersion": "Phiên bản phát triển",
"errors": "Lỗi",
"ip": "IP",
"ip": "Địa chỉ IP",
"lastUpdated": "Cập nhật lần cuối:",
"newVersionAvailable": "Phiên bản mới",
"none": "Không có",
"query": "Truy vấn",
"rebootDescription": "Bạn có chắc chắn muốn khởi động lại hệ thống không? Thao tác này sẽ gây gián đoạn dịch vụ trong thời gian ngắn.",
"rebooting": "Đang khởi động lại hệ thống...",
"refreshLogs": "Làm mới nhật ký",
"request": "Yêu cầu",
"serverVersion": "Máy chủ",
"status": "Trạng thái",
"systemLogs": "Nhật ký hệ thống",
"systemReboot": "Khởi động lại hệ thống",
@@ -22,5 +25,8 @@
"systemUpgrade": "Nâng cấp hệ thống",
"upgradeDescription": "Bạn có chắc chắn muốn thực hiện nâng cấp hệ thống không? Thao tác này có thể mất vài phút và trong thời gian đó hệ thống có thể không phản hồi.",
"userAgent": "Tác nhân người dùng",
"viewLogsAndManage": "Xem nhật ký hệ thống, thực hiện nâng cấp và khởi động lại hệ thống"
"versionInfo": "Thông tin phiên bản",
"viewLogsAndManage": "Xem nhật ký hệ thống, thực hiện nâng cấp và khởi động lại hệ thống",
"viewNewVersion": "Xem phiên bản mới",
"webVersion": "Web/Quản trị"
}
+6 -4
View File
@@ -8,10 +8,12 @@
"createRule": "添加规则",
"createSuccess": "创建规则成功",
"createdAt": "创建时间",
"default": "默认",
"defaultRule": "默认规则",
"delete": "删除",
"deleteSuccess": "删除规则成功",
"deleteWarning": "确定要删除所选规则吗?此操作不可恢复。",
"description": "规则描述",
"direct": "直连",
"downloadTemplate": "下载模板",
"edit": "编辑",
"editRule": "编辑规则",
@@ -22,7 +24,6 @@
"import": "导入",
"importFailed": "导入失败",
"importSuccess": "导入成功",
"importYaml": "导入YAML",
"importYamlDescription": "从YAML文件导入规则,系统将自动根据策略组名称分组创建规则",
"importYamlRules": "导入YAML规则",
"importing": "导入中...",
@@ -31,13 +32,14 @@
"noValidRules": "没有找到有效的规则",
"pleaseUploadFile": "请上传YAML文件",
"preview": "预览",
"rules": "规则内容",
"reject": "拒绝",
"rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时,将自动使用当前规则组名称, 示例:",
"rulesLabel": "规则内容",
"searchRule": "搜索规则名称",
"selectFile": "选择文件",
"selectTags": "选择节点标签",
"selectType": "选择规则类型",
"tags": "节点标签",
"tagsLabel": "节点标签",
"type": "规则类型",
"updateSuccess": "更新规则成功"
}
+7
View File
@@ -63,16 +63,20 @@
"edit": "编辑",
"editNode": "编辑节点",
"enable": "启用",
"id": "ID",
"form": {
"allowInsecure": "允许不安全",
"cancel": "取消",
"city": "城市",
"confirm": "确认",
"congestionController": "拥塞控制",
"country": "国家",
"disableSni": "禁用SNI",
"edit": "编辑",
"editSecurity": "编辑安全性配置",
"enableTLS": "启用TLS",
"encryptionMethod": "加密方法",
"fingerprint": "指纹",
"flow": "流控算法",
"groupId": "节点组",
"hopInterval": "跳跃间隔",
@@ -85,6 +89,7 @@
"pleaseSelect": "请选择",
"port": "服务端口",
"protocol": "协议",
"reduceRtt": "减少RTT",
"relayHost": "中转地址",
"relayMode": "中转模式",
"relayModeOptions": {
@@ -128,6 +133,7 @@
"transport": "传输协议",
"transportConfig": "传输协议配置",
"transportHost": "传输服务地址",
"udpRelayMode": "UDP中继模式",
"transportPath": "传输路径",
"transportServerName": "传输服务名称"
},
@@ -136,6 +142,7 @@
"name": "名称",
"node": "节点",
"nodeGroup": "节点组",
"noData": "--",
"normal": "正常",
"onlineCount": "在线人数",
"onlineUsers": "在线用户",
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "限购/次",
"replacement": "重置价格/次",
"sell": "销售",
"show": "首页显示",
"show": "显示",
"sold": "订阅数量",
"subscribe": "订阅",
"subscribeGroup": "订阅组",
+15 -9
View File
@@ -1,26 +1,32 @@
{
"caller": "Caller",
"caller": "调用者",
"cancel": "取消",
"confirmReboot": "确认重启",
"confirmSystemReboot": "确认系统重启",
"confirmSystemUpgrade": "确认系统升级",
"confirmUpgrade": "确认升级",
"currentVersion": "当前系统版本:",
"errors": "Errors",
"ip": "IP",
"developmentVersion": "开发版",
"errors": "错误",
"ip": "IP地址",
"lastUpdated": "最后更新:",
"none": "None",
"query": "Query",
"newVersionAvailable": "有新版本",
"none": "",
"query": "查询",
"rebootDescription": "您确定要重启系统吗?此操作将导致短暂的服务中断。",
"rebooting": "正在重启系统...",
"refreshLogs": "刷新日志",
"request": "Request",
"status": "Status",
"request": "请求",
"serverVersion": "服务端",
"status": "状态",
"systemLogs": "系统日志",
"systemReboot": "系统重启",
"systemServices": "系统服务",
"systemUpgrade": "系统升级",
"upgradeDescription": "您确定要执行系统升级吗?此操作可能需要几分钟时间,期间系统可能无法响应。",
"userAgent": "User Agent",
"viewLogsAndManage": "查看系统日志,执行系统升级和重启操作"
"userAgent": "用户代理",
"versionInfo": "版本信息",
"viewLogsAndManage": "查看系统日志,执行系统升级和重启操作",
"viewNewVersion": "查看新版本",
"webVersion": "用户端/管理端"
}
+3 -4
View File
@@ -8,10 +8,10 @@
"createRule": "新增規則",
"createSuccess": "規則創建成功",
"createdAt": "創建於",
"defaultRule": "默認規則",
"delete": "刪除",
"deleteSuccess": "規則刪除成功",
"deleteWarning": "您確定要刪除這條規則嗎?此操作無法撤銷。",
"description": "規則描述",
"downloadTemplate": "下載模板",
"edit": "編輯",
"editRule": "編輯規則",
@@ -22,7 +22,6 @@
"import": "導入",
"importFailed": "導入失敗",
"importSuccess": "導入成功",
"importYaml": "導入 YAML",
"importYamlDescription": "從 YAML 文件導入規則,系統將根據策略組名稱自動創建規則組",
"importYamlRules": "導入 YAML 規則",
"importing": "導入中...",
@@ -31,13 +30,13 @@
"noValidRules": "未找到有效的規則",
"pleaseUploadFile": "請上傳 YAML 文件",
"preview": "預覽",
"rules": "規則內容",
"rulesFormat": "規則格式:規則類型,匹配內容,[策略],其中策略是可選的。\n如果未指定策略,將自動使用當前規則組名稱。示例:",
"rulesLabel": "規則內容",
"searchRule": "搜索規則名稱",
"selectFile": "選擇文件",
"selectTags": "選擇節點標籤",
"selectType": "選擇規則類型",
"tags": "節點標籤",
"tagsLabel": "節點標籤",
"type": "規則類型",
"updateSuccess": "規則更新成功"
}
+1 -1
View File
@@ -145,7 +145,7 @@
"quota": "限購/次",
"replacement": "重置價格/次",
"sell": "銷售",
"show": "首頁顯示",
"show": "顯示",
"sold": "訂閱數量",
"subscribe": "訂閱",
"subscribeGroup": "訂閱組",
+8 -2
View File
@@ -6,15 +6,18 @@
"confirmSystemUpgrade": "確認系統升級",
"confirmUpgrade": "確認升級",
"currentVersion": "目前系統版本:",
"developmentVersion": "開發版",
"errors": "錯誤",
"ip": "IP",
"ip": "IP位址",
"lastUpdated": "最後更新:",
"newVersionAvailable": "有新版本",
"none": "無",
"query": "查詢",
"rebootDescription": "您確定要重新啟動系統嗎?此操作將導致短暫的服務中斷。",
"rebooting": "正在重新啟動系統...",
"refreshLogs": "重新整理日誌",
"request": "請求",
"serverVersion": "伺服器端",
"status": "狀態",
"systemLogs": "系統日誌",
"systemReboot": "系統重啟",
@@ -22,5 +25,8 @@
"systemUpgrade": "系統升級",
"upgradeDescription": "您確定要執行系統升級嗎?此操作可能需要幾分鐘時間,期間系統可能無法回應。",
"userAgent": "使用者代理",
"viewLogsAndManage": "查看系統日誌,執行系統升級和重新啟動操作"
"versionInfo": "版本資訊",
"viewLogsAndManage": "查看系統日誌,執行系統升級和重新啟動操作",
"viewNewVersion": "查看新版本",
"webVersion": "使用者端/管理端"
}
+1
View File
@@ -9968,3 +9968,4 @@ rules:
- PROCESS-NAME,Weiyun.exe,🎯 全球直连
- PROCESS-NAME,baidunetdisk.exe,🎯 全球直连
- GEOIP,CN,🎯 全球直连
- MATCH,🚀 节点选择
+8
View File
@@ -17,3 +17,11 @@ export async function restartSystem(options?: { [key: string]: any }) {
...(options || {}),
});
}
/** Get Version GET /v1/admin/tool/version */
export async function getVersion(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.VersionResponse }>('/v1/admin/tool/version', {
method: 'GET',
...(options || {}),
});
}
+61 -3
View File
@@ -28,6 +28,11 @@ declare namespace API {
updated_at: number;
};
type AnyTLS = {
port: number;
security_config: SecurityConfig;
};
type Application = {
id: number;
icon: string;
@@ -75,6 +80,40 @@ declare namespace API {
is_default: boolean;
};
type AppUserSubcbribe = {
id: number;
name: string;
upload: number;
traffic: number;
download: number;
device_limit: number;
start_time: string;
expire_time: string;
list: AppUserSubscbribeNode[];
};
type AppUserSubscbribeNode = {
id: number;
name: string;
uuid: string;
protocol: string;
relay_mode: string;
relay_node: string;
server_addr: string;
speed_limit: number;
tags: string[];
traffic: number;
traffic_ratio: number;
upload: number;
config: string;
country: string;
city: string;
latitude: string;
longitude: string;
created_at: number;
download: number;
};
type AuthConfig = {
mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig;
@@ -257,8 +296,10 @@ declare namespace API {
type CreateRuleGroupRequest = {
name: string;
icon: string;
type: string;
tags: string[];
rules: string;
default: boolean;
enable: boolean;
};
@@ -598,7 +639,7 @@ declare namespace API {
type GetNodeListParams = {
page: number;
size: number;
tag?: string;
tags?: string;
group_id?: number;
search?: string;
};
@@ -610,7 +651,7 @@ declare namespace API {
type GetNodeServerListRequest = {
page: number;
size: number;
tag?: string;
tags?: string;
group_id?: number;
search?: string;
};
@@ -1077,7 +1118,7 @@ declare namespace API {
type PurchaseOrderRequest = {
subscribe_id: number;
quantity: number;
payment: number;
payment?: number;
coupon?: string;
};
@@ -1130,6 +1171,11 @@ declare namespace API {
total: number;
};
type QueryUserAffiliateCountResponse = {
registers: number;
total_commission: number;
};
type QueryUserAffiliateListRequest = {
page: number;
size: number;
@@ -1239,9 +1285,11 @@ declare namespace API {
id: number;
icon: string;
name: string;
type: string;
tags: string[];
rules: string;
enable: boolean;
default: boolean;
created_at: number;
updated_at: number;
};
@@ -1455,6 +1503,10 @@ declare namespace API {
type Tuic = {
port: number;
disable_sni: boolean;
reduce_rtt: boolean;
udp_relay_mode: string;
congestion_controller: string;
security_config: SecurityConfig;
};
@@ -1581,9 +1633,11 @@ declare namespace API {
type UpdateRuleGroupRequest = {
id: number;
icon: string;
type: string;
name: string;
tags: string[];
rules: string;
default: boolean;
enable: boolean;
};
@@ -1808,6 +1862,10 @@ declare namespace API {
enable_reset_password_verify: boolean;
};
type VersionResponse = {
version: string;
};
type Vless = {
port: number;
flow: string;
+1 -1
View File
@@ -1,5 +1,5 @@
// @ts-ignore
/* eslint-disable */
import request from '@/utils/request';
/** Apple Login Callback POST /v1/auth/oauth/callback/apple */
+51 -1
View File
@@ -28,6 +28,11 @@ declare namespace API {
updated_at: number;
};
type AnyTLS = {
port: number;
security_config: SecurityConfig;
};
type AppleLoginCallbackRequest = {
code: string;
id_token: string;
@@ -81,6 +86,40 @@ declare namespace API {
is_default: boolean;
};
type AppUserSubcbribe = {
id: number;
name: string;
upload: number;
traffic: number;
download: number;
device_limit: number;
start_time: string;
expire_time: string;
list: AppUserSubscbribeNode[];
};
type AppUserSubscbribeNode = {
id: number;
name: string;
uuid: string;
protocol: string;
relay_mode: string;
relay_node: string;
server_addr: string;
speed_limit: number;
tags: string[];
traffic: number;
traffic_ratio: number;
upload: number;
config: string;
country: string;
city: string;
latitude: string;
longitude: string;
created_at: number;
download: number;
};
type AuthConfig = {
mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig;
@@ -473,7 +512,7 @@ declare namespace API {
type PurchaseOrderRequest = {
subscribe_id: number;
quantity: number;
payment: number;
payment?: number;
coupon?: string;
};
@@ -526,6 +565,11 @@ declare namespace API {
total: number;
};
type QueryUserAffiliateCountResponse = {
registers: number;
total_commission: number;
};
type QueryUserAffiliateListRequest = {
page: number;
size: number;
@@ -652,9 +696,11 @@ declare namespace API {
id: number;
icon: string;
name: string;
type: string;
tags: string[];
rules: string;
enable: boolean;
default: boolean;
created_at: number;
updated_at: number;
};
@@ -830,6 +876,10 @@ declare namespace API {
type Tuic = {
port: number;
disable_sni: boolean;
reduce_rtt: boolean;
udp_relay_mode: string;
congestion_controller: string;
security_config: SecurityConfig;
};
@@ -57,6 +57,7 @@ export default function Page() {
)}
<div className='grid gap-4 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3'>
{data
?.filter((item) => item.show)
?.filter((item) => (group ? item.group_id === Number(group) : true))
?.map((item) => (
<Card className='flex flex-col' key={item.id}>
+22 -1
View File
@@ -2,8 +2,29 @@ import { GlobalMap } from '@/components/main/global-map';
import { Hero } from '@/components/main/hero';
import { ProductShowcase } from '@/components/main/product-showcase/index';
import { Stats } from '@/components/main/stats';
import { queryUserInfo } from '@/services/user/user';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
export default async function Home() {
const Authorization = (await cookies()).get('Authorization')?.value;
if (Authorization) {
let user = null;
try {
user = await queryUserInfo({
skipErrorHandler: true,
Authorization,
}).then((res) => res.data.data);
} catch (error) {
console.log('Token validation failed:', error);
}
if (user) {
redirect('/dashboard');
}
}
export default function Home() {
return (
<main className='container space-y-16'>
<Hero />
+11 -10
View File
@@ -8,21 +8,21 @@ import { NextIntlClientProvider } from 'next-intl';
import { getLocale, getMessages } from 'next-intl/server';
import { PublicEnvScript } from 'next-runtime-env';
import { unstable_noStore as noStore } from 'next/cache';
import { Geist, Geist_Mono } from 'next/font/google';
// import { Geist, Geist_Mono } from 'next/font/google';
import { cookies } from 'next/headers';
import { Metadata, Viewport } from 'next/types';
import NextTopLoader from 'nextjs-toploader';
import React from 'react';
const fontSans = Geist({
subsets: ['latin'],
variable: '--font-sans',
});
// const fontSans = Geist({
// subsets: ['latin'],
// variable: '--font-sans',
// });
const fontMono = Geist_Mono({
subsets: ['latin'],
variable: '--font-mono',
});
// const fontMono = Geist_Mono({
// subsets: ['latin'],
// variable: '--font-mono',
// });
export async function generateMetadata(): Promise<Metadata> {
noStore();
@@ -106,7 +106,8 @@ export default async function RootLayout({
</head>
<body
suppressHydrationWarning
className={`${fontSans.variable} ${fontMono.variable} size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
// ${fontSans.variable} ${fontMono.variable}
className={`size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
>
<NextIntlClientProvider messages={messages}>
<NextTopLoader showSpinner={false} />
@@ -53,6 +53,12 @@ export function SubscribeBilling({ order }: Readonly<SubscribeBillingProps>) {
<Display type='currency' value={order?.fee_amount} />
</span>
</li>
<li>
<span className='text-muted-foreground'>{t('billing.gift')}</span>
<span>
<Display type='currency' value={order?.gift_amount} />
</span>
</li>
</ul>
<Separator />
<div className='flex items-center justify-between font-semibold'>
+18 -6
View File
@@ -13,7 +13,7 @@ import { Separator } from '@workspace/ui/components/separator';
import { LoaderCircle } from 'lucide-react';
import { useTranslations } from 'next-intl';
import { useRouter } from 'next/navigation';
import { useCallback, useEffect, useState, useTransition } from 'react';
import { useCallback, useEffect, useRef, useState, useTransition } from 'react';
import { SubscribeBilling } from './billing';
import { SubscribeDetail } from './detail';
@@ -33,16 +33,28 @@ export default function Purchase({ subscribe, setSubscribe }: Readonly<PurchaseP
coupon: '',
});
const [loading, startTransition] = useTransition();
const lastSuccessOrderRef = useRef<any>(null);
const { data: order } = useQuery({
enabled: !!subscribe?.id,
queryKey: ['preCreateOrder', params],
queryFn: async () => {
const { data } = await preCreateOrder({
...params,
subscribe_id: subscribe?.id as number,
} as API.PurchaseOrderRequest);
return data.data;
try {
const { data } = await preCreateOrder({
...params,
subscribe_id: subscribe?.id as number,
} as API.PurchaseOrderRequest);
const result = data.data;
if (result) {
lastSuccessOrderRef.current = result;
}
return result;
} catch (error) {
if (lastSuccessOrderRef.current) {
return lastSuccessOrderRef.current;
}
throw error;
}
},
});
+18 -6
View File
@@ -19,7 +19,7 @@ import { Separator } from '@workspace/ui/components/separator';
import { LoaderCircle } from 'lucide-react';
import { useTranslations } from 'next-intl';
import { useRouter } from 'next/navigation';
import { useCallback, useEffect, useState, useTransition } from 'react';
import { useCallback, useEffect, useRef, useState, useTransition } from 'react';
import { SubscribeBilling } from './billing';
import { SubscribeDetail } from './detail';
@@ -40,16 +40,28 @@ export default function Renewal({ id, subscribe }: Readonly<RenewalProps>) {
user_subscribe_id: id,
});
const [loading, startTransition] = useTransition();
const lastSuccessOrderRef = useRef<any>(null);
const { data: order } = useQuery({
enabled: !!subscribe.id && open,
queryKey: ['preCreateOrder', params],
queryFn: async () => {
const { data } = await preCreateOrder({
...params,
subscribe_id: subscribe.id,
} as API.PurchaseOrderRequest);
return data.data;
try {
const { data } = await preCreateOrder({
...params,
subscribe_id: subscribe.id,
} as API.PurchaseOrderRequest);
const result = data.data;
// 请求成功时保存数据
if (result) {
lastSuccessOrderRef.current = result;
}
return result;
} catch (error) {
if (lastSuccessOrderRef.current) {
return lastSuccessOrderRef.current;
}
}
},
});
+1 -1
View File
@@ -10,7 +10,7 @@ export const NEXT_PUBLIC_DEFAULT_LANGUAGE =
export const NEXT_PUBLIC_SITE_URL = env('NEXT_PUBLIC_SITE_URL') ?? process.env.NEXT_PUBLIC_SITE_URL;
export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_URL') ?? process.env.NEXT_PUBLIC_API_URL;
export const NEXT_PUBLIC_CDN_URL =
env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://fastly.jsdelivr.net';
env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://cdn.jsdelivr.net';
export const NEXT_PUBLIC_DEFAULT_USER_EMAIL =
env('NEXT_PUBLIC_DEFAULT_USER_EMAIL') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_EMAIL;
+2 -1
View File
@@ -14,7 +14,8 @@
"fee": "Poplatek",
"price": "Cena",
"productDiscount": "Sleva na zboží",
"total": "Celková cena"
"total": "Celková cena",
"gift": "Odpočet dárku"
},
"buy": "Koupit",
"buyNow": "Koupit nyní",
+2 -1
View File
@@ -14,7 +14,8 @@
"fee": "Bearbeitungsgebühr",
"price": "Preis",
"productDiscount": "Produktrabatt",
"total": "Gesamtpreis"
"total": "Gesamtpreis",
"gift": "Geschenkabzug"
},
"buy": "Kaufen",
"buyNow": "Jetzt kaufen",
+2 -1
View File
@@ -14,7 +14,8 @@
"fee": "Fee",
"price": "Price",
"productDiscount": "Product Discount",
"total": "Total"
"total": "Total",
"gift": "gift Deduction"
},
"buy": "Buy",
"buyNow": "Buy Now",

Some files were not shown because too many files have changed in this diff Show More