Compare commits

...

31 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
semantic-release-bot 087c36ce48 🔖 chore(release): v1.0.0-beta.2 [skip ci]
# [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))
2024-12-26 12:35:29 +00:00
web@ppanel d95b425060 💚 build(config): Update pm2 config 2024-12-26 19:32:22 +07:00
web@ppanel 9eca6181ad 👷 ci(step): Update step name 2024-12-26 02:59:54 +07:00
300 changed files with 4198 additions and 2218 deletions
+1 -1
View File
@@ -66,7 +66,7 @@ jobs:
id: version id: version
run: echo "PPANEL_VERSION=$(jq -r '.version' package.json)" >> $GITHUB_ENV run: echo "PPANEL_VERSION=$(jq -r '.version' package.json)" >> $GITHUB_ENV
- name: Build and push Docker image for ppanel-user-web - name: Build and push Docker image for ppanel-admin-web
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
+167 -98
View File
@@ -1,128 +1,197 @@
<a name="readme-top"></a> <a name="readme-top"></a>
# Changelog # Changelog
# 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 ### ♻ Code Refactoring
* **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616)) * **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
* **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
* **config**: 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 ### ✨ Features
* **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd)) * **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
* **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17)) * **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
* **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430)) * **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
* **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7)) * **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
* **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a)) * **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
* **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d)) * **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
* **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09)) * **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
* **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4)) * **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
* **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6)) * **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
* **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4)) * **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
* **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc)) * **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
* **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27)) * **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
* **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88)) * **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
* **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9)) * **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
* **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37)) * **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
* **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 ### 🎫 Chores
* **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331)) * Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
* **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
### 🐛 Bug Fixes ### 🐛 Bug Fixes
* **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5)) * **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
* **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30)) * **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
* **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82)) * **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
* **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162)) * **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
* **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 ### 💄 Styles
* **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b)) * **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
* **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add)) * **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
* **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925)) * **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
* **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc)) * **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 ### 🔧 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({ const shadowsocksSchema = z.object({
method: z.string(), method: z.string(),
port: portSchema, port: portSchema,
server_key: nullableString,
}); });
const vmessSchema = baseProtocolSchema; const vmessSchema = baseProtocolSchema;
@@ -51,11 +52,13 @@ const hysteria2Schema = z.object({
hop_ports: nullableString, hop_ports: nullableString,
hop_interval: z.number().nullish(), hop_interval: z.number().nullish(),
obfs_password: nullableString, obfs_password: nullableString,
security: z.string(),
security_config: securityConfigSchema, security_config: securityConfigSchema,
}); });
const tuicSchema = z.object({ const tuicSchema = z.object({
port: portSchema, port: portSchema,
security: z.string(),
security_config: securityConfigSchema, security_config: securityConfigSchema,
}); });
@@ -92,9 +95,17 @@ const baseFormSchema = z.object({
speed_limit: z.number().nullish(), speed_limit: z.number().nullish(),
traffic_ratio: z.number().default(1), traffic_ratio: z.number().default(1),
group_id: z.number().nullish(), group_id: z.number().nullish(),
enable_relay: z.boolean().nullish().default(false), relay_mode: z.string().nullish().default('none'),
relay_host: nullableString, relay_node: z
relay_port: portSchema, .array(
z.object({
host: z.string(),
port: portSchema,
prefix: z.string().nullish(),
}),
)
.nullish()
.default([]),
}); });
export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema); export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema);
+118 -66
View File
@@ -33,14 +33,15 @@ import {
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { Combobox } from '@workspace/ui/custom-components/combobox'; 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 { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { cn } from '@workspace/ui/lib/utils'; import { cn } from '@workspace/ui/lib/utils';
import { unitConversion } from '@workspace/ui/utils'; import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
import { formSchema, protocols } from './form-schema'; import { formSchema, protocols } from './form-schema';
interface NodeFormProps<T> { interface NodeFormProps<T> {
onSubmit: (data: T) => Promise<boolean> | boolean; onSubmit: (data: T) => Promise<boolean> | boolean;
initialValues?: T; initialValues?: T;
@@ -55,7 +56,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
loading, loading,
trigger, trigger,
title, title,
}: NodeFormProps<T>) { }: Readonly<NodeFormProps<T>>) {
const t = useTranslations('server.node'); const t = useTranslations('server.node');
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@@ -75,6 +76,8 @@ export default function NodeForm<T extends { [x: string]: any }>({
const protocol = form.watch('protocol'); const protocol = form.watch('protocol');
const transport = form.watch('config.transport'); const transport = form.watch('config.transport');
const security = form.watch('config.security'); const security = form.watch('config.security');
const relayMode = form.watch('relay_mode');
const method = form.watch('config.method');
useEffect(() => { useEffect(() => {
form?.reset(initialValues); form?.reset(initialValues);
@@ -105,7 +108,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
{trigger} {trigger}
</Button> </Button>
</SheetTrigger> </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> <SheetHeader>
<SheetTitle>{title}</SheetTitle> <SheetTitle>{title}</SheetTitle>
</SheetHeader> </SheetHeader>
@@ -214,65 +217,6 @@ export default function NodeForm<T extends { [x: string]: any }>({
</FormItem> </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> </div>
<FormField <FormField
@@ -358,6 +302,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput <EnhancedInput
{...field} {...field}
type='number' type='number'
placeholder='1-65535'
min={1} min={1}
max={65535} max={65535}
onValueChange={(value) => { onValueChange={(value) => {
@@ -369,6 +314,30 @@ export default function NodeForm<T extends { [x: string]: any }>({
</FormItem> </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> </div>
)} )}
@@ -389,6 +358,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput <EnhancedInput
{...field} {...field}
type='number' type='number'
placeholder='1-65535'
onValueChange={(value) => { onValueChange={(value) => {
form.setValue(field.name, value); form.setValue(field.name, value);
}} }}
@@ -499,7 +469,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control} control={form.control}
name='config.transport' name='config.transport'
render={({ field }) => ( render={({ field }) => (
<FormItem className='min-w-32'> <FormItem className='!mt-0 min-w-32'>
<FormControl> <FormControl>
<Select <Select
value={field.value} value={field.value}
@@ -603,7 +573,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control} control={form.control}
name='config.security' name='config.security'
render={({ field }) => ( render={({ field }) => (
<FormItem className='min-w-32'> <FormItem className='!mt-0 min-w-32'>
<Select <Select
value={field.value} value={field.value}
onValueChange={(value) => { onValueChange={(value) => {
@@ -814,6 +784,84 @@ export default function NodeForm<T extends { [x: string]: any }>({
</Card> </Card>
</div> </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>
</Form> </Form>
</ScrollArea> </ScrollArea>
@@ -830,8 +878,12 @@ export default function NodeForm<T extends { [x: string]: any }>({
<Button <Button
disabled={loading} disabled={loading}
onClick={form.handleSubmit(handleSubmit, (errors) => { onClick={form.handleSubmit(handleSubmit, (errors) => {
console.log(errors); const keys = Object.keys(errors);
return 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' />}{' '} {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> <TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<div className='flex items-center space-x-2 rounded-md'> <div className='flex items-center gap-2 text-xs *:flex-1'>
<Badge variant={badgeVariant}>{badgeText}</Badge> <div className='flex items-center space-x-1'>
<span className='text-sm font-medium'> <Badge variant={badgeVariant}>{badgeText}</Badge>
{t('onlineCount')}: {onlineCount} <span className='font-medium'>
</span> {t('onlineCount')}: {onlineCount}
</div> </span>
</TooltipTrigger> </div>
<TooltipContent className='bg-muted text-foreground w-80'> <div className='flex flex-col space-y-1'>
<div className='space-y-4'> <div className='flex justify-between'>
<> <span>CPU</span>
<div className='space-y-2'> <span>{formatPercentage(serverStatus?.cpu ?? 0)}</span>
<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> </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)} {t('lastUpdated')}: {formatDate(serverStatus?.updated_at ?? 0)}
</div> </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> </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> </Tooltip>
</TooltipProvider> </TooltipProvider>
); );
@@ -145,10 +145,10 @@ export default function NodeTable() {
}, },
{ {
accessorKey: 'groupId', accessorKey: 'group_id',
header: t('nodeGroup'), header: t('nodeGroup'),
cell: ({ row }) => { 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> : '--'; 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', accessorKey: 'unit_price',
header: t('unitPrice'), 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', accessorKey: 'replacement',
+209 -58
View File
@@ -1,15 +1,33 @@
'use client'; 'use client';
import { getNodeConfig, updateNodeConfig } from '@/services/admin/system'; import {
import { Icon } from '@iconify/react'; getNodeConfig,
getNodeMultiplier,
setNodeMultiplier,
updateNodeConfig,
} from '@/services/admin/system';
import { useQuery } from '@tanstack/react-query'; 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 { Label } from '@workspace/ui/components/label';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table'; 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 { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { DicesIcon } from 'lucide-react';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useMemo, useState } from 'react';
import { Cell, Legend, Pie, PieChart } from 'recharts';
import { toast } from 'sonner'; 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() { export default function Node() {
const t = useTranslations('system.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 ( return (
<Table> <>
<TableBody> <Table>
<TableRow> <TableBody>
<TableCell> <TableRow>
<Label>{t('communicationKey')}</Label> <TableCell>
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p> <Label>{t('communicationKey')}</Label>
</TableCell> <p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
<TableCell className='text-right'> </TableCell>
<EnhancedInput <TableCell className='text-right'>
placeholder={t('inputPlaceholder')} <EnhancedInput
value={data?.node_secret} placeholder={t('inputPlaceholder')}
onValueBlur={(value) => updateConfig('node_secret', value)} value={data?.node_secret}
suffix={ onValueBlur={(value) => updateConfig('node_secret', value)}
<Icon suffix={
icon='uil:arrow-random' <DicesIcon
onClick={() => { onClick={() => {
updateConfig('node_secret', nanoid()); updateConfig('node_secret', nanoid());
}} }}
/> />
} }
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('nodePullInterval')}</Label> <Label>{t('nodePullInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p> <p className='text-muted-foreground text-xs'>{t('nodePullIntervalDescription')}</p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
type='number' type='number'
min={0} min={0}
onValueBlur={(value) => updateConfig('node_pull_interval', value)} onValueBlur={(value) => updateConfig('node_pull_interval', value)}
suffix='S' suffix='S'
value={data?.node_pull_interval} value={data?.node_pull_interval}
placeholder={t('inputPlaceholder')} placeholder={t('inputPlaceholder')}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('nodePushInterval')}</Label> <Label>{t('nodePushInterval')}</Label>
<p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p> <p className='text-muted-foreground text-xs'>{t('nodePushIntervalDescription')}</p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
type='number' type='number'
min={0} min={0}
value={data?.node_push_interval} value={data?.node_push_interval}
onValueBlur={(value) => updateConfig('node_push_interval', value)} onValueBlur={(value) => updateConfig('node_push_interval', value)}
placeholder={t('inputPlaceholder')} placeholder={t('inputPlaceholder')}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
</TableBody> <TableRow>
</Table> <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<{ }: Readonly<{
children: React.ReactNode; children: React.ReactNode;
}>) { }>) {
const Authorization = (await cookies()).get('Authorization')?.value;
const locale = await getLocale(); const locale = await getLocale();
const messages = await getMessages(); const messages = await getMessages();
@@ -86,13 +88,15 @@ export default async function RootLayout({
console.log('Error fetching global config:', error); console.log('Error fetching global config:', error);
} }
try { if (Authorization) {
user = await currentUser({ try {
skipErrorHandler: true, user = await currentUser({
Authorization: (await cookies()).get('Authorization')?.value, skipErrorHandler: true,
}).then((res) => res.data.data); Authorization,
} catch (error) { }).then((res) => res.data.data);
console.log('Error fetching current user:', error); } catch (error) {
console.log('Error fetching current user:', error);
}
} }
return ( return (
@@ -115,7 +115,10 @@ export function RevenueStatisticsCard() {
y={viewBox.cy} y={viewBox.cy}
className='fill-foreground text-2xl font-bold' className='fill-foreground text-2xl font-bold'
> >
{RevenueStatistics?.today.amount_total} {unitConversion(
'centsToDollars',
RevenueStatistics?.today.amount_total,
)}
</tspan> </tspan>
</text> </text>
); );
+1
View File
@@ -22,6 +22,7 @@ export default function Providers({
defaultOptions: { defaultOptions: {
queries: { queries: {
staleTime: 5 * 1000, 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 locales = packageJSON.i18n.outputLocales;
export const defaultLocale = packageJSON.i18n.entry; 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_SITE_URL = env('NEXT_PUBLIC_SITE_URL') ?? process.env.NEXT_PUBLIC_SITE_URL;
export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_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_EMAIL =
export const NEXT_PUBLIC_DEFAULT_USER_PASSWORD = env('NEXT_PUBLIC_DEFAULT_USER_PASSWORD'); 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.", "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.", "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.", "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.", "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.", "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.", "90001": "Vypněte prosím režim DEBUG a zkuste to znovu.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Potvrdit", "confirm": "Potvrdit",
"edit": "Upravit", "edit": "Upravit",
"editSecurity": "Upravit nastavení zabezpečení", "editSecurity": "Upravit nastavení zabezpečení",
"enableRelay": "Povolit přenos",
"enableTLS": "Povolit TLS", "enableTLS": "Povolit TLS",
"encryptionMethod": "Metoda šifrování", "encryptionMethod": "Metoda šifrování",
"flow": "Algoritmus řízení toku", "flow": "Algoritmus řízení toku",
@@ -65,7 +64,14 @@
"port": "Port služby", "port": "Port služby",
"protocol": "Protokol", "protocol": "Protokol",
"relayHost": "Adresa přenosu", "relayHost": "Adresa přenosu",
"relayMode": "Režim relé",
"relayModeOptions": {
"all": "Vše",
"none": "Žádný",
"random": "Náhodný"
},
"relayPort": "Port přenosu", "relayPort": "Port přenosu",
"relayPrefix": "Předpona relé",
"remarks": "Poznámky", "remarks": "Poznámky",
"security": "Zabezpečení", "security": "Zabezpečení",
"securityConfig": "Nastavení zabezpečení", "securityConfig": "Nastavení zabezpečení",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Vyberte metodu šifrování", "selectEncryptionMethod": "Vyberte metodu šifrování",
"selectNodeGroup": "Vyberte skupinu uzlů", "selectNodeGroup": "Vyberte skupinu uzlů",
"selectProtocol": "Vyberte protokol", "selectProtocol": "Vyberte protokol",
"selectRelayMode": "Vyberte režim relé",
"serverAddr": "Adresa serveru", "serverAddr": "Adresa serveru",
"serverKey": "Klíč serveru",
"serverName": "Název služby", "serverName": "Název služby",
"speedLimit": "Omezení rychlosti", "speedLimit": "Omezení rychlosti",
"speedLimitPlaceholder": "Bez omezení", "speedLimitPlaceholder": "Bez omezení",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hodina", "Hour": "Hodina",
"Minute": "Minuta", "Minute": "Minuta",
"Month": "Měsíc", "Month": "Měsíc",
"NoLimit": "Bez omezení",
"Year": "Rok", "Year": "Rok",
"annualReset": "Roční Reset",
"basic": "Základní",
"cancel": "Zrušit", "cancel": "Zrušit",
"confirm": "Potvrdit", "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", "description": "Popis",
"deviceLimit": "Omezení zařízení", "deviceLimit": "Omezení zařízení",
"discount": "Sleva", "discount": "Sleva",
@@ -31,14 +36,25 @@
"discount_price": "Cena po slevě", "discount_price": "Cena po slevě",
"duration": "Doba trvání (měsíce)", "duration": "Doba trvání (měsíce)",
"inventory": "Sklad", "inventory": "Sklad",
"monthlyReset": "Měsíční Reset",
"name": "Název", "name": "Název",
"noLimit": "Bez omezení", "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", "quota": "Limit nákupu",
"renewalReset": "Reset při Obnovení",
"renewalResetDescription": "Resetovací cyklus při obnovení",
"replacement": "Cena za reset (za každý)", "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", "selectSubscribeGroup": "Vyberte prosím skupinu předplatného",
"selectUnitTime": "Vyberte jednotku času", "selectUnitTime": "Vyberte jednotku času",
"server": "Server", "server": "Server",
"serverGroup": "Skupina serverů", "serverGroup": "Skupina serverů",
"servers": "Servery",
"speedLimit": "Omezení rychlosti (Mbps)", "speedLimit": "Omezení rychlosti (Mbps)",
"subscribeGroup": "Skupina předplatného", "subscribeGroup": "Skupina předplatného",
"traffic": "Přenos dat", "traffic": "Přenos dat",
@@ -83,6 +99,6 @@
"subscribeGroup": "Skupina předplatných" "subscribeGroup": "Skupina předplatných"
}, },
"traffic": "provoz", "traffic": "provoz",
"unitPrice": "Cena/měsíc", "unitPrice": "Jednotková cena",
"updateSuccess": "Aktualizace byla úspěšná" "updateSuccess": "Aktualizace byla úspěšná"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Úspěšně uloženo" "saveSuccess": "Úspěšně uloženo"
}, },
"node": { "node": {
"addTimeSlot": "Přidat časový úsek",
"communicationKey": "Komunikační klíč", "communicationKey": "Komunikační klíč",
"communicationKeyDescription": "Klíč pro komunikaci uzlu, aby se zajistilo, že data nebudou zachycena jinými osobami", "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", "inputPlaceholder": "Prosím zadejte",
"multiplier": "Násobitel",
"nodePullInterval": "Interval stahování uzlu", "nodePullInterval": "Interval stahování uzlu",
"nodePullIntervalDescription": "Frekvence, s jakou uzel získává data z panelu (v sekundách)", "nodePullIntervalDescription": "Frekvence, s jakou uzel získává data z panelu (v sekundách)",
"nodePushInterval": "Interval odesílání uzlu", "nodePushInterval": "Interval odesílání uzlu",
"nodePushIntervalDescription": "Frekvence, s jakou uzel odesílá data do panelu", "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": { "register": {
"emailSuffixWhitelist": "Seznam povolených přípon e-mailů", "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.", "50002": "Dieser Gutschein wurde bereits verwendet und kann nicht erneut verwendet werden.",
"60001": "Das Abonnement ist abgelaufen, bitte erneuern und dann verwenden.", "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.", "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.", "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.", "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.", "90001": "Bitte deaktivieren Sie den DEBUG-Modus und versuchen Sie es erneut.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Bestätigen", "confirm": "Bestätigen",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"editSecurity": "Sicherheitskonfiguration bearbeiten", "editSecurity": "Sicherheitskonfiguration bearbeiten",
"enableRelay": "Relay aktivieren",
"enableTLS": "TLS aktivieren", "enableTLS": "TLS aktivieren",
"encryptionMethod": "Verschlüsselungsmethode", "encryptionMethod": "Verschlüsselungsmethode",
"flow": "Flusskontrollalgorithmus", "flow": "Flusskontrollalgorithmus",
@@ -65,7 +64,14 @@
"port": "Serverport", "port": "Serverport",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Relay-Adresse", "relayHost": "Relay-Adresse",
"relayMode": "Relaismodus",
"relayModeOptions": {
"all": "Alle",
"none": "Keine",
"random": "Zufällig"
},
"relayPort": "Relay-Port", "relayPort": "Relay-Port",
"relayPrefix": "Relaispräfix",
"remarks": "Bemerkungen", "remarks": "Bemerkungen",
"security": "Sicherheit", "security": "Sicherheit",
"securityConfig": "Sicherheitskonfiguration", "securityConfig": "Sicherheitskonfiguration",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Verschlüsselungsmethode auswählen", "selectEncryptionMethod": "Verschlüsselungsmethode auswählen",
"selectNodeGroup": "Knotengruppe auswählen", "selectNodeGroup": "Knotengruppe auswählen",
"selectProtocol": "Protokoll auswählen", "selectProtocol": "Protokoll auswählen",
"selectRelayMode": "Relaismodus auswählen",
"serverAddr": "Serveradresse", "serverAddr": "Serveradresse",
"serverKey": "Server-Schlüssel",
"serverName": "Dienstname", "serverName": "Dienstname",
"speedLimit": "Geschwindigkeitsbegrenzung", "speedLimit": "Geschwindigkeitsbegrenzung",
"speedLimitPlaceholder": "Keine Begrenzung", "speedLimitPlaceholder": "Keine Begrenzung",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Stunde", "Hour": "Stunde",
"Minute": "Minute", "Minute": "Minute",
"Month": "Monat", "Month": "Monat",
"NoLimit": "Kein Limit",
"Year": "Jahr", "Year": "Jahr",
"annualReset": "Jährliches Zurücksetzen",
"basic": "Grundlegend",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Bestätigen", "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", "description": "Beschreibung",
"deviceLimit": "Gerätebeschränkung", "deviceLimit": "Gerätebeschränkung",
"discount": "Rabatt", "discount": "Rabatt",
@@ -31,14 +36,25 @@
"discount_price": "Rabattpreis", "discount_price": "Rabattpreis",
"duration": "Dauer (Monate)", "duration": "Dauer (Monate)",
"inventory": "Bestand", "inventory": "Bestand",
"monthlyReset": "Monatliches Zurücksetzen",
"name": "Name", "name": "Name",
"noLimit": "Keine Begrenzung", "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", "quota": "Kaufbeschränkung",
"renewalReset": "Zurücksetzen bei Erneuerung",
"renewalResetDescription": "Zurücksetzungszyklus bei Erneuerung",
"replacement": "Ersatzpreis (pro Mal)", "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", "selectSubscribeGroup": "Bitte Abonnementgruppe auswählen",
"selectUnitTime": "Bitte wählen Sie eine Zeiteinheit", "selectUnitTime": "Bitte wählen Sie eine Zeiteinheit",
"server": "Dienst", "server": "Dienst",
"serverGroup": "Dienstgruppe", "serverGroup": "Dienstgruppe",
"servers": "Server",
"speedLimit": "Geschwindigkeitsbegrenzung (Mbps)", "speedLimit": "Geschwindigkeitsbegrenzung (Mbps)",
"subscribeGroup": "Abonnementgruppe", "subscribeGroup": "Abonnementgruppe",
"traffic": "Datenvolumen", "traffic": "Datenvolumen",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abonnieren Gruppe" "subscribeGroup": "Abonnieren Gruppe"
}, },
"traffic": "Verkehr", "traffic": "Verkehr",
"unitPrice": "Preis/Monat", "unitPrice": "Stückpreis",
"updateSuccess": "Aktualisierung erfolgreich" "updateSuccess": "Aktualisierung erfolgreich"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Erfolgreich gespeichert" "saveSuccess": "Erfolgreich gespeichert"
}, },
"node": { "node": {
"addTimeSlot": "Zeitfenster hinzufügen",
"communicationKey": "Kommunikationsschlüssel", "communicationKey": "Kommunikationsschlüssel",
"communicationKeyDescription": "Schlüssel für die Kommunikation des Knotens, um sicherzustellen, dass Daten nicht von anderen abgefangen werden", "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", "inputPlaceholder": "Bitte eingeben",
"multiplier": "Multiplikator",
"nodePullInterval": "Knotenabfrageintervall", "nodePullInterval": "Knotenabfrageintervall",
"nodePullIntervalDescription": "Häufigkeit, mit der der Knoten Daten vom Panel abruft (Sekunden)", "nodePullIntervalDescription": "Häufigkeit, mit der der Knoten Daten vom Panel abruft (Sekunden)",
"nodePushInterval": "Knotenübertragungsintervall", "nodePushInterval": "Knotenübertragungsintervall",
"nodePushIntervalDescription": "Häufigkeit, mit der der Knoten Daten an das Panel überträgt", "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": { "register": {
"emailSuffixWhitelist": "E-Mail-Suffix-Whitelist", "emailSuffixWhitelist": "E-Mail-Suffix-Whitelist",
+2
View File
@@ -42,6 +42,8 @@
"50002": "The coupon has been used, cannot be used again.", "50002": "The coupon has been used, cannot be used again.",
"60001": "Subscription has expired, please renew before using.", "60001": "Subscription has expired, please renew before using.",
"60002": "Unable to use the subscription at the moment, please try again later.", "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.", "70001": "Incorrect verification code, please re-enter.",
"80001": "Task was not successfully queued, please try again later.", "80001": "Task was not successfully queued, please try again later.",
"90001": "Please disable DEBUG mode and try again.", "90001": "Please disable DEBUG mode and try again.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirm", "confirm": "Confirm",
"edit": "Edit", "edit": "Edit",
"editSecurity": "Edit Security Configuration", "editSecurity": "Edit Security Configuration",
"enableRelay": "Enable Relay",
"enableTLS": "Enable TLS", "enableTLS": "Enable TLS",
"encryptionMethod": "Encryption Method", "encryptionMethod": "Encryption Method",
"flow": "Flow Control Algorithm", "flow": "Flow Control Algorithm",
@@ -65,7 +64,14 @@
"port": "Server Port", "port": "Server Port",
"protocol": "Protocol", "protocol": "Protocol",
"relayHost": "Relay Host", "relayHost": "Relay Host",
"relayMode": "Relay Mode",
"relayModeOptions": {
"all": "All",
"none": "None",
"random": "Random"
},
"relayPort": "Relay Port", "relayPort": "Relay Port",
"relayPrefix": "Relay Prefix",
"remarks": "Remarks", "remarks": "Remarks",
"security": "Security", "security": "Security",
"securityConfig": "Security Configuration", "securityConfig": "Security Configuration",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Select Encryption Method", "selectEncryptionMethod": "Select Encryption Method",
"selectNodeGroup": "Select Node Group", "selectNodeGroup": "Select Node Group",
"selectProtocol": "Select Protocol", "selectProtocol": "Select Protocol",
"selectRelayMode": "Select Relay Mode",
"serverAddr": "Server Address", "serverAddr": "Server Address",
"serverKey": "Server Key",
"serverName": "Service Name", "serverName": "Service Name",
"speedLimit": "Speed Limit", "speedLimit": "Speed Limit",
"speedLimitPlaceholder": "Unlimited", "speedLimitPlaceholder": "Unlimited",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hour", "Hour": "Hour",
"Minute": "Minute", "Minute": "Minute",
"Month": "Month", "Month": "Month",
"NoLimit": "No Limit",
"Year": "Year", "Year": "Year",
"annualReset": "Annual Reset",
"basic": "Basic",
"cancel": "Cancel", "cancel": "Cancel",
"confirm": "Confirm", "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", "description": "Description",
"deviceLimit": "Device Limit", "deviceLimit": "Device Limit",
"discount": "Discount", "discount": "Discount",
@@ -31,14 +36,25 @@
"discount_price": "Discount Price", "discount_price": "Discount Price",
"duration": "Duration (months)", "duration": "Duration (months)",
"inventory": "Inventory", "inventory": "Inventory",
"monthlyReset": "Monthly Reset",
"name": "Name", "name": "Name",
"noLimit": "No Limit", "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", "quota": "Purchase Limit",
"renewalReset": "Renewal Reset",
"renewalResetDescription": "Reset cycle upon renewal",
"replacement": "Reset Price (per time)", "replacement": "Reset Price (per time)",
"resetCycle": "Reset Cycle",
"resetOn1st": "Reset on the 1st",
"selectResetCycle": "Please select a reset cycle",
"selectSubscribeGroup": "Select Subscription Group", "selectSubscribeGroup": "Select Subscription Group",
"selectUnitTime": "Please select a unit of time", "selectUnitTime": "Please select a unit of time",
"server": "Server", "server": "Server",
"serverGroup": "Server Group", "serverGroup": "Server Group",
"servers": "Servers",
"speedLimit": "Speed Limit (Mbps)", "speedLimit": "Speed Limit (Mbps)",
"subscribeGroup": "Subscription Group", "subscribeGroup": "Subscription Group",
"traffic": "Traffic", "traffic": "Traffic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Subscription Group" "subscribeGroup": "Subscription Group"
}, },
"traffic": "Traffic", "traffic": "Traffic",
"unitPrice": "Price/Month", "unitPrice": "Unit Price",
"updateSuccess": "Update Successful" "updateSuccess": "Update Successful"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Save Successful" "saveSuccess": "Save Successful"
}, },
"node": { "node": {
"addTimeSlot": "Add Time Slot",
"communicationKey": "Communication Key", "communicationKey": "Communication Key",
"communicationKeyDescription": "Key for node communication to ensure data security", "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", "inputPlaceholder": "Enter",
"multiplier": "Multiplier",
"nodePullInterval": "Node Pull Interval", "nodePullInterval": "Node Pull Interval",
"nodePullIntervalDescription": "Frequency (in seconds) for nodes to fetch data from the panel", "nodePullIntervalDescription": "Frequency (in seconds) for nodes to fetch data from the panel",
"nodePushInterval": "Node Push Interval", "nodePushInterval": "Node Push Interval",
"nodePushIntervalDescription": "Frequency for nodes to push data to the panel", "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": { "register": {
"emailSuffixWhitelist": "Email Suffix Whitelist", "emailSuffixWhitelist": "Email Suffix Whitelist",
+2
View File
@@ -42,6 +42,8 @@
"50002": "El cupón ya ha sido utilizado, no se puede usar nuevamente.", "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.", "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.", "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.", "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.", "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.", "90001": "Por favor desactive el modo DEBUG e intente nuevamente.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar configuración de seguridad", "editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación", "encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo", "flow": "Algoritmo de control de flujo",
@@ -65,7 +64,14 @@
"port": "Puerto del servidor", "port": "Puerto del servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Dirección de retransmisión", "relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión", "relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Observaciones", "remarks": "Observaciones",
"security": "Seguridad", "security": "Seguridad",
"securityConfig": "Configuración de seguridad", "securityConfig": "Configuración de seguridad",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Seleccionar método de encriptación", "selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos", "selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo", "selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor", "serverAddr": "Dirección del servidor",
"serverKey": "Clave del Servidor",
"serverName": "Nombre del servicio", "serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad", "speedLimit": "Límite de velocidad",
"speedLimitPlaceholder": "Sin límite", "speedLimitPlaceholder": "Sin límite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora", "Hour": "Hora",
"Minute": "Minuto", "Minute": "Minuto",
"Month": "Mes", "Month": "Mes",
"NoLimit": "Sin Límite",
"Year": "Año", "Year": "Año",
"annualReset": "Reinicio Anual",
"basic": "Básico",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "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", "description": "Descripción",
"deviceLimit": "Límite de dispositivos", "deviceLimit": "Límite de dispositivos",
"discount": "Descuento", "discount": "Descuento",
@@ -31,14 +36,25 @@
"discount_price": "Precio con descuento", "discount_price": "Precio con descuento",
"duration": "Duración (meses)", "duration": "Duración (meses)",
"inventory": "Inventario", "inventory": "Inventario",
"monthlyReset": "Reinicio Mensual",
"name": "Nombre", "name": "Nombre",
"noLimit": "Sin límite", "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", "quota": "Cantidad de compra limitada",
"renewalReset": "Reinicio por Renovación",
"renewalResetDescription": "Reiniciar ciclo al renovar",
"replacement": "Precio de reposición (cada vez)", "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", "selectSubscribeGroup": "Por favor, seleccione un grupo de suscripción",
"selectUnitTime": "Por favor, seleccione la unidad de tiempo", "selectUnitTime": "Por favor, seleccione la unidad de tiempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Límite de velocidad (Mbps)", "speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción", "subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico", "traffic": "Tráfico",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de suscripción" "subscribeGroup": "Grupo de suscripción"
}, },
"traffic": "tráfico", "traffic": "tráfico",
"unitPrice": "Precio/mes", "unitPrice": "Precio Unitario",
"updateSuccess": "Actualización exitosa" "updateSuccess": "Actualización exitosa"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Guardado exitosamente" "saveSuccess": "Guardado exitosamente"
}, },
"node": { "node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación", "communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros", "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", "inputPlaceholder": "Por favor, ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo", "nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)", "nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo", "nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel", "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": { "register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico", "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.", "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.", "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.", "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.", "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.", "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.", "90001": "Por favor desactiva el modo DEBUG e intenta de nuevo.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar configuración de seguridad", "editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación", "encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo", "flow": "Algoritmo de control de flujo",
@@ -65,7 +64,14 @@
"port": "Puerto del servidor", "port": "Puerto del servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Dirección de retransmisión", "relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión", "relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Comentarios", "remarks": "Comentarios",
"security": "Seguridad", "security": "Seguridad",
"securityConfig": "Configuración de seguridad", "securityConfig": "Configuración de seguridad",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Seleccionar método de encriptación", "selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos", "selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo", "selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor", "serverAddr": "Dirección del servidor",
"serverKey": "Clave del Servidor",
"serverName": "Nombre del servicio", "serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad", "speedLimit": "Límite de velocidad",
"speedLimitPlaceholder": "Sin límite", "speedLimitPlaceholder": "Sin límite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora", "Hour": "Hora",
"Minute": "Minuto", "Minute": "Minuto",
"Month": "Mes", "Month": "Mes",
"NoLimit": "Sin Límite",
"Year": "Año", "Year": "Año",
"annualReset": "Reinicio Anual",
"basic": "Básico",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "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", "description": "Descripción",
"deviceLimit": "Límite de dispositivos", "deviceLimit": "Límite de dispositivos",
"discount": "Descuento", "discount": "Descuento",
@@ -31,14 +36,25 @@
"discount_price": "Precio con descuento", "discount_price": "Precio con descuento",
"duration": "Duración (meses)", "duration": "Duración (meses)",
"inventory": "Inventario", "inventory": "Inventario",
"monthlyReset": "Reinicio Mensual",
"name": "Nombre", "name": "Nombre",
"noLimit": "Sin límite", "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", "quota": "Cantidad máxima de compra",
"renewalReset": "Reinicio por Renovación",
"renewalResetDescription": "Reiniciar ciclo al renovar",
"replacement": "Precio de reposición (cada vez)", "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", "selectSubscribeGroup": "Por favor seleccione un grupo de suscripción",
"selectUnitTime": "Por favor seleccione la unidad de tiempo", "selectUnitTime": "Por favor seleccione la unidad de tiempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Límite de velocidad (Mbps)", "speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción", "subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico", "traffic": "Tráfico",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de suscripción" "subscribeGroup": "Grupo de suscripción"
}, },
"traffic": "tráfico", "traffic": "tráfico",
"unitPrice": "Precio/mes", "unitPrice": "Precio Unitario",
"updateSuccess": "Actualización exitosa" "updateSuccess": "Actualización exitosa"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Guardado exitosamente" "saveSuccess": "Guardado exitosamente"
}, },
"node": { "node": {
"addTimeSlot": "Agregar Franja Horaria",
"communicationKey": "Clave de comunicación", "communicationKey": "Clave de comunicación",
"communicationKeyDescription": "Clave para la comunicación del nodo, para asegurar que los datos no sean interceptados por otros", "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", "inputPlaceholder": "Por favor ingrese",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de extracción del nodo", "nodePullInterval": "Intervalo de extracción del nodo",
"nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)", "nodePullIntervalDescription": "Frecuencia con la que el nodo obtiene datos del panel (segundos)",
"nodePushInterval": "Intervalo de envío del nodo", "nodePushInterval": "Intervalo de envío del nodo",
"nodePushIntervalDescription": "Frecuencia con la que el nodo envía datos al panel", "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": { "register": {
"emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico", "emailSuffixWhitelist": "Lista blanca de sufijos de correo electrónico",
+2
View File
@@ -42,6 +42,8 @@
"50002": "کوپن استفاده شده است، نمی‌توان دوباره استفاده کرد.", "50002": "کوپن استفاده شده است، نمی‌توان دوباره استفاده کرد.",
"60001": "اشتراک منقضی شده است، لطفاً قبل از استفاده تمدید کنید.", "60001": "اشتراک منقضی شده است، لطفاً قبل از استفاده تمدید کنید.",
"60002": "در حال حاضر نمی‌توان از اشتراک استفاده کرد، لطفاً بعداً دوباره تلاش کنید.", "60002": "در حال حاضر نمی‌توان از اشتراک استفاده کرد، لطفاً بعداً دوباره تلاش کنید.",
"60003": "یک اشتراک موجود شناسایی شد. لطفاً قبل از ادامه آن را لغو کنید.",
"60004": "در حال حاضر امکان حذف وجود ندارد زیرا اشتراک دارای کاربران فعال است.",
"70001": "کد تأیید نادرست است، لطفاً دوباره وارد کنید.", "70001": "کد تأیید نادرست است، لطفاً دوباره وارد کنید.",
"80001": "وظیفه به‌طور موفقیت‌آمیز در صف قرار نگرفت، لطفاً بعداً دوباره تلاش کنید.", "80001": "وظیفه به‌طور موفقیت‌آمیز در صف قرار نگرفت، لطفاً بعداً دوباره تلاش کنید.",
"90001": "لطفاً حالت DEBUG را غیرفعال کرده و دوباره تلاش کنید.", "90001": "لطفاً حالت DEBUG را غیرفعال کرده و دوباره تلاش کنید.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "تأیید", "confirm": "تأیید",
"edit": "ویرایش", "edit": "ویرایش",
"editSecurity": "ویرایش تنظیمات امنیتی", "editSecurity": "ویرایش تنظیمات امنیتی",
"enableRelay": "فعال‌سازی رله",
"enableTLS": "فعال‌سازی TLS", "enableTLS": "فعال‌سازی TLS",
"encryptionMethod": "روش رمزنگاری", "encryptionMethod": "روش رمزنگاری",
"flow": "الگوریتم کنترل جریان", "flow": "الگوریتم کنترل جریان",
@@ -65,7 +64,14 @@
"port": "پورت سرور", "port": "پورت سرور",
"protocol": "پروتکل", "protocol": "پروتکل",
"relayHost": "میزبان رله", "relayHost": "میزبان رله",
"relayMode": "حالت رله",
"relayModeOptions": {
"all": "همه",
"none": "هیچ‌کدام",
"random": "تصادفی"
},
"relayPort": "پورت رله", "relayPort": "پورت رله",
"relayPrefix": "پیشوند رله",
"remarks": "توضیحات", "remarks": "توضیحات",
"security": "امنیت", "security": "امنیت",
"securityConfig": "پیکربندی امنیتی", "securityConfig": "پیکربندی امنیتی",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "انتخاب روش رمزنگاری", "selectEncryptionMethod": "انتخاب روش رمزنگاری",
"selectNodeGroup": "انتخاب گروه گره", "selectNodeGroup": "انتخاب گروه گره",
"selectProtocol": "انتخاب پروتکل", "selectProtocol": "انتخاب پروتکل",
"selectRelayMode": "انتخاب حالت رله",
"serverAddr": "آدرس سرور", "serverAddr": "آدرس سرور",
"serverKey": "کلید سرور",
"serverName": "نام سرویس", "serverName": "نام سرویس",
"speedLimit": "محدودیت سرعت", "speedLimit": "محدودیت سرعت",
"speedLimitPlaceholder": "نامحدود", "speedLimitPlaceholder": "نامحدود",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "ساعت", "Hour": "ساعت",
"Minute": "دقیقه", "Minute": "دقیقه",
"Month": "ماه", "Month": "ماه",
"NoLimit": "بدون محدودیت",
"Year": "سال", "Year": "سال",
"annualReset": "بازنشانی سالانه",
"basic": "پایه",
"cancel": "لغو", "cancel": "لغو",
"confirm": "تأیید", "confirm": "تأیید",
"deductionRatio": "پیکربندی کسر خودکار/دستی",
"deductionRatioDescription": "برای کسر استفاده می‌شود. به طور پیش‌فرض، سیستم از یک الگوریتم محاسبه خودکار استفاده می‌کند. هنگامی که نسبت دستی ارائه می‌شود، سیستم نسبت‌ها را بر اساس زمان و نسبت ترافیک محاسبه می‌کند و اطمینان حاصل می‌کند که مجموع به ۱۰۰٪ می‌رسد.",
"description": "توضیحات", "description": "توضیحات",
"deviceLimit": "محدودیت دستگاه", "deviceLimit": "محدودیت دستگاه",
"discount": "تخفیف", "discount": "تخفیف",
@@ -31,14 +36,25 @@
"discount_price": "قیمت تخفیف", "discount_price": "قیمت تخفیف",
"duration": "مدت زمان (ماه‌ها)", "duration": "مدت زمان (ماه‌ها)",
"inventory": "موجودی", "inventory": "موجودی",
"monthlyReset": "بازنشانی ماهانه",
"name": "نام", "name": "نام",
"noLimit": "بدون محدودیت", "noLimit": "بدون محدودیت",
"noReset": "بدون بازنشانی",
"pricing": "قیمت‌گذاری",
"purchaseWithDiscount": "اجازه کسر",
"purchaseWithDiscountDescription": "فعال یا غیرفعال کردن ویژگی کسر. هنگامی که فعال است، سیستم کسرها را بر اساس قوانین و نسبت‌های پیکربندی شده پردازش می‌کند.",
"quota": "محدودیت خرید", "quota": "محدودیت خرید",
"renewalReset": "بازنشانی تمدید",
"renewalResetDescription": "بازنشانی چرخه در زمان تمدید",
"replacement": "تنظیم مجدد قیمت (هر بار)", "replacement": "تنظیم مجدد قیمت (هر بار)",
"resetCycle": "چرخه بازنشانی",
"resetOn1st": "بازنشانی در روز اول",
"selectResetCycle": "لطفاً یک چرخه بازنشانی انتخاب کنید",
"selectSubscribeGroup": "گروه اشتراک را انتخاب کنید", "selectSubscribeGroup": "گروه اشتراک را انتخاب کنید",
"selectUnitTime": "لطفاً واحد زمان را انتخاب کنید", "selectUnitTime": "لطفاً واحد زمان را انتخاب کنید",
"server": "سرور", "server": "سرور",
"serverGroup": "گروه سرور", "serverGroup": "گروه سرور",
"servers": "سرورها",
"speedLimit": "محدودیت سرعت (مگابیت بر ثانیه)", "speedLimit": "محدودیت سرعت (مگابیت بر ثانیه)",
"subscribeGroup": "گروه اشتراک", "subscribeGroup": "گروه اشتراک",
"traffic": "ترافیک", "traffic": "ترافیک",
@@ -83,6 +99,6 @@
"subscribeGroup": "گروه اشتراک" "subscribeGroup": "گروه اشتراک"
}, },
"traffic": "ترافیک", "traffic": "ترافیک",
"unitPrice": "قیمت/ماه", "unitPrice": "قیمت واحد",
"updateSuccess": "به‌روزرسانی با موفقیت انجام شد" "updateSuccess": "به‌روزرسانی با موفقیت انجام شد"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "ذخیره‌سازی موفقیت‌آمیز" "saveSuccess": "ذخیره‌سازی موفقیت‌آمیز"
}, },
"node": { "node": {
"addTimeSlot": "افزودن بازه زمانی",
"communicationKey": "کلید ارتباطی", "communicationKey": "کلید ارتباطی",
"communicationKeyDescription": "کلید برای ارتباط گره به منظور اطمینان از امنیت داده‌ها", "communicationKeyDescription": "کلید برای ارتباط گره به منظور اطمینان از امنیت داده‌ها",
"delete": "حذف",
"dynamicMultiplier": "ضریب پویا",
"dynamicMultiplierDescription": "ضریب پویا به پردازش داده‌های ارسال شده با ضرایب مختلف برای گره‌های مختلف در دوره‌های زمانی مختلف اشاره دارد.",
"endTime": "زمان پایان",
"inputPlaceholder": "وارد کنید", "inputPlaceholder": "وارد کنید",
"multiplier": "ضریب",
"nodePullInterval": "فاصله زمانی کشیدن گره", "nodePullInterval": "فاصله زمانی کشیدن گره",
"nodePullIntervalDescription": "فرکانس (به ثانیه) برای گره‌ها جهت دریافت داده از پنل", "nodePullIntervalDescription": "فرکانس (به ثانیه) برای گره‌ها جهت دریافت داده از پنل",
"nodePushInterval": "فاصله زمانی فشار گره", "nodePushInterval": "فاصله زمانی فشار گره",
"nodePushIntervalDescription": "فرکانس برای گره‌ها جهت ارسال داده به پنل", "nodePushIntervalDescription": "فرکانس برای گره‌ها جهت ارسال داده به پنل",
"saveSuccess": "ذخیره با موفقیت انجام شد" "reset": "بازنشانی",
"save": "ذخیره",
"saveSuccess": "ذخیره با موفقیت انجام شد",
"startTime": "زمان شروع",
"timeSlot": "بازه زمانی"
}, },
"register": { "register": {
"emailSuffixWhitelist": "لیست سفید پسوند ایمیل", "emailSuffixWhitelist": "لیست سفید پسوند ایمیل",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Kuponki on jo käytetty, sitä ei voi käyttää uudelleen.", "50002": "Kuponki on jo käytetty, sitä ei voi käyttää uudelleen.",
"60001": "Tilauksesi on vanhentunut, uusi tilaus ja käytä uudelleen.", "60001": "Tilauksesi on vanhentunut, uusi tilaus ja käytä uudelleen.",
"60002": "Tilausta ei voi käyttää tällä hetkellä, yritä myöhemmin 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.", "70001": "Vahvistuskoodi on virheellinen, syötä se uudelleen.",
"80001": "Tehtävää ei lisätty jonoon, yritä myöhemmin uudelleen.", "80001": "Tehtävää ei lisätty jonoon, yritä myöhemmin uudelleen.",
"90001": "Sulje DEBUG-tila ja yritä uudelleen.", "90001": "Sulje DEBUG-tila ja yritä uudelleen.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Vahvista", "confirm": "Vahvista",
"edit": "Muokkaa", "edit": "Muokkaa",
"editSecurity": "Muokkaa suojausasetuksia", "editSecurity": "Muokkaa suojausasetuksia",
"enableRelay": "Ota välitys käyttöön",
"enableTLS": "Ota TLS käyttöön", "enableTLS": "Ota TLS käyttöön",
"encryptionMethod": "Salausmenetelmä", "encryptionMethod": "Salausmenetelmä",
"flow": "Virtausalgoritmi", "flow": "Virtausalgoritmi",
@@ -65,7 +64,14 @@
"port": "Palvelinportti", "port": "Palvelinportti",
"protocol": "Protokolla", "protocol": "Protokolla",
"relayHost": "Välityksen osoite", "relayHost": "Välityksen osoite",
"relayMode": "Välitystila",
"relayModeOptions": {
"all": "Kaikki",
"none": "Ei mitään",
"random": "Satunnainen"
},
"relayPort": "Välityksen portti", "relayPort": "Välityksen portti",
"relayPrefix": "Välitys etuliite",
"remarks": "Huomautukset", "remarks": "Huomautukset",
"security": "Turvallisuus", "security": "Turvallisuus",
"securityConfig": "Turvallisuusasetukset", "securityConfig": "Turvallisuusasetukset",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Valitse salausmenetelmä", "selectEncryptionMethod": "Valitse salausmenetelmä",
"selectNodeGroup": "Valitse solmuryhmä", "selectNodeGroup": "Valitse solmuryhmä",
"selectProtocol": "Valitse protokolla", "selectProtocol": "Valitse protokolla",
"selectRelayMode": "Valitse välitystila",
"serverAddr": "Palvelimen osoite", "serverAddr": "Palvelimen osoite",
"serverKey": "Palvelimen avain",
"serverName": "Palvelimen nimi", "serverName": "Palvelimen nimi",
"speedLimit": "Nopeusrajoitus", "speedLimit": "Nopeusrajoitus",
"speedLimitPlaceholder": "Ei rajoitusta", "speedLimitPlaceholder": "Ei rajoitusta",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Tunti", "Hour": "Tunti",
"Minute": "Minuutti", "Minute": "Minuutti",
"Month": "Kuukausi", "Month": "Kuukausi",
"NoLimit": "Ei rajoitusta",
"Year": "Vuosi", "Year": "Vuosi",
"annualReset": "Vuosittainen Nollaus",
"basic": "Perus",
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Vahvista", "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", "description": "Kuvaus",
"deviceLimit": "Laiterajoitus", "deviceLimit": "Laiterajoitus",
"discount": "Alennus", "discount": "Alennus",
@@ -31,14 +36,25 @@
"discount_price": "Alennettu hinta", "discount_price": "Alennettu hinta",
"duration": "Kesto (kuukautta)", "duration": "Kesto (kuukautta)",
"inventory": "Varasto", "inventory": "Varasto",
"monthlyReset": "Kuukausittainen Nollaus",
"name": "Nimi", "name": "Nimi",
"noLimit": "Ei rajoitusta", "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", "quota": "Ostorajoitus",
"renewalReset": "Uusimisen Nollaus",
"renewalResetDescription": "Nollaa jakso uusimisen yhteydessä",
"replacement": "Uudelleenhinnan asetus (kerta)", "replacement": "Uudelleenhinnan asetus (kerta)",
"resetCycle": "Nollausjakso",
"resetOn1st": "Nollaus 1. päivänä",
"selectResetCycle": "Valitse nollausjakso",
"selectSubscribeGroup": "Valitse tilausryhmä", "selectSubscribeGroup": "Valitse tilausryhmä",
"selectUnitTime": "Valitse aikayksikkö", "selectUnitTime": "Valitse aikayksikkö",
"server": "Palvelin", "server": "Palvelin",
"serverGroup": "Palvelinryhmä", "serverGroup": "Palvelinryhmä",
"servers": "Palvelimet",
"speedLimit": "Nopeusrajoitus (Mbps)", "speedLimit": "Nopeusrajoitus (Mbps)",
"subscribeGroup": "Tilausryhmä", "subscribeGroup": "Tilausryhmä",
"traffic": "Liikenne", "traffic": "Liikenne",
@@ -83,6 +99,6 @@
"subscribeGroup": "Tilaa ryhmä" "subscribeGroup": "Tilaa ryhmä"
}, },
"traffic": "liikenne", "traffic": "liikenne",
"unitPrice": "Hinta/kk", "unitPrice": "Yksikköhinta",
"updateSuccess": "Päivitys onnistui" "updateSuccess": "Päivitys onnistui"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Tallennus onnistui" "saveSuccess": "Tallennus onnistui"
}, },
"node": { "node": {
"addTimeSlot": "Lisää aikaväli",
"communicationKey": "Viestintäavain", "communicationKey": "Viestintäavain",
"communicationKeyDescription": "Solmun viestinnän avain, joka varmistaa, että tiedot eivät joudu muiden sieppaamiksi", "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ä", "inputPlaceholder": "Ole hyvä ja syötä",
"multiplier": "Kerroin",
"nodePullInterval": "Solmun noutoväli", "nodePullInterval": "Solmun noutoväli",
"nodePullIntervalDescription": "Kuinka usein solmu hakee tietoja paneelista (sekunteina)", "nodePullIntervalDescription": "Kuinka usein solmu hakee tietoja paneelista (sekunteina)",
"nodePushInterval": "Solmun lähetysväli", "nodePushInterval": "Solmun lähetysväli",
"nodePushIntervalDescription": "Kuinka usein solmu lähettää tietoja paneeliin", "nodePushIntervalDescription": "Kuinka usein solmu lähettää tietoja paneeliin",
"saveSuccess": "Tallennus onnistui" "reset": "Nollaa",
"save": "Tallenna",
"saveSuccess": "Tallennus onnistui",
"startTime": "Aloitusaika",
"timeSlot": "Aikaväli"
}, },
"register": { "register": {
"emailSuffixWhitelist": "Sähköpostin jälkiliitteen sallittu luettelo", "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é.", "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.", "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.", "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.", "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.", "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.", "90001": "Veuillez désactiver le mode DEBUG et réessayer.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmer", "confirm": "Confirmer",
"edit": "Éditer", "edit": "Éditer",
"editSecurity": "Éditer la configuration de sécurité", "editSecurity": "Éditer la configuration de sécurité",
"enableRelay": "Activer le relais",
"enableTLS": "Activer TLS", "enableTLS": "Activer TLS",
"encryptionMethod": "Méthode de cryptage", "encryptionMethod": "Méthode de cryptage",
"flow": "Algorithme de contrôle de flux", "flow": "Algorithme de contrôle de flux",
@@ -65,7 +64,14 @@
"port": "Port de service", "port": "Port de service",
"protocol": "Protocole", "protocol": "Protocole",
"relayHost": "Adresse de relais", "relayHost": "Adresse de relais",
"relayMode": "Mode relais",
"relayModeOptions": {
"all": "Tous",
"none": "Aucun",
"random": "Aléatoire"
},
"relayPort": "Port de relais", "relayPort": "Port de relais",
"relayPrefix": "Préfixe relais",
"remarks": "Remarques", "remarks": "Remarques",
"security": "Sécurité", "security": "Sécurité",
"securityConfig": "Configuration de sécurité", "securityConfig": "Configuration de sécurité",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Sélectionner la méthode de cryptage", "selectEncryptionMethod": "Sélectionner la méthode de cryptage",
"selectNodeGroup": "Sélectionner le groupe de nœuds", "selectNodeGroup": "Sélectionner le groupe de nœuds",
"selectProtocol": "Sélectionner le protocole", "selectProtocol": "Sélectionner le protocole",
"selectRelayMode": "Sélectionner le mode relais",
"serverAddr": "Adresse du serveur", "serverAddr": "Adresse du serveur",
"serverKey": "Clé du serveur",
"serverName": "Nom du service", "serverName": "Nom du service",
"speedLimit": "Limite de vitesse", "speedLimit": "Limite de vitesse",
"speedLimitPlaceholder": "Illimité", "speedLimitPlaceholder": "Illimité",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Heure", "Hour": "Heure",
"Minute": "Minute", "Minute": "Minute",
"Month": "Mois", "Month": "Mois",
"NoLimit": "Pas de limite",
"Year": "Année", "Year": "Année",
"annualReset": "Réinitialisation Annuelle",
"basic": "Basique",
"cancel": "Annuler", "cancel": "Annuler",
"confirm": "Confirmer", "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", "description": "Description",
"deviceLimit": "Limite d'appareils", "deviceLimit": "Limite d'appareils",
"discount": "Remise", "discount": "Remise",
@@ -31,14 +36,25 @@
"discount_price": "Prix remisé", "discount_price": "Prix remisé",
"duration": "Durée (mois)", "duration": "Durée (mois)",
"inventory": "Stock", "inventory": "Stock",
"monthlyReset": "Réinitialisation Mensuelle",
"name": "Nom", "name": "Nom",
"noLimit": "Illimité", "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", "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)", "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", "selectSubscribeGroup": "Veuillez sélectionner un groupe d'abonnement",
"selectUnitTime": "Veuillez sélectionner l'unité de temps", "selectUnitTime": "Veuillez sélectionner l'unité de temps",
"server": "Serveur", "server": "Serveur",
"serverGroup": "Groupe de serveurs", "serverGroup": "Groupe de serveurs",
"servers": "Serveurs",
"speedLimit": "Limite de vitesse (Mbps)", "speedLimit": "Limite de vitesse (Mbps)",
"subscribeGroup": "Groupe d'abonnement", "subscribeGroup": "Groupe d'abonnement",
"traffic": "Trafic", "traffic": "Trafic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Groupe d'abonnement" "subscribeGroup": "Groupe d'abonnement"
}, },
"traffic": "trafic", "traffic": "trafic",
"unitPrice": "Prix/mois", "unitPrice": "Prix unitaire",
"updateSuccess": "Mise à jour réussie" "updateSuccess": "Mise à jour réussie"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Enregistrement réussi" "saveSuccess": "Enregistrement réussi"
}, },
"node": { "node": {
"addTimeSlot": "Ajouter un créneau horaire",
"communicationKey": "Clé de communication", "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", "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", "inputPlaceholder": "Veuillez entrer",
"multiplier": "Multiplicateur",
"nodePullInterval": "Intervalle de récupération du nœud", "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)", "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", "nodePushInterval": "Intervalle de poussée du nœud",
"nodePushIntervalDescription": "Fréquence à laquelle le nœud pousse les données vers le panneau", "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": { "register": {
"emailSuffixWhitelist": "Liste blanche des suffixes d'email", "emailSuffixWhitelist": "Liste blanche des suffixes d'email",
+2
View File
@@ -42,6 +42,8 @@
"50002": "यह कूपन पहले ही उपयोग किया जा चुका है, इसे पुनः उपयोग नहीं किया जा सकता।", "50002": "यह कूपन पहले ही उपयोग किया जा चुका है, इसे पुनः उपयोग नहीं किया जा सकता।",
"60001": "सदस्यता की समय सीमा समाप्त हो गई है, कृपया नवीनीकरण के बाद उपयोग करें।", "60001": "सदस्यता की समय सीमा समाप्त हो गई है, कृपया नवीनीकरण के बाद उपयोग करें।",
"60002": "अस्थायी रूप से इस सदस्यता का उपयोग नहीं किया जा सकता, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "60002": "अस्थायी रूप से इस सदस्यता का उपयोग नहीं किया जा सकता, कृपया थोड़ी देर बाद पुनः प्रयास करें।",
"60003": "एक मौजूदा सदस्यता का पता चला है। कृपया आगे बढ़ने से पहले इसे रद्द करें।",
"60004": "वर्तमान में हटाने में असमर्थ क्योंकि सदस्यता में सक्रिय उपयोगकर्ता हैं।",
"70001": "सत्यापन कोड गलत है, कृपया पुनः दर्ज करें।", "70001": "सत्यापन कोड गलत है, कृपया पुनः दर्ज करें।",
"80001": "कार्य सफलतापूर्वक कतार में नहीं जोड़ा गया, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "80001": "कार्य सफलतापूर्वक कतार में नहीं जोड़ा गया, कृपया थोड़ी देर बाद पुनः प्रयास करें।",
"90001": "कृपया DEBUG मोड बंद करें और फिर पुनः प्रयास करें।", "90001": "कृपया DEBUG मोड बंद करें और फिर पुनः प्रयास करें।",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "पुष्टि करें", "confirm": "पुष्टि करें",
"edit": "संपादित करें", "edit": "संपादित करें",
"editSecurity": "सुरक्षा कॉन्फ़िगरेशन संपादित करें", "editSecurity": "सुरक्षा कॉन्फ़िगरेशन संपादित करें",
"enableRelay": "रिले सक्षम करें",
"enableTLS": "TLS सक्षम करें", "enableTLS": "TLS सक्षम करें",
"encryptionMethod": "एन्क्रिप्शन विधि", "encryptionMethod": "एन्क्रिप्शन विधि",
"flow": "फ्लो कंट्रोल एल्गोरिदम", "flow": "फ्लो कंट्रोल एल्गोरिदम",
@@ -65,7 +64,14 @@
"port": "सर्वर पोर्ट", "port": "सर्वर पोर्ट",
"protocol": "प्रोटोकॉल", "protocol": "प्रोटोकॉल",
"relayHost": "रिले पता", "relayHost": "रिले पता",
"relayMode": "रिले मोड",
"relayModeOptions": {
"all": "सभी",
"none": "कोई नहीं",
"random": "यादृच्छिक"
},
"relayPort": "रिले पोर्ट", "relayPort": "रिले पोर्ट",
"relayPrefix": "रिले उपसर्ग",
"remarks": "टिप्पणियाँ", "remarks": "टिप्पणियाँ",
"security": "सुरक्षा", "security": "सुरक्षा",
"securityConfig": "सुरक्षा कॉन्फ़िगरेशन", "securityConfig": "सुरक्षा कॉन्फ़िगरेशन",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "एन्क्रिप्शन विधि चुनें", "selectEncryptionMethod": "एन्क्रिप्शन विधि चुनें",
"selectNodeGroup": "नोड समूह चुनें", "selectNodeGroup": "नोड समूह चुनें",
"selectProtocol": "प्रोटोकॉल चुनें", "selectProtocol": "प्रोटोकॉल चुनें",
"selectRelayMode": "रिले मोड चुनें",
"serverAddr": "सर्वर पता", "serverAddr": "सर्वर पता",
"serverKey": "सर्वर कुंजी",
"serverName": "सेवा नाम", "serverName": "सेवा नाम",
"speedLimit": "गति सीमा", "speedLimit": "गति सीमा",
"speedLimitPlaceholder": "कोई सीमा नहीं", "speedLimitPlaceholder": "कोई सीमा नहीं",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "घंटा", "Hour": "घंटा",
"Minute": "मिनट", "Minute": "मिनट",
"Month": "महीना", "Month": "महीना",
"NoLimit": "कोई सीमा नहीं",
"Year": "वर्ष", "Year": "वर्ष",
"annualReset": "वार्षिक रीसेट",
"basic": "मूल",
"cancel": "रद्द करें", "cancel": "रद्द करें",
"confirm": "पुष्टि करें", "confirm": "पुष्टि करें",
"deductionRatio": "स्वचालित/मैनुअल कटौती कॉन्फ़िगरेशन",
"deductionRatioDescription": "कटौती के लिए उपयोग किया जाता है। डिफ़ॉल्ट रूप से, सिस्टम एक स्वचालित गणना एल्गोरिदम अपनाता है। जब एक मैनुअल अनुपात प्रदान किया जाता है, तो सिस्टम समय और ट्रैफ़िक अनुपात के आधार पर अनुपात की गणना करता है, यह सुनिश्चित करते हुए कि कुल 100% के बराबर हो।",
"description": "विवरण", "description": "विवरण",
"deviceLimit": "उपकरण सीमा", "deviceLimit": "उपकरण सीमा",
"discount": "छूट", "discount": "छूट",
@@ -31,14 +36,25 @@
"discount_price": "छूट मूल्य", "discount_price": "छूट मूल्य",
"duration": "अवधि (महीने)", "duration": "अवधि (महीने)",
"inventory": "भंडार", "inventory": "भंडार",
"monthlyReset": "मासिक रीसेट",
"name": "नाम", "name": "नाम",
"noLimit": "कोई सीमा नहीं", "noLimit": "कोई सीमा नहीं",
"noReset": "कोई रीसेट नहीं",
"pricing": "मूल्य निर्धारण",
"purchaseWithDiscount": "कटौती की अनुमति दें",
"purchaseWithDiscountDescription": "कटौती सुविधा को सक्षम या अक्षम करें। जब सक्षम किया जाता है, तो सिस्टम कॉन्फ़िगर किए गए नियमों और अनुपातों के आधार पर कटौती को संसाधित करेगा।",
"quota": "खरीद सीमा", "quota": "खरीद सीमा",
"renewalReset": "नवीनीकरण रीसेट",
"renewalResetDescription": "नवीनीकरण पर रीसेट चक्र",
"replacement": "पुनःस्थापना मूल्य (प्रति बार)", "replacement": "पुनःस्थापना मूल्य (प्रति बार)",
"resetCycle": "रीसेट चक्र",
"resetOn1st": "1 तारीख को रीसेट",
"selectResetCycle": "कृपया एक रीसेट चक्र चुनें",
"selectSubscribeGroup": "कृपया सदस्यता समूह चुनें", "selectSubscribeGroup": "कृपया सदस्यता समूह चुनें",
"selectUnitTime": "कृपया इकाई समय चुनें", "selectUnitTime": "कृपया इकाई समय चुनें",
"server": "सर्वर", "server": "सर्वर",
"serverGroup": "सर्वर समूह", "serverGroup": "सर्वर समूह",
"servers": "सर्वर",
"speedLimit": "गति सीमा (Mbps)", "speedLimit": "गति सीमा (Mbps)",
"subscribeGroup": "सदस्यता समूह", "subscribeGroup": "सदस्यता समूह",
"traffic": "ट्रैफिक", "traffic": "ट्रैफिक",
@@ -83,6 +99,6 @@
"subscribeGroup": "समूह सदस्यता" "subscribeGroup": "समूह सदस्यता"
}, },
"traffic": "ट्रैफिक", "traffic": "ट्रैफिक",
"unitPrice": "मूल्य/माह", "unitPrice": "इकाई मूल्य",
"updateSuccess": "अपडेट सफल" "updateSuccess": "अपडेट सफल"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "सफलतापूर्वक सहेजा गया" "saveSuccess": "सफलतापूर्वक सहेजा गया"
}, },
"node": { "node": {
"addTimeSlot": "समय स्लॉट जोड़ें",
"communicationKey": "संचार कुंजी", "communicationKey": "संचार कुंजी",
"communicationKeyDescription": "डेटा को अन्य लोगों द्वारा अवरोधित होने से बचाने के लिए नोड संचार की कुंजी", "communicationKeyDescription": "डेटा को अन्य लोगों द्वारा अवरोधित होने से बचाने के लिए नोड संचार की कुंजी",
"delete": "हटाएं",
"dynamicMultiplier": "डायनामिक मल्टीप्लायर",
"dynamicMultiplierDescription": "डायनामिक मल्टीप्लायर का मतलब है विभिन्न समय अवधियों के दौरान विभिन्न नोड्स के लिए अलग-अलग मल्टीप्लायर के साथ प्रोसेस किए गए डेटा को प्रोसेस करना।",
"endTime": "समाप्ति समय",
"inputPlaceholder": "कृपया दर्ज करें", "inputPlaceholder": "कृपया दर्ज करें",
"multiplier": "मल्टीप्लायर",
"nodePullInterval": "नोड पुल अंतराल", "nodePullInterval": "नोड पुल अंतराल",
"nodePullIntervalDescription": "पैनल से डेटा प्राप्त करने के लिए नोड की आवृत्ति (सेकंड में)", "nodePullIntervalDescription": "पैनल से डेटा प्राप्त करने के लिए नोड की आवृत्ति (सेकंड में)",
"nodePushInterval": "नोड पुश अंतराल", "nodePushInterval": "नोड पुश अंतराल",
"nodePushIntervalDescription": "नोड द्वारा डेटा को पैनल पर भेजने की आवृत्ति", "nodePushIntervalDescription": "नोड द्वारा डेटा को पैनल पर भेजने की आवृत्ति",
"saveSuccess": "सफलतापूर्वक सहेजा गया" "reset": "रीसेट",
"save": "सहेजें",
"saveSuccess": "सफलतापूर्वक सहेजा गया",
"startTime": "प्रारंभ समय",
"timeSlot": "समय स्लॉट"
}, },
"register": { "register": {
"emailSuffixWhitelist": "ईमेल प्रत्यय श्वेतसूची", "emailSuffixWhitelist": "ईमेल प्रत्यय श्वेतसूची",
+2
View File
@@ -42,6 +42,8 @@
"50002": "A kupon már felhasználásra került, nem használható újra.", "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.", "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.", "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.", "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.", "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.", "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", "confirm": "Megerősít",
"edit": "Szerkesztés", "edit": "Szerkesztés",
"editSecurity": "Biztonsági beállítások szerkesztése", "editSecurity": "Biztonsági beállítások szerkesztése",
"enableRelay": "Átjátszás engedélyezése",
"enableTLS": "TLS engedélyezése", "enableTLS": "TLS engedélyezése",
"encryptionMethod": "Titkosítási módszer", "encryptionMethod": "Titkosítási módszer",
"flow": "Áramlásszabályozási algoritmus", "flow": "Áramlásszabályozási algoritmus",
@@ -65,7 +64,14 @@
"port": "Szolgáltatási port", "port": "Szolgáltatási port",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Átjátszó cím", "relayHost": "Átjátszó cím",
"relayMode": "Relé mód",
"relayModeOptions": {
"all": "Összes",
"none": "Nincs",
"random": "Véletlenszerű"
},
"relayPort": "Átjátszó port", "relayPort": "Átjátszó port",
"relayPrefix": "Relé előtag",
"remarks": "Megjegyzések", "remarks": "Megjegyzések",
"security": "Biztonság", "security": "Biztonság",
"securityConfig": "Biztonsági beállítások", "securityConfig": "Biztonsági beállítások",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Válasszon titkosítási módszert", "selectEncryptionMethod": "Válasszon titkosítási módszert",
"selectNodeGroup": "Válasszon csomópont csoportot", "selectNodeGroup": "Válasszon csomópont csoportot",
"selectProtocol": "Válasszon protokollt", "selectProtocol": "Válasszon protokollt",
"selectRelayMode": "Válassza ki a relé módot",
"serverAddr": "Szerver cím", "serverAddr": "Szerver cím",
"serverKey": "Szerver kulcs",
"serverName": "Szolgáltatás neve", "serverName": "Szolgáltatás neve",
"speedLimit": "Sebességkorlátozás", "speedLimit": "Sebességkorlátozás",
"speedLimitPlaceholder": "Korlátlan", "speedLimitPlaceholder": "Korlátlan",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Óra", "Hour": "Óra",
"Minute": "Perc", "Minute": "Perc",
"Month": "Hónap", "Month": "Hónap",
"NoLimit": "Nincs korlátozás",
"Year": "Év", "Year": "Év",
"annualReset": "Éves Visszaállítás",
"basic": "Alap",
"cancel": "Mégse", "cancel": "Mégse",
"confirm": "Megerősít", "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", "description": "Leírás",
"deviceLimit": "Eszközkorlát", "deviceLimit": "Eszközkorlát",
"discount": "Kedvezmény", "discount": "Kedvezmény",
@@ -31,14 +36,25 @@
"discount_price": "Kedvezményes ár", "discount_price": "Kedvezményes ár",
"duration": "Időtartam (hónap)", "duration": "Időtartam (hónap)",
"inventory": "Készlet", "inventory": "Készlet",
"monthlyReset": "Havi Visszaállítás",
"name": "Név", "name": "Név",
"noLimit": "Korlátlan", "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", "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)", "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", "selectSubscribeGroup": "Kérjük, válassza ki az előfizetési csoportot",
"selectUnitTime": "Kérjük, válassza ki az időegységet", "selectUnitTime": "Kérjük, válassza ki az időegységet",
"server": "Szolgáltatás", "server": "Szolgáltatás",
"serverGroup": "Szolgáltatáscsoport", "serverGroup": "Szolgáltatáscsoport",
"servers": "Szerverek",
"speedLimit": "Sebességkorlát (Mbps)", "speedLimit": "Sebességkorlát (Mbps)",
"subscribeGroup": "Előfizetési csoport", "subscribeGroup": "Előfizetési csoport",
"traffic": "Forgalom", "traffic": "Forgalom",
@@ -83,6 +99,6 @@
"subscribeGroup": "Feliratkozási csoport" "subscribeGroup": "Feliratkozási csoport"
}, },
"traffic": "forgalom", "traffic": "forgalom",
"unitPrice": "Ár/hó", "unitPrice": "Egységár",
"updateSuccess": "Sikeres frissítés" "updateSuccess": "Sikeres frissítés"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Sikeres mentés" "saveSuccess": "Sikeres mentés"
}, },
"node": { "node": {
"addTimeSlot": "Időrés hozzáadása",
"communicationKey": "Kommunikációs kulcs", "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", "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", "inputPlaceholder": "Kérjük, írja be",
"multiplier": "Szorzó",
"nodePullInterval": "Csomópont lehívási intervallum", "nodePullInterval": "Csomópont lehívási intervallum",
"nodePullIntervalDescription": "A csomópont milyen gyakran kér le adatokat a panelről (másodpercben)", "nodePullIntervalDescription": "A csomópont milyen gyakran kér le adatokat a panelről (másodpercben)",
"nodePushInterval": "Csomópont küldési intervallum", "nodePushInterval": "Csomópont küldési intervallum",
"nodePushIntervalDescription": "A csomópont milyen gyakran küld adatokat a panelre", "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": { "register": {
"emailSuffixWhitelist": "E-mail végződés fehérlista", "emailSuffixWhitelist": "E-mail végződés fehérlista",
+2
View File
@@ -42,6 +42,8 @@
"50002": "このクーポンは既に使用されています。再利用できません。", "50002": "このクーポンは既に使用されています。再利用できません。",
"60001": "サブスクリプションの有効期限が切れています。更新してからご利用ください。", "60001": "サブスクリプションの有効期限が切れています。更新してからご利用ください。",
"60002": "このサブスクリプションは現在使用できません。しばらくしてから再試行してください。", "60002": "このサブスクリプションは現在使用できません。しばらくしてから再試行してください。",
"60003": "既存のサブスクリプションが検出されました。続行する前にキャンセルしてください。",
"60004": "サブスクリプションにアクティブなユーザーがいるため、現在削除できません。",
"70001": "認証コードが間違っています。再入力してください。", "70001": "認証コードが間違っています。再入力してください。",
"80001": "タスクがキューに正常に追加されませんでした。しばらくしてから再試行してください。", "80001": "タスクがキューに正常に追加されませんでした。しばらくしてから再試行してください。",
"90001": "DEBUGモードをオフにしてから再試行してください。", "90001": "DEBUGモードをオフにしてから再試行してください。",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "確認", "confirm": "確認",
"edit": "編集", "edit": "編集",
"editSecurity": "セキュリティ設定を編集", "editSecurity": "セキュリティ設定を編集",
"enableRelay": "リレーを有効化",
"enableTLS": "TLSを有効化", "enableTLS": "TLSを有効化",
"encryptionMethod": "暗号化方式", "encryptionMethod": "暗号化方式",
"flow": "フロー制御アルゴリズム", "flow": "フロー制御アルゴリズム",
@@ -65,7 +64,14 @@
"port": "サーバーポート", "port": "サーバーポート",
"protocol": "プロトコル", "protocol": "プロトコル",
"relayHost": "リレーアドレス", "relayHost": "リレーアドレス",
"relayMode": "リレーモード",
"relayModeOptions": {
"all": "すべて",
"none": "なし",
"random": "ランダム"
},
"relayPort": "リレーポート", "relayPort": "リレーポート",
"relayPrefix": "リレープレフィックス",
"remarks": "備考", "remarks": "備考",
"security": "セキュリティ", "security": "セキュリティ",
"securityConfig": "セキュリティ設定", "securityConfig": "セキュリティ設定",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "暗号化方式を選択", "selectEncryptionMethod": "暗号化方式を選択",
"selectNodeGroup": "ノードグループを選択", "selectNodeGroup": "ノードグループを選択",
"selectProtocol": "プロトコルを選択", "selectProtocol": "プロトコルを選択",
"selectRelayMode": "リレーモードを選択",
"serverAddr": "サーバーアドレス", "serverAddr": "サーバーアドレス",
"serverKey": "サーバーキー",
"serverName": "サービス名", "serverName": "サービス名",
"speedLimit": "速度制限", "speedLimit": "速度制限",
"speedLimitPlaceholder": "無制限", "speedLimitPlaceholder": "無制限",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "時", "Hour": "時",
"Minute": "分", "Minute": "分",
"Month": "月", "Month": "月",
"NoLimit": "制限なし",
"Year": "年", "Year": "年",
"annualReset": "毎年リセット",
"basic": "基本",
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "確認", "confirm": "確認",
"deductionRatio": "自動/手動控除設定",
"deductionRatioDescription": "控除に使用されます。デフォルトでは、システムは自動計算アルゴリズムを採用します。手動比率が提供されると、システムは時間とトラフィックの比率に基づいて割合を計算し、合計が100%になるようにします。",
"description": "説明", "description": "説明",
"deviceLimit": "デバイス制限", "deviceLimit": "デバイス制限",
"discount": "割引", "discount": "割引",
@@ -31,14 +36,25 @@
"discount_price": "割引価格", "discount_price": "割引価格",
"duration": "期間(月)", "duration": "期間(月)",
"inventory": "在庫", "inventory": "在庫",
"monthlyReset": "毎月リセット",
"name": "名称", "name": "名称",
"noLimit": "無制限", "noLimit": "無制限",
"noReset": "リセットなし",
"pricing": "価格設定",
"purchaseWithDiscount": "控除を許可",
"purchaseWithDiscountDescription": "控除機能を有効または無効にします。有効にすると、システムは設定されたルールと比率に基づいて控除を処理します。",
"quota": "購入制限数", "quota": "購入制限数",
"renewalReset": "更新時リセット",
"renewalResetDescription": "更新時にリセットサイクル",
"replacement": "リセット価格(毎回)", "replacement": "リセット価格(毎回)",
"resetCycle": "リセットサイクル",
"resetOn1st": "1日にリセット",
"selectResetCycle": "リセットサイクルを選択してください",
"selectSubscribeGroup": "サブスクリプショングループを選択してください", "selectSubscribeGroup": "サブスクリプショングループを選択してください",
"selectUnitTime": "単位時間を選択してください", "selectUnitTime": "単位時間を選択してください",
"server": "サーバー", "server": "サーバー",
"serverGroup": "サーバーグループ", "serverGroup": "サーバーグループ",
"servers": "サーバー",
"speedLimit": "速度制限(Mbps", "speedLimit": "速度制限(Mbps",
"subscribeGroup": "サブスクリプショングループ", "subscribeGroup": "サブスクリプショングループ",
"traffic": "トラフィック", "traffic": "トラフィック",
@@ -83,6 +99,6 @@
"subscribeGroup": "購読グループ" "subscribeGroup": "購読グループ"
}, },
"traffic": "トラフィック", "traffic": "トラフィック",
"unitPrice": "価格/月", "unitPrice": "価",
"updateSuccess": "更新が成功しました" "updateSuccess": "更新が成功しました"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "保存に成功しました" "saveSuccess": "保存に成功しました"
}, },
"node": { "node": {
"addTimeSlot": "時間枠を追加",
"communicationKey": "通信キー", "communicationKey": "通信キー",
"communicationKeyDescription": "ノード通信のためのキーで、データが他人に傍受されないようにします", "communicationKeyDescription": "ノード通信のためのキーで、データが他人に傍受されないようにします",
"delete": "削除",
"dynamicMultiplier": "動的乗数",
"dynamicMultiplierDescription": "動的乗数は、異なる時間帯に異なるノードに対して異なる乗数でプッシュされたデータを処理することを指します。",
"endTime": "終了時間",
"inputPlaceholder": "入力してください", "inputPlaceholder": "入力してください",
"multiplier": "乗数",
"nodePullInterval": "ノード取得間隔", "nodePullInterval": "ノード取得間隔",
"nodePullIntervalDescription": "ノードがパネルからデータを取得する頻度(秒)", "nodePullIntervalDescription": "ノードがパネルからデータを取得する頻度(秒)",
"nodePushInterval": "ノード送信間隔", "nodePushInterval": "ノード送信間隔",
"nodePushIntervalDescription": "ノードがデータをパネルに送信する頻度", "nodePushIntervalDescription": "ノードがデータをパネルに送信する頻度",
"saveSuccess": "保存成功" "reset": "リセット",
"save": "保存",
"saveSuccess": "保存成功",
"startTime": "開始時間",
"timeSlot": "時間枠"
}, },
"register": { "register": {
"emailSuffixWhitelist": "メールサフィックスホワイトリスト", "emailSuffixWhitelist": "メールサフィックスホワイトリスト",
+2
View File
@@ -42,6 +42,8 @@
"50002": "해당 쿠폰이 이미 사용되었습니다. 반복 사용할 수 없습니다.", "50002": "해당 쿠폰이 이미 사용되었습니다. 반복 사용할 수 없습니다.",
"60001": "구독이 만료되었습니다. 갱신 후 사용해 주세요.", "60001": "구독이 만료되었습니다. 갱신 후 사용해 주세요.",
"60002": "현재 구독을 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.", "60002": "현재 구독을 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.",
"60003": "기존 구독이 감지되었습니다. 계속하기 전에 취소해 주세요.",
"60004": "구독에 활성 사용자가 있어 현재 삭제할 수 없습니다.",
"70001": "인증 코드가 잘못되었습니다. 다시 입력해 주세요.", "70001": "인증 코드가 잘못되었습니다. 다시 입력해 주세요.",
"80001": "작업이 큐에 성공적으로 추가되지 않았습니다. 잠시 후 다시 시도해 주세요.", "80001": "작업이 큐에 성공적으로 추가되지 않았습니다. 잠시 후 다시 시도해 주세요.",
"90001": "DEBUG 모드를 끈 후 다시 시도해 주세요.", "90001": "DEBUG 모드를 끈 후 다시 시도해 주세요.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "확인", "confirm": "확인",
"edit": "편집", "edit": "편집",
"editSecurity": "보안 설정 편집", "editSecurity": "보안 설정 편집",
"enableRelay": "중계 활성화",
"enableTLS": "TLS 활성화", "enableTLS": "TLS 활성화",
"encryptionMethod": "암호화 방법", "encryptionMethod": "암호화 방법",
"flow": "흐름 제어 알고리즘", "flow": "흐름 제어 알고리즘",
@@ -65,7 +64,14 @@
"port": "서비스 포트", "port": "서비스 포트",
"protocol": "프로토콜", "protocol": "프로토콜",
"relayHost": "중계 주소", "relayHost": "중계 주소",
"relayMode": "릴레이 모드",
"relayModeOptions": {
"all": "모두",
"none": "없음",
"random": "무작위"
},
"relayPort": "중계 포트", "relayPort": "중계 포트",
"relayPrefix": "릴레이 접두사",
"remarks": "비고", "remarks": "비고",
"security": "보안", "security": "보안",
"securityConfig": "보안 설정", "securityConfig": "보안 설정",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "암호화 방법 선택", "selectEncryptionMethod": "암호화 방법 선택",
"selectNodeGroup": "노드 그룹 선택", "selectNodeGroup": "노드 그룹 선택",
"selectProtocol": "프로토콜 선택", "selectProtocol": "프로토콜 선택",
"selectRelayMode": "릴레이 모드 선택",
"serverAddr": "서버 주소", "serverAddr": "서버 주소",
"serverKey": "서버 키",
"serverName": "서비스 이름", "serverName": "서비스 이름",
"speedLimit": "속도 제한", "speedLimit": "속도 제한",
"speedLimitPlaceholder": "제한 없음", "speedLimitPlaceholder": "제한 없음",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "시", "Hour": "시",
"Minute": "분", "Minute": "분",
"Month": "월", "Month": "월",
"NoLimit": "제한 없음",
"Year": "년", "Year": "년",
"annualReset": "연간 초기화",
"basic": "기본",
"cancel": "취소", "cancel": "취소",
"confirm": "확인", "confirm": "확인",
"deductionRatio": "자동/수동 공제 설정",
"deductionRatioDescription": "공제에 사용됩니다. 기본적으로 시스템은 자동 계산 알고리즘을 채택합니다. 수동 비율이 제공되면 시스템은 시간 및 트래픽 비율에 따라 비율을 계산하여 총합이 100%가 되도록 합니다.",
"description": "설명", "description": "설명",
"deviceLimit": "기기 제한", "deviceLimit": "기기 제한",
"discount": "할인", "discount": "할인",
@@ -31,14 +36,25 @@
"discount_price": "할인가", "discount_price": "할인가",
"duration": "기간 (개월)", "duration": "기간 (개월)",
"inventory": "재고", "inventory": "재고",
"monthlyReset": "월별 초기화",
"name": "이름", "name": "이름",
"noLimit": "무제한", "noLimit": "무제한",
"noReset": "초기화 없음",
"pricing": "가격",
"purchaseWithDiscount": "공제 허용",
"purchaseWithDiscountDescription": "공제 기능을 활성화하거나 비활성화합니다. 활성화되면 시스템은 구성된 규칙과 비율에 따라 공제를 처리합니다.",
"quota": "구매 한도", "quota": "구매 한도",
"renewalReset": "갱신 초기화",
"renewalResetDescription": "갱신 시 초기화 주기",
"replacement": "재설정 가격 (매회)", "replacement": "재설정 가격 (매회)",
"resetCycle": "초기화 주기",
"resetOn1st": "매월 1일 초기화",
"selectResetCycle": "초기화 주기를 선택하세요",
"selectSubscribeGroup": "구독 그룹을 선택하세요", "selectSubscribeGroup": "구독 그룹을 선택하세요",
"selectUnitTime": "단위 시간을 선택하세요", "selectUnitTime": "단위 시간을 선택하세요",
"server": "서버", "server": "서버",
"serverGroup": "서버 그룹", "serverGroup": "서버 그룹",
"servers": "서버",
"speedLimit": "속도 제한 (Mbps)", "speedLimit": "속도 제한 (Mbps)",
"subscribeGroup": "구독 그룹", "subscribeGroup": "구독 그룹",
"traffic": "트래픽", "traffic": "트래픽",
@@ -83,6 +99,6 @@
"subscribeGroup": "구독 그룹" "subscribeGroup": "구독 그룹"
}, },
"traffic": "트래픽", "traffic": "트래픽",
"unitPrice": "가격/월", "unitPrice": "가",
"updateSuccess": "업데이트 성공" "updateSuccess": "업데이트 성공"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "저장 성공" "saveSuccess": "저장 성공"
}, },
"node": { "node": {
"addTimeSlot": "시간 슬롯 추가",
"communicationKey": "통신 키", "communicationKey": "통신 키",
"communicationKeyDescription": "데이터가 다른 사람에게 가로채이지 않도록 보장하는 노드 통신 키", "communicationKeyDescription": "데이터가 다른 사람에게 가로채이지 않도록 보장하는 노드 통신 키",
"delete": "삭제",
"dynamicMultiplier": "동적 배수",
"dynamicMultiplierDescription": "동적 배수는 서로 다른 시간대에 서로 다른 노드에 대해 다른 배수를 사용하여 처리된 데이터를 의미합니다.",
"endTime": "종료 시간",
"inputPlaceholder": "입력하세요", "inputPlaceholder": "입력하세요",
"multiplier": "배수",
"nodePullInterval": "노드 가져오기 간격", "nodePullInterval": "노드 가져오기 간격",
"nodePullIntervalDescription": "노드가 패널에서 데이터를 가져오는 빈도(초)", "nodePullIntervalDescription": "노드가 패널에서 데이터를 가져오는 빈도(초)",
"nodePushInterval": "노드 푸시 간격", "nodePushInterval": "노드 푸시 간격",
"nodePushIntervalDescription": "노드가 데이터를 패널로 푸시하는 빈도", "nodePushIntervalDescription": "노드가 데이터를 패널로 푸시하는 빈도",
"saveSuccess": "저장 성공" "reset": "재설정",
"save": "저장",
"saveSuccess": "저장 성공",
"startTime": "시작 시간",
"timeSlot": "시간대"
}, },
"register": { "register": {
"emailSuffixWhitelist": "이메일 접미사 화이트리스트", "emailSuffixWhitelist": "이메일 접미사 화이트리스트",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Kupongen er allerede brukt og kan ikke brukes igjen.", "50002": "Kupongen er allerede brukt og kan ikke brukes igjen.",
"60001": "Abonnementet er utløpt, vennligst forny det før bruk.", "60001": "Abonnementet er utløpt, vennligst forny det før bruk.",
"60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.", "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.", "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.", "80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.",
"90001": "Vennligst deaktiver DEBUG-modus og prøv igjen.", "90001": "Vennligst deaktiver DEBUG-modus og prøv igjen.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Bekreft", "confirm": "Bekreft",
"edit": "Rediger", "edit": "Rediger",
"editSecurity": "Rediger sikkerhetskonfigurasjon", "editSecurity": "Rediger sikkerhetskonfigurasjon",
"enableRelay": "Aktiver relé",
"enableTLS": "Aktiver TLS", "enableTLS": "Aktiver TLS",
"encryptionMethod": "Krypteringsmetode", "encryptionMethod": "Krypteringsmetode",
"flow": "Flytkontrollalgoritme", "flow": "Flytkontrollalgoritme",
@@ -65,7 +64,14 @@
"port": "Tjenesteport", "port": "Tjenesteport",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Reléadresse", "relayHost": "Reléadresse",
"relayMode": "Relémodus",
"relayModeOptions": {
"all": "Alle",
"none": "Ingen",
"random": "Tilfeldig"
},
"relayPort": "Reléport", "relayPort": "Reléport",
"relayPrefix": "Reléprefiks",
"remarks": "Merknader", "remarks": "Merknader",
"security": "Sikkerhet", "security": "Sikkerhet",
"securityConfig": "Sikkerhetskonfigurasjon", "securityConfig": "Sikkerhetskonfigurasjon",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Velg krypteringsmetode", "selectEncryptionMethod": "Velg krypteringsmetode",
"selectNodeGroup": "Velg nodegruppe", "selectNodeGroup": "Velg nodegruppe",
"selectProtocol": "Velg protokoll", "selectProtocol": "Velg protokoll",
"selectRelayMode": "Velg relémodus",
"serverAddr": "Serveradresse", "serverAddr": "Serveradresse",
"serverKey": "Servernøkkel",
"serverName": "Tjenestenavn", "serverName": "Tjenestenavn",
"speedLimit": "Hastighetsbegrensning", "speedLimit": "Hastighetsbegrensning",
"speedLimitPlaceholder": "Ingen begrensning", "speedLimitPlaceholder": "Ingen begrensning",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Time", "Hour": "Time",
"Minute": "Minutt", "Minute": "Minutt",
"Month": "Måned", "Month": "Måned",
"NoLimit": "Ingen grense",
"Year": "År", "Year": "År",
"annualReset": "Årlig Tilbakestilling",
"basic": "Grunnleggende",
"cancel": "Avbryt", "cancel": "Avbryt",
"confirm": "Bekreft", "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", "description": "Beskrivelse",
"deviceLimit": "Enhetsbegrensning", "deviceLimit": "Enhetsbegrensning",
"discount": "Rabatt", "discount": "Rabatt",
@@ -31,14 +36,25 @@
"discount_price": "Rabattert pris", "discount_price": "Rabattert pris",
"duration": "Varighet (måneder)", "duration": "Varighet (måneder)",
"inventory": "Lager", "inventory": "Lager",
"monthlyReset": "Månedlig Tilbakestilling",
"name": "Navn", "name": "Navn",
"noLimit": "Ubegrenset", "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", "quota": "Kjøpskvote",
"renewalReset": "Fornyelsestilbakestilling",
"renewalResetDescription": "Tilbakestill syklus ved fornyelse",
"replacement": "Erstatningspris (per gang)", "replacement": "Erstatningspris (per gang)",
"resetCycle": "Tilbakestill Syklus",
"resetOn1st": "Tilbakestill den 1.",
"selectResetCycle": "Vennligst velg en tilbakestillingssyklus",
"selectSubscribeGroup": "Vennligst velg abonnementsgruppe", "selectSubscribeGroup": "Vennligst velg abonnementsgruppe",
"selectUnitTime": "Vennligst velg enhetstid", "selectUnitTime": "Vennligst velg enhetstid",
"server": "Tjeneste", "server": "Tjeneste",
"serverGroup": "Tjenestegruppe", "serverGroup": "Tjenestegruppe",
"servers": "Servere",
"speedLimit": "Hastighetsbegrensning (Mbps)", "speedLimit": "Hastighetsbegrensning (Mbps)",
"subscribeGroup": "Abonnementsgruppe", "subscribeGroup": "Abonnementsgruppe",
"traffic": "Trafikk", "traffic": "Trafikk",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abonner gruppe" "subscribeGroup": "Abonner gruppe"
}, },
"traffic": "trafikk", "traffic": "trafikk",
"unitPrice": "Pris/måned", "unitPrice": "Enhetspris",
"updateSuccess": "Oppdatering vellykket" "updateSuccess": "Oppdatering vellykket"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Lagret vellykket" "saveSuccess": "Lagret vellykket"
}, },
"node": { "node": {
"addTimeSlot": "Legg til tidsluke",
"communicationKey": "Kommunikasjonsnøkkel", "communicationKey": "Kommunikasjonsnøkkel",
"communicationKeyDescription": "Nøkkelen for kommunikasjon mellom noder, for å sikre at data ikke blir avlyttet av andre", "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", "inputPlaceholder": "Vennligst skriv inn",
"multiplier": "Multiplikator",
"nodePullInterval": "Node hentingsintervall", "nodePullInterval": "Node hentingsintervall",
"nodePullIntervalDescription": "Frekvensen (i sekunder) som noden henter data fra panelet", "nodePullIntervalDescription": "Frekvensen (i sekunder) som noden henter data fra panelet",
"nodePushInterval": "Node push-intervall", "nodePushInterval": "Node push-intervall",
"nodePushIntervalDescription": "Frekvensen som noden sender data til panelet", "nodePushIntervalDescription": "Frekvensen som noden sender data til panelet",
"saveSuccess": "Lagring vellykket" "reset": "Tilbakestill",
"save": "Lagre",
"saveSuccess": "Lagring vellykket",
"startTime": "Starttid",
"timeSlot": "Tidsluke"
}, },
"register": { "register": {
"emailSuffixWhitelist": "E-post suffiks hviteliste", "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.", "50002": "Kupon został już użyty, nie można go użyć ponownie.",
"60001": "Subskrypcja wygasła, odnow ją i użyj 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.", "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.", "70001": "Kod weryfikacyjny jest nieprawidłowy, wprowadź ponownie.",
"80001": "Zadanie nie zostało pomyślnie dodane do kolejki, spróbuj ponownie później.", "80001": "Zadanie nie zostało pomyślnie dodane do kolejki, spróbuj ponownie później.",
"90001": "Wyłącz tryb DEBUG i spróbuj ponownie.", "90001": "Wyłącz tryb DEBUG i spróbuj ponownie.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Potwierdź", "confirm": "Potwierdź",
"edit": "Edytuj", "edit": "Edytuj",
"editSecurity": "Edytuj konfigurację bezpieczeństwa", "editSecurity": "Edytuj konfigurację bezpieczeństwa",
"enableRelay": "Włącz przekaźnik",
"enableTLS": "Włącz TLS", "enableTLS": "Włącz TLS",
"encryptionMethod": "Metoda szyfrowania", "encryptionMethod": "Metoda szyfrowania",
"flow": "Algorytm kontroli przepływu", "flow": "Algorytm kontroli przepływu",
@@ -65,7 +64,14 @@
"port": "Port serwera", "port": "Port serwera",
"protocol": "Protokół", "protocol": "Protokół",
"relayHost": "Adres przekaźnika", "relayHost": "Adres przekaźnika",
"relayMode": "Tryb przekaźnika",
"relayModeOptions": {
"all": "Wszystkie",
"none": "Brak",
"random": "Losowy"
},
"relayPort": "Port przekaźnika", "relayPort": "Port przekaźnika",
"relayPrefix": "Prefiks przekaźnika",
"remarks": "Uwagi", "remarks": "Uwagi",
"security": "Bezpieczeństwo", "security": "Bezpieczeństwo",
"securityConfig": "Konfiguracja bezpieczeństwa", "securityConfig": "Konfiguracja bezpieczeństwa",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Wybierz metodę szyfrowania", "selectEncryptionMethod": "Wybierz metodę szyfrowania",
"selectNodeGroup": "Wybierz grupę węzłów", "selectNodeGroup": "Wybierz grupę węzłów",
"selectProtocol": "Wybierz protokół", "selectProtocol": "Wybierz protokół",
"selectRelayMode": "Wybierz tryb przekaźnika",
"serverAddr": "Adres serwera", "serverAddr": "Adres serwera",
"serverKey": "Klucz serwera",
"serverName": "Nazwa usługi", "serverName": "Nazwa usługi",
"speedLimit": "Ograniczenie prędkości", "speedLimit": "Ograniczenie prędkości",
"speedLimitPlaceholder": "Bez ograniczeń", "speedLimitPlaceholder": "Bez ograniczeń",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Godzina", "Hour": "Godzina",
"Minute": "Minuta", "Minute": "Minuta",
"Month": "Miesiąc", "Month": "Miesiąc",
"NoLimit": "Bez ograniczeń",
"Year": "Rok", "Year": "Rok",
"annualReset": "Roczny Reset",
"basic": "Podstawowy",
"cancel": "Anuluj", "cancel": "Anuluj",
"confirm": "Potwierdź", "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", "description": "Opis",
"deviceLimit": "Limit urządzeń", "deviceLimit": "Limit urządzeń",
"discount": "Zniżka", "discount": "Zniżka",
@@ -31,14 +36,25 @@
"discount_price": "Cena po zniżce", "discount_price": "Cena po zniżce",
"duration": "Czas trwania (miesiące)", "duration": "Czas trwania (miesiące)",
"inventory": "Zapas", "inventory": "Zapas",
"monthlyReset": "Miesięczny Reset",
"name": "Nazwa", "name": "Nazwa",
"noLimit": "Bez ograniczeń", "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", "quota": "Limit zakupu",
"renewalReset": "Reset przy Odnowieniu",
"renewalResetDescription": "Reset cyklu przy odnowieniu",
"replacement": "Cena wymiany (za każdym razem)", "replacement": "Cena wymiany (za każdym razem)",
"resetCycle": "Cykl Resetowania",
"resetOn1st": "Reset 1-go",
"selectResetCycle": "Proszę wybrać cykl resetowania",
"selectSubscribeGroup": "Wybierz grupę subskrypcji", "selectSubscribeGroup": "Wybierz grupę subskrypcji",
"selectUnitTime": "Proszę wybrać jednostkę czasu", "selectUnitTime": "Proszę wybrać jednostkę czasu",
"server": "Serwer", "server": "Serwer",
"serverGroup": "Grupa serwerów", "serverGroup": "Grupa serwerów",
"servers": "Serwery",
"speedLimit": "Limit prędkości (Mbps)", "speedLimit": "Limit prędkości (Mbps)",
"subscribeGroup": "Grupa subskrypcji", "subscribeGroup": "Grupa subskrypcji",
"traffic": "Ruch", "traffic": "Ruch",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupa subskrypcji" "subscribeGroup": "Grupa subskrypcji"
}, },
"traffic": "ruch", "traffic": "ruch",
"unitPrice": "Cena/miesiąc", "unitPrice": "Cena jednostkowa",
"updateSuccess": "Aktualizacja zakończona pomyślnie" "updateSuccess": "Aktualizacja zakończona pomyślnie"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Zapisano pomyślnie" "saveSuccess": "Zapisano pomyślnie"
}, },
"node": { "node": {
"addTimeSlot": "Dodaj przedział czasowy",
"communicationKey": "Klucz komunikacyjny", "communicationKey": "Klucz komunikacyjny",
"communicationKeyDescription": "Klucz do komunikacji węzła, aby zapewnić, że dane nie zostaną przechwycone przez inne osoby", "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ć", "inputPlaceholder": "Proszę wprowadzić",
"multiplier": "Mnożnik",
"nodePullInterval": "Interwał pobierania węzła", "nodePullInterval": "Interwał pobierania węzła",
"nodePullIntervalDescription": "Częstotliwość, z jaką węzeł pobiera dane z panelu (w sekundach)", "nodePullIntervalDescription": "Częstotliwość, z jaką węzeł pobiera dane z panelu (w sekundach)",
"nodePushInterval": "Interwał wysyłania węzła", "nodePushInterval": "Interwał wysyłania węzła",
"nodePushIntervalDescription": "Częstotliwość, z jaką węzeł wysyła dane do panelu", "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": { "register": {
"emailSuffixWhitelist": "Biała lista sufiksów e-mail", "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.", "50002": "O cupom já foi usado, não pode ser reutilizado.",
"60001": "A assinatura expirou, por favor, renove para continuar usando.", "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.", "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.", "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.", "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.", "90001": "Por favor, desative o modo DEBUG e tente novamente.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar Configuração de Segurança", "editSecurity": "Editar Configuração de Segurança",
"enableRelay": "Habilitar Relay",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de Criptografia", "encryptionMethod": "Método de Criptografia",
"flow": "Algoritmo de Controle de Fluxo", "flow": "Algoritmo de Controle de Fluxo",
@@ -65,7 +64,14 @@
"port": "Porta do Servidor", "port": "Porta do Servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Endereço de Relay", "relayHost": "Endereço de Relay",
"relayMode": "Modo de Retransmissão",
"relayModeOptions": {
"all": "Todos",
"none": "Nenhum",
"random": "Aleatório"
},
"relayPort": "Porta de Relay", "relayPort": "Porta de Relay",
"relayPrefix": "Prefixo de Retransmissão",
"remarks": "Observações", "remarks": "Observações",
"security": "Segurança", "security": "Segurança",
"securityConfig": "Configuração de Segurança", "securityConfig": "Configuração de Segurança",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Selecione o Método de Criptografia", "selectEncryptionMethod": "Selecione o Método de Criptografia",
"selectNodeGroup": "Selecione o Grupo de Nós", "selectNodeGroup": "Selecione o Grupo de Nós",
"selectProtocol": "Selecione o Protocolo", "selectProtocol": "Selecione o Protocolo",
"selectRelayMode": "Selecionar Modo de Retransmissão",
"serverAddr": "Endereço do Servidor", "serverAddr": "Endereço do Servidor",
"serverKey": "Chave do Servidor",
"serverName": "Nome do Serviço", "serverName": "Nome do Serviço",
"speedLimit": "Limite de Velocidade", "speedLimit": "Limite de Velocidade",
"speedLimitPlaceholder": "Sem Limite", "speedLimitPlaceholder": "Sem Limite",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Hora", "Hour": "Hora",
"Minute": "Minuto", "Minute": "Minuto",
"Month": "Mês", "Month": "Mês",
"NoLimit": "Sem Limite",
"Year": "Ano", "Year": "Ano",
"annualReset": "Reinicialização Anual",
"basic": "Básico",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "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", "description": "Descrição",
"deviceLimit": "Limite de dispositivos", "deviceLimit": "Limite de dispositivos",
"discount": "Desconto", "discount": "Desconto",
@@ -31,14 +36,25 @@
"discount_price": "Preço com desconto", "discount_price": "Preço com desconto",
"duration": "Duração (meses)", "duration": "Duração (meses)",
"inventory": "Estoque", "inventory": "Estoque",
"monthlyReset": "Reinicialização Mensal",
"name": "Nome", "name": "Nome",
"noLimit": "Sem limite", "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", "quota": "Quantidade limitada",
"renewalReset": "Reinicialização na Renovação",
"renewalResetDescription": "Reiniciar ciclo ao renovar",
"replacement": "Preço de reposição (cada vez)", "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", "selectSubscribeGroup": "Por favor, selecione o grupo de assinatura",
"selectUnitTime": "Por favor, selecione a unidade de tempo", "selectUnitTime": "Por favor, selecione a unidade de tempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"servers": "Servidores",
"speedLimit": "Limite de velocidade (Mbps)", "speedLimit": "Limite de velocidade (Mbps)",
"subscribeGroup": "Grupo de assinatura", "subscribeGroup": "Grupo de assinatura",
"traffic": "Tráfego", "traffic": "Tráfego",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grupo de Inscrição" "subscribeGroup": "Grupo de Inscrição"
}, },
"traffic": "tráfego", "traffic": "tráfego",
"unitPrice": "Preço/mês", "unitPrice": "Preço Unitário",
"updateSuccess": "Atualização bem-sucedida" "updateSuccess": "Atualização bem-sucedida"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Salvo com sucesso" "saveSuccess": "Salvo com sucesso"
}, },
"node": { "node": {
"addTimeSlot": "Adicionar Faixa de Horário",
"communicationKey": "Chave de Comunicação", "communicationKey": "Chave de Comunicação",
"communicationKeyDescription": "Chave para comunicação do nó, garantindo que os dados não sejam interceptados por terceiros", "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", "inputPlaceholder": "Por favor, insira",
"multiplier": "Multiplicador",
"nodePullInterval": "Intervalo de Extração do Nó", "nodePullInterval": "Intervalo de Extração do Nó",
"nodePullIntervalDescription": "Frequência com que o nó obtém dados do painel (segundos)", "nodePullIntervalDescription": "Frequência com que o nó obtém dados do painel (segundos)",
"nodePushInterval": "Intervalo de Envio do Nó", "nodePushInterval": "Intervalo de Envio do Nó",
"nodePushIntervalDescription": "Frequência com que o nó envia dados para o painel", "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": { "register": {
"emailSuffixWhitelist": "Lista branca de sufixos de e-mail", "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.", "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.", "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.", "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.", "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.", "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.", "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ă", "confirm": "Confirmă",
"edit": "Editează", "edit": "Editează",
"editSecurity": "Editează configurația de securitate", "editSecurity": "Editează configurația de securitate",
"enableRelay": "Activează retransmisia",
"enableTLS": "Activează TLS", "enableTLS": "Activează TLS",
"encryptionMethod": "Metodă de criptare", "encryptionMethod": "Metodă de criptare",
"flow": "Algoritm de control al fluxului", "flow": "Algoritm de control al fluxului",
@@ -65,7 +64,14 @@
"port": "Port server", "port": "Port server",
"protocol": "Protocol", "protocol": "Protocol",
"relayHost": "Adresă retransmisie", "relayHost": "Adresă retransmisie",
"relayMode": "Modul de Releu",
"relayModeOptions": {
"all": "Toate",
"none": "Niciunul",
"random": "Aleatoriu"
},
"relayPort": "Port retransmisie", "relayPort": "Port retransmisie",
"relayPrefix": "Prefix de Releu",
"remarks": "Observații", "remarks": "Observații",
"security": "Securitate", "security": "Securitate",
"securityConfig": "Configurație de securitate", "securityConfig": "Configurație de securitate",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Selectați metoda de criptare", "selectEncryptionMethod": "Selectați metoda de criptare",
"selectNodeGroup": "Selectați grupul de noduri", "selectNodeGroup": "Selectați grupul de noduri",
"selectProtocol": "Selectați protocolul", "selectProtocol": "Selectați protocolul",
"selectRelayMode": "Selectați Modul de Releu",
"serverAddr": "Adresă server", "serverAddr": "Adresă server",
"serverKey": "Cheie Server",
"serverName": "Nume serviciu", "serverName": "Nume serviciu",
"speedLimit": "Limită de viteză", "speedLimit": "Limită de viteză",
"speedLimitPlaceholder": "Nelimitat", "speedLimitPlaceholder": "Nelimitat",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Oră", "Hour": "Oră",
"Minute": "Minut", "Minute": "Minut",
"Month": "Lună", "Month": "Lună",
"NoLimit": "Fără limită",
"Year": "An", "Year": "An",
"annualReset": "Resetare Anuală",
"basic": "De Bază",
"cancel": "Anulează", "cancel": "Anulează",
"confirm": "Confirmă", "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", "description": "Descriere",
"deviceLimit": "Limită dispozitive", "deviceLimit": "Limită dispozitive",
"discount": "Reducere", "discount": "Reducere",
@@ -31,14 +36,25 @@
"discount_price": "Preț redus", "discount_price": "Preț redus",
"duration": "Durată (luni)", "duration": "Durată (luni)",
"inventory": "Stoc", "inventory": "Stoc",
"monthlyReset": "Resetare Lunară",
"name": "Nume", "name": "Nume",
"noLimit": "Fără limită", "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", "quota": "Limită de achiziție",
"renewalReset": "Resetare la Reînnoire",
"renewalResetDescription": "Resetează ciclul la reînnoire",
"replacement": "Preț de înlocuire (per dată)", "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", "selectSubscribeGroup": "Vă rugăm să selectați grupul de abonament",
"selectUnitTime": "Vă rugăm să selectați unitatea de timp", "selectUnitTime": "Vă rugăm să selectați unitatea de timp",
"server": "Server", "server": "Server",
"serverGroup": "Grup server", "serverGroup": "Grup server",
"servers": "Servere",
"speedLimit": "Limită de viteză (Mbps)", "speedLimit": "Limită de viteză (Mbps)",
"subscribeGroup": "Grup de abonament", "subscribeGroup": "Grup de abonament",
"traffic": "Trafic", "traffic": "Trafic",
@@ -83,6 +99,6 @@
"subscribeGroup": "Grup de abonare" "subscribeGroup": "Grup de abonare"
}, },
"traffic": "trafic", "traffic": "trafic",
"unitPrice": "Preț/lună", "unitPrice": "Preț unitar",
"updateSuccess": "Actualizare reușită" "updateSuccess": "Actualizare reușită"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Salvare reușită" "saveSuccess": "Salvare reușită"
}, },
"node": { "node": {
"addTimeSlot": "Adaugă Interval Orar",
"communicationKey": "Cheie de comunicare", "communicationKey": "Cheie de comunicare",
"communicationKeyDescription": "Cheia de comunicare a nodului, pentru a asigura că datele nu sunt interceptate de alții", "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", "inputPlaceholder": "Vă rugăm să introduceți",
"multiplier": "Multiplicator",
"nodePullInterval": "Interval de extragere a nodului", "nodePullInterval": "Interval de extragere a nodului",
"nodePullIntervalDescription": "Frecvența cu care nodul obține date de la panou (secunde)", "nodePullIntervalDescription": "Frecvența cu care nodul obține date de la panou (secunde)",
"nodePushInterval": "Interval de împingere a nodului", "nodePushInterval": "Interval de împingere a nodului",
"nodePushIntervalDescription": "Frecvența cu care nodul trimite date către panou", "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": { "register": {
"emailSuffixWhitelist": "Lista albă a sufixelor de e-mail", "emailSuffixWhitelist": "Lista albă a sufixelor de e-mail",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Купон уже использован, повторное использование невозможно.", "50002": "Купон уже использован, повторное использование невозможно.",
"60001": "Подписка истекла, пожалуйста, продлите её и используйте снова.", "60001": "Подписка истекла, пожалуйста, продлите её и используйте снова.",
"60002": "Подписка временно недоступна, пожалуйста, попробуйте позже.", "60002": "Подписка временно недоступна, пожалуйста, попробуйте позже.",
"60003": "Обнаружена существующая подписка. Пожалуйста, отмените ее перед продолжением.",
"60004": "Невозможно удалить в данный момент, так как у подписки есть активные пользователи.",
"70001": "Код подтверждения неверен, пожалуйста, введите его снова.", "70001": "Код подтверждения неверен, пожалуйста, введите его снова.",
"80001": "Задача не была успешно добавлена в очередь, пожалуйста, попробуйте позже.", "80001": "Задача не была успешно добавлена в очередь, пожалуйста, попробуйте позже.",
"90001": "Пожалуйста, отключите режим DEBUG и попробуйте снова.", "90001": "Пожалуйста, отключите режим DEBUG и попробуйте снова.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Подтвердить", "confirm": "Подтвердить",
"edit": "Редактировать", "edit": "Редактировать",
"editSecurity": "Редактировать настройки безопасности", "editSecurity": "Редактировать настройки безопасности",
"enableRelay": "Включить реле",
"enableTLS": "Включить TLS", "enableTLS": "Включить TLS",
"encryptionMethod": "Метод шифрования", "encryptionMethod": "Метод шифрования",
"flow": "Алгоритм управления потоком", "flow": "Алгоритм управления потоком",
@@ -65,7 +64,14 @@
"port": "Порт сервера", "port": "Порт сервера",
"protocol": "Протокол", "protocol": "Протокол",
"relayHost": "Адрес реле", "relayHost": "Адрес реле",
"relayMode": "Режим ретрансляции",
"relayModeOptions": {
"all": "Все",
"none": "Нет",
"random": "Случайный"
},
"relayPort": "Порт реле", "relayPort": "Порт реле",
"relayPrefix": "Префикс ретрансляции",
"remarks": "Примечания", "remarks": "Примечания",
"security": "Безопасность", "security": "Безопасность",
"securityConfig": "Настройки безопасности", "securityConfig": "Настройки безопасности",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Выберите метод шифрования", "selectEncryptionMethod": "Выберите метод шифрования",
"selectNodeGroup": "Выберите группу узлов", "selectNodeGroup": "Выберите группу узлов",
"selectProtocol": "Выберите протокол", "selectProtocol": "Выберите протокол",
"selectRelayMode": "Выберите режим ретрансляции",
"serverAddr": "Адрес сервера", "serverAddr": "Адрес сервера",
"serverKey": "Ключ сервера",
"serverName": "Имя сервера", "serverName": "Имя сервера",
"speedLimit": "Ограничение скорости", "speedLimit": "Ограничение скорости",
"speedLimitPlaceholder": "Без ограничений", "speedLimitPlaceholder": "Без ограничений",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Час", "Hour": "Час",
"Minute": "Минута", "Minute": "Минута",
"Month": "Месяц", "Month": "Месяц",
"NoLimit": "Без ограничений",
"Year": "Год", "Year": "Год",
"annualReset": "Ежегодный Сброс",
"basic": "Основной",
"cancel": "Отмена", "cancel": "Отмена",
"confirm": "Подтвердить", "confirm": "Подтвердить",
"deductionRatio": "Автоматическая/Ручная Конфигурация Вычетов",
"deductionRatioDescription": "Используется для вычетов. По умолчанию система использует алгоритм автоматического расчета. Когда предоставляется ручное соотношение, система рассчитывает пропорции на основе времени и трафика, обеспечивая, чтобы сумма составляла 100%.",
"description": "Описание", "description": "Описание",
"deviceLimit": "Ограничение устройств", "deviceLimit": "Ограничение устройств",
"discount": "Скидка", "discount": "Скидка",
@@ -31,14 +36,25 @@
"discount_price": "Цена со скидкой", "discount_price": "Цена со скидкой",
"duration": "Продолжительность (месяцы)", "duration": "Продолжительность (месяцы)",
"inventory": "Инвентарь", "inventory": "Инвентарь",
"monthlyReset": "Ежемесячный Сброс",
"name": "Название", "name": "Название",
"noLimit": "Без ограничений", "noLimit": "Без ограничений",
"noReset": "Без Сброса",
"pricing": "Цены",
"purchaseWithDiscount": "Разрешить Вычет",
"purchaseWithDiscountDescription": "Включить или отключить функцию вычета. При включении система будет обрабатывать вычеты на основе настроенных правил и соотношений",
"quota": "Лимит покупки", "quota": "Лимит покупки",
"renewalReset": "Сброс при Обновлении",
"renewalResetDescription": "Сброс цикла при обновлении",
"replacement": "Цена замены (за раз)", "replacement": "Цена замены (за раз)",
"resetCycle": "Цикл Сброса",
"resetOn1st": "Сброс 1-го числа",
"selectResetCycle": "Пожалуйста, выберите цикл сброса",
"selectSubscribeGroup": "Пожалуйста, выберите группу подписки", "selectSubscribeGroup": "Пожалуйста, выберите группу подписки",
"selectUnitTime": "Пожалуйста, выберите единицу времени", "selectUnitTime": "Пожалуйста, выберите единицу времени",
"server": "Сервер", "server": "Сервер",
"serverGroup": "Группа серверов", "serverGroup": "Группа серверов",
"servers": "Серверы",
"speedLimit": "Ограничение скорости (Мбит/с)", "speedLimit": "Ограничение скорости (Мбит/с)",
"subscribeGroup": "Группа подписки", "subscribeGroup": "Группа подписки",
"traffic": "Трафик", "traffic": "Трафик",
@@ -83,6 +99,6 @@
"subscribeGroup": "Группа подписок" "subscribeGroup": "Группа подписок"
}, },
"traffic": "трафик", "traffic": "трафик",
"unitPrice": "Цена/месяц", "unitPrice": "Цена за единицу",
"updateSuccess": "Обновление успешно" "updateSuccess": "Обновление успешно"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Успешно сохранено" "saveSuccess": "Успешно сохранено"
}, },
"node": { "node": {
"addTimeSlot": "Добавить временной интервал",
"communicationKey": "Ключ связи", "communicationKey": "Ключ связи",
"communicationKeyDescription": "Ключ для связи узла, чтобы гарантировать, что данные не будут перехвачены другими", "communicationKeyDescription": "Ключ для связи узла, чтобы гарантировать, что данные не будут перехвачены другими",
"delete": "Удалить",
"dynamicMultiplier": "Динамический множитель",
"dynamicMultiplierDescription": "Динамический множитель относится к обработке переданных данных с различными множителями для разных узлов в разные периоды времени.",
"endTime": "Время окончания",
"inputPlaceholder": "Пожалуйста, введите", "inputPlaceholder": "Пожалуйста, введите",
"multiplier": "Множитель",
"nodePullInterval": "Интервал извлечения узла", "nodePullInterval": "Интервал извлечения узла",
"nodePullIntervalDescription": "Частота, с которой узел получает данные с панели (в секундах)", "nodePullIntervalDescription": "Частота, с которой узел получает данные с панели (в секундах)",
"nodePushInterval": "Интервал отправки узла", "nodePushInterval": "Интервал отправки узла",
"nodePushIntervalDescription": "Частота, с которой узел отправляет данные на панель", "nodePushIntervalDescription": "Частота, с которой узел отправляет данные на панель",
"saveSuccess": "Успешно сохранено" "reset": "Сбросить",
"save": "Сохранить",
"saveSuccess": "Успешно сохранено",
"startTime": "Время начала",
"timeSlot": "Временной интервал"
}, },
"register": { "register": {
"emailSuffixWhitelist": "Белый список суффиксов электронной почты", "emailSuffixWhitelist": "Белый список суффиксов электронной почты",
+2
View File
@@ -42,6 +42,8 @@
"50002": "คูปองนี้ถูกใช้ไปแล้ว ไม่สามารถใช้ซ้ำได้", "50002": "คูปองนี้ถูกใช้ไปแล้ว ไม่สามารถใช้ซ้ำได้",
"60001": "การสมัครสมาชิกหมดอายุ กรุณาต่ออายุและใช้งานใหม่", "60001": "การสมัครสมาชิกหมดอายุ กรุณาต่ออายุและใช้งานใหม่",
"60002": "ไม่สามารถใช้การสมัครสมาชิกนี้ได้ในขณะนี้ กรุณาลองใหม่อีกครั้งในภายหลัง", "60002": "ไม่สามารถใช้การสมัครสมาชิกนี้ได้ในขณะนี้ กรุณาลองใหม่อีกครั้งในภายหลัง",
"60003": "ตรวจพบการสมัครสมาชิกที่มีอยู่ กรุณายกเลิกก่อนดำเนินการต่อ",
"60004": "ไม่สามารถลบได้ในขณะนี้เนื่องจากการสมัครมีผู้ใช้ที่ใช้งานอยู่",
"70001": "รหัสยืนยันไม่ถูกต้อง กรุณาป้อนใหม่อีกครั้ง", "70001": "รหัสยืนยันไม่ถูกต้อง กรุณาป้อนใหม่อีกครั้ง",
"80001": "งานไม่สำเร็จในการเข้าคิว กรุณาลองใหม่อีกครั้งในภายหลัง", "80001": "งานไม่สำเร็จในการเข้าคิว กรุณาลองใหม่อีกครั้งในภายหลัง",
"90001": "กรุณาปิดโหมด DEBUG ก่อนลองใหม่อีกครั้ง", "90001": "กรุณาปิดโหมด DEBUG ก่อนลองใหม่อีกครั้ง",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "ยืนยัน", "confirm": "ยืนยัน",
"edit": "แก้ไข", "edit": "แก้ไข",
"editSecurity": "แก้ไขการตั้งค่าความปลอดภัย", "editSecurity": "แก้ไขการตั้งค่าความปลอดภัย",
"enableRelay": "เปิดใช้งานรีเลย์",
"enableTLS": "เปิดใช้งานTLS", "enableTLS": "เปิดใช้งานTLS",
"encryptionMethod": "วิธีการเข้ารหัส", "encryptionMethod": "วิธีการเข้ารหัส",
"flow": "อัลกอริทึมควบคุมการไหล", "flow": "อัลกอริทึมควบคุมการไหล",
@@ -65,7 +64,14 @@
"port": "พอร์ตบริการ", "port": "พอร์ตบริการ",
"protocol": "โปรโตคอล", "protocol": "โปรโตคอล",
"relayHost": "ที่อยู่รีเลย์", "relayHost": "ที่อยู่รีเลย์",
"relayMode": "โหมดรีเลย์",
"relayModeOptions": {
"all": "ทั้งหมด",
"none": "ไม่มี",
"random": "สุ่ม"
},
"relayPort": "พอร์ตรรีเลย์", "relayPort": "พอร์ตรรีเลย์",
"relayPrefix": "คำนำหน้ารีเลย์",
"remarks": "หมายเหตุ", "remarks": "หมายเหตุ",
"security": "ความปลอดภัย", "security": "ความปลอดภัย",
"securityConfig": "การตั้งค่าความปลอดภัย", "securityConfig": "การตั้งค่าความปลอดภัย",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "เลือกวิธีการเข้ารหัส", "selectEncryptionMethod": "เลือกวิธีการเข้ารหัส",
"selectNodeGroup": "เลือกกลุ่มโหนด", "selectNodeGroup": "เลือกกลุ่มโหนด",
"selectProtocol": "เลือกโปรโตคอล", "selectProtocol": "เลือกโปรโตคอล",
"selectRelayMode": "เลือกโหมดรีเลย์",
"serverAddr": "ที่อยู่เซิร์ฟเวอร์", "serverAddr": "ที่อยู่เซิร์ฟเวอร์",
"serverKey": "คีย์เซิร์ฟเวอร์",
"serverName": "ชื่อบริการ", "serverName": "ชื่อบริการ",
"speedLimit": "จำกัดความเร็ว", "speedLimit": "จำกัดความเร็ว",
"speedLimitPlaceholder": "ไม่จำกัด", "speedLimitPlaceholder": "ไม่จำกัด",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "ชั่วโมง", "Hour": "ชั่วโมง",
"Minute": "นาที", "Minute": "นาที",
"Month": "เดือน", "Month": "เดือน",
"NoLimit": "ไม่จำกัด",
"Year": "ปี", "Year": "ปี",
"annualReset": "รีเซ็ตทุกปี",
"basic": "พื้นฐาน",
"cancel": "ยกเลิก", "cancel": "ยกเลิก",
"confirm": "ยืนยัน", "confirm": "ยืนยัน",
"deductionRatio": "การตั้งค่าการหักอัตโนมัติ/ด้วยตนเอง",
"deductionRatioDescription": "ใช้สำหรับการหัก โดยค่าเริ่มต้น ระบบจะใช้วิธีการคำนวณอัตโนมัติ เมื่อมีการกำหนดอัตราส่วนด้วยตนเอง ระบบจะคำนวณสัดส่วนตามเวลาและอัตราการใช้งาน เพื่อให้มั่นใจว่ายอดรวมเท่ากับ 100%",
"description": "คำอธิบาย", "description": "คำอธิบาย",
"deviceLimit": "จำกัดอุปกรณ์", "deviceLimit": "จำกัดอุปกรณ์",
"discount": "ส่วนลด", "discount": "ส่วนลด",
@@ -31,14 +36,25 @@
"discount_price": "ราคาหลังหักส่วนลด", "discount_price": "ราคาหลังหักส่วนลด",
"duration": "ระยะเวลา (เดือน)", "duration": "ระยะเวลา (เดือน)",
"inventory": "สต็อก", "inventory": "สต็อก",
"monthlyReset": "รีเซ็ตทุกเดือน",
"name": "ชื่อ", "name": "ชื่อ",
"noLimit": "ไม่จำกัด", "noLimit": "ไม่จำกัด",
"noReset": "ไม่รีเซ็ต",
"pricing": "การตั้งราคา",
"purchaseWithDiscount": "อนุญาตให้หัก",
"purchaseWithDiscountDescription": "เปิดหรือปิดฟีเจอร์การหัก เมื่อเปิดใช้งาน ระบบจะดำเนินการหักตามกฎและอัตราส่วนที่กำหนดไว้",
"quota": "จำนวนจำกัดการซื้อ", "quota": "จำนวนจำกัดการซื้อ",
"renewalReset": "รีเซ็ตเมื่อมีการต่ออายุ",
"renewalResetDescription": "รีเซ็ตรอบเมื่อมีการต่ออายุ",
"replacement": "ราคารีเซ็ต (ต่อครั้ง)", "replacement": "ราคารีเซ็ต (ต่อครั้ง)",
"resetCycle": "รอบการรีเซ็ต",
"resetOn1st": "รีเซ็ตในวันที่ 1",
"selectResetCycle": "กรุณาเลือกรอบการรีเซ็ต",
"selectSubscribeGroup": "กรุณาเลือกกลุ่มการสมัครสมาชิก", "selectSubscribeGroup": "กรุณาเลือกกลุ่มการสมัครสมาชิก",
"selectUnitTime": "กรุณาเลือกหน่วยเวลา", "selectUnitTime": "กรุณาเลือกหน่วยเวลา",
"server": "เซิร์ฟเวอร์", "server": "เซิร์ฟเวอร์",
"serverGroup": "กลุ่มเซิร์ฟเวอร์", "serverGroup": "กลุ่มเซิร์ฟเวอร์",
"servers": "เซิร์ฟเวอร์",
"speedLimit": "จำกัดความเร็ว (Mbps)", "speedLimit": "จำกัดความเร็ว (Mbps)",
"subscribeGroup": "กลุ่มการสมัครสมาชิก", "subscribeGroup": "กลุ่มการสมัครสมาชิก",
"traffic": "ปริมาณข้อมูล", "traffic": "ปริมาณข้อมูล",
@@ -83,6 +99,6 @@
"subscribeGroup": "กลุ่มสมัครสมาชิก" "subscribeGroup": "กลุ่มสมัครสมาชิก"
}, },
"traffic": "การจราจร", "traffic": "การจราจร",
"unitPrice": "ราคา/เดือน", "unitPrice": "ราคาต่อหน่วย",
"updateSuccess": "อัปเดตสำเร็จ" "updateSuccess": "อัปเดตสำเร็จ"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "บันทึกสำเร็จ" "saveSuccess": "บันทึกสำเร็จ"
}, },
"node": { "node": {
"addTimeSlot": "เพิ่มช่วงเวลา",
"communicationKey": "คีย์การสื่อสาร", "communicationKey": "คีย์การสื่อสาร",
"communicationKeyDescription": "คีย์สำหรับการสื่อสารของโหนด เพื่อให้มั่นใจว่าข้อมูลจะไม่ถูกดักจับโดยผู้อื่น", "communicationKeyDescription": "คีย์สำหรับการสื่อสารของโหนด เพื่อให้มั่นใจว่าข้อมูลจะไม่ถูกดักจับโดยผู้อื่น",
"delete": "ลบ",
"dynamicMultiplier": "ตัวคูณแบบไดนามิก",
"dynamicMultiplierDescription": "ตัวคูณแบบไดนามิกหมายถึงการประมวลผลข้อมูลที่ถูกส่งด้วยตัวคูณที่แตกต่างกันสำหรับโหนดต่างๆ ในช่วงเวลาที่แตกต่างกัน",
"endTime": "เวลาสิ้นสุด",
"inputPlaceholder": "กรุณาใส่ข้อมูล", "inputPlaceholder": "กรุณาใส่ข้อมูล",
"multiplier": "ตัวคูณ",
"nodePullInterval": "ช่วงเวลาการดึงข้อมูลของโหนด", "nodePullInterval": "ช่วงเวลาการดึงข้อมูลของโหนด",
"nodePullIntervalDescription": "ความถี่ที่โหนดดึงข้อมูลจากแผงควบคุม (วินาที)", "nodePullIntervalDescription": "ความถี่ที่โหนดดึงข้อมูลจากแผงควบคุม (วินาที)",
"nodePushInterval": "ช่วงเวลาการส่งข้อมูลของโหนด", "nodePushInterval": "ช่วงเวลาการส่งข้อมูลของโหนด",
"nodePushIntervalDescription": "ความถี่ที่โหนดส่งข้อมูลไปยังแผงควบคุม", "nodePushIntervalDescription": "ความถี่ที่โหนดส่งข้อมูลไปยังแผงควบคุม",
"saveSuccess": "บันทึกสำเร็จ" "reset": "รีเซ็ต",
"save": "บันทึก",
"saveSuccess": "บันทึกสำเร็จ",
"startTime": "เวลาเริ่มต้น",
"timeSlot": "ช่วงเวลา"
}, },
"register": { "register": {
"emailSuffixWhitelist": "รายการอนุญาตโดเมนอีเมล", "emailSuffixWhitelist": "รายการอนุญาตโดเมนอีเมล",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Bu kupon zaten kullanıldı, tekrar kullanılamaz.", "50002": "Bu kupon zaten kullanıldı, tekrar kullanılamaz.",
"60001": "Abonelik süresi doldu, lütfen yenileyip tekrar kullanın.", "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.", "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.", "70001": "Doğrulama kodu hatalı, lütfen tekrar girin.",
"80001": "Görev kuyruğa başarıyla eklenemedi, lütfen daha sonra tekrar deneyin.", "80001": "Görev kuyruğa başarıyla eklenemedi, lütfen daha sonra tekrar deneyin.",
"90001": "Lütfen DEBUG modunu kapatıp tekrar deneyin.", "90001": "Lütfen DEBUG modunu kapatıp tekrar deneyin.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Onayla", "confirm": "Onayla",
"edit": "Düzenle", "edit": "Düzenle",
"editSecurity": "Güvenlik Ayarlarını Düzenle", "editSecurity": "Güvenlik Ayarlarını Düzenle",
"enableRelay": "Röleyi Etkinleştir",
"enableTLS": "TLS'i Etkinleştir", "enableTLS": "TLS'i Etkinleştir",
"encryptionMethod": "Şifreleme Yöntemi", "encryptionMethod": "Şifreleme Yöntemi",
"flow": "Akış Kontrol Algoritması", "flow": "Akış Kontrol Algoritması",
@@ -65,7 +64,14 @@
"port": "Sunucu Portu", "port": "Sunucu Portu",
"protocol": "Protokol", "protocol": "Protokol",
"relayHost": "Röle Adresi", "relayHost": "Röle Adresi",
"relayMode": "Röle Modu",
"relayModeOptions": {
"all": "Tümü",
"none": "Hiçbiri",
"random": "Rastgele"
},
"relayPort": "Röle Portu", "relayPort": "Röle Portu",
"relayPrefix": "Röle Öneki",
"remarks": "Açıklamalar", "remarks": "Açıklamalar",
"security": "Güvenlik", "security": "Güvenlik",
"securityConfig": "Güvenlik Ayarları", "securityConfig": "Güvenlik Ayarları",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Şifreleme Yöntemi Seç", "selectEncryptionMethod": "Şifreleme Yöntemi Seç",
"selectNodeGroup": "Düğüm Grubu Seç", "selectNodeGroup": "Düğüm Grubu Seç",
"selectProtocol": "Protokol Seç", "selectProtocol": "Protokol Seç",
"selectRelayMode": "Röle Modunu Seçin",
"serverAddr": "Sunucu Adresi", "serverAddr": "Sunucu Adresi",
"serverKey": "Sunucu Anahtarı",
"serverName": "Sunucu Adı", "serverName": "Sunucu Adı",
"speedLimit": "Hız Sınırı", "speedLimit": "Hız Sınırı",
"speedLimitPlaceholder": "Sınırsız", "speedLimitPlaceholder": "Sınırsız",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Saat", "Hour": "Saat",
"Minute": "Dakika", "Minute": "Dakika",
"Month": "Ay", "Month": "Ay",
"NoLimit": "Sınırsız",
"Year": "Yıl", "Year": "Yıl",
"annualReset": "Yıllık Sıfırlama",
"basic": "Temel",
"cancel": "İptal", "cancel": "İptal",
"confirm": "Onayla", "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", "description": "Açıklama",
"deviceLimit": "Cihaz Sınırı", "deviceLimit": "Cihaz Sınırı",
"discount": "İndirim", "discount": "İndirim",
@@ -31,14 +36,25 @@
"discount_price": "İndirimli Fiyat", "discount_price": "İndirimli Fiyat",
"duration": "Süre (ay)", "duration": "Süre (ay)",
"inventory": "Stok", "inventory": "Stok",
"monthlyReset": "Aylık Sıfırlama",
"name": "Ad", "name": "Ad",
"noLimit": "Sınırsız", "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", "quota": "Satın Alma Limiti",
"renewalReset": "Yenileme Sıfırlaması",
"renewalResetDescription": "Yenileme üzerine sıfırlama döngüsü",
"replacement": "Yenileme Ücreti (her seferinde)", "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", "selectSubscribeGroup": "Abonelik Grubunu Seçiniz",
"selectUnitTime": "Lütfen birim zamanı seçin", "selectUnitTime": "Lütfen birim zamanı seçin",
"server": "Sunucu", "server": "Sunucu",
"serverGroup": "Sunucu Grubu", "serverGroup": "Sunucu Grubu",
"servers": "Sunucular",
"speedLimit": "Hız Sınırı (Mbps)", "speedLimit": "Hız Sınırı (Mbps)",
"subscribeGroup": "Abonelik Grubu", "subscribeGroup": "Abonelik Grubu",
"traffic": "Trafik", "traffic": "Trafik",
@@ -83,6 +99,6 @@
"subscribeGroup": "Abone Grubu" "subscribeGroup": "Abone Grubu"
}, },
"traffic": "trafik", "traffic": "trafik",
"unitPrice": "Fiyat/ay", "unitPrice": "Birim Fiyatı",
"updateSuccess": "Güncelleme başarılı" "updateSuccess": "Güncelleme başarılı"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Başarıyla kaydedildi" "saveSuccess": "Başarıyla kaydedildi"
}, },
"node": { "node": {
"addTimeSlot": "Zaman Dilimi Ekle",
"communicationKey": "İletişim Anahtarı", "communicationKey": "İletişim Anahtarı",
"communicationKeyDescription": "Verilerin başkaları tarafından ele geçirilmemesini sağlamak için düğüm iletiş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", "inputPlaceholder": "Lütfen giriniz",
"multiplier": "Çarpan",
"nodePullInterval": "Düğüm Çekme Aralığı", "nodePullInterval": "Düğüm Çekme Aralığı",
"nodePullIntervalDescription": "Düğümün panelden veri alma sıklığı (saniye)", "nodePullIntervalDescription": "Düğümün panelden veri alma sıklığı (saniye)",
"nodePushInterval": "Düğüm Gönderme Aralığı", "nodePushInterval": "Düğüm Gönderme Aralığı",
"nodePushIntervalDescription": "Düğümün verileri panele gönderme sıklığı", "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": { "register": {
"emailSuffixWhitelist": "E-posta Soneki Beyaz Listesi", "emailSuffixWhitelist": "E-posta Soneki Beyaz Listesi",
+2
View File
@@ -42,6 +42,8 @@
"50002": "Цей купон вже використано, повторне використання неможливе.", "50002": "Цей купон вже використано, повторне використання неможливе.",
"60001": "Підписка закінчилася, поновіть її, щоб продовжити використання.", "60001": "Підписка закінчилася, поновіть її, щоб продовжити використання.",
"60002": "Тимчасово неможливо використовувати цю підписку, спробуйте пізніше.", "60002": "Тимчасово неможливо використовувати цю підписку, спробуйте пізніше.",
"60003": "Виявлено існуючу підписку. Будь ласка, скасуйте її перед продовженням.",
"60004": "Неможливо видалити, оскільки підписка має активних користувачів.",
"70001": "Код перевірки неправильний, введіть його знову.", "70001": "Код перевірки неправильний, введіть його знову.",
"80001": "Завдання не вдалося додати до черги, спробуйте пізніше.", "80001": "Завдання не вдалося додати до черги, спробуйте пізніше.",
"90001": "Вимкніть режим DEBUG і спробуйте знову.", "90001": "Вимкніть режим DEBUG і спробуйте знову.",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "Підтвердити", "confirm": "Підтвердити",
"edit": "Редагувати", "edit": "Редагувати",
"editSecurity": "Редагувати налаштування безпеки", "editSecurity": "Редагувати налаштування безпеки",
"enableRelay": "Увімкнути реле",
"enableTLS": "Увімкнути TLS", "enableTLS": "Увімкнути TLS",
"encryptionMethod": "Метод шифрування", "encryptionMethod": "Метод шифрування",
"flow": "Алгоритм контролю потоку", "flow": "Алгоритм контролю потоку",
@@ -65,7 +64,14 @@
"port": "Порт сервера", "port": "Порт сервера",
"protocol": "Протокол", "protocol": "Протокол",
"relayHost": "Адреса реле", "relayHost": "Адреса реле",
"relayMode": "Режим ретрансляції",
"relayModeOptions": {
"all": "Всі",
"none": "Немає",
"random": "Випадковий"
},
"relayPort": "Порт реле", "relayPort": "Порт реле",
"relayPrefix": "Префікс ретрансляції",
"remarks": "Примітки", "remarks": "Примітки",
"security": "Безпека", "security": "Безпека",
"securityConfig": "Налаштування безпеки", "securityConfig": "Налаштування безпеки",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "Виберіть метод шифрування", "selectEncryptionMethod": "Виберіть метод шифрування",
"selectNodeGroup": "Виберіть групу вузлів", "selectNodeGroup": "Виберіть групу вузлів",
"selectProtocol": "Виберіть протокол", "selectProtocol": "Виберіть протокол",
"selectRelayMode": "Виберіть режим ретрансляції",
"serverAddr": "Адреса сервера", "serverAddr": "Адреса сервера",
"serverKey": "Ключ сервера",
"serverName": "Назва сервісу", "serverName": "Назва сервісу",
"speedLimit": "Обмеження швидкості", "speedLimit": "Обмеження швидкості",
"speedLimitPlaceholder": "Без обмежень", "speedLimitPlaceholder": "Без обмежень",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Година", "Hour": "Година",
"Minute": "Хвилина", "Minute": "Хвилина",
"Month": "Місяць", "Month": "Місяць",
"NoLimit": "Без обмежень",
"Year": "Рік", "Year": "Рік",
"annualReset": "Щорічне Скидання",
"basic": "Основний",
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Підтвердити", "confirm": "Підтвердити",
"deductionRatio": "Автоматична/Ручна Конфігурація Вирахувань",
"deductionRatioDescription": "Використовується для вирахувань. За замовчуванням система використовує автоматичний алгоритм розрахунку. Коли надається ручне співвідношення, система розраховує пропорції на основі часу та трафіку, забезпечуючи загальну суму в 100%.",
"description": "Опис", "description": "Опис",
"deviceLimit": "Обмеження пристроїв", "deviceLimit": "Обмеження пристроїв",
"discount": "Знижка", "discount": "Знижка",
@@ -31,14 +36,25 @@
"discount_price": "Ціна зі знижкою", "discount_price": "Ціна зі знижкою",
"duration": "Тривалість (місяці)", "duration": "Тривалість (місяці)",
"inventory": "Запаси", "inventory": "Запаси",
"monthlyReset": "Щомісячне Скидання",
"name": "Назва", "name": "Назва",
"noLimit": "Без обмежень", "noLimit": "Без обмежень",
"noReset": "Без Скидання",
"pricing": "Ціноутворення",
"purchaseWithDiscount": "Дозволити Вирахування",
"purchaseWithDiscountDescription": "Увімкнути або вимкнути функцію вирахувань. Коли увімкнено, система обробляє вирахування на основі налаштованих правил і співвідношень",
"quota": "Ліміт покупки", "quota": "Ліміт покупки",
"renewalReset": "Скидання при Поновленні",
"renewalResetDescription": "Скидання циклу при поновленні",
"replacement": "Ціна заміни (за раз)", "replacement": "Ціна заміни (за раз)",
"resetCycle": "Цикл Скидання",
"resetOn1st": "Скидання 1-го числа",
"selectResetCycle": "Будь ласка, виберіть цикл скидання",
"selectSubscribeGroup": "Будь ласка, виберіть групу підписки", "selectSubscribeGroup": "Будь ласка, виберіть групу підписки",
"selectUnitTime": "Будь ласка, виберіть одиницю часу", "selectUnitTime": "Будь ласка, виберіть одиницю часу",
"server": "Сервер", "server": "Сервер",
"serverGroup": "Група серверів", "serverGroup": "Група серверів",
"servers": "Сервери",
"speedLimit": "Обмеження швидкості (Мбіт/с)", "speedLimit": "Обмеження швидкості (Мбіт/с)",
"subscribeGroup": "Група підписки", "subscribeGroup": "Група підписки",
"traffic": "Трафік", "traffic": "Трафік",
@@ -83,6 +99,6 @@
"subscribeGroup": "Група підписок" "subscribeGroup": "Група підписок"
}, },
"traffic": "Трафік", "traffic": "Трафік",
"unitPrice": "Ціна/місяць", "unitPrice": "Ціна за одиницю",
"updateSuccess": "Оновлення успішне" "updateSuccess": "Оновлення успішне"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Успішно збережено" "saveSuccess": "Успішно збережено"
}, },
"node": { "node": {
"addTimeSlot": "Додати часовий проміжок",
"communicationKey": "Ключ зв'язку", "communicationKey": "Ключ зв'язку",
"communicationKeyDescription": "Ключ для зв'язку вузла, щоб забезпечити захист даних від перехоплення", "communicationKeyDescription": "Ключ для зв'язку вузла, щоб забезпечити захист даних від перехоплення",
"delete": "Видалити",
"dynamicMultiplier": "Динамічний Множник",
"dynamicMultiplierDescription": "Динамічний множник відноситься до обробки переданих даних з різними множниками для різних вузлів протягом різних періодів часу.",
"endTime": "Час Закінчення",
"inputPlaceholder": "Будь ласка, введіть", "inputPlaceholder": "Будь ласка, введіть",
"multiplier": "Множник",
"nodePullInterval": "Інтервал отримання вузла", "nodePullInterval": "Інтервал отримання вузла",
"nodePullIntervalDescription": "Частота отримання даних вузлом з панелі (в секундах)", "nodePullIntervalDescription": "Частота отримання даних вузлом з панелі (в секундах)",
"nodePushInterval": "Інтервал відправки вузла", "nodePushInterval": "Інтервал відправки вузла",
"nodePushIntervalDescription": "Частота відправки даних вузлом на панель", "nodePushIntervalDescription": "Частота відправки даних вузлом на панель",
"saveSuccess": "Збережено успішно" "reset": "Скинути",
"save": "Зберегти",
"saveSuccess": "Збережено успішно",
"startTime": "Час Початку",
"timeSlot": "Часовий проміжок"
}, },
"register": { "register": {
"emailSuffixWhitelist": "Білий список суфіксів електронної пошти", "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.", "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.", "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.", "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.", "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.", "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.", "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", "confirm": "Xác nhận",
"edit": "Chỉnh sửa", "edit": "Chỉnh sửa",
"editSecurity": "Chỉnh sửa cấu hình bảo mật", "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", "enableTLS": "Kích hoạt TLS",
"encryptionMethod": "Phương pháp mã hóa", "encryptionMethod": "Phương pháp mã hóa",
"flow": "Thuật toán điều khiển luồng", "flow": "Thuật toán điều khiển luồng",
@@ -65,7 +64,14 @@
"port": "Cổng dịch vụ", "port": "Cổng dịch vụ",
"protocol": "Giao thức", "protocol": "Giao thức",
"relayHost": "Địa chỉ chuyển tiếp", "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", "relayPort": "Cổng chuyển tiếp",
"relayPrefix": "Tiền Tố Tiếp Sức",
"remarks": "Ghi chú", "remarks": "Ghi chú",
"security": "Bảo mật", "security": "Bảo mật",
"securityConfig": "Cấu hình 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", "selectEncryptionMethod": "Chọn phương pháp mã hóa",
"selectNodeGroup": "Chọn nhóm nút", "selectNodeGroup": "Chọn nhóm nút",
"selectProtocol": "Chọn giao thức", "selectProtocol": "Chọn giao thức",
"selectRelayMode": "Chọn Chế Độ Tiếp Sức",
"serverAddr": "Địa chỉ máy chủ", "serverAddr": "Địa chỉ máy chủ",
"serverKey": "Khóa Máy Chủ",
"serverName": "Tên dịch vụ", "serverName": "Tên dịch vụ",
"speedLimit": "Giới hạn tốc độ", "speedLimit": "Giới hạn tốc độ",
"speedLimitPlaceholder": "Không giới hạn", "speedLimitPlaceholder": "Không giới hạn",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "Giờ", "Hour": "Giờ",
"Minute": "Phút", "Minute": "Phút",
"Month": "Tháng", "Month": "Tháng",
"NoLimit": "Không Giới Hạn",
"Year": "Năm", "Year": "Năm",
"annualReset": "Đặt Lại Hàng Năm",
"basic": "Cơ Bản",
"cancel": "Hủy", "cancel": "Hủy",
"confirm": "Xác nhận", "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ả", "description": "Mô tả",
"deviceLimit": "Giới hạn thiết bị", "deviceLimit": "Giới hạn thiết bị",
"discount": "Giảm giá", "discount": "Giảm giá",
@@ -31,14 +36,25 @@
"discount_price": "Giá sau giảm", "discount_price": "Giá sau giảm",
"duration": "Thời gian (tháng)", "duration": "Thời gian (tháng)",
"inventory": "Tồn kho", "inventory": "Tồn kho",
"monthlyReset": "Đặt Lại Hàng Tháng",
"name": "Tên", "name": "Tên",
"noLimit": "Không giới hạ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", "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)", "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ý", "selectSubscribeGroup": "Vui lòng chọn nhóm đăng ký",
"selectUnitTime": "Vui lòng chọn đơn vị thời gian", "selectUnitTime": "Vui lòng chọn đơn vị thời gian",
"server": "Dịch vụ", "server": "Dịch vụ",
"serverGroup": "Nhóm dịch vụ", "serverGroup": "Nhóm dịch vụ",
"servers": "Máy Chủ",
"speedLimit": "Giới hạn tốc độ (Mbps)", "speedLimit": "Giới hạn tốc độ (Mbps)",
"subscribeGroup": "Nhóm đăng ký", "subscribeGroup": "Nhóm đăng ký",
"traffic": "Lưu lượng", "traffic": "Lưu lượng",
@@ -83,6 +99,6 @@
"subscribeGroup": "Nhóm đăng ký" "subscribeGroup": "Nhóm đăng ký"
}, },
"traffic": "lưu lượng", "traffic": "lưu lượng",
"unitPrice": "Giá/tháng", "unitPrice": "Đơn giá",
"updateSuccess": "Cập nhật thành công" "updateSuccess": "Cập nhật thành công"
} }
+11 -1
View File
@@ -45,14 +45,24 @@
"saveSuccess": "Lưu thành công" "saveSuccess": "Lưu thành công"
}, },
"node": { "node": {
"addTimeSlot": "Thêm Khung Giờ",
"communicationKey": "Khóa giao tiếp", "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", "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", "inputPlaceholder": "Vui lòng nhập",
"multiplier": "Hệ số",
"nodePullInterval": "Khoảng thời gian kéo nút", "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)", "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", "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", "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": { "register": {
"emailSuffixWhitelist": "Danh sách trắng hậu tố email", "emailSuffixWhitelist": "Danh sách trắng hậu tố email",
+2
View File
@@ -42,6 +42,8 @@
"50002": "该优惠券已被使用,无法重复使用。", "50002": "该优惠券已被使用,无法重复使用。",
"60001": "订阅已过期,请续订后再使用。", "60001": "订阅已过期,请续订后再使用。",
"60002": "暂时无法使用该订阅,请稍后再试。", "60002": "暂时无法使用该订阅,请稍后再试。",
"60003": "检测到已有订阅。请取消后再继续。",
"60004": "暂时无法删除,订阅存在正常激活的用户。",
"70001": "验证码有误,请重新输入。", "70001": "验证码有误,请重新输入。",
"80001": "任务未成功加入队列,请稍后重试。", "80001": "任务未成功加入队列,请稍后重试。",
"90001": "请关闭 DEBUG 模式后再试。", "90001": "请关闭 DEBUG 模式后再试。",
+9 -1
View File
@@ -49,7 +49,6 @@
"confirm": "确认", "confirm": "确认",
"edit": "编辑", "edit": "编辑",
"editSecurity": "编辑安全性配置", "editSecurity": "编辑安全性配置",
"enableRelay": "启用中转",
"enableTLS": "启用TLS", "enableTLS": "启用TLS",
"encryptionMethod": "加密方法", "encryptionMethod": "加密方法",
"flow": "流控算法", "flow": "流控算法",
@@ -65,7 +64,14 @@
"port": "服务端口", "port": "服务端口",
"protocol": "协议", "protocol": "协议",
"relayHost": "中转地址", "relayHost": "中转地址",
"relayMode": "中转模式",
"relayModeOptions": {
"all": "全部",
"none": "无",
"random": "随机"
},
"relayPort": "中转端口", "relayPort": "中转端口",
"relayPrefix": "中转前缀",
"remarks": "备注", "remarks": "备注",
"security": "安全性", "security": "安全性",
"securityConfig": "安全性配置", "securityConfig": "安全性配置",
@@ -88,7 +94,9 @@
"selectEncryptionMethod": "选择加密方法", "selectEncryptionMethod": "选择加密方法",
"selectNodeGroup": "选择节点组", "selectNodeGroup": "选择节点组",
"selectProtocol": "选择协议", "selectProtocol": "选择协议",
"selectRelayMode": "选择中继模式",
"serverAddr": "服务器地址", "serverAddr": "服务器地址",
"serverKey": "服务器密钥",
"serverName": "服务名称", "serverName": "服务名称",
"speedLimit": "速度限制", "speedLimit": "速度限制",
"speedLimitPlaceholder": "无限制", "speedLimitPlaceholder": "无限制",
+17 -1
View File
@@ -19,9 +19,14 @@
"Hour": "时", "Hour": "时",
"Minute": "分", "Minute": "分",
"Month": "月", "Month": "月",
"NoLimit": "无限制",
"Year": "年", "Year": "年",
"annualReset": "按年重置",
"basic": "基础",
"cancel": "取消", "cancel": "取消",
"confirm": "确认", "confirm": "确认",
"deductionRatio": "自动/手动抵扣配置",
"deductionRatioDescription": "用于抵扣,默认采用自动计算算法。当手动填写比例时,系统将根据时间和流量的占比,以总和为100%进行按比例分配。",
"description": "描述", "description": "描述",
"deviceLimit": "设备限制", "deviceLimit": "设备限制",
"discount": "折扣", "discount": "折扣",
@@ -31,14 +36,25 @@
"discount_price": "折扣价格", "discount_price": "折扣价格",
"duration": "时长(月)", "duration": "时长(月)",
"inventory": "库存", "inventory": "库存",
"monthlyReset": "按月重置",
"name": "名称", "name": "名称",
"noLimit": "无限制", "noLimit": "无限制",
"noReset": "不重置",
"pricing": "定价",
"purchaseWithDiscount": "允许抵扣",
"purchaseWithDiscountDescription": "启用或禁用抵扣功能。启用后,系统将根据配置的规则和比例进行抵扣处理。",
"quota": "限购数量", "quota": "限购数量",
"renewalReset": "续费重置",
"renewalResetDescription": "续费时重置周期",
"replacement": "重置价格(每次)", "replacement": "重置价格(每次)",
"resetCycle": "重置周期",
"resetOn1st": "1号重置",
"selectResetCycle": "请选择重置周期",
"selectSubscribeGroup": "请选择订阅组", "selectSubscribeGroup": "请选择订阅组",
"selectUnitTime": "请选择单位时间", "selectUnitTime": "请选择单位时间",
"server": "服务", "server": "服务",
"serverGroup": "服务组", "serverGroup": "服务组",
"servers": "服务",
"speedLimit": "速度限制(Mbps", "speedLimit": "速度限制(Mbps",
"subscribeGroup": "订阅组", "subscribeGroup": "订阅组",
"traffic": "流量", "traffic": "流量",
@@ -83,6 +99,6 @@
"subscribeGroup": "订阅组" "subscribeGroup": "订阅组"
}, },
"traffic": "流量", "traffic": "流量",
"unitPrice": "价格/月", "unitPrice": "价",
"updateSuccess": "更新成功" "updateSuccess": "更新成功"
} }

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