Compare commits

...

28 Commits

Author SHA1 Message Date
semantic-release-bot 10d322f1ba 🔖 chore(release): v1.0.0-beta.4 [skip ci]
# [1.0.0-beta.4](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2025-01-07)

### ♻ Code Refactoring

* **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))

###  Features

* **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
* **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
* **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))
* **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
* **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
* **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
* **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
* **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 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))
* **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))

### 🎫 Chores

* Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))

### 🐛 Bug Fixes

* **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
* **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
* **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
* **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))

### 💄 Styles

* **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**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
* **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
2025-01-07 17:46:57 +00:00
web@ppanel 1d917383eb feat(favicon): Update SVG favicon design for admin and user interfaces 2025-01-08 00:44:26 +07:00
web@ppanel 36c76674b6 🐛 fix(dashboard): Correct progress value calculations and update groupId accessor 2025-01-08 00:43:32 +07:00
web@ppanel 5766376590 feat(subscribe): Improve layout and styling in subscription components 2025-01-08 00:42:58 +07:00
lyndon986 6d0d069ce7 🐛 fix(locales): Update Hong Kong 2025-01-04 23:11:21 +07:00
web@ppanel 6de29d51c4 🐛 fix(subscribe): Update value validation to check for number type in subscribe form 2025-01-04 22:45:10 +07:00
web@ppanel e8a72d5579 feat(subscription): Add localized messages for existing subscriptions and deletion restrictions 2025-01-04 22:30:27 +07:00
web@ppanel eeea165f7e feat(subscribe): Add reset_time to API typings and update unsubscribe logic 2025-01-04 20:57:37 +07:00
web@ppanel 25ce37ea05 feat(node): Add serverKey 2025-01-04 20:26:53 +07:00
web@ppanel b2a2f42e53 feat(subscribe): Add unsubscribe functionality with confirmation messages and localized strings 2025-01-04 20:05:00 +07:00
web@ppanel cc834caa30 feat(affiliate): Update affiliate component to display total commission and improve data fetching 2025-01-04 16:51:03 +07:00
web@ppanel 4aea4e811f feat(affiliate): Add Affiliate component with commission display and invite link functionality 2025-01-03 13:54:33 +07:00
web@ppanel fb0c510b93 💄 style(locales): Remove unused subscription labels from multiple locale files 2025-01-02 22:04:07 +07:00
web@ppanel d28a10b6df feat(subscribe): Improve error handling in subscription forms and update component props 2025-01-02 21:58:36 +07:00
web@ppanel f99c6048ad feat(subscribe): Add subscribe_discount type 2025-01-01 16:13:04 +07:00
web@ppanel 136287d85a 💄 style(node): Improve layout and spacing in NodeStatusCell component 2025-01-01 12:44:57 +07:00
web@ppanel 5bc7905a52 feat(subscribe): Add subscription credits 2024-12-31 20:16:14 +07:00
web@ppanel 701cdee6de 💄 style(locales): Update server.json to reorganize relay mode options and improve labels 2024-12-31 20:15:45 +07:00
web@ppanel 3065c3a0df 🐛 fix(layout): Remove unnecessary cookie initialization in Logout function 2024-12-30 22:53:06 +07:00
web@ppanel 68bc18f584 ♻️ refactor(auth): Refactor user authorization handling and improve error logging 2024-12-30 22:41:12 +07:00
web@ppanel cd59d44435 feat(schema): Add security field to hysteria2 and tuic schemas 2024-12-30 20:59:35 +07:00
web@ppanel 3cc94773ef feat(relay): Add relay mode configuration and update related schemas 2024-12-30 17:28:24 +07:00
web@ppanel c44ad47f3c 💄 style(time-slot): Add chart display 2024-12-30 13:02:03 +07:00
web@ppanel 837157cc42 feat(api): Add Time Period Configuration 2024-12-29 22:10:43 +07:00
web@ppanel fec80f592d feat(api): Add new subscription properties and locale support for deduction ratios and reset cycles 2024-12-29 16:18:21 +07:00
web@ppanel a93db4eb9f 🔧 chore: Update changelog, enhance prepare script, and add openapi command 2024-12-28 23:24:40 +07:00
semantic-release-bot cd49427dad 🔖 chore(release): v1.0.0-beta.3 [skip ci]
# [1.0.0-beta.3](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2024-12-26)

### ♻ Code Refactoring

* **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
2024-12-26 15:27:08 +00:00
web@ppanel cf54d0f3a2 ♻️ refactor(config): Simplify environment variable handling and improve build script 2024-12-26 22:23:45 +07:00
298 changed files with 4185 additions and 2218 deletions
+167 -110
View File
@@ -1,140 +1,197 @@
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2024-12-26)
### 👷 Build System
* **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
### 🔧 Continuous Integration
* **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
# 1.0.0-beta.1 (2024-12-25)
# [1.0.0-beta.4](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2025-01-07)
### ♻ Code Refactoring
* **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
* **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
* **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))
* **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
* **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
### ⚡ Performance Improvements
* **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
* **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
### ✨ Features
* **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
* **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))
* **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
* **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
* **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
* **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**: 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))
* **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
* **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
* **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
* **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 status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
* **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
* **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))
* **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))
* **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))
* **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
* **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
* **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))
* **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
* **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
* **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
* **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
* **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 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))
* **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
### 🎫 Chores
* **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
* **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
* Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
### 🐛 Bug Fixes
* **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**: 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 Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
* **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))
* **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))
* **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
* **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
* **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))
* **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
* **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))
* **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
* **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
* **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))
* **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
* **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
* **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
* **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**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
* **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
* **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
* **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))
* **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
* **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
* **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
* **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
* **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
### 💄 Styles
* **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
* **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
* **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
* **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
* **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**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
* **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
<a name="readme-top"></a>
### 📝 Documentation
# Changelog
* **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
# [1.0.0-beta.3](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2024-12-26)
### ♻ Code Refactoring
- **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.3](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2024-12-26)
### ♻ Code Refactoring
- **publish**: Simplify environment variable handling and improve build script ([88ea21b](https://github.com/perfect-panel/ppanel-web/commit/88ea21b))
# [1.0.0-beta.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2024-12-26)
### 👷 Build System
- **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
### 🔧 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))
# 1.0.0-beta.1 (2024-12-25)
### ♻ Code Refactoring
- **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
- **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
- **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))
- **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
- **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
### ⚡ Performance Improvements
- **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
### ✨ Features
- **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
- **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))
- **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
- **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
- **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
- **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**: 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))
- **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
- **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
- **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
- **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 status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
- **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
- **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))
- **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))
- **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))
### 🎫 Chores
- **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
- **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
### 🐛 Bug Fixes
- **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**: 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 Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
- **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))
- **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))
- **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
- **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
- **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))
- **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
- **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))
- **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
- **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
- **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))
- **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
- **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
- **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
- **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**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
- **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
- **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
- **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))
- **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
### 💄 Styles
- **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
- **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
- **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
- **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
### 📝 Documentation
- **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))
+14 -3
View File
@@ -36,6 +36,7 @@ const baseProtocolSchema = z.object({
const shadowsocksSchema = z.object({
method: z.string(),
port: portSchema,
server_key: nullableString,
});
const vmessSchema = baseProtocolSchema;
@@ -51,11 +52,13 @@ const hysteria2Schema = z.object({
hop_ports: nullableString,
hop_interval: z.number().nullish(),
obfs_password: nullableString,
security: z.string(),
security_config: securityConfigSchema,
});
const tuicSchema = z.object({
port: portSchema,
security: z.string(),
security_config: securityConfigSchema,
});
@@ -92,9 +95,17 @@ const baseFormSchema = z.object({
speed_limit: z.number().nullish(),
traffic_ratio: z.number().default(1),
group_id: z.number().nullish(),
enable_relay: z.boolean().nullish().default(false),
relay_host: nullableString,
relay_port: portSchema,
relay_mode: z.string().nullish().default('none'),
relay_node: z
.array(
z.object({
host: z.string(),
port: portSchema,
prefix: z.string().nullish(),
}),
)
.nullish()
.default([]),
});
export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema);
+118 -66
View File
@@ -33,14 +33,15 @@ import {
import { Switch } from '@workspace/ui/components/switch';
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { Combobox } from '@workspace/ui/custom-components/combobox';
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { cn } from '@workspace/ui/lib/utils';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { useEffect, useState } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
import { formSchema, protocols } from './form-schema';
interface NodeFormProps<T> {
onSubmit: (data: T) => Promise<boolean> | boolean;
initialValues?: T;
@@ -55,7 +56,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
loading,
trigger,
title,
}: NodeFormProps<T>) {
}: Readonly<NodeFormProps<T>>) {
const t = useTranslations('server.node');
const [open, setOpen] = useState(false);
@@ -75,6 +76,8 @@ export default function NodeForm<T extends { [x: string]: any }>({
const protocol = form.watch('protocol');
const transport = form.watch('config.transport');
const security = form.watch('config.security');
const relayMode = form.watch('relay_mode');
const method = form.watch('config.method');
useEffect(() => {
form?.reset(initialValues);
@@ -105,7 +108,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
{trigger}
</Button>
</SheetTrigger>
<SheetContent className='w-[500px] max-w-full md:max-w-screen-md'>
<SheetContent className='w-[520px] max-w-full md:max-w-screen-md'>
<SheetHeader>
<SheetTitle>{title}</SheetTitle>
</SheetHeader>
@@ -214,65 +217,6 @@ export default function NodeForm<T extends { [x: string]: any }>({
</FormItem>
)}
/>
<FormField
control={form.control}
name='enable_relay'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.enableRelay')}</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={!!field.value}
onCheckedChange={(value) => {
form.setValue(field.name, value);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='relay_host'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.relayHost')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='relay_port'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.relayPort')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
type='number'
min={1}
max={65535}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormField
@@ -358,6 +302,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput
{...field}
type='number'
placeholder='1-65535'
min={1}
max={65535}
onValueChange={(value) => {
@@ -369,6 +314,30 @@ export default function NodeForm<T extends { [x: string]: any }>({
</FormItem>
)}
/>
{[
'2022-blake3-aes-128-gcm',
'2022-blake3-aes-256-gcm',
'2022-blake3-chacha20-poly1305',
].includes(method) && (
<FormField
control={form.control}
name='config.server_key'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.serverKey')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
)}
</div>
)}
@@ -389,6 +358,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput
{...field}
type='number'
placeholder='1-65535'
onValueChange={(value) => {
form.setValue(field.name, value);
}}
@@ -499,7 +469,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control}
name='config.transport'
render={({ field }) => (
<FormItem className='min-w-32'>
<FormItem className='!mt-0 min-w-32'>
<FormControl>
<Select
value={field.value}
@@ -603,7 +573,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control}
name='config.security'
render={({ field }) => (
<FormItem className='min-w-32'>
<FormItem className='!mt-0 min-w-32'>
<Select
value={field.value}
onValueChange={(value) => {
@@ -814,6 +784,84 @@ export default function NodeForm<T extends { [x: string]: any }>({
</Card>
</div>
)}
<Card>
<CardHeader className='flex flex-row items-center justify-between p-3'>
<CardTitle>{t('form.relayMode')}</CardTitle>
<FormField
control={form.control}
name='relay_mode'
render={({ field }) => (
<FormItem className='!mt-0 min-w-32'>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.selectRelayMode')} />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='none'>
{t('form.relayModeOptions.none')}
</SelectItem>
<SelectItem value='all'>{t('form.relayModeOptions.all')}</SelectItem>
<SelectItem value='random'>
{t('form.relayModeOptions.random')}
</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</CardHeader>
{relayMode !== 'none' && (
<CardContent className='w-full space-y-3 px-3'>
<FormField
control={form.control}
name='relay_node'
render={({ field }) => (
<FormItem>
<FormControl>
<ArrayInput
fields={[
{
name: 'host',
type: 'text',
placeholder: t('form.relayHost'),
},
{
name: 'port',
type: 'number',
min: 1,
max: 65535,
placeholder: t('form.relayPort'),
},
{
name: 'prefix',
type: 'text',
placeholder: t('form.relayPrefix'),
},
]}
value={field.value}
onChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</CardContent>
)}
</Card>
</form>
</Form>
</ScrollArea>
@@ -830,8 +878,12 @@ export default function NodeForm<T extends { [x: string]: any }>({
<Button
disabled={loading}
onClick={form.handleSubmit(handleSubmit, (errors) => {
console.log(errors);
return errors;
const keys = Object.keys(errors);
for (const key of keys) {
const formattedKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
toast.error(`${t(`form.${formattedKey}`)} is ${errors[key]?.message}`);
return false;
}
})}
>
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}{' '}
+47 -47
View File
@@ -42,57 +42,57 @@ export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<div className='flex items-center space-x-2 rounded-md'>
<Badge variant={badgeVariant}>{badgeText}</Badge>
<span className='text-sm font-medium'>
{t('onlineCount')}: {onlineCount}
</span>
</div>
</TooltipTrigger>
<TooltipContent className='bg-muted text-foreground w-80'>
<div className='space-y-4'>
<>
<div className='space-y-2'>
<div className='space-y-1'>
<div className='flex justify-between text-xs'>
<span className='font-medium'>CPU</span>
<span>{formatPercentage(serverStatus?.cpu ?? 0)}</span>
</div>
<Progress value={(serverStatus?.cpu ?? 0) * 100} className='h-2' />
</div>
<div className='space-y-1'>
<div className='flex justify-between text-xs'>
<span className='font-medium'>{t('memory')}</span>
<span>{formatPercentage(serverStatus?.mem ?? 0)}</span>
</div>
<Progress value={(serverStatus?.mem ?? 0) * 100} className='h-2' />
</div>
<div className='space-y-1'>
<div className='flex justify-between text-xs'>
<span className='font-medium'>{t('disk')}</span>
<span>{formatPercentage(serverStatus?.disk ?? 0)}</span>
</div>
<Progress value={(serverStatus?.disk ?? 0) * 100} className='h-2' />
</div>
<div className='flex items-center gap-2 text-xs *:flex-1'>
<div className='flex items-center space-x-1'>
<Badge variant={badgeVariant}>{badgeText}</Badge>
<span className='font-medium'>
{t('onlineCount')}: {onlineCount}
</span>
</div>
<div className='flex flex-col space-y-1'>
<div className='flex justify-between'>
<span>CPU</span>
<span>{formatPercentage(serverStatus?.cpu ?? 0)}</span>
</div>
<div className='text-xs'>
<Progress value={serverStatus?.cpu ?? 0} className='h-2' max={100} />
</div>
<div className='flex flex-col space-y-1'>
<div className='flex justify-between'>
<span>{t('memory')}</span>
<span>{formatPercentage(serverStatus?.mem ?? 0)}</span>
</div>
<Progress value={serverStatus?.mem ?? 0} className='h-2' max={100} />
</div>
<div className='flex flex-col space-y-1'>
<div className='flex justify-between'>
<span>{t('disk')}</span>
<span>{formatPercentage(serverStatus?.disk ?? 0)}</span>
</div>
<Progress value={serverStatus?.disk ?? 0} className='h-2' max={100} />
</div>
{isOnline && (
<div>
{t('lastUpdated')}: {formatDate(serverStatus?.updated_at ?? 0)}
</div>
{isOnline && onlineCount > 0 && (
<div className='space-y-2'>
<h4 className='text-sm font-semibold'>{t('onlineUsers')}</h4>
<ScrollArea className='h-[400px] rounded-md border p-2'>
{online_users.map((user, index) => (
<div key={user.uid} className='py-1 text-xs'>
{user.ip} (UID: {user.uid})
</div>
))}
</ScrollArea>
</div>
)}
</>
)}
</div>
</TooltipContent>
</TooltipTrigger>
{isOnline && onlineCount > 0 && (
<TooltipContent className='bg-muted text-foreground w-80'>
<div className='space-y-4'>
<div className='space-y-2'>
<h4 className='text-sm font-semibold'>{t('onlineUsers')}</h4>
<ScrollArea className='h-[400px] rounded-md border p-2'>
{online_users.map((user, index) => (
<div key={user.uid} className='py-1 text-xs'>
{user.ip} (UID: {user.uid})
</div>
))}
</ScrollArea>
</div>
</div>
</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
);
@@ -145,10 +145,10 @@ export default function NodeTable() {
},
{
accessorKey: 'groupId',
accessorKey: 'group_id',
header: t('nodeGroup'),
cell: ({ row }) => {
const name = groups?.find((group) => group.id === row.getValue('groupId'))?.name;
const name = groups?.find((group) => group.id === row.getValue('group_id'))?.name;
return name ? <Badge variant='outline'>{name}</Badge> : '--';
},
},
File diff suppressed because it is too large Load Diff
@@ -133,7 +133,14 @@ export default function SubscribeTable() {
{
accessorKey: 'unit_price',
header: t('unitPrice'),
cell: ({ row }) => <Display type='currency' value={row.getValue('unit_price')} />,
cell: ({ row }) => {
return (
<>
<Display type='currency' value={row.getValue('unit_price')} />/
{t(row.original.unit_time ? `form.${row.original.unit_time}` : 'form.Month')}
</>
);
},
},
{
accessorKey: 'replacement',
+209 -58
View File
@@ -1,15 +1,33 @@
'use client';
import { getNodeConfig, updateNodeConfig } from '@/services/admin/system';
import { Icon } from '@iconify/react';
import {
getNodeConfig,
getNodeMultiplier,
setNodeMultiplier,
updateNodeConfig,
} from '@/services/admin/system';
import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button';
import { ChartContainer, ChartTooltip } from '@workspace/ui/components/chart';
import { Label } from '@workspace/ui/components/label';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { DicesIcon } from 'lucide-react';
import { nanoid } from 'nanoid';
import { useTranslations } from 'next-intl';
import { useMemo, useState } from 'react';
import { Cell, Legend, Pie, PieChart } from 'recharts';
import { toast } from 'sonner';
const COLORS = [
'hsl(var(--chart-1))',
'hsl(var(--chart-2))',
'hsl(var(--chart-3))',
'hsl(var(--chart-4))',
'hsl(var(--chart-5))',
];
export default function Node() {
const t = useTranslations('system.node');
@@ -36,62 +54,195 @@ export default function Node() {
}
}
const [timeSlots, setTimeSlots] = useState<API.TimePeriod[]>([]);
const { data: NodeMultiplier, refetch: refetchNodeMultiplier } = useQuery({
queryKey: ['getNodeMultiplier'],
queryFn: async () => {
const { data } = await getNodeMultiplier();
if (timeSlots.length === 0) {
setTimeSlots(data.data?.periods || []);
}
return data.data?.periods || [];
},
});
const chartTimeSlots = useMemo(() => {
return timeSlots.map((slot) => ({
name: `${slot.start_time} - ${slot.end_time}`,
value: slot.multiplier,
}));
}, [timeSlots]);
const chartConfig = useMemo(() => {
return chartTimeSlots.reduce(
(acc, item, index) => {
acc[item.name] = {
label: item.name,
color: COLORS[index % COLORS.length] || 'hsl(var(--default-chart-color))',
};
return acc;
},
{} as Record<string, { label: string; color: string }>,
);
}, [data]);
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('communicationKey')}</Label>
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.node_secret}
onValueBlur={(value) => updateConfig('node_secret', value)}
suffix={
<Icon
icon='uil:arrow-random'
onClick={() => {
updateConfig('node_secret', nanoid());
}}
/>
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePullInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
onValueBlur={(value) => updateConfig('node_pull_interval', value)}
suffix='S'
value={data?.node_pull_interval}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePushInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
value={data?.node_push_interval}
onValueBlur={(value) => updateConfig('node_push_interval', value)}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
<>
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('communicationKey')}</Label>
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.node_secret}
onValueBlur={(value) => updateConfig('node_secret', value)}
suffix={
<DicesIcon
onClick={() => {
updateConfig('node_secret', nanoid());
}}
/>
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePullInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
onValueBlur={(value) => updateConfig('node_pull_interval', value)}
suffix='S'
value={data?.node_pull_interval}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('nodePushInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
value={data?.node_push_interval}
onValueBlur={(value) => updateConfig('node_push_interval', value)}
placeholder={t('inputPlaceholder')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('dynamicMultiplier')}</Label>
<p className='text-muted-foreground text-xs'>{t('dynamicMultiplierDescription')}</p>
</TableCell>
<TableCell className='flex justify-end gap-2'>
<Button
size='sm'
variant='outline'
onClick={() => {
setTimeSlots(NodeMultiplier || []);
}}
>
{t('reset')}
</Button>
<Button
size='sm'
onClick={() => {
setNodeMultiplier({
periods: timeSlots,
}).then(async () => {
const result = await refetchNodeMultiplier();
if (result.data) setTimeSlots(result.data);
toast.success(t('saveSuccess'));
});
}}
>
{t('save')}
</Button>
</TableCell>
</TableRow>
</TableBody>
</Table>
<div className='flex flex-col-reverse gap-8 px-4 pt-6 md:flex-row md:items-start'>
<div className='w-full md:w-1/2'>
<ChartContainer config={chartConfig} className='mx-auto aspect-[4/3] max-w-[400px]'>
<PieChart>
<Pie
data={chartTimeSlots}
cx='50%'
cy='50%'
labelLine={false}
outerRadius='80%'
fill='#8884d8'
dataKey='value'
label={({ name, percent, value }) =>
`${value?.toFixed(2)}x (${(percent * 100).toFixed(0)}%)`
}
>
{chartTimeSlots.map((entry, index) => (
<Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
))}
</Pie>
<ChartTooltip
content={({ payload }) => {
if (payload && payload.length) {
const data = payload[0]?.payload;
return (
<div className='bg-background rounded-lg border p-2 shadow-sm'>
<div className='grid grid-cols-2 gap-2'>
<div className='flex flex-col'>
<span className='text-muted-foreground text-[0.70rem] uppercase'>
{t('timeSlot')}
</span>
<span className='text-muted-foreground font-bold'>
{data.name || '其他'}
</span>
</div>
<div className='flex flex-col'>
<span className='text-muted-foreground text-[0.70rem] uppercase'>
{t('multiplier')}
</span>
<span className='font-bold'>{data.value.toFixed(2)}x</span>
</div>
</div>
</div>
);
}
return null;
}}
/>
<Legend />
</PieChart>
</ChartContainer>
</div>
<div className='w-full md:w-1/2'>
<ArrayInput<API.TimePeriod>
fields={[
{
name: 'start_time',
prefix: t('startTime'),
type: 'time',
},
{ name: 'end_time', prefix: t('endTime'), type: 'time' },
{ name: 'multiplier', prefix: t('multiplier'), type: 'number' },
]}
value={timeSlots}
onChange={setTimeSlots}
/>
</div>
</div>
</>
);
}
+11 -7
View File
@@ -75,6 +75,8 @@ export default async function RootLayout({
}: Readonly<{
children: React.ReactNode;
}>) {
const Authorization = (await cookies()).get('Authorization')?.value;
const locale = await getLocale();
const messages = await getMessages();
@@ -86,13 +88,15 @@ export default async function RootLayout({
console.log('Error fetching global config:', error);
}
try {
user = await currentUser({
skipErrorHandler: true,
Authorization: (await cookies()).get('Authorization')?.value,
}).then((res) => res.data.data);
} catch (error) {
console.log('Error fetching current user:', error);
if (Authorization) {
try {
user = await currentUser({
skipErrorHandler: true,
Authorization,
}).then((res) => res.data.data);
} catch (error) {
console.log('Error fetching current user:', error);
}
}
return (
@@ -115,7 +115,10 @@ export function RevenueStatisticsCard() {
y={viewBox.cy}
className='fill-foreground text-2xl font-bold'
>
{RevenueStatistics?.today.amount_total}
{unitConversion(
'centsToDollars',
RevenueStatistics?.today.amount_total,
)}
</tspan>
</text>
);
+1
View File
@@ -22,6 +22,7 @@ export default function Providers({
defaultOptions: {
queries: {
staleTime: 5 * 1000,
retry: false,
},
},
}),
+8 -5
View File
@@ -4,10 +4,13 @@ import packageJSON from '../package.json';
export const locales = packageJSON.i18n.outputLocales;
export const defaultLocale = packageJSON.i18n.entry;
export const NEXT_PUBLIC_DEFAULT_LANGUAGE = env('NEXT_PUBLIC_DEFAULT_LANGUAGE') || defaultLocale;
export const NEXT_PUBLIC_DEFAULT_LANGUAGE =
env('NEXT_PUBLIC_DEFAULT_LANGUAGE') ?? process.env.NEXT_PUBLIC_DEFAULT_LANGUAGE ?? defaultLocale;
export const NEXT_PUBLIC_SITE_URL = env('NEXT_PUBLIC_SITE_URL');
export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_URL');
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_DEFAULT_USER_EMAIL = env('NEXT_PUBLIC_DEFAULT_USER_EMAIL');
export const NEXT_PUBLIC_DEFAULT_USER_PASSWORD = env('NEXT_PUBLIC_DEFAULT_USER_PASSWORD');
export const NEXT_PUBLIC_DEFAULT_USER_EMAIL =
env('NEXT_PUBLIC_DEFAULT_USER_EMAIL') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_EMAIL;
export const NEXT_PUBLIC_DEFAULT_USER_PASSWORD =
env('NEXT_PUBLIC_DEFAULT_USER_PASSWORD') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_PASSWORD;
+2
View File
@@ -42,6 +42,8 @@
"50002": "Tento kupón již byl použit, nelze ho použít znovu.",
"60001": "Předplatné vypršelo, obnovte ho prosím a použijte znovu.",
"60002": "Toto předplatné nelze momentálně použít, zkuste to prosím později.",
"60003": "Bylo zjištěno existující předplatné. Zrušte ho, než budete pokračovat.",
"60004": "Nelze momentálně odstranit, protože předplatné má aktivní uživatele.",
"70001": "Ověřovací kód je nesprávný, zadejte ho prosím znovu.",
"80001": "Úkol nebyl úspěšně přidán do fronty, zkuste to prosím později.",
"90001": "Vypněte prosím režim DEBUG a zkuste to znovu.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Potvrdit",
"edit": "Upravit",
"editSecurity": "Upravit nastavení zabezpečení",
"enableRelay": "Povolit přenos",
"enableTLS": "Povolit TLS",
"encryptionMethod": "Metoda šifrování",
"flow": "Algoritmus řízení toku",
@@ -65,7 +64,14 @@
"port": "Port služby",
"protocol": "Protokol",
"relayHost": "Adresa přenosu",
"relayMode": "Režim relé",
"relayModeOptions": {
"all": "Vše",
"none": "Žádný",
"random": "Náhodný"
},
"relayPort": "Port přenosu",
"relayPrefix": "Předpona relé",
"remarks": "Poznámky",
"security": "Zabezpečení",
"securityConfig": "Nastavení zabezpečení",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Vyberte metodu šifrování",
"selectNodeGroup": "Vyberte skupinu uzlů",
"selectProtocol": "Vyberte protokol",
"selectRelayMode": "Vyberte režim relé",
"serverAddr": "Adresa serveru",
"serverKey": "Klíč serveru",
"serverName": "Název služby",
"speedLimit": "Omezení rychlosti",
"speedLimitPlaceholder": "Bez omezení",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hodina",
"Minute": "Minuta",
"Month": "Měsíc",
"NoLimit": "Bez omezení",
"Year": "Rok",
"annualReset": "Roční Reset",
"basic": "Základní",
"cancel": "Zrušit",
"confirm": "Potvrdit",
"deductionRatio": "Automatická/Manuální Konfigurace Odpočtu",
"deductionRatioDescription": "Používá se pro odpočet. Systém standardně používá automatický výpočetní algoritmus. Když je poskytnut manuální poměr, systém vypočítá proporce na základě časového a dopravního poměru, přičemž celkový součet činí 100%.",
"description": "Popis",
"deviceLimit": "Omezení zařízení",
"discount": "Sleva",
@@ -31,14 +36,25 @@
"discount_price": "Cena po slevě",
"duration": "Doba trvání (měsíce)",
"inventory": "Sklad",
"monthlyReset": "Měsíční Reset",
"name": "Název",
"noLimit": "Bez omezení",
"noReset": "Žádný Reset",
"pricing": "Cenotvorba",
"purchaseWithDiscount": "Povolit Odpočet",
"purchaseWithDiscountDescription": "Povolit nebo zakázat funkci odpočtu. Když je povolena, systém zpracovává odpočty na základě nakonfigurovaných pravidel a poměrů",
"quota": "Limit nákupu",
"renewalReset": "Reset při Obnovení",
"renewalResetDescription": "Resetovací cyklus při obnovení",
"replacement": "Cena za reset (za každý)",
"resetCycle": "Resetovací Cyklus",
"resetOn1st": "Reset 1. dne",
"selectResetCycle": "Vyberte prosím resetovací cyklus",
"selectSubscribeGroup": "Vyberte prosím skupinu předplatného",
"selectUnitTime": "Vyberte jednotku času",
"server": "Server",
"serverGroup": "Skupina serverů",
"servers": "Servery",
"speedLimit": "Omezení rychlosti (Mbps)",
"subscribeGroup": "Skupina předplatného",
"traffic": "Přenos dat",
@@ -83,6 +99,6 @@
"subscribeGroup": "Skupina předplatných"
},
"traffic": "provoz",
"unitPrice": "Cena/měsíc",
"unitPrice": "Jednotková cena",
"updateSuccess": "Aktualizace byla úspěšná"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Úspěšně uloženo"
},
"node": {
"addTimeSlot": "Přidat časový úsek",
"communicationKey": "Komunikační klíč",
"communicationKeyDescription": "Klíč pro komunikaci uzlu, aby se zajistilo, že data nebudou zachycena jinými osobami",
"delete": "Smazat",
"dynamicMultiplier": "Dynamický násobitel",
"dynamicMultiplierDescription": "Dynamický násobitel označuje zpracování posunutých dat s různými násobiteli pro různé uzly během různých časových období.",
"endTime": "Čas konce",
"inputPlaceholder": "Prosím zadejte",
"multiplier": "Násobitel",
"nodePullInterval": "Interval stahování uzlu",
"nodePullIntervalDescription": "Frekvence, s jakou uzel získává data z panelu (v sekundách)",
"nodePushInterval": "Interval odesílání uzlu",
"nodePushIntervalDescription": "Frekvence, s jakou uzel odesílá data do panelu",
"saveSuccess": "Úspěšně uloženo"
"reset": "Resetovat",
"save": "Uložit",
"saveSuccess": "Úspěšně uloženo",
"startTime": "Čas začátku",
"timeSlot": "Časový úsek"
},
"register": {
"emailSuffixWhitelist": "Seznam povolených přípon e-mailů",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Dieser Gutschein wurde bereits verwendet und kann nicht erneut verwendet werden.",
"60001": "Das Abonnement ist abgelaufen, bitte erneuern und dann verwenden.",
"60002": "Das Abonnement kann derzeit nicht verwendet werden, bitte versuchen Sie es später erneut.",
"60003": "Ein bestehendes Abonnement wurde erkannt. Bitte kündigen Sie es, bevor Sie fortfahren.",
"60004": "Kann derzeit nicht gelöscht werden, da das Abonnement aktive Benutzer hat.",
"70001": "Der Bestätigungscode ist falsch, bitte erneut eingeben.",
"80001": "Die Aufgabe wurde nicht erfolgreich in die Warteschlange aufgenommen, bitte versuchen Sie es später erneut.",
"90001": "Bitte deaktivieren Sie den DEBUG-Modus und versuchen Sie es erneut.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Bestätigen",
"edit": "Bearbeiten",
"editSecurity": "Sicherheitskonfiguration bearbeiten",
"enableRelay": "Relay aktivieren",
"enableTLS": "TLS aktivieren",
"encryptionMethod": "Verschlüsselungsmethode",
"flow": "Flusskontrollalgorithmus",
@@ -65,7 +64,14 @@
"port": "Serverport",
"protocol": "Protokoll",
"relayHost": "Relay-Adresse",
"relayMode": "Relaismodus",
"relayModeOptions": {
"all": "Alle",
"none": "Keine",
"random": "Zufällig"
},
"relayPort": "Relay-Port",
"relayPrefix": "Relaispräfix",
"remarks": "Bemerkungen",
"security": "Sicherheit",
"securityConfig": "Sicherheitskonfiguration",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Verschlüsselungsmethode auswählen",
"selectNodeGroup": "Knotengruppe auswählen",
"selectProtocol": "Protokoll auswählen",
"selectRelayMode": "Relaismodus auswählen",
"serverAddr": "Serveradresse",
"serverKey": "Server-Schlüssel",
"serverName": "Dienstname",
"speedLimit": "Geschwindigkeitsbegrenzung",
"speedLimitPlaceholder": "Keine Begrenzung",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Stunde",
"Minute": "Minute",
"Month": "Monat",
"NoLimit": "Kein Limit",
"Year": "Jahr",
"annualReset": "Jährliches Zurücksetzen",
"basic": "Grundlegend",
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"deductionRatio": "Automatische/Manuelle Abzugskonfiguration",
"deductionRatioDescription": "Wird für Abzüge verwendet. Standardmäßig verwendet das System einen automatischen Berechnungsalgorithmus. Wenn ein manueller Prozentsatz angegeben wird, berechnet das System die Anteile basierend auf dem Zeit- und Verkehrsverhältnis, wobei sichergestellt wird, dass die Summe 100% ergibt.",
"description": "Beschreibung",
"deviceLimit": "Gerätebeschränkung",
"discount": "Rabatt",
@@ -31,14 +36,25 @@
"discount_price": "Rabattpreis",
"duration": "Dauer (Monate)",
"inventory": "Bestand",
"monthlyReset": "Monatliches Zurücksetzen",
"name": "Name",
"noLimit": "Keine Begrenzung",
"noReset": "Kein Zurücksetzen",
"pricing": "Preisgestaltung",
"purchaseWithDiscount": "Abzug erlauben",
"purchaseWithDiscountDescription": "Aktivieren oder deaktivieren Sie die Abzugsfunktion. Wenn aktiviert, verarbeitet das System Abzüge basierend auf den konfigurierten Regeln und Verhältnissen.",
"quota": "Kaufbeschränkung",
"renewalReset": "Zurücksetzen bei Erneuerung",
"renewalResetDescription": "Zurücksetzungszyklus bei Erneuerung",
"replacement": "Ersatzpreis (pro Mal)",
"resetCycle": "Zurücksetzungszyklus",
"resetOn1st": "Zurücksetzen am 1.",
"selectResetCycle": "Bitte wählen Sie einen Zurücksetzungszyklus",
"selectSubscribeGroup": "Bitte Abonnementgruppe auswählen",
"selectUnitTime": "Bitte wählen Sie eine Zeiteinheit",
"server": "Dienst",
"serverGroup": "Dienstgruppe",
"servers": "Server",
"speedLimit": "Geschwindigkeitsbegrenzung (Mbps)",
"subscribeGroup": "Abonnementgruppe",
"traffic": "Datenvolumen",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abonnieren Gruppe"
},
"traffic": "Verkehr",
"unitPrice": "Preis/Monat",
"unitPrice": "Stückpreis",
"updateSuccess": "Aktualisierung erfolgreich"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Erfolgreich gespeichert"
},
"node": {
"addTimeSlot": "Zeitfenster hinzufügen",
"communicationKey": "Kommunikationsschlüssel",
"communicationKeyDescription": "Schlüssel für die Kommunikation des Knotens, um sicherzustellen, dass Daten nicht von anderen abgefangen werden",
"delete": "Löschen",
"dynamicMultiplier": "Dynamischer Multiplikator",
"dynamicMultiplierDescription": "Dynamischer Multiplikator bezieht sich auf die Verarbeitung von übermittelten Daten mit unterschiedlichen Multiplikatoren für verschiedene Knoten während unterschiedlicher Zeiträume.",
"endTime": "Endzeit",
"inputPlaceholder": "Bitte eingeben",
"multiplier": "Multiplikator",
"nodePullInterval": "Knotenabfrageintervall",
"nodePullIntervalDescription": "Häufigkeit, mit der der Knoten Daten vom Panel abruft (Sekunden)",
"nodePushInterval": "Knotenübertragungsintervall",
"nodePushIntervalDescription": "Häufigkeit, mit der der Knoten Daten an das Panel überträgt",
"saveSuccess": "Erfolgreich gespeichert"
"reset": "Zurücksetzen",
"save": "Speichern",
"saveSuccess": "Erfolgreich gespeichert",
"startTime": "Startzeit",
"timeSlot": "Zeitfenster"
},
"register": {
"emailSuffixWhitelist": "E-Mail-Suffix-Whitelist",
+2
View File
@@ -42,6 +42,8 @@
"50002": "The coupon has been used, cannot be used again.",
"60001": "Subscription has expired, please renew before using.",
"60002": "Unable to use the subscription at the moment, please try again later.",
"60003": "An existing subscription is detected. Please cancel it before proceeding.",
"60004": "Unable to delete at the moment as the subscription has active users.",
"70001": "Incorrect verification code, please re-enter.",
"80001": "Task was not successfully queued, please try again later.",
"90001": "Please disable DEBUG mode and try again.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirm",
"edit": "Edit",
"editSecurity": "Edit Security Configuration",
"enableRelay": "Enable Relay",
"enableTLS": "Enable TLS",
"encryptionMethod": "Encryption Method",
"flow": "Flow Control Algorithm",
@@ -65,7 +64,14 @@
"port": "Server Port",
"protocol": "Protocol",
"relayHost": "Relay Host",
"relayMode": "Relay Mode",
"relayModeOptions": {
"all": "All",
"none": "None",
"random": "Random"
},
"relayPort": "Relay Port",
"relayPrefix": "Relay Prefix",
"remarks": "Remarks",
"security": "Security",
"securityConfig": "Security Configuration",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Select Encryption Method",
"selectNodeGroup": "Select Node Group",
"selectProtocol": "Select Protocol",
"selectRelayMode": "Select Relay Mode",
"serverAddr": "Server Address",
"serverKey": "Server Key",
"serverName": "Service Name",
"speedLimit": "Speed Limit",
"speedLimitPlaceholder": "Unlimited",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hour",
"Minute": "Minute",
"Month": "Month",
"NoLimit": "No Limit",
"Year": "Year",
"annualReset": "Annual Reset",
"basic": "Basic",
"cancel": "Cancel",
"confirm": "Confirm",
"deductionRatio": "Automatic/Manual Deduction Configuration",
"deductionRatioDescription": "Used for deduction. By default, the system adopts an automatic calculation algorithm. When a manual ratio is provided, the system calculates proportions based on the time and traffic ratio, ensuring the total equals 100%.",
"description": "Description",
"deviceLimit": "Device Limit",
"discount": "Discount",
@@ -31,14 +36,25 @@
"discount_price": "Discount Price",
"duration": "Duration (months)",
"inventory": "Inventory",
"monthlyReset": "Monthly Reset",
"name": "Name",
"noLimit": "No Limit",
"noReset": "No Reset",
"pricing": "Pricing",
"purchaseWithDiscount": "Allow Deduction",
"purchaseWithDiscountDescription": "Enable or disable the deduction feature. When enabled, the system will process deductions based on the configured rules and ratios",
"quota": "Purchase Limit",
"renewalReset": "Renewal Reset",
"renewalResetDescription": "Reset cycle upon renewal",
"replacement": "Reset Price (per time)",
"resetCycle": "Reset Cycle",
"resetOn1st": "Reset on the 1st",
"selectResetCycle": "Please select a reset cycle",
"selectSubscribeGroup": "Select Subscription Group",
"selectUnitTime": "Please select a unit of time",
"server": "Server",
"serverGroup": "Server Group",
"servers": "Servers",
"speedLimit": "Speed Limit (Mbps)",
"subscribeGroup": "Subscription Group",
"traffic": "Traffic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Subscription Group"
},
"traffic": "Traffic",
"unitPrice": "Price/Month",
"unitPrice": "Unit Price",
"updateSuccess": "Update Successful"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Save Successful"
},
"node": {
"addTimeSlot": "Add Time Slot",
"communicationKey": "Communication Key",
"communicationKeyDescription": "Key for node communication to ensure data security",
"delete": "Delete",
"dynamicMultiplier": "Dynamic Multiplier",
"dynamicMultiplierDescription": "Dynamic Multiplier refers to processing pushed data with different multipliers for different nodes during different time periods.",
"endTime": "End Time",
"inputPlaceholder": "Enter",
"multiplier": "Multiplier",
"nodePullInterval": "Node Pull Interval",
"nodePullIntervalDescription": "Frequency (in seconds) for nodes to fetch data from the panel",
"nodePushInterval": "Node Push Interval",
"nodePushIntervalDescription": "Frequency for nodes to push data to the panel",
"saveSuccess": "Save Successful"
"reset": "Reset",
"save": "Save",
"saveSuccess": "Save Successful",
"startTime": "Start Time",
"timeSlot": "Time Slot"
},
"register": {
"emailSuffixWhitelist": "Email Suffix Whitelist",
+2
View File
@@ -42,6 +42,8 @@
"50002": "El cupón ya ha sido utilizado, no se puede usar nuevamente.",
"60001": "La suscripción ha expirado, por favor renueve para continuar usándola.",
"60002": "No se puede usar la suscripción por el momento, por favor intente más tarde.",
"60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.",
"60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.",
"70001": "El código de verificación es incorrecto, por favor ingréselo nuevamente.",
"80001": "La tarea no se agregó exitosamente a la cola, por favor intente de nuevo más tarde.",
"90001": "Por favor desactive el modo DEBUG e intente nuevamente.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar",
"edit": "Editar",
"editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo",
@@ -65,7 +64,14 @@
"port": "Puerto del servidor",
"protocol": "Protocolo",
"relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Observaciones",
"security": "Seguridad",
"securityConfig": "Configuración de seguridad",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor",
"serverKey": "Clave del Servidor",
"serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad",
"speedLimitPlaceholder": "Sin límite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"NoLimit": "Sin Límite",
"Year": "Año",
"annualReset": "Reinicio Anual",
"basic": "Básico",
"cancel": "Cancelar",
"confirm": "Confirmar",
"deductionRatio": "Configuración de Deducción Automática/Manual",
"deductionRatioDescription": "Utilizado para deducciones. Por defecto, el sistema adopta un algoritmo de cálculo automático. Cuando se proporciona un ratio manual, el sistema calcula proporciones basadas en el tiempo y el ratio de tráfico, asegurando que el total sea igual al 100%.",
"description": "Descripción",
"deviceLimit": "Límite de dispositivos",
"discount": "Descuento",
@@ -31,14 +36,25 @@
"discount_price": "Precio con descuento",
"duration": "Duración (meses)",
"inventory": "Inventario",
"monthlyReset": "Reinicio Mensual",
"name": "Nombre",
"noLimit": "Sin límite",
"noReset": "Sin Reinicio",
"pricing": "Precios",
"purchaseWithDiscount": "Permitir Deducción",
"purchaseWithDiscountDescription": "Habilitar o deshabilitar la función de deducción. Cuando está habilitada, el sistema procesará las deducciones basadas en las reglas y ratios configurados",
"quota": "Cantidad de compra limitada",
"renewalReset": "Reinicio por Renovación",
"renewalResetDescription": "Reiniciar ciclo al renovar",
"replacement": "Precio de reposición (cada vez)",
"resetCycle": "Ciclo de Reinicio",
"resetOn1st": "Reiniciar el día 1",
"selectResetCycle": "Por favor, seleccione un ciclo de reinicio",
"selectSubscribeGroup": "Por favor, seleccione un grupo de suscripción",
"selectUnitTime": "Por favor, seleccione la unidad de tiempo",
"server": "Servidor",
"serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de suscripción"
},
"traffic": "tráfico",
"unitPrice": "Precio/mes",
"unitPrice": "Precio Unitario",
"updateSuccess": "Actualización exitosa"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Guardado exitosamente"
},
"node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros",
"delete": "Eliminar",
"dynamicMultiplier": "Multiplicador Dinámico",
"dynamicMultiplierDescription": "El Multiplicador Dinámico se refiere al procesamiento de datos enviados con diferentes multiplicadores para diferentes nodos durante distintos períodos de tiempo.",
"endTime": "Hora de Fin",
"inputPlaceholder": "Por favor, ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel",
"saveSuccess": "Guardado exitosamente"
"reset": "Restablecer",
"save": "Guardar",
"saveSuccess": "Guardado exitosamente",
"startTime": "Hora de Inicio",
"timeSlot": "Franja Horaria"
},
"register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico",
+2
View File
@@ -42,6 +42,8 @@
"50002": "El cupón ya ha sido utilizado, no se puede usar de nuevo.",
"60001": "La suscripción ha expirado, por favor renueva para continuar usando.",
"60002": "No se puede usar la suscripción por el momento, por favor intenta más tarde.",
"60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.",
"60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.",
"70001": "El código de verificación es incorrecto, por favor ingrésalo de nuevo.",
"80001": "La tarea no se agregó exitosamente a la cola, por favor intenta de nuevo más tarde.",
"90001": "Por favor desactiva el modo DEBUG e intenta de nuevo.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar",
"edit": "Editar",
"editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo",
@@ -65,7 +64,14 @@
"port": "Puerto del servidor",
"protocol": "Protocolo",
"relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Comentarios",
"security": "Seguridad",
"securityConfig": "Configuración de seguridad",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor",
"serverKey": "Clave del Servidor",
"serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad",
"speedLimitPlaceholder": "Sin límite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"NoLimit": "Sin Límite",
"Year": "Año",
"annualReset": "Reinicio Anual",
"basic": "Básico",
"cancel": "Cancelar",
"confirm": "Confirmar",
"deductionRatio": "Configuración de Deducción Automática/Manual",
"deductionRatioDescription": "Utilizado para deducciones. Por defecto, el sistema adopta un algoritmo de cálculo automático. Cuando se proporciona un ratio manual, el sistema calcula proporciones basadas en el tiempo y el ratio de tráfico, asegurando que el total sea igual al 100%.",
"description": "Descripción",
"deviceLimit": "Límite de dispositivos",
"discount": "Descuento",
@@ -31,14 +36,25 @@
"discount_price": "Precio con descuento",
"duration": "Duración (meses)",
"inventory": "Inventario",
"monthlyReset": "Reinicio Mensual",
"name": "Nombre",
"noLimit": "Sin límite",
"noReset": "Sin Reinicio",
"pricing": "Precios",
"purchaseWithDiscount": "Permitir Deducción",
"purchaseWithDiscountDescription": "Habilitar o deshabilitar la función de deducción. Cuando está habilitada, el sistema procesará deducciones basadas en las reglas y ratios configurados.",
"quota": "Cantidad máxima de compra",
"renewalReset": "Reinicio por Renovación",
"renewalResetDescription": "Reiniciar ciclo al renovar",
"replacement": "Precio de reposición (cada vez)",
"resetCycle": "Ciclo de Reinicio",
"resetOn1st": "Reiniciar el día 1",
"selectResetCycle": "Por favor, seleccione un ciclo de reinicio",
"selectSubscribeGroup": "Por favor seleccione un grupo de suscripción",
"selectUnitTime": "Por favor seleccione la unidad de tiempo",
"server": "Servidor",
"serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de suscripción"
},
"traffic": "tráfico",
"unitPrice": "Precio/mes",
"unitPrice": "Precio Unitario",
"updateSuccess": "Actualización exitosa"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Guardado exitosamente"
},
"node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros",
"delete": "Eliminar",
"dynamicMultiplier": "Multiplicador Dinámico",
"dynamicMultiplierDescription": "El Multiplicador Dinámico se refiere al procesamiento de datos enviados con diferentes multiplicadores para diferentes nodos durante distintos períodos de tiempo.",
"endTime": "Hora de Fin",
"inputPlaceholder": "Por favor ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel",
"saveSuccess": "Guardado exitosamente"
"reset": "Restablecer",
"save": "Guardar",
"saveSuccess": "Guardado exitosamente",
"startTime": "Hora de Inicio",
"timeSlot": "Franja Horaria"
},
"register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico",
+2
View File
@@ -42,6 +42,8 @@
"50002": "کوپن استفاده شده است، نمی‌توان دوباره استفاده کرد.",
"60001": "اشتراک منقضی شده است، لطفاً قبل از استفاده تمدید کنید.",
"60002": "در حال حاضر نمی‌توان از اشتراک استفاده کرد، لطفاً بعداً دوباره تلاش کنید.",
"60003": "یک اشتراک موجود شناسایی شد. لطفاً قبل از ادامه آن را لغو کنید.",
"60004": "در حال حاضر امکان حذف وجود ندارد زیرا اشتراک دارای کاربران فعال است.",
"70001": "کد تأیید نادرست است، لطفاً دوباره وارد کنید.",
"80001": "وظیفه به‌طور موفقیت‌آمیز در صف قرار نگرفت، لطفاً بعداً دوباره تلاش کنید.",
"90001": "لطفاً حالت DEBUG را غیرفعال کرده و دوباره تلاش کنید.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "تأیید",
"edit": "ویرایش",
"editSecurity": "ویرایش تنظیمات امنیتی",
"enableRelay": "فعال‌سازی رله",
"enableTLS": "فعال‌سازی TLS",
"encryptionMethod": "روش رمزنگاری",
"flow": "الگوریتم کنترل جریان",
@@ -65,7 +64,14 @@
"port": "پورت سرور",
"protocol": "پروتکل",
"relayHost": "میزبان رله",
"relayMode": "حالت رله",
"relayModeOptions": {
"all": "همه",
"none": "هیچ‌کدام",
"random": "تصادفی"
},
"relayPort": "پورت رله",
"relayPrefix": "پیشوند رله",
"remarks": "توضیحات",
"security": "امنیت",
"securityConfig": "پیکربندی امنیتی",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "انتخاب روش رمزنگاری",
"selectNodeGroup": "انتخاب گروه گره",
"selectProtocol": "انتخاب پروتکل",
"selectRelayMode": "انتخاب حالت رله",
"serverAddr": "آدرس سرور",
"serverKey": "کلید سرور",
"serverName": "نام سرویس",
"speedLimit": "محدودیت سرعت",
"speedLimitPlaceholder": "نامحدود",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "ساعت",
"Minute": "دقیقه",
"Month": "ماه",
"NoLimit": "بدون محدودیت",
"Year": "سال",
"annualReset": "بازنشانی سالانه",
"basic": "پایه",
"cancel": "لغو",
"confirm": "تأیید",
"deductionRatio": "پیکربندی کسر خودکار/دستی",
"deductionRatioDescription": "برای کسر استفاده می‌شود. به طور پیش‌فرض، سیستم از یک الگوریتم محاسبه خودکار استفاده می‌کند. هنگامی که نسبت دستی ارائه می‌شود، سیستم نسبت‌ها را بر اساس زمان و نسبت ترافیک محاسبه می‌کند و اطمینان حاصل می‌کند که مجموع به ۱۰۰٪ می‌رسد.",
"description": "توضیحات",
"deviceLimit": "محدودیت دستگاه",
"discount": "تخفیف",
@@ -31,14 +36,25 @@
"discount_price": "قیمت تخفیف",
"duration": "مدت زمان (ماه‌ها)",
"inventory": "موجودی",
"monthlyReset": "بازنشانی ماهانه",
"name": "نام",
"noLimit": "بدون محدودیت",
"noReset": "بدون بازنشانی",
"pricing": "قیمت‌گذاری",
"purchaseWithDiscount": "اجازه کسر",
"purchaseWithDiscountDescription": "فعال یا غیرفعال کردن ویژگی کسر. هنگامی که فعال است، سیستم کسرها را بر اساس قوانین و نسبت‌های پیکربندی شده پردازش می‌کند.",
"quota": "محدودیت خرید",
"renewalReset": "بازنشانی تمدید",
"renewalResetDescription": "بازنشانی چرخه در زمان تمدید",
"replacement": "تنظیم مجدد قیمت (هر بار)",
"resetCycle": "چرخه بازنشانی",
"resetOn1st": "بازنشانی در روز اول",
"selectResetCycle": "لطفاً یک چرخه بازنشانی انتخاب کنید",
"selectSubscribeGroup": "گروه اشتراک را انتخاب کنید",
"selectUnitTime": "لطفاً واحد زمان را انتخاب کنید",
"server": "سرور",
"serverGroup": "گروه سرور",
"servers": "سرورها",
"speedLimit": "محدودیت سرعت (مگابیت بر ثانیه)",
"subscribeGroup": "گروه اشتراک",
"traffic": "ترافیک",
@@ -83,6 +99,6 @@
"subscribeGroup": "گروه اشتراک"
},
"traffic": "ترافیک",
"unitPrice": "قیمت/ماه",
"unitPrice": "قیمت واحد",
"updateSuccess": "به‌روزرسانی با موفقیت انجام شد"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "ذخیره‌سازی موفقیت‌آمیز"
},
"node": {
"addTimeSlot": "افزودن بازه زمانی",
"communicationKey": "کلید ارتباطی",
"communicationKeyDescription": "کلید برای ارتباط گره به منظور اطمینان از امنیت داده‌ها",
"delete": "حذف",
"dynamicMultiplier": "ضریب پویا",
"dynamicMultiplierDescription": "ضریب پویا به پردازش داده‌های ارسال شده با ضرایب مختلف برای گره‌های مختلف در دوره‌های زمانی مختلف اشاره دارد.",
"endTime": "زمان پایان",
"inputPlaceholder": "وارد کنید",
"multiplier": "ضریب",
"nodePullInterval": "فاصله زمانی کشیدن گره",
"nodePullIntervalDescription": "فرکانس (به ثانیه) برای گره‌ها جهت دریافت داده از پنل",
"nodePushInterval": "فاصله زمانی فشار گره",
"nodePushIntervalDescription": "فرکانس برای گره‌ها جهت ارسال داده به پنل",
"saveSuccess": "ذخیره با موفقیت انجام شد"
"reset": "بازنشانی",
"save": "ذخیره",
"saveSuccess": "ذخیره با موفقیت انجام شد",
"startTime": "زمان شروع",
"timeSlot": "بازه زمانی"
},
"register": {
"emailSuffixWhitelist": "لیست سفید پسوند ایمیل",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Kuponki on jo käytetty, sitä ei voi käyttää uudelleen.",
"60001": "Tilauksesi on vanhentunut, uusi tilaus ja käytä uudelleen.",
"60002": "Tilausta ei voi käyttää tällä hetkellä, yritä myöhemmin uudelleen.",
"60003": "Olemassa oleva tilaus havaittu. Peruuta se ennen jatkamista.",
"60004": "Ei voi poistaa tällä hetkellä, koska tilauksella on aktiivisia käyttäjiä.",
"70001": "Vahvistuskoodi on virheellinen, syötä se uudelleen.",
"80001": "Tehtävää ei lisätty jonoon, yritä myöhemmin uudelleen.",
"90001": "Sulje DEBUG-tila ja yritä uudelleen.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Vahvista",
"edit": "Muokkaa",
"editSecurity": "Muokkaa suojausasetuksia",
"enableRelay": "Ota välitys käyttöön",
"enableTLS": "Ota TLS käyttöön",
"encryptionMethod": "Salausmenetelmä",
"flow": "Virtausalgoritmi",
@@ -65,7 +64,14 @@
"port": "Palvelinportti",
"protocol": "Protokolla",
"relayHost": "Välityksen osoite",
"relayMode": "Välitystila",
"relayModeOptions": {
"all": "Kaikki",
"none": "Ei mitään",
"random": "Satunnainen"
},
"relayPort": "Välityksen portti",
"relayPrefix": "Välitys etuliite",
"remarks": "Huomautukset",
"security": "Turvallisuus",
"securityConfig": "Turvallisuusasetukset",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Valitse salausmenetelmä",
"selectNodeGroup": "Valitse solmuryhmä",
"selectProtocol": "Valitse protokolla",
"selectRelayMode": "Valitse välitystila",
"serverAddr": "Palvelimen osoite",
"serverKey": "Palvelimen avain",
"serverName": "Palvelimen nimi",
"speedLimit": "Nopeusrajoitus",
"speedLimitPlaceholder": "Ei rajoitusta",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Tunti",
"Minute": "Minuutti",
"Month": "Kuukausi",
"NoLimit": "Ei rajoitusta",
"Year": "Vuosi",
"annualReset": "Vuosittainen Nollaus",
"basic": "Perus",
"cancel": "Peruuta",
"confirm": "Vahvista",
"deductionRatio": "Automaattinen/Manuaalinen Vähennyskonfiguraatio",
"deductionRatioDescription": "Käytetään vähennyksiin. Oletuksena järjestelmä käyttää automaattista laskenta-algoritmia. Kun manuaalinen suhde on annettu, järjestelmä laskee osuudet ajan ja liikenteen suhteen perusteella varmistaen, että kokonaismäärä on 100%.",
"description": "Kuvaus",
"deviceLimit": "Laiterajoitus",
"discount": "Alennus",
@@ -31,14 +36,25 @@
"discount_price": "Alennettu hinta",
"duration": "Kesto (kuukautta)",
"inventory": "Varasto",
"monthlyReset": "Kuukausittainen Nollaus",
"name": "Nimi",
"noLimit": "Ei rajoitusta",
"noReset": "Ei Nollausta",
"pricing": "Hinnoittelu",
"purchaseWithDiscount": "Salli Vähennys",
"purchaseWithDiscountDescription": "Ota vähennystoiminto käyttöön tai poista se käytöstä. Kun se on käytössä, järjestelmä käsittelee vähennykset määritettyjen sääntöjen ja suhteiden perusteella.",
"quota": "Ostorajoitus",
"renewalReset": "Uusimisen Nollaus",
"renewalResetDescription": "Nollaa jakso uusimisen yhteydessä",
"replacement": "Uudelleenhinnan asetus (kerta)",
"resetCycle": "Nollausjakso",
"resetOn1st": "Nollaus 1. päivänä",
"selectResetCycle": "Valitse nollausjakso",
"selectSubscribeGroup": "Valitse tilausryhmä",
"selectUnitTime": "Valitse aikayksikkö",
"server": "Palvelin",
"serverGroup": "Palvelinryhmä",
"servers": "Palvelimet",
"speedLimit": "Nopeusrajoitus (Mbps)",
"subscribeGroup": "Tilausryhmä",
"traffic": "Liikenne",
@@ -83,6 +99,6 @@
"subscribeGroup": "Tilaa ryhmä"
},
"traffic": "liikenne",
"unitPrice": "Hinta/kk",
"unitPrice": "Yksikköhinta",
"updateSuccess": "Päivitys onnistui"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Tallennus onnistui"
},
"node": {
"addTimeSlot": "Lisää aikaväli",
"communicationKey": "Viestintäavain",
"communicationKeyDescription": "Solmun viestinnän avain, joka varmistaa, että tiedot eivät joudu muiden sieppaamiksi",
"delete": "Poista",
"dynamicMultiplier": "Dynaaminen Kerroin",
"dynamicMultiplierDescription": "Dynaaminen Kerroin viittaa siihen, että käsitellään siirrettyä dataa eri kertoimilla eri solmuille eri ajanjaksoina.",
"endTime": "Lopetusaika",
"inputPlaceholder": "Ole hyvä ja syötä",
"multiplier": "Kerroin",
"nodePullInterval": "Solmun noutoväli",
"nodePullIntervalDescription": "Kuinka usein solmu hakee tietoja paneelista (sekunteina)",
"nodePushInterval": "Solmun lähetysväli",
"nodePushIntervalDescription": "Kuinka usein solmu lähettää tietoja paneeliin",
"saveSuccess": "Tallennus onnistui"
"reset": "Nollaa",
"save": "Tallenna",
"saveSuccess": "Tallennus onnistui",
"startTime": "Aloitusaika",
"timeSlot": "Aikaväli"
},
"register": {
"emailSuffixWhitelist": "Sähköpostin jälkiliitteen sallittu luettelo",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Ce coupon a déjà été utilisé, il ne peut pas être réutilisé.",
"60001": "L'abonnement a expiré, veuillez le renouveler avant de l'utiliser.",
"60002": "Impossible d'utiliser cet abonnement pour le moment, veuillez réessayer plus tard.",
"60003": "Un abonnement existant a été détecté. Veuillez l'annuler avant de continuer.",
"60004": "Impossible de supprimer pour le moment car l'abonnement a des utilisateurs actifs.",
"70001": "Le code de vérification est incorrect, veuillez le ressaisir.",
"80001": "La tâche n'a pas été ajoutée avec succès à la file d'attente, veuillez réessayer plus tard.",
"90001": "Veuillez désactiver le mode DEBUG et réessayer.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmer",
"edit": "Éditer",
"editSecurity": "Éditer la configuration de sécurité",
"enableRelay": "Activer le relais",
"enableTLS": "Activer TLS",
"encryptionMethod": "Méthode de cryptage",
"flow": "Algorithme de contrôle de flux",
@@ -65,7 +64,14 @@
"port": "Port de service",
"protocol": "Protocole",
"relayHost": "Adresse de relais",
"relayMode": "Mode relais",
"relayModeOptions": {
"all": "Tous",
"none": "Aucun",
"random": "Aléatoire"
},
"relayPort": "Port de relais",
"relayPrefix": "Préfixe relais",
"remarks": "Remarques",
"security": "Sécurité",
"securityConfig": "Configuration de sécurité",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Sélectionner la méthode de cryptage",
"selectNodeGroup": "Sélectionner le groupe de nœuds",
"selectProtocol": "Sélectionner le protocole",
"selectRelayMode": "Sélectionner le mode relais",
"serverAddr": "Adresse du serveur",
"serverKey": "Clé du serveur",
"serverName": "Nom du service",
"speedLimit": "Limite de vitesse",
"speedLimitPlaceholder": "Illimité",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Heure",
"Minute": "Minute",
"Month": "Mois",
"NoLimit": "Pas de limite",
"Year": "Année",
"annualReset": "Réinitialisation Annuelle",
"basic": "Basique",
"cancel": "Annuler",
"confirm": "Confirmer",
"deductionRatio": "Configuration de Déduction Automatique/Manuelle",
"deductionRatioDescription": "Utilisé pour la déduction. Par défaut, le système adopte un algorithme de calcul automatique. Lorsqu'un ratio manuel est fourni, le système calcule les proportions en fonction du temps et du ratio de trafic, en veillant à ce que le total soit égal à 100%.",
"description": "Description",
"deviceLimit": "Limite d'appareils",
"discount": "Remise",
@@ -31,14 +36,25 @@
"discount_price": "Prix remisé",
"duration": "Durée (mois)",
"inventory": "Stock",
"monthlyReset": "Réinitialisation Mensuelle",
"name": "Nom",
"noLimit": "Illimité",
"noReset": "Pas de Réinitialisation",
"pricing": "Tarification",
"purchaseWithDiscount": "Autoriser la Déduction",
"purchaseWithDiscountDescription": "Activer ou désactiver la fonction de déduction. Lorsqu'elle est activée, le système traitera les déductions selon les règles et ratios configurés",
"quota": "Quantité d'achat limitée",
"renewalReset": "Réinitialisation au Renouvellement",
"renewalResetDescription": "Réinitialiser le cycle lors du renouvellement",
"replacement": "Prix de réinitialisation (par fois)",
"resetCycle": "Cycle de Réinitialisation",
"resetOn1st": "Réinitialisation le 1er",
"selectResetCycle": "Veuillez sélectionner un cycle de réinitialisation",
"selectSubscribeGroup": "Veuillez sélectionner un groupe d'abonnement",
"selectUnitTime": "Veuillez sélectionner l'unité de temps",
"server": "Serveur",
"serverGroup": "Groupe de serveurs",
"servers": "Serveurs",
"speedLimit": "Limite de vitesse (Mbps)",
"subscribeGroup": "Groupe d'abonnement",
"traffic": "Trafic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Groupe d'abonnement"
},
"traffic": "trafic",
"unitPrice": "Prix/mois",
"unitPrice": "Prix unitaire",
"updateSuccess": "Mise à jour réussie"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Enregistrement réussi"
},
"node": {
"addTimeSlot": "Ajouter un créneau horaire",
"communicationKey": "Clé de communication",
"communicationKeyDescription": "Clé pour la communication du nœud, afin de garantir que les données ne soient pas interceptées par d'autres",
"delete": "Supprimer",
"dynamicMultiplier": "Multiplicateur Dynamique",
"dynamicMultiplierDescription": "Le Multiplicateur Dynamique fait référence au traitement des données poussées avec différents multiplicateurs pour différents nœuds pendant différentes périodes.",
"endTime": "Heure de Fin",
"inputPlaceholder": "Veuillez entrer",
"multiplier": "Multiplicateur",
"nodePullInterval": "Intervalle de récupération du nœud",
"nodePullIntervalDescription": "Fréquence à laquelle le nœud récupère les données du panneau (en secondes)",
"nodePushInterval": "Intervalle de poussée du nœud",
"nodePushIntervalDescription": "Fréquence à laquelle le nœud pousse les données vers le panneau",
"saveSuccess": "Enregistrement réussi"
"reset": "Réinitialiser",
"save": "Enregistrer",
"saveSuccess": "Enregistrement réussi",
"startTime": "Heure de Début",
"timeSlot": "Créneau horaire"
},
"register": {
"emailSuffixWhitelist": "Liste blanche des suffixes d'email",
+2
View File
@@ -42,6 +42,8 @@
"50002": "यह कूपन पहले ही उपयोग किया जा चुका है, इसे पुनः उपयोग नहीं किया जा सकता।",
"60001": "सदस्यता की समय सीमा समाप्त हो गई है, कृपया नवीनीकरण के बाद उपयोग करें।",
"60002": "अस्थायी रूप से इस सदस्यता का उपयोग नहीं किया जा सकता, कृपया थोड़ी देर बाद पुनः प्रयास करें।",
"60003": "एक मौजूदा सदस्यता का पता चला है। कृपया आगे बढ़ने से पहले इसे रद्द करें।",
"60004": "वर्तमान में हटाने में असमर्थ क्योंकि सदस्यता में सक्रिय उपयोगकर्ता हैं।",
"70001": "सत्यापन कोड गलत है, कृपया पुनः दर्ज करें।",
"80001": "कार्य सफलतापूर्वक कतार में नहीं जोड़ा गया, कृपया थोड़ी देर बाद पुनः प्रयास करें।",
"90001": "कृपया DEBUG मोड बंद करें और फिर पुनः प्रयास करें।",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "पुष्टि करें",
"edit": "संपादित करें",
"editSecurity": "सुरक्षा कॉन्फ़िगरेशन संपादित करें",
"enableRelay": "रिले सक्षम करें",
"enableTLS": "TLS सक्षम करें",
"encryptionMethod": "एन्क्रिप्शन विधि",
"flow": "फ्लो कंट्रोल एल्गोरिदम",
@@ -65,7 +64,14 @@
"port": "सर्वर पोर्ट",
"protocol": "प्रोटोकॉल",
"relayHost": "रिले पता",
"relayMode": "रिले मोड",
"relayModeOptions": {
"all": "सभी",
"none": "कोई नहीं",
"random": "यादृच्छिक"
},
"relayPort": "रिले पोर्ट",
"relayPrefix": "रिले उपसर्ग",
"remarks": "टिप्पणियाँ",
"security": "सुरक्षा",
"securityConfig": "सुरक्षा कॉन्फ़िगरेशन",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "एन्क्रिप्शन विधि चुनें",
"selectNodeGroup": "नोड समूह चुनें",
"selectProtocol": "प्रोटोकॉल चुनें",
"selectRelayMode": "रिले मोड चुनें",
"serverAddr": "सर्वर पता",
"serverKey": "सर्वर कुंजी",
"serverName": "सेवा नाम",
"speedLimit": "गति सीमा",
"speedLimitPlaceholder": "कोई सीमा नहीं",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "घंटा",
"Minute": "मिनट",
"Month": "महीना",
"NoLimit": "कोई सीमा नहीं",
"Year": "वर्ष",
"annualReset": "वार्षिक रीसेट",
"basic": "मूल",
"cancel": "रद्द करें",
"confirm": "पुष्टि करें",
"deductionRatio": "स्वचालित/मैनुअल कटौती कॉन्फ़िगरेशन",
"deductionRatioDescription": "कटौती के लिए उपयोग किया जाता है। डिफ़ॉल्ट रूप से, सिस्टम एक स्वचालित गणना एल्गोरिदम अपनाता है। जब एक मैनुअल अनुपात प्रदान किया जाता है, तो सिस्टम समय और ट्रैफ़िक अनुपात के आधार पर अनुपात की गणना करता है, यह सुनिश्चित करते हुए कि कुल 100% के बराबर हो।",
"description": "विवरण",
"deviceLimit": "उपकरण सीमा",
"discount": "छूट",
@@ -31,14 +36,25 @@
"discount_price": "छूट मूल्य",
"duration": "अवधि (महीने)",
"inventory": "भंडार",
"monthlyReset": "मासिक रीसेट",
"name": "नाम",
"noLimit": "कोई सीमा नहीं",
"noReset": "कोई रीसेट नहीं",
"pricing": "मूल्य निर्धारण",
"purchaseWithDiscount": "कटौती की अनुमति दें",
"purchaseWithDiscountDescription": "कटौती सुविधा को सक्षम या अक्षम करें। जब सक्षम किया जाता है, तो सिस्टम कॉन्फ़िगर किए गए नियमों और अनुपातों के आधार पर कटौती को संसाधित करेगा।",
"quota": "खरीद सीमा",
"renewalReset": "नवीनीकरण रीसेट",
"renewalResetDescription": "नवीनीकरण पर रीसेट चक्र",
"replacement": "पुनःस्थापना मूल्य (प्रति बार)",
"resetCycle": "रीसेट चक्र",
"resetOn1st": "1 तारीख को रीसेट",
"selectResetCycle": "कृपया एक रीसेट चक्र चुनें",
"selectSubscribeGroup": "कृपया सदस्यता समूह चुनें",
"selectUnitTime": "कृपया इकाई समय चुनें",
"server": "सर्वर",
"serverGroup": "सर्वर समूह",
"servers": "सर्वर",
"speedLimit": "गति सीमा (Mbps)",
"subscribeGroup": "सदस्यता समूह",
"traffic": "ट्रैफिक",
@@ -83,6 +99,6 @@
"subscribeGroup": "समूह सदस्यता"
},
"traffic": "ट्रैफिक",
"unitPrice": "मूल्य/माह",
"unitPrice": "इकाई मूल्य",
"updateSuccess": "अपडेट सफल"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "सफलतापूर्वक सहेजा गया"
},
"node": {
"addTimeSlot": "समय स्लॉट जोड़ें",
"communicationKey": "संचार कुंजी",
"communicationKeyDescription": "डेटा को अन्य लोगों द्वारा अवरोधित होने से बचाने के लिए नोड संचार की कुंजी",
"delete": "हटाएं",
"dynamicMultiplier": "डायनामिक मल्टीप्लायर",
"dynamicMultiplierDescription": "डायनामिक मल्टीप्लायर का मतलब है विभिन्न समय अवधियों के दौरान विभिन्न नोड्स के लिए अलग-अलग मल्टीप्लायर के साथ प्रोसेस किए गए डेटा को प्रोसेस करना।",
"endTime": "समाप्ति समय",
"inputPlaceholder": "कृपया दर्ज करें",
"multiplier": "मल्टीप्लायर",
"nodePullInterval": "नोड पुल अंतराल",
"nodePullIntervalDescription": "पैनल से डेटा प्राप्त करने के लिए नोड की आवृत्ति (सेकंड में)",
"nodePushInterval": "नोड पुश अंतराल",
"nodePushIntervalDescription": "नोड द्वारा डेटा को पैनल पर भेजने की आवृत्ति",
"saveSuccess": "सफलतापूर्वक सहेजा गया"
"reset": "रीसेट",
"save": "सहेजें",
"saveSuccess": "सफलतापूर्वक सहेजा गया",
"startTime": "प्रारंभ समय",
"timeSlot": "समय स्लॉट"
},
"register": {
"emailSuffixWhitelist": "ईमेल प्रत्यय श्वेतसूची",
+2
View File
@@ -42,6 +42,8 @@
"50002": "A kupon már felhasználásra került, nem használható újra.",
"60001": "Az előfizetés lejárt, kérjük, újítsa meg, majd használja.",
"60002": "Az előfizetés jelenleg nem használható, kérjük, próbálja meg később újra.",
"60003": "Létező előfizetés észlelve. Kérjük, törölje azt a folytatás előtt.",
"60004": "Jelenleg nem törölhető, mivel az előfizetésnek aktív felhasználói vannak.",
"70001": "A megerősítő kód hibás, kérjük, írja be újra.",
"80001": "A feladat nem került sikeresen a sorba, kérjük, próbálja meg később újra.",
"90001": "Kérjük, kapcsolja ki a DEBUG módot, majd próbálja újra.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Megerősít",
"edit": "Szerkesztés",
"editSecurity": "Biztonsági beállítások szerkesztése",
"enableRelay": "Átjátszás engedélyezése",
"enableTLS": "TLS engedélyezése",
"encryptionMethod": "Titkosítási módszer",
"flow": "Áramlásszabályozási algoritmus",
@@ -65,7 +64,14 @@
"port": "Szolgáltatási port",
"protocol": "Protokoll",
"relayHost": "Átjátszó cím",
"relayMode": "Relé mód",
"relayModeOptions": {
"all": "Összes",
"none": "Nincs",
"random": "Véletlenszerű"
},
"relayPort": "Átjátszó port",
"relayPrefix": "Relé előtag",
"remarks": "Megjegyzések",
"security": "Biztonság",
"securityConfig": "Biztonsági beállítások",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Válasszon titkosítási módszert",
"selectNodeGroup": "Válasszon csomópont csoportot",
"selectProtocol": "Válasszon protokollt",
"selectRelayMode": "Válassza ki a relé módot",
"serverAddr": "Szerver cím",
"serverKey": "Szerver kulcs",
"serverName": "Szolgáltatás neve",
"speedLimit": "Sebességkorlátozás",
"speedLimitPlaceholder": "Korlátlan",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Óra",
"Minute": "Perc",
"Month": "Hónap",
"NoLimit": "Nincs korlátozás",
"Year": "Év",
"annualReset": "Éves Visszaállítás",
"basic": "Alap",
"cancel": "Mégse",
"confirm": "Megerősít",
"deductionRatio": "Automatikus/Kézi Levonási Beállítás",
"deductionRatioDescription": "Levonáshoz használatos. Alapértelmezés szerint a rendszer automatikus számítási algoritmust alkalmaz. Amikor kézi arányt adnak meg, a rendszer az idő és forgalom arány alapján számítja ki az arányokat, biztosítva, hogy az összeg 100% legyen.",
"description": "Leírás",
"deviceLimit": "Eszközkorlát",
"discount": "Kedvezmény",
@@ -31,14 +36,25 @@
"discount_price": "Kedvezményes ár",
"duration": "Időtartam (hónap)",
"inventory": "Készlet",
"monthlyReset": "Havi Visszaállítás",
"name": "Név",
"noLimit": "Korlátlan",
"noReset": "Nincs Visszaállítás",
"pricing": "Árazás",
"purchaseWithDiscount": "Levonás Engedélyezése",
"purchaseWithDiscountDescription": "A levonási funkció engedélyezése vagy letiltása. Ha engedélyezve van, a rendszer a beállított szabályok és arányok alapján dolgozza fel a levonásokat.",
"quota": "Vásárlási korlát",
"renewalReset": "Megújítási Visszaállítás",
"renewalResetDescription": "Visszaállítási ciklus megújításkor",
"replacement": "Csere ára (alkalmanként)",
"resetCycle": "Visszaállítási Ciklus",
"resetOn1st": "Visszaállítás 1-jén",
"selectResetCycle": "Kérjük, válasszon visszaállítási ciklust",
"selectSubscribeGroup": "Kérjük, válassza ki az előfizetési csoportot",
"selectUnitTime": "Kérjük, válassza ki az időegységet",
"server": "Szolgáltatás",
"serverGroup": "Szolgáltatáscsoport",
"servers": "Szerverek",
"speedLimit": "Sebességkorlát (Mbps)",
"subscribeGroup": "Előfizetési csoport",
"traffic": "Forgalom",
@@ -83,6 +99,6 @@
"subscribeGroup": "Feliratkozási csoport"
},
"traffic": "forgalom",
"unitPrice": "Ár/hó",
"unitPrice": "Egységár",
"updateSuccess": "Sikeres frissítés"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Sikeres mentés"
},
"node": {
"addTimeSlot": "Időrés hozzáadása",
"communicationKey": "Kommunikációs kulcs",
"communicationKeyDescription": "A csomópontok közötti kommunikáció kulcsa, amely biztosítja, hogy az adatokat ne lehessen elfogni mások által",
"delete": "Törlés",
"dynamicMultiplier": "Dinamikus Szorzó",
"dynamicMultiplierDescription": "A Dinamikus Szorzó arra utal, hogy a különböző csomópontoknál különböző szorzókkal dolgozzák fel a továbbított adatokat különböző időszakokban.",
"endTime": "Befejezési Idő",
"inputPlaceholder": "Kérjük, írja be",
"multiplier": "Szorzó",
"nodePullInterval": "Csomópont lehívási intervallum",
"nodePullIntervalDescription": "A csomópont milyen gyakran kér le adatokat a panelről (másodpercben)",
"nodePushInterval": "Csomópont küldési intervallum",
"nodePushIntervalDescription": "A csomópont milyen gyakran küld adatokat a panelre",
"saveSuccess": "Sikeres mentés"
"reset": "Visszaállítás",
"save": "Mentés",
"saveSuccess": "Sikeres mentés",
"startTime": "Kezdési Idő",
"timeSlot": "Időpont"
},
"register": {
"emailSuffixWhitelist": "E-mail végződés fehérlista",
+2
View File
@@ -42,6 +42,8 @@
"50002": "このクーポンは既に使用されています。再利用できません。",
"60001": "サブスクリプションの有効期限が切れています。更新してからご利用ください。",
"60002": "このサブスクリプションは現在使用できません。しばらくしてから再試行してください。",
"60003": "既存のサブスクリプションが検出されました。続行する前にキャンセルしてください。",
"60004": "サブスクリプションにアクティブなユーザーがいるため、現在削除できません。",
"70001": "認証コードが間違っています。再入力してください。",
"80001": "タスクがキューに正常に追加されませんでした。しばらくしてから再試行してください。",
"90001": "DEBUGモードをオフにしてから再試行してください。",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "確認",
"edit": "編集",
"editSecurity": "セキュリティ設定を編集",
"enableRelay": "リレーを有効化",
"enableTLS": "TLSを有効化",
"encryptionMethod": "暗号化方式",
"flow": "フロー制御アルゴリズム",
@@ -65,7 +64,14 @@
"port": "サーバーポート",
"protocol": "プロトコル",
"relayHost": "リレーアドレス",
"relayMode": "リレーモード",
"relayModeOptions": {
"all": "すべて",
"none": "なし",
"random": "ランダム"
},
"relayPort": "リレーポート",
"relayPrefix": "リレープレフィックス",
"remarks": "備考",
"security": "セキュリティ",
"securityConfig": "セキュリティ設定",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "暗号化方式を選択",
"selectNodeGroup": "ノードグループを選択",
"selectProtocol": "プロトコルを選択",
"selectRelayMode": "リレーモードを選択",
"serverAddr": "サーバーアドレス",
"serverKey": "サーバーキー",
"serverName": "サービス名",
"speedLimit": "速度制限",
"speedLimitPlaceholder": "無制限",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "時",
"Minute": "分",
"Month": "月",
"NoLimit": "制限なし",
"Year": "年",
"annualReset": "毎年リセット",
"basic": "基本",
"cancel": "キャンセル",
"confirm": "確認",
"deductionRatio": "自動/手動控除設定",
"deductionRatioDescription": "控除に使用されます。デフォルトでは、システムは自動計算アルゴリズムを採用します。手動比率が提供されると、システムは時間とトラフィックの比率に基づいて割合を計算し、合計が100%になるようにします。",
"description": "説明",
"deviceLimit": "デバイス制限",
"discount": "割引",
@@ -31,14 +36,25 @@
"discount_price": "割引価格",
"duration": "期間(月)",
"inventory": "在庫",
"monthlyReset": "毎月リセット",
"name": "名称",
"noLimit": "無制限",
"noReset": "リセットなし",
"pricing": "価格設定",
"purchaseWithDiscount": "控除を許可",
"purchaseWithDiscountDescription": "控除機能を有効または無効にします。有効にすると、システムは設定されたルールと比率に基づいて控除を処理します。",
"quota": "購入制限数",
"renewalReset": "更新時リセット",
"renewalResetDescription": "更新時にリセットサイクル",
"replacement": "リセット価格(毎回)",
"resetCycle": "リセットサイクル",
"resetOn1st": "1日にリセット",
"selectResetCycle": "リセットサイクルを選択してください",
"selectSubscribeGroup": "サブスクリプショングループを選択してください",
"selectUnitTime": "単位時間を選択してください",
"server": "サーバー",
"serverGroup": "サーバーグループ",
"servers": "サーバー",
"speedLimit": "速度制限(Mbps",
"subscribeGroup": "サブスクリプショングループ",
"traffic": "トラフィック",
@@ -83,6 +99,6 @@
"subscribeGroup": "購読グループ"
},
"traffic": "トラフィック",
"unitPrice": "価格/月",
"unitPrice": "価",
"updateSuccess": "更新が成功しました"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "保存に成功しました"
},
"node": {
"addTimeSlot": "時間枠を追加",
"communicationKey": "通信キー",
"communicationKeyDescription": "ノード通信のためのキーで、データが他人に傍受されないようにします",
"delete": "削除",
"dynamicMultiplier": "動的乗数",
"dynamicMultiplierDescription": "動的乗数は、異なる時間帯に異なるノードに対して異なる乗数でプッシュされたデータを処理することを指します。",
"endTime": "終了時間",
"inputPlaceholder": "入力してください",
"multiplier": "乗数",
"nodePullInterval": "ノード取得間隔",
"nodePullIntervalDescription": "ノードがパネルからデータを取得する頻度(秒)",
"nodePushInterval": "ノード送信間隔",
"nodePushIntervalDescription": "ノードがデータをパネルに送信する頻度",
"saveSuccess": "保存成功"
"reset": "リセット",
"save": "保存",
"saveSuccess": "保存成功",
"startTime": "開始時間",
"timeSlot": "時間枠"
},
"register": {
"emailSuffixWhitelist": "メールサフィックスホワイトリスト",
+2
View File
@@ -42,6 +42,8 @@
"50002": "해당 쿠폰이 이미 사용되었습니다. 반복 사용할 수 없습니다.",
"60001": "구독이 만료되었습니다. 갱신 후 사용해 주세요.",
"60002": "현재 구독을 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.",
"60003": "기존 구독이 감지되었습니다. 계속하기 전에 취소해 주세요.",
"60004": "구독에 활성 사용자가 있어 현재 삭제할 수 없습니다.",
"70001": "인증 코드가 잘못되었습니다. 다시 입력해 주세요.",
"80001": "작업이 큐에 성공적으로 추가되지 않았습니다. 잠시 후 다시 시도해 주세요.",
"90001": "DEBUG 모드를 끈 후 다시 시도해 주세요.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "확인",
"edit": "편집",
"editSecurity": "보안 설정 편집",
"enableRelay": "중계 활성화",
"enableTLS": "TLS 활성화",
"encryptionMethod": "암호화 방법",
"flow": "흐름 제어 알고리즘",
@@ -65,7 +64,14 @@
"port": "서비스 포트",
"protocol": "프로토콜",
"relayHost": "중계 주소",
"relayMode": "릴레이 모드",
"relayModeOptions": {
"all": "모두",
"none": "없음",
"random": "무작위"
},
"relayPort": "중계 포트",
"relayPrefix": "릴레이 접두사",
"remarks": "비고",
"security": "보안",
"securityConfig": "보안 설정",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "암호화 방법 선택",
"selectNodeGroup": "노드 그룹 선택",
"selectProtocol": "프로토콜 선택",
"selectRelayMode": "릴레이 모드 선택",
"serverAddr": "서버 주소",
"serverKey": "서버 키",
"serverName": "서비스 이름",
"speedLimit": "속도 제한",
"speedLimitPlaceholder": "제한 없음",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "시",
"Minute": "분",
"Month": "월",
"NoLimit": "제한 없음",
"Year": "년",
"annualReset": "연간 초기화",
"basic": "기본",
"cancel": "취소",
"confirm": "확인",
"deductionRatio": "자동/수동 공제 설정",
"deductionRatioDescription": "공제에 사용됩니다. 기본적으로 시스템은 자동 계산 알고리즘을 채택합니다. 수동 비율이 제공되면 시스템은 시간 및 트래픽 비율에 따라 비율을 계산하여 총합이 100%가 되도록 합니다.",
"description": "설명",
"deviceLimit": "기기 제한",
"discount": "할인",
@@ -31,14 +36,25 @@
"discount_price": "할인가",
"duration": "기간 (개월)",
"inventory": "재고",
"monthlyReset": "월별 초기화",
"name": "이름",
"noLimit": "무제한",
"noReset": "초기화 없음",
"pricing": "가격",
"purchaseWithDiscount": "공제 허용",
"purchaseWithDiscountDescription": "공제 기능을 활성화하거나 비활성화합니다. 활성화되면 시스템은 구성된 규칙과 비율에 따라 공제를 처리합니다.",
"quota": "구매 한도",
"renewalReset": "갱신 초기화",
"renewalResetDescription": "갱신 시 초기화 주기",
"replacement": "재설정 가격 (매회)",
"resetCycle": "초기화 주기",
"resetOn1st": "매월 1일 초기화",
"selectResetCycle": "초기화 주기를 선택하세요",
"selectSubscribeGroup": "구독 그룹을 선택하세요",
"selectUnitTime": "단위 시간을 선택하세요",
"server": "서버",
"serverGroup": "서버 그룹",
"servers": "서버",
"speedLimit": "속도 제한 (Mbps)",
"subscribeGroup": "구독 그룹",
"traffic": "트래픽",
@@ -83,6 +99,6 @@
"subscribeGroup": "구독 그룹"
},
"traffic": "트래픽",
"unitPrice": "가격/월",
"unitPrice": "가",
"updateSuccess": "업데이트 성공"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "저장 성공"
},
"node": {
"addTimeSlot": "시간 슬롯 추가",
"communicationKey": "통신 키",
"communicationKeyDescription": "데이터가 다른 사람에게 가로채이지 않도록 보장하는 노드 통신 키",
"delete": "삭제",
"dynamicMultiplier": "동적 배수",
"dynamicMultiplierDescription": "동적 배수는 서로 다른 시간대에 서로 다른 노드에 대해 다른 배수를 사용하여 처리된 데이터를 의미합니다.",
"endTime": "종료 시간",
"inputPlaceholder": "입력하세요",
"multiplier": "배수",
"nodePullInterval": "노드 가져오기 간격",
"nodePullIntervalDescription": "노드가 패널에서 데이터를 가져오는 빈도(초)",
"nodePushInterval": "노드 푸시 간격",
"nodePushIntervalDescription": "노드가 데이터를 패널로 푸시하는 빈도",
"saveSuccess": "저장 성공"
"reset": "재설정",
"save": "저장",
"saveSuccess": "저장 성공",
"startTime": "시작 시간",
"timeSlot": "시간대"
},
"register": {
"emailSuffixWhitelist": "이메일 접미사 화이트리스트",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Kupongen er allerede brukt og kan ikke brukes igjen.",
"60001": "Abonnementet er utløpt, vennligst forny det før bruk.",
"60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.",
"60003": "Et eksisterende abonnement er oppdaget. Vennligst avbryt det før du fortsetter.",
"60004": "Kan ikke slettes for øyeblikket da abonnementet har aktive brukere.",
"70001": "Verifikasjonskoden er feil, vennligst skriv den inn på nytt.",
"80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.",
"90001": "Vennligst deaktiver DEBUG-modus og prøv igjen.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Bekreft",
"edit": "Rediger",
"editSecurity": "Rediger sikkerhetskonfigurasjon",
"enableRelay": "Aktiver relé",
"enableTLS": "Aktiver TLS",
"encryptionMethod": "Krypteringsmetode",
"flow": "Flytkontrollalgoritme",
@@ -65,7 +64,14 @@
"port": "Tjenesteport",
"protocol": "Protokoll",
"relayHost": "Reléadresse",
"relayMode": "Relémodus",
"relayModeOptions": {
"all": "Alle",
"none": "Ingen",
"random": "Tilfeldig"
},
"relayPort": "Reléport",
"relayPrefix": "Reléprefiks",
"remarks": "Merknader",
"security": "Sikkerhet",
"securityConfig": "Sikkerhetskonfigurasjon",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Velg krypteringsmetode",
"selectNodeGroup": "Velg nodegruppe",
"selectProtocol": "Velg protokoll",
"selectRelayMode": "Velg relémodus",
"serverAddr": "Serveradresse",
"serverKey": "Servernøkkel",
"serverName": "Tjenestenavn",
"speedLimit": "Hastighetsbegrensning",
"speedLimitPlaceholder": "Ingen begrensning",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Time",
"Minute": "Minutt",
"Month": "Måned",
"NoLimit": "Ingen grense",
"Year": "År",
"annualReset": "Årlig Tilbakestilling",
"basic": "Grunnleggende",
"cancel": "Avbryt",
"confirm": "Bekreft",
"deductionRatio": "Automatisk/Manuell Fradragskonfigurasjon",
"deductionRatioDescription": "Brukes for fradrag. Som standard benytter systemet en automatisk beregningsalgoritme. Når en manuell andel er oppgitt, beregner systemet proporsjoner basert på tids- og trafikkforhold, og sikrer at totalen utgjør 100%.",
"description": "Beskrivelse",
"deviceLimit": "Enhetsbegrensning",
"discount": "Rabatt",
@@ -31,14 +36,25 @@
"discount_price": "Rabattert pris",
"duration": "Varighet (måneder)",
"inventory": "Lager",
"monthlyReset": "Månedlig Tilbakestilling",
"name": "Navn",
"noLimit": "Ubegrenset",
"noReset": "Ingen Tilbakestilling",
"pricing": "Prissetting",
"purchaseWithDiscount": "Tillat Fradrag",
"purchaseWithDiscountDescription": "Aktiver eller deaktiver fradragsfunksjonen. Når den er aktivert, vil systemet behandle fradrag basert på de konfigurerte reglene og forholdene",
"quota": "Kjøpskvote",
"renewalReset": "Fornyelsestilbakestilling",
"renewalResetDescription": "Tilbakestill syklus ved fornyelse",
"replacement": "Erstatningspris (per gang)",
"resetCycle": "Tilbakestill Syklus",
"resetOn1st": "Tilbakestill den 1.",
"selectResetCycle": "Vennligst velg en tilbakestillingssyklus",
"selectSubscribeGroup": "Vennligst velg abonnementsgruppe",
"selectUnitTime": "Vennligst velg enhetstid",
"server": "Tjeneste",
"serverGroup": "Tjenestegruppe",
"servers": "Servere",
"speedLimit": "Hastighetsbegrensning (Mbps)",
"subscribeGroup": "Abonnementsgruppe",
"traffic": "Trafikk",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abonner gruppe"
},
"traffic": "trafikk",
"unitPrice": "Pris/måned",
"unitPrice": "Enhetspris",
"updateSuccess": "Oppdatering vellykket"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Lagret vellykket"
},
"node": {
"addTimeSlot": "Legg til tidsluke",
"communicationKey": "Kommunikasjonsnøkkel",
"communicationKeyDescription": "Nøkkelen for kommunikasjon mellom noder, for å sikre at data ikke blir avlyttet av andre",
"delete": "Slett",
"dynamicMultiplier": "Dynamisk Multiplikator",
"dynamicMultiplierDescription": "Dynamisk Multiplikator refererer til behandling av dyttet data med forskjellige multiplikatorer for forskjellige noder i ulike tidsperioder.",
"endTime": "Sluttid",
"inputPlaceholder": "Vennligst skriv inn",
"multiplier": "Multiplikator",
"nodePullInterval": "Node hentingsintervall",
"nodePullIntervalDescription": "Frekvensen (i sekunder) som noden henter data fra panelet",
"nodePushInterval": "Node push-intervall",
"nodePushIntervalDescription": "Frekvensen som noden sender data til panelet",
"saveSuccess": "Lagring vellykket"
"reset": "Tilbakestill",
"save": "Lagre",
"saveSuccess": "Lagring vellykket",
"startTime": "Starttid",
"timeSlot": "Tidsluke"
},
"register": {
"emailSuffixWhitelist": "E-post suffiks hviteliste",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Kupon został już użyty, nie można go użyć ponownie.",
"60001": "Subskrypcja wygasła, odnow ją i użyj ponownie.",
"60002": "Nie można tymczasowo użyć tej subskrypcji, spróbuj ponownie później.",
"60003": "Wykryto istniejącą subskrypcję. Proszę ją anulować przed kontynuacją.",
"60004": "Nie można usunąć w tej chwili, ponieważ subskrypcja ma aktywnych użytkowników.",
"70001": "Kod weryfikacyjny jest nieprawidłowy, wprowadź ponownie.",
"80001": "Zadanie nie zostało pomyślnie dodane do kolejki, spróbuj ponownie później.",
"90001": "Wyłącz tryb DEBUG i spróbuj ponownie.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Potwierdź",
"edit": "Edytuj",
"editSecurity": "Edytuj konfigurację bezpieczeństwa",
"enableRelay": "Włącz przekaźnik",
"enableTLS": "Włącz TLS",
"encryptionMethod": "Metoda szyfrowania",
"flow": "Algorytm kontroli przepływu",
@@ -65,7 +64,14 @@
"port": "Port serwera",
"protocol": "Protokół",
"relayHost": "Adres przekaźnika",
"relayMode": "Tryb przekaźnika",
"relayModeOptions": {
"all": "Wszystkie",
"none": "Brak",
"random": "Losowy"
},
"relayPort": "Port przekaźnika",
"relayPrefix": "Prefiks przekaźnika",
"remarks": "Uwagi",
"security": "Bezpieczeństwo",
"securityConfig": "Konfiguracja bezpieczeństwa",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Wybierz metodę szyfrowania",
"selectNodeGroup": "Wybierz grupę węzłów",
"selectProtocol": "Wybierz protokół",
"selectRelayMode": "Wybierz tryb przekaźnika",
"serverAddr": "Adres serwera",
"serverKey": "Klucz serwera",
"serverName": "Nazwa usługi",
"speedLimit": "Ograniczenie prędkości",
"speedLimitPlaceholder": "Bez ograniczeń",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Godzina",
"Minute": "Minuta",
"Month": "Miesiąc",
"NoLimit": "Bez ograniczeń",
"Year": "Rok",
"annualReset": "Roczny Reset",
"basic": "Podstawowy",
"cancel": "Anuluj",
"confirm": "Potwierdź",
"deductionRatio": "Automatyczna/Ręczna Konfiguracja Potrąceń",
"deductionRatioDescription": "Używane do potrąceń. Domyślnie system stosuje automatyczny algorytm obliczeniowy. Gdy podany jest ręczny współczynnik, system oblicza proporcje na podstawie czasu i ruchu, zapewniając, że suma wynosi 100%.",
"description": "Opis",
"deviceLimit": "Limit urządzeń",
"discount": "Zniżka",
@@ -31,14 +36,25 @@
"discount_price": "Cena po zniżce",
"duration": "Czas trwania (miesiące)",
"inventory": "Zapas",
"monthlyReset": "Miesięczny Reset",
"name": "Nazwa",
"noLimit": "Bez ograniczeń",
"noReset": "Brak Resetu",
"pricing": "Cennik",
"purchaseWithDiscount": "Zezwól na Potrącenie",
"purchaseWithDiscountDescription": "Włącz lub wyłącz funkcję potrąceń. Po włączeniu system przetworzy potrącenia na podstawie skonfigurowanych zasad i współczynników",
"quota": "Limit zakupu",
"renewalReset": "Reset przy Odnowieniu",
"renewalResetDescription": "Reset cyklu przy odnowieniu",
"replacement": "Cena wymiany (za każdym razem)",
"resetCycle": "Cykl Resetowania",
"resetOn1st": "Reset 1-go",
"selectResetCycle": "Proszę wybrać cykl resetowania",
"selectSubscribeGroup": "Wybierz grupę subskrypcji",
"selectUnitTime": "Proszę wybrać jednostkę czasu",
"server": "Serwer",
"serverGroup": "Grupa serwerów",
"servers": "Serwery",
"speedLimit": "Limit prędkości (Mbps)",
"subscribeGroup": "Grupa subskrypcji",
"traffic": "Ruch",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupa subskrypcji"
},
"traffic": "ruch",
"unitPrice": "Cena/miesiąc",
"unitPrice": "Cena jednostkowa",
"updateSuccess": "Aktualizacja zakończona pomyślnie"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Zapisano pomyślnie"
},
"node": {
"addTimeSlot": "Dodaj przedział czasowy",
"communicationKey": "Klucz komunikacyjny",
"communicationKeyDescription": "Klucz do komunikacji węzła, aby zapewnić, że dane nie zostaną przechwycone przez inne osoby",
"delete": "Usuń",
"dynamicMultiplier": "Mnożnik dynamiczny",
"dynamicMultiplierDescription": "Mnożnik dynamiczny odnosi się do przetwarzania przesyłanych danych z różnymi mnożnikami dla różnych węzłów w różnych okresach czasu.",
"endTime": "Czas zakończenia",
"inputPlaceholder": "Proszę wprowadzić",
"multiplier": "Mnożnik",
"nodePullInterval": "Interwał pobierania węzła",
"nodePullIntervalDescription": "Częstotliwość, z jaką węzeł pobiera dane z panelu (w sekundach)",
"nodePushInterval": "Interwał wysyłania węzła",
"nodePushIntervalDescription": "Częstotliwość, z jaką węzeł wysyła dane do panelu",
"saveSuccess": "Zapisano pomyślnie"
"reset": "Resetuj",
"save": "Zapisz",
"saveSuccess": "Zapisano pomyślnie",
"startTime": "Czas rozpoczęcia",
"timeSlot": "Przedział czasowy"
},
"register": {
"emailSuffixWhitelist": "Biała lista sufiksów e-mail",
+2
View File
@@ -42,6 +42,8 @@
"50002": "O cupom já foi usado, não pode ser reutilizado.",
"60001": "A assinatura expirou, por favor, renove para continuar usando.",
"60002": "Não é possível usar a assinatura no momento, por favor, tente novamente mais tarde.",
"60003": "Uma assinatura existente foi detectada. Cancele-a antes de prosseguir.",
"60004": "Não é possível excluir no momento, pois a assinatura possui usuários ativos.",
"70001": "Código de verificação incorreto, por favor, digite novamente.",
"80001": "A tarefa não foi adicionada à fila com sucesso, por favor, tente novamente mais tarde.",
"90001": "Por favor, desative o modo DEBUG e tente novamente.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar",
"edit": "Editar",
"editSecurity": "Editar Configuração de Segurança",
"enableRelay": "Habilitar Relay",
"enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de Criptografia",
"flow": "Algoritmo de Controle de Fluxo",
@@ -65,7 +64,14 @@
"port": "Porta do Servidor",
"protocol": "Protocolo",
"relayHost": "Endereço de Relay",
"relayMode": "Modo de Retransmissão",
"relayModeOptions": {
"all": "Todos",
"none": "Nenhum",
"random": "Aleatório"
},
"relayPort": "Porta de Relay",
"relayPrefix": "Prefixo de Retransmissão",
"remarks": "Observações",
"security": "Segurança",
"securityConfig": "Configuração de Segurança",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Selecione o Método de Criptografia",
"selectNodeGroup": "Selecione o Grupo de Nós",
"selectProtocol": "Selecione o Protocolo",
"selectRelayMode": "Selecionar Modo de Retransmissão",
"serverAddr": "Endereço do Servidor",
"serverKey": "Chave do Servidor",
"serverName": "Nome do Serviço",
"speedLimit": "Limite de Velocidade",
"speedLimitPlaceholder": "Sem Limite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mês",
"NoLimit": "Sem Limite",
"Year": "Ano",
"annualReset": "Reinicialização Anual",
"basic": "Básico",
"cancel": "Cancelar",
"confirm": "Confirmar",
"deductionRatio": "Configuração de Dedução Automática/Manual",
"deductionRatioDescription": "Usado para dedução. Por padrão, o sistema adota um algoritmo de cálculo automático. Quando uma proporção manual é fornecida, o sistema calcula proporções com base no tempo e na proporção de tráfego, garantindo que o total seja igual a 100%.",
"description": "Descrição",
"deviceLimit": "Limite de dispositivos",
"discount": "Desconto",
@@ -31,14 +36,25 @@
"discount_price": "Preço com desconto",
"duration": "Duração (meses)",
"inventory": "Estoque",
"monthlyReset": "Reinicialização Mensal",
"name": "Nome",
"noLimit": "Sem limite",
"noReset": "Sem Reinicialização",
"pricing": "Preços",
"purchaseWithDiscount": "Permitir Dedução",
"purchaseWithDiscountDescription": "Habilitar ou desabilitar a funcionalidade de dedução. Quando habilitada, o sistema processará deduções com base nas regras e proporções configuradas",
"quota": "Quantidade limitada",
"renewalReset": "Reinicialização na Renovação",
"renewalResetDescription": "Reiniciar ciclo ao renovar",
"replacement": "Preço de reposição (cada vez)",
"resetCycle": "Ciclo de Reinicialização",
"resetOn1st": "Reiniciar no dia 1",
"selectResetCycle": "Por favor, selecione um ciclo de reinicialização",
"selectSubscribeGroup": "Por favor, selecione o grupo de assinatura",
"selectUnitTime": "Por favor, selecione a unidade de tempo",
"server": "Servidor",
"serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Limite de velocidade (Mbps)",
"subscribeGroup": "Grupo de assinatura",
"traffic": "Tráfego",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de Inscrição"
},
"traffic": "tráfego",
"unitPrice": "Preço/mês",
"unitPrice": "Preço Unitário",
"updateSuccess": "Atualização bem-sucedida"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Salvo com sucesso"
},
"node": {
"addTimeSlot": "Adicionar Faixa de Horário",
"communicationKey": "Chave de Comunicação",
"communicationKeyDescription": "Chave para comunicação do nó, garantindo que os dados não sejam interceptados por terceiros",
"delete": "Excluir",
"dynamicMultiplier": "Multiplicador Dinâmico",
"dynamicMultiplierDescription": "Multiplicador Dinâmico refere-se ao processamento de dados enviados com diferentes multiplicadores para diferentes nós durante diferentes períodos de tempo.",
"endTime": "Hora de Término",
"inputPlaceholder": "Por favor, insira",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de Extração do Nó",
"nodePullIntervalDescription": "Frequência com que o nó obtém dados do painel (segundos)",
"nodePushInterval": "Intervalo de Envio do Nó",
"nodePushIntervalDescription": "Frequência com que o nó envia dados para o painel",
"saveSuccess": "Salvo com sucesso"
"reset": "Redefinir",
"save": "Salvar",
"saveSuccess": "Salvo com sucesso",
"startTime": "Hora de Início",
"timeSlot": "Horário"
},
"register": {
"emailSuffixWhitelist": "Lista branca de sufixos de e-mail",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Acest cupon a fost deja utilizat, nu poate fi folosit din nou.",
"60001": "Abonamentul a expirat, vă rugăm să reînnoiți pentru a continua utilizarea.",
"60002": "Nu se poate utiliza momentan acest abonament, vă rugăm să încercați din nou mai târziu.",
"60003": "A fost detectat un abonament existent. Vă rugăm să-l anulați înainte de a continua.",
"60004": "Nu se poate șterge în acest moment, deoarece abonamentul are utilizatori activi.",
"70001": "Codul de verificare este incorect, vă rugăm să îl introduceți din nou.",
"80001": "Sarcina nu a fost adăugată cu succes în coadă, vă rugăm să încercați din nou mai târziu.",
"90001": "Vă rugăm să dezactivați modul DEBUG și să încercați din nou.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmă",
"edit": "Editează",
"editSecurity": "Editează configurația de securitate",
"enableRelay": "Activează retransmisia",
"enableTLS": "Activează TLS",
"encryptionMethod": "Metodă de criptare",
"flow": "Algoritm de control al fluxului",
@@ -65,7 +64,14 @@
"port": "Port server",
"protocol": "Protocol",
"relayHost": "Adresă retransmisie",
"relayMode": "Modul de Releu",
"relayModeOptions": {
"all": "Toate",
"none": "Niciunul",
"random": "Aleatoriu"
},
"relayPort": "Port retransmisie",
"relayPrefix": "Prefix de Releu",
"remarks": "Observații",
"security": "Securitate",
"securityConfig": "Configurație de securitate",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Selectați metoda de criptare",
"selectNodeGroup": "Selectați grupul de noduri",
"selectProtocol": "Selectați protocolul",
"selectRelayMode": "Selectați Modul de Releu",
"serverAddr": "Adresă server",
"serverKey": "Cheie Server",
"serverName": "Nume serviciu",
"speedLimit": "Limită de viteză",
"speedLimitPlaceholder": "Nelimitat",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Oră",
"Minute": "Minut",
"Month": "Lună",
"NoLimit": "Fără limită",
"Year": "An",
"annualReset": "Resetare Anuală",
"basic": "De Bază",
"cancel": "Anulează",
"confirm": "Confirmă",
"deductionRatio": "Configurare Deducere Automată/Manuală",
"deductionRatioDescription": "Utilizat pentru deducere. În mod implicit, sistemul adoptă un algoritm de calcul automat. Când se furnizează un raport manual, sistemul calculează proporțiile pe baza timpului și a raportului de trafic, asigurându-se că totalul este egal cu 100%.",
"description": "Descriere",
"deviceLimit": "Limită dispozitive",
"discount": "Reducere",
@@ -31,14 +36,25 @@
"discount_price": "Preț redus",
"duration": "Durată (luni)",
"inventory": "Stoc",
"monthlyReset": "Resetare Lunară",
"name": "Nume",
"noLimit": "Fără limită",
"noReset": "Fără Resetare",
"pricing": "Prețuri",
"purchaseWithDiscount": "Permite Deducerea",
"purchaseWithDiscountDescription": "Activează sau dezactivează funcția de deducere. Când este activată, sistemul va procesa deducerile pe baza regulilor și rapoartelor configurate",
"quota": "Limită de achiziție",
"renewalReset": "Resetare la Reînnoire",
"renewalResetDescription": "Resetează ciclul la reînnoire",
"replacement": "Preț de înlocuire (per dată)",
"resetCycle": "Ciclu de Resetare",
"resetOn1st": "Resetare pe 1",
"selectResetCycle": "Vă rugăm să selectați un ciclu de resetare",
"selectSubscribeGroup": "Vă rugăm să selectați grupul de abonament",
"selectUnitTime": "Vă rugăm să selectați unitatea de timp",
"server": "Server",
"serverGroup": "Grup server",
"servers": "Servere",
"speedLimit": "Limită de viteză (Mbps)",
"subscribeGroup": "Grup de abonament",
"traffic": "Trafic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grup de abonare"
},
"traffic": "trafic",
"unitPrice": "Preț/lună",
"unitPrice": "Preț unitar",
"updateSuccess": "Actualizare reușită"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Salvare reușită"
},
"node": {
"addTimeSlot": "Adaugă Interval Orar",
"communicationKey": "Cheie de comunicare",
"communicationKeyDescription": "Cheia de comunicare a nodului, pentru a asigura că datele nu sunt interceptate de alții",
"delete": "Ștergere",
"dynamicMultiplier": "Multiplicator Dinamic",
"dynamicMultiplierDescription": "Multiplicatorul Dinamic se referă la procesarea datelor transmise cu multiplicatori diferiți pentru noduri diferite în perioade de timp diferite.",
"endTime": "Ora de Sfârșit",
"inputPlaceholder": "Vă rugăm să introduceți",
"multiplier": "Multiplicator",
"nodePullInterval": "Interval de extragere a nodului",
"nodePullIntervalDescription": "Frecvența cu care nodul obține date de la panou (secunde)",
"nodePushInterval": "Interval de împingere a nodului",
"nodePushIntervalDescription": "Frecvența cu care nodul trimite date către panou",
"saveSuccess": "Salvare reușită"
"reset": "Resetare",
"save": "Salvare",
"saveSuccess": "Salvare reușită",
"startTime": "Ora de Începere",
"timeSlot": "Interval de timp"
},
"register": {
"emailSuffixWhitelist": "Lista albă a sufixelor de e-mail",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Купон уже использован, повторное использование невозможно.",
"60001": "Подписка истекла, пожалуйста, продлите её и используйте снова.",
"60002": "Подписка временно недоступна, пожалуйста, попробуйте позже.",
"60003": "Обнаружена существующая подписка. Пожалуйста, отмените ее перед продолжением.",
"60004": "Невозможно удалить в данный момент, так как у подписки есть активные пользователи.",
"70001": "Код подтверждения неверен, пожалуйста, введите его снова.",
"80001": "Задача не была успешно добавлена в очередь, пожалуйста, попробуйте позже.",
"90001": "Пожалуйста, отключите режим DEBUG и попробуйте снова.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Подтвердить",
"edit": "Редактировать",
"editSecurity": "Редактировать настройки безопасности",
"enableRelay": "Включить реле",
"enableTLS": "Включить TLS",
"encryptionMethod": "Метод шифрования",
"flow": "Алгоритм управления потоком",
@@ -65,7 +64,14 @@
"port": "Порт сервера",
"protocol": "Протокол",
"relayHost": "Адрес реле",
"relayMode": "Режим ретрансляции",
"relayModeOptions": {
"all": "Все",
"none": "Нет",
"random": "Случайный"
},
"relayPort": "Порт реле",
"relayPrefix": "Префикс ретрансляции",
"remarks": "Примечания",
"security": "Безопасность",
"securityConfig": "Настройки безопасности",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Выберите метод шифрования",
"selectNodeGroup": "Выберите группу узлов",
"selectProtocol": "Выберите протокол",
"selectRelayMode": "Выберите режим ретрансляции",
"serverAddr": "Адрес сервера",
"serverKey": "Ключ сервера",
"serverName": "Имя сервера",
"speedLimit": "Ограничение скорости",
"speedLimitPlaceholder": "Без ограничений",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Час",
"Minute": "Минута",
"Month": "Месяц",
"NoLimit": "Без ограничений",
"Year": "Год",
"annualReset": "Ежегодный Сброс",
"basic": "Основной",
"cancel": "Отмена",
"confirm": "Подтвердить",
"deductionRatio": "Автоматическая/Ручная Конфигурация Вычетов",
"deductionRatioDescription": "Используется для вычетов. По умолчанию система использует алгоритм автоматического расчета. Когда предоставляется ручное соотношение, система рассчитывает пропорции на основе времени и трафика, обеспечивая, чтобы сумма составляла 100%.",
"description": "Описание",
"deviceLimit": "Ограничение устройств",
"discount": "Скидка",
@@ -31,14 +36,25 @@
"discount_price": "Цена со скидкой",
"duration": "Продолжительность (месяцы)",
"inventory": "Инвентарь",
"monthlyReset": "Ежемесячный Сброс",
"name": "Название",
"noLimit": "Без ограничений",
"noReset": "Без Сброса",
"pricing": "Цены",
"purchaseWithDiscount": "Разрешить Вычет",
"purchaseWithDiscountDescription": "Включить или отключить функцию вычета. При включении система будет обрабатывать вычеты на основе настроенных правил и соотношений",
"quota": "Лимит покупки",
"renewalReset": "Сброс при Обновлении",
"renewalResetDescription": "Сброс цикла при обновлении",
"replacement": "Цена замены (за раз)",
"resetCycle": "Цикл Сброса",
"resetOn1st": "Сброс 1-го числа",
"selectResetCycle": "Пожалуйста, выберите цикл сброса",
"selectSubscribeGroup": "Пожалуйста, выберите группу подписки",
"selectUnitTime": "Пожалуйста, выберите единицу времени",
"server": "Сервер",
"serverGroup": "Группа серверов",
"servers": "Серверы",
"speedLimit": "Ограничение скорости (Мбит/с)",
"subscribeGroup": "Группа подписки",
"traffic": "Трафик",
@@ -83,6 +99,6 @@
"subscribeGroup": "Группа подписок"
},
"traffic": "трафик",
"unitPrice": "Цена/месяц",
"unitPrice": "Цена за единицу",
"updateSuccess": "Обновление успешно"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Успешно сохранено"
},
"node": {
"addTimeSlot": "Добавить временной интервал",
"communicationKey": "Ключ связи",
"communicationKeyDescription": "Ключ для связи узла, чтобы гарантировать, что данные не будут перехвачены другими",
"delete": "Удалить",
"dynamicMultiplier": "Динамический множитель",
"dynamicMultiplierDescription": "Динамический множитель относится к обработке переданных данных с различными множителями для разных узлов в разные периоды времени.",
"endTime": "Время окончания",
"inputPlaceholder": "Пожалуйста, введите",
"multiplier": "Множитель",
"nodePullInterval": "Интервал извлечения узла",
"nodePullIntervalDescription": "Частота, с которой узел получает данные с панели (в секундах)",
"nodePushInterval": "Интервал отправки узла",
"nodePushIntervalDescription": "Частота, с которой узел отправляет данные на панель",
"saveSuccess": "Успешно сохранено"
"reset": "Сбросить",
"save": "Сохранить",
"saveSuccess": "Успешно сохранено",
"startTime": "Время начала",
"timeSlot": "Временной интервал"
},
"register": {
"emailSuffixWhitelist": "Белый список суффиксов электронной почты",
+2
View File
@@ -42,6 +42,8 @@
"50002": "คูปองนี้ถูกใช้ไปแล้ว ไม่สามารถใช้ซ้ำได้",
"60001": "การสมัครสมาชิกหมดอายุ กรุณาต่ออายุและใช้งานใหม่",
"60002": "ไม่สามารถใช้การสมัครสมาชิกนี้ได้ในขณะนี้ กรุณาลองใหม่อีกครั้งในภายหลัง",
"60003": "ตรวจพบการสมัครสมาชิกที่มีอยู่ กรุณายกเลิกก่อนดำเนินการต่อ",
"60004": "ไม่สามารถลบได้ในขณะนี้เนื่องจากการสมัครมีผู้ใช้ที่ใช้งานอยู่",
"70001": "รหัสยืนยันไม่ถูกต้อง กรุณาป้อนใหม่อีกครั้ง",
"80001": "งานไม่สำเร็จในการเข้าคิว กรุณาลองใหม่อีกครั้งในภายหลัง",
"90001": "กรุณาปิดโหมด DEBUG ก่อนลองใหม่อีกครั้ง",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "ยืนยัน",
"edit": "แก้ไข",
"editSecurity": "แก้ไขการตั้งค่าความปลอดภัย",
"enableRelay": "เปิดใช้งานรีเลย์",
"enableTLS": "เปิดใช้งานTLS",
"encryptionMethod": "วิธีการเข้ารหัส",
"flow": "อัลกอริทึมควบคุมการไหล",
@@ -65,7 +64,14 @@
"port": "พอร์ตบริการ",
"protocol": "โปรโตคอล",
"relayHost": "ที่อยู่รีเลย์",
"relayMode": "โหมดรีเลย์",
"relayModeOptions": {
"all": "ทั้งหมด",
"none": "ไม่มี",
"random": "สุ่ม"
},
"relayPort": "พอร์ตรรีเลย์",
"relayPrefix": "คำนำหน้ารีเลย์",
"remarks": "หมายเหตุ",
"security": "ความปลอดภัย",
"securityConfig": "การตั้งค่าความปลอดภัย",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "เลือกวิธีการเข้ารหัส",
"selectNodeGroup": "เลือกกลุ่มโหนด",
"selectProtocol": "เลือกโปรโตคอล",
"selectRelayMode": "เลือกโหมดรีเลย์",
"serverAddr": "ที่อยู่เซิร์ฟเวอร์",
"serverKey": "คีย์เซิร์ฟเวอร์",
"serverName": "ชื่อบริการ",
"speedLimit": "จำกัดความเร็ว",
"speedLimitPlaceholder": "ไม่จำกัด",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "ชั่วโมง",
"Minute": "นาที",
"Month": "เดือน",
"NoLimit": "ไม่จำกัด",
"Year": "ปี",
"annualReset": "รีเซ็ตทุกปี",
"basic": "พื้นฐาน",
"cancel": "ยกเลิก",
"confirm": "ยืนยัน",
"deductionRatio": "การตั้งค่าการหักอัตโนมัติ/ด้วยตนเอง",
"deductionRatioDescription": "ใช้สำหรับการหัก โดยค่าเริ่มต้น ระบบจะใช้วิธีการคำนวณอัตโนมัติ เมื่อมีการกำหนดอัตราส่วนด้วยตนเอง ระบบจะคำนวณสัดส่วนตามเวลาและอัตราการใช้งาน เพื่อให้มั่นใจว่ายอดรวมเท่ากับ 100%",
"description": "คำอธิบาย",
"deviceLimit": "จำกัดอุปกรณ์",
"discount": "ส่วนลด",
@@ -31,14 +36,25 @@
"discount_price": "ราคาหลังหักส่วนลด",
"duration": "ระยะเวลา (เดือน)",
"inventory": "สต็อก",
"monthlyReset": "รีเซ็ตทุกเดือน",
"name": "ชื่อ",
"noLimit": "ไม่จำกัด",
"noReset": "ไม่รีเซ็ต",
"pricing": "การตั้งราคา",
"purchaseWithDiscount": "อนุญาตให้หัก",
"purchaseWithDiscountDescription": "เปิดหรือปิดฟีเจอร์การหัก เมื่อเปิดใช้งาน ระบบจะดำเนินการหักตามกฎและอัตราส่วนที่กำหนดไว้",
"quota": "จำนวนจำกัดการซื้อ",
"renewalReset": "รีเซ็ตเมื่อมีการต่ออายุ",
"renewalResetDescription": "รีเซ็ตรอบเมื่อมีการต่ออายุ",
"replacement": "ราคารีเซ็ต (ต่อครั้ง)",
"resetCycle": "รอบการรีเซ็ต",
"resetOn1st": "รีเซ็ตในวันที่ 1",
"selectResetCycle": "กรุณาเลือกรอบการรีเซ็ต",
"selectSubscribeGroup": "กรุณาเลือกกลุ่มการสมัครสมาชิก",
"selectUnitTime": "กรุณาเลือกหน่วยเวลา",
"server": "เซิร์ฟเวอร์",
"serverGroup": "กลุ่มเซิร์ฟเวอร์",
"servers": "เซิร์ฟเวอร์",
"speedLimit": "จำกัดความเร็ว (Mbps)",
"subscribeGroup": "กลุ่มการสมัครสมาชิก",
"traffic": "ปริมาณข้อมูล",
@@ -83,6 +99,6 @@
"subscribeGroup": "กลุ่มสมัครสมาชิก"
},
"traffic": "การจราจร",
"unitPrice": "ราคา/เดือน",
"unitPrice": "ราคาต่อหน่วย",
"updateSuccess": "อัปเดตสำเร็จ"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "บันทึกสำเร็จ"
},
"node": {
"addTimeSlot": "เพิ่มช่วงเวลา",
"communicationKey": "คีย์การสื่อสาร",
"communicationKeyDescription": "คีย์สำหรับการสื่อสารของโหนด เพื่อให้มั่นใจว่าข้อมูลจะไม่ถูกดักจับโดยผู้อื่น",
"delete": "ลบ",
"dynamicMultiplier": "ตัวคูณแบบไดนามิก",
"dynamicMultiplierDescription": "ตัวคูณแบบไดนามิกหมายถึงการประมวลผลข้อมูลที่ถูกส่งด้วยตัวคูณที่แตกต่างกันสำหรับโหนดต่างๆ ในช่วงเวลาที่แตกต่างกัน",
"endTime": "เวลาสิ้นสุด",
"inputPlaceholder": "กรุณาใส่ข้อมูล",
"multiplier": "ตัวคูณ",
"nodePullInterval": "ช่วงเวลาการดึงข้อมูลของโหนด",
"nodePullIntervalDescription": "ความถี่ที่โหนดดึงข้อมูลจากแผงควบคุม (วินาที)",
"nodePushInterval": "ช่วงเวลาการส่งข้อมูลของโหนด",
"nodePushIntervalDescription": "ความถี่ที่โหนดส่งข้อมูลไปยังแผงควบคุม",
"saveSuccess": "บันทึกสำเร็จ"
"reset": "รีเซ็ต",
"save": "บันทึก",
"saveSuccess": "บันทึกสำเร็จ",
"startTime": "เวลาเริ่มต้น",
"timeSlot": "ช่วงเวลา"
},
"register": {
"emailSuffixWhitelist": "รายการอนุญาตโดเมนอีเมล",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Bu kupon zaten kullanıldı, tekrar kullanılamaz.",
"60001": "Abonelik süresi doldu, lütfen yenileyip tekrar kullanın.",
"60002": "Bu abonelik şu anda kullanılamıyor, lütfen daha sonra tekrar deneyin.",
"60003": "Mevcut bir abonelik tespit edildi. Lütfen devam etmeden önce iptal edin.",
"60004": "Aboneliğin aktif kullanıcıları olduğu için şu anda silinemiyor.",
"70001": "Doğrulama kodu hatalı, lütfen tekrar girin.",
"80001": "Görev kuyruğa başarıyla eklenemedi, lütfen daha sonra tekrar deneyin.",
"90001": "Lütfen DEBUG modunu kapatıp tekrar deneyin.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Onayla",
"edit": "Düzenle",
"editSecurity": "Güvenlik Ayarlarını Düzenle",
"enableRelay": "Röleyi Etkinleştir",
"enableTLS": "TLS'i Etkinleştir",
"encryptionMethod": "Şifreleme Yöntemi",
"flow": "Akış Kontrol Algoritması",
@@ -65,7 +64,14 @@
"port": "Sunucu Portu",
"protocol": "Protokol",
"relayHost": "Röle Adresi",
"relayMode": "Röle Modu",
"relayModeOptions": {
"all": "Tümü",
"none": "Hiçbiri",
"random": "Rastgele"
},
"relayPort": "Röle Portu",
"relayPrefix": "Röle Öneki",
"remarks": "Açıklamalar",
"security": "Güvenlik",
"securityConfig": "Güvenlik Ayarları",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Şifreleme Yöntemi Seç",
"selectNodeGroup": "Düğüm Grubu Seç",
"selectProtocol": "Protokol Seç",
"selectRelayMode": "Röle Modunu Seçin",
"serverAddr": "Sunucu Adresi",
"serverKey": "Sunucu Anahtarı",
"serverName": "Sunucu Adı",
"speedLimit": "Hız Sınırı",
"speedLimitPlaceholder": "Sınırsız",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Saat",
"Minute": "Dakika",
"Month": "Ay",
"NoLimit": "Sınırsız",
"Year": "Yıl",
"annualReset": "Yıllık Sıfırlama",
"basic": "Temel",
"cancel": "İptal",
"confirm": "Onayla",
"deductionRatio": "Otomatik/Manuel Kesinti Yapılandırması",
"deductionRatioDescription": "Kesinti için kullanılır. Varsayılan olarak, sistem otomatik hesaplama algoritmasını benimser. Manuel bir oran sağlandığında, sistem zaman ve trafik oranına göre hesaplamalar yapar ve toplamın %100 olmasını sağlar.",
"description": "Açıklama",
"deviceLimit": "Cihaz Sınırı",
"discount": "İndirim",
@@ -31,14 +36,25 @@
"discount_price": "İndirimli Fiyat",
"duration": "Süre (ay)",
"inventory": "Stok",
"monthlyReset": "Aylık Sıfırlama",
"name": "Ad",
"noLimit": "Sınırsız",
"noReset": "Sıfırlama Yok",
"pricing": "Fiyatlandırma",
"purchaseWithDiscount": "Kesintiye İzin Ver",
"purchaseWithDiscountDescription": "Kesinti özelliğini etkinleştir veya devre dışı bırak. Etkinleştirildiğinde, sistem yapılandırılmış kurallar ve oranlara göre kesintileri işler.",
"quota": "Satın Alma Limiti",
"renewalReset": "Yenileme Sıfırlaması",
"renewalResetDescription": "Yenileme üzerine sıfırlama döngüsü",
"replacement": "Yenileme Ücreti (her seferinde)",
"resetCycle": "Sıfırlama Döngüsü",
"resetOn1st": "1'inde Sıfırla",
"selectResetCycle": "Lütfen bir sıfırlama döngüsü seçin",
"selectSubscribeGroup": "Abonelik Grubunu Seçiniz",
"selectUnitTime": "Lütfen birim zamanı seçin",
"server": "Sunucu",
"serverGroup": "Sunucu Grubu",
"servers": "Sunucular",
"speedLimit": "Hız Sınırı (Mbps)",
"subscribeGroup": "Abonelik Grubu",
"traffic": "Trafik",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abone Grubu"
},
"traffic": "trafik",
"unitPrice": "Fiyat/ay",
"unitPrice": "Birim Fiyatı",
"updateSuccess": "Güncelleme başarılı"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Başarıyla kaydedildi"
},
"node": {
"addTimeSlot": "Zaman Dilimi Ekle",
"communicationKey": "İletişim Anahtarı",
"communicationKeyDescription": "Verilerin başkaları tarafından ele geçirilmemesini sağlamak için düğüm iletişim anahtarı",
"delete": "Sil",
"dynamicMultiplier": "Dinamik Çarpan",
"dynamicMultiplierDescription": "Dinamik Çarpan, farklı zaman dilimlerinde farklı düğümler için farklı çarpanlarla işlenen veriyi ifade eder.",
"endTime": "Bitiş Zamanı",
"inputPlaceholder": "Lütfen giriniz",
"multiplier": "Çarpan",
"nodePullInterval": "Düğüm Çekme Aralığı",
"nodePullIntervalDescription": "Düğümün panelden veri alma sıklığı (saniye)",
"nodePushInterval": "Düğüm Gönderme Aralığı",
"nodePushIntervalDescription": "Düğümün verileri panele gönderme sıklığı",
"saveSuccess": "Başarıyla kaydedildi"
"reset": "Sıfırla",
"save": "Kaydet",
"saveSuccess": "Başarıyla kaydedildi",
"startTime": "Başlangıç Zamanı",
"timeSlot": "Zaman Dilimi"
},
"register": {
"emailSuffixWhitelist": "E-posta Soneki Beyaz Listesi",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Цей купон вже використано, повторне використання неможливе.",
"60001": "Підписка закінчилася, поновіть її, щоб продовжити використання.",
"60002": "Тимчасово неможливо використовувати цю підписку, спробуйте пізніше.",
"60003": "Виявлено існуючу підписку. Будь ласка, скасуйте її перед продовженням.",
"60004": "Неможливо видалити, оскільки підписка має активних користувачів.",
"70001": "Код перевірки неправильний, введіть його знову.",
"80001": "Завдання не вдалося додати до черги, спробуйте пізніше.",
"90001": "Вимкніть режим DEBUG і спробуйте знову.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Підтвердити",
"edit": "Редагувати",
"editSecurity": "Редагувати налаштування безпеки",
"enableRelay": "Увімкнути реле",
"enableTLS": "Увімкнути TLS",
"encryptionMethod": "Метод шифрування",
"flow": "Алгоритм контролю потоку",
@@ -65,7 +64,14 @@
"port": "Порт сервера",
"protocol": "Протокол",
"relayHost": "Адреса реле",
"relayMode": "Режим ретрансляції",
"relayModeOptions": {
"all": "Всі",
"none": "Немає",
"random": "Випадковий"
},
"relayPort": "Порт реле",
"relayPrefix": "Префікс ретрансляції",
"remarks": "Примітки",
"security": "Безпека",
"securityConfig": "Налаштування безпеки",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Виберіть метод шифрування",
"selectNodeGroup": "Виберіть групу вузлів",
"selectProtocol": "Виберіть протокол",
"selectRelayMode": "Виберіть режим ретрансляції",
"serverAddr": "Адреса сервера",
"serverKey": "Ключ сервера",
"serverName": "Назва сервісу",
"speedLimit": "Обмеження швидкості",
"speedLimitPlaceholder": "Без обмежень",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Година",
"Minute": "Хвилина",
"Month": "Місяць",
"NoLimit": "Без обмежень",
"Year": "Рік",
"annualReset": "Щорічне Скидання",
"basic": "Основний",
"cancel": "Скасувати",
"confirm": "Підтвердити",
"deductionRatio": "Автоматична/Ручна Конфігурація Вирахувань",
"deductionRatioDescription": "Використовується для вирахувань. За замовчуванням система використовує автоматичний алгоритм розрахунку. Коли надається ручне співвідношення, система розраховує пропорції на основі часу та трафіку, забезпечуючи загальну суму в 100%.",
"description": "Опис",
"deviceLimit": "Обмеження пристроїв",
"discount": "Знижка",
@@ -31,14 +36,25 @@
"discount_price": "Ціна зі знижкою",
"duration": "Тривалість (місяці)",
"inventory": "Запаси",
"monthlyReset": "Щомісячне Скидання",
"name": "Назва",
"noLimit": "Без обмежень",
"noReset": "Без Скидання",
"pricing": "Ціноутворення",
"purchaseWithDiscount": "Дозволити Вирахування",
"purchaseWithDiscountDescription": "Увімкнути або вимкнути функцію вирахувань. Коли увімкнено, система обробляє вирахування на основі налаштованих правил і співвідношень",
"quota": "Ліміт покупки",
"renewalReset": "Скидання при Поновленні",
"renewalResetDescription": "Скидання циклу при поновленні",
"replacement": "Ціна заміни (за раз)",
"resetCycle": "Цикл Скидання",
"resetOn1st": "Скидання 1-го числа",
"selectResetCycle": "Будь ласка, виберіть цикл скидання",
"selectSubscribeGroup": "Будь ласка, виберіть групу підписки",
"selectUnitTime": "Будь ласка, виберіть одиницю часу",
"server": "Сервер",
"serverGroup": "Група серверів",
"servers": "Сервери",
"speedLimit": "Обмеження швидкості (Мбіт/с)",
"subscribeGroup": "Група підписки",
"traffic": "Трафік",
@@ -83,6 +99,6 @@
"subscribeGroup": "Група підписок"
},
"traffic": "Трафік",
"unitPrice": "Ціна/місяць",
"unitPrice": "Ціна за одиницю",
"updateSuccess": "Оновлення успішне"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Успішно збережено"
},
"node": {
"addTimeSlot": "Додати часовий проміжок",
"communicationKey": "Ключ зв'язку",
"communicationKeyDescription": "Ключ для зв'язку вузла, щоб забезпечити захист даних від перехоплення",
"delete": "Видалити",
"dynamicMultiplier": "Динамічний Множник",
"dynamicMultiplierDescription": "Динамічний множник відноситься до обробки переданих даних з різними множниками для різних вузлів протягом різних періодів часу.",
"endTime": "Час Закінчення",
"inputPlaceholder": "Будь ласка, введіть",
"multiplier": "Множник",
"nodePullInterval": "Інтервал отримання вузла",
"nodePullIntervalDescription": "Частота отримання даних вузлом з панелі (в секундах)",
"nodePushInterval": "Інтервал відправки вузла",
"nodePushIntervalDescription": "Частота відправки даних вузлом на панель",
"saveSuccess": "Збережено успішно"
"reset": "Скинути",
"save": "Зберегти",
"saveSuccess": "Збережено успішно",
"startTime": "Час Початку",
"timeSlot": "Часовий проміжок"
},
"register": {
"emailSuffixWhitelist": "Білий список суфіксів електронної пошти",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Phiếu giảm giá này đã được sử dụng, không thể sử dụng lại.",
"60001": "Đăng ký đã hết hạn, vui lòng gia hạn trước khi sử dụng.",
"60002": "Tạm thời không thể sử dụng đăng ký này, vui lòng thử lại sau.",
"60003": "Phát hiện đăng ký hiện có. Vui lòng hủy trước khi tiếp tục.",
"60004": "Không thể xóa vào lúc này vì đăng ký có người dùng đang hoạt động.",
"70001": "Mã xác nhận không chính xác, vui lòng nhập lại.",
"80001": "Nhiệm vụ không được thêm vào hàng đợi thành công, vui lòng thử lại sau.",
"90001": "Vui lòng tắt chế độ DEBUG trước khi thử lại.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Xác nhận",
"edit": "Chỉnh sửa",
"editSecurity": "Chỉnh sửa cấu hình bảo mật",
"enableRelay": "Kích hoạt chuyển tiếp",
"enableTLS": "Kích hoạt TLS",
"encryptionMethod": "Phương pháp mã hóa",
"flow": "Thuật toán điều khiển luồng",
@@ -65,7 +64,14 @@
"port": "Cổng dịch vụ",
"protocol": "Giao thức",
"relayHost": "Địa chỉ chuyển tiếp",
"relayMode": "Chế Độ Tiếp Sức",
"relayModeOptions": {
"all": "Tất Cả",
"none": "Không Có",
"random": "Ngẫu Nhiên"
},
"relayPort": "Cổng chuyển tiếp",
"relayPrefix": "Tiền Tố Tiếp Sức",
"remarks": "Ghi chú",
"security": "Bảo mật",
"securityConfig": "Cấu hình bảo mật",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Chọn phương pháp mã hóa",
"selectNodeGroup": "Chọn nhóm nút",
"selectProtocol": "Chọn giao thức",
"selectRelayMode": "Chọn Chế Độ Tiếp Sức",
"serverAddr": "Địa chỉ máy chủ",
"serverKey": "Khóa Máy Chủ",
"serverName": "Tên dịch vụ",
"speedLimit": "Giới hạn tốc độ",
"speedLimitPlaceholder": "Không giới hạn",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Giờ",
"Minute": "Phút",
"Month": "Tháng",
"NoLimit": "Không Giới Hạn",
"Year": "Năm",
"annualReset": "Đặt Lại Hàng Năm",
"basic": "Cơ Bản",
"cancel": "Hủy",
"confirm": "Xác nhận",
"deductionRatio": "Cấu Hình Khấu Trừ Tự Động/Thủ Công",
"deductionRatioDescription": "Được sử dụng cho khấu trừ. Mặc định, hệ thống áp dụng thuật toán tính toán tự động. Khi có tỷ lệ thủ công, hệ thống sẽ tính toán tỷ lệ dựa trên thời gian và lưu lượng, đảm bảo tổng bằng 100%.",
"description": "Mô tả",
"deviceLimit": "Giới hạn thiết bị",
"discount": "Giảm giá",
@@ -31,14 +36,25 @@
"discount_price": "Giá sau giảm",
"duration": "Thời gian (tháng)",
"inventory": "Tồn kho",
"monthlyReset": "Đặt Lại Hàng Tháng",
"name": "Tên",
"noLimit": "Không giới hạn",
"noReset": "Không Đặt Lại",
"pricing": "Giá Cả",
"purchaseWithDiscount": "Cho Phép Khấu Trừ",
"purchaseWithDiscountDescription": "Bật hoặc tắt tính năng khấu trừ. Khi được bật, hệ thống sẽ xử lý khấu trừ dựa trên các quy tắc và tỷ lệ đã cấu hình",
"quota": "Số lượng mua giới hạn",
"renewalReset": "Đặt Lại Khi Gia Hạn",
"renewalResetDescription": "Đặt lại chu kỳ khi gia hạn",
"replacement": "Giá thay thế (mỗi lần)",
"resetCycle": "Chu Kỳ Đặt Lại",
"resetOn1st": "Đặt Lại vào Ngày 1",
"selectResetCycle": "Vui lòng chọn một chu kỳ đặt lại",
"selectSubscribeGroup": "Vui lòng chọn nhóm đăng ký",
"selectUnitTime": "Vui lòng chọn đơn vị thời gian",
"server": "Dịch vụ",
"serverGroup": "Nhóm dịch vụ",
"servers": "Máy Chủ",
"speedLimit": "Giới hạn tốc độ (Mbps)",
"subscribeGroup": "Nhóm đăng ký",
"traffic": "Lưu lượng",
@@ -83,6 +99,6 @@
"subscribeGroup": "Nhóm đăng ký"
},
"traffic": "lưu lượng",
"unitPrice": "Giá/tháng",
"unitPrice": "Đơn giá",
"updateSuccess": "Cập nhật thành công"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Lưu thành công"
},
"node": {
"addTimeSlot": "Thêm Khung Giờ",
"communicationKey": "Khóa giao tiếp",
"communicationKeyDescription": "Khóa giao tiếp của nút để đảm bảo dữ liệu không bị chặn bởi người khác",
"delete": "Xóa",
"dynamicMultiplier": "Hệ số động",
"dynamicMultiplierDescription": "Hệ số động đề cập đến việc xử lý dữ liệu đẩy với các hệ số khác nhau cho các nút khác nhau trong các khoảng thời gian khác nhau.",
"endTime": "Thời gian kết thúc",
"inputPlaceholder": "Vui lòng nhập",
"multiplier": "Hệ số",
"nodePullInterval": "Khoảng thời gian kéo nút",
"nodePullIntervalDescription": "Tần suất nút lấy dữ liệu từ bảng điều khiển (giây)",
"nodePushInterval": "Khoảng thời gian đẩy nút",
"nodePushIntervalDescription": "Tần suất nút đẩy dữ liệu lên bảng điều khiển",
"saveSuccess": "Lưu thành công"
"reset": "Đặt lại",
"save": "Lưu",
"saveSuccess": "Lưu thành công",
"startTime": "Thời gian bắt đầu",
"timeSlot": "Khung giờ"
},
"register": {
"emailSuffixWhitelist": "Danh sách trắng hậu tố email",
+2
View File
@@ -42,6 +42,8 @@
"50002": "该优惠券已被使用,无法重复使用。",
"60001": "订阅已过期,请续订后再使用。",
"60002": "暂时无法使用该订阅,请稍后再试。",
"60003": "检测到已有订阅。请取消后再继续。",
"60004": "暂时无法删除,订阅存在正常激活的用户。",
"70001": "验证码有误,请重新输入。",
"80001": "任务未成功加入队列,请稍后重试。",
"90001": "请关闭 DEBUG 模式后再试。",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "确认",
"edit": "编辑",
"editSecurity": "编辑安全性配置",
"enableRelay": "启用中转",
"enableTLS": "启用TLS",
"encryptionMethod": "加密方法",
"flow": "流控算法",
@@ -65,7 +64,14 @@
"port": "服务端口",
"protocol": "协议",
"relayHost": "中转地址",
"relayMode": "中转模式",
"relayModeOptions": {
"all": "全部",
"none": "无",
"random": "随机"
},
"relayPort": "中转端口",
"relayPrefix": "中转前缀",
"remarks": "备注",
"security": "安全性",
"securityConfig": "安全性配置",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "选择加密方法",
"selectNodeGroup": "选择节点组",
"selectProtocol": "选择协议",
"selectRelayMode": "选择中继模式",
"serverAddr": "服务器地址",
"serverKey": "服务器密钥",
"serverName": "服务名称",
"speedLimit": "速度限制",
"speedLimitPlaceholder": "无限制",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "时",
"Minute": "分",
"Month": "月",
"NoLimit": "无限制",
"Year": "年",
"annualReset": "按年重置",
"basic": "基础",
"cancel": "取消",
"confirm": "确认",
"deductionRatio": "自动/手动抵扣配置",
"deductionRatioDescription": "用于抵扣,默认采用自动计算算法。当手动填写比例时,系统将根据时间和流量的占比,以总和为100%进行按比例分配。",
"description": "描述",
"deviceLimit": "设备限制",
"discount": "折扣",
@@ -31,14 +36,25 @@
"discount_price": "折扣价格",
"duration": "时长(月)",
"inventory": "库存",
"monthlyReset": "按月重置",
"name": "名称",
"noLimit": "无限制",
"noReset": "不重置",
"pricing": "定价",
"purchaseWithDiscount": "允许抵扣",
"purchaseWithDiscountDescription": "启用或禁用抵扣功能。启用后,系统将根据配置的规则和比例进行抵扣处理。",
"quota": "限购数量",
"renewalReset": "续费重置",
"renewalResetDescription": "续费时重置周期",
"replacement": "重置价格(每次)",
"resetCycle": "重置周期",
"resetOn1st": "1号重置",
"selectResetCycle": "请选择重置周期",
"selectSubscribeGroup": "请选择订阅组",
"selectUnitTime": "请选择单位时间",
"server": "服务",
"serverGroup": "服务组",
"servers": "服务",
"speedLimit": "速度限制(Mbps",
"subscribeGroup": "订阅组",
"traffic": "流量",
@@ -83,6 +99,6 @@
"subscribeGroup": "订阅组"
},
"traffic": "流量",
"unitPrice": "价格/月",
"unitPrice": "价",
"updateSuccess": "更新成功"
}
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "保存成功"
},
"node": {
"addTimeSlot": "添加时间段",
"communicationKey": "通信密钥",
"communicationKeyDescription": "节点通信的密钥,以确保数据不被他人拦截",
"delete": "删除",
"dynamicMultiplier": "动态倍率",
"dynamicMultiplierDescription": "动态倍率是指在不同时间段内,对不同的节点推送的数据进行不同的倍率处理",
"endTime": "结束时间",
"inputPlaceholder": "请输入",
"multiplier": "倍率",
"nodePullInterval": "节点拉取间隔",
"nodePullIntervalDescription": "节点从面板获取数据的频率(秒)",
"nodePushInterval": "节点推送间隔",
"nodePushIntervalDescription": "节点将数据推送到面板的频率",
"saveSuccess": "保存成功"
"reset": "重置",
"save": "保存",
"saveSuccess": "保存成功",
"startTime": "开始时间",
"timeSlot": "时间段"
},
"register": {
"emailSuffixWhitelist": "电子邮件后缀白名单",

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