Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0f15fb82cb | |||
| 320a7dc342 | |||
| 42ba9e88ad | |||
| 4a002333d4 | |||
| 6384237782 | |||
| 557c5cdc29 | |||
| f9d7736e48 | |||
| 5b64389544 | |||
| 23833b47d1 | |||
| c3eff0a0e7 | |||
| 6f7bc37233 | |||
| b2e8fadaf3 | |||
| 315c8f9afe | |||
| 0fb0d8bc11 | |||
| c356bc26ff | |||
| 23c974a94d | |||
| ee286dd629 | |||
| 4418c47f4f | |||
| 2d88a3a81d |
+114
-51
@@ -1,69 +1,132 @@
|
|||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
# [1.0.0-beta.11](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.10...v1.0.0-beta.11) (2025-02-16)
|
# [1.0.0-beta.19](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.18...v1.0.0-beta.19) (2025-02-23)
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
|
||||||
|
|
||||||
* **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
|
||||||
|
|
||||||
# [1.0.0-beta.10](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.9...v1.0.0-beta.10) (2025-02-16)
|
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
|
||||||
|
|
||||||
* **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
|
||||||
|
|
||||||
# [1.0.0-beta.9](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.8...v1.0.0-beta.9) (2025-02-15)
|
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
|
||||||
|
|
||||||
* **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
|
||||||
|
|
||||||
# [1.0.0-beta.8](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2025-02-15)
|
|
||||||
|
|
||||||
|
|
||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
* **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
* **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
|
||||||
* **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
|
||||||
* **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
|
||||||
* **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
|
||||||
* **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
|
||||||
* **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
|
||||||
* **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
|
||||||
* **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
|
||||||
* **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
|
||||||
* **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
|
||||||
* **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
|
||||||
* **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
|
||||||
* **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
|
||||||
* **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
|
||||||
* **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
|
||||||
* **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
* **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||||
* **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
|
||||||
* **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
|
||||||
* **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
|
||||||
* **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
|
||||||
* **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
|
||||||
* **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
|
||||||
* **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
|
||||||
* **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
|
||||||
* **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
|
||||||
* **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
|
||||||
* **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
|
||||||
|
|
||||||
|
# [1.0.0-beta.18](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.17...v1.0.0-beta.18) (2025-02-22)
|
||||||
|
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
* **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
|
||||||
|
* **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.17](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.16...v1.0.0-beta.17) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
|
||||||
|
|
||||||
|
# [1.0.0-beta.16](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.15...v1.0.0-beta.16) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
||||||
|
|
||||||
|
# [1.0.0-beta.15](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.14...v1.0.0-beta.15) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
||||||
|
|
||||||
|
# [1.0.0-beta.14](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.13...v1.0.0-beta.14) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
|
||||||
|
|
||||||
|
# [1.0.0-beta.13](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.12...v1.0.0-beta.13) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.12](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.11...v1.0.0-beta.12) (2025-02-18)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
|
||||||
|
|
||||||
|
# [1.0.0-beta.11](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.10...v1.0.0-beta.11) (2025-02-16)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
||||||
|
|
||||||
|
# [1.0.0-beta.10](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.9...v1.0.0-beta.10) (2025-02-16)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
||||||
|
|
||||||
|
# [1.0.0-beta.9](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.8...v1.0.0-beta.9) (2025-02-15)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
||||||
|
|
||||||
|
# [1.0.0-beta.8](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2025-02-15)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
||||||
|
- **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
||||||
|
- **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
||||||
|
- **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
||||||
|
- **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
||||||
|
- **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
||||||
|
- **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
||||||
|
- **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
||||||
|
- **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
||||||
|
- **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
||||||
|
- **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
||||||
|
- **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
||||||
|
- **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
||||||
|
- **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
||||||
|
- **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
||||||
|
- **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
||||||
|
- **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
||||||
|
- **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
||||||
|
- **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
||||||
|
- **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
||||||
|
- **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
||||||
|
- **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
||||||
|
- **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
||||||
|
- **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
||||||
|
- **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
||||||
|
- **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
||||||
|
- **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
||||||
|
|
||||||
### 💄 Styles
|
### 💄 Styles
|
||||||
|
|
||||||
* **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
- **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
||||||
|
|
||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
|||||||
@@ -61,45 +61,42 @@ export default function ResetForm({
|
|||||||
/>
|
/>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='password'
|
name='code'
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input placeholder='Enter your password...' type='password' {...field} />
|
<div className='flex items-center gap-2'>
|
||||||
|
<Input
|
||||||
|
placeholder='Enter code...'
|
||||||
|
type='text'
|
||||||
|
{...field}
|
||||||
|
value={field.value as string}
|
||||||
|
/>
|
||||||
|
<SendCode
|
||||||
|
type='email'
|
||||||
|
params={{
|
||||||
|
...form.getValues(),
|
||||||
|
type: 2,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='password'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormControl>
|
||||||
|
<Input placeholder='Enter your New password...' type='password' {...field} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{auth?.email?.enable_verify && (
|
|
||||||
<FormField
|
|
||||||
control={form.control}
|
|
||||||
name='code'
|
|
||||||
render={({ field }) => (
|
|
||||||
<FormItem>
|
|
||||||
<FormControl>
|
|
||||||
<div className='flex items-center gap-2'>
|
|
||||||
<Input
|
|
||||||
placeholder='Enter code...'
|
|
||||||
type='text'
|
|
||||||
{...field}
|
|
||||||
value={field.value as string}
|
|
||||||
/>
|
|
||||||
<SendCode
|
|
||||||
type='email'
|
|
||||||
params={{
|
|
||||||
...form.getValues(),
|
|
||||||
type: 2,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</FormControl>
|
|
||||||
<FormMessage />
|
|
||||||
</FormItem>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{verify.enable_reset_password_verify && (
|
{verify.enable_reset_password_verify && (
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export default function Page() {
|
|||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...ref.current,
|
...ref.current,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export function Verify() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<EnhancedInput
|
<EnhancedInput
|
||||||
placeholder={t('inputPlaceholder')}
|
placeholder={t('inputPlaceholder')}
|
||||||
defaultValue={data?.turnstile_site_key}
|
value={data?.turnstile_site_key}
|
||||||
onValueBlur={(value) => updateConfig('turnstile_site_key', value)}
|
onValueBlur={(value) => updateConfig('turnstile_site_key', value)}
|
||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
@@ -64,7 +64,7 @@ export function Verify() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<EnhancedInput
|
<EnhancedInput
|
||||||
placeholder={t('inputPlaceholder')}
|
placeholder={t('inputPlaceholder')}
|
||||||
defaultValue={data?.turnstile_secret}
|
value={data?.turnstile_secret}
|
||||||
onValueBlur={(value) => updateConfig('turnstile_secret', value)}
|
onValueBlur={(value) => updateConfig('turnstile_secret', value)}
|
||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ export default function Page() {
|
|||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('updateSuccess'));
|
toast.success(t('updateSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ const defaultValues = {
|
|||||||
|
|
||||||
const versionSchema = z.object({
|
const versionSchema = z.object({
|
||||||
url: z.string(),
|
url: z.string(),
|
||||||
version: z.string(),
|
version: z.string().optional(),
|
||||||
description: z.string().optional(),
|
description: z.string().optional(),
|
||||||
is_default: z.boolean().optional(),
|
is_default: z.boolean().optional(),
|
||||||
});
|
});
|
||||||
@@ -221,6 +221,7 @@ export default function SubscribeAppForm<
|
|||||||
name: 'version',
|
name: 'version',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
placeholder: t('version'),
|
placeholder: t('version'),
|
||||||
|
defaultValue: '1.0.0',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'description',
|
name: 'description',
|
||||||
@@ -251,7 +252,10 @@ export default function SubscribeAppForm<
|
|||||||
]}
|
]}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
form.setValue(field.name, value);
|
form.setValue(
|
||||||
|
field.name,
|
||||||
|
value.filter((item) => item.url),
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|||||||
@@ -85,6 +85,35 @@ export default function Site() {
|
|||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('keywords')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('keywordsDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('keywordsDescription')}
|
||||||
|
value={data?.keywords}
|
||||||
|
onValueBlur={(value) => updateConfig('keywords', value)}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell className='align-top'>
|
||||||
|
<Label>{t('customHtml')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('customHtmlDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<Textarea
|
||||||
|
className='h-52'
|
||||||
|
placeholder={t('customHtmlDescription')}
|
||||||
|
defaultValue={data?.custom_html}
|
||||||
|
onBlur={(e) => {
|
||||||
|
updateConfig('custom_html', e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell className='align-top'>
|
<TableCell className='align-top'>
|
||||||
<Label>{t('siteDomain')}</Label>
|
<Label>{t('siteDomain')}</Label>
|
||||||
@@ -93,7 +122,7 @@ export default function Site() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<Textarea
|
<Textarea
|
||||||
className='h-52'
|
className='h-52'
|
||||||
placeholder={t('siteDomainPlaceholder')}
|
placeholder={`${t('siteDomainPlaceholder')}\nexample.com\nwww.example.com`}
|
||||||
defaultValue={data?.host}
|
defaultValue={data?.host}
|
||||||
onBlur={(e) => {
|
onBlur={(e) => {
|
||||||
updateConfig('host', e.target.value);
|
updateConfig('host', e.target.value);
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export function SubscriptionDetail({
|
|||||||
header: 'ID',
|
header: 'ID',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'imei',
|
accessorKey: 'identifier',
|
||||||
header: 'IMEI',
|
header: 'IMEI',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -182,7 +182,7 @@ export function SubscriptionDetail({
|
|||||||
}}
|
}}
|
||||||
actions={{
|
actions={{
|
||||||
render: (row) => {
|
render: (row) => {
|
||||||
if (!row.imei) return [];
|
if (!row.identifier) return [];
|
||||||
return [
|
return [
|
||||||
<ConfirmButton
|
<ConfirmButton
|
||||||
key='offline'
|
key='offline'
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
|
|||||||
site_name: '',
|
site_name: '',
|
||||||
site_desc: '',
|
site_desc: '',
|
||||||
site_logo: '',
|
site_logo: '',
|
||||||
|
keywords: '',
|
||||||
|
custom_html: '',
|
||||||
},
|
},
|
||||||
verify: {
|
verify: {
|
||||||
turnstile_site_key: '',
|
turnstile_site_key: '',
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Ověření e-mailu",
|
"emailVerification": "Ověření e-mailu",
|
||||||
"emailVerificationDescription": "Když je povoleno, uživatelé budou muset ověřit svůj e-mail",
|
"emailVerificationDescription": "Když je povoleno, uživatelé budou muset ověřit svůj e-mail",
|
||||||
"enable": "Povolit",
|
"enable": "Povolit",
|
||||||
"enableDescription": "Po povolení budou povoleny funkce registrace, přihlášení, připojení a odpojení mobilního telefonu",
|
"enableDescription": "Po aktivaci budou povoleny funkce registrace e-mailem, přihlášení, propojení a odpojení.",
|
||||||
"expiration_email_template": "Šablona oznámení o vypršení platnosti",
|
"expiration_email_template": "Šablona oznámení o vypršení platnosti",
|
||||||
"expiration_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
|
"expiration_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
|
||||||
"failed": "Neúspěch",
|
"failed": "Neúspěch",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Úspěšně uloženo"
|
"saveSuccess": "Úspěšně uloženo"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Vlastní HTML",
|
||||||
|
"customHtmlDescription": "Vlastní HTML kód, který bude vložen na konec tagu <body> na stránce.",
|
||||||
|
"keywords": "Klíčová slova",
|
||||||
|
"keywordsDescription": "Používá se pro SEO účely",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Používá se k zobrazení místa, kde je potřeba zobrazit LOGO",
|
"logoDescription": "Používá se k zobrazení místa, kde je potřeba zobrazit LOGO",
|
||||||
"logoPlaceholder": "Zadejte URL adresu LOGA, nekončete '/'",
|
"logoPlaceholder": "Zadejte URL adresu LOGA, nekončete '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "E-Mail-Verifizierung",
|
"emailVerification": "E-Mail-Verifizierung",
|
||||||
"emailVerificationDescription": "Wenn aktiviert, müssen Benutzer ihre E-Mail-Adresse verifizieren",
|
"emailVerificationDescription": "Wenn aktiviert, müssen Benutzer ihre E-Mail-Adresse verifizieren",
|
||||||
"enable": "Aktivieren",
|
"enable": "Aktivieren",
|
||||||
"enableDescription": "Nach der Aktivierung werden die Funktionen zur Registrierung, Anmeldung, Bindung und Entbindung von Mobiltelefonen aktiviert",
|
"enableDescription": "Nach der Aktivierung werden die Funktionen zur E-Mail-Registrierung, Anmeldung, Bindung und Entbindung aktiviert.",
|
||||||
"expiration_email_template": "Vorlage für Ablaufbenachrichtigung",
|
"expiration_email_template": "Vorlage für Ablaufbenachrichtigung",
|
||||||
"expiration_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass Sie diese Variablen beibehalten.",
|
"expiration_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass Sie diese Variablen beibehalten.",
|
||||||
"failed": "Fehlgeschlagen",
|
"failed": "Fehlgeschlagen",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Erfolgreich gespeichert"
|
"saveSuccess": "Erfolgreich gespeichert"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Benutzerdefiniertes HTML",
|
||||||
|
"customHtmlDescription": "Benutzerdefinierter HTML-Code, der am Ende des <body>-Tags der Seite eingefügt werden soll.",
|
||||||
|
"keywords": "Schlüsselwörter",
|
||||||
|
"keywordsDescription": "Für SEO-Zwecke verwendet",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Position zur Anzeige des LOGOs",
|
"logoDescription": "Position zur Anzeige des LOGOs",
|
||||||
"logoPlaceholder": "Bitte geben Sie die URL-Adresse des LOGOs ein, ohne '/' am Ende",
|
"logoPlaceholder": "Bitte geben Sie die URL-Adresse des LOGOs ein, ohne '/' am Ende",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Email Verification",
|
"emailVerification": "Email Verification",
|
||||||
"emailVerificationDescription": "When enabled, users will need to verify their email",
|
"emailVerificationDescription": "When enabled, users will need to verify their email",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"enableDescription": "After enabling, mobile phone registration, login, binding, and unbinding functions will be enabled",
|
"enableDescription": "After enabling, email registration, login, binding, and unbinding functions will be enabled",
|
||||||
"expiration_email_template": "Expiration Notice Template",
|
"expiration_email_template": "Expiration Notice Template",
|
||||||
"expiration_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
|
"expiration_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Save Successful"
|
"saveSuccess": "Save Successful"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Custom HTML",
|
||||||
|
"customHtmlDescription": "Custom HTML code to be injected into the bottom of the site's <body> tag.",
|
||||||
|
"keywords": "Keywords",
|
||||||
|
"keywordsDescription": "Used for SEO purposes",
|
||||||
"logo": "Logo",
|
"logo": "Logo",
|
||||||
"logoDescription": "Used for displaying the logo in designated locations",
|
"logoDescription": "Used for displaying the logo in designated locations",
|
||||||
"logoPlaceholder": "Enter the URL of the logo, without ending with '/'",
|
"logoPlaceholder": "Enter the URL of the logo, without ending with '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificación de correo electrónico",
|
"emailVerification": "Verificación de correo electrónico",
|
||||||
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación de teléfonos móviles",
|
"enableDescription": "Después de habilitar, se activarán las funciones de registro por correo electrónico, inicio de sesión, vinculación y desvinculación.",
|
||||||
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
||||||
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado que se inyectará en la parte inferior de la etiqueta <body> del sitio.",
|
||||||
|
"keywords": "Palabras clave",
|
||||||
|
"keywordsDescription": "Utilizado para fines de SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Se utiliza para mostrar la ubicación donde se debe mostrar el LOGO",
|
"logoDescription": "Se utiliza para mostrar la ubicación donde se debe mostrar el LOGO",
|
||||||
"logoPlaceholder": "Por favor, introduce la URL del LOGO, no termines con '/'",
|
"logoPlaceholder": "Por favor, introduce la URL del LOGO, no termines con '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificación de Correo Electrónico",
|
"emailVerification": "Verificación de Correo Electrónico",
|
||||||
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación de teléfonos móviles",
|
"enableDescription": "Después de habilitar, se activarán las funciones de registro por correo electrónico, inicio de sesión, vinculación y desvinculación.",
|
||||||
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
||||||
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado que se inyectará al final de la etiqueta <body> del sitio.",
|
||||||
|
"keywords": "Palabras clave",
|
||||||
|
"keywordsDescription": "Utilizado para propósitos de SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Usado para mostrar la ubicación donde se debe exhibir el LOGO",
|
"logoDescription": "Usado para mostrar la ubicación donde se debe exhibir el LOGO",
|
||||||
"logoPlaceholder": "Por favor, ingresa la URL del LOGO, no termines con '/'",
|
"logoPlaceholder": "Por favor, ingresa la URL del LOGO, no termines con '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "تأیید ایمیل",
|
"emailVerification": "تأیید ایمیل",
|
||||||
"emailVerificationDescription": "هنگامی که فعال شود، کاربران باید ایمیل خود را تأیید کنند",
|
"emailVerificationDescription": "هنگامی که فعال شود، کاربران باید ایمیل خود را تأیید کنند",
|
||||||
"enable": "فعال کردن",
|
"enable": "فعال کردن",
|
||||||
"enableDescription": "پس از فعالسازی، عملکردهای ثبتنام، ورود، اتصال و قطع اتصال تلفن همراه فعال خواهند شد",
|
"enableDescription": "پس از فعالسازی، ثبتنام ایمیلی، ورود، پیوند و جداسازی عملکردها فعال خواهند شد",
|
||||||
"expiration_email_template": "قالب اطلاعیه انقضا",
|
"expiration_email_template": "قالب اطلاعیه انقضا",
|
||||||
"expiration_email_templateDescription": "جایگذاریهای {after}.variable{before} با دادههای واقعی جایگزین خواهند شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
|
"expiration_email_templateDescription": "جایگذاریهای {after}.variable{before} با دادههای واقعی جایگزین خواهند شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
|
||||||
"failed": "ناموفق",
|
"failed": "ناموفق",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML سفارشی",
|
||||||
|
"customHtmlDescription": "کد HTML سفارشی که باید در انتهای تگ <body> سایت وارد شود.",
|
||||||
|
"keywords": "کلمات کلیدی",
|
||||||
|
"keywordsDescription": "برای اهداف سئو استفاده میشود",
|
||||||
"logo": "لوگو",
|
"logo": "لوگو",
|
||||||
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
||||||
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Sähköpostin vahvistus",
|
"emailVerification": "Sähköpostin vahvistus",
|
||||||
"emailVerificationDescription": "Kun tämä on käytössä, käyttäjien on vahvistettava sähköpostinsa",
|
"emailVerificationDescription": "Kun tämä on käytössä, käyttäjien on vahvistettava sähköpostinsa",
|
||||||
"enable": "Ota käyttöön",
|
"enable": "Ota käyttöön",
|
||||||
"enableDescription": "Kun otat tämän käyttöön, matkapuhelimen rekisteröinti-, kirjautumis-, sitomis- ja purkutoiminnot otetaan käyttöön",
|
"enableDescription": "Kun tämä on otettu käyttöön, sähköpostirekisteröinti, kirjautuminen, liittäminen ja irrottaminen aktivoituvat.",
|
||||||
"expiration_email_template": "Vanhentumisilmoituksen malli",
|
"expiration_email_template": "Vanhentumisilmoituksen malli",
|
||||||
"expiration_email_templateDescription": "Paikkamerkit {after}.variable{before} korvataan todellisilla tiedoilla. Varmista, että pidät nämä muuttujat.",
|
"expiration_email_templateDescription": "Paikkamerkit {after}.variable{before} korvataan todellisilla tiedoilla. Varmista, että pidät nämä muuttujat.",
|
||||||
"failed": "Epäonnistui",
|
"failed": "Epäonnistui",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Tallennus onnistui"
|
"saveSuccess": "Tallennus onnistui"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Mukautettu HTML",
|
||||||
|
"customHtmlDescription": "Mukautettu HTML-koodi, joka lisätään sivuston <body> -tagin loppuun.",
|
||||||
|
"keywords": "Avainsanat",
|
||||||
|
"keywordsDescription": "Käytetään SEO-tarkoituksiin",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Näyttääksesi paikan, jossa LOGO tulee näkyä",
|
"logoDescription": "Näyttääksesi paikan, jossa LOGO tulee näkyä",
|
||||||
"logoPlaceholder": "Syötä LOGO:n URL-osoite, älä lopeta '/'-merkillä",
|
"logoPlaceholder": "Syötä LOGO:n URL-osoite, älä lopeta '/'-merkillä",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Vérification de l'email",
|
"emailVerification": "Vérification de l'email",
|
||||||
"emailVerificationDescription": "Lorsqu'elle est activée, les utilisateurs devront vérifier leur adresse e-mail",
|
"emailVerificationDescription": "Lorsqu'elle est activée, les utilisateurs devront vérifier leur adresse e-mail",
|
||||||
"enable": "Activer",
|
"enable": "Activer",
|
||||||
"enableDescription": "Après activation, les fonctions d'enregistrement, de connexion, de liaison et de déliaison par téléphone mobile seront activées",
|
"enableDescription": "Après activation, les fonctions d'enregistrement par e-mail, de connexion, de liaison et de délégation seront activées",
|
||||||
"expiration_email_template": "Modèle d'avis d'expiration",
|
"expiration_email_template": "Modèle d'avis d'expiration",
|
||||||
"expiration_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.",
|
"expiration_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.",
|
||||||
"failed": "Échoué",
|
"failed": "Échoué",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Enregistrement réussi"
|
"saveSuccess": "Enregistrement réussi"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personnalisé",
|
||||||
|
"customHtmlDescription": "Code HTML personnalisé à injecter dans le bas de la balise <body> du site.",
|
||||||
|
"keywords": "Mots-clés",
|
||||||
|
"keywordsDescription": "Utilisé à des fins de référencement",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Utilisé pour afficher l'emplacement où le LOGO doit être montré",
|
"logoDescription": "Utilisé pour afficher l'emplacement où le LOGO doit être montré",
|
||||||
"logoPlaceholder": "Veuillez entrer l'URL du LOGO, ne pas terminer par '/'",
|
"logoPlaceholder": "Veuillez entrer l'URL du LOGO, ne pas terminer par '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "ईमेल सत्यापन",
|
"emailVerification": "ईमेल सत्यापन",
|
||||||
"emailVerificationDescription": "सक्षम होने पर, उपयोगकर्ताओं को अपने ईमेल की पुष्टि करनी होगी",
|
"emailVerificationDescription": "सक्षम होने पर, उपयोगकर्ताओं को अपने ईमेल की पुष्टि करनी होगी",
|
||||||
"enable": "सक्षम करें",
|
"enable": "सक्षम करें",
|
||||||
"enableDescription": "सक्षम करने के बाद, मोबाइल फोन पंजीकरण, लॉगिन, बाइंडिंग, और अनबाइंडिंग कार्यक्षमताएँ सक्षम हो जाएँगी",
|
"enableDescription": "सक्षम करने के बाद, ईमेल पंजीकरण, लॉगिन, बाइंडिंग और अनबाइंडिंग कार्यक्षमताएँ सक्षम होंगी",
|
||||||
"expiration_email_template": "समाप्ति सूचना टेम्पलेट",
|
"expiration_email_template": "समाप्ति सूचना टेम्पलेट",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर को वास्तविक डेटा से बदला जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
|
"expiration_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर को वास्तविक डेटा से बदला जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
|
||||||
"failed": "असफल",
|
"failed": "असफल",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "कस्टम HTML",
|
||||||
|
"customHtmlDescription": "साइट के <body> टैग के नीचे इंजेक्ट करने के लिए कस्टम HTML कोड।",
|
||||||
|
"keywords": "कीवर्ड",
|
||||||
|
"keywordsDescription": "SEO उद्देश्यों के लिए उपयोग किया जाता है",
|
||||||
"logo": "लोगो",
|
"logo": "लोगो",
|
||||||
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
||||||
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Email ellenőrzés",
|
"emailVerification": "Email ellenőrzés",
|
||||||
"emailVerificationDescription": "Ha engedélyezve van, a felhasználóknak ellenőrizniük kell az e-mail címüket",
|
"emailVerificationDescription": "Ha engedélyezve van, a felhasználóknak ellenőrizniük kell az e-mail címüket",
|
||||||
"enable": "Engedélyez",
|
"enable": "Engedélyez",
|
||||||
"enableDescription": "A bekapcsolás után a mobiltelefon regisztráció, bejelentkezés, kötés és oldás funkciók elérhetővé válnak",
|
"enableDescription": "A funkció engedélyezése után az e-mailes regisztráció, bejelentkezés, kötés és leválasztás lehetőségei elérhetővé válnak.",
|
||||||
"expiration_email_template": "Lejárati Értesítő Sablon",
|
"expiration_email_template": "Lejárati Értesítő Sablon",
|
||||||
"expiration_email_templateDescription": "A {after}.variable{before} helyőrzőket tényleges adatokkal fogjuk helyettesíteni. Ügyeljen arra, hogy ezeket a változókat megtartsa.",
|
"expiration_email_templateDescription": "A {after}.variable{before} helyőrzőket tényleges adatokkal fogjuk helyettesíteni. Ügyeljen arra, hogy ezeket a változókat megtartsa.",
|
||||||
"failed": "Sikertelen",
|
"failed": "Sikertelen",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Sikeres mentés"
|
"saveSuccess": "Sikeres mentés"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Egyedi HTML",
|
||||||
|
"customHtmlDescription": "Egyedi HTML kód, amelyet a webhely <body> címkéjének aljára kell beilleszteni.",
|
||||||
|
"keywords": "Kulcsszavak",
|
||||||
|
"keywordsDescription": "SEO célokra használva",
|
||||||
"logo": "LOGÓ",
|
"logo": "LOGÓ",
|
||||||
"logoDescription": "A LOGÓ megjelenítésére szolgáló hely",
|
"logoDescription": "A LOGÓ megjelenítésére szolgáló hely",
|
||||||
"logoPlaceholder": "Kérjük, adja meg a LOGÓ URL-címét, ne végződjön '/' jellel",
|
"logoPlaceholder": "Kérjük, adja meg a LOGÓ URL-címét, ne végződjön '/' jellel",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "メール確認",
|
"emailVerification": "メール確認",
|
||||||
"emailVerificationDescription": "有効にすると、ユーザーはメールを確認する必要があります",
|
"emailVerificationDescription": "有効にすると、ユーザーはメールを確認する必要があります",
|
||||||
"enable": "有効にする",
|
"enable": "有効にする",
|
||||||
"enableDescription": "有効にすると、携帯電話の登録、ログイン、バインディング、バインディング解除の機能が有効になります",
|
"enableDescription": "有効にすると、メールによる登録、ログイン、バインディング、およびバインディング解除の機能が有効になります",
|
||||||
"expiration_email_template": "有効期限通知テンプレート",
|
"expiration_email_template": "有効期限通知テンプレート",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} のプレースホルダーは実際のデータに置き換えられます。これらの変数を必ず保持してください。",
|
"expiration_email_templateDescription": "{after}.variable{before} のプレースホルダーは実際のデータに置き換えられます。これらの変数を必ず保持してください。",
|
||||||
"failed": "失敗しました",
|
"failed": "失敗しました",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "保存に成功しました"
|
"saveSuccess": "保存に成功しました"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "カスタムHTML",
|
||||||
|
"customHtmlDescription": "サイトの <body> タグの下部に挿入されるカスタム HTML コード。",
|
||||||
|
"keywords": "キーワード",
|
||||||
|
"keywordsDescription": "SEO目的で使用されます",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
||||||
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "이메일 인증",
|
"emailVerification": "이메일 인증",
|
||||||
"emailVerificationDescription": "활성화되면 사용자는 이메일을 인증해야 합니다",
|
"emailVerificationDescription": "활성화되면 사용자는 이메일을 인증해야 합니다",
|
||||||
"enable": "사용",
|
"enable": "사용",
|
||||||
"enableDescription": "활성화 후, 휴대폰 등록, 로그인, 연결 및 연결 해제 기능이 활성화됩니다",
|
"enableDescription": "활성화하면 이메일 등록, 로그인, 바인딩 및 바인딩 해제 기능이 활성화됩니다.",
|
||||||
"expiration_email_template": "만료 알림 템플릿",
|
"expiration_email_template": "만료 알림 템플릿",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이 변수를 반드시 유지하십시오.",
|
"expiration_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이 변수를 반드시 유지하십시오.",
|
||||||
"failed": "실패",
|
"failed": "실패",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "저장 성공"
|
"saveSuccess": "저장 성공"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "사용자 정의 HTML",
|
||||||
|
"customHtmlDescription": "사이트의 <body> 태그 하단에 삽입될 사용자 정의 HTML 코드입니다.",
|
||||||
|
"keywords": "키워드",
|
||||||
|
"keywordsDescription": "SEO 목적으로 사용됨",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
||||||
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "E-postbekreftelse",
|
"emailVerification": "E-postbekreftelse",
|
||||||
"emailVerificationDescription": "Når aktivert, må brukere bekrefte e-posten sin",
|
"emailVerificationDescription": "Når aktivert, må brukere bekrefte e-posten sin",
|
||||||
"enable": "Aktiver",
|
"enable": "Aktiver",
|
||||||
"enableDescription": "Etter aktivering vil funksjonene for registrering, innlogging, binding og frakobling av mobiltelefon bli aktivert",
|
"enableDescription": "Etter aktivering vil funksjonene for e-postregistrering, innlogging, binding og avbinding bli aktivert",
|
||||||
"expiration_email_template": "Utløpsvarsel Mal",
|
"expiration_email_template": "Utløpsvarsel Mal",
|
||||||
"expiration_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
|
"expiration_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
|
||||||
"failed": "Mislyktes",
|
"failed": "Mislyktes",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Lagring vellykket"
|
"saveSuccess": "Lagring vellykket"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Egendefinert HTML",
|
||||||
|
"customHtmlDescription": "Egendefinert HTML-kode som skal settes inn i bunnen av nettstedets <body>-tag.",
|
||||||
|
"keywords": "Nøkkelord",
|
||||||
|
"keywordsDescription": "Brukes til SEO-formål",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Brukes til å vise hvor LOGO skal vises",
|
"logoDescription": "Brukes til å vise hvor LOGO skal vises",
|
||||||
"logoPlaceholder": "Vennligst skriv inn URL-adressen til LOGO, ikke avslutt med '/'",
|
"logoPlaceholder": "Vennligst skriv inn URL-adressen til LOGO, ikke avslutt med '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Weryfikacja e-maila",
|
"emailVerification": "Weryfikacja e-maila",
|
||||||
"emailVerificationDescription": "Po włączeniu użytkownicy będą musieli zweryfikować swój adres e-mail",
|
"emailVerificationDescription": "Po włączeniu użytkownicy będą musieli zweryfikować swój adres e-mail",
|
||||||
"enable": "Włącz",
|
"enable": "Włącz",
|
||||||
"enableDescription": "Po włączeniu zostaną aktywowane funkcje rejestracji, logowania, powiązania i odwiązania telefonu komórkowego",
|
"enableDescription": "Po włączeniu funkcji rejestracji, logowania, powiązania i odłączenia konta e-mail będą dostępne",
|
||||||
"expiration_email_template": "Szablon Powiadomienia o Wygaśnięciu",
|
"expiration_email_template": "Szablon Powiadomienia o Wygaśnięciu",
|
||||||
"expiration_email_templateDescription": "Elementy zastępcze {after}.variable{before} zostaną zastąpione rzeczywistymi danymi. Upewnij się, że te zmienne zostaną zachowane.",
|
"expiration_email_templateDescription": "Elementy zastępcze {after}.variable{before} zostaną zastąpione rzeczywistymi danymi. Upewnij się, że te zmienne zostaną zachowane.",
|
||||||
"failed": "Niepowodzenie",
|
"failed": "Niepowodzenie",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Zapisano pomyślnie"
|
"saveSuccess": "Zapisano pomyślnie"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Niestandardowy HTML",
|
||||||
|
"customHtmlDescription": "Niestandardowy kod HTML, który ma być wstrzyknięty na końcu tagu <body> witryny.",
|
||||||
|
"keywords": "Słowa kluczowe",
|
||||||
|
"keywordsDescription": "Używane do celów SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Miejsce do wyświetlania LOGO",
|
"logoDescription": "Miejsce do wyświetlania LOGO",
|
||||||
"logoPlaceholder": "Wprowadź adres URL LOGO, nie kończ na '/'",
|
"logoPlaceholder": "Wprowadź adres URL LOGO, nie kończ na '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificação de Email",
|
"emailVerification": "Verificação de Email",
|
||||||
"emailVerificationDescription": "Quando ativado, os usuários precisarão verificar seu e-mail",
|
"emailVerificationDescription": "Quando ativado, os usuários precisarão verificar seu e-mail",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Após a ativação, as funções de registro, login, vinculação e desvinculação de telefone celular serão ativadas",
|
"enableDescription": "Após a ativação, as funções de registro por e-mail, login, vinculação e desvinculação serão habilitadas",
|
||||||
"expiration_email_template": "Modelo de Aviso de Expiração",
|
"expiration_email_template": "Modelo de Aviso de Expiração",
|
||||||
"expiration_email_templateDescription": "Os marcadores {after}.variable{before} serão substituídos por dados reais. Certifique-se de manter essas variáveis.",
|
"expiration_email_templateDescription": "Os marcadores {after}.variable{before} serão substituídos por dados reais. Certifique-se de manter essas variáveis.",
|
||||||
"failed": "Falhou",
|
"failed": "Falhou",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Salvo com sucesso"
|
"saveSuccess": "Salvo com sucesso"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML Personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado a ser inserido no final da tag <body> do site.",
|
||||||
|
"keywords": "Palavras-chave",
|
||||||
|
"keywordsDescription": "Usado para fins de SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Usado para exibir a posição onde o LOGO precisa ser mostrado",
|
"logoDescription": "Usado para exibir a posição onde o LOGO precisa ser mostrado",
|
||||||
"logoPlaceholder": "Por favor, insira o URL do LOGO, não termine com '/'",
|
"logoPlaceholder": "Por favor, insira o URL do LOGO, não termine com '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificare Email",
|
"emailVerification": "Verificare Email",
|
||||||
"emailVerificationDescription": "Când este activată, utilizatorii vor trebui să-și verifice emailul",
|
"emailVerificationDescription": "Când este activată, utilizatorii vor trebui să-și verifice emailul",
|
||||||
"enable": "Activează",
|
"enable": "Activează",
|
||||||
"enableDescription": "După activare, funcțiile de înregistrare, autentificare, asociere și disociere a telefonului mobil vor fi activate",
|
"enableDescription": "După activare, funcțiile de înregistrare prin email, autentificare, legare și delegare vor fi activate.",
|
||||||
"expiration_email_template": "Șablon de Notificare a Expirării",
|
"expiration_email_template": "Șablon de Notificare a Expirării",
|
||||||
"expiration_email_templateDescription": "Locurile rezervate {after}.variable{before} vor fi înlocuite cu date reale. Asigurați-vă că păstrați aceste variabile.",
|
"expiration_email_templateDescription": "Locurile rezervate {after}.variable{before} vor fi înlocuite cu date reale. Asigurați-vă că păstrați aceste variabile.",
|
||||||
"failed": "Eșuat",
|
"failed": "Eșuat",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Salvare reușită"
|
"saveSuccess": "Salvare reușită"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personalizat",
|
||||||
|
"customHtmlDescription": "Cod HTML personalizat care va fi injectat în partea de jos a etichetei <body> a site-ului.",
|
||||||
|
"keywords": "Cuvinte cheie",
|
||||||
|
"keywordsDescription": "Utilizate în scopuri SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Utilizat pentru a afișa locația unde trebuie să fie prezentat LOGO-ul",
|
"logoDescription": "Utilizat pentru a afișa locația unde trebuie să fie prezentat LOGO-ul",
|
||||||
"logoPlaceholder": "Vă rugăm să introduceți adresa URL a LOGO-ului, fără să se termine cu '/'",
|
"logoPlaceholder": "Vă rugăm să introduceți adresa URL a LOGO-ului, fără să se termine cu '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Подтверждение электронной почты",
|
"emailVerification": "Подтверждение электронной почты",
|
||||||
"emailVerificationDescription": "Когда включено, пользователям необходимо будет подтвердить свой адрес электронной почты",
|
"emailVerificationDescription": "Когда включено, пользователям необходимо будет подтвердить свой адрес электронной почты",
|
||||||
"enable": "Включить",
|
"enable": "Включить",
|
||||||
"enableDescription": "После включения будут доступны функции регистрации, входа, привязки и отвязки мобильного телефона",
|
"enableDescription": "После включения будут активированы функции регистрации по электронной почте, входа в систему, привязки и отвязки.",
|
||||||
"expiration_email_template": "Шаблон уведомления об истечении срока",
|
"expiration_email_template": "Шаблон уведомления об истечении срока",
|
||||||
"expiration_email_templateDescription": "Заполнители {after}.variable{before} будут заменены фактическими данными. Убедитесь, что эти переменные сохранены.",
|
"expiration_email_templateDescription": "Заполнители {after}.variable{before} будут заменены фактическими данными. Убедитесь, что эти переменные сохранены.",
|
||||||
"failed": "Не удалось",
|
"failed": "Не удалось",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Успешно сохранено"
|
"saveSuccess": "Успешно сохранено"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Пользовательский HTML",
|
||||||
|
"customHtmlDescription": "Пользовательский HTML-код, который будет вставлен в конец тега <body> сайта.",
|
||||||
|
"keywords": "Ключевые слова",
|
||||||
|
"keywordsDescription": "Используется для SEO",
|
||||||
"logo": "ЛОГОТИП",
|
"logo": "ЛОГОТИП",
|
||||||
"logoDescription": "Используется для отображения места, где необходимо показать ЛОГОТИП",
|
"logoDescription": "Используется для отображения места, где необходимо показать ЛОГОТИП",
|
||||||
"logoPlaceholder": "Введите URL-адрес ЛОГОТИПА, не заканчивайте на '/'",
|
"logoPlaceholder": "Введите URL-адрес ЛОГОТИПА, не заканчивайте на '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "การยืนยันอีเมล",
|
"emailVerification": "การยืนยันอีเมล",
|
||||||
"emailVerificationDescription": "เมื่อเปิดใช้งาน ผู้ใช้จะต้องยืนยันอีเมลของตน",
|
"emailVerificationDescription": "เมื่อเปิดใช้งาน ผู้ใช้จะต้องยืนยันอีเมลของตน",
|
||||||
"enable": "เปิดใช้งาน",
|
"enable": "เปิดใช้งาน",
|
||||||
"enableDescription": "หลังจากเปิดใช้งานแล้ว ฟังก์ชันการลงทะเบียน การเข้าสู่ระบบ การผูกบัญชี และการยกเลิกการผูกบัญชีด้วยโทรศัพท์มือถือจะถูกเปิดใช้งาน",
|
"enableDescription": "หลังจากเปิดใช้งาน ฟังก์ชันการลงทะเบียนทางอีเมล การเข้าสู่ระบบ การผูก และการยกเลิกการผูก จะถูกเปิดใช้งาน",
|
||||||
"expiration_email_template": "เทมเพลตแจ้งเตือนการหมดอายุ",
|
"expiration_email_template": "เทมเพลตแจ้งเตือนการหมดอายุ",
|
||||||
"expiration_email_templateDescription": "ตัวแปร {after}.variable{before} จะถูกแทนที่ด้วยข้อมูลจริง โปรดตรวจสอบให้แน่ใจว่าเก็บตัวแปรเหล่านี้ไว้",
|
"expiration_email_templateDescription": "ตัวแปร {after}.variable{before} จะถูกแทนที่ด้วยข้อมูลจริง โปรดตรวจสอบให้แน่ใจว่าเก็บตัวแปรเหล่านี้ไว้",
|
||||||
"failed": "ล้มเหลว",
|
"failed": "ล้มเหลว",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "บันทึกสำเร็จ"
|
"saveSuccess": "บันทึกสำเร็จ"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML ที่กำหนดเอง",
|
||||||
|
"customHtmlDescription": "รหัส HTML ที่กำหนดเองเพื่อแทรกลงในส่วนล่างของแท็ก <body> ของเว็บไซต์.",
|
||||||
|
"keywords": "คำสำคัญ",
|
||||||
|
"keywordsDescription": "ใช้สำหรับวัตถุประสงค์ SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "ใช้สำหรับแสดงตำแหน่งที่ต้องการแสดง LOGO",
|
"logoDescription": "ใช้สำหรับแสดงตำแหน่งที่ต้องการแสดง LOGO",
|
||||||
"logoPlaceholder": "กรุณาใส่ URL ของ LOGO โดยไม่ต้องลงท้ายด้วย '/'",
|
"logoPlaceholder": "กรุณาใส่ URL ของ LOGO โดยไม่ต้องลงท้ายด้วย '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "E-posta Doğrulama",
|
"emailVerification": "E-posta Doğrulama",
|
||||||
"emailVerificationDescription": "Etkinleştirildiğinde, kullanıcıların e-posta adreslerini doğrulamaları gerekecek",
|
"emailVerificationDescription": "Etkinleştirildiğinde, kullanıcıların e-posta adreslerini doğrulamaları gerekecek",
|
||||||
"enable": "Etkinleştir",
|
"enable": "Etkinleştir",
|
||||||
"enableDescription": "Etkinleştirildikten sonra, cep telefonu kaydı, giriş, bağlama ve bağlantı kesme işlevleri etkinleştirilecektir",
|
"enableDescription": "Etkinleştirildikten sonra, e-posta kaydı, giriş, bağlama ve ayırma işlevleri etkinleştirilecektir.",
|
||||||
"expiration_email_template": "Süre Sonu Bildirimi Şablonu",
|
"expiration_email_template": "Süre Sonu Bildirimi Şablonu",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} yer tutucuları gerçek verilerle değiştirilecektir. Bu değişkenleri koruduğunuzdan emin olun.",
|
"expiration_email_templateDescription": "{after}.variable{before} yer tutucuları gerçek verilerle değiştirilecektir. Bu değişkenleri koruduğunuzdan emin olun.",
|
||||||
"failed": "Başarısız",
|
"failed": "Başarısız",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Başarıyla kaydedildi"
|
"saveSuccess": "Başarıyla kaydedildi"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Özel HTML",
|
||||||
|
"customHtmlDescription": "Site'in <body> etiketinin altına yerleştirilecek özel HTML kodu.",
|
||||||
|
"keywords": "Anahtar Kelimeler",
|
||||||
|
"keywordsDescription": "SEO amaçları için kullanılır",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGO'nun gösterilmesi gereken yeri belirtir",
|
"logoDescription": "LOGO'nun gösterilmesi gereken yeri belirtir",
|
||||||
"logoPlaceholder": "Lütfen LOGO'nun URL adresini girin, '/' ile bitmemelidir",
|
"logoPlaceholder": "Lütfen LOGO'nun URL adresini girin, '/' ile bitmemelidir",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Підтвердження електронної пошти",
|
"emailVerification": "Підтвердження електронної пошти",
|
||||||
"emailVerificationDescription": "Коли ввімкнено, користувачам потрібно буде підтвердити свою електронну пошту",
|
"emailVerificationDescription": "Коли ввімкнено, користувачам потрібно буде підтвердити свою електронну пошту",
|
||||||
"enable": "Увімкнути",
|
"enable": "Увімкнути",
|
||||||
"enableDescription": "Після увімкнення будуть доступні функції реєстрації, входу, прив'язки та відв'язки мобільного телефону",
|
"enableDescription": "Після активації будуть доступні функції реєстрації електронною поштою, входу, прив'язки та відв'язки.",
|
||||||
"expiration_email_template": "Шаблон повідомлення про закінчення терміну дії",
|
"expiration_email_template": "Шаблон повідомлення про закінчення терміну дії",
|
||||||
"expiration_email_templateDescription": "Заповнювачі {after}.variable{before} будуть замінені на фактичні дані. Переконайтеся, що зберегли ці змінні.",
|
"expiration_email_templateDescription": "Заповнювачі {after}.variable{before} будуть замінені на фактичні дані. Переконайтеся, що зберегли ці змінні.",
|
||||||
"failed": "Не вдалося",
|
"failed": "Не вдалося",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Успішно збережено"
|
"saveSuccess": "Успішно збережено"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Користувацький HTML",
|
||||||
|
"customHtmlDescription": "Користувацький HTML-код, який буде вставлено в кінець тегу <body> сайту.",
|
||||||
|
"keywords": "Ключові слова",
|
||||||
|
"keywordsDescription": "Використовується для SEO",
|
||||||
"logo": "ЛОГО",
|
"logo": "ЛОГО",
|
||||||
"logoDescription": "Використовується для відображення місця, де потрібно показати ЛОГО",
|
"logoDescription": "Використовується для відображення місця, де потрібно показати ЛОГО",
|
||||||
"logoPlaceholder": "Будь ласка, введіть URL-адресу ЛОГО, не закінчуйте на '/'",
|
"logoPlaceholder": "Будь ласка, введіть URL-адресу ЛОГО, не закінчуйте на '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Xác minh Email",
|
"emailVerification": "Xác minh Email",
|
||||||
"emailVerificationDescription": "Khi được bật, người dùng sẽ cần xác minh email của họ",
|
"emailVerificationDescription": "Khi được bật, người dùng sẽ cần xác minh email của họ",
|
||||||
"enable": "Kích hoạt",
|
"enable": "Kích hoạt",
|
||||||
"enableDescription": "Sau khi kích hoạt, các chức năng đăng ký, đăng nhập, liên kết và hủy liên kết điện thoại di động sẽ được kích hoạt",
|
"enableDescription": "Sau khi kích hoạt, các chức năng đăng ký email, đăng nhập, liên kết và hủy liên kết sẽ được bật",
|
||||||
"expiration_email_template": "Mẫu Thông Báo Hết Hạn",
|
"expiration_email_template": "Mẫu Thông Báo Hết Hạn",
|
||||||
"expiration_email_templateDescription": "Các chỗ chè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.",
|
"expiration_email_templateDescription": "Các chỗ chè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.",
|
||||||
"failed": "Thất bại",
|
"failed": "Thất bại",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "Lưu thành công"
|
"saveSuccess": "Lưu thành công"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML tùy chỉnh",
|
||||||
|
"customHtmlDescription": "Mã HTML tùy chỉnh để được chèn vào cuối thẻ <body> của trang.",
|
||||||
|
"keywords": "Từ khóa",
|
||||||
|
"keywordsDescription": "Dùng cho mục đích SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Dùng để hiển thị vị trí cần hiển thị LOGO",
|
"logoDescription": "Dùng để hiển thị vị trí cần hiển thị LOGO",
|
||||||
"logoPlaceholder": "Vui lòng nhập địa chỉ URL của LOGO, không kết thúc bằng '/'",
|
"logoPlaceholder": "Vui lòng nhập địa chỉ URL của LOGO, không kết thúc bằng '/'",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "电子邮件验证",
|
"emailVerification": "电子邮件验证",
|
||||||
"emailVerificationDescription": "启用后,用户需要验证他们的电子邮件",
|
"emailVerificationDescription": "启用后,用户需要验证他们的电子邮件",
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
"enableDescription": "启用后,将启用手机注册、登录、绑定和解绑功能",
|
"enableDescription": "启用后,将启用电子邮件注册、登录、绑定和解绑功能",
|
||||||
"expiration_email_template": "到期通知模板",
|
"expiration_email_template": "到期通知模板",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} 占位符将被实际数据替换。请确保保留这些变量。",
|
"expiration_email_templateDescription": "{after}.variable{before} 占位符将被实际数据替换。请确保保留这些变量。",
|
||||||
"failed": "失败",
|
"failed": "失败",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "保存成功"
|
"saveSuccess": "保存成功"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "自定义HTML",
|
||||||
|
"customHtmlDescription": "要注入到网站 <body> 标签底部的自定义 HTML 代码。",
|
||||||
|
"keywords": "关键词",
|
||||||
|
"keywordsDescription": "用于搜索引擎优化",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "用于显示需要展示 LOGO 的位置",
|
"logoDescription": "用于显示需要展示 LOGO 的位置",
|
||||||
"logoPlaceholder": "请输入 LOGO 的 URL 地址,不要以 '/' 结尾",
|
"logoPlaceholder": "请输入 LOGO 的 URL 地址,不要以 '/' 结尾",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "電郵驗證",
|
"emailVerification": "電郵驗證",
|
||||||
"emailVerificationDescription": "啟用後,用戶需要驗證他們的電郵",
|
"emailVerificationDescription": "啟用後,用戶需要驗證他們的電郵",
|
||||||
"enable": "啟用",
|
"enable": "啟用",
|
||||||
"enableDescription": "啟用後,將啟用手機註冊、登入、綁定和解綁功能",
|
"enableDescription": "啟用後,將開啟電子郵件註冊、登錄、綁定及解除綁定功能",
|
||||||
"expiration_email_template": "到期通知範本",
|
"expiration_email_template": "到期通知範本",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} 佔位符將被實際數據替換。請確保保留這些變數。",
|
"expiration_email_templateDescription": "{after}.variable{before} 佔位符將被實際數據替換。請確保保留這些變數。",
|
||||||
"failed": "失敗",
|
"failed": "失敗",
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"saveSuccess": "保存成功"
|
"saveSuccess": "保存成功"
|
||||||
},
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "自定義HTML",
|
||||||
|
"customHtmlDescription": "自定義 HTML 代碼,將注入到網站 <body> 標籤的底部。",
|
||||||
|
"keywords": "關鍵字",
|
||||||
|
"keywordsDescription": "用於SEO目的",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "用於顯示需要展示 LOGO 的位置",
|
"logoDescription": "用於顯示需要展示 LOGO 的位置",
|
||||||
"logoPlaceholder": "請輸入 LOGO 的 URL 地址,不要以 '/' 結尾",
|
"logoPlaceholder": "請輸入 LOGO 的 URL 地址,不要以 '/' 結尾",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export async function getAuthMethodConfig(
|
|||||||
|
|
||||||
/** Update auth method config PUT /v1/admin/auth-method/config */
|
/** Update auth method config PUT /v1/admin/auth-method/config */
|
||||||
export async function updateAuthMethodConfig(
|
export async function updateAuthMethodConfig(
|
||||||
body: API.UpdataAuthMethodConfigRequest,
|
body: API.UpdateAuthMethodConfigRequest,
|
||||||
options?: { [key: string]: any },
|
options?: { [key: string]: any },
|
||||||
) {
|
) {
|
||||||
return request<API.Response & { data?: API.AuthMethodConfig }>('/v1/admin/auth-method/config', {
|
return request<API.Response & { data?: API.AuthMethodConfig }>('/v1/admin/auth-method/config', {
|
||||||
|
|||||||
+11
-9
@@ -37,7 +37,7 @@ declare namespace API {
|
|||||||
|
|
||||||
type ApplicationPlatform = {
|
type ApplicationPlatform = {
|
||||||
ios?: ApplicationVersion[];
|
ios?: ApplicationVersion[];
|
||||||
mac?: ApplicationVersion[];
|
macos?: ApplicationVersion[];
|
||||||
linux?: ApplicationVersion[];
|
linux?: ApplicationVersion[];
|
||||||
android?: ApplicationVersion[];
|
android?: ApplicationVersion[];
|
||||||
windows?: ApplicationVersion[];
|
windows?: ApplicationVersion[];
|
||||||
@@ -1010,6 +1010,8 @@ declare namespace API {
|
|||||||
site_name: string;
|
site_name: string;
|
||||||
site_desc: string;
|
site_desc: string;
|
||||||
site_logo: string;
|
site_logo: string;
|
||||||
|
keywords: string;
|
||||||
|
custom_html: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type SortItem = {
|
type SortItem = {
|
||||||
@@ -1177,13 +1179,6 @@ declare namespace API {
|
|||||||
security_config: SecurityConfig;
|
security_config: SecurityConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
type UpdataAuthMethodConfigRequest = {
|
|
||||||
id: number;
|
|
||||||
method: string;
|
|
||||||
config: Record<string, any>;
|
|
||||||
enabled: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
type UpdateAlipayF2fRequest = {
|
type UpdateAlipayF2fRequest = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -1230,6 +1225,13 @@ declare namespace API {
|
|||||||
application_id: number;
|
application_id: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type UpdateAuthMethodConfigRequest = {
|
||||||
|
id: number;
|
||||||
|
method: string;
|
||||||
|
config: Record<string, any>;
|
||||||
|
enabled: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
type UpdateCouponRequest = {
|
type UpdateCouponRequest = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -1440,7 +1442,7 @@ declare namespace API {
|
|||||||
type UserDevice = {
|
type UserDevice = {
|
||||||
id: number;
|
id: number;
|
||||||
ip: string;
|
ip: string;
|
||||||
imei: string;
|
identifier: string;
|
||||||
user_agent: string;
|
user_agent: string;
|
||||||
online: boolean;
|
online: boolean;
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
|||||||
+4
-2
@@ -35,7 +35,7 @@ declare namespace API {
|
|||||||
|
|
||||||
type ApplicationPlatform = {
|
type ApplicationPlatform = {
|
||||||
ios?: ApplicationVersion[];
|
ios?: ApplicationVersion[];
|
||||||
mac?: ApplicationVersion[];
|
macos?: ApplicationVersion[];
|
||||||
linux?: ApplicationVersion[];
|
linux?: ApplicationVersion[];
|
||||||
android?: ApplicationVersion[];
|
android?: ApplicationVersion[];
|
||||||
windows?: ApplicationVersion[];
|
windows?: ApplicationVersion[];
|
||||||
@@ -431,6 +431,8 @@ declare namespace API {
|
|||||||
site_name: string;
|
site_name: string;
|
||||||
site_desc: string;
|
site_desc: string;
|
||||||
site_logo: string;
|
site_logo: string;
|
||||||
|
keywords: string;
|
||||||
|
custom_html: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type SortItem = {
|
type SortItem = {
|
||||||
@@ -628,7 +630,7 @@ declare namespace API {
|
|||||||
type UserDevice = {
|
type UserDevice = {
|
||||||
id: number;
|
id: number;
|
||||||
ip: string;
|
ip: string;
|
||||||
imei: string;
|
identifier: string;
|
||||||
user_agent: string;
|
user_agent: string;
|
||||||
online: boolean;
|
online: boolean;
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ import Subscribe from '../subscribe/page';
|
|||||||
|
|
||||||
const platforms: (keyof API.ApplicationPlatform)[] = [
|
const platforms: (keyof API.ApplicationPlatform)[] = [
|
||||||
'windows',
|
'windows',
|
||||||
'mac',
|
'macos',
|
||||||
'linux',
|
'linux',
|
||||||
'ios',
|
'ios',
|
||||||
'android',
|
'android',
|
||||||
@@ -106,7 +106,7 @@ export default function Content() {
|
|||||||
icon={`${
|
icon={`${
|
||||||
{
|
{
|
||||||
windows: 'mdi:microsoft-windows',
|
windows: 'mdi:microsoft-windows',
|
||||||
mac: 'uil:apple',
|
macos: 'uil:apple',
|
||||||
linux: 'uil:linux',
|
linux: 'uil:linux',
|
||||||
ios: 'simple-icons:ios',
|
ios: 'simple-icons:ios',
|
||||||
android: 'uil:android',
|
android: 'uil:android',
|
||||||
@@ -261,6 +261,7 @@ export default function Content() {
|
|||||||
toast.success(
|
toast.success(
|
||||||
<>
|
<>
|
||||||
<p>{t('copySuccess')}</p>
|
<p>{t('copySuccess')}</p>
|
||||||
|
<br />
|
||||||
<p>{t('manualImportMessage')}</p>
|
<p>{t('manualImportMessage')}</p>
|
||||||
</>,
|
</>,
|
||||||
);
|
);
|
||||||
@@ -307,7 +308,10 @@ export default function Content() {
|
|||||||
<Link href={app.url}>{t('download')}</Link>
|
<Link href={app.url}>{t('download')}</Link>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<CopyToClipboard text={url} onCopy={handleCopy}>
|
<CopyToClipboard
|
||||||
|
text={getAppSubLink(application.subscribe_type, url) || url}
|
||||||
|
onCopy={handleCopy}
|
||||||
|
>
|
||||||
<Button size='sm' className='rounded-l-none p-2'>
|
<Button size='sm' className='rounded-l-none p-2'>
|
||||||
{t('import')}
|
{t('import')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export default function Page() {
|
|||||||
enabled: !!orderNo && data?.status === 1,
|
enabled: !!orderNo && data?.status === 1,
|
||||||
queryKey: ['checkoutOrder', orderNo],
|
queryKey: ['checkoutOrder', orderNo],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const { data } = await checkoutOrder({ orderNo: orderNo! });
|
const { data } = await checkoutOrder({ orderNo: orderNo!, returnUrl: window.location.href });
|
||||||
return data?.data;
|
return data?.data;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -202,8 +202,7 @@ export default function ThirdPartyAccounts() {
|
|||||||
name: 'Device',
|
name: 'Device',
|
||||||
type: 'OAuth',
|
type: 'OAuth',
|
||||||
},
|
},
|
||||||
];
|
].filter((account) => oauth_methods?.includes(account.id));
|
||||||
// .filter((account) => oauth_methods?.includes(account.id));
|
|
||||||
|
|
||||||
const [editValues, setEditValues] = useState<Record<string, any>>({});
|
const [editValues, setEditValues] = useState<Record<string, any>>({});
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/
|
|||||||
import { Input } from '@workspace/ui/components/input';
|
import { Input } from '@workspace/ui/components/input';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function LoginForm({
|
export default function LoginForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -38,10 +38,16 @@ export default function LoginForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -73,7 +79,7 @@ export default function LoginForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='login' {...field} />
|
<CloudFlareTurnstile id='login' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import { Input } from '@workspace/ui/components/input';
|
|||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function RegisterForm({
|
export default function RegisterForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -76,13 +76,19 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{auth.register.stop_register ? (
|
{auth.register.stop_register ? (
|
||||||
<Markdown>{t('message')}</Markdown>
|
<Markdown>{t('message')}</Markdown>
|
||||||
) : (
|
) : (
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -177,7 +183,7 @@ export default function RegisterForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='register' {...field} />
|
<CloudFlareTurnstile id='register' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/
|
|||||||
import { Input } from '@workspace/ui/components/input';
|
import { Input } from '@workspace/ui/components/input';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function ResetForm({
|
export default function ResetForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -43,10 +43,16 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -59,36 +65,33 @@ export default function ResetForm({
|
|||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
<FormField
|
||||||
{auth?.email?.enable_verify && (
|
control={form.control}
|
||||||
<FormField
|
name='code'
|
||||||
control={form.control}
|
render={({ field }) => (
|
||||||
name='code'
|
<FormItem>
|
||||||
render={({ field }) => (
|
<FormControl>
|
||||||
<FormItem>
|
<div className='flex items-center gap-2'>
|
||||||
<FormControl>
|
<Input
|
||||||
<div className='flex items-center gap-2'>
|
disabled={loading}
|
||||||
<Input
|
placeholder='Enter code...'
|
||||||
disabled={loading}
|
type='text'
|
||||||
placeholder='Enter code...'
|
{...field}
|
||||||
type='text'
|
value={field.value as string}
|
||||||
{...field}
|
/>
|
||||||
value={field.value as string}
|
<SendCode
|
||||||
/>
|
type='email'
|
||||||
<SendCode
|
params={{
|
||||||
type='email'
|
...form.getValues(),
|
||||||
params={{
|
type: 2,
|
||||||
...form.getValues(),
|
}}
|
||||||
type: 2,
|
/>
|
||||||
}}
|
</div>
|
||||||
/>
|
</FormControl>
|
||||||
</div>
|
<FormMessage />
|
||||||
</FormControl>
|
</FormItem>
|
||||||
<FormMessage />
|
)}
|
||||||
</FormItem>
|
/>
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='password'
|
name='password'
|
||||||
@@ -108,7 +111,7 @@ export default function ResetForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='reset' {...field} />
|
<CloudFlareTurnstile id='reset' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select
|
|||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
|
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction, useState } from 'react';
|
import { Dispatch, SetStateAction, useRef, useState } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function LoginForm({
|
export default function LoginForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -45,10 +45,16 @@ export default function LoginForm({
|
|||||||
|
|
||||||
const [mode, setMode] = useState<'password' | 'code'>('password');
|
const [mode, setMode] = useState<'password' | 'code'>('password');
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='telephone'
|
name='telephone'
|
||||||
@@ -138,7 +144,7 @@ export default function LoginForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='login' {...field} />
|
<CloudFlareTurnstile id='login' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select
|
|||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function RegisterForm({
|
export default function RegisterForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -63,13 +63,19 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{auth.register.stop_register ? (
|
{auth.register.stop_register ? (
|
||||||
<Markdown>{t('message')}</Markdown>
|
<Markdown>{t('message')}</Markdown>
|
||||||
) : (
|
) : (
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='telephone'
|
name='telephone'
|
||||||
@@ -193,7 +199,7 @@ export default function RegisterForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='register' {...field} />
|
<CloudFlareTurnstile id='register' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import { Input } from '@workspace/ui/components/input';
|
|||||||
import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select';
|
import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction, useState } from 'react';
|
import { Dispatch, SetStateAction, useRef, useState } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function ResetForm({
|
export default function ResetForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -46,10 +46,16 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
onSubmit(data);
|
||||||
|
turnstile.current?.reset();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='telephone'
|
name='telephone'
|
||||||
@@ -136,7 +142,7 @@ export default function ResetForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='reset' {...field} />
|
<CloudFlareTurnstile id='reset' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -2,26 +2,37 @@
|
|||||||
|
|
||||||
import { useLocale } from 'next-intl';
|
import { useLocale } from 'next-intl';
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
import { useEffect } from 'react';
|
import { forwardRef, useEffect, useImperativeHandle } from 'react';
|
||||||
import Turnstile, { useTurnstile } from 'react-turnstile';
|
import Turnstile, { useTurnstile } from 'react-turnstile';
|
||||||
|
|
||||||
import useGlobalStore from '@/config/use-global';
|
import useGlobalStore from '@/config/use-global';
|
||||||
|
|
||||||
export default function CloudFlareTurnstile({
|
export type TurnstileRef = {
|
||||||
id,
|
reset: () => void;
|
||||||
value,
|
};
|
||||||
onChange,
|
|
||||||
}: {
|
const CloudFlareTurnstile = forwardRef<
|
||||||
id?: string;
|
TurnstileRef,
|
||||||
value?: null | string;
|
{
|
||||||
onChange: (value?: string) => void;
|
id?: string;
|
||||||
}) {
|
value?: null | string;
|
||||||
|
onChange: (value?: string) => void;
|
||||||
|
}
|
||||||
|
>(function CloudFlareTurnstile({ id, value, onChange }, ref) {
|
||||||
const { common } = useGlobalStore();
|
const { common } = useGlobalStore();
|
||||||
const { verify } = common;
|
const { verify } = common;
|
||||||
const { resolvedTheme } = useTheme();
|
const { resolvedTheme } = useTheme();
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
const turnstile = useTurnstile();
|
const turnstile = useTurnstile();
|
||||||
|
|
||||||
|
useImperativeHandle(
|
||||||
|
ref,
|
||||||
|
() => ({
|
||||||
|
reset: () => turnstile.reset(),
|
||||||
|
}),
|
||||||
|
[turnstile],
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (value === '') {
|
if (value === '') {
|
||||||
turnstile.reset();
|
turnstile.reset();
|
||||||
@@ -52,4 +63,6 @@ export default function CloudFlareTurnstile({
|
|||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
export default CloudFlareTurnstile;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ export async function generateMetadata(): Promise<Metadata> {
|
|||||||
template: `%s | ${site?.site_name || 'PPanel'}`,
|
template: `%s | ${site?.site_name || 'PPanel'}`,
|
||||||
},
|
},
|
||||||
description: site?.site_desc || '',
|
description: site?.site_desc || '',
|
||||||
|
keywords: site?.keywords || '',
|
||||||
icons: {
|
icons: {
|
||||||
icon: site?.site_logo
|
icon: site?.site_logo
|
||||||
? [
|
? [
|
||||||
@@ -114,6 +115,10 @@ export default async function RootLayout({
|
|||||||
{children}
|
{children}
|
||||||
</Providers>
|
</Providers>
|
||||||
</NextIntlClientProvider>
|
</NextIntlClientProvider>
|
||||||
|
<div
|
||||||
|
id='custom_html'
|
||||||
|
dangerouslySetInnerHTML={{ __html: config?.site.custom_html || '' }}
|
||||||
|
/>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export function Hero() {
|
|||||||
<HoverBorderGradient
|
<HoverBorderGradient
|
||||||
containerClassName='rounded-full'
|
containerClassName='rounded-full'
|
||||||
as='button'
|
as='button'
|
||||||
className='bg-background text-foreground flex items-center space-x-2'
|
className='m-0.5 flex items-center space-x-2 text-white'
|
||||||
>
|
>
|
||||||
{t('started')}
|
{t('started')}
|
||||||
</HoverBorderGradient>
|
</HoverBorderGradient>
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ export function ProductShowcase() {
|
|||||||
className='pb-4 text-2xl font-semibold sm:text-3xl'
|
className='pb-4 text-2xl font-semibold sm:text-3xl'
|
||||||
>
|
>
|
||||||
<Display type='currency' value={item.unit_price} />
|
<Display type='currency' value={item.unit_price} />
|
||||||
<span className='text-base font-medium'>/{t('per_month')}</span>
|
<span className='text-base font-medium'>/{t(item.unit_time)}</span>
|
||||||
</motion.h2>
|
</motion.h2>
|
||||||
<motion.div>
|
<motion.div>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ export default function Purchase({ subscribe, setSubscribe }: Readonly<PurchaseP
|
|||||||
if (orderNo) {
|
if (orderNo) {
|
||||||
const { data } = await checkoutOrder({
|
const { data } = await checkoutOrder({
|
||||||
orderNo,
|
orderNo,
|
||||||
|
returnUrl: window.location.href,
|
||||||
});
|
});
|
||||||
const type = data.data?.type;
|
const type = data.data?.type;
|
||||||
const checkout_url = data.data?.checkout_url;
|
const checkout_url = data.data?.checkout_url;
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ export default function Recharge(props: Readonly<ButtonProps>) {
|
|||||||
if (orderNo) {
|
if (orderNo) {
|
||||||
const { data } = await checkoutOrder({
|
const { data } = await checkoutOrder({
|
||||||
orderNo,
|
orderNo,
|
||||||
|
returnUrl: window.location.href,
|
||||||
});
|
});
|
||||||
const type = data.data?.type;
|
const type = data.data?.type;
|
||||||
const checkout_url = data.data?.checkout_url;
|
const checkout_url = data.data?.checkout_url;
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ export default function Renewal({ id, subscribe }: Readonly<RenewalProps>) {
|
|||||||
if (orderNo) {
|
if (orderNo) {
|
||||||
const { data } = await checkoutOrder({
|
const { data } = await checkoutOrder({
|
||||||
orderNo,
|
orderNo,
|
||||||
|
returnUrl: window.location.href,
|
||||||
});
|
});
|
||||||
const type = data.data?.type;
|
const type = data.data?.type;
|
||||||
const checkout_url = data.data?.checkout_url;
|
const checkout_url = data.data?.checkout_url;
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export default function ResetTraffic({ id, replacement }: Readonly<ResetTrafficP
|
|||||||
if (orderNo) {
|
if (orderNo) {
|
||||||
const { data } = await checkoutOrder({
|
const { data } = await checkoutOrder({
|
||||||
orderNo,
|
orderNo,
|
||||||
|
returnUrl: window.location.href,
|
||||||
});
|
});
|
||||||
const type = data.data?.type;
|
const type = data.data?.type;
|
||||||
const checkout_url = data.data?.checkout_url;
|
const checkout_url = data.data?.checkout_url;
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
|
|||||||
site_name: '',
|
site_name: '',
|
||||||
site_desc: '',
|
site_desc: '',
|
||||||
site_logo: '',
|
site_logo: '',
|
||||||
|
keywords: '',
|
||||||
|
custom_html: '',
|
||||||
},
|
},
|
||||||
verify: {
|
verify: {
|
||||||
turnstile_site_key: '',
|
turnstile_site_key: '',
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Den",
|
||||||
|
"Hour": "Hodina",
|
||||||
|
"Minute": "Minuta",
|
||||||
|
"Month": "Měsíc",
|
||||||
|
"NoLimit": "Žádný limit",
|
||||||
|
"Year": "Rok",
|
||||||
"global_map_description": "Prozkoumejte bezproblémové globální připojení. Vyberte si síťové služby, které vyhovují vašim potřebám, a zůstaňte připojeni kdykoli a kdekoli.",
|
"global_map_description": "Prozkoumejte bezproblémové globální připojení. Vyberte si síťové služby, které vyhovují vašim potřebám, a zůstaňte připojeni kdykoli a kdekoli.",
|
||||||
"global_map_itle": "Globální propojení, snadno a bez starostí",
|
"global_map_itle": "Globální propojení, snadno a bez starostí",
|
||||||
"locations": "Oblasti",
|
"locations": "Oblasti",
|
||||||
"per_month": "měsíčně",
|
|
||||||
"product_showcase_description": "Nechte nás vybrat ten nejvhodnější balíček pro vás a s radostí ho prozkoumejte.",
|
"product_showcase_description": "Nechte nás vybrat ten nejvhodnější balíček pro vás a s radostí ho prozkoumejte.",
|
||||||
"product_showcase_title": "Vyberte si svůj balíček",
|
"product_showcase_title": "Vyberte si svůj balíček",
|
||||||
"servers": "servery",
|
"servers": "servery",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Tag",
|
||||||
|
"Hour": "Stunde",
|
||||||
|
"Minute": "Minute",
|
||||||
|
"Month": "Monat",
|
||||||
|
"NoLimit": "Keine Begrenzung",
|
||||||
|
"Year": "Jahr",
|
||||||
"global_map_description": "Entdecken Sie nahtlose globale Verbindungen. Wählen Sie den Netzwerkdienst, der Ihren Bedürfnissen entspricht, und bleiben Sie jederzeit und überall verbunden.",
|
"global_map_description": "Entdecken Sie nahtlose globale Verbindungen. Wählen Sie den Netzwerkdienst, der Ihren Bedürfnissen entspricht, und bleiben Sie jederzeit und überall verbunden.",
|
||||||
"global_map_itle": "Weltweit verbunden, sorgenfrei",
|
"global_map_itle": "Weltweit verbunden, sorgenfrei",
|
||||||
"locations": "Standorte",
|
"locations": "Standorte",
|
||||||
"per_month": "Pro Monat",
|
|
||||||
"product_showcase_description": "Lassen Sie uns das für Sie am besten geeignete Paket auswählen und es mit Freude erkunden.",
|
"product_showcase_description": "Lassen Sie uns das für Sie am besten geeignete Paket auswählen und es mit Freude erkunden.",
|
||||||
"product_showcase_title": "Wählen Sie Ihr Paket",
|
"product_showcase_title": "Wählen Sie Ihr Paket",
|
||||||
"servers": "Server",
|
"servers": "Server",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Day",
|
||||||
|
"Hour": "Hour",
|
||||||
|
"Minute": "Minute",
|
||||||
|
"Month": "Month",
|
||||||
|
"NoLimit": "No Limit",
|
||||||
|
"Year": "Year",
|
||||||
"global_map_description": "Explore seamless global connectivity. Choose network services that suit your needs and stay connected anytime, anywhere.",
|
"global_map_description": "Explore seamless global connectivity. Choose network services that suit your needs and stay connected anytime, anywhere.",
|
||||||
"global_map_itle": "Global Connection, Easy and Worry-free",
|
"global_map_itle": "Global Connection, Easy and Worry-free",
|
||||||
"locations": "Locations",
|
"locations": "Locations",
|
||||||
"per_month": "Per Month",
|
|
||||||
"product_showcase_description": "Let us help you select the package that best suits you and enjoy exploring it.",
|
"product_showcase_description": "Let us help you select the package that best suits you and enjoy exploring it.",
|
||||||
"product_showcase_title": "Choose Your Package",
|
"product_showcase_title": "Choose Your Package",
|
||||||
"servers": "Servers",
|
"servers": "Servers",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Día",
|
||||||
|
"Hour": "Hora",
|
||||||
|
"Minute": "Minuto",
|
||||||
|
"Month": "Mes",
|
||||||
|
"NoLimit": "Sin Límite",
|
||||||
|
"Year": "Año",
|
||||||
"global_map_description": "Explora una conexión global sin interrupciones. Elige el servicio de red que se adapte a tus necesidades y mantente conectado en cualquier momento y lugar.",
|
"global_map_description": "Explora una conexión global sin interrupciones. Elige el servicio de red que se adapte a tus necesidades y mantente conectado en cualquier momento y lugar.",
|
||||||
"global_map_itle": "Conexión global, fácil y sin preocupaciones",
|
"global_map_itle": "Conexión global, fácil y sin preocupaciones",
|
||||||
"locations": "Ubicaciones",
|
"locations": "Ubicaciones",
|
||||||
"per_month": "Por mes",
|
|
||||||
"product_showcase_description": "Permítanos elegir el paquete que mejor se adapte a usted y disfrútelo explorando con alegría.",
|
"product_showcase_description": "Permítanos elegir el paquete que mejor se adapte a usted y disfrútelo explorando con alegría.",
|
||||||
"product_showcase_title": "Elija su paquete",
|
"product_showcase_title": "Elija su paquete",
|
||||||
"servers": "servidores",
|
"servers": "servidores",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Día",
|
||||||
|
"Hour": "Hora",
|
||||||
|
"Minute": "Minuto",
|
||||||
|
"Month": "Mes",
|
||||||
|
"NoLimit": "Sin Límite",
|
||||||
|
"Year": "Año",
|
||||||
"global_map_description": "Explora una conexión global sin interrupciones. Elige el servicio de red que se adapte a tus necesidades y mantente conectado en cualquier momento y lugar.",
|
"global_map_description": "Explora una conexión global sin interrupciones. Elige el servicio de red que se adapte a tus necesidades y mantente conectado en cualquier momento y lugar.",
|
||||||
"global_map_itle": "Conexión global, fácil y sin preocupaciones",
|
"global_map_itle": "Conexión global, fácil y sin preocupaciones",
|
||||||
"locations": "Ubicaciones",
|
"locations": "Ubicaciones",
|
||||||
"per_month": "Por mes",
|
|
||||||
"product_showcase_description": "Permítanos elegir el paquete que mejor se adapte a usted y explorelo con alegría.",
|
"product_showcase_description": "Permítanos elegir el paquete que mejor se adapte a usted y explorelo con alegría.",
|
||||||
"product_showcase_title": "Elija su paquete",
|
"product_showcase_title": "Elija su paquete",
|
||||||
"servers": "servidores",
|
"servers": "servidores",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "روز",
|
||||||
|
"Hour": "ساعت",
|
||||||
|
"Minute": "دقیقه",
|
||||||
|
"Month": "ماه",
|
||||||
|
"NoLimit": "بدون محدودیت",
|
||||||
|
"Year": "سال",
|
||||||
"global_map_description": "اتصال جهانی بدون درز را کاوش کنید. خدمات شبکهای را انتخاب کنید که با نیازهای شما سازگار باشد و در هر زمان و هر مکان متصل بمانید.",
|
"global_map_description": "اتصال جهانی بدون درز را کاوش کنید. خدمات شبکهای را انتخاب کنید که با نیازهای شما سازگار باشد و در هر زمان و هر مکان متصل بمانید.",
|
||||||
"global_map_itle": "ارتباط جهانی، آسان و بدون نگرانی",
|
"global_map_itle": "ارتباط جهانی، آسان و بدون نگرانی",
|
||||||
"locations": "مکانها",
|
"locations": "مکانها",
|
||||||
"per_month": "در ماه",
|
|
||||||
"product_showcase_description": "بگذارید به شما در انتخاب بستهای که بهترین تناسب را با شما دارد کمک کنیم و از کاوش در آن لذت ببرید.",
|
"product_showcase_description": "بگذارید به شما در انتخاب بستهای که بهترین تناسب را با شما دارد کمک کنیم و از کاوش در آن لذت ببرید.",
|
||||||
"product_showcase_title": "بسته خود را انتخاب کنید",
|
"product_showcase_title": "بسته خود را انتخاب کنید",
|
||||||
"servers": "سرورها",
|
"servers": "سرورها",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Päivä",
|
||||||
|
"Hour": "Tunti",
|
||||||
|
"Minute": "Minuutti",
|
||||||
|
"Month": "Kuukausi",
|
||||||
|
"NoLimit": "Ei rajoituksia",
|
||||||
|
"Year": "Vuosi",
|
||||||
"global_map_description": "Tutustu saumattomaan maailmanlaajuiseen yhteyteen. Valitse tarpeitasi vastaava verkkopalvelu ja pysy yhteydessä missä ja milloin tahansa.",
|
"global_map_description": "Tutustu saumattomaan maailmanlaajuiseen yhteyteen. Valitse tarpeitasi vastaava verkkopalvelu ja pysy yhteydessä missä ja milloin tahansa.",
|
||||||
"global_map_itle": "Maailmanlaajuinen yhteys, vaivaton ja huoleton",
|
"global_map_itle": "Maailmanlaajuinen yhteys, vaivaton ja huoleton",
|
||||||
"locations": "Alueet",
|
"locations": "Alueet",
|
||||||
"per_month": "kuukaudessa",
|
|
||||||
"product_showcase_description": "Anna meidän valita sinulle sopivin paketti ja tutustu siihen iloisesti.",
|
"product_showcase_description": "Anna meidän valita sinulle sopivin paketti ja tutustu siihen iloisesti.",
|
||||||
"product_showcase_title": "Valitse pakettisi",
|
"product_showcase_title": "Valitse pakettisi",
|
||||||
"servers": "palvelimet",
|
"servers": "palvelimet",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Jour",
|
||||||
|
"Hour": "Heure",
|
||||||
|
"Minute": "Minute",
|
||||||
|
"Month": "Mois",
|
||||||
|
"NoLimit": "Pas de limite",
|
||||||
|
"Year": "Année",
|
||||||
"global_map_description": "Explorez une connexion mondiale sans couture. Choisissez le service réseau qui répond à vos besoins et restez connecté à tout moment et en tout lieu.",
|
"global_map_description": "Explorez une connexion mondiale sans couture. Choisissez le service réseau qui répond à vos besoins et restez connecté à tout moment et en tout lieu.",
|
||||||
"global_map_itle": "Connexion mondiale, simplicité assurée",
|
"global_map_itle": "Connexion mondiale, simplicité assurée",
|
||||||
"locations": "Régions",
|
"locations": "Régions",
|
||||||
"per_month": "Par mois",
|
|
||||||
"product_showcase_description": "Laissez-nous choisir le forfait qui vous convient le mieux et explorez-le avec joie.",
|
"product_showcase_description": "Laissez-nous choisir le forfait qui vous convient le mieux et explorez-le avec joie.",
|
||||||
"product_showcase_title": "Choisissez votre forfait",
|
"product_showcase_title": "Choisissez votre forfait",
|
||||||
"servers": "serveurs",
|
"servers": "serveurs",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "दिन",
|
||||||
|
"Hour": "घंटा",
|
||||||
|
"Minute": "मिनट",
|
||||||
|
"Month": "महिना",
|
||||||
|
"NoLimit": "कोई सीमा नहीं",
|
||||||
|
"Year": "साल",
|
||||||
"global_map_description": "निर्बाध वैश्विक कनेक्शन का अन्वेषण करें। अपनी आवश्यकताओं के अनुसार नेटवर्क सेवा का चयन करें और कहीं भी, कभी भी जुड़े रहें।",
|
"global_map_description": "निर्बाध वैश्विक कनेक्शन का अन्वेषण करें। अपनी आवश्यकताओं के अनुसार नेटवर्क सेवा का चयन करें और कहीं भी, कभी भी जुड़े रहें।",
|
||||||
"global_map_itle": "वैश्विक कनेक्टिविटी, सरल और निश्चिंत",
|
"global_map_itle": "वैश्विक कनेक्टिविटी, सरल और निश्चिंत",
|
||||||
"locations": "क्षेत्र",
|
"locations": "क्षेत्र",
|
||||||
"per_month": "प्रति माह",
|
|
||||||
"product_showcase_description": "आइए हम आपके लिए सबसे उपयुक्त पैकेज का चयन करें और इसे खुशी से अन्वेषण करें।",
|
"product_showcase_description": "आइए हम आपके लिए सबसे उपयुक्त पैकेज का चयन करें और इसे खुशी से अन्वेषण करें।",
|
||||||
"product_showcase_title": "अपना पैकेज चुनें",
|
"product_showcase_title": "अपना पैकेज चुनें",
|
||||||
"servers": "सर्वर",
|
"servers": "सर्वर",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Nap",
|
||||||
|
"Hour": "Óra",
|
||||||
|
"Minute": "Perc",
|
||||||
|
"Month": "Hónap",
|
||||||
|
"NoLimit": "Nincs Korlát",
|
||||||
|
"Year": "Év",
|
||||||
"global_map_description": "Fedezze fel a zökkenőmentes globális kapcsolatot. Válassza ki az igényeinek megfelelő hálózati szolgáltatást, és maradjon kapcsolatban bárhol, bármikor.",
|
"global_map_description": "Fedezze fel a zökkenőmentes globális kapcsolatot. Válassza ki az igényeinek megfelelő hálózati szolgáltatást, és maradjon kapcsolatban bárhol, bármikor.",
|
||||||
"global_map_itle": "Globális összeköttetés, könnyedén és gondtalanul",
|
"global_map_itle": "Globális összeköttetés, könnyedén és gondtalanul",
|
||||||
"locations": "Helyszínek",
|
"locations": "Helyszínek",
|
||||||
"per_month": "Havonta",
|
|
||||||
"product_showcase_description": "Válasszuk ki az Ön számára legmegfelelőbb csomagot, és fedezze fel örömmel.",
|
"product_showcase_description": "Válasszuk ki az Ön számára legmegfelelőbb csomagot, és fedezze fel örömmel.",
|
||||||
"product_showcase_title": "Válassza ki a csomagját",
|
"product_showcase_title": "Válassza ki a csomagját",
|
||||||
"servers": "szerverek",
|
"servers": "szerverek",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "日",
|
||||||
|
"Hour": "時間",
|
||||||
|
"Minute": "分",
|
||||||
|
"Month": "月",
|
||||||
|
"NoLimit": "制限なし",
|
||||||
|
"Year": "年",
|
||||||
"global_map_description": "シームレスなグローバル接続を探索しましょう。あなたのニーズに合ったネットワークサービスを選び、いつでもどこでも接続を維持しましょう。",
|
"global_map_description": "シームレスなグローバル接続を探索しましょう。あなたのニーズに合ったネットワークサービスを選び、いつでもどこでも接続を維持しましょう。",
|
||||||
"global_map_itle": "世界をつなぎ、安心を提供",
|
"global_map_itle": "世界をつなぎ、安心を提供",
|
||||||
"locations": "地域",
|
"locations": "地域",
|
||||||
"per_month": "毎月",
|
|
||||||
"product_showcase_description": "あなたに最適なプランを選び、楽しく探求しましょう。",
|
"product_showcase_description": "あなたに最適なプランを選び、楽しく探求しましょう。",
|
||||||
"product_showcase_title": "プランを選択",
|
"product_showcase_title": "プランを選択",
|
||||||
"servers": "サーバー",
|
"servers": "サーバー",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "일",
|
||||||
|
"Hour": "시간",
|
||||||
|
"Minute": "분",
|
||||||
|
"Month": "월",
|
||||||
|
"NoLimit": "제한 없음",
|
||||||
|
"Year": "년",
|
||||||
"global_map_description": "원활한 글로벌 연결을 탐색하세요. 필요에 맞는 네트워크 서비스를 선택하여 언제 어디서나 연결을 유지하세요.",
|
"global_map_description": "원활한 글로벌 연결을 탐색하세요. 필요에 맞는 네트워크 서비스를 선택하여 언제 어디서나 연결을 유지하세요.",
|
||||||
"global_map_itle": "글로벌 연결, 편안하고 걱정 없는",
|
"global_map_itle": "글로벌 연결, 편안하고 걱정 없는",
|
||||||
"locations": "지역",
|
"locations": "지역",
|
||||||
"per_month": "매월",
|
|
||||||
"product_showcase_description": "가장 적합한 패키지를 선택하여 기쁘게 탐험해 보세요.",
|
"product_showcase_description": "가장 적합한 패키지를 선택하여 기쁘게 탐험해 보세요.",
|
||||||
"product_showcase_title": "패키지를 선택하세요",
|
"product_showcase_title": "패키지를 선택하세요",
|
||||||
"servers": "서버",
|
"servers": "서버",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Dag",
|
||||||
|
"Hour": "Time",
|
||||||
|
"Minute": "Minutt",
|
||||||
|
"Month": "Måned",
|
||||||
|
"NoLimit": "Ingen grense",
|
||||||
|
"Year": "År",
|
||||||
"global_map_description": "Utforsk sømløs global tilkobling. Velg nettverkstjenester som passer dine behov, og hold deg tilkoblet uansett hvor du er.",
|
"global_map_description": "Utforsk sømløs global tilkobling. Velg nettverkstjenester som passer dine behov, og hold deg tilkoblet uansett hvor du er.",
|
||||||
"global_map_itle": "Global tilkobling, enkelt og bekymringsløst",
|
"global_map_itle": "Global tilkobling, enkelt og bekymringsløst",
|
||||||
"locations": "områder",
|
"locations": "områder",
|
||||||
"per_month": "per måned",
|
|
||||||
"product_showcase_description": "La oss velge den pakken som passer best for deg, og utforsk den med glede.",
|
"product_showcase_description": "La oss velge den pakken som passer best for deg, og utforsk den med glede.",
|
||||||
"product_showcase_title": "Velg din pakke",
|
"product_showcase_title": "Velg din pakke",
|
||||||
"servers": "servere",
|
"servers": "servere",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Dzień",
|
||||||
|
"Hour": "Godzina",
|
||||||
|
"Minute": "Minuta",
|
||||||
|
"Month": "Miesiąc",
|
||||||
|
"NoLimit": "Bez ograniczeń",
|
||||||
|
"Year": "Rok",
|
||||||
"global_map_description": "Odkryj bezproblemowe globalne połączenia. Wybierz usługi sieciowe, które spełniają Twoje potrzeby i pozostań w kontakcie zawsze i wszędzie.",
|
"global_map_description": "Odkryj bezproblemowe globalne połączenia. Wybierz usługi sieciowe, które spełniają Twoje potrzeby i pozostań w kontakcie zawsze i wszędzie.",
|
||||||
"global_map_itle": "Globalne połączenie, bezproblemowe i łatwe",
|
"global_map_itle": "Globalne połączenie, bezproblemowe i łatwe",
|
||||||
"locations": "Regiony",
|
"locations": "Regiony",
|
||||||
"per_month": "Miesięcznie",
|
|
||||||
"product_showcase_description": "Pozwól nam wybrać dla Ciebie najlepszy pakiet i ciesz się jego odkrywaniem.",
|
"product_showcase_description": "Pozwól nam wybrać dla Ciebie najlepszy pakiet i ciesz się jego odkrywaniem.",
|
||||||
"product_showcase_title": "Wybierz swój pakiet",
|
"product_showcase_title": "Wybierz swój pakiet",
|
||||||
"servers": "serwery",
|
"servers": "serwery",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Dia",
|
||||||
|
"Hour": "Hora",
|
||||||
|
"Minute": "Minuto",
|
||||||
|
"Month": "Mês",
|
||||||
|
"NoLimit": "Sem Limite",
|
||||||
|
"Year": "Ano",
|
||||||
"global_map_description": "Explore uma conexão global sem interrupções. Escolha o serviço de rede que atenda às suas necessidades e mantenha-se conectado a qualquer hora e em qualquer lugar.",
|
"global_map_description": "Explore uma conexão global sem interrupções. Escolha o serviço de rede que atenda às suas necessidades e mantenha-se conectado a qualquer hora e em qualquer lugar.",
|
||||||
"global_map_itle": "Conexão Global, Fácil e Sem Preocupações",
|
"global_map_itle": "Conexão Global, Fácil e Sem Preocupações",
|
||||||
"locations": "localizações",
|
"locations": "localizações",
|
||||||
"per_month": "por mês",
|
|
||||||
"product_showcase_description": "Vamos escolher o pacote que mais se adequa a você e explorá-lo com alegria.",
|
"product_showcase_description": "Vamos escolher o pacote que mais se adequa a você e explorá-lo com alegria.",
|
||||||
"product_showcase_title": "Escolha seu plano",
|
"product_showcase_title": "Escolha seu plano",
|
||||||
"servers": "servidores",
|
"servers": "servidores",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "Zi",
|
||||||
|
"Hour": "Oră",
|
||||||
|
"Minute": "Minut",
|
||||||
|
"Month": "Lună",
|
||||||
|
"NoLimit": "Fără Limită",
|
||||||
|
"Year": "An",
|
||||||
"global_map_description": "Explorați o conexiune globală fără cusur. Alegeți serviciul de rețea care se potrivește nevoilor dumneavoastră și rămâneți conectat oriunde și oricând.",
|
"global_map_description": "Explorați o conexiune globală fără cusur. Alegeți serviciul de rețea care se potrivește nevoilor dumneavoastră și rămâneți conectat oriunde și oricând.",
|
||||||
"global_map_itle": "Conectare globală, fără griji",
|
"global_map_itle": "Conectare globală, fără griji",
|
||||||
"locations": "Regiuni",
|
"locations": "Regiuni",
|
||||||
"per_month": "pe lună",
|
|
||||||
"product_showcase_description": "Permiteți-ne să alegem pachetul care vi se potrivește cel mai bine și să-l explorați cu bucurie.",
|
"product_showcase_description": "Permiteți-ne să alegem pachetul care vi se potrivește cel mai bine și să-l explorați cu bucurie.",
|
||||||
"product_showcase_title": "Alegeți-vă pachetul",
|
"product_showcase_title": "Alegeți-vă pachetul",
|
||||||
"servers": "servere",
|
"servers": "servere",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "День",
|
||||||
|
"Hour": "Час",
|
||||||
|
"Minute": "Минута",
|
||||||
|
"Month": "Месяц",
|
||||||
|
"NoLimit": "Без ограничения",
|
||||||
|
"Year": "Год",
|
||||||
"global_map_description": "Исследуйте бесшовные глобальные соединения. Выбирайте сетевые услуги, соответствующие вашим потребностям, и оставайтесь на связи в любое время и в любом месте.",
|
"global_map_description": "Исследуйте бесшовные глобальные соединения. Выбирайте сетевые услуги, соответствующие вашим потребностям, и оставайтесь на связи в любое время и в любом месте.",
|
||||||
"global_map_itle": "Глобальная связь, легко и без забот",
|
"global_map_itle": "Глобальная связь, легко и без забот",
|
||||||
"locations": "регионы",
|
"locations": "регионы",
|
||||||
"per_month": "Ежемесячно",
|
|
||||||
"product_showcase_description": "Позвольте нам выбрать наиболее подходящий для вас пакет и с удовольствием его исследовать.",
|
"product_showcase_description": "Позвольте нам выбрать наиболее подходящий для вас пакет и с удовольствием его исследовать.",
|
||||||
"product_showcase_title": "Выберите ваш пакет",
|
"product_showcase_title": "Выберите ваш пакет",
|
||||||
"servers": "Серверы",
|
"servers": "Серверы",
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"Day": "วัน",
|
||||||
|
"Hour": "ชั่วโมง",
|
||||||
|
"Minute": "นาที",
|
||||||
|
"Month": "เดือน",
|
||||||
|
"NoLimit": "ไม่มีขีดจำกัด",
|
||||||
|
"Year": "ปี",
|
||||||
"global_map_description": "สำรวจการเชื่อมต่อทั่วโลกที่ไร้รอยต่อ เลือกบริการเครือข่ายที่ตรงกับความต้องการของคุณ เพื่อให้คุณเชื่อมต่อได้ทุกที่ทุกเวลา",
|
"global_map_description": "สำรวจการเชื่อมต่อทั่วโลกที่ไร้รอยต่อ เลือกบริการเครือข่ายที่ตรงกับความต้องการของคุณ เพื่อให้คุณเชื่อมต่อได้ทุกที่ทุกเวลา",
|
||||||
"global_map_itle": "เชื่อมต่อทั่วโลกได้อย่างง่ายดายและไร้กังวล",
|
"global_map_itle": "เชื่อมต่อทั่วโลกได้อย่างง่ายดายและไร้กังวล",
|
||||||
"locations": "ภูมิภาค",
|
"locations": "ภูมิภาค",
|
||||||
"per_month": "ต่อเดือน",
|
|
||||||
"product_showcase_description": "ให้เราช่วยคุณเลือกแพ็คเกจที่เหมาะสมที่สุด แล้วสนุกไปกับการสำรวจมันอย่างมีความสุข",
|
"product_showcase_description": "ให้เราช่วยคุณเลือกแพ็คเกจที่เหมาะสมที่สุด แล้วสนุกไปกับการสำรวจมันอย่างมีความสุข",
|
||||||
"product_showcase_title": "เลือกแพ็กเกจของคุณ",
|
"product_showcase_title": "เลือกแพ็กเกจของคุณ",
|
||||||
"servers": "เซิร์ฟเวอร์",
|
"servers": "เซิร์ฟเวอร์",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user