Compare commits

...

53 Commits

Author SHA1 Message Date
semantic-release-bot 383638f702 🔖 chore(release): v1.0.0-beta.33 [skip ci]
# [1.0.0-beta.33](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.32...v1.0.0-beta.33) (2025-03-18)

### 🐛 Bug Fixes

* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
2025-03-18 07:53:53 +00:00
web@ppanel 5939763b57 🐛 fix(subscribe): Handle optional values in price and discount calculations 2025-03-18 14:50:48 +07:00
semantic-release-bot fa56eb8293 🔖 chore(release): v1.0.0-beta.32 [skip ci]
# [1.0.0-beta.32](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.31...v1.0.0-beta.32) (2025-03-17)

### 🐛 Bug Fixes

* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
2025-03-17 15:53:15 +00:00
web@ppanel 6a34bfb78d 🐛 fix(locales): Update invite code text to indicate it's optional 2025-03-17 22:50:21 +07:00
web@ppanel b8f4f1e694 🐛 fix(forms): Add step attribute to number inputs for better value control 2025-03-17 22:47:42 +07:00
semantic-release-bot aa1d42651d 🔖 chore(release): v1.0.0-beta.31 [skip ci]
# [1.0.0-beta.31](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.30...v1.0.0-beta.31) (2025-03-15)

### 🐛 Bug Fixes

* **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
2025-03-15 15:51:45 +00:00
web@ppanel 0c8f0911c7 🐛 fix(site): Se ref to store site configuration for updates 2025-03-15 22:47:19 +07:00
semantic-release-bot db0d9e003e 🔖 chore(release): v1.0.0-beta.30 [skip ci]
# [1.0.0-beta.30](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.29...v1.0.0-beta.30) (2025-03-15)

###  Features

* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
* **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
* **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
* **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
* **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
* **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
* **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
* **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))

### 🎫 Chores

* **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
* **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
* Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))

### 🐛 Bug Fixes

* **dashboard**:  Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
2025-03-15 09:02:24 +00:00
web@ppanel f219c52306 🔧 chore: Merge branch 'beta' into develop 2025-03-15 15:58:37 +07:00
web@ppanel 3f7b6d16ed feat(node-form): Update number input fields to enforce step, min, and max values 2025-03-15 15:48:59 +07:00
web@ppanel 6dbebd152d feat(global): Add custom data 2025-03-15 15:39:55 +07:00
web@ppanel bb3bd7b50c feat(email): Add traffic exhaustion template 2025-03-14 23:28:36 +07:00
web@ppanel fbad3b0e51 feat(timeline): Simplify timeline component layout and remove commented-out code 2025-03-14 23:21:17 +07:00
web@ppanel e551232564 🐛 fix(dashboard): Update date display to use start_time if available 2025-03-14 22:10:24 +07:00
web@ppanel bf58f25072 feat(formatting): Update differenceInDays function to return whole days or two decimal places 2025-03-14 20:51:17 +07:00
web@ppanel 85f55def2e feat(payment): Add isEdit prop to PaymentForm and disable fields when editing 2025-03-14 14:04:10 +07:00
semantic-release-bot 29bc3c7722 🔖 chore(release): v1.0.0-beta.29 [skip ci]
# [1.0.0-beta.29](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.28...v1.0.0-beta.29) (2025-03-14)

###  Features

* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
* **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
2025-03-14 06:43:47 +00:00
web@ppanel f72df3a5e8 feat(loading): Replace loading animation with a simpler spinner and loading text 2025-03-14 13:42:58 +07:00
web@ppanel 48a1b97051 feat(api): Add CheckoutOrder request and response types, and update user purchase request parameters 2025-03-14 13:42:58 +07:00
semantic-release-bot 786ba0e41c 🔖 chore(release): v1.0.0-beta.28 [skip ci]
# [1.0.0-beta.28](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.27...v1.0.0-beta.28) (2025-03-13)

###  Features

* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
2025-03-14 13:42:58 +07:00
web@ppanel ce3197298d feat(input): Add minimum value constraint and enhance number handling in EnhancedInput 2025-03-14 13:42:58 +07:00
semantic-release-bot 092477b2d3 🔖 chore(release): v1.0.0-beta.27 [skip ci]
* **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
* Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))

* **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
* **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
* **subscription**:  Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
* **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))

* **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))

* **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
* **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
* **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
* **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
* **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
* **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
* **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
* **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
* **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
* **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
* **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
2025-03-14 13:42:58 +07:00
web@ppanel b8316bba33 feat(loading): Replace loading animation with a simpler spinner and loading text 2025-03-14 13:40:56 +07:00
web@ppanel dddc21c686 feat(api): Add CheckoutOrder request and response types, and update user purchase request parameters 2025-03-14 13:34:36 +07:00
semantic-release-bot d10ecc9fdf 🔖 chore(release): v1.0.0-beta.28 [skip ci]
# [1.0.0-beta.28](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.27...v1.0.0-beta.28) (2025-03-13)

###  Features

* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
2025-03-13 10:35:19 +00:00
web@ppanel 94822d902f feat(input): Add minimum value constraint and enhance number handling in EnhancedInput 2025-03-13 17:32:36 +07:00
semantic-release-bot 85fdc36c14 🔖 chore(release): v1.0.0-beta.27 [skip ci]
# [1.0.0-beta.27](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.26...v1.0.0-beta.27) (2025-03-13)

### ♻ Code Refactoring

* **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
* Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))

###  Features

* **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
* **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
* **subscription**:  Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
* **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))

### 🎫 Chores

* **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))

### 🐛 Bug Fixes

* **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
* **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
* **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
* **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
* **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
* **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
* **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
* **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
* **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
* **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
* **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
2025-03-13 04:27:12 +00:00
web@ppanel cfa3fc024d 🐛 fix(changelog): Update change log style 2025-03-13 11:23:14 +07:00
web@ppanel c06ea49d6f 🐛 fix(purchasing): Update payment type to lowercase and add optional chaining for discounts 2025-03-13 00:06:42 +07:00
web@ppanel c3138a863d 🐛 fix(payment): Fix payment related type definitions and update payment method references 2025-03-12 21:17:04 +07:00
web@ppanel 7fa3a57df4 feat(payment): Add bank card payment 2025-03-12 17:15:32 +07:00
web@ppanel 70d6a38a29 🐛 fix(payment): Update payment information 2025-03-12 13:43:06 +07:00
web@ppanel 5c710e1add 🐛 fix(payment): Add notification URL field to payment management interface 2025-03-11 21:22:18 +07:00
web@ppanel 6752420ba5 🐛 fix(payment): Update payment method update logic to include row data 2025-03-11 21:15:07 +07:00
web@ppanel 710947209a ♻️ refactor(payment): Reconstruct the payment page 2025-03-11 20:06:12 +07:00
web@ppanel fc0da761b5 🐛 fix(ui): Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab 2025-03-10 18:32:07 +07:00
web@ppanel 136a1abd8b 🐛 fix(payment): Update checkout type from 'link' to 'url' for consistency 2025-03-08 20:10:45 +07:00
web@ppanel a5e2079ddc 🐛 fix(payment): Refactor purchaseCheckout usage and remove redundant code 2025-03-08 20:04:33 +07:00
web@ppanel 35f92c9329 🐛 fix(affiliate): Update user identifier 2025-03-08 15:43:20 +07:00
web@ppanel f5d8fd3b65 🐛 fix(ui): Multiple display bugs 2025-03-08 14:46:20 +07:00
web@ppanel 0c907337e1 feat(cdn): Add CDN URL configuration and update related references 2025-03-08 12:54:58 +07:00
web@ppanel e4630f8ca9 feat(subscription): Improve layout and organization of subscription detail tabs 2025-03-08 12:43:57 +07:00
web@ppanel 2215c7f2b9 feat(subscription): Refactor subscription handling and update imports for better organization 2025-03-08 12:36:25 +07:00
semantic-release-bot 3222016799 🔧 chore(merge): Bump version to 1.0.0-beta.26 and update changelog 2025-03-08 12:36:02 +07:00
web@ppanel d0a04679ce Merge pull request #12 from turbolnk-com/develop
♻️ refactor: Enhance user navigation dropdown ui and styling
2025-03-07 11:46:01 +07:00
turbolnk d2732e650b ♻️ refactor: Enhance user navigation dropdown ui and styling 2025-03-06 09:34:39 +08:00
semantic-release-bot 79edea7973 🔖 chore(release): v1.0.0-beta.26 [skip ci]
# [1.0.0-beta.26](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.25...v1.0.0-beta.26) (2025-03-02)

### 🐛 Bug Fixes

* **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
2025-03-02 16:40:10 +00:00
web@ppanel f17bf8db6e 🐛 fix(icon): Comment out unused icon collection imports 2025-03-02 23:37:15 +07:00
semantic-release-bot 047a69886e 🔖 chore(release): v1.0.0-beta.25 [skip ci]
# [1.0.0-beta.25](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.24...v1.0.0-beta.25) (2025-03-01)

###  Features

* **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))

### 🐛 Bug Fixes

* **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
* **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
* **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
2025-03-01 12:59:06 +00:00
web@ppanel 71bf002370 🐛 fix(request): Add error code 40005 to trigger logout 2025-03-01 19:55:55 +07:00
web@ppanel d0e6df044e 🐛 fix(dashboard): Display subscription creation date in user dashboard 2025-03-01 19:55:31 +07:00
web@ppanel 8e16ef17ed feat(auth): Add privacy policy link to the footer 2025-03-01 19:40:45 +07:00
web@ppanel 2b80496637 🐛 fix(subscribe): Update payment return URL 2025-03-01 19:35:32 +07:00
276 changed files with 4910 additions and 2739 deletions
+180 -18
View File
@@ -1,28 +1,190 @@
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.24](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.23...v1.0.0-beta.24) (2025-02-27)
### ♻ Code Refactoring
* **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
* Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
### ✨ Features
* **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
### 🎫 Chores
* **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
# [1.0.0-beta.33](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.32...v1.0.0-beta.33) (2025-03-18)
### 🐛 Bug Fixes
* **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
# [1.0.0-beta.32](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.31...v1.0.0-beta.32) (2025-03-17)
### 🐛 Bug Fixes
* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.31](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.30...v1.0.0-beta.31) (2025-03-15)
### 🐛 Bug Fixes
- **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
# [1.0.0-beta.30](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.29...v1.0.0-beta.30) (2025-03-15)
### ✨ Features
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
- **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
- **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
- **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
- **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
- **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
- **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
- **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
### 🎫 Chores
- **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
- **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
- Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
### 🐛 Bug Fixes
- **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.29](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.28...v1.0.0-beta.29) (2025-03-14)
### ✨ Features
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
- **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.28](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.27...v1.0.0-beta.28) (2025-03-13)
### ✨ Features
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
# [1.0.0-beta.27](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.26...v1.0.0-beta.27) (2025-03-13)
### ♻ Code Refactoring
- **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
- Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
### ✨ Features
- **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
- **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
- **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
- **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
### 🎫 Chores
- **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
### 🐛 Bug Fixes
- **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
- **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
- **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
- **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
- **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
- **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
- **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
- **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
- **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
- **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
- **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.28](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.27...v1.0.0-beta.28) (2025-03-13)
### ✨ Features
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
# [1.0.0-beta.27](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.26...v1.0.0-beta.27) (2025-03-13)
### ♻ Code Refactoring
- **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
- Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
### ✨ Features
- **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
- **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
- **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
- **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
### 🎫 Chores
- **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
### 🐛 Bug Fixes
- **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
- **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
- **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
- **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
- **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
- **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
- **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
- **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
- **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
- **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
- **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
<a name="readme-top"></a>
# Changelog
# [1.0.0-beta.26](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.25...v1.0.0-beta.26) (2025-03-02)
### 🐛 Bug Fixes
- **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
# [1.0.0-beta.25](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.24...v1.0.0-beta.25) (2025-03-01)
### ✨ Features
- **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
### 🐛 Bug Fixes
- **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
- **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
- **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
# [1.0.0-beta.24](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.23...v1.0.0-beta.24) (2025-02-27)
### ♻ Code Refactoring
- **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
- Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
### ✨ Features
- **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
### 🎫 Chores
- **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
### 🐛 Bug Fixes
- **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
<a name="readme-top"></a>
@@ -286,31 +286,34 @@ export default function Page() {
</TabsContent>
<TabsContent value='template'>
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3'>
{['verify_email_template', 'expiration_email_template', 'maintenance_email_template'].map(
(templateKey) => (
<Card key={templateKey}>
<CardHeader>
<CardTitle>{t(`${templateKey}`)}</CardTitle>
<CardDescription>
{t(`${templateKey}Description`, { after: '{{', before: '}}' })}
</CardDescription>
</CardHeader>
<CardContent>
<HTMLEditor
placeholder={t('inputPlaceholder')}
value={data?.config?.[templateKey] as string}
onBlur={(value) =>
updateConfig('config', {
...data?.config,
[templateKey]: value,
})
}
/>
</CardContent>
</Card>
),
)}
<div className='grid grid-cols-1 gap-4 md:grid-cols-2'>
{[
'verify_email_template',
'expiration_email_template',
'maintenance_email_template',
'traffic_exceed_email_template',
].map((templateKey) => (
<Card key={templateKey}>
<CardHeader>
<CardTitle>{t(`${templateKey}`)}</CardTitle>
<CardDescription>
{t(`${templateKey}Description`, { after: '{{', before: '}}' })}
</CardDescription>
</CardHeader>
<CardContent>
<HTMLEditor
placeholder={t('inputPlaceholder')}
value={data?.config?.[templateKey] as string}
onBlur={(value) =>
updateConfig('config', {
...data?.config,
[templateKey]: value,
})
}
/>
</CardContent>
</Card>
))}
</div>
</TabsContent>
@@ -307,6 +307,7 @@ export default function CouponForm<T extends Record<string, any>>({
<EnhancedInput
placeholder={t('form.countPlaceholder')}
type='number'
step={1}
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
@@ -327,6 +328,7 @@ export default function CouponForm<T extends Record<string, any>>({
<EnhancedInput
placeholder={t('form.userLimitPlaceholder')}
type='number'
step={1}
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
+1 -1
View File
@@ -116,7 +116,7 @@ export default function Page(props: any) {
<ul className='grid gap-3'>
<li className='flex items-center justify-between'>
<span className='text-muted-foreground'>{t('method')}</span>
<span>{t(`methods.${row.original.method}`)}</span>
<span>{row.original?.payment?.name || row.original?.payment?.platform}</span>
</li>
</ul>
</HoverCardContent>
@@ -1,256 +0,0 @@
'use client';
import { getAlipayF2FPaymentConfig, updateAlipayF2FPaymentConfig } from '@/services/admin/payment';
import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import { Switch } from '@workspace/ui/components/switch';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { Textarea } from '@workspace/ui/components/textarea';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { toast } from 'sonner';
export default function AlipayF2F() {
const t = useTranslations('payment');
const { data, refetch } = useQuery({
queryKey: ['getAlipayF2FPaymentConfig'],
queryFn: async () => {
const { data } = await getAlipayF2FPaymentConfig();
return data.data;
},
});
async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return;
try {
await updateAlipayF2FPaymentConfig({
...data,
[key]: value,
} as API.UpdateAlipayF2fRequest);
toast.success(t('saveSuccess'));
refetch();
} catch (error) {
/* empty */
}
}
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('enable')}</Label>
<p className='text-muted-foreground text-xs'>{t('enableDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.enable}
onCheckedChange={(checked) => {
updateConfig('enable', checked);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('alipayf2f.sandbox')}</Label>
<p className='text-muted-foreground text-xs'>{t('alipayf2f.sandboxDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.config.sandbox}
onCheckedChange={(checked) => {
updateConfig('config', {
...data?.config,
sandbox: checked,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('showName')}</Label>
<p className='text-muted-foreground text-xs'>{t('showNameDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.name}
onValueBlur={(value) => updateConfig('name', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('iconUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('iconUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.icon_url}
onValueBlur={(value) => updateConfig('icon', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('notifyUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('notifyUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.domain}
onValueBlur={(value) => updateConfig('domain', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feeMode')}</Label>
<p className='text-muted-foreground text-xs'>{t('feeModeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Select
value={String(data?.fee_mode)}
onValueChange={(value) => {
updateConfig('fee_mode', Number(value));
}}
>
<SelectTrigger>
<SelectValue placeholder='请选择' />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value='0'>{t('feeModeItems.0')}</SelectItem>
<SelectItem value='1'>{t('feeModeItems.1')}</SelectItem>
<SelectItem value='2'>{t('feeModeItems.2')}</SelectItem>
<SelectItem value='3'>{t('feeModeItems.3')}</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feePercent')}</Label>
<p className='text-muted-foreground text-xs'>{t('feePercentDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
max={100}
maxLength={3}
value={data?.fee_percent}
onValueBlur={(value) => updateConfig('fee_percent', value)}
suffix='%'
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('fixedFee')}</Label>
<p className='text-muted-foreground text-xs'>{t('fixedFeeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
min={0}
value={data?.fee_amount}
formatInput={(value) => unitConversion('centsToDollars', value)}
formatOutput={(value) => unitConversion('dollarsToCents', value)}
onValueBlur={(value) => updateConfig('fee_amount', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('alipayf2f.appId')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.app_id}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
app_id: value,
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('alipayf2f.privateKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<Textarea
placeholder={t('inputPlaceholder')}
defaultValue={data?.config.private_key}
onBlur={(e) => {
updateConfig('config', {
...data?.config,
private_key: e.target.value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('alipayf2f.publicKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<Textarea
placeholder={t('inputPlaceholder')}
defaultValue={data?.config.public_key}
onBlur={(e) => {
updateConfig('config', {
...data?.config,
public_key: e.target.value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('alipayf2f.invoiceName')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('alipayf2f.invoiceNameDescription')}
value={data?.config.invoice_name}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
invoice_name: value,
})
}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
);
}
-221
View File
@@ -1,221 +0,0 @@
'use client';
import { getEpayPaymentConfig, updateEpayPaymentConfig } from '@/services/admin/payment';
import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import { Switch } from '@workspace/ui/components/switch';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { toast } from 'sonner';
export default function Epay() {
const t = useTranslations('payment');
const { data, refetch } = useQuery({
queryKey: ['getEpayPaymentConfig'],
queryFn: async () => {
const { data } = await getEpayPaymentConfig();
return data.data;
},
});
async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return;
try {
await updateEpayPaymentConfig({
...data,
[key]: value,
} as API.UpdateEpayRequest);
toast.success(t('saveSuccess'));
refetch();
} catch (error) {
/* empty */
}
}
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('enable')}</Label>
<p className='text-muted-foreground text-xs'>{t('enableDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.enable}
onCheckedChange={(checked) => {
updateConfig('enable', checked);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('showName')}</Label>
<p className='text-muted-foreground text-xs'>{t('showNameDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.name}
onValueBlur={(value) => updateConfig('name', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('iconUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('iconUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.icon}
onValueBlur={(value) => updateConfig('icon', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('notifyUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('notifyUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.domain}
onValueBlur={(value) => updateConfig('domain', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feeMode')}</Label>
<p className='text-muted-foreground text-xs'>{t('feeModeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Select
value={String(data?.fee_mode)}
onValueChange={(value) => {
updateConfig('fee_mode', Number(value));
}}
>
<SelectTrigger>
<SelectValue placeholder='请选择' />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value='0'>{t('feeModeItems.0')}</SelectItem>
<SelectItem value='1'>{t('feeModeItems.1')}</SelectItem>
<SelectItem value='2'>{t('feeModeItems.2')}</SelectItem>
<SelectItem value='3'>{t('feeModeItems.3')}</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feePercent')}</Label>
<p className='text-muted-foreground text-xs'>{t('feePercentDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
max={100}
maxLength={3}
value={data?.fee_percent}
onValueBlur={(value) => updateConfig('fee_percent', value)}
suffix='%'
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('fixedFee')}</Label>
<p className='text-muted-foreground text-xs'>{t('fixedFeeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
value={data?.fee_amount}
formatInput={(value) => unitConversion('centsToDollars', value)}
formatOutput={(value) => unitConversion('dollarsToCents', value)}
onValueBlur={(value) => updateConfig('fee_amount', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('epay.url')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.url}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
url: value,
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('epay.pid')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.pid}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
pid: value,
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('epay.key')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.key}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
key: value,
})
}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
);
}
+3 -26
View File
@@ -1,34 +1,11 @@
import Billing from '@/components/billing';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import AlipayF2F from './alipayf2f';
import Epay from './epay';
import StripeAlipay from './stripe-alipay';
import StripeWeChatPay from './stripe-wechat-pay';
import PaymentTable from './payment-table';
export default async function Page() {
return (
<>
<Tabs defaultValue='Epay'>
<TabsList className='h-full flex-wrap'>
<TabsTrigger value='Epay'>Epay</TabsTrigger>
<TabsTrigger value='Stripe-Alipay'>Stripe(AliPay)</TabsTrigger>
<TabsTrigger value='Strip-WeChatPay'>Stripe(WeChatPay)</TabsTrigger>
<TabsTrigger value='AlipayF2F'>AlipayF2F</TabsTrigger>
</TabsList>
<TabsContent value='Epay'>
<Epay />
</TabsContent>
<TabsContent value='Stripe-Alipay'>
<StripeAlipay />
</TabsContent>
<TabsContent value='Strip-WeChatPay'>
<StripeWeChatPay />
</TabsContent>
<TabsContent value='AlipayF2F'>
<AlipayF2F />
</TabsContent>
</Tabs>
<div className='flex flex-col gap-3'>
<PaymentTable />
<div className='mt-5 flex flex-col gap-3'>
<Billing type='payment' />
</div>
</>
@@ -0,0 +1,419 @@
'use client';
import useGlobalStore from '@/config/use-global';
import { getPaymentPlatform } from '@/services/admin/payment';
import { zodResolver } from '@hookform/resolvers/zod';
import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button';
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@workspace/ui/components/form';
import { RadioGroup, RadioGroupItem } from '@workspace/ui/components/radio-group';
import { ScrollArea } from '@workspace/ui/components/scroll-area';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import {
Sheet,
SheetContent,
SheetFooter,
SheetHeader,
SheetTitle,
SheetTrigger,
} from '@workspace/ui/components/sheet';
import { MarkdownEditor } from '@workspace/ui/custom-components/editor';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { Icon } from '@workspace/ui/custom-components/icon';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { useEffect, useState } from 'react';
import { useForm } from 'react-hook-form';
import * as z from 'zod';
interface PaymentFormProps<T> {
trigger: React.ReactNode;
title: string;
loading?: boolean;
initialValues?: T;
onSubmit: (values: T) => Promise<boolean>;
isEdit?: boolean;
}
export default function PaymentForm<T>({
trigger,
title,
loading,
initialValues,
onSubmit,
isEdit,
}: PaymentFormProps<T>) {
const t = useTranslations('payment');
const { common } = useGlobalStore();
const { currency } = common;
const [open, setOpen] = useState(false);
const { data: platformData } = useQuery({
queryKey: ['getPaymentPlatform'],
queryFn: async () => {
const { data } = await getPaymentPlatform();
return data?.data?.list || [];
},
});
const formSchema = z.object({
name: z.string().min(1, { message: t('nameRequired') }),
platform: z.string().optional(),
icon: z.string().optional(),
domain: z.string().optional(),
config: z.any(),
fee_mode: z.coerce.number().min(0).max(2),
fee_percent: z.coerce.number().optional(),
fee_amount: z.coerce.number().optional(),
description: z.string().optional(),
});
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
name: '',
platform: '',
icon: '',
domain: '',
config: {},
fee_mode: 0,
fee_percent: 0,
fee_amount: 0,
...(initialValues as any),
},
});
const feeMode = form.watch('fee_mode');
const platformValue = form.watch('platform');
const configValues = form.watch('config');
const currentPlatform = platformData?.find((p) => p.platform === platformValue);
const currentFieldDescriptions = currentPlatform?.platform_field_description || {};
const configFields = Object.keys(currentFieldDescriptions) || [];
const platformUrl = currentPlatform?.platform_url || '';
useEffect(() => {
if (feeMode === 0) {
form.setValue('fee_amount', 0);
form.setValue('fee_percent', 0);
} else if (feeMode === 1) {
form.setValue('fee_amount', 0);
} else if (feeMode === 2) {
form.setValue('fee_percent', 0);
}
}, [feeMode, form]);
const handleClose = () => {
form.reset();
setOpen(false);
};
const handleSubmit = async (values: z.infer<typeof formSchema>) => {
const cleanedValues = { ...values };
if (values.fee_mode === 0) {
cleanedValues.fee_amount = undefined;
cleanedValues.fee_percent = undefined;
} else if (values.fee_mode === 1) {
cleanedValues.fee_amount = undefined;
} else if (values.fee_mode === 2) {
cleanedValues.fee_percent = undefined;
}
const success = await onSubmit(cleanedValues as unknown as T);
if (success) {
handleClose();
}
};
const openPlatformUrl = () => {
if (platformUrl) {
window.open(platformUrl, '_blank');
}
};
return (
<Sheet open={open} onOpenChange={setOpen}>
<SheetTrigger asChild>{trigger}</SheetTrigger>
<SheetContent className='w-[550px] max-w-full md:max-w-screen-md'>
<SheetHeader>
<SheetTitle>{title}</SheetTitle>
</SheetHeader>
<ScrollArea className='-mx-6 h-[calc(100vh-48px-36px-36px-env(safe-area-inset-top))]'>
<Form {...form}>
<form onSubmit={form.handleSubmit(handleSubmit)} className='space-y-6 px-6 pt-4'>
{/* 基本信息分组 */}
<div className='space-y-4'>
<div className='grid grid-cols-1 gap-4 sm:grid-cols-2'>
<FormField
control={form.control}
name='name'
render={({ field }) => (
<FormItem>
<FormLabel>{t('name')}</FormLabel>
<FormControl>
<EnhancedInput
placeholder={t('namePlaceholder')}
value={field.value}
onValueChange={(value) => form.setValue('name', value as string)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='icon'
render={({ field }) => (
<FormItem>
<FormLabel>{t('icon')}</FormLabel>
<FormControl>
<EnhancedInput
placeholder={t('iconPlaceholder')}
value={field.value}
onValueChange={(value) => form.setValue('icon', value as string)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormField
control={form.control}
name='domain'
render={({ field }) => (
<FormItem>
<FormLabel>{t('domain')}</FormLabel>
<FormControl>
<EnhancedInput
placeholder={t('domainPlaceholder', { example: 'http(s)://example.com' })}
value={field.value}
onValueChange={(value) => form.setValue('domain', value as string)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<div className='space-y-4'>
<FormField
control={form.control}
name='fee_mode'
render={({ field }) => (
<FormItem>
<FormLabel>{t('handlingFee')}</FormLabel>
<FormControl>
<RadioGroup
onValueChange={(value) => field.onChange(parseInt(value))}
value={field.value.toString()}
className='flex flex-wrap gap-4'
>
<FormItem className='flex items-center space-x-2'>
<FormControl>
<RadioGroupItem value='0' />
</FormControl>
<FormLabel className='!mt-0 cursor-pointer'>{t('noFee')}</FormLabel>
</FormItem>
<FormItem className='flex items-center space-x-2'>
<FormControl>
<RadioGroupItem value='1' />
</FormControl>
<FormLabel className='!mt-0 cursor-pointer'>
{t('percentFee')}
</FormLabel>
</FormItem>
<FormItem className='flex items-center space-x-2'>
<FormControl>
<RadioGroupItem value='2' />
</FormControl>
<FormLabel className='!mt-0 cursor-pointer'>{t('fixedFee')}</FormLabel>
</FormItem>
</RadioGroup>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{feeMode === 1 && (
<div className='grid grid-cols-1 sm:w-1/2'>
<FormField
control={form.control}
name='fee_percent'
render={({ field }) => (
<FormItem>
<FormLabel>{t('feePercent')}</FormLabel>
<FormControl>
<EnhancedInput
type='number'
step='0.01'
suffix='%'
value={field.value}
onValueChange={field.onChange}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
)}
{feeMode === 2 && (
<div className='grid grid-cols-1 sm:w-1/2'>
<FormField
control={form.control}
name='fee_amount'
render={({ field }) => (
<FormItem>
<FormLabel>{t('feeAmount')}</FormLabel>
<FormControl>
<EnhancedInput
type='number'
step='0.01'
prefix={currency.currency_symbol}
suffix={currency.currency_unit}
value={unitConversion('centsToDollars', field.value)}
onValueChange={(value) =>
field.onChange(unitConversion('dollarsToCents', value))
}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
)}
</div>
<div className='space-y-4'>
{(!platformValue || platformData?.find((p) => p.platform === platformValue)) && (
<FormField
control={form.control}
name='platform'
render={({ field }) => (
<FormItem>
<FormLabel>{t('platform')}</FormLabel>
<Select
onValueChange={(value) => {
form.setValue('platform', value as string);
form.setValue('config', {});
}}
defaultValue={field.value}
value={field.value}
// @ts-expect-error
disabled={isEdit && Boolean(initialValues?.platform)}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('selectPlatform')} />
</SelectTrigger>
</FormControl>
<SelectContent>
{platformData?.map((platform) => (
<SelectItem key={platform.platform} value={platform.platform}>
{platform.platform}
</SelectItem>
))}
</SelectContent>
</Select>
{platformUrl ? (
<div className='mt-1 flex justify-end'>
<Button
variant='ghost'
size='sm'
className='h-6 px-2 text-xs'
onClick={openPlatformUrl}
>
<Icon icon='tabler:external-link' className='mr-1 h-3 w-3' />
{t('applyForPayment')}
</Button>
</div>
) : (
<div className='mt-1 h-6'></div>
)}
<FormMessage />
</FormItem>
)}
/>
)}
{configFields.length > 0 && (
<div className='mt-4 space-y-4'>
{configFields.map((fieldKey) => (
<FormItem key={fieldKey}>
<FormLabel>{currentFieldDescriptions[fieldKey]}</FormLabel>
<FormControl>
<EnhancedInput
placeholder={t('configPlaceholder', {
field: currentFieldDescriptions[fieldKey],
})}
value={
configValues && configValues[fieldKey] !== undefined
? configValues[fieldKey]
: ''
}
onValueChange={(value) => {
const newConfig = { ...configValues };
newConfig[fieldKey] = value;
form.setValue('config', newConfig);
}}
/>
</FormControl>
</FormItem>
))}
</div>
)}
<FormField
control={form.control}
name='description'
render={({ field }) => (
<FormItem>
<FormLabel>{t('description')}</FormLabel>
<FormControl>
<MarkdownEditor
value={field.value}
onChange={(value) => form.setValue(field.name, value as string)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
</form>
</Form>
</ScrollArea>
<SheetFooter className='flex-row justify-end gap-2 pt-3'>
<Button variant='outline' disabled={loading} onClick={handleClose}>
{t('cancel')}
</Button>
<Button disabled={loading} onClick={form.handleSubmit(handleSubmit)}>
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}
{t('submit')}
</Button>
</SheetFooter>
</SheetContent>
</Sheet>
);
}
@@ -0,0 +1,223 @@
'use client';
import { Display } from '@/components/display';
import { ProTable, ProTableActions } from '@/components/pro-table';
import {
createPaymentMethod,
deletePaymentMethod,
getPaymentMethodList,
updatePaymentMethod,
} from '@/services/admin/payment';
import { Avatar, AvatarFallback, AvatarImage } from '@workspace/ui/components/avatar';
import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button';
import { Switch } from '@workspace/ui/components/switch';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { useTranslations } from 'next-intl';
import { useRef, useState } from 'react';
import { toast } from 'sonner';
import PaymentForm from './payment-form';
export default function PaymentTable() {
const t = useTranslations('payment');
const [loading, setLoading] = useState(false);
const ref = useRef<ProTableActions>(null);
return (
<ProTable<API.PaymentConfig, { search: string }>
action={ref}
header={{
title: t('paymentManagement'),
toolbar: (
<PaymentForm<API.CreatePaymentMethodRequest>
trigger={<Button>{t('create')}</Button>}
title={t('createPayment')}
loading={loading}
onSubmit={async (values) => {
setLoading(true);
try {
await createPaymentMethod({
...values,
enable: false,
});
toast.success(t('createSuccess'));
ref.current?.refresh();
setLoading(false);
return true;
} catch (error) {
setLoading(false);
return false;
}
}}
/>
),
}}
columns={[
{
accessorKey: 'enable',
header: t('enable'),
cell: ({ row }) => {
return (
<Switch
checked={Boolean(row.getValue('enable'))}
onCheckedChange={async (checked) => {
await updatePaymentMethod({
...row.original,
enable: checked,
});
ref.current?.refresh();
}}
/>
);
},
},
{
accessorKey: 'icon',
header: t('icon'),
cell: ({ row }) => {
const icon = row.getValue('icon') as string;
return (
<Avatar className='h-8 w-8'>
{icon ? <AvatarImage src={icon} alt={row.getValue('name')} /> : null}
<AvatarFallback>
{(row.getValue('name') as string)?.charAt(0) || '?'}
</AvatarFallback>
</Avatar>
);
},
},
{
accessorKey: 'name',
header: t('name'),
},
{
accessorKey: 'platform',
header: t('platform'),
cell: ({ row }) => <Badge>{t(row.getValue('platform'))}</Badge>,
},
{
accessorKey: 'notify_url',
header: t('notify_url'),
},
{
accessorKey: 'fee',
header: t('handlingFee'),
cell: ({ row }) => {
const feeMode = row.original.fee_mode;
if (feeMode === 1) {
return <Badge>{row.original.fee_percent}%</Badge>;
} else if (feeMode === 2) {
return (
<Badge>
<Display value={row.original.fee_amount} type='currency' />
</Badge>
);
}
return '--';
},
},
]}
params={[
{
key: 'search',
placeholder: t('searchPlaceholder'),
},
]}
request={async (pagination, filter) => {
const { data } = await getPaymentMethodList({
...pagination,
...filter,
});
return {
list: data?.data?.list || [],
total: data?.data?.total || 0,
};
}}
actions={{
render: (row) => [
<PaymentForm<API.UpdatePaymentMethodRequest>
isEdit
key='edit'
trigger={<Button>{t('edit')}</Button>}
title={t('editPayment')}
loading={loading}
initialValues={row}
onSubmit={async (values) => {
setLoading(true);
try {
await updatePaymentMethod({
...row,
...values,
});
toast.success(t('updateSuccess'));
ref.current?.refresh();
setLoading(false);
return true;
} catch (error) {
setLoading(false);
return false;
}
}}
/>,
<ConfirmButton
key='delete'
trigger={<Button variant='destructive'>{t('delete')}</Button>}
title={t('confirmDelete')}
description={t('deleteWarning')}
onConfirm={async () => {
await deletePaymentMethod({
id: row.id,
});
toast.success(t('deleteSuccess'));
ref.current?.refresh();
}}
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
<Button
key='copy'
variant='outline'
onClick={async () => {
setLoading(true);
try {
const { id, ...params } = row;
await createPaymentMethod({
...params,
enable: false,
});
toast.success(t('copySuccess'));
ref.current?.refresh();
setLoading(false);
return true;
} catch (error) {
setLoading(false);
return false;
}
}}
>
{t('copy')}
</Button>,
],
batchRender(rows) {
return [
<ConfirmButton
key='delete'
trigger={<Button variant='destructive'>{t('batchDelete')}</Button>}
title={t('confirmDelete')}
description={t('deleteWarning')}
onConfirm={async () => {
for (const row of rows) {
await deletePaymentMethod({ id: row.id });
}
toast.success(t('deleteSuccess'));
ref.current?.refresh();
}}
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
];
},
}}
/>
);
}
@@ -1,232 +0,0 @@
'use client';
import {
getStripeAlipayPaymentConfig,
updateStripeAlipayPaymentConfig,
} from '@/services/admin/payment';
import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import { Switch } from '@workspace/ui/components/switch';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { toast } from 'sonner';
export default function Stripe() {
const t = useTranslations('payment');
const { data, refetch } = useQuery({
queryKey: ['getStripeAlipayPaymentConfig'],
queryFn: async () => {
const { data } = await getStripeAlipayPaymentConfig();
return data.data;
},
});
async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return;
try {
await updateStripeAlipayPaymentConfig({
...data,
mark: 'stripe_alipay',
[key]: value,
} as any);
toast.success(t('saveSuccess'));
refetch();
} catch (error) {
/* empty */
}
}
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('aliPay')}</Label>
<p className='text-muted-foreground text-xs'>{t('enableDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.enable}
onCheckedChange={async (checked) => {
updateConfig('enable', checked);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('showName')}</Label>
<p className='text-muted-foreground text-xs'>{t('showNameDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.name}
onValueBlur={(value) => {
updateConfig('name', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('iconUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('iconUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.icon}
onValueBlur={(value) => {
updateConfig('icon', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('notifyUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('notifyUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.domain}
onValueBlur={(value) => {
updateConfig('domain', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feeMode')}</Label>
<p className='text-muted-foreground text-xs'>{t('feeModeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Select
value={String(data?.fee_mode)}
onValueChange={(value) => {
updateConfig('fee_mode', Number(value));
}}
>
<SelectTrigger>
<SelectValue placeholder='请选择' />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value='0'>{t('feeModeItems.0')}</SelectItem>
<SelectItem value='1'>{t('feeModeItems.1')}</SelectItem>
<SelectItem value='2'>{t('feeModeItems.2')}</SelectItem>
<SelectItem value='3'>{t('feeModeItems.3')}</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feePercent')}</Label>
<p className='text-muted-foreground text-xs'>{t('feePercentDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
max={100}
value={data?.fee_percent}
onValueBlur={(value) => {
updateConfig('fee_percent', value);
}}
suffix='%'
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('fixedFee')}</Label>
<p className='text-muted-foreground text-xs'>{t('fixedFeeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
value={data?.fee_amount}
formatInput={(value) => unitConversion('centsToDollars', value)}
formatOutput={(value) => unitConversion('dollarsToCents', value)}
onValueBlur={(value) => updateConfig('fee_amount', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.publicKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.public_key}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
public_key: value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.secretKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.secret_key}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
secret_key: value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.webhookSecret')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.webhook_secret}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
webhook_secret: value,
});
}}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
);
}
@@ -1,232 +0,0 @@
'use client';
import {
getStripeWeChatPayPaymentConfig,
updateStripeWeChatPayPaymentConfig,
} from '@/services/admin/payment';
import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import { Switch } from '@workspace/ui/components/switch';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
import { toast } from 'sonner';
export default function StripeWeChatPay() {
const t = useTranslations('payment');
const { data, refetch } = useQuery({
queryKey: ['getStripeWeChatPayPaymentConfig'],
queryFn: async () => {
const { data } = await getStripeWeChatPayPaymentConfig();
return data.data;
},
});
async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return;
try {
await updateStripeWeChatPayPaymentConfig({
...data,
mark: 'stripe_wechat_pay',
[key]: value,
} as any);
toast.success(t('saveSuccess'));
refetch();
} catch (error) {
/* empty */
}
}
return (
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('wechatPay')}</Label>
<p className='text-muted-foreground text-xs'>{t('enableDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.enable}
onCheckedChange={async (checked) => {
updateConfig('enable', checked);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('showName')}</Label>
<p className='text-muted-foreground text-xs'>{t('showNameDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.name}
onValueBlur={(value) => {
updateConfig('name', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('iconUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('iconUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.icon}
onValueBlur={(value) => {
updateConfig('icon', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('notifyUrl')}</Label>
<p className='text-muted-foreground text-xs'>{t('notifyUrlDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.domain}
onValueBlur={(value) => {
updateConfig('domain', value);
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feeMode')}</Label>
<p className='text-muted-foreground text-xs'>{t('feeModeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<Select
value={String(data?.fee_mode)}
onValueChange={(value) => {
updateConfig('fee_mode', Number(value));
}}
>
<SelectTrigger>
<SelectValue placeholder='请选择' />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value='0'>{t('feeModeItems.0')}</SelectItem>
<SelectItem value='1'>{t('feeModeItems.1')}</SelectItem>
<SelectItem value='2'>{t('feeModeItems.2')}</SelectItem>
<SelectItem value='3'>{t('feeModeItems.3')}</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('feePercent')}</Label>
<p className='text-muted-foreground text-xs'>{t('feePercentDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
max={100}
value={data?.fee_percent}
onValueBlur={(value) => {
updateConfig('fee_percent', value);
}}
suffix='%'
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('fixedFee')}</Label>
<p className='text-muted-foreground text-xs'>{t('fixedFeeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
type='number'
min={0}
value={data?.fee_amount}
formatInput={(value) => unitConversion('centsToDollars', value)}
formatOutput={(value) => unitConversion('dollarsToCents', value)}
onValueBlur={(value) => updateConfig('fee_amount', value)}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.publicKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.public_key}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
public_key: value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.secretKey')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.secret_key}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
secret_key: value,
});
}}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('stripe.webhookSecret')}</Label>
<p className='text-muted-foreground text-xs' />
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config.webhook_secret}
onValueBlur={(value) => {
updateConfig('config', {
...data?.config,
webhook_secret: value,
});
}}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
);
}
@@ -362,9 +362,10 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput
{...field}
type='number'
placeholder='1-65535'
step={1}
min={1}
max={65535}
placeholder='1-65535'
onValueChange={(value) => {
form.setValue(field.name, value);
}}
@@ -418,6 +419,9 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput
{...field}
type='number'
step={1}
min={1}
max={65535}
placeholder='1-65535'
onValueChange={(value) => {
form.setValue(field.name, value);
@@ -899,6 +903,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
{
name: 'port',
type: 'number',
step: 1,
min: 1,
max: 65535,
placeholder: t('form.relayPort'),
@@ -298,6 +298,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
<EnhancedInput
placeholder={t('form.noLimit')}
type='number'
step={1}
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
@@ -321,7 +322,8 @@ export default function SubscribeForm<T extends Record<string, any>>({
<EnhancedInput
placeholder={t('form.noLimit')}
type='number'
value={field.value === -1 ? 0 : field.value}
step={1}
value={field.value}
min={0}
onValueChange={(value) => {
form.setValue(field.name, value);
@@ -343,6 +345,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
<EnhancedInput
placeholder={t('form.noLimit')}
type='number'
step={1}
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
@@ -545,6 +548,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
{
name: 'quantity',
type: 'number',
step: 1,
min: 1,
suffix: unit_time && t(`form.${unit_time}`),
},
@@ -560,7 +564,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
return {
...data,
price: evaluateWithPrecision(
`${unit_price} * ${data.quantity} * ${data.discount} / 100`,
`${unit_price || 0} * ${data.quantity || 0} * ${data.discount || 0} / 100`,
),
};
},
@@ -569,7 +573,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
name: 'price',
placeholder: t('form.discount_price'),
type: 'number',
min: 0,
formatInput: (value) => unitConversion('centsToDollars', value),
formatOutput: (value) => unitConversion('dollarsToCents', value),
internal: true,
@@ -578,7 +581,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
return {
...data,
discount: evaluateWithPrecision(
`${data.price} / ${data.quantity} / ${unit_price} * 100`,
`${data.price || 0} / ${data.quantity || 0} / ${unit_price || 0} * 100`,
),
};
},
+48 -2
View File
@@ -5,18 +5,21 @@ import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { Textarea } from '@workspace/ui/components/textarea';
import { JSONEditor } from '@workspace/ui/custom-components/editor';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { UploadImage } from '@workspace/ui/custom-components/upload-image';
import { useTranslations } from 'next-intl';
import { useRef } from 'react';
import { toast } from 'sonner';
export default function Site() {
const t = useTranslations('system.site');
const ref = useRef<API.SiteConfig | undefined>(undefined);
const { data, refetch } = useQuery({
queryKey: ['getSiteConfig'],
queryFn: async () => {
const { data } = await getSiteConfig();
ref.current = data.data;
return data.data;
},
});
@@ -25,7 +28,7 @@ export default function Site() {
if (data?.[key] === value) return;
try {
await updateSiteConfig({
...data,
...ref.current,
[key]: value,
} as API.SiteConfig);
toast.success(t('saveSuccess'));
@@ -130,6 +133,49 @@ export default function Site() {
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('customData')}</Label>
<p className='text-muted-foreground text-xs'>{t('customDataDescription')}</p>
</TableCell>
<TableCell className='w-1/2 text-right'>
<JSONEditor
schema={{
type: 'object',
additionalProperties: true,
properties: {
website: { type: 'string', title: 'Website' },
contacts: {
type: 'object',
title: 'Contacts',
additionalProperties: true,
properties: {
email: { type: 'string', title: 'Email' },
telephone: { type: 'string', title: 'Telephone' },
address: { type: 'string', title: 'Address' },
},
},
community: {
type: 'object',
title: 'Community',
additionalProperties: true,
properties: {
telegram: { type: 'string', title: 'Telegram' },
twitter: { type: 'string', title: 'Twitter' },
discord: { type: 'string', title: 'Discord' },
instagram: { type: 'string', title: 'Instagram' },
linkedin: { type: 'string', title: 'Linkedin' },
facebook: { type: 'string', title: 'Facebook' },
github: { type: 'string', title: 'Github' },
},
},
},
}}
value={data?.custom_data}
onBlur={(value) => updateConfig('custom_data', value)}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
);
@@ -113,6 +113,7 @@ export function BasicInfoForm({ user, refetch }: { user: API.User; refetch: () =
<FormControl>
<EnhancedInput
type='number'
min={0}
value={field.value}
prefix={currency?.currency_symbol ?? '$'}
formatInput={(value) => unitConversion('centsToDollars', value)}
@@ -136,6 +137,7 @@ export function BasicInfoForm({ user, refetch }: { user: API.User; refetch: () =
<FormControl>
<EnhancedInput
type='number'
min={0}
value={field.value}
prefix={currency?.currency_symbol ?? '$'}
formatInput={(value) => unitConversion('centsToDollars', value)}
@@ -159,6 +161,7 @@ export function BasicInfoForm({ user, refetch }: { user: API.User; refetch: () =
<FormControl>
<EnhancedInput
type='number'
min={0}
value={field.value}
prefix={currency?.currency_symbol ?? '$'}
formatInput={(value) => unitConversion('centsToDollars', value)}
@@ -57,150 +57,154 @@ export function SubscriptionDetail({
{t('onlineDevices')}
</TabsTrigger>
</TabsList>
<TabsContent value='logs'>
<ProTable<API.UserSubscribeLog, Record<string, unknown>>
columns={[
{
accessorKey: 'ip',
header: 'IP',
},
{
accessorKey: 'user_agent',
header: t('userAgent'),
},
{
accessorKey: 'token',
header: t('token'),
},
{
accessorKey: 'created_at',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('created_at')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeLogs({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
});
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
/>
</TabsContent>
<TabsContent value='traffic'>
<ProTable<API.TrafficLog, Record<string, unknown>>
columns={[
{
accessorKey: 'download',
header: t('download'),
cell: ({ row }) => <Display type='traffic' value={row.getValue('download')} />,
},
{
accessorKey: 'upload',
header: t('upload'),
cell: ({ row }) => <Display type='traffic' value={row.getValue('upload')} />,
},
{
accessorKey: 'timestamp',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('timestamp')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeTrafficLogs({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
});
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
/>
</TabsContent>
<TabsContent value='devices'>
<ProTable<API.UserDevice, Record<string, unknown>>
columns={[
{
accessorKey: 'enabled',
header: t('enable'),
cell: ({ row }) => (
<Switch
checked={row.getValue('enabled')}
onChange={(checked) => {
console.log('Switch:', checked);
}}
/>
),
},
{
accessorKey: 'id',
header: 'ID',
},
{
accessorKey: 'identifier',
header: 'IMEI',
},
{
accessorKey: 'user_agent',
header: t('userAgent'),
},
{
accessorKey: 'ip',
header: 'IP',
},
{
accessorKey: 'online',
header: t('loginStatus'),
cell: ({ row }) => (
<Badge variant={row.getValue('online') ? 'default' : 'destructive'}>
{row.getValue('online') ? t('online') : t('offline')}
</Badge>
),
},
{
accessorKey: 'updated_at',
header: t('lastSeen'),
cell: ({ row }) => formatDate(row.getValue('updated_at')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeDevices({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
});
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
actions={{
render: (row) => {
if (!row.identifier) return [];
return [
<ConfirmButton
key='offline'
trigger={<Button variant='destructive'>{t('confirmOffline')}</Button>}
title={t('confirmOffline')}
description={t('kickOfflineConfirm', { ip: row.ip })}
onConfirm={async () => {
await kickOfflineByUserDevice({ id: row.id });
toast.success(t('kickOfflineSuccess'));
}}
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
];
},
}}
/>
</TabsContent>
<div className='mt-4 max-h-[60dvh] overflow-y-auto'>
<TabsContent value='logs'>
<ProTable<API.UserSubscribeLog, Record<string, unknown>>
columns={[
{
accessorKey: 'ip',
header: 'IP',
},
{
accessorKey: 'user_agent',
header: t('userAgent'),
},
{
accessorKey: 'token',
header: t('token'),
},
{
accessorKey: 'created_at',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('created_at')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeLogs({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
});
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
/>
</TabsContent>
<TabsContent value='traffic'>
<ProTable<API.TrafficLog, Record<string, unknown>>
columns={[
{
accessorKey: 'download',
header: t('download'),
cell: ({ row }) => (
<Display type='traffic' value={row.getValue('download')} />
),
},
{
accessorKey: 'upload',
header: t('upload'),
cell: ({ row }) => <Display type='traffic' value={row.getValue('upload')} />,
},
{
accessorKey: 'timestamp',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('timestamp')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeTrafficLogs({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
} as API.GetUserSubscribeTrafficLogsParams);
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
/>
</TabsContent>
<TabsContent value='devices'>
<ProTable<API.UserDevice, Record<string, unknown>>
columns={[
{
accessorKey: 'enabled',
header: t('enable'),
cell: ({ row }) => (
<Switch
checked={row.getValue('enabled')}
onChange={(checked) => {
console.log('Switch:', checked);
}}
/>
),
},
{
accessorKey: 'id',
header: 'ID',
},
{
accessorKey: 'identifier',
header: 'IMEI',
},
{
accessorKey: 'user_agent',
header: t('userAgent'),
},
{
accessorKey: 'ip',
header: 'IP',
},
{
accessorKey: 'online',
header: t('loginStatus'),
cell: ({ row }) => (
<Badge variant={row.getValue('online') ? 'default' : 'destructive'}>
{row.getValue('online') ? t('online') : t('offline')}
</Badge>
),
},
{
accessorKey: 'updated_at',
header: t('lastSeen'),
cell: ({ row }) => formatDate(row.getValue('updated_at')),
},
]}
request={async (pagination) => {
const { data } = await getUserSubscribeDevices({
user_id: userId,
subscribe_id: subscriptionId,
...pagination,
});
return {
list: data.data?.list || [],
total: data.data?.total || 0,
};
}}
actions={{
render: (row) => {
if (!row.identifier) return [];
return [
<ConfirmButton
key='offline'
trigger={<Button variant='destructive'>{t('confirmOffline')}</Button>}
title={t('confirmOffline')}
description={t('kickOfflineConfirm', { ip: row.ip })}
onConfirm={async () => {
await kickOfflineByUserDevice({ id: row.id });
toast.success(t('kickOfflineSuccess'));
}}
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
];
},
}}
/>
</TabsContent>
</div>
</Tabs>
</div>
</DialogContent>
+14 -1
View File
@@ -58,8 +58,21 @@ export default function Page() {
<Switch
defaultChecked={row.getValue('enable')}
onCheckedChange={async (checked) => {
const {
auth_methods,
user_devices,
enable_balance_notify,
enable_login_notify,
enable_subscribe_notify,
enable_trade_notify,
updated_at,
created_at,
id,
...rest
} = row.original;
await updateUserBasicInfo({
...row.original,
user_id: id,
...rest,
enable: checked,
} as unknown as API.UpdateUserBasiceInfoRequest);
toast.success(t('updateSuccess'));
+2
View File
@@ -16,6 +16,7 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
site_logo: '',
keywords: '',
custom_html: '',
custom_data: '',
},
verify: {
turnstile_site_key: '',
@@ -63,6 +64,7 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
verify_code_interval: 60,
},
oauth_methods: [],
web_ad: false,
},
user: undefined,
setCommon: (common) =>
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Zadejte platnou e-mailovou adresu.",
"existingAccount": "Již máte účet?",
"get": "Získat",
"invite": "Pozvánkový kód",
"invite": "Pozvánkový kód (volitelné)",
"message": "#### Vážený uživateli,\n\nDěkujeme za váš zájem a podporu. V důsledku úpravy provozní strategie jsme uzavřeli registraci nových uživatelů. Během této doby nebude používání stávajících účtů nijak ovlivněno.\n\nSnažíme se vám poskytnout lepší služby a zážitky, a proto během uzavření registrace provedeme komplexní optimalizaci systému a aktualizaci funkcí. V budoucnu vás přivítáme s kvalitnějším obsahem a službami.\n\nSledujte naše webové stránky a sociální média pro nejnovější aktualizace a oznámení. Děkujeme za vaše pochopení a podporu.\n\nPokud máte jakékoli dotazy nebo potřebujete pomoc, neváhejte kontaktovat náš zákaznický servis.\n\n**Ještě jednou děkujeme za vaši podporu a pochopení.**",
"passwordMismatch": "Hesla se neshodují",
"success": "Registrace úspěšná, automaticky přihlášeno!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Stav",
"subject": "Předmět",
"template": "Šablona",
"traffic_exceed_email_template": "Šablona oznámení o překročení provozu",
"traffic_exceed_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
"verify_email_template": "Šablona ověřovacího e-mailu",
"verify_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
"whitelistSuffixes": "Povolené přípony",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Platba Alipay",
"alipayf2f": {
"appId": "ID aplikace Alipay",
"invoiceName": "Název vlastního produktu",
"invoiceNameDescription": "Bude zobrazeno na faktuře Alipay",
"privateKey": "Soukromý klíč Alipay",
"publicKey": "Veřejný klíč Alipay",
"sandbox": "Režim sandbox",
"sandboxDescription": "Povolte režim sandbox pro testování plateb"
},
"AlipayF2F": "Alipay Osobně",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Žádat o platbu",
"balance": "Zůstatek",
"batchDelete": "Hromadné smazání",
"cancel": "Zrušit",
"config": "Nastavení",
"configInfo": "Informace o nastavení",
"configPlaceholder": "Vyplňte prosím poskytnutou konfiguraci {field}",
"confirm": "Potvrdit",
"confirmDelete": "Potvrdit smazání",
"copy": "Kopírovat",
"copySuccess": "Úspěšně zkopírováno",
"create": "Přidat platební metodu",
"createPayment": "Přidat platební metodu",
"createSuccess": "Úspěšně vytvořeno",
"delete": "Smazat",
"deleteSuccess": "Úspěšně smazáno",
"deleteWarning": "Opravdu chcete smazat tuto platební metodu? Tuto akci nelze vrátit zpět.",
"description": "Popis",
"descriptionPlaceholder": "Zadejte popis platební metody",
"domain": "Doména",
"domainPlaceholder": "volitelné, např. {example}",
"edit": "Upravit",
"editPayment": "Upravit platební metodu",
"enable": "Povolit",
"enableDescription": "Povolit tento způsob platby",
"epay": {
"key": "KLÍČ",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Pevná částka",
"feeMode": "Způsob účtování",
"feeModeDescription": "Způsob účtování dodatečných poplatků",
"feeModeItems": ["Bez poplatku", "Procento", "Pevná částka", "Obojí výše uvedené"],
"feePercent": "Procentuální poplatek (volitelně)",
"feePercentDescription": "Přidání poplatku k částce objednávky",
"fixedFee": "Pevný poplatek (volitelný)",
"fixedFeeDescription": "Přidání pevného poplatku k částce objednávky",
"iconUrl": "URL ikony (volitelné)",
"iconUrlDescription": "Používá se pro zobrazení na frontendu",
"inputPlaceholder": "Prosím zadejte",
"key": "KLÍČ",
"notifyUrl": "Vlastní oznámení URL (volitelné)",
"notifyUrlDescription": "Oznámení brány budou odeslána na tuto doménu",
"payForRecommendations": "Zaplatit za doporučení",
"pid": "PID",
"saveSuccess": "Uložení bylo úspěšné",
"showName": "Zobrazit název",
"showNameDescription": "Používá se pro zobrazení na frontendu",
"stripe": {
"publicKey": "VEŘEJNÝ KLÍČ",
"secretKey": "TAJNÝ KLÍČ",
"webhookSecret": "PODPIS WEBHOOK KLÍČE"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Poplatek za zpracování",
"icon": "Ikona",
"iconPlaceholder": "Zadejte URL ikony",
"mark": "Identifikátor",
"markPlaceholder": "Zadejte identifikátor platební metody",
"name": "Název",
"namePlaceholder": "Zadejte název platební metody",
"nameRequired": "Název je povinný",
"noFee": "Žádný poplatek",
"notify_url": "URL pro oznámení",
"paymentManagement": "Správa plateb",
"percentFee": "Procento",
"platform": "Platforma",
"searchPlaceholder": "Zadejte hledané výrazy",
"selectPlatform": "Vyberte platformu",
"selectType": "Vyberte typ platby",
"submit": "Odeslat",
"type": "Typ",
"updateSuccess": "Úspěšně aktualizováno"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Zásady ochrany osobních údajů"
},
"site": {
"customData": "Vlastní data",
"customDataDescription": "Vlastní data, používaná pro vlastní data webu",
"customHtml": "Vlastní HTML",
"customHtmlDescription": "Vlastní HTML kód, který bude vložen na konec tagu body na stránce.",
"keywords": "Klíčová slova",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
"existingAccount": "Bereits ein Konto?",
"get": "Erhalten",
"invite": "Einladungscode",
"invite": "Einladungscode (optional)",
"message": "#### Sehr geehrter Nutzer,\n\nVielen Dank für Ihr Interesse und Ihre Unterstützung. Aufgrund einer Anpassung unserer Betriebsstrategie haben wir die Registrierung für neue Nutzer geschlossen. Während dieser Zeit wird die Nutzung für bestehende Nutzer nicht beeinträchtigt.\n\nWir sind bestrebt, Ihnen einen besseren Service und ein besseres Erlebnis zu bieten, und werden daher während der Schließung der Registrierung umfassende Systemoptimierungen und Funktionsupgrades durchführen. In Zukunft werden wir Sie mit hochwertigeren Inhalten und Dienstleistungen willkommen heißen.\n\nBitte folgen Sie unserer Website und unseren Social-Media-Plattformen, um die neuesten Updates und Benachrichtigungen zu erhalten. Vielen Dank für Ihr Verständnis und Ihre Unterstützung.\n\nBei Fragen oder wenn Sie Hilfe benötigen, kontaktieren Sie bitte jederzeit unser Kundenserviceteam.\n\n**Nochmals vielen Dank für Ihre Unterstützung und Ihr Verständnis.**",
"passwordMismatch": "Die eingegebenen Passwörter stimmen nicht überein",
"success": "Registrierung erfolgreich, Sie sind automatisch eingeloggt!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Status",
"subject": "Betreff",
"template": "Vorlage",
"traffic_exceed_email_template": "Benachrichtigung über überschreitenden Verkehr",
"traffic_exceed_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass Sie diese Variablen beibehalten.",
"verify_email_template": "E-Mail-Bestätigungsvorlage",
"verify_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass diese Variablen beibehalten werden.",
"whitelistSuffixes": "Whitelist-Suffixe",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Alipay-Zahlung",
"alipayf2f": {
"appId": "Alipay Anwendungs-ID",
"invoiceName": "Benutzerdefinierter Produktname",
"invoiceNameDescription": "Wird in der Alipay-Rechnung angezeigt",
"privateKey": "Alipay Privatschlüssel",
"publicKey": "Alipay Öffentlicher Schlüssel",
"sandbox": "Sandbox-Modus",
"sandboxDescription": "Aktivieren Sie den Sandbox-Modus, um Zahlungen zu testen"
},
"AlipayF2F": "Alipay Gesicht zu Gesicht",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Zahlung beantragen",
"balance": "Guthaben",
"batchDelete": "Massenlöschung",
"cancel": "Abbrechen",
"config": "Konfiguration",
"configInfo": "Konfigurationsinformationen",
"configPlaceholder": "Bitte füllen Sie die bereitgestellte {field} Konfiguration aus",
"confirm": "Bestätigen",
"confirmDelete": "Löschen bestätigen",
"copy": "Kopieren",
"copySuccess": "Erfolgreich kopiert",
"create": "Zahlungsmethode hinzufügen",
"createPayment": "Zahlungsmethode hinzufügen",
"createSuccess": "Erfolgreich erstellt",
"delete": "Löschen",
"deleteSuccess": "Erfolgreich gelöscht",
"deleteWarning": "Sind Sie sicher, dass Sie diese Zahlungsmethode löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"description": "Beschreibung",
"descriptionPlaceholder": "Geben Sie die Beschreibung der Zahlungsmethode ein",
"domain": "Domain",
"domainPlaceholder": "optional, z.B. {example}",
"edit": "Bearbeiten",
"editPayment": "Zahlungsmethode bearbeiten",
"enable": "Aktivieren",
"enableDescription": "Diese Zahlungsmethode aktivieren",
"epay": {
"key": "SCHLÜSSEL",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Fester Betrag",
"feeMode": "Gebührenmodus",
"feeModeDescription": "Gebührenmodus für zusätzliche Gebühren",
"feeModeItems": ["Keine Gebühr", "Prozentsatz", "Fester Betrag", "Beides"],
"feePercent": "Prozentgebühr (optional)",
"feePercentDescription": "Gebühren werden zusätzlich zum Bestellbetrag hinzugefügt",
"fixedFee": "Feste Gebühr (optional)",
"fixedFeeDescription": "Feste Gebühr zusätzlich zum Bestellbetrag hinzufügen",
"iconUrl": "Symbol-URL (optional)",
"iconUrlDescription": "Zur Anzeige im Frontend verwendet",
"inputPlaceholder": "Bitte eingeben",
"key": "SCHLÜSSEL",
"notifyUrl": "Benutzerdefinierte Benachrichtigungs-URL (optional)",
"notifyUrlDescription": "Gateway-Benachrichtigungen werden an diese Domain gesendet",
"payForRecommendations": "Für Empfehlungen bezahlen",
"pid": "PID",
"saveSuccess": "Erfolgreich gespeichert",
"showName": "Anzeigename",
"showNameDescription": "Zur Anzeige im Frontend verwendet",
"stripe": {
"publicKey": "ÖFFENTLICHER SCHLÜSSEL",
"secretKey": "GEHEIMER SCHLÜSSEL",
"webhookSecret": "WEBHOOK-SCHLÜSSEL-SIGNATUR"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Bearbeitungsgebühr",
"icon": "Symbol",
"iconPlaceholder": "Geben Sie die URL des Symbols ein",
"mark": "Kennung",
"markPlaceholder": "Geben Sie die Kennung der Zahlungsmethode ein",
"name": "Name",
"namePlaceholder": "Geben Sie den Namen der Zahlungsmethode ein",
"nameRequired": "Name ist erforderlich",
"noFee": "Keine Gebühr",
"notify_url": "Benachrichtigungs-URL",
"paymentManagement": "Zahlungsverwaltung",
"percentFee": "Prozentsatz",
"platform": "Plattform",
"searchPlaceholder": "Suchbegriffe eingeben",
"selectPlatform": "Plattform auswählen",
"selectType": "Zahlungsart auswählen",
"submit": "Einreichen",
"type": "Typ",
"updateSuccess": "Erfolgreich aktualisiert"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Datenschutzrichtlinie"
},
"site": {
"customData": "Benutzerdefinierte Daten",
"customDataDescription": "Benutzerdefinierte Daten, die für benutzerdefinierte Daten der Website verwendet werden",
"customHtml": "Benutzerdefiniertes HTML",
"customHtmlDescription": "Benutzerdefinierter HTML-Code, der am Ende des body-Tags der Seite eingefügt werden soll.",
"keywords": "Schlüsselwörter",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Please enter a valid email address.",
"existingAccount": "Already have an account?",
"get": "Get",
"invite": "Invitation code",
"invite": "Invitation code (optional)",
"message": "#### Dear User, Hello!\n\nThank you for your attention and support. Due to adjustments in site operation strategy, we have closed the new user registration function. During this period, existing users will not be affected.\n\nWe are committed to providing you with better service and experience, so we will conduct comprehensive system optimization and feature upgrades during the registration closure. In the future, we will welcome you with better content and services.\n\nPlease follow our website and social media platforms to get the latest updates and notifications. Thank you for your understanding and support.\n\nIf you have any questions or need assistance, please feel free to contact our customer service team.\n\n**Thank you again for your support and understanding.**",
"passwordMismatch": "Passwords do not match",
"success": "Registration successful, automatically logged in!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Status",
"subject": "Subject",
"template": "Template",
"traffic_exceed_email_template": "Traffic Exceed Notice Template",
"traffic_exceed_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
"verify_email_template": "Verification Email Template",
"verify_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
"whitelistSuffixes": "Whitelist Suffixes",
+48 -40
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Alipay payment",
"alipayf2f": {
"appId": "Alipay App ID",
"invoiceName": "Custom Product Name",
"invoiceNameDescription": "Will be displayed on Alipay bill",
"privateKey": "Alipay Private Key",
"publicKey": "Alipay Public Key",
"sandbox": "Sandbox Mode",
"sandboxDescription": "Enable sandbox mode to test payments"
},
"AlipayF2F": "Alipay Face to Face",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Apply for Payment",
"balance": "Balance",
"batchDelete": "Batch Delete",
"cancel": "Cancel",
"config": "Configuration",
"configInfo": "Configuration Information",
"configPlaceholder": "Please fill in the provided {field} configuration",
"confirm": "Confirm",
"confirmDelete": "Confirm Delete",
"copy": "Copy",
"copySuccess": "Copied successfully",
"create": "Add Payment Method",
"createPayment": "Add Payment Method",
"createSuccess": "Created successfully",
"delete": "Delete",
"deleteSuccess": "Deleted successfully",
"deleteWarning": "Are you sure you want to delete this payment method? This action cannot be undone.",
"description": "Description",
"descriptionPlaceholder": "Enter payment method description",
"domain": "Domain",
"domainPlaceholder": "optional, e.g. {example}",
"edit": "Edit",
"editPayment": "Edit Payment Method",
"enable": "Enable",
"enableDescription": "Enable this payment method",
"epay": {
"key": "KEY",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Fixed Amount",
"feeMode": "Fee Mode",
"feeModeDescription": "Fee charging method for additional fees",
"feeModeItems": ["No Fee", "Percentage", "Fixed Amount", "Both"],
"feePercent": "Percentage Fee (optional)",
"feePercentDescription": "Add fee on top of order amount",
"fixedFee": "Fixed Fee (optional)",
"fixedFeeDescription": "Add fixed fee on top of order amount",
"iconUrl": "Icon URL (optional)",
"iconUrlDescription": "Used for frontend display",
"inputPlaceholder": "Please enter",
"key": "KEY",
"notifyUrl": "Custom Notification Domain (optional)",
"notifyUrlDescription": "Gateway notifications will be sent to this domain",
"payForRecommendations": "Pay for Recommendations",
"pid": "PID",
"saveSuccess": "Save Successful",
"showName": "Display Name",
"showNameDescription": "Used for frontend display",
"stripe": {
"publicKey": "PUBLIC KEY",
"secretKey": "SECRET KEY",
"webhookSecret": "WEBHOOK Secret Key"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"feePercent": "Fee Percentage",
"fixedFee": "Fixed Amount",
"handlingFee": "Handling Fee",
"icon": "Icon",
"iconPlaceholder": "Enter icon URL",
"mark": "Identifier",
"markPlaceholder": "Enter payment method identifier",
"name": "Name",
"namePlaceholder": "Enter payment method name",
"nameRequired": "Name is required",
"noFee": "No Fee",
"notify_url": "Notify URL",
"paymentManagement": "Payment Management",
"percentFee": "Percentage",
"platform": "Platform",
"searchPlaceholder": "Enter search terms",
"selectPlatform": "Select Platform",
"selectType": "Select payment type",
"submit": "Submit",
"type": "Type",
"updateSuccess": "Updated successfully"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Privacy Policy"
},
"site": {
"customData": "Custom Data",
"customDataDescription": "Custom Data, used for custom data of the site",
"customHtml": "Custom HTML",
"customHtmlDescription": "Custom HTML code to be injected into the bottom of the site's body tag.",
"keywords": "Keywords",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Por favor, introduce una dirección de correo electrónico válida.",
"existingAccount": "¿Ya tienes una cuenta?",
"get": "Obtener",
"invite": "Código de invitación",
"invite": "Código de invitación (opcional)",
"message": "#### ¡Estimado usuario!\n\nGracias por su interés y apoyo. Debido a un ajuste en la estrategia de operación del sitio, hemos cerrado la función de registro para nuevos usuarios. Durante este período, el uso por parte de los usuarios existentes no se verá afectado.\n\nNos comprometemos a brindarle un mejor servicio y experiencia, por lo que realizaremos una optimización completa del sistema y una actualización de funciones durante el cierre del registro. En el futuro, le daremos la bienvenida con contenido y servicios de mayor calidad.\n\nPor favor, siga nuestro sitio web y plataformas de redes sociales para obtener las últimas actualizaciones y notificaciones. Agradecemos su comprensión y apoyo.\n\nSi tiene alguna pregunta o necesita ayuda, no dude en ponerse en contacto con nuestro equipo de atención al cliente.\n\n**Nuevamente, gracias por su apoyo y comprensión.**",
"passwordMismatch": "Las contraseñas no coinciden",
"success": "¡Registro exitoso, sesión iniciada automáticamente!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Estado",
"subject": "Asunto",
"template": "Plantilla",
"traffic_exceed_email_template": "Plantilla de Notificación de Exceso de Tráfico",
"traffic_exceed_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
"verify_email_template": "Plantilla de Correo Electrónico de Verificación",
"verify_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrese de mantener estas variables.",
"whitelistSuffixes": "Sufijos de la lista blanca",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Pago con Alipay",
"alipayf2f": {
"appId": "ID de la aplicación de Alipay",
"invoiceName": "Nombre personalizado del producto",
"invoiceNameDescription": "Se mostrará en la factura de Alipay",
"privateKey": "Clave privada de Alipay",
"publicKey": "Clave pública de Alipay",
"sandbox": "Modo sandbox",
"sandboxDescription": "Habilitar el modo sandbox para probar el pago"
},
"AlipayF2F": "Alipay Cara a Cara",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Solicitar Pago",
"balance": "Saldo",
"batchDelete": "Eliminar en Lote",
"cancel": "Cancelar",
"config": "Configuración",
"configInfo": "Información de Configuración",
"configPlaceholder": "Por favor, complete la configuración de {field} proporcionada",
"confirm": "Confirmar",
"confirmDelete": "Confirmar Eliminación",
"copy": "Copiar",
"copySuccess": "Copiado con éxito",
"create": "Agregar Método de Pago",
"createPayment": "Agregar Método de Pago",
"createSuccess": "Creado con éxito",
"delete": "Eliminar",
"deleteSuccess": "Eliminado con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar este método de pago? Esta acción no se puede deshacer.",
"description": "Descripción",
"descriptionPlaceholder": "Ingrese la descripción del método de pago",
"domain": "Dominio",
"domainPlaceholder": "opcional, p. ej. {example}",
"edit": "Editar",
"editPayment": "Editar Método de Pago",
"enable": "Habilitar",
"enableDescription": "Habilitar este método de pago",
"epay": {
"key": "CLAVE",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Monto Fijo",
"feeMode": "Modo de cobro",
"feeModeDescription": "Modo de cobro de tarifas adicionales",
"feeModeItems": ["Sin tarifa", "Porcentaje", "Cantidad fija", "Ambos anteriores"],
"feePercent": "Porcentaje de tarifa (opcional)",
"feePercentDescription": "Se añade una tarifa sobre el monto del pedido",
"fixedFee": "Tarifa fija (opcional)",
"fixedFeeDescription": "Se añade una tarifa fija sobre el monto del pedido",
"iconUrl": "URL del icono (opcional)",
"iconUrlDescription": "Usado para mostrar en el frontend",
"inputPlaceholder": "Por favor, introduzca",
"key": "CLAVE",
"notifyUrl": "Dominio de notificación personalizado (opcional)",
"notifyUrlDescription": "La notificación del gateway se enviará a este dominio",
"payForRecommendations": "Pagar por recomendaciones",
"pid": "PID",
"saveSuccess": "Guardado exitosamente",
"showName": "Mostrar nombre",
"showNameDescription": "Usado para mostrar en el frontend",
"stripe": {
"publicKey": "CLAVE PÚBLICA",
"secretKey": "CLAVE SECRETA",
"webhookSecret": "FIRMA DE CLAVE WEBHOOK"
},
"url": "URL",
"wechatPay": "Pago con WeChat"
"handlingFee": "Tarifa de manejo",
"icon": "Ícono",
"iconPlaceholder": "Ingrese la URL del ícono",
"mark": "Identificador",
"markPlaceholder": "Ingrese el identificador del método de pago",
"name": "Nombre",
"namePlaceholder": "Ingrese el nombre del método de pago",
"nameRequired": "El nombre es obligatorio",
"noFee": "Sin Tarifa",
"notify_url": "URL de notificación",
"paymentManagement": "Gestión de Pagos",
"percentFee": "Porcentaje",
"platform": "Plataforma",
"searchPlaceholder": "Ingrese términos de búsqueda",
"selectPlatform": "Seleccionar Plataforma",
"selectType": "Seleccionar tipo de pago",
"submit": "Enviar",
"type": "Tipo",
"updateSuccess": "Actualizado con éxito"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Política de Privacidad"
},
"site": {
"customData": "Datos Personalizados",
"customDataDescription": "Datos Personalizados, utilizados para datos personalizados del sitio",
"customHtml": "HTML personalizado",
"customHtmlDescription": "Código HTML personalizado que se inyectará en la parte inferior de la etiqueta body del sitio.",
"keywords": "Palabras clave",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Por favor, ingresa una dirección de correo electrónico válida.",
"existingAccount": "¿Ya tienes una cuenta?",
"get": "Obtener",
"invite": "Código de invitación",
"invite": "Código de invitación (opcional)",
"message": "#### Estimado usuario,\n\nGracias por su interés y apoyo. Debido a un ajuste en la estrategia de operación del sitio, hemos cerrado la función de registro para nuevos usuarios. Durante este período, el uso por parte de los usuarios existentes no se verá afectado.\n\nNos comprometemos a ofrecerle un mejor servicio y experiencia, por lo que realizaremos una optimización completa del sistema y una actualización de funciones durante el cierre del registro. En el futuro, le daremos la bienvenida con contenido y servicios de mayor calidad.\n\nPor favor, siga nuestro sitio web y plataformas de redes sociales para obtener las últimas actualizaciones y notificaciones. Agradecemos su comprensión y apoyo.\n\nSi tiene alguna pregunta o necesita ayuda, no dude en ponerse en contacto con nuestro equipo de atención al cliente.\n\n**Nuevamente, gracias por su apoyo y comprensión.**",
"passwordMismatch": "Las contraseñas no coinciden",
"success": "¡Registro exitoso, has iniciado sesión automáticamente!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Estado",
"subject": "Asunto",
"template": "Plantilla",
"traffic_exceed_email_template": "Plantilla de Notificación de Exceso de Tráfico",
"traffic_exceed_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
"verify_email_template": "Plantilla de Correo Electrónico de Verificación",
"verify_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
"whitelistSuffixes": "Sufijos de Lista Blanca",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Pago con Alipay",
"alipayf2f": {
"appId": "ID de la aplicación de Alipay",
"invoiceName": "Nombre personalizado del producto",
"invoiceNameDescription": "Se mostrará en la factura de Alipay",
"privateKey": "Clave privada de Alipay",
"publicKey": "Clave pública de Alipay",
"sandbox": "Modo sandbox",
"sandboxDescription": "Habilitar el modo sandbox para probar el pago"
},
"AlipayF2F": "Alipay Cara a Cara",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Solicitar Pago",
"balance": "Saldo",
"batchDelete": "Eliminar en Lote",
"cancel": "Cancelar",
"config": "Configuración",
"configInfo": "Información de Configuración",
"configPlaceholder": "Por favor, complete la configuración de {field} proporcionada",
"confirm": "Confirmar",
"confirmDelete": "Confirmar Eliminación",
"copy": "Copiar",
"copySuccess": "Copiado con éxito",
"create": "Agregar Método de Pago",
"createPayment": "Agregar Método de Pago",
"createSuccess": "Creado con éxito",
"delete": "Eliminar",
"deleteSuccess": "Eliminado con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar este método de pago? Esta acción no se puede deshacer.",
"description": "Descripción",
"descriptionPlaceholder": "Ingresa la descripción del método de pago",
"domain": "Dominio",
"domainPlaceholder": "opcional, p. ej. {example}",
"edit": "Editar",
"editPayment": "Editar Método de Pago",
"enable": "Habilitar",
"enableDescription": "Habilitar este método de pago",
"epay": {
"key": "CLAVE",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Monto Fijo",
"feeMode": "Modo de cobro",
"feeModeDescription": "Modo de cobro de tarifas adicionales",
"feeModeItems": ["Sin tarifa", "Porcentaje", "Cantidad fija", "Ambos"],
"feePercent": "Porcentaje de tarifa (opcional)",
"feePercentDescription": "Se añade una tarifa sobre el monto del pedido",
"fixedFee": "Cuota fija (opcional)",
"fixedFeeDescription": "Agregar una tarifa fija sobre el monto del pedido",
"iconUrl": "URL del ícono (opcional)",
"iconUrlDescription": "Usado para mostrar en el frontend",
"inputPlaceholder": "Por favor ingrese",
"key": "LLAVE",
"notifyUrl": "Dominio de notificación personalizado (opcional)",
"notifyUrlDescription": "La notificación del gateway se enviará a este dominio",
"payForRecommendations": "Pagar por recomendaciones",
"pid": "PID",
"saveSuccess": "Guardado exitoso",
"showName": "Mostrar nombre",
"showNameDescription": "Usado para mostrar en el frontend",
"stripe": {
"publicKey": "CLAVE PÚBLICA",
"secretKey": "CLAVE SECRETA",
"webhookSecret": "FIRMA DE SECRETO DE WEBHOOK"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Cargo por manejo",
"icon": "Ícono",
"iconPlaceholder": "Ingrese la URL del ícono",
"mark": "Identificador",
"markPlaceholder": "Ingrese el identificador del método de pago",
"name": "Nombre",
"namePlaceholder": "Ingrese el nombre del método de pago",
"nameRequired": "El nombre es obligatorio",
"noFee": "Sin Tarifa",
"notify_url": "URL de notificación",
"paymentManagement": "Gestión de Pagos",
"percentFee": "Porcentaje",
"platform": "Plataforma",
"searchPlaceholder": "Ingrese términos de búsqueda",
"selectPlatform": "Seleccionar Plataforma",
"selectType": "Seleccionar tipo de pago",
"submit": "Enviar",
"type": "Tipo",
"updateSuccess": "Actualizado con éxito"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Política de Privacidad"
},
"site": {
"customData": "Datos Personalizados",
"customDataDescription": "Datos Personalizados, utilizados para datos personalizados del sitio",
"customHtml": "HTML personalizado",
"customHtmlDescription": "Código HTML personalizado que se inyectará al final de la etiqueta body del sitio.",
"keywords": "Palabras clave",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "لطفاً یک آدرس ایمیل معتبر وارد کنید.",
"existingAccount": "آیا قبلاً حساب کاربری دارید؟",
"get": "دریافت",
"invite": "کد دعوت",
"invite": "کد دعوت (اختیاری)",
"message": "#### کاربر گرامی، سلام!\n\nاز توجه و حمایت شما سپاسگزاریم. به دلیل تغییرات در استراتژی عملیاتی سایت، عملکرد ثبت‌نام کاربران جدید را متوقف کرده‌ایم. در این مدت، کاربران فعلی تحت تأثیر قرار نخواهند گرفت.\n\nما متعهد به ارائه خدمات و تجربه بهتر به شما هستیم، بنابراین در طول این دوره، بهینه‌سازی جامع سیستم و ارتقاء ویژگی‌ها را انجام خواهیم داد. در آینده، با محتوای و خدمات بهتر از شما استقبال خواهیم کرد.\n\nلطفاً برای دریافت آخرین به‌روزرسانی‌ها و اطلاعیه‌ها، وب‌سایت و پلتفرم‌های اجتماعی ما را دنبال کنید. از درک و حمایت شما سپاسگزاریم.\n\nاگر سوالی دارید یا به کمک نیاز دارید، لطفاً با تیم خدمات مشتری ما تماس بگیرید.\n\n**بار دیگر از حمایت و درک شما سپاسگزاریم.**",
"passwordMismatch": "رمزهای عبور مطابقت ندارند",
"success": "ثبت‌نام موفقیت‌آمیز بود، به‌طور خودکار وارد شدید!",
+2
View File
@@ -39,6 +39,8 @@
"status": "وضعیت",
"subject": "موضوع",
"template": "الگو",
"traffic_exceed_email_template": "الگوی اعلان ترافیک بیش از حد",
"traffic_exceed_email_templateDescription": "جایگزین‌های {after}.variable{before} با داده‌های واقعی خواهد شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
"verify_email_template": "قالب ایمیل تأیید",
"verify_email_templateDescription": "جای‌گذاری‌های {after}.variable{before} با داده‌های واقعی جایگزین خواهند شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
"whitelistSuffixes": "پسوندهای لیست سفید",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "پرداخت علی‌پی",
"alipayf2f": {
"appId": "شناسه برنامه Alipay",
"invoiceName": "نام محصول سفارشی",
"invoiceNameDescription": "در صورتحساب Alipay نمایش داده خواهد شد",
"privateKey": "کلید خصوصی Alipay",
"publicKey": "کلید عمومی Alipay",
"sandbox": "حالت Sandbox",
"sandboxDescription": "حالت sandbox را برای آزمایش پرداخت‌ها فعال کنید"
},
"AlipayF2F": "علی‌پی چهره به چهره",
"EPay": "ای‌پی",
"Stripe": "استرایپ",
"applyForPayment": "درخواست پرداخت",
"balance": "موجودی",
"batchDelete": "حذف دسته‌ای",
"cancel": "لغو",
"config": "پیکربندی",
"configInfo": "اطلاعات پیکربندی",
"configPlaceholder": "لطفاً پیکربندی {field} ارائه شده را پر کنید",
"confirm": "تأیید",
"confirmDelete": "تأیید حذف",
"copy": "کپی",
"copySuccess": "با موفقیت کپی شد",
"create": "افزودن روش پرداخت",
"createPayment": "افزودن روش پرداخت",
"createSuccess": "با موفقیت ایجاد شد",
"delete": "حذف",
"deleteSuccess": "با موفقیت حذف شد",
"deleteWarning": "آیا مطمئن هستید که می‌خواهید این روش پرداخت را حذف کنید؟ این عمل قابل بازگشت نیست.",
"description": "توضیحات",
"descriptionPlaceholder": "توضیحات روش پرداخت را وارد کنید",
"domain": "دامنه",
"domainPlaceholder": "اختیاری، به عنوان مثال {example}",
"edit": "ویرایش",
"editPayment": "ویرایش روش پرداخت",
"enable": "فعال کردن",
"enableDescription": "این روش پرداخت را فعال کنید",
"epay": {
"key": "کلید",
"pid": "شناسه محصول",
"url": "نشانی وب"
},
"feeAmount": "مقدار ثابت",
"feeMode": "حالت هزینه",
"feeModeDescription": "روش دریافت هزینه برای هزینه‌های اضافی",
"feeModeItems": ["بدون هزینه", "درصدی", "مبلغ ثابت", "هر دو"],
"feePercent": "درصد کارمزد (اختیاری)",
"feePercentDescription": "افزودن کارمزد به مبلغ سفارش",
"fixedFee": "هزینه ثابت (اختیاری)",
"fixedFeeDescription": "افزودن هزینه ثابت به مبلغ سفارش",
"iconUrl": درس آیکون (اختیاری)",
"iconUrlDescription": "برای نمایش در رابط کاربری استفاده می‌شود",
"inputPlaceholder": "لطفاً وارد کنید",
"key": "کلید",
"notifyUrl": "دامنه اعلان سفارشی (اختیاری)",
"notifyUrlDescription": "اعلان‌های درگاه به این دامنه ارسال خواهند شد",
"payForRecommendations": "پرداخت برای توصیه‌ها",
"pid": "شناسه فرآیند",
"saveSuccess": "ذخیره با موفقیت انجام شد",
"showName": "نمایش نام",
"showNameDescription": "برای نمایش در قسمت جلویی استفاده می‌شود",
"stripe": {
"publicKey": "کلید عمومی",
"secretKey": "کلید مخفی",
"webhookSecret": "کلید مخفی وب‌هوک"
},
"url": "آدرس اینترنتی",
"wechatPay": "وی‌چت پی"
"handlingFee": "هزینه خدمات",
"icon": یکون",
"iconPlaceholder": "آدرس URL آیکون را وارد کنید",
"mark": "شناسه",
"markPlaceholder": "شناسه روش پرداخت را وارد کنید",
"name": "نام",
"namePlaceholder": "نام روش پرداخت را وارد کنید",
"nameRequired": "نام الزامی است",
"noFee": "بدون هزینه",
"notify_url": "آدرس اطلاع‌رسانی",
"paymentManagement": "مدیریت پرداخت",
"percentFee": "درصد",
"platform": "پلتفرم",
"searchPlaceholder": "عبارات جستجو را وارد کنید",
"selectPlatform": "انتخاب پلتفرم",
"selectType": "انتخاب نوع پرداخت",
"submit": "ارسال",
"type": "نوع",
"updateSuccess": "با موفقیت به‌روزرسانی شد"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "سیاست حفظ حریم خصوصی"
},
"site": {
"customData": "داده‌های سفارشی",
"customDataDescription": "داده‌های سفارشی، استفاده شده برای داده‌های سفارشی سایت",
"customHtml": "HTML سفارشی",
"customHtmlDescription": "کد HTML سفارشی که باید در انتهای تگ body سایت وارد شود.",
"keywords": "کلمات کلیدی",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Anna kelvollinen sähköpostiosoite.",
"existingAccount": "Onko sinulla jo tili?",
"get": "Hanki",
"invite": "Kutsukoodi",
"invite": "Kutsukoodi (valinnainen)",
"message": "#### Arvoisa käyttäjä,\n\nKiitos mielenkiinnostasi ja tuestasi. Sivuston toimintastrategian muutosten vuoksi olemme sulkeneet uusien käyttäjien rekisteröinnin. Tänä aikana nykyisten käyttäjien käyttö ei vaikutu millään tavalla.\n\nOlemme sitoutuneet tarjoamaan sinulle parempaa palvelua ja kokemusta, joten rekisteröinnin sulkemisen aikana suoritamme kattavan järjestelmän optimoinnin ja toiminnallisuuden päivityksen. Tulevaisuudessa toivotamme sinut tervetulleeksi entistä laadukkaamman sisällön ja palvelun kera.\n\nSeuraa verkkosivustoamme ja sosiaalisen median alustoja saadaksesi uusimmat päivitykset ja ilmoitukset. Kiitos ymmärryksestäsi ja tuestasi.\n\nJos sinulla on kysyttävää tai tarvitset apua, ota yhteyttä asiakaspalvelutiimiimme.\n\n**Kiitos vielä kerran tuestasi ja ymmärryksestäsi.**",
"passwordMismatch": "Salasanat eivät täsmää",
"success": "Rekisteröinti onnistui, olet kirjautunut automaattisesti!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Tila",
"subject": "Aihe",
"template": "Malline",
"traffic_exceed_email_template": "Liikenteen Ylitysilmoitusmalli",
"traffic_exceed_email_templateDescription": "{after}.variable{before} -paikat korvataan todellisilla tiedoilla. Varmista, että säilytät nämä muuttujat.",
"verify_email_template": "Sähköpostin Vahvistusmalli",
"verify_email_templateDescription": "Paikkamerkit {after}.variable{before} korvataan todellisilla tiedoilla. Varmista, että pidät nämä muuttujat.",
"whitelistSuffixes": "Sallittujen luetteloiden päätteet",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Alipay-maksu",
"alipayf2f": {
"appId": "Alipay-sovelluksen ID",
"invoiceName": "Mukautettu tuotteen nimi",
"invoiceNameDescription": "Näkyy Alipay-laskussa",
"privateKey": "Alipay-yksityinen avain",
"publicKey": "Alipay-julkinen avain",
"sandbox": "Hiekkalaatikkotila",
"sandboxDescription": "Ota hiekkalaatikkotila käyttöön maksujen testaamiseksi"
},
"AlipayF2F": "Alipay Kasvokkain",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Hae maksua",
"balance": "Saldo",
"batchDelete": "Ryhmän poisto",
"cancel": "Peruuta",
"config": "Konfiguraatio",
"configInfo": "Konfiguraatio tiedot",
"configPlaceholder": "Täytä annettu {field} konfiguraatio",
"confirm": "Vahvista",
"confirmDelete": "Vahvista poisto",
"copy": "Kopioi",
"copySuccess": "Kopiointi onnistui",
"create": "Lisää maksutapa",
"createPayment": "Lisää maksutapa",
"createSuccess": "Luonti onnistui",
"delete": "Poista",
"deleteSuccess": "Poisto onnistui",
"deleteWarning": "Oletko varma, että haluat poistaa tämän maksutavan? Tätä toimintoa ei voi peruuttaa.",
"description": "Kuvaus",
"descriptionPlaceholder": "Syötä maksutavan kuvaus",
"domain": "Verkkotunnus",
"domainPlaceholder": "valinnainen, esim. {esimerkki}",
"edit": "Muokkaa",
"editPayment": "Muokkaa maksutapaa",
"enable": "Ota käyttöön",
"enableDescription": "Ota tämä maksutapa käyttöön",
"epay": {
"key": "AVAIN",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Kiinteä summa",
"feeMode": "Maksutapa",
"feeModeDescription": "Lisämaksun veloitustapa",
"feeModeItems": ["Ei käsittelymaksua", "Prosenttiosuus", "Kiinteä summa", "Molemmat yllä olevat"],
"feePercent": "Prosenttiosuusmaksu (valinnainen)",
"feePercentDescription": "Lisätään maksu tilauksen summan päälle",
"fixedFee": "Kiinteä maksu (valinnainen)",
"fixedFeeDescription": "Lisää kiinteä maksu tilauksen summan päälle",
"iconUrl": "Kuvakkeen URL (valinnainen)",
"iconUrlDescription": "Käytetään etunäytössä",
"inputPlaceholder": "Kirjoita tähän",
"key": "AVAIN",
"notifyUrl": "Mukautettu ilmoitusalue (valinnainen)",
"notifyUrlDescription": "Yhdyskäytävän ilmoitus lähetetään tähän verkkotunnukseen",
"payForRecommendations": "Maksa suosituksista",
"pid": "PID",
"saveSuccess": "Tallennus onnistui",
"showName": "Näytä nimi",
"showNameDescription": "Näytetään käyttöliittymässä",
"stripe": {
"publicKey": "JULKINEN AVAIN",
"secretKey": "SALAINEN AVAIN",
"webhookSecret": "WEBHOOK-SALAINEN ALLEKIRJOITUS"
},
"url": "URL",
"wechatPay": "WeChat-maksu"
"handlingFee": "Käsittelymaksu",
"icon": "Ikoni",
"iconPlaceholder": "Syötä ikonin URL-osoite",
"mark": "Tunniste",
"markPlaceholder": "Syötä maksutavan tunniste",
"name": "Nimi",
"namePlaceholder": "Syötä maksutavan nimi",
"nameRequired": "Nimi on pakollinen",
"noFee": "Ei maksua",
"notify_url": "Ilmoitus-URL",
"paymentManagement": "Maksujen hallinta",
"percentFee": "Prosentti",
"platform": "Alusta",
"searchPlaceholder": "Syötä hakusanat",
"selectPlatform": "Valitse alusta",
"selectType": "Valitse maksutyyppi",
"submit": "Lähetä",
"type": "Tyyppi",
"updateSuccess": "Päivitys onnistui"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Tietosuojakäytäntö"
},
"site": {
"customData": "Mukautettu tieto",
"customDataDescription": "Mukautettu tieto, jota käytetään sivuston mukautettuun tietoon",
"customHtml": "Mukautettu HTML",
"customHtmlDescription": "Mukautettu HTML-koodi, joka lisätään sivuston body -tagin loppuun.",
"keywords": "Avainsanat",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Veuillez entrer une adresse e-mail valide.",
"existingAccount": "Vous avez déjà un compte ?",
"get": "Obtenir",
"invite": "Code d'invitation",
"invite": "Code d'invitation (facultatif)",
"message": "#### Cher utilisateur,\n\nMerci pour votre intérêt et votre soutien. En raison d'un ajustement de notre stratégie opérationnelle, nous avons fermé la fonction d'inscription pour les nouveaux utilisateurs. Pendant cette période, l'utilisation par les utilisateurs existants ne sera pas affectée.\n\nNous nous engageons à vous offrir un meilleur service et une meilleure expérience, c'est pourquoi nous procéderons à une optimisation complète du système et à une mise à niveau des fonctionnalités pendant la fermeture des inscriptions. À l'avenir, nous vous accueillerons avec un contenu et des services de meilleure qualité.\n\nVeuillez suivre notre site web et nos plateformes de médias sociaux pour obtenir les dernières nouvelles et notifications. Merci pour votre compréhension et votre soutien.\n\nSi vous avez des questions ou avez besoin d'aide, n'hésitez pas à contacter notre équipe de service client.\n\n**Merci encore pour votre soutien et votre compréhension.**",
"passwordMismatch": "Les mots de passe saisis ne correspondent pas",
"success": "Inscription réussie, vous êtes maintenant connecté automatiquement !",
+2
View File
@@ -39,6 +39,8 @@
"status": "Statut",
"subject": "Sujet",
"template": "Modèle",
"traffic_exceed_email_template": "Modèle de notification de dépassement de trafic",
"traffic_exceed_email_templateDescription": "Les espaces réservés {after}.variable{before} seront remplacés par des données réelles. Assurez-vous de conserver ces variables.",
"verify_email_template": "Modèle d'Email de Vérification",
"verify_email_templateDescription": "Les espaces réservés {after}.variable{before} seront remplacés par des données réelles. Assurez-vous de conserver ces variables.",
"whitelistSuffixes": "Suffixes de la liste blanche",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Paiement par Alipay",
"alipayf2f": {
"appId": "ID de l'application Alipay",
"invoiceName": "Nom personnalisé du produit",
"invoiceNameDescription": "S'affichera sur la facture Alipay",
"privateKey": "Clé privée Alipay",
"publicKey": "Clé publique Alipay",
"sandbox": "Mode bac à sable",
"sandboxDescription": "Activez le mode bac à sable pour tester le paiement"
},
"AlipayF2F": "Alipay Face à Face",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Demander un paiement",
"balance": "Solde",
"batchDelete": "Suppression par lot",
"cancel": "Annuler",
"config": "Configuration",
"configInfo": "Informations de configuration",
"configPlaceholder": "Veuillez remplir la configuration {field} fournie",
"confirm": "Confirmer",
"confirmDelete": "Confirmer la suppression",
"copy": "Copier",
"copySuccess": "Copié avec succès",
"create": "Ajouter un mode de paiement",
"createPayment": "Ajouter un mode de paiement",
"createSuccess": "Créé avec succès",
"delete": "Supprimer",
"deleteSuccess": "Supprimé avec succès",
"deleteWarning": "Êtes-vous sûr de vouloir supprimer ce mode de paiement ? Cette action ne peut pas être annulée.",
"description": "Description",
"descriptionPlaceholder": "Entrez la description du mode de paiement",
"domain": "Domaine",
"domainPlaceholder": "facultatif, par exemple {exemple}",
"edit": "Modifier",
"editPayment": "Modifier le mode de paiement",
"enable": "Activer",
"enableDescription": "Activer ce mode de paiement",
"epay": {
"key": "CLÉ",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Montant fixe",
"feeMode": "Mode de facturation",
"feeModeDescription": "Mode de facturation des frais supplémentaires",
"feeModeItems": ["Pas de frais", "Pourcentage", "Montant fixe", "Les deux ci-dessus"],
"feePercent": "Pourcentage de frais (optionnel)",
"feePercentDescription": "Ajouter des frais au montant de la commande",
"fixedFee": "Frais fixes (optionnel)",
"fixedFeeDescription": "Ajouter des frais fixes au montant de la commande",
"iconUrl": "URL de l'icône (facultatif)",
"iconUrlDescription": "Utilisé pour l'affichage frontal",
"inputPlaceholder": "Veuillez entrer",
"key": "CLÉ",
"notifyUrl": "Domaine de notification personnalisé (facultatif)",
"notifyUrlDescription": "Les notifications de la passerelle seront envoyées à ce domaine",
"payForRecommendations": "Payer pour les recommandations",
"pid": "PID",
"saveSuccess": "Enregistrement réussi",
"showName": "Afficher le nom",
"showNameDescription": "Utilisé pour l'affichage frontal",
"stripe": {
"publicKey": "CLÉ PUBLIQUE",
"secretKey": "CLÉ SECRÈTE",
"webhookSecret": "SIGNATURE DE CLÉ WEBHOOK"
},
"url": "URL",
"wechatPay": "Paiement WeChat"
"handlingFee": "Frais de traitement",
"icon": "Icône",
"iconPlaceholder": "Entrez l'URL de l'icône",
"mark": "Identifiant",
"markPlaceholder": "Entrez l'identifiant du mode de paiement",
"name": "Nom",
"namePlaceholder": "Entrez le nom du mode de paiement",
"nameRequired": "Le nom est requis",
"noFee": "Pas de frais",
"notify_url": "URL de notification",
"paymentManagement": "Gestion des paiements",
"percentFee": "Pourcentage",
"platform": "Plateforme",
"searchPlaceholder": "Entrez des termes de recherche",
"selectPlatform": "Sélectionner la plateforme",
"selectType": "Sélectionner le type de paiement",
"submit": "Soumettre",
"type": "Type",
"updateSuccess": "Mis à jour avec succès"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Politique de confidentialité"
},
"site": {
"customData": "Données personnalisées",
"customDataDescription": "Données personnalisées, utilisées pour les données personnalisées du site",
"customHtml": "HTML personnalisé",
"customHtmlDescription": "Code HTML personnalisé à injecter dans le bas de la balise body du site.",
"keywords": "Mots-clés",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "कृपया एक मान्य ईमेल पता दर्ज करें।",
"existingAccount": "पहले से खाता है?",
"get": "प्राप्त करें",
"invite": "आमंत्रण कोड",
"invite": "आमंत्रण कोड (वैकल्पिक)",
"message": "#### प्रिय उपयोगकर्ता, नमस्ते!\n\nहमारे प्रति आपकी रुचि और समर्थन के लिए धन्यवाद। साइट संचालन रणनीति में बदलाव के कारण, हमने नए उपयोगकर्ता पंजीकरण को बंद कर दिया है। इस दौरान, मौजूदा उपयोगकर्ताओं के उपयोग पर कोई प्रभाव नहीं पड़ेगा।\n\nहम आपको बेहतर सेवा और अनुभव प्रदान करने के लिए प्रतिबद्ध हैं, इसलिए पंजीकरण बंद होने के दौरान हम व्यापक प्रणाली अनुकूलन और कार्यक्षमता उन्नयन करेंगे। भविष्य में, हम आपको बेहतर सामग्री और सेवाओं के साथ स्वागत करेंगे।\n\nहमारी वेबसाइट और सोशल मीडिया प्लेटफॉर्म पर नवीनतम अपडेट और सूचनाएं प्राप्त करने के लिए ध्यान दें। आपकी समझ और समर्थन के लिए धन्यवाद।\n\nयदि आपके कोई प्रश्न हैं या सहायता की आवश्यकता है, तो कृपया हमारी ग्राहक सेवा टीम से संपर्क करें।\n\n**आपके समर्थन और समझ के लिए एक बार फिर धन्यवाद।**",
"passwordMismatch": "दोनों बार दर्ज किया गया पासवर्ड मेल नहीं खा रहा है",
"success": "पंजीकरण सफल, स्वचालित रूप से लॉग इन हो गया!",
+2
View File
@@ -39,6 +39,8 @@
"status": "स्थिति",
"subject": "विषय",
"template": "टेम्पलेट",
"traffic_exceed_email_template": "ट्रैफिक अधिकता सूचना टेम्पलेट",
"traffic_exceed_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर्स को वास्तविक डेटा के साथ प्रतिस्थापित किया जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
"verify_email_template": "सत्यापन ईमेल टेम्पलेट",
"verify_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर्स को वास्तविक डेटा से बदला जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
"whitelistSuffixes": "श्वेतसूची प्रत्यय",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "अलीपे भुगतान",
"alipayf2f": {
"appId": "अलीपे एप्लिकेशन आईडी",
"invoiceName": "कस्टम उत्पाद नाम",
"invoiceNameDescription": "अलीपे बिल में प्रदर्शित होगा",
"privateKey": "अलीपे निजी कुंजी",
"publicKey": "अलीपे सार्वजनिक कुंजी",
"sandbox": "सैंडबॉक्स मोड",
"sandboxDescription": "भुगतान का परीक्षण करने के लिए सैंडबॉक्स मोड सक्षम करें"
},
"AlipayF2F": "अलीपे फेस टू फेस",
"EPay": "ईपे",
"Stripe": "स्ट्राइप",
"applyForPayment": "भुगतान के लिए आवेदन करें",
"balance": "शेष",
"batchDelete": "बैच हटाएं",
"cancel": "रद्द करें",
"config": "कॉन्फ़िगरेशन",
"configInfo": "कॉन्फ़िगरेशन जानकारी",
"configPlaceholder": "कृपया प्रदान किए गए {field} कॉन्फ़िगरेशन को भरें",
"confirm": "पुष्टि करें",
"confirmDelete": "हटाने की पुष्टि करें",
"copy": "कॉपी करें",
"copySuccess": "सफलता से कॉपी किया गया",
"create": "भुगतान विधि जोड़ें",
"createPayment": "भुगतान विधि जोड़ें",
"createSuccess": "सफलता से बनाया गया",
"delete": "हटाएं",
"deleteSuccess": "सफलता से हटाया गया",
"deleteWarning": "क्या आप वास्तव में इस भुगतान विधि को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
"description": "विवरण",
"descriptionPlaceholder": "भुगतान विधि का विवरण दर्ज करें",
"domain": "डोमेन",
"domainPlaceholder": "वैकल्पिक, जैसे कि {example}",
"edit": "संपादित करें",
"editPayment": "भुगतान विधि संपादित करें",
"enable": "सक्षम करें",
"enableDescription": "इस भुगतान विधि को सक्षम करें",
"epay": {
"key": "कुंजी",
"pid": "पीआईडी",
"url": "यूआरएल"
},
"feeAmount": "निश्चित राशि",
"feeMode": "शुल्क मोड",
"feeModeDescription": "अतिरिक्त शुल्क की वसूली का तरीका",
"feeModeItems": ["कोई शुल्क नहीं", "प्रतिशत", "निश्चित राशि", "उपरोक्त दोनों"],
"feePercent": "प्रतिशत शुल्क (वैकल्पिक)",
"feePercentDescription": "ऑर्डर राशि के ऊपर शुल्क जोड़ा जाएगा",
"fixedFee": "निश्चित शुल्क (वैकल्पिक)",
"fixedFeeDescription": "ऑर्डर राशि के ऊपर एक निश्चित शुल्क जोड़ा जाता है",
"iconUrl": "आइकन URL (वैकल्पिक)",
"iconUrlDescription": "फ्रंटएंड प्रदर्शन के लिए उपयोग किया जाता है",
"inputPlaceholder": "कृपया दर्ज करें",
"key": "कुंजी",
"notifyUrl": "कस्टम अधिसूचना डोमेन (वैकल्पिक)",
"notifyUrlDescription": "गेटवे सूचना इस डोमेन पर भेजी जाएगी",
"payForRecommendations": "सिफारिशों के लिए भुगतान करें",
"pid": "पीआईडी",
"saveSuccess": "सहेजा गया",
"showName": "नाम दिखाएं",
"showNameDescription": "फ्रंटएंड प्रदर्शन के लिए उपयोग किया जाता है",
"stripe": {
"publicKey": "सार्वजनिक कुंजी",
"secretKey": "गुप्त कुंजी",
"webhookSecret": "वेबहुक कुंजी हस्ताक्षर"
},
"url": "यूआरएल",
"wechatPay": "वीचैट पे"
"handlingFee": "हैंडलिंग शुल्क",
"icon": "चिन्ह",
"iconPlaceholder": "चिन्ह URL दर्ज करें",
"mark": "पहचानकर्ता",
"markPlaceholder": "भुगतान विधि पहचानकर्ता दर्ज करें",
"name": "नाम",
"namePlaceholder": "भुगतान विधि का नाम दर्ज करें",
"nameRequired": "नाम आवश्यक है",
"noFee": "कोई शुल्क नहीं",
"notify_url": "सूचना URL",
"paymentManagement": "भुगतान प्रबंधन",
"percentFee": "प्रतिशत",
"platform": "प्लेटफ़ॉर्म",
"searchPlaceholder": "खोज शब्द दर्ज करें",
"selectPlatform": "प्लेटफ़ॉर्म चुनें",
"selectType": "भुगतान प्रकार चुनें",
"submit": "जमा करें",
"type": "प्रकार",
"updateSuccess": "सफलता से अपडेट किया गया"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "गोपनीयता नीति"
},
"site": {
"customData": "कस्टम डेटा",
"customDataDescription": "कस्टम डेटा, साइट के कस्टम डेटा के लिए उपयोग किया जाता है",
"customHtml": "कस्टम HTML",
"customHtmlDescription": "साइट के bodyैग के नीचे इंजेक्ट करने के लिए कस्टम HTML कोड।",
"keywords": "कीवर्ड",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Kérjük, adjon meg egy érvényes e-mail címet.",
"existingAccount": "Már van fiókja?",
"get": "Megkap",
"invite": "Meghívókód",
"invite": "Meghívó kód (opcionális)",
"message": "#### Tisztelt Felhasználó!\n\nKöszönjük érdeklődését és támogatását. Az oldal működési stratégiájának módosítása miatt lezártuk az új felhasználók regisztrációját. Ez idő alatt a meglévő felhasználók használata nem lesz érintett.\n\nElkötelezettek vagyunk abban, hogy jobb szolgáltatást és élményt nyújtsunk Önnek, ezért a regisztráció lezárása alatt átfogó rendszeroptimalizálást és funkciófrissítést hajtunk végre. A jövőben még jobb tartalommal és szolgáltatásokkal várjuk Önt.\n\nKérjük, kövesse weboldalunkat és közösségi média platformjainkat, hogy megkapja a legfrissebb híreket és értesítéseket. Köszönjük megértését és támogatását.\n\nHa bármilyen kérdése van, vagy segítségre van szüksége, kérjük, forduljon ügyfélszolgálati csapatunkhoz.\n\n**Még egyszer köszönjük támogatását és megértését.**",
"passwordMismatch": "A két jelszó nem egyezik meg",
"success": "Sikeres regisztráció, automatikusan bejelentkezett!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Állapot",
"subject": "Tárgy",
"template": "Sablon",
"traffic_exceed_email_template": "Forgalmi Túllépés Értesítő Sablon",
"traffic_exceed_email_templateDescription": "A {after}.variable{before} helyettesítők tényleges adatokkal lesznek helyettesítve. Győződjön meg róla, hogy ezeket a változókat megőrzi.",
"verify_email_template": "Ellenőrző Email Sablon",
"verify_email_templateDescription": "A {after}.variable{before} helyőrzőket tényleges adatokkal fogjuk helyettesíteni. Ügyeljen arra, hogy ezeket a változókat megtartsa.",
"whitelistSuffixes": "Engedélyezett utótagok",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Alipay fizetés",
"alipayf2f": {
"appId": "Alipay alkalmazásazonosító",
"invoiceName": "Egyedi terméknév",
"invoiceNameDescription": "A számlán az Alipay-ben fog megjelenni",
"privateKey": "Alipay privát kulcs",
"publicKey": "Alipay nyilvános kulcs",
"sandbox": "Tesztkörnyezet",
"sandboxDescription": "Tesztkörnyezet engedélyezése a fizetések teszteléséhez"
},
"AlipayF2F": "Alipay Személyesen",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Kérjen kifizetést",
"balance": "Egyenleg",
"batchDelete": "Tömeges törlés",
"cancel": "Mégse",
"config": "Beállítások",
"configInfo": "Beállítási információk",
"configPlaceholder": "Kérjük, töltse ki a megadott {field} beállítást",
"confirm": "Megerősít",
"confirmDelete": "Törlés megerősítése",
"copy": "Másolás",
"copySuccess": "Sikeresen másolva",
"create": "Fizetési mód hozzáadása",
"createPayment": "Fizetési mód hozzáadása",
"createSuccess": "Sikeresen létrehozva",
"delete": "Törlés",
"deleteSuccess": "Sikeresen törölve",
"deleteWarning": "Biztosan törölni szeretné ezt a fizetési módot? Ez a művelet nem vonható vissza.",
"description": "Leírás",
"descriptionPlaceholder": "Írja be a fizetési mód leírását",
"domain": "Domain",
"domainPlaceholder": "opcionális, pl. {példa}",
"edit": "Szerkesztés",
"editPayment": "Fizetési mód szerkesztése",
"enable": "Engedélyezés",
"enableDescription": "Engedélyezze ezt a fizetési módot",
"epay": {
"key": "KULCS",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Fix összeg",
"feeMode": "Díjfizetési mód",
"feeModeDescription": "További díjak felszámításának módja",
"feeModeItems": ["Nincs díj", "Százalékos", "Fix összeg", "Mindkettő"],
"feePercent": "Díjszázalék (opcionális)",
"feePercentDescription": "Díj hozzáadása a rendelés összegéhez",
"fixedFee": "Fix díj (opcionális)",
"fixedFeeDescription": "Rögzített díj hozzáadása a rendelés összegéhez",
"iconUrl": "Ikon URL (opcionális)",
"iconUrlDescription": "Előnézeti kép megjelenítéséhez",
"inputPlaceholder": "Kérjük, írja be",
"key": "KULCS",
"notifyUrl": "Egyéni értesítési domain (opcionális)",
"notifyUrlDescription": "A kapu értesítéseket erre a tartományra küldi",
"payForRecommendations": "Fizetés ajánlásokért",
"pid": "PID",
"saveSuccess": "Sikeres mentés",
"showName": "Megjelenítési név",
"showNameDescription": "Előnézet megjelenítésére használatos",
"stripe": {
"publicKey": "NYILVÁNOS KULCS",
"secretKey": "TITKOS KULCS",
"webhookSecret": "WEBHOOK TITKOS ALÁÍRÁS"
},
"url": "URL",
"wechatPay": "WeChat fizetés"
"handlingFee": "Kezelési díj",
"icon": "Ikon",
"iconPlaceholder": "Adja meg az ikon URL-jét",
"mark": "Azonosító",
"markPlaceholder": "Adja meg a fizetési mód azonosítóját",
"name": "Név",
"namePlaceholder": "Adja meg a fizetési mód nevét",
"nameRequired": "A név megadása kötelező",
"noFee": "Nincs díj",
"notify_url": "Értesítési URL",
"paymentManagement": "Fizetéskezelés",
"percentFee": "Százalékos díj",
"platform": "Platform",
"searchPlaceholder": "Adja meg a keresési kifejezéseket",
"selectPlatform": "Válassza ki a platformot",
"selectType": "Válassza ki a fizetési típust",
"submit": "Beküldés",
"type": "Típus",
"updateSuccess": "Sikeresen frissítve"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Adatvédelmi irányelvek"
},
"site": {
"customData": "Egyedi adatok",
"customDataDescription": "Egyedi adatok, a webhely egyedi adatainak használatára",
"customHtml": "Egyedi HTML",
"customHtmlDescription": "Egyedi HTML kód, amelyet a webhely bodyímkéjének aljára kell beilleszteni.",
"keywords": "Kulcsszavak",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "有効なメールアドレスを入力してください。",
"existingAccount": "すでにアカウントをお持ちですか?",
"get": "取得",
"invite": "招待コード",
"invite": "招待コード(任意)",
"message": "#### 親愛なるユーザーの皆様へ\n\n私たちのサイトにご関心とご支援をいただき、誠にありがとうございます。運営方針の調整に伴い、新規ユーザー登録機能を停止いたしました。この期間中、既存ユーザーのご利用には影響はございません。\n\nより良いサービスと体験を提供するため、登録停止期間中にシステムの全面的な最適化と機能のアップグレードを行います。今後、より質の高いコンテンツとサービスで皆様をお迎えいたします。\n\n最新の情報や通知を得るために、当社のウェブサイトやソーシャルメディアプラットフォームをご覧ください。ご理解とご支援に感謝いたします。\n\nご不明な点やご質問がございましたら、いつでもカスタマーサポートチームにお問い合わせください。\n\n**改めてご支援とご理解に感謝いたします。**",
"passwordMismatch": "パスワードが一致しません",
"success": "登録が成功しました。自動的にログインしました!",
+2
View File
@@ -39,6 +39,8 @@
"status": "ステータス",
"subject": "件名",
"template": "テンプレート",
"traffic_exceed_email_template": "トラフィック超過通知テンプレート",
"traffic_exceed_email_templateDescription": "{after}と{before}の変数は実際のデータに置き換えられます。これらの変数を保持することを確認してください。",
"verify_email_template": "確認メールテンプレート",
"verify_email_templateDescription": "{after}.variable{before} のプレースホルダーは実際のデータに置き換えられます。これらの変数を保持してください。",
"whitelistSuffixes": "ホワイトリストのサフィックス",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "アリペイ決済",
"alipayf2f": {
"appId": "支付宝アプリID",
"invoiceName": "カスタム製品名",
"invoiceNameDescription": "支付宝の請求書に表示されます",
"privateKey": "支付宝プライベートキー",
"publicKey": "支付宝パブリックキー",
"sandbox": "サンドボックスモード",
"sandboxDescription": "支払いをテストするためにサンドボックスモードを有効にします"
},
"AlipayF2F": "アリペイ対面",
"EPay": "EPay",
"Stripe": "ストライプ",
"applyForPayment": "支払いを申請する",
"balance": "残高",
"batchDelete": "一括削除",
"cancel": "キャンセル",
"config": "設定",
"configInfo": "設定情報",
"configPlaceholder": "提供された{field}の設定を入力してください",
"confirm": "確認",
"confirmDelete": "削除を確認",
"copy": "コピー",
"copySuccess": "コピー成功",
"create": "支払い方法を追加",
"createPayment": "支払い方法を追加",
"createSuccess": "作成成功",
"delete": "削除",
"deleteSuccess": "削除成功",
"deleteWarning": "この支払い方法を削除してもよろしいですか?この操作は元に戻せません。",
"description": "説明",
"descriptionPlaceholder": "支払い方法の説明を入力してください",
"domain": "ドメイン",
"domainPlaceholder": "任意、例:{example}",
"edit": "編集",
"editPayment": "支払い方法を編集",
"enable": "有効",
"enableDescription": "この支払い方法を有効にする",
"epay": {
"key": "キー",
"pid": "PID",
"url": "URL"
},
"feeAmount": "固定額",
"feeMode": "料金方式",
"feeModeDescription": "追加手数料の課金方式",
"feeModeItems": ["手数料なし", "パーセンテージ", "固定金額", "上記の2つ"],
"feePercent": "パーセンテージ手数料(オプション)",
"feePercentDescription": "注文金額に追加される手数料",
"fixedFee": "固定料金(オプション)",
"fixedFeeDescription": "注文金額に固定料金を追加する",
"iconUrl": "アイコンURL(任意)",
"iconUrlDescription": "フロントエンド表示用",
"inputPlaceholder": "入力してください",
"key": "キー",
"notifyUrl": "カスタム通知ドメイン(オプション)",
"notifyUrlDescription": "ゲートウェイ通知はこのドメインに送信されます",
"payForRecommendations": "おすすめの支払い",
"pid": "PID",
"saveSuccess": "保存が成功しました",
"showName": "表示名",
"showNameDescription": "フロントエンド表示用",
"stripe": {
"publicKey": "パブリックキー",
"secretKey": "シークレットキー",
"webhookSecret": "WEBHOOK シークレットサイン"
},
"url": "URL",
"wechatPay": "WeChatペイ"
"handlingFee": "手数料",
"icon": "アイコン",
"iconPlaceholder": "アイコンのURLを入力してください",
"mark": "識別子",
"markPlaceholder": "支払い方法の識別子を入力してください",
"name": "名前",
"namePlaceholder": "支払い方法の名前を入力してください",
"nameRequired": "名前は必須です",
"noFee": "手数料なし",
"notify_url": "通知URL",
"paymentManagement": "支払い管理",
"percentFee": "パーセンテージ",
"platform": "プラットフォーム",
"searchPlaceholder": "検索用語を入力してください",
"selectPlatform": "プラットフォームを選択",
"selectType": "支払いタイプを選択",
"submit": "送信",
"type": "タイプ",
"updateSuccess": "更新成功"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "プライバシーポリシー"
},
"site": {
"customData": "カスタムデータ",
"customDataDescription": "サイトのカスタムデータに使用されるカスタムデータ",
"customHtml": "カスタムHTML",
"customHtmlDescription": "サイトの body タグの下部に挿入されるカスタム HTML コード。",
"keywords": "キーワード",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "유효한 이메일 주소를 입력하세요.",
"existingAccount": "이미 계정이 있으신가요?",
"get": "받기",
"invite": "초대 코드",
"invite": "초대 코드 (선택 사항)",
"message": "#### 존경하는 사용자님, 안녕하세요!\n\n저희에 대한 관심과 지원에 감사드립니다. 사이트 운영 전략의 조정으로 인해 신규 사용자 등록 기능을 닫았습니다. 이 기간 동안 기존 사용자의 사용에는 아무런 영향이 없습니다.\n\n저희는 더 나은 서비스와 경험을 제공하기 위해 등록이 닫힌 동안 시스템 최적화와 기능 업그레이드를 전면적으로 진행할 것입니다. 앞으로 더 나은 콘텐츠와 서비스로 여러분을 맞이하겠습니다.\n\n저희 웹사이트와 소셜 미디어 플랫폼을 주시하여 최신 동향과 공지를 받아보세요. 이해와 지원에 감사드립니다.\n\n궁금한 점이나 도움이 필요하시면 언제든지 고객 서비스 팀에 문의해 주세요.\n\n**다시 한번 지원과 이해에 감사드립니다.**",
"passwordMismatch": "비밀번호가 일치하지 않습니다.",
"success": "등록 성공, 자동으로 로그인되었습니다!",
+2
View File
@@ -39,6 +39,8 @@
"status": "상태",
"subject": "제목",
"template": "템플릿",
"traffic_exceed_email_template": "트래픽 초과 알림 템플릿",
"traffic_exceed_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이러한 변수를 유지해야 합니다.",
"verify_email_template": "이메일 인증 템플릿",
"verify_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이 변수를 반드시 유지하십시오.",
"whitelistSuffixes": "허용 목록 접미사",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "알리페이 결제",
"alipayf2f": {
"appId": "알리페이 애플리케이션 ID",
"invoiceName": "사용자 정의 제품 이름",
"invoiceNameDescription": "알리페이 청구서에 표시됩니다",
"privateKey": "알리페이 개인 키",
"publicKey": "알리페이 공개 키",
"sandbox": "샌드박스 모드",
"sandboxDescription": "결제를 테스트하기 위해 샌드박스 모드를 활성화합니다"
},
"AlipayF2F": "알리페이 대면 결제",
"EPay": "이페이",
"Stripe": "스트라이프",
"applyForPayment": "결제 신청",
"balance": "잔액",
"batchDelete": "일괄 삭제",
"cancel": "취소",
"config": "설정",
"configInfo": "설정 정보",
"configPlaceholder": "{field} 설정을 입력해 주세요",
"confirm": "확인",
"confirmDelete": "삭제 확인",
"copy": "복사",
"copySuccess": "복사 성공",
"create": "결제 수단 추가",
"createPayment": "결제 수단 추가",
"createSuccess": "생성 성공",
"delete": "삭제",
"deleteSuccess": "삭제 성공",
"deleteWarning": "이 결제 수단을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
"description": "설명",
"descriptionPlaceholder": "결제 수단 설명을 입력하세요",
"domain": "도메인",
"domainPlaceholder": "선택 사항, 예: {example}",
"edit": "편집",
"editPayment": "결제 수단 편집",
"enable": "사용",
"enableDescription": "이 결제 수단을 활성화합니다",
"epay": {
"key": "키",
"pid": "PID",
"url": "URL"
},
"feeAmount": "고정 금액",
"feeMode": "요금 방식",
"feeModeDescription": "추가 수수료의 부과 방식",
"feeModeItems": ["수수료 없음", "백분율", "고정 금액", "이상 두 가지"],
"feePercent": "수수료 비율(선택 사항)",
"feePercentDescription": "주문 금액에 추가 요금 부과",
"fixedFee": "고정 수수료(선택 사항)",
"fixedFeeDescription": "주문 금액에 고정 요금 추가",
"iconUrl": "아이콘 URL(선택 사항)",
"iconUrlDescription": "프론트엔드 표시용",
"inputPlaceholder": "입력하세요",
"key": "키",
"notifyUrl": "사용자 정의 알림 도메인 (선택 사항)",
"notifyUrlDescription": "게이트웨이 알림이 이 도메인으로 전송됩니다",
"payForRecommendations": "추천에 대한 지불",
"pid": "PID",
"saveSuccess": "저장 성공",
"showName": "이름 표시",
"showNameDescription": "프론트엔드 표시용",
"stripe": {
"publicKey": "공개 키",
"secretKey": "비밀 키",
"webhookSecret": "웹훅 비밀 서명"
},
"url": "URL",
"wechatPay": "위챗페이"
"handlingFee": "수수료",
"icon": "아이콘",
"iconPlaceholder": "아이콘 URL 입력",
"mark": "식별자",
"markPlaceholder": "결제 수단 식별자 입력",
"name": "이름",
"namePlaceholder": "결제 수단 이름 입력",
"nameRequired": "이름은 필수입니다",
"noFee": "수수료 없음",
"notify_url": "알림 URL",
"paymentManagement": "결제 관리",
"percentFee": "백분율",
"platform": "플랫폼",
"searchPlaceholder": "검색어 입력",
"selectPlatform": "플랫폼 선택",
"selectType": "결제 유형 선택",
"submit": "제출",
"type": "유형",
"updateSuccess": "업데이트 성공"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "개인정보 처리방침"
},
"site": {
"customData": "사용자 정의 데이터",
"customDataDescription": "사이트의 사용자 정의 데이터에 사용되는 사용자 정의 데이터",
"customHtml": "사용자 정의 HTML",
"customHtmlDescription": "사이트의 body그 하단에 삽입될 사용자 정의 HTML 코드입니다.",
"keywords": "키워드",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Vennligst skriv inn en gyldig e-postadresse.",
"existingAccount": "Har du allerede en konto?",
"get": "Få",
"invite": "Invitasjonskode",
"invite": "Invitasjonskode (valgfritt)",
"message": "#### Kjære bruker,\n\nTakk for din interesse og støtte. På grunn av justeringer i vår driftsstrategi har vi stengt for registrering av nye brukere. I denne perioden vil eksisterende brukere ikke bli påvirket.\n\nVi er forpliktet til å gi deg bedre service og opplevelse, og vil derfor gjennomføre en omfattende systemoptimalisering og funksjonsoppgradering mens registreringen er stengt. I fremtiden vil vi ønske deg velkommen med bedre innhold og tjenester.\n\nFølg med på vår nettside og sosiale medieplattformer for å få de siste oppdateringene og kunngjøringene. Takk for din forståelse og støtte.\n\nHvis du har spørsmål eller trenger hjelp, vennligst kontakt vårt kundeserviceteam.\n\n**Takk igjen for din støtte og forståelse.**",
"passwordMismatch": "Passordene stemmer ikke overens",
"success": "Registrering vellykket, du er nå automatisk logget inn!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Status",
"subject": "Emne",
"template": "Mal",
"traffic_exceed_email_template": "Varsel om overskridelse av trafikk",
"traffic_exceed_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
"verify_email_template": "Verifikasjons-e-postmal",
"verify_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
"whitelistSuffixes": "Hvitelistesuffikser",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Betaling med Alipay",
"alipayf2f": {
"appId": "Alipay-applikasjons-ID",
"invoiceName": "Tilpasset produktnavn",
"invoiceNameDescription": "Vil vises på Alipay-fakturaen",
"privateKey": "Alipay privat nøkkel",
"publicKey": "Alipay offentlig nøkkel",
"sandbox": "Sandkassemodus",
"sandboxDescription": "Aktiver sandkassemodus for å teste betaling"
},
"AlipayF2F": "Alipay Ansikt-til-Ansikt",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Søk om betaling",
"balance": "Saldo",
"batchDelete": "Slett i batch",
"cancel": "Avbryt",
"config": "Konfigurasjon",
"configInfo": "Konfigurasjonsinformasjon",
"configPlaceholder": "Vennligst fyll inn den angitte {field} konfigurasjonen",
"confirm": "Bekreft",
"confirmDelete": "Bekreft sletting",
"copy": "Kopier",
"copySuccess": "Kopiert med suksess",
"create": "Legg til betalingsmetode",
"createPayment": "Legg til betalingsmetode",
"createSuccess": "Opprettet med suksess",
"delete": "Slett",
"deleteSuccess": "Slettet med suksess",
"deleteWarning": "Er du sikker på at du vil slette denne betalingsmetoden? Denne handlingen kan ikke angres.",
"description": "Beskrivelse",
"descriptionPlaceholder": "Skriv inn beskrivelse av betalingsmetode",
"domain": "Domene",
"domainPlaceholder": "valgfritt, f.eks. {example}",
"edit": "Rediger",
"editPayment": "Rediger betalingsmetode",
"enable": "Aktiver",
"enableDescription": "Aktiver denne betalingsmetoden",
"epay": {
"key": "NØKKEL",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Fast beløp",
"feeMode": "Avgiftsmåte",
"feeModeDescription": "Gebyrmodus for ekstra avgifter",
"feeModeItems": ["Ingen gebyr", "Prosentandel", "Fast beløp", "Begge ovennevnte"],
"feePercent": "Prosentavgift (valgfritt)",
"feePercentDescription": "Legg til et gebyr på toppen av ordrebeløpet",
"fixedFee": "Fast gebyr (valgfritt)",
"fixedFeeDescription": "Legg til et fast gebyr i tillegg til ordrebeløpet",
"iconUrl": "Ikon URL (valgfritt)",
"iconUrlDescription": "Brukes for visning på frontend",
"inputPlaceholder": "Vennligst skriv inn",
"key": "NØKKEL",
"notifyUrl": "Tilpasset varslingsdomene (valgfritt)",
"notifyUrlDescription": "Gateway-varsler vil bli sendt til dette domenet",
"payForRecommendations": "Betal for anbefalinger",
"pid": "PID",
"saveSuccess": "Lagring vellykket",
"showName": "Vis navn",
"showNameDescription": "Brukes for visning på frontend",
"stripe": {
"publicKey": "OFFENTLIG NØKKEL",
"secretKey": "HEMMELIG NØKKEL",
"webhookSecret": "WEBHOOK SIGNATUR"
},
"url": "URL",
"wechatPay": "WeChat-betaling"
"handlingFee": "Håndteringsgebyr",
"icon": "Ikon",
"iconPlaceholder": "Skriv inn ikon-URL",
"mark": "Identifikator",
"markPlaceholder": "Skriv inn identifikator for betalingsmetode",
"name": "Navn",
"namePlaceholder": "Skriv inn navn på betalingsmetode",
"nameRequired": "Navn er påkrevd",
"noFee": "Ingen gebyr",
"notify_url": "Varslings-URL",
"paymentManagement": "Betalingsadministrasjon",
"percentFee": "Prosentandel",
"platform": "Plattform",
"searchPlaceholder": "Skriv inn søkeord",
"selectPlatform": "Velg plattform",
"selectType": "Velg betalingstype",
"submit": "Send inn",
"type": "Type",
"updateSuccess": "Oppdatert med suksess"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Personvernerklæring"
},
"site": {
"customData": "Egendata",
"customDataDescription": "Egendata, brukt for egendata på nettstedet",
"customHtml": "Egendefinert HTML",
"customHtmlDescription": "Egendefinert HTML-kode som skal settes inn i bunnen av nettstedets body-tag.",
"keywords": "Nøkkelord",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Proszę wprowadzić prawidłowy adres e-mail.",
"existingAccount": "Masz już konto?",
"get": "Pobierz",
"invite": "Kod zaproszenia",
"invite": "Kod zaproszenia (opcjonalnie)",
"message": "#### Szanowny Użytkowniku,\n\nDziękujemy za Twoje zainteresowanie i wsparcie. Ze względu na zmianę strategii operacyjnej serwisu, zamknęliśmy funkcję rejestracji nowych użytkowników. W tym czasie korzystanie z serwisu przez obecnych użytkowników nie będzie w żaden sposób ograniczone.\n\nDążymy do zapewnienia lepszej obsługi i doświadczeń, dlatego w okresie zamknięcia rejestracji przeprowadzimy kompleksową optymalizację systemu i aktualizację funkcji. W przyszłości powitamy Cię z lepszą jakością treści i usług.\n\nŚledź naszą stronę internetową i platformy społecznościowe, aby uzyskać najnowsze informacje i powiadomienia. Dziękujemy za zrozumienie i wsparcie.\n\nW razie jakichkolwiek pytań lub potrzeby pomocy, skontaktuj się z naszym zespołem obsługi klienta.\n\n**Jeszcze raz dziękujemy za Twoje wsparcie i zrozumienie.**",
"passwordMismatch": "Wprowadzone hasła nie są zgodne",
"success": "Rejestracja zakończona sukcesem, automatycznie zalogowano!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Status",
"subject": "Temat",
"template": "Szablon",
"traffic_exceed_email_template": "Szablon powiadomienia o przekroczeniu ruchu",
"traffic_exceed_email_templateDescription": "Miejsca {after}.variable{before} zostaną zastąpione rzeczywistymi danymi. Upewnij się, że te zmienne są zachowane.",
"verify_email_template": "Szablon e-maila weryfikacyjnego",
"verify_email_templateDescription": "Elementy zastępcze {after}.variable{before} zostaną zastąpione rzeczywistymi danymi. Upewnij się, że te zmienne zostaną zachowane.",
"whitelistSuffixes": "Dozwolone Sufiksy",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Płatność Alipay",
"alipayf2f": {
"appId": "ID aplikacji Alipay",
"invoiceName": "Niestandardowa nazwa produktu",
"invoiceNameDescription": "Będzie wyświetlana na rachunku Alipay",
"privateKey": "Klucz prywatny Alipay",
"publicKey": "Klucz publiczny Alipay",
"sandbox": "Tryb piaskownicy",
"sandboxDescription": "Włącz tryb piaskownicy, aby przetestować płatności"
},
"AlipayF2F": "Alipay Twarzą w Twarz",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Złóż wniosek o płatność",
"balance": "Saldo",
"batchDelete": "Usuwanie zbiorcze",
"cancel": "Anuluj",
"config": "Konfiguracja",
"configInfo": "Informacje o konfiguracji",
"configPlaceholder": "Proszę wypełnić konfigurację {field}",
"confirm": "Potwierdź",
"confirmDelete": "Potwierdź usunięcie",
"copy": "Kopiuj",
"copySuccess": "Skopiowano pomyślnie",
"create": "Dodaj metodę płatności",
"createPayment": "Dodaj metodę płatności",
"createSuccess": "Utworzono pomyślnie",
"delete": "Usuń",
"deleteSuccess": "Usunięto pomyślnie",
"deleteWarning": "Czy na pewno chcesz usunąć tę metodę płatności? Ta akcja jest nieodwracalna.",
"description": "Opis",
"descriptionPlaceholder": "Wprowadź opis metody płatności",
"domain": "Domena",
"domainPlaceholder": "opcjonalnie, np. {example}",
"edit": "Edytuj",
"editPayment": "Edytuj metodę płatności",
"enable": "Włącz",
"enableDescription": "Włącz tę metodę płatności",
"epay": {
"key": "KLUCZ",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Kwota stała",
"feeMode": "Sposób naliczania opłat",
"feeModeDescription": "Sposób naliczania dodatkowej opłaty",
"feeModeItems": ["Bez opłaty", "Procent", "Stała kwota", "Oba powyższe"],
"feePercent": "Procentowa opłata (opcjonalnie)",
"feePercentDescription": "Dodaj opłatę do kwoty zamówienia",
"fixedFee": "Stała opłata (opcjonalnie)",
"fixedFeeDescription": "Dodaj stałą opłatę do kwoty zamówienia",
"iconUrl": "URL ikony (opcjonalnie)",
"iconUrlDescription": "Używane do wyświetlania na froncie",
"inputPlaceholder": "Wprowadź tekst",
"key": "KLUCZ",
"notifyUrl": "Niestandardowa domena powiadomień (opcjonalnie)",
"notifyUrlDescription": "Powiadomienie bramki zostanie wysłane na tę domenę",
"payForRecommendations": "Zapłać za rekomendacje",
"pid": "PID",
"saveSuccess": "Zapisano pomyślnie",
"showName": "Pokaż nazwę",
"showNameDescription": "Używane do wyświetlania na froncie",
"stripe": {
"publicKey": "KLUCZ PUBLICZNY",
"secretKey": "KLUCZ TAJNY",
"webhookSecret": "PODPIS KLUCZA WEBHOOK"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Opłata manipulacyjna",
"icon": "Ikona",
"iconPlaceholder": "Wprowadź URL ikony",
"mark": "Identyfikator",
"markPlaceholder": "Wprowadź identyfikator metody płatności",
"name": "Nazwa",
"namePlaceholder": "Wprowadź nazwę metody płatności",
"nameRequired": "Nazwa jest wymagana",
"noFee": "Brak opłaty",
"notify_url": "URL powiadomienia",
"paymentManagement": "Zarządzanie płatnościami",
"percentFee": "Procent",
"platform": "Platforma",
"searchPlaceholder": "Wprowadź hasła do wyszukiwania",
"selectPlatform": "Wybierz platformę",
"selectType": "Wybierz typ płatności",
"submit": "Wyślij",
"type": "Typ",
"updateSuccess": "Zaktualizowano pomyślnie"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Polityka prywatności"
},
"site": {
"customData": "Dane niestandardowe",
"customDataDescription": "Dane niestandardowe, używane do niestandardowych danych witryny",
"customHtml": "Niestandardowy HTML",
"customHtmlDescription": "Niestandardowy kod HTML, który ma być wstrzyknięty na końcu tagu bodyitryny.",
"keywords": "Słowa kluczowe",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Por favor, insira um endereço de e-mail válido.",
"existingAccount": "Já tem uma conta?",
"get": "Obter",
"invite": "Código de convite",
"invite": "Código de convite (opcional)",
"message": "#### Prezado usuário,\n\nAgradecemos seu interesse e apoio. Devido a ajustes na estratégia de operação do site, fechamos o registro de novos usuários. Durante este período, o uso por usuários existentes não será afetado.\n\nEstamos comprometidos em oferecer um serviço e experiência melhores, por isso realizaremos uma otimização completa do sistema e atualizações de funcionalidades durante o fechamento do registro. No futuro, receberemos você com conteúdo e serviços de maior qualidade.\n\nAcompanhe nosso site e plataformas de mídia social para obter as últimas atualizações e notificações. Agradecemos sua compreensão e apoio.\n\nSe tiver dúvidas ou precisar de ajuda, entre em contato com nossa equipe de atendimento ao cliente.\n\n**Mais uma vez, obrigado por seu apoio e compreensão.**",
"passwordMismatch": "As senhas digitadas não coincidem",
"success": "Registro bem-sucedido, login automático realizado!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Status",
"subject": "Assunto",
"template": "Modelo",
"traffic_exceed_email_template": "Modelo de Notificação de Excesso de Tráfego",
"traffic_exceed_email_templateDescription": "Os espaços reservados {after}.variable{before} serão substituídos por dados reais. Certifique-se de manter essas variáveis.",
"verify_email_template": "Modelo de E-mail de Verificação",
"verify_email_templateDescription": "Os marcadores {after}.variable{before} serão substituídos por dados reais. Certifique-se de manter essas variáveis.",
"whitelistSuffixes": "Sufixos de Lista Branca",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Pagamento com Alipay",
"alipayf2f": {
"appId": "ID do aplicativo Alipay",
"invoiceName": "Nome personalizado do produto",
"invoiceNameDescription": "Será exibido na fatura do Alipay",
"privateKey": "Chave privada do Alipay",
"publicKey": "Chave pública do Alipay",
"sandbox": "Modo sandbox",
"sandboxDescription": "Ative o modo sandbox para testar pagamentos"
},
"AlipayF2F": "Alipay Face a Face",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Solicitar Pagamento",
"balance": "Saldo",
"batchDelete": "Excluir em Lote",
"cancel": "Cancelar",
"config": "Configuração",
"configInfo": "Informações de Configuração",
"configPlaceholder": "Por favor, preencha a configuração de {field} fornecida",
"confirm": "Confirmar",
"confirmDelete": "Confirmar Exclusão",
"copy": "Copiar",
"copySuccess": "Copiado com sucesso",
"create": "Adicionar Método de Pagamento",
"createPayment": "Adicionar Método de Pagamento",
"createSuccess": "Criado com sucesso",
"delete": "Excluir",
"deleteSuccess": "Excluído com sucesso",
"deleteWarning": "Você tem certeza de que deseja excluir este método de pagamento? Esta ação não pode ser desfeita.",
"description": "Descrição",
"descriptionPlaceholder": "Insira a descrição do método de pagamento",
"domain": "Domínio",
"domainPlaceholder": "opcional, por exemplo, {exemplo}",
"edit": "Editar",
"editPayment": "Editar Método de Pagamento",
"enable": "Habilitar",
"enableDescription": "Ativar este método de pagamento",
"epay": {
"key": "CHAVE",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Valor Fixo",
"feeMode": "Modo de Cobrança",
"feeModeDescription": "Modo de cobrança de taxas adicionais",
"feeModeItems": ["Sem taxa", "Porcentagem", "Valor fixo", "Ambos os anteriores"],
"feePercent": "Percentual de taxa (opcional)",
"feePercentDescription": "Adicionar taxa sobre o valor do pedido",
"fixedFee": "Taxa fixa (opcional)",
"fixedFeeDescription": "Adicionar uma taxa fixa sobre o valor do pedido",
"iconUrl": "URL do ícone (opcional)",
"iconUrlDescription": "Usado para exibição no front-end",
"inputPlaceholder": "Por favor, insira",
"key": "CHAVE",
"notifyUrl": "Domínio de notificação personalizado (opcional)",
"notifyUrlDescription": "A notificação do gateway será enviada para este domínio",
"payForRecommendations": "Pagar por recomendações",
"pid": "PID",
"saveSuccess": "Salvo com sucesso",
"showName": "Mostrar Nome",
"showNameDescription": "Usado para exibição no front-end",
"stripe": {
"publicKey": "CHAVE PÚBLICA",
"secretKey": "CHAVE SECRETA",
"webhookSecret": "ASSINATURA DA CHAVE DO WEBHOOK"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Taxa de Manipulação",
"icon": "Ícone",
"iconPlaceholder": "Digite a URL do ícone",
"mark": "Identificador",
"markPlaceholder": "Digite o identificador do método de pagamento",
"name": "Nome",
"namePlaceholder": "Digite o nome do método de pagamento",
"nameRequired": "O nome é obrigatório",
"noFee": "Sem Taxa",
"notify_url": "URL de Notificação",
"paymentManagement": "Gerenciamento de Pagamento",
"percentFee": "Porcentagem",
"platform": "Plataforma",
"searchPlaceholder": "Digite os termos de pesquisa",
"selectPlatform": "Selecionar Plataforma",
"selectType": "Selecionar tipo de pagamento",
"submit": "Enviar",
"type": "Tipo",
"updateSuccess": "Atualizado com sucesso"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Política de Privacidade"
},
"site": {
"customData": "Dados Personalizados",
"customDataDescription": "Dados personalizados, usados para dados personalizados do site",
"customHtml": "HTML Personalizado",
"customHtmlDescription": "Código HTML personalizado a ser inserido no final da tag bodyo site.",
"keywords": "Palavras-chave",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Vă rugăm să introduceți o adresă de email validă.",
"existingAccount": "Aveți deja un cont?",
"get": "Obțineți",
"invite": "Cod de invitație",
"invite": "Cod de invitație (opțional)",
"message": "#### Stimate utilizator,\n\nVă mulțumim pentru interesul și sprijinul acordat. Datorită ajustării strategiei de operare a site-ului, am închis funcția de înregistrare a utilizatorilor noi. În această perioadă, utilizatorii existenți nu vor fi afectați în niciun fel.\n\nNe angajăm să vă oferim servicii și experiențe mai bune, așa că vom efectua optimizări complete ale sistemului și actualizări ale funcționalităților în perioada în care înregistrarea este închisă. În viitor, vă vom întâmpina cu conținut și servicii de calitate superioară.\n\nVă rugăm să urmăriți site-ul nostru și platformele de social media pentru a obține cele mai recente actualizări și notificări. Vă mulțumim pentru înțelegerea și sprijinul dvs.\n\nDacă aveți întrebări sau aveți nevoie de ajutor, nu ezitați să contactați echipa noastră de asistență clienți.\n\n**Vă mulțumim din nou pentru sprijinul și înțelegerea dvs.**",
"passwordMismatch": "Parolele introduse nu se potrivesc",
"success": "Înregistrare reușită, ați fost conectat automat!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Stare",
"subject": "Subiect",
"template": "Șablon",
"traffic_exceed_email_template": "Șablon de notificare a depășirii traficului",
"traffic_exceed_email_templateDescription": "Plasamentele {after}.variable{before} vor fi înlocuite cu datele reale. Asigurați-vă că păstrați aceste variabile.",
"verify_email_template": "Șablon de e-mail pentru verificare",
"verify_email_templateDescription": "Locurile rezervate {after}.variable{before} vor fi înlocuite cu date reale. Asigurați-vă că păstrați aceste variabile.",
"whitelistSuffixes": "Sufixe pe lista albă",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Plată cu Alipay",
"alipayf2f": {
"appId": "ID aplicație Alipay",
"invoiceName": "Nume personalizat produs",
"invoiceNameDescription": "Va apărea în factura Alipay",
"privateKey": "Cheie privată Alipay",
"publicKey": "Cheie publică Alipay",
"sandbox": "Modul sandbox",
"sandboxDescription": "Activează modul sandbox pentru a testa plățile"
},
"AlipayF2F": "Alipay Față în Față",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Solicită Plată",
"balance": "Sold",
"batchDelete": "Ștergere în Lot",
"cancel": "Anulează",
"config": "Configurare",
"configInfo": "Informații de Configurare",
"configPlaceholder": "Te rugăm să completezi configurația {field} furnizată",
"confirm": "Confirmă",
"confirmDelete": "Confirmă Ștergerea",
"copy": "Copiază",
"copySuccess": "Copiat cu succes",
"create": "Adaugă Metodă de Plată",
"createPayment": "Adaugă Metodă de Plată",
"createSuccess": "Creat cu succes",
"delete": "Șterge",
"deleteSuccess": "Șters cu succes",
"deleteWarning": "Ești sigur că vrei să ștergi această metodă de plată? Această acțiune nu poate fi anulată.",
"description": "Descriere",
"descriptionPlaceholder": "Introduceți descrierea metodei de plată",
"domain": "Domeniu",
"domainPlaceholder": "opțional, de exemplu {example}",
"edit": "Editează",
"editPayment": "Editează Metodă de Plată",
"enable": "Activare",
"enableDescription": "Activează această metodă de plată",
"epay": {
"key": "CHEIE",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Sumă Fixă",
"feeMode": "Mod de taxare",
"feeModeDescription": "Modul de taxare a comisioanelor suplimentare",
"feeModeItems": ["Fără comision", "Procentaj", "Sumă fixă", "Ambele"],
"feePercent": "Taxă procentuală (opțional)",
"feePercentDescription": "Se adaugă o taxă peste suma comenzii",
"fixedFee": "Taxă fixă (opțional)",
"fixedFeeDescription": "Adăugarea unei taxe fixe peste suma comenzii",
"iconUrl": "URL pictogramă (opțional)",
"iconUrlDescription": "Utilizat pentru afișarea în front-end",
"inputPlaceholder": "Introduceți",
"key": "CHEIE",
"notifyUrl": "Domeniu de notificare personalizat (opțional)",
"notifyUrlDescription": "Notificările de la gateway vor fi trimise la acest domeniu",
"payForRecommendations": "Plătește pentru recomandări",
"pid": "PID",
"saveSuccess": "Salvare reușită",
"showName": "Afișează Numele",
"showNameDescription": "Utilizat pentru afișarea în interfața utilizatorului",
"stripe": {
"publicKey": "CHEIE PUBLICĂ",
"secretKey": "CHEIE SECRETĂ",
"webhookSecret": "SEMNĂTURA CHEII WEBHOOK"
},
"url": "URL",
"wechatPay": "Plată WeChat"
"handlingFee": "Taxă de manipulare",
"icon": "Iconiță",
"iconPlaceholder": "Introdu URL-ul iconiței",
"mark": "Identificator",
"markPlaceholder": "Introdu identificatorul metodei de plată",
"name": "Nume",
"namePlaceholder": "Introdu numele metodei de pla",
"nameRequired": "Numele este necesar",
"noFee": "Fără Taxă",
"notify_url": "URL de notificare",
"paymentManagement": "Gestionare Plăți",
"percentFee": "Procentaj",
"platform": "Platformă",
"searchPlaceholder": "Introdu termeni de căutare",
"selectPlatform": "Selectează Platforma",
"selectType": "Selectează tipul de plată",
"submit": "Trimite",
"type": "Tip",
"updateSuccess": "Actualizat cu succes"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Politica de confidențialitate"
},
"site": {
"customData": "Date personalizate",
"customDataDescription": "Date personalizate, utilizate pentru datele personalizate ale site-ului",
"customHtml": "HTML personalizat",
"customHtmlDescription": "Cod HTML personalizat care va fi injectat în partea de jos a etichetei body a site-ului.",
"keywords": "Cuvinte cheie",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Пожалуйста, введите действительный адрес электронной почты.",
"existingAccount": "Уже есть аккаунт?",
"get": "Получить",
"invite": "Код приглашения",
"invite": "Код приглашения (необязательно)",
"message": "#### Уважаемый пользователь!\n\nБлагодарим вас за интерес и поддержку. В связи с изменением стратегии работы сайта, мы закрыли функцию регистрации новых пользователей. В этот период использование существующими пользователями не будет затронуто.\n\nМы стремимся предоставить вам лучший сервис и опыт, поэтому в период закрытия регистрации будет проведена полная оптимизация системы и обновление функций. В будущем мы встретим вас с более качественным контентом и услугами.\n\nПожалуйста, следите за нашим сайтом и социальными сетями, чтобы получать последние новости и уведомления. Благодарим за ваше понимание и поддержку.\n\nЕсли у вас есть вопросы или нужна помощь, пожалуйста, свяжитесь с нашей службой поддержки.\n\n**Еще раз благодарим за вашу поддержку и понимание.**",
"passwordMismatch": "Введенные пароли не совпадают",
"success": "Регистрация успешна, вы автоматически вошли в систему!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Статус",
"subject": "Тема",
"template": "Шаблон",
"traffic_exceed_email_template": "Шаблон уведомления о превышении трафика",
"traffic_exceed_email_templateDescription": "Места {after}.variable{before} будут заменены на фактические данные. Убедитесь, что эти переменные сохранены.",
"verify_email_template": "Шаблон письма для подтверждения",
"verify_email_templateDescription": "Заполнители {after}.variable{before} будут заменены фактическими данными. Убедитесь, что эти переменные сохранены.",
"whitelistSuffixes": "Белый список суффиксов",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Оплата через Alipay",
"alipayf2f": {
"appId": "ID приложения Alipay",
"invoiceName": "Пользовательское название продукта",
"invoiceNameDescription": "Будет отображаться в счете Alipay",
"privateKey": "Приватный ключ Alipay",
"publicKey": "Публичный ключ Alipay",
"sandbox": "Режим песочницы",
"sandboxDescription": "Включите режим песочницы для тестирования платежей"
},
"AlipayF2F": "Alipay Лицом к Лицу",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Подать заявку на оплату",
"balance": "Баланс",
"batchDelete": "Пакетное удаление",
"cancel": "Отмена",
"config": "Конфигурация",
"configInfo": "Информация о конфигурации",
"configPlaceholder": "Пожалуйста, заполните предоставленную конфигурацию {field}",
"confirm": "Подтвердить",
"confirmDelete": "Подтвердить удаление",
"copy": "Копировать",
"copySuccess": "Успешно скопировано",
"create": "Добавить способ оплаты",
"createPayment": "Добавить способ оплаты",
"createSuccess": "Успешно создано",
"delete": "Удалить",
"deleteSuccess": "Успешно удалено",
"deleteWarning": "Вы уверены, что хотите удалить этот способ оплаты? Это действие нельзя отменить.",
"description": "Описание",
"descriptionPlaceholder": "Введите описание метода оплаты",
"domain": "Домен",
"domainPlaceholder": "необязательно, например, {example}",
"edit": "Редактировать",
"editPayment": "Редактировать способ оплаты",
"enable": "Включить",
"enableDescription": "Включить этот способ оплаты",
"epay": {
"key": "КЛЮЧ",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Фиксированная сумма",
"feeMode": "Способ оплаты",
"feeModeDescription": "Способ взимания дополнительной комиссии",
"feeModeItems": ["Без комиссии", "Процент", "Фиксированная сумма", "Оба вышеуказанных"],
"feePercent": "Процентная комиссия (необязательно)",
"feePercentDescription": "Добавление комиссии к сумме заказа",
"fixedFee": "Фиксированная плата (по желанию)",
"fixedFeeDescription": "Добавление фиксированной платы к сумме заказа",
"iconUrl": "URL значка (необязательно)",
"iconUrlDescription": "Используется для отображения на фронтенде",
"inputPlaceholder": "Пожалуйста, введите",
"key": "КЛЮЧ",
"notifyUrl": "Пользовательский домен уведомлений (необязательно)",
"notifyUrlDescription": "Уведомление шлюза будет отправлено на этот домен",
"payForRecommendations": "Оплатить рекомендации",
"pid": "PID",
"saveSuccess": "Сохранение успешно",
"showName": "Показать имя",
"showNameDescription": "Используется для отображения на фронтенде",
"stripe": {
"publicKey": "ОТКРЫТЫЙ КЛЮЧ",
"secretKey": "СЕКРЕТНЫЙ КЛЮЧ",
"webhookSecret": "СЕКРЕТ ПОДПИСИ ВЕБХУКА"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Плата за обработку",
"icon": "Иконка",
"iconPlaceholder": "Введите URL иконки",
"mark": "Идентификатор",
"markPlaceholder": "Введите идентификатор способа оплаты",
"name": "Название",
"namePlaceholder": "Введите название способа оплаты",
"nameRequired": "Название обязательно",
"noFee": "Без комиссии",
"notify_url": "URL уведомления",
"paymentManagement": "Управление платежами",
"percentFee": "Процент",
"platform": "Платформа",
"searchPlaceholder": "Введите поисковые запросы",
"selectPlatform": "Выберите платформу",
"selectType": "Выберите тип оплаты",
"submit": "Отправить",
"type": "Тип",
"updateSuccess": "Успешно обновлено"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Политика конфиденциальности"
},
"site": {
"customData": "Пользовательские данные",
"customDataDescription": "Пользовательские данные, используемые для пользовательских данных сайта",
"customHtml": "Пользовательский HTML",
"customHtmlDescription": "Пользовательский HTML-код, который будет вставлен в конец тега body сайта.",
"keywords": "Ключевые слова",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "กรุณาใส่ที่อยู่อีเมลที่ถูกต้อง",
"existingAccount": "มีบัญชีอยู่แล้ว?",
"get": "รับ",
"invite": "รหัสเชิญ",
"invite": "รหัสเชิญ (ไม่บังคับ)",
"message": "#### เรียนผู้ใช้ที่เคารพ\n\nขอขอบคุณที่ให้ความสนใจและสนับสนุนเรา เนื่องจากการปรับเปลี่ยนนโยบายการดำเนินงานของเว็บไซต์ เราได้ปิดการลงทะเบียนผู้ใช้ใหม่ ในช่วงเวลานี้ การใช้งานของผู้ใช้ปัจจุบันจะไม่ได้รับผลกระทบใดๆ\n\nเรามุ่งมั่นที่จะให้บริการและประสบการณ์ที่ดียิ่งขึ้นแก่คุณ ดังนั้นเราจะทำการปรับปรุงระบบและอัปเกรดฟังก์ชันอย่างเต็มรูปแบบในช่วงที่ปิดการลงทะเบียน ในอนาคต เราจะต้อนรับคุณด้วยเนื้อหาและบริการที่มีคุณภาพยิ่งขึ้น\n\nโปรดติดตามเว็บไซต์และแพลตฟอร์มโซเชียลมีเดียของเรา เพื่อรับข้อมูลและการแจ้งเตือนล่าสุด ขอบคุณสำหรับความเข้าใจและการสนับสนุนของคุณ\n\nหากมีคำถามหรือความต้องการความช่วยเหลือใดๆ โปรดติดต่อทีมบริการลูกค้าของเราได้ตลอดเวลา\n\n**ขอขอบคุณอีกครั้งสำหรับการสนับสนุนและความเข้าใจของคุณ**",
"passwordMismatch": "รหัสผ่านที่กรอกไม่ตรงกัน",
"success": "สมัครสมาชิกสำเร็จ เข้าสู่ระบบอัตโนมัติแล้ว!",
+2
View File
@@ -39,6 +39,8 @@
"status": "สถานะ",
"subject": "เรื่อง",
"template": "แม่แบบ",
"traffic_exceed_email_template": "เทมเพลตการแจ้งเตือนการเกินการจราจร",
"traffic_exceed_email_templateDescription": "ตัวแปร {after}.variable{before} จะถูกแทนที่ด้วยข้อมูลจริง โปรดตรวจสอบให้แน่ใจว่าได้เก็บตัวแปรเหล่านี้ไว้",
"verify_email_template": "เทมเพลตอีเมลยืนยัน",
"verify_email_templateDescription": "ตัวแปร {after}.variable{before} จะถูกแทนที่ด้วยข้อมูลจริง โปรดตรวจสอบให้แน่ใจว่าเก็บตัวแปรเหล่านี้ไว้",
"whitelistSuffixes": "อนุญาตให้ใช้คำต่อท้าย",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "ชำระเงินผ่านอาลีเพย์",
"alipayf2f": {
"appId": "รหัสแอปพลิเคชัน Alipay",
"invoiceName": "ชื่อผลิตภัณฑ์ที่กำหนดเอง",
"invoiceNameDescription": "จะแสดงในใบแจ้งหนี้ของ Alipay",
"privateKey": "กุญแจส่วนตัวของ Alipay",
"publicKey": "กุญแจสาธารณะของ Alipay",
"sandbox": "โหมดแซนด์บ็อกซ์",
"sandboxDescription": "เปิดใช้งานโหมดแซนด์บ็อกซ์เพื่อทดสอบการชำระเงิน"
},
"AlipayF2F": "Alipay แบบพบหน้า",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "ขอชำระเงิน",
"balance": "ยอดคงเหลือ",
"batchDelete": "ลบเป็นชุด",
"cancel": "ยกเลิก",
"config": "การตั้งค่า",
"configInfo": "ข้อมูลการตั้งค่า",
"configPlaceholder": "กรุณากรอกการตั้งค่า {field} ที่ให้มา",
"confirm": "ยืนยัน",
"confirmDelete": "ยืนยันการลบ",
"copy": "คัดลอก",
"copySuccess": "คัดลอกสำเร็จ",
"create": "เพิ่มวิธีการชำระเงิน",
"createPayment": "เพิ่มวิธีการชำระเงิน",
"createSuccess": "สร้างสำเร็จ",
"delete": "ลบ",
"deleteSuccess": "ลบสำเร็จ",
"deleteWarning": "คุณแน่ใจหรือไม่ว่าต้องการลบวิธีการชำระเงินนี้? การกระทำนี้ไม่สามารถย้อนกลับได้",
"description": "คำอธิบาย",
"descriptionPlaceholder": "กรอกคำอธิบายวิธีการชำระเงิน",
"domain": "โดเมน",
"domainPlaceholder": "ไม่บังคับ เช่น {example}",
"edit": "แก้ไข",
"editPayment": "แก้ไขวิธีการชำระเงิน",
"enable": "เปิดใช้งาน",
"enableDescription": "เปิดใช้งานวิธีการชำระเงินนี้",
"epay": {
"key": "คีย์",
"pid": "พีไอดี",
"url": "ยูอาร์แอล"
},
"feeAmount": "จำนวนคงที่",
"feeMode": "วิธีการคิดค่าบริการ",
"feeModeDescription": "วิธีการคิดค่าธรรมเนียมเพิ่มเติม",
"feeModeItems": ["ไม่มีค่าธรรมเนียม", "เปอร์เซ็นต์", "จำนวนเงินคงที่", "ทั้งสองอย่าง"],
"feePercent": "เปอร์เซ็นต์ค่าธรรมเนียม (ไม่บังคับ)",
"feePercentDescription": "เพิ่มค่าธรรมเนียมจากยอดสั่งซื้อ",
"fixedFee": "ค่าธรรมเนียมคงที่ (ไม่บังคับ)",
"fixedFeeDescription": "เพิ่มค่าธรรมเนียมคงที่เหนือจำนวนเงินในคำสั่งซื้อ",
"iconUrl": "URL ไอคอน (ไม่บังคับ)",
"iconUrlDescription": "ใช้สำหรับแสดงผลด้านหน้า",
"inputPlaceholder": "กรุณาใส่ข้อมูล",
"key": "กุญแจ",
"notifyUrl": "โดเมนการแจ้งเตือนที่กำหนดเอง (ไม่บังคับ)",
"notifyUrlDescription": "การแจ้งเตือนเกตเวย์จะถูกส่งไปยังโดเมนนี้",
"payForRecommendations": "ชำระเงินสำหรับคำแนะนำ",
"pid": "PID",
"saveSuccess": "บันทึกสำเร็จ",
"showName": "แสดงชื่อ",
"showNameDescription": "ใช้สำหรับแสดงผลด้านหน้า",
"stripe": {
"publicKey": "PUBLIC KEY",
"secretKey": "SECRET KEY",
"webhookSecret": "WEBHOOK คีย์ลับ"
},
"url": "URL",
"wechatPay": "วีแชทเพย์"
"handlingFee": "ค่าธรรมเนียมการจัดการ",
"icon": "ไอคอน",
"iconPlaceholder": "กรอก URL ไอคอน",
"mark": "ตัวระบุ",
"markPlaceholder": "กรอกตัวระบุวิธีการชำระเงิน",
"name": "ชื่อ",
"namePlaceholder": "กรอกชื่อวิธีการชำระเงิน",
"nameRequired": "ชื่อเป็นสิ่งจำเป็น",
"noFee": "ไม่มีค่าธรรมเนียม",
"notify_url": "URL การแจ้งเตือน",
"paymentManagement": "การจัดการการชำระเงิน",
"percentFee": "เปอร์เซ็นต์",
"platform": "แพลตฟอร์ม",
"searchPlaceholder": "กรอกคำค้นหา",
"selectPlatform": "เลือกแพลตฟอร์ม",
"selectType": "เลือกประเภทการชำระเงิน",
"submit": "ส่ง",
"type": "ประเภท",
"updateSuccess": "อัปเดตสำเร็จ"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "นโยบายความเป็นส่วนตัว"
},
"site": {
"customData": "ข้อมูลที่กำหนดเอง",
"customDataDescription": "ข้อมูลที่กำหนดเอง ใช้สำหรับข้อมูลที่กำหนดเองของเว็บไซต์",
"customHtml": "HTML ที่กำหนดเอง",
"customHtmlDescription": "รหัส HTML ที่กำหนดเองเพื่อแทรกลงในส่วนล่างของแท็ก body ของเว็บไซต์.",
"keywords": "คำสำคัญ",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Lütfen geçerli bir e-posta adresi girin.",
"existingAccount": "Zaten bir hesabınız var mı?",
"get": "Al",
"invite": "Davet Kodu",
"invite": "Davet kodu (isteğe bağlı)",
"message": "#### Sayın Kullanıcı,\n\nİlginiz ve desteğiniz için teşekkür ederiz. Site işletme stratejimizin değişikliği nedeniyle, yeni kullanıcı kaydı işlevini kapattık. Bu süre zarfında, mevcut kullanıcıların kullanımı hiçbir şekilde etkilenmeyecektir.\n\nSize daha iyi hizmet ve deneyim sunmak için, kayıt kapalıyken kapsamlı bir sistem optimizasyonu ve işlev yükseltmesi gerçekleştireceğiz. Gelecekte, daha kaliteli içerik ve hizmetlerle sizi karşılamayı dört gözle bekliyoruz.\n\nEn son gelişmeler ve bildirimler için web sitemizi ve sosyal medya platformlarımızı takip edin. Anlayışınız ve desteğiniz için teşekkür ederiz.\n\nHerhangi bir sorunuz veya yardıma ihtiyacınız olursa, lütfen müşteri hizmetleri ekibimizle iletişime geçmekten çekinmeyin.\n\n**Desteğiniz ve anlayışınız için tekrar teşekkür ederiz.**",
"passwordMismatch": "Girilen şifreler uyuşmuyor",
"success": "Kayıt başarılı, otomatik olarak giriş yapıldı!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Durum",
"subject": "Konu",
"template": "Şablon",
"traffic_exceed_email_template": "Trafik Aşım Bildirimi Şablonu",
"traffic_exceed_email_templateDescription": "{after}.variable{before} yer tutucuları gerçek verilerle değiştirilecektir. Bu değişkenleri koruduğunuzdan emin olun.",
"verify_email_template": "Doğrulama E-posta Şablonu",
"verify_email_templateDescription": "{after}.variable{before} yer tutucuları gerçek verilerle değiştirilecektir. Bu değişkenleri koruduğunuzdan emin olun.",
"whitelistSuffixes": "Beyaz Liste Sonekleri",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Alipay ile ödeme",
"alipayf2f": {
"appId": "Alipay Uygulama Kimliği",
"invoiceName": "Özel Ürün Adı",
"invoiceNameDescription": "Alipay faturasına gösterilecektir",
"privateKey": "Alipay Özel Anahtarı",
"publicKey": "Alipay Genel Anahtarı",
"sandbox": "Sandbox Modu",
"sandboxDescription": "Ödemeyi test etmek için sandbox modunu etkinleştirin"
},
"AlipayF2F": "Alipay Yüz Yüze",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Ödeme Başvurusu",
"balance": "Bakiye",
"batchDelete": "Toplu Sil",
"cancel": "İptal",
"config": "Yapılandırma",
"configInfo": "Yapılandırma Bilgisi",
"configPlaceholder": "Lütfen sağlanan {field} yapılandırmasını doldurun",
"confirm": "Onayla",
"confirmDelete": "Silme İşlemini Onayla",
"copy": "Kopyala",
"copySuccess": "Başarıyla kopyalandı",
"create": "Ödeme Yöntemi Ekle",
"createPayment": "Ödeme Yöntemi Ekle",
"createSuccess": "Başarıyla oluşturuldu",
"delete": "Sil",
"deleteSuccess": "Başarıyla silindi",
"deleteWarning": "Bu ödeme yöntemini silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
"description": "Açıklama",
"descriptionPlaceholder": "Ödeme yöntemi açıklamasını girin",
"domain": "Alan Adı",
"domainPlaceholder": "isteğe bağlı, örn. {example}",
"edit": "Düzenle",
"editPayment": "Ödeme Yöntemini Düzenle",
"enable": "Etkinleştir",
"enableDescription": "Bu ödeme yöntemini etkinleştir",
"epay": {
"key": "ANAHTAR",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Sabit Tutar",
"feeMode": "Ücretlendirme Modu",
"feeModeDescription": "Ekstra ücretin tahsilat yöntemi",
"feeModeItems": ["Ücretsiz", "Yüzde", "Sabit Tutar", "Her İkisi"],
"feePercent": "Yüzde Ücreti (isteğe bağlı)",
"feePercentDescription": "Sipariş tutarının üzerine eklenen ücret",
"fixedFee": "Sabit Ücret (isteğe bağlı)",
"fixedFeeDescription": "Sipariş tutarına ek olarak sabit ücret eklenir",
"iconUrl": "Simge URL'si (isteğe bağlı)",
"iconUrlDescription": "Ön uçta görüntüleme için kullanılır",
"inputPlaceholder": "Lütfen girin",
"key": "ANAHTAR",
"notifyUrl": "Özel bildirim alanı (isteğe bağlı)",
"notifyUrlDescription": "Ağ geçidi bildirimi bu alana gönderilecektir",
"payForRecommendations": "Öneriler için ödeme yap",
"pid": "PID",
"saveSuccess": "Başarıyla kaydedildi",
"showName": "Görünen Ad",
"showNameDescription": "Ön uçta görüntüleme için kullanılır",
"stripe": {
"publicKey": "GENEL ANAHTAR",
"secretKey": "GİZLİ ANAHTAR",
"webhookSecret": "WEBHOOK GİZLİ İMZA"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "İşlem Ücreti",
"icon": "Simge",
"iconPlaceholder": "Simge URL'sini girin",
"mark": "Tanımlayıcı",
"markPlaceholder": "Ödeme yöntemi tanımlayıcısını girin",
"name": "İsim",
"namePlaceholder": "Ödeme yöntemi adını girin",
"nameRequired": "İsim gereklidir",
"noFee": "Ücret Yok",
"notify_url": "Bildirim URL'si",
"paymentManagement": "Ödeme Yönetimi",
"percentFee": "Yüzde",
"platform": "Platform",
"searchPlaceholder": "Arama terimlerini girin",
"selectPlatform": "Platform Seçin",
"selectType": "Ödeme türünü seçin",
"submit": "Gönder",
"type": "Tür",
"updateSuccess": "Başarıyla güncellendi"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Gizlilik Politikası"
},
"site": {
"customData": "Özel Veri",
"customDataDescription": "Özel Veri, sitenin özel verileri için kullanılır",
"customHtml": "Özel HTML",
"customHtmlDescription": "Site'in body etiketinin altına yerleştirilecek özel HTML kodu.",
"keywords": "Anahtar Kelimeler",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Будь ласка, введіть дійсну електронну адресу.",
"existingAccount": "Вже маєте обліковий запис?",
"get": "Отримати",
"invite": "Код запрошення",
"invite": "Код запрошення (необов'язково)",
"message": "#### Шановний користувач!\n\nДякуємо за вашу увагу та підтримку. У зв'язку зі зміною стратегії роботи сайту, ми закрили функцію реєстрації нових користувачів. Протягом цього періоду використання існуючими користувачами не буде зазнавати жодних змін.\n\nМи прагнемо надавати вам кращий сервіс та досвід, тому під час закриття реєстрації ми проведемо повну оптимізацію системи та оновлення функцій. У майбутньому ми зустрінемо вас з якіснішим контентом та послугами.\n\nБудь ласка, слідкуйте за нашим сайтом та соціальними мережами, щоб отримувати останні новини та повідомлення. Дякуємо за ваше розуміння та підтримку.\n\nЯкщо у вас є будь-які питання або потрібна допомога, будь ласка, зв'яжіться з нашою службою підтримки.\n\n**Ще раз дякуємо за вашу підтримку та розуміння.**",
"passwordMismatch": "Паролі не співпадають",
"success": "Реєстрація успішна, автоматично увійшли!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Статус",
"subject": "Тема",
"template": "Шаблон",
"traffic_exceed_email_template": "Шаблон сповіщення про перевищення трафіку",
"traffic_exceed_email_templateDescription": "Місця для змінних {after}.variable{before} будуть замінені на фактичні дані. Переконайтеся, що ці змінні залишаються.",
"verify_email_template": "Шаблон електронного листа для підтвердження",
"verify_email_templateDescription": "Заповнювачі {after}.variable{before} будуть замінені на фактичні дані. Переконайтеся, що зберегли ці змінні.",
"whitelistSuffixes": "Білий список суфіксів",
+46 -38
View File
@@ -1,44 +1,52 @@
{
"aliPay": "Оплата через Alipay",
"alipayf2f": {
"appId": "Ідентифікатор додатку Alipay",
"invoiceName": "Назва продукту на замовлення",
"invoiceNameDescription": "Буде відображено у рахунку Alipay",
"privateKey": "Приватний ключ Alipay",
"publicKey": "Публічний ключ Alipay",
"sandbox": "Режим пісочниці",
"sandboxDescription": "Увімкніть режим пісочниці для тестування платежів"
},
"AlipayF2F": "Alipay Face to Face",
"EPay": "EPay",
"Stripe": "Stripe",
"applyForPayment": "Подати заявку на оплату",
"balance": "Баланс",
"batchDelete": "Пакетне видалення",
"cancel": "Скасувати",
"config": "Налаштування",
"configInfo": "Інформація про налаштування",
"configPlaceholder": "Будь ласка, заповніть надану конфігурацію {field}",
"confirm": "Підтвердити",
"confirmDelete": "Підтвердити видалення",
"copy": "Копіювати",
"copySuccess": "Успішно скопійовано",
"create": "Додати спосіб оплати",
"createPayment": "Додати спосіб оплати",
"createSuccess": "Успішно створено",
"delete": "Видалити",
"deleteSuccess": "Успішно видалено",
"deleteWarning": "Ви впевнені, що хочете видалити цей спосіб оплати? Цю дію не можна скасувати.",
"description": "Опис",
"descriptionPlaceholder": "Введіть опис способу оплати",
"domain": "Домен",
"domainPlaceholder": "необов'язково, наприклад, {example}",
"edit": "Редагувати",
"editPayment": "Редагувати спосіб оплати",
"enable": "Увімкнути",
"enableDescription": "Увімкнути цей спосіб оплати",
"epay": {
"key": "КЛЮЧ",
"pid": "PID",
"url": "URL"
},
"feeAmount": "Фіксована сума",
"feeMode": "Спосіб оплати",
"feeModeDescription": "Спосіб стягнення додаткової комісії",
"feeModeItems": ["Без комісії", "Відсоток", "Фіксована сума", "Обидва варіанти"],
"feePercent": "Відсоткова комісія (необов'язково)",
"feePercentDescription": "Додати комісію до суми замовлення",
"fixedFee": "Фіксована плата (необов'язково)",
"fixedFeeDescription": "Додати фіксовану плату до суми замовлення",
"iconUrl": "URL значка (необов'язково)",
"iconUrlDescription": "Використовується для відображення на фронтенді",
"inputPlaceholder": "Введіть, будь ласка",
"key": "КЛЮЧ",
"notifyUrl": "Користувацька область сповіщень (необов'язково)",
"notifyUrlDescription": "Сповіщення шлюзу буде надіслано на цей домен",
"payForRecommendations": "Оплатити рекомендації",
"pid": "PID",
"saveSuccess": "Збережено успішно",
"showName": "Показати ім'я",
"showNameDescription": "Використовується для відображення на фронтенді",
"stripe": {
"publicKey": "ПУБЛІЧНИЙ КЛЮЧ",
"secretKey": "СЕКРЕТНИЙ КЛЮЧ",
"webhookSecret": "ПІДПИС ВЕБХУКА"
},
"url": "URL",
"wechatPay": "WeChat Pay"
"handlingFee": "Плата за обробку",
"icon": "Іконка",
"iconPlaceholder": "Введіть URL іконки",
"mark": "Ідентифікатор",
"markPlaceholder": "Введіть ідентифікатор способу оплати",
"name": "Назва",
"namePlaceholder": "Введіть назву способу оплати",
"nameRequired": "Назва є обов'язковою",
"noFee": "Без комісії",
"notify_url": "URL сповіщення",
"paymentManagement": "Управління платежами",
"percentFee": "Відсоток",
"platform": "Платформа",
"searchPlaceholder": "Введіть пошукові терміни",
"selectPlatform": "Виберіть платформу",
"selectType": "Виберіть тип оплати",
"submit": "Надіслати",
"type": "Тип",
"updateSuccess": "Успішно оновлено"
}
+2
View File
@@ -13,6 +13,8 @@
"title": "Політика конфіденційності"
},
"site": {
"customData": "Користувацькі дані",
"customDataDescription": "Користувацькі дані, що використовуються для користувацьких даних сайту",
"customHtml": "Користувацький HTML",
"customHtmlDescription": "Користувацький HTML-код, який буде вставлено в кінець тегу body сайту.",
"keywords": "Ключові слова",
+1 -1
View File
@@ -28,7 +28,7 @@
"email": "Vui lòng nhập địa chỉ email hợp lệ.",
"existingAccount": "Đã có tài khoản?",
"get": "Lấy",
"invite": "Mã mời",
"invite": "Mã mời (tùy chọn)",
"message": "#### Kính gửi người dùng,\n\nCảm ơn bạn đã quan tâm và ủng hộ chúng tôi. Do điều chỉnh chiến lược vận hành trang web, chúng tôi đã đóng chức năng đăng ký người dùng mới. Trong thời gian này, việc sử dụng của người dùng hiện tại sẽ không bị ảnh hưởng.\n\nChúng tôi cam kết mang đến cho bạn dịch vụ và trải nghiệm tốt hơn, do đó sẽ tiến hành tối ưu hóa hệ thống và nâng cấp chức năng toàn diện trong thời gian đóng đăng ký. Trong tương lai, chúng tôi sẽ chào đón bạn với nội dung và dịch vụ chất lượng hơn.\n\nHãy theo dõi trang web và các nền tảng truyền thông xã hội của chúng tôi để nhận thông tin và thông báo mới nhất. Cảm ơn bạn đã hiểu và ủng hộ.\n\nNếu có bất kỳ thắc mắc hoặc cần hỗ trợ, vui lòng liên hệ với đội ngũ chăm sóc khách hàng của chúng tôi.\n\n**Một lần nữa cảm ơn sự ủng hộ và hiểu biết của bạn.**",
"passwordMismatch": "Mật khẩu nhập hai lần không khớp",
"success": "Đăng ký thành công, đã tự động đăng nhập!",
+2
View File
@@ -39,6 +39,8 @@
"status": "Trạng thái",
"subject": "Chủ đề",
"template": "Mẫu",
"traffic_exceed_email_template": "Mẫu Thông Báo Vượt Quá Lưu Lượng",
"traffic_exceed_email_templateDescription": "Các biến {after}.variable{before} sẽ được thay thế bằng dữ liệu thực tế. Đảm bảo giữ nguyên các biến này.",
"verify_email_template": "Mẫu Email Xác Minh",
"verify_email_templateDescription": "Các chỗ trống {after}.variable{before} sẽ được thay thế bằng dữ liệu thực tế. Đảm bảo giữ nguyên các biến này.",
"whitelistSuffixes": "Danh sách trắng Hậu tố",

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