Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca642c2001 | |||
| 5b151cdbfc | |||
| 14b3af5f96 | |||
| baa68f03e3 | |||
| 87381da1e5 | |||
| bbd44f0107 | |||
| c65a44c2c7 | |||
| 715d0113ca | |||
| 0f15fb82cb | |||
| 320a7dc342 | |||
| 42ba9e88ad | |||
| 4a002333d4 | |||
| 6384237782 | |||
| 557c5cdc29 | |||
| f9d7736e48 |
+55
-10
@@ -1,40 +1,85 @@
|
|||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.21](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.20...v1.0.0-beta.21) (2025-02-23)
|
||||||
|
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
* **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
|
||||||
|
* **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
|
||||||
|
* **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.20](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.19...v1.0.0-beta.20) (2025-02-23)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
|
||||||
|
- **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
|
||||||
|
|
||||||
|
# [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)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **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))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||||
|
|
||||||
|
# [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)
|
# [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
|
### 🐛 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))
|
- **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)
|
# [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
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
- **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)
|
# [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
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
- **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)
|
# [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
|
### 🐛 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))
|
- **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)
|
# [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
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
- **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>
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
|||||||
@@ -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,19 @@ export default function LoginForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +82,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,
|
||||||
@@ -31,11 +31,10 @@ export default function RegisterForm({
|
|||||||
|
|
||||||
const handleCheckUser = async (email: string) => {
|
const handleCheckUser = async (email: string) => {
|
||||||
try {
|
try {
|
||||||
|
if (!auth.email.enable_verify) return true;
|
||||||
const domain = email.split('@')[1];
|
const domain = email.split('@')[1];
|
||||||
const isValid =
|
const isValid = auth.email?.domain_suffix_list.split('\n').includes(domain || '');
|
||||||
!auth.email.enable_verify ||
|
return isValid;
|
||||||
auth.email?.domain_suffix_list.split('\n').includes(domain || '');
|
|
||||||
return !isValid;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('Error checking user:', error);
|
console.log('Error checking user:', error);
|
||||||
return false;
|
return false;
|
||||||
@@ -53,7 +52,7 @@ export default function RegisterForm({
|
|||||||
password: z.string(),
|
password: z.string(),
|
||||||
repeat_password: z.string(),
|
repeat_password: z.string(),
|
||||||
code: auth.email.enable_verify ? z.string() : z.string().nullish(),
|
code: auth.email.enable_verify ? z.string() : z.string().nullish(),
|
||||||
invite: invite.forced_invite ? z.string() : z.string().nullish(),
|
invite: invite.forced_invite ? z.string().min(1) : z.string().nullish(),
|
||||||
cf_token:
|
cf_token:
|
||||||
verify.enable_register_verify && verify.turnstile_site_key
|
verify.enable_register_verify && verify.turnstile_site_key
|
||||||
? z.string()
|
? z.string()
|
||||||
@@ -77,13 +76,22 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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'
|
||||||
@@ -114,7 +122,12 @@ export default function RegisterForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input placeholder='Enter password again...' type='password' {...field} />
|
<Input
|
||||||
|
disabled={loading}
|
||||||
|
placeholder='Enter password again...'
|
||||||
|
type='password'
|
||||||
|
{...field}
|
||||||
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@@ -129,6 +142,7 @@ export default function RegisterForm({
|
|||||||
<FormControl>
|
<FormControl>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Input
|
<Input
|
||||||
|
disabled={loading}
|
||||||
placeholder='Enter code...'
|
placeholder='Enter code...'
|
||||||
type='text'
|
type='text'
|
||||||
{...field}
|
{...field}
|
||||||
@@ -172,7 +186,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,19 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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'
|
||||||
@@ -67,6 +76,7 @@ export default function ResetForm({
|
|||||||
<FormControl>
|
<FormControl>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Input
|
<Input
|
||||||
|
disabled={loading}
|
||||||
placeholder='Enter code...'
|
placeholder='Enter code...'
|
||||||
type='text'
|
type='text'
|
||||||
{...field}
|
{...field}
|
||||||
@@ -91,7 +101,7 @@ export default function ResetForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input placeholder='Enter your New password...' type='password' {...field} />
|
<Input placeholder='Enter your new password...' type='password' {...field} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@@ -104,7 +114,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>
|
||||||
|
|||||||
@@ -1,26 +1,38 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import useGlobalStore from '@/config/use-global';
|
|
||||||
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';
|
||||||
|
|
||||||
export default function CloudFlareTurnstile({
|
import useGlobalStore from '@/config/use-global';
|
||||||
id,
|
|
||||||
value,
|
export type TurnstileRef = {
|
||||||
onChange,
|
reset: () => void;
|
||||||
}: {
|
};
|
||||||
id?: string;
|
|
||||||
value?: null | string;
|
const CloudFlareTurnstile = forwardRef<
|
||||||
onChange: (value?: string) => void;
|
TurnstileRef,
|
||||||
}) {
|
{
|
||||||
|
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();
|
||||||
@@ -51,4 +63,6 @@ export default function CloudFlareTurnstile({
|
|||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
export default CloudFlareTurnstile;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export default function SubscribeConfig() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<Textarea
|
<Textarea
|
||||||
className='h-52'
|
className='h-52'
|
||||||
placeholder={t('subscriptionDomainPlaceholder')}
|
placeholder={`${t('subscriptionDomainPlaceholder')}\nexample.com\nwww.example.com`}
|
||||||
defaultValue={data?.subscribe_domain}
|
defaultValue={data?.subscribe_domain}
|
||||||
onBlur={(e) => {
|
onBlur={(e) => {
|
||||||
updateConfig('subscribe_domain', e.target.value);
|
updateConfig('subscribe_domain', e.target.value);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||||
import { getTranslations } from 'next-intl/server';
|
import { getTranslations } from 'next-intl/server';
|
||||||
import Currency from './currency';
|
import Currency from './currency';
|
||||||
|
import PrivacyPolicy from './privacy-policy';
|
||||||
import Site from './site';
|
import Site from './site';
|
||||||
import Tos from './tos';
|
import Tos from './tos';
|
||||||
|
|
||||||
@@ -13,6 +14,7 @@ export default async function Page() {
|
|||||||
<TabsTrigger value='site'>{t('tabs.site')}</TabsTrigger>
|
<TabsTrigger value='site'>{t('tabs.site')}</TabsTrigger>
|
||||||
<TabsTrigger value='currency'>{t('tabs.currency')}</TabsTrigger>
|
<TabsTrigger value='currency'>{t('tabs.currency')}</TabsTrigger>
|
||||||
<TabsTrigger value='tos'>{t('tabs.tos')}</TabsTrigger>
|
<TabsTrigger value='tos'>{t('tabs.tos')}</TabsTrigger>
|
||||||
|
<TabsTrigger value='privacy-policy'>{t('privacy-policy.title')}</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
<TabsContent value='site'>
|
<TabsContent value='site'>
|
||||||
<Site />
|
<Site />
|
||||||
@@ -23,6 +25,9 @@ export default async function Page() {
|
|||||||
<TabsContent value='tos'>
|
<TabsContent value='tos'>
|
||||||
<Tos />
|
<Tos />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
<TabsContent value='privacy-policy'>
|
||||||
|
<PrivacyPolicy />
|
||||||
|
</TabsContent>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { getPrivacyPolicyConfig, updatePrivacyPolicyConfig } from '@/services/admin/system';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import { MarkdownEditor } from '@workspace/ui/custom-components/editor';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { toast } from 'sonner';
|
||||||
|
|
||||||
|
export default function PrivacyPolicy() {
|
||||||
|
const t = useTranslations('system.privacy-policy');
|
||||||
|
const { data, refetch, isFetched } = useQuery({
|
||||||
|
queryKey: ['getPrivacyPolicyConfig'],
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await getPrivacyPolicyConfig();
|
||||||
|
return data.data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
async function updateConfig(key: string, value: unknown) {
|
||||||
|
if (data?.[key] === value) return;
|
||||||
|
try {
|
||||||
|
await updatePrivacyPolicyConfig({
|
||||||
|
...data,
|
||||||
|
[key]: value,
|
||||||
|
} as API.PrivacyPolicyConfig);
|
||||||
|
toast.success(t('saveSuccess'));
|
||||||
|
refetch();
|
||||||
|
} catch (error) {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
isFetched && (
|
||||||
|
<div className='h-[calc(100dvh-132px-env(safe-area-inset-top))] overflow-hidden'>
|
||||||
|
<MarkdownEditor
|
||||||
|
title={t('title')}
|
||||||
|
value={data?.privacy_policy}
|
||||||
|
onBlur={(value) => {
|
||||||
|
if (data?.privacy_policy !== value) {
|
||||||
|
updateConfig('privacy_policy', value);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -11,13 +11,38 @@ import {
|
|||||||
} from '@workspace/ui/components/select';
|
} from '@workspace/ui/components/select';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { getCountry } from '@workspace/ui/utils';
|
import { getCountry } from '@workspace/ui/utils';
|
||||||
import { useLocale, useTranslations } from 'next-intl';
|
import { useLocale } from 'next-intl';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
const languages = {
|
||||||
|
'cs-CZ': 'Čeština',
|
||||||
|
'de-DE': 'Deutsch',
|
||||||
|
'en-US': 'English',
|
||||||
|
'es-ES': 'Español',
|
||||||
|
'es-MX': 'Español (México)',
|
||||||
|
'fa-IR': 'فارسی',
|
||||||
|
'fi-FI': 'Suomi',
|
||||||
|
'fr-FR': 'Français',
|
||||||
|
'hi-IN': 'हिन्दी',
|
||||||
|
'hu-HU': 'Magyar',
|
||||||
|
'ja-JP': '日本語',
|
||||||
|
'ko-KR': '한국어',
|
||||||
|
'no-NO': 'Norsk',
|
||||||
|
'pl-PL': 'Polski',
|
||||||
|
'pt-BR': 'Português (Brasil)',
|
||||||
|
'ro-RO': 'Română',
|
||||||
|
'ru-RU': 'Русский',
|
||||||
|
'th-TH': 'ไทย',
|
||||||
|
'tr-TR': 'Türkçe',
|
||||||
|
'uk-UA': 'Українська',
|
||||||
|
'vi-VN': 'Tiếng Việt',
|
||||||
|
'zh-CN': '简体中文',
|
||||||
|
'zh-HK': '繁體中文',
|
||||||
|
} as const;
|
||||||
|
|
||||||
export default function LanguageSwitch() {
|
export default function LanguageSwitch() {
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
const country = getCountry(locale);
|
const country = getCountry(locale);
|
||||||
const t = useTranslations('language');
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const handleLanguageChange = (value: string) => {
|
const handleLanguageChange = (value: string) => {
|
||||||
@@ -31,7 +56,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectValue>
|
<SelectValue>
|
||||||
<div className='flex items-center'>
|
<div className='flex items-center'>
|
||||||
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
<span className='sr-only'>{t(`${locale}`)}</span>
|
<span className='sr-only'>{languages[locale as keyof typeof languages]}</span>
|
||||||
</div>
|
</div>
|
||||||
</SelectValue>
|
</SelectValue>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
@@ -40,7 +65,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
{t(`${item?.lang}-${item?.alpha2}`)}
|
{languages[`${item?.lang}-${item?.alpha2}` as keyof typeof languages]}
|
||||||
</div>
|
</div>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -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: '',
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "čeština",
|
|
||||||
"de-DE": "němčina",
|
|
||||||
"en-US": "angličtina",
|
|
||||||
"es-ES": "španělština",
|
|
||||||
"es-MX": "španělština (Mexiko)",
|
|
||||||
"fa-IR": "Perština",
|
|
||||||
"fi-FI": "finština",
|
|
||||||
"fr-FR": "Francouzština",
|
|
||||||
"hi-IN": "hindština",
|
|
||||||
"hu-HU": "maďarština",
|
|
||||||
"ja-JP": "Japonština",
|
|
||||||
"ko-KR": "Korejština",
|
|
||||||
"no-NO": "norština",
|
|
||||||
"pl-PL": "polština",
|
|
||||||
"pt-BR": "portugalština (Brazílie)",
|
|
||||||
"ro-RO": "rumunština",
|
|
||||||
"ru-RU": "ruština",
|
|
||||||
"th-TH": "thajština",
|
|
||||||
"tr-TR": "turečtina",
|
|
||||||
"uk-UA": "Ukrajinština",
|
|
||||||
"vi-VN": "Vietnamština",
|
|
||||||
"zh-CN": "čeština (CS)",
|
|
||||||
"zh-HK": "čínština (tradiční)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Pouze pro zobrazení, po změně se změní všechny měnové jednotky v systému",
|
"currencyUnitDescription": "Pouze pro zobrazení, po změně se změní všechny měnové jednotky v systému",
|
||||||
"saveSuccess": "Úspěšně uloženo"
|
"saveSuccess": "Úspěšně uloženo"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Uložení bylo úspěšné",
|
||||||
|
"title": "Zásady ochrany osobních údajů"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tschechisch",
|
|
||||||
"de-DE": "Deutsch",
|
|
||||||
"en-US": "Englisch",
|
|
||||||
"es-ES": "Spanisch",
|
|
||||||
"es-MX": "Spanisch (Mexiko)",
|
|
||||||
"fa-IR": "Persisch",
|
|
||||||
"fi-FI": "Finnisch",
|
|
||||||
"fr-FR": "Französisch",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Ungarisch",
|
|
||||||
"ja-JP": "Japanisch",
|
|
||||||
"ko-KR": "Koreanisch",
|
|
||||||
"no-NO": "Norwegisch",
|
|
||||||
"pl-PL": "Polnisch",
|
|
||||||
"pt-BR": "Portugiesisch (Brasilien)",
|
|
||||||
"ro-RO": "Rumänisch",
|
|
||||||
"ru-RU": "Russisch",
|
|
||||||
"th-TH": "Thailändisch",
|
|
||||||
"tr-TR": "Türkisch",
|
|
||||||
"uk-UA": "Ukrainisch",
|
|
||||||
"vi-VN": "Vietnamesisch",
|
|
||||||
"zh-CN": "Chinesisch (vereinfacht)",
|
|
||||||
"zh-HK": "Chinesisch (Traditionell)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Nur zur Anzeige verwendet, nach der Änderung werden alle Währungseinheiten im System geändert",
|
"currencyUnitDescription": "Nur zur Anzeige verwendet, nach der Änderung werden alle Währungseinheiten im System geändert",
|
||||||
"saveSuccess": "Erfolgreich gespeichert"
|
"saveSuccess": "Erfolgreich gespeichert"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Erfolgreich gespeichert",
|
||||||
|
"title": "Datenschutzrichtlinie"
|
||||||
|
},
|
||||||
"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",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Czech",
|
|
||||||
"de-DE": "German",
|
|
||||||
"en-US": "English",
|
|
||||||
"es-ES": "Spanish",
|
|
||||||
"es-MX": "Spanish (Mexico)",
|
|
||||||
"fa-IR": "Persian",
|
|
||||||
"fi-FI": "Finnish",
|
|
||||||
"fr-FR": "French",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Hungarian",
|
|
||||||
"ja-JP": "Japanese",
|
|
||||||
"ko-KR": "Korean",
|
|
||||||
"no-NO": "Norwegian",
|
|
||||||
"pl-PL": "Polish",
|
|
||||||
"pt-BR": "Portuguese (Brazil)",
|
|
||||||
"ro-RO": "Romanian",
|
|
||||||
"ru-RU": "Russian",
|
|
||||||
"th-TH": "Thai",
|
|
||||||
"tr-TR": "Turkish",
|
|
||||||
"uk-UA": "Ukrainian",
|
|
||||||
"vi-VN": "Vietnamese",
|
|
||||||
"zh-CN": "Chinese (Simplified)",
|
|
||||||
"zh-HK": "Chinese (Traditional)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Used for display purposes only; changing this will affect all currency units in the system",
|
"currencyUnitDescription": "Used for display purposes only; changing this will affect all currency units in the system",
|
||||||
"saveSuccess": "Save Successful"
|
"saveSuccess": "Save Successful"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Save Successful",
|
||||||
|
"title": "Privacy Policy"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "Español (España)",
|
|
||||||
"zh-HK": "chino (tradicional)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Solo para uso de visualización, al cambiarlo se modificarán todas las unidades monetarias en el sistema",
|
"currencyUnitDescription": "Solo para uso de visualización, al cambiarlo se modificarán todas las unidades monetarias en el sistema",
|
||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Guardado con éxito",
|
||||||
|
"title": "Política de Privacidad"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "español (México)",
|
|
||||||
"zh-HK": "Chino (Tradicional)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Solo para fines de visualización, cambiarlo alterará todas las unidades monetarias en el sistema",
|
"currencyUnitDescription": "Solo para fines de visualización, cambiarlo alterará todas las unidades monetarias en el sistema",
|
||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Guardado exitoso",
|
||||||
|
"title": "Política de Privacidad"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "چکی",
|
|
||||||
"de-DE": "آلمانی",
|
|
||||||
"en-US": "انگلیسی",
|
|
||||||
"es-ES": "اسپانیایی",
|
|
||||||
"es-MX": "اسپانیایی (مکزیک)",
|
|
||||||
"fa-IR": "فارسی",
|
|
||||||
"fi-FI": "فنلاندی",
|
|
||||||
"fr-FR": "فرانسوی",
|
|
||||||
"hi-IN": "هندی",
|
|
||||||
"hu-HU": "مجاری",
|
|
||||||
"ja-JP": "ژاپنی",
|
|
||||||
"ko-KR": "کرهای",
|
|
||||||
"no-NO": "نروژی",
|
|
||||||
"pl-PL": "لهستانی",
|
|
||||||
"pt-BR": "پرتغالی (برزیل)",
|
|
||||||
"ro-RO": "رومانیایی",
|
|
||||||
"ru-RU": "روسی",
|
|
||||||
"th-TH": "تایلندی",
|
|
||||||
"tr-TR": "ترکی",
|
|
||||||
"uk-UA": "اوکراینی",
|
|
||||||
"vi-VN": "ویتنامی",
|
|
||||||
"zh-CN": "چینی (ساده شده)",
|
|
||||||
"zh-HK": "چینی (سنتی)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "فقط برای نمایش استفاده میشود؛ تغییر این مورد بر تمام واحدهای ارزی در سیستم تأثیر خواهد گذاشت",
|
"currencyUnitDescription": "فقط برای نمایش استفاده میشود؛ تغییر این مورد بر تمام واحدهای ارزی در سیستم تأثیر خواهد گذاشت",
|
||||||
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "ذخیره با موفقیت انجام شد",
|
||||||
|
"title": "سیاست حفظ حریم خصوصی"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML سفارشی",
|
||||||
|
"customHtmlDescription": "کد HTML سفارشی که باید در انتهای تگ body سایت وارد شود.",
|
||||||
|
"keywords": "کلمات کلیدی",
|
||||||
|
"keywordsDescription": "برای اهداف سئو استفاده میشود",
|
||||||
"logo": "لوگو",
|
"logo": "لوگو",
|
||||||
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
||||||
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "tšekki",
|
|
||||||
"de-DE": "Saksa",
|
|
||||||
"en-US": "englanti",
|
|
||||||
"es-ES": "espanja",
|
|
||||||
"es-MX": "espanja (Meksiko)",
|
|
||||||
"fa-IR": "Persia",
|
|
||||||
"fi-FI": "suomi",
|
|
||||||
"fr-FR": "ranska",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "unkarinkieli",
|
|
||||||
"ja-JP": "japani",
|
|
||||||
"ko-KR": "Korea",
|
|
||||||
"no-NO": "norja",
|
|
||||||
"pl-PL": "puola",
|
|
||||||
"pt-BR": "portugali (Brasilia)",
|
|
||||||
"ro-RO": "romania",
|
|
||||||
"ru-RU": "Venäjä",
|
|
||||||
"th-TH": "thaikieli",
|
|
||||||
"tr-TR": "turkki",
|
|
||||||
"uk-UA": "ukrainaksi",
|
|
||||||
"vi-VN": "vietnamiksi",
|
|
||||||
"zh-CN": "kiina (yksinkertaistettu)",
|
|
||||||
"zh-HK": "kiina (perinteinen)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Käytetään vain näyttötarkoituksiin, muutoksen jälkeen kaikki järjestelmän valuuttayksiköt muuttuvat",
|
"currencyUnitDescription": "Käytetään vain näyttötarkoituksiin, muutoksen jälkeen kaikki järjestelmän valuuttayksiköt muuttuvat",
|
||||||
"saveSuccess": "Tallennus onnistui"
|
"saveSuccess": "Tallennus onnistui"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Tallennus onnistui",
|
||||||
|
"title": "Tietosuojakäytäntö"
|
||||||
|
},
|
||||||
"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ä",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tchèque",
|
|
||||||
"de-DE": "Allemand",
|
|
||||||
"en-US": "anglais",
|
|
||||||
"es-ES": "Espagnol",
|
|
||||||
"es-MX": "Espagnol (Mexique)",
|
|
||||||
"fa-IR": "Persan",
|
|
||||||
"fi-FI": "finnois",
|
|
||||||
"fr-FR": "français",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "Hongrois",
|
|
||||||
"ja-JP": "Japonais",
|
|
||||||
"ko-KR": "coréen",
|
|
||||||
"no-NO": "Norvégien",
|
|
||||||
"pl-PL": "Polonais",
|
|
||||||
"pt-BR": "portugais (Brésil)",
|
|
||||||
"ro-RO": "Roumain",
|
|
||||||
"ru-RU": "Russe",
|
|
||||||
"th-TH": "thaïlandais",
|
|
||||||
"tr-TR": "turc",
|
|
||||||
"uk-UA": "Ukrainien",
|
|
||||||
"vi-VN": "Vietnamien",
|
|
||||||
"zh-CN": "français (France)",
|
|
||||||
"zh-HK": "chinois (traditionnel)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Utilisé uniquement pour l'affichage, toute modification entraînera un changement de toutes les unités monétaires dans le système",
|
"currencyUnitDescription": "Utilisé uniquement pour l'affichage, toute modification entraînera un changement de toutes les unités monétaires dans le système",
|
||||||
"saveSuccess": "Enregistrement réussi"
|
"saveSuccess": "Enregistrement réussi"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Enregistrement réussi",
|
||||||
|
"title": "Politique de confidentialité"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "चेक",
|
|
||||||
"de-DE": "जर्मन",
|
|
||||||
"en-US": "अंग्रेज़ी",
|
|
||||||
"es-ES": "स्पेनिश",
|
|
||||||
"es-MX": "स्पेनिश (मेक्सिको)",
|
|
||||||
"fa-IR": "फ़ारसी",
|
|
||||||
"fi-FI": "फिनिश",
|
|
||||||
"fr-FR": "फ्रेंच",
|
|
||||||
"hi-IN": "हिंदी",
|
|
||||||
"hu-HU": "हंगेरियन",
|
|
||||||
"ja-JP": "जापानी",
|
|
||||||
"ko-KR": "कोरियाई",
|
|
||||||
"no-NO": "नॉर्वेजियन",
|
|
||||||
"pl-PL": "पोलिश",
|
|
||||||
"pt-BR": "पुर्तगाली (ब्राज़ील)",
|
|
||||||
"ro-RO": "रोमानियाई",
|
|
||||||
"ru-RU": "रूसी",
|
|
||||||
"th-TH": "थाई",
|
|
||||||
"tr-TR": "तुर्की",
|
|
||||||
"uk-UA": "यूक्रेनी",
|
|
||||||
"vi-VN": "वियतनामी",
|
|
||||||
"zh-CN": "चीनी (सरल)",
|
|
||||||
"zh-HK": "चीनी (पारंपरिक)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "केवल प्रदर्शन के लिए उपयोग किया जाता है, परिवर्तन के बाद सिस्टम में सभी मुद्रा इकाइयाँ बदल जाएँगी",
|
"currencyUnitDescription": "केवल प्रदर्शन के लिए उपयोग किया जाता है, परिवर्तन के बाद सिस्टम में सभी मुद्रा इकाइयाँ बदल जाएँगी",
|
||||||
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "सफलता से सहेजा गया",
|
||||||
|
"title": "गोपनीयता नीति"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "कस्टम HTML",
|
||||||
|
"customHtmlDescription": "साइट के bodyैग के नीचे इंजेक्ट करने के लिए कस्टम HTML कोड।",
|
||||||
|
"keywords": "कीवर्ड",
|
||||||
|
"keywordsDescription": "SEO उद्देश्यों के लिए उपयोग किया जाता है",
|
||||||
"logo": "लोगो",
|
"logo": "लोगो",
|
||||||
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
||||||
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "cseh",
|
|
||||||
"de-DE": "német",
|
|
||||||
"en-US": "angol",
|
|
||||||
"es-ES": "spanyol",
|
|
||||||
"es-MX": "spanyol (Mexikó)",
|
|
||||||
"fa-IR": "Perzsa",
|
|
||||||
"fi-FI": "finn",
|
|
||||||
"fr-FR": "francia",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "magyar",
|
|
||||||
"ja-JP": "japán",
|
|
||||||
"ko-KR": "Koreai",
|
|
||||||
"no-NO": "norvég",
|
|
||||||
"pl-PL": "lengyel",
|
|
||||||
"pt-BR": "portugál (Brazília)",
|
|
||||||
"ro-RO": "román nyelv",
|
|
||||||
"ru-RU": "Orosz",
|
|
||||||
"th-TH": "thai nyelv",
|
|
||||||
"tr-TR": "török",
|
|
||||||
"uk-UA": "ukrán",
|
|
||||||
"vi-VN": "vietnámi",
|
|
||||||
"zh-CN": "kínai (egyszerűsített)",
|
|
||||||
"zh-HK": "Kínai (hagyományos)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Csak megjelenítésre használatos, a módosítás után a rendszer összes pénznem egysége megváltozik",
|
"currencyUnitDescription": "Csak megjelenítésre használatos, a módosítás után a rendszer összes pénznem egysége megváltozik",
|
||||||
"saveSuccess": "Sikeres mentés"
|
"saveSuccess": "Sikeres mentés"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Mentés sikeres",
|
||||||
|
"title": "Adatvédelmi irányelvek"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Egyedi HTML",
|
||||||
|
"customHtmlDescription": "Egyedi HTML kód, amelyet a webhely bodyí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",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "チェコ語",
|
|
||||||
"de-DE": "ドイツ語",
|
|
||||||
"en-US": "英語",
|
|
||||||
"es-ES": "スペイン語",
|
|
||||||
"es-MX": "スペイン語(メキシコ)",
|
|
||||||
"fa-IR": "ペルシャ語",
|
|
||||||
"fi-FI": "フィンランド語",
|
|
||||||
"fr-FR": "フランス語",
|
|
||||||
"hi-IN": "ヒンディー語",
|
|
||||||
"hu-HU": "ハンガリー語",
|
|
||||||
"ja-JP": "日本語",
|
|
||||||
"ko-KR": "韓国語",
|
|
||||||
"no-NO": "ノルウェー語",
|
|
||||||
"pl-PL": "ポーランド語",
|
|
||||||
"pt-BR": "ポルトガル語(ブラジル)",
|
|
||||||
"ro-RO": "ルーマニア語",
|
|
||||||
"ru-RU": "ロシア語",
|
|
||||||
"th-TH": "タイ語",
|
|
||||||
"tr-TR": "トルコ語",
|
|
||||||
"uk-UA": "ウクライナ語",
|
|
||||||
"vi-VN": "ベトナム語",
|
|
||||||
"zh-CN": "日本語",
|
|
||||||
"zh-HK": "中国語(繁体字)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "表示のみに使用され、変更するとシステム内のすべての通貨単位が変更されます",
|
"currencyUnitDescription": "表示のみに使用され、変更するとシステム内のすべての通貨単位が変更されます",
|
||||||
"saveSuccess": "保存に成功しました"
|
"saveSuccess": "保存に成功しました"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "保存に成功しました",
|
||||||
|
"title": "プライバシーポリシー"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "カスタムHTML",
|
||||||
|
"customHtmlDescription": "サイトの body タグの下部に挿入されるカスタム HTML コード。",
|
||||||
|
"keywords": "キーワード",
|
||||||
|
"keywordsDescription": "SEO目的で使用されます",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
||||||
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "체코어",
|
|
||||||
"de-DE": "독일어",
|
|
||||||
"en-US": "영어",
|
|
||||||
"es-ES": "스페인어",
|
|
||||||
"es-MX": "스페인어(멕시코)",
|
|
||||||
"fa-IR": "페르시아어",
|
|
||||||
"fi-FI": "핀란드어",
|
|
||||||
"fr-FR": "프랑스어",
|
|
||||||
"hi-IN": "힌디어",
|
|
||||||
"hu-HU": "헝가리어",
|
|
||||||
"ja-JP": "일본어",
|
|
||||||
"ko-KR": "한국어",
|
|
||||||
"no-NO": "노르웨이어",
|
|
||||||
"pl-PL": "폴란드어",
|
|
||||||
"pt-BR": "포르투갈어(브라질)",
|
|
||||||
"ro-RO": "루마니아어",
|
|
||||||
"ru-RU": "러시아어",
|
|
||||||
"th-TH": "태국어",
|
|
||||||
"tr-TR": "터키어",
|
|
||||||
"uk-UA": "우크라이나어",
|
|
||||||
"vi-VN": "베트남어",
|
|
||||||
"zh-CN": "중국어(간체)",
|
|
||||||
"zh-HK": "중국어(번체)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "표시용으로만 사용되며, 변경 시 시스템 내 모든 통화 단위가 변경됩니다",
|
"currencyUnitDescription": "표시용으로만 사용되며, 변경 시 시스템 내 모든 통화 단위가 변경됩니다",
|
||||||
"saveSuccess": "저장 성공"
|
"saveSuccess": "저장 성공"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "저장 성공",
|
||||||
|
"title": "개인정보 처리방침"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "사용자 정의 HTML",
|
||||||
|
"customHtmlDescription": "사이트의 body그 하단에 삽입될 사용자 정의 HTML 코드입니다.",
|
||||||
|
"keywords": "키워드",
|
||||||
|
"keywordsDescription": "SEO 목적으로 사용됨",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
||||||
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tsjekkisk",
|
|
||||||
"de-DE": "Tysk",
|
|
||||||
"en-US": "engelsk",
|
|
||||||
"es-ES": "Spansk",
|
|
||||||
"es-MX": "Spansk (Mexico)",
|
|
||||||
"fa-IR": "Persisk",
|
|
||||||
"fi-FI": "Finsk",
|
|
||||||
"fr-FR": "Fransk",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Ungarsk",
|
|
||||||
"ja-JP": "Japansk",
|
|
||||||
"ko-KR": "Koreansk",
|
|
||||||
"no-NO": "Norsk",
|
|
||||||
"pl-PL": "Polsk",
|
|
||||||
"pt-BR": "Portugisisk (Brasil)",
|
|
||||||
"ro-RO": "Rumensk",
|
|
||||||
"ru-RU": "Russisk",
|
|
||||||
"th-TH": "Thai",
|
|
||||||
"tr-TR": "Tyrkisk",
|
|
||||||
"uk-UA": "Ukrainsk",
|
|
||||||
"vi-VN": "Vietnamesisk",
|
|
||||||
"zh-CN": "Kinesisk (forenklet)",
|
|
||||||
"zh-HK": "Kinesisk (tradisjonell)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Kun for visningsformål, endring vil påvirke alle valutaenheter i systemet",
|
"currencyUnitDescription": "Kun for visningsformål, endring vil påvirke alle valutaenheter i systemet",
|
||||||
"saveSuccess": "Lagring vellykket"
|
"saveSuccess": "Lagring vellykket"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Lagring vellykket",
|
||||||
|
"title": "Personvernerklæring"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "język czeski",
|
|
||||||
"de-DE": "niemiecki",
|
|
||||||
"en-US": "angielski",
|
|
||||||
"es-ES": "hiszpański",
|
|
||||||
"es-MX": "hiszpański (Meksyk)",
|
|
||||||
"fa-IR": "perski",
|
|
||||||
"fi-FI": "fiński",
|
|
||||||
"fr-FR": "francuski",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "język węgierski",
|
|
||||||
"ja-JP": "język japoński",
|
|
||||||
"ko-KR": "Koreański",
|
|
||||||
"no-NO": "norweski",
|
|
||||||
"pl-PL": "Polski",
|
|
||||||
"pt-BR": "portugalski (Brazylia)",
|
|
||||||
"ro-RO": "rumuński",
|
|
||||||
"ru-RU": "Rosyjski",
|
|
||||||
"th-TH": "tajski",
|
|
||||||
"tr-TR": "turecki",
|
|
||||||
"uk-UA": "ukraiński",
|
|
||||||
"vi-VN": "język wietnamski",
|
|
||||||
"zh-CN": "chiński (uproszczony)",
|
|
||||||
"zh-HK": "chiński (tradycyjny)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Używane wyłącznie do celów wyświetlania, po zmianie wszystkie jednostki walutowe w systemie zostaną zmienione",
|
"currencyUnitDescription": "Używane wyłącznie do celów wyświetlania, po zmianie wszystkie jednostki walutowe w systemie zostaną zmienione",
|
||||||
"saveSuccess": "Zapisano pomyślnie"
|
"saveSuccess": "Zapisano pomyślnie"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Zapisano pomyślnie",
|
||||||
|
"title": "Polityka prywatności"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Niestandardowy HTML",
|
||||||
|
"customHtmlDescription": "Niestandardowy kod HTML, który ma być wstrzyknięty na końcu tagu bodyitryny.",
|
||||||
|
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tcheco",
|
|
||||||
"de-DE": "Alemão",
|
|
||||||
"en-US": "inglês",
|
|
||||||
"es-ES": "Espanhol",
|
|
||||||
"es-MX": "Espanhol (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandês",
|
|
||||||
"fr-FR": "Francês",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "Húngaro",
|
|
||||||
"ja-JP": "Japonês",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Norueguês",
|
|
||||||
"pl-PL": "Polonês",
|
|
||||||
"pt-BR": "Português (Brasil)",
|
|
||||||
"ro-RO": "Romeno",
|
|
||||||
"ru-RU": "Russo",
|
|
||||||
"th-TH": "Tailandês",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "Chinês (Simplificado)",
|
|
||||||
"zh-HK": "Chinês (Tradicional)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Usado apenas para exibição, após a alteração todas as unidades monetárias no sistema serão alteradas",
|
"currencyUnitDescription": "Usado apenas para exibição, após a alteração todas as unidades monetárias no sistema serão alteradas",
|
||||||
"saveSuccess": "Salvo com sucesso"
|
"saveSuccess": "Salvo com sucesso"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Salvo com Sucesso",
|
||||||
|
"title": "Política de Privacidade"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML Personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado a ser inserido no final da tag bodyo 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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "cehă",
|
|
||||||
"de-DE": "Germană",
|
|
||||||
"en-US": "engleză",
|
|
||||||
"es-ES": "Spaniolă",
|
|
||||||
"es-MX": "Spaniolă (Mexic)",
|
|
||||||
"fa-IR": "Persană",
|
|
||||||
"fi-FI": "Finlandeză",
|
|
||||||
"fr-FR": "franceză",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "Maghiară",
|
|
||||||
"ja-JP": "Japoneză",
|
|
||||||
"ko-KR": "Coreeană",
|
|
||||||
"no-NO": "norvegiană",
|
|
||||||
"pl-PL": "Poloneză",
|
|
||||||
"pt-BR": "Portugheză (Brazilia)",
|
|
||||||
"ro-RO": "Română",
|
|
||||||
"ru-RU": "Rusă",
|
|
||||||
"th-TH": "Thailandeză",
|
|
||||||
"tr-TR": "turcă",
|
|
||||||
"uk-UA": "Ucraineană",
|
|
||||||
"vi-VN": "Vietnameză",
|
|
||||||
"zh-CN": "Chineză (Simplificată)",
|
|
||||||
"zh-HK": "Chineză (tradițională)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Utilizat doar pentru afișare, după modificare toate unitățile monetare din sistem vor fi schimbate",
|
"currencyUnitDescription": "Utilizat doar pentru afișare, după modificare toate unitățile monetare din sistem vor fi schimbate",
|
||||||
"saveSuccess": "Salvare reușită"
|
"saveSuccess": "Salvare reușită"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Salvare reușită",
|
||||||
|
"title": "Politica de confidențialitate"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Чешский",
|
|
||||||
"de-DE": "Немецкий",
|
|
||||||
"en-US": "английский",
|
|
||||||
"es-ES": "испанский",
|
|
||||||
"es-MX": "испанский (Мексика)",
|
|
||||||
"fa-IR": "Персидский",
|
|
||||||
"fi-FI": "финский",
|
|
||||||
"fr-FR": "Французский",
|
|
||||||
"hi-IN": "хинди",
|
|
||||||
"hu-HU": "Венгерский",
|
|
||||||
"ja-JP": "японский",
|
|
||||||
"ko-KR": "Корейский",
|
|
||||||
"no-NO": "Норвежский",
|
|
||||||
"pl-PL": "польский",
|
|
||||||
"pt-BR": "португальский (Бразилия)",
|
|
||||||
"ro-RO": "румынский",
|
|
||||||
"ru-RU": "Русский",
|
|
||||||
"th-TH": "тайский",
|
|
||||||
"tr-TR": "Турецкий",
|
|
||||||
"uk-UA": "Украинский",
|
|
||||||
"vi-VN": "вьетнамский",
|
|
||||||
"zh-CN": "Китайский (упрощенный)",
|
|
||||||
"zh-HK": "китайский (традиционный)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Используется только для отображения, после изменения все валютные единицы в системе будут изменены",
|
"currencyUnitDescription": "Используется только для отображения, после изменения все валютные единицы в системе будут изменены",
|
||||||
"saveSuccess": "Успешно сохранено"
|
"saveSuccess": "Успешно сохранено"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Сохранение успешно",
|
||||||
|
"title": "Политика конфиденциальности"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Пользовательский HTML",
|
||||||
|
"customHtmlDescription": "Пользовательский HTML-код, который будет вставлен в конец тега body сайта.",
|
||||||
|
"keywords": "Ключевые слова",
|
||||||
|
"keywordsDescription": "Используется для SEO",
|
||||||
"logo": "ЛОГОТИП",
|
"logo": "ЛОГОТИП",
|
||||||
"logoDescription": "Используется для отображения места, где необходимо показать ЛОГОТИП",
|
"logoDescription": "Используется для отображения места, где необходимо показать ЛОГОТИП",
|
||||||
"logoPlaceholder": "Введите URL-адрес ЛОГОТИПА, не заканчивайте на '/'",
|
"logoPlaceholder": "Введите URL-адрес ЛОГОТИПА, не заканчивайте на '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "ภาษาเช็ก",
|
|
||||||
"de-DE": "ภาษาเยอรมัน",
|
|
||||||
"en-US": "ภาษาอังกฤษ",
|
|
||||||
"es-ES": "ภาษาสเปน",
|
|
||||||
"es-MX": "สเปน (เม็กซิโก)",
|
|
||||||
"fa-IR": "เปอร์เซีย",
|
|
||||||
"fi-FI": "ภาษาฟินแลนด์",
|
|
||||||
"fr-FR": "ภาษาฝรั่งเศส",
|
|
||||||
"hi-IN": "ภาษาฮินดี",
|
|
||||||
"hu-HU": "ภาษาฮังการี",
|
|
||||||
"ja-JP": "ภาษาญี่ปุ่น",
|
|
||||||
"ko-KR": "เกาหลี",
|
|
||||||
"no-NO": "ภาษานอร์เวย์",
|
|
||||||
"pl-PL": "ภาษาโปแลนด์",
|
|
||||||
"pt-BR": "โปรตุเกส (บราซิล)",
|
|
||||||
"ro-RO": "โรมาเนีย",
|
|
||||||
"ru-RU": "ภาษารัสเซีย",
|
|
||||||
"th-TH": "ภาษาไทย",
|
|
||||||
"tr-TR": "ตุรกี",
|
|
||||||
"uk-UA": "ยูเครน",
|
|
||||||
"vi-VN": "ภาษาเวียดนาม",
|
|
||||||
"zh-CN": "ภาษาไทย",
|
|
||||||
"zh-HK": "ภาษาจีน (ตัวเต็ม)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "ใช้สำหรับการแสดงผลเท่านั้น การเปลี่ยนแปลงจะส่งผลต่อหน่วยสกุลเงินทั้งหมดในระบบ",
|
"currencyUnitDescription": "ใช้สำหรับการแสดงผลเท่านั้น การเปลี่ยนแปลงจะส่งผลต่อหน่วยสกุลเงินทั้งหมดในระบบ",
|
||||||
"saveSuccess": "บันทึกสำเร็จ"
|
"saveSuccess": "บันทึกสำเร็จ"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "บันทึกสำเร็จ",
|
||||||
|
"title": "นโยบายความเป็นส่วนตัว"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML ที่กำหนดเอง",
|
||||||
|
"customHtmlDescription": "รหัส HTML ที่กำหนดเองเพื่อแทรกลงในส่วนล่างของแท็ก body ของเว็บไซต์.",
|
||||||
|
"keywords": "คำสำคัญ",
|
||||||
|
"keywordsDescription": "ใช้สำหรับวัตถุประสงค์ SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "ใช้สำหรับแสดงตำแหน่งที่ต้องการแสดง LOGO",
|
"logoDescription": "ใช้สำหรับแสดงตำแหน่งที่ต้องการแสดง LOGO",
|
||||||
"logoPlaceholder": "กรุณาใส่ URL ของ LOGO โดยไม่ต้องลงท้ายด้วย '/'",
|
"logoPlaceholder": "กรุณาใส่ URL ของ LOGO โดยไม่ต้องลงท้ายด้วย '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Çekçe",
|
|
||||||
"de-DE": "Almanca",
|
|
||||||
"en-US": "İngilizce",
|
|
||||||
"es-ES": "İspanyolca",
|
|
||||||
"es-MX": "İspanyolca (Meksika)",
|
|
||||||
"fa-IR": "Farsça",
|
|
||||||
"fi-FI": "Fince",
|
|
||||||
"fr-FR": "Fransızca",
|
|
||||||
"hi-IN": "Hintçe",
|
|
||||||
"hu-HU": "Macarca",
|
|
||||||
"ja-JP": "Japonca",
|
|
||||||
"ko-KR": "Korece",
|
|
||||||
"no-NO": "Norveççe",
|
|
||||||
"pl-PL": "Lehçe",
|
|
||||||
"pt-BR": "Portekizce (Brezilya)",
|
|
||||||
"ro-RO": "Romence",
|
|
||||||
"ru-RU": "Rusça",
|
|
||||||
"th-TH": "Tayca",
|
|
||||||
"tr-TR": "Türkçe",
|
|
||||||
"uk-UA": "Ukraynaca",
|
|
||||||
"vi-VN": "Vietnamca",
|
|
||||||
"zh-CN": "Çince (Basitleştirilmiş)",
|
|
||||||
"zh-HK": "Çince (Geleneksel)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Sadece gösterim amaçlı kullanılır, değiştirildiğinde sistemdeki tüm para birimi birimleri değişecektir",
|
"currencyUnitDescription": "Sadece gösterim amaçlı kullanılır, değiştirildiğinde sistemdeki tüm para birimi birimleri değişecektir",
|
||||||
"saveSuccess": "Başarıyla kaydedildi"
|
"saveSuccess": "Başarıyla kaydedildi"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Başarıyla Kaydedildi",
|
||||||
|
"title": "Gizlilik Politikası"
|
||||||
|
},
|
||||||
"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",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "чеська",
|
|
||||||
"de-DE": "Німецька",
|
|
||||||
"en-US": "англійська",
|
|
||||||
"es-ES": "іспанська",
|
|
||||||
"es-MX": "іспанська (Мексика)",
|
|
||||||
"fa-IR": "Перська",
|
|
||||||
"fi-FI": "Фінська",
|
|
||||||
"fr-FR": "Французька",
|
|
||||||
"hi-IN": "гінді",
|
|
||||||
"hu-HU": "угорська",
|
|
||||||
"ja-JP": "японська",
|
|
||||||
"ko-KR": "Корейська",
|
|
||||||
"no-NO": "Норвезька",
|
|
||||||
"pl-PL": "Польська",
|
|
||||||
"pt-BR": "португальська (Бразилія)",
|
|
||||||
"ro-RO": "румунська",
|
|
||||||
"ru-RU": "Російська",
|
|
||||||
"th-TH": "тайська",
|
|
||||||
"tr-TR": "турецька",
|
|
||||||
"uk-UA": "українська мова",
|
|
||||||
"vi-VN": "В'єтнамська",
|
|
||||||
"zh-CN": "українська (Україна)",
|
|
||||||
"zh-HK": "китайська (традиційна)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Використовується лише для відображення, після зміни всі валютні одиниці в системі будуть змінені",
|
"currencyUnitDescription": "Використовується лише для відображення, після зміни всі валютні одиниці в системі будуть змінені",
|
||||||
"saveSuccess": "Успішно збережено"
|
"saveSuccess": "Успішно збережено"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Збережено успішно",
|
||||||
|
"title": "Політика конфіденційності"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Користувацький HTML",
|
||||||
|
"customHtmlDescription": "Користувацький HTML-код, який буде вставлено в кінець тегу body сайту.",
|
||||||
|
"keywords": "Ключові слова",
|
||||||
|
"keywordsDescription": "Використовується для SEO",
|
||||||
"logo": "ЛОГО",
|
"logo": "ЛОГО",
|
||||||
"logoDescription": "Використовується для відображення місця, де потрібно показати ЛОГО",
|
"logoDescription": "Використовується для відображення місця, де потрібно показати ЛОГО",
|
||||||
"logoPlaceholder": "Будь ласка, введіть URL-адресу ЛОГО, не закінчуйте на '/'",
|
"logoPlaceholder": "Будь ласка, введіть URL-адресу ЛОГО, не закінчуйте на '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tiếng Séc",
|
|
||||||
"de-DE": "Tiếng Đức",
|
|
||||||
"en-US": "tiếng Anh",
|
|
||||||
"es-ES": "Tiếng Tây Ban Nha",
|
|
||||||
"es-MX": "Tiếng Tây Ban Nha (Mexico)",
|
|
||||||
"fa-IR": "Tiếng Ba Tư",
|
|
||||||
"fi-FI": "Tiếng Phần Lan",
|
|
||||||
"fr-FR": "Tiếng Pháp",
|
|
||||||
"hi-IN": "Tiếng Hindi",
|
|
||||||
"hu-HU": "Tiếng Hungary",
|
|
||||||
"ja-JP": "Tiếng Nhật",
|
|
||||||
"ko-KR": "Tiếng Hàn",
|
|
||||||
"no-NO": "Tiếng Na Uy",
|
|
||||||
"pl-PL": "Tiếng Ba Lan",
|
|
||||||
"pt-BR": "Tiếng Bồ Đào Nha (Brazil)",
|
|
||||||
"ro-RO": "Tiếng Romania",
|
|
||||||
"ru-RU": "Tiếng Nga",
|
|
||||||
"th-TH": "Tiếng Thái",
|
|
||||||
"tr-TR": "Tiếng Thổ Nhĩ Kỳ",
|
|
||||||
"uk-UA": "Tiếng Ukraina",
|
|
||||||
"vi-VN": "Tiếng Việt",
|
|
||||||
"zh-CN": "Tiếng Trung (Giản thể)",
|
|
||||||
"zh-HK": "Tiếng Trung (Phồn thể)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Chỉ sử dụng để hiển thị, sau khi thay đổi tất cả các đơn vị tiền tệ trong hệ thống sẽ thay đổi",
|
"currencyUnitDescription": "Chỉ sử dụng để hiển thị, sau khi thay đổi tất cả các đơn vị tiền tệ trong hệ thống sẽ thay đổi",
|
||||||
"saveSuccess": "Lưu thành công"
|
"saveSuccess": "Lưu thành công"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Lưu thành công",
|
||||||
|
"title": "Chính sách bảo mật"
|
||||||
|
},
|
||||||
"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 '/'",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "捷克语",
|
|
||||||
"de-DE": "德语",
|
|
||||||
"en-US": "英语",
|
|
||||||
"es-ES": "西班牙语",
|
|
||||||
"es-MX": "西班牙语(墨西哥)",
|
|
||||||
"fa-IR": "波斯语",
|
|
||||||
"fi-FI": "芬兰语",
|
|
||||||
"fr-FR": "法语",
|
|
||||||
"hi-IN": "印地语",
|
|
||||||
"hu-HU": "匈牙利语",
|
|
||||||
"ja-JP": "日语",
|
|
||||||
"ko-KR": "韩语",
|
|
||||||
"no-NO": "挪威语",
|
|
||||||
"pl-PL": "波兰语",
|
|
||||||
"pt-BR": "葡萄牙语(巴西)",
|
|
||||||
"ro-RO": "罗马尼亚语",
|
|
||||||
"ru-RU": "俄语",
|
|
||||||
"th-TH": "泰语",
|
|
||||||
"tr-TR": "土耳其语",
|
|
||||||
"uk-UA": "乌克兰语",
|
|
||||||
"vi-VN": "越南语",
|
|
||||||
"zh-CN": "中文(简体)",
|
|
||||||
"zh-HK": "中文(繁体)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "仅用于展示使用,更改后系统中所有的货币单位都将发生变更",
|
"currencyUnitDescription": "仅用于展示使用,更改后系统中所有的货币单位都将发生变更",
|
||||||
"saveSuccess": "保存成功"
|
"saveSuccess": "保存成功"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "保存成功",
|
||||||
|
"title": "隐私政策"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "自定义HTML",
|
||||||
|
"customHtmlDescription": "要注入到网站 body 标签底部的自定义 HTML 代码。",
|
||||||
|
"keywords": "关键词",
|
||||||
|
"keywordsDescription": "用于搜索引擎优化",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "用于显示需要展示 LOGO 的位置",
|
"logoDescription": "用于显示需要展示 LOGO 的位置",
|
||||||
"logoPlaceholder": "请输入 LOGO 的 URL 地址,不要以 '/' 结尾",
|
"logoPlaceholder": "请输入 LOGO 的 URL 地址,不要以 '/' 结尾",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "捷克語",
|
|
||||||
"de-DE": "德語",
|
|
||||||
"en-US": "英語",
|
|
||||||
"es-ES": "西班牙語",
|
|
||||||
"es-MX": "西班牙語(墨西哥)",
|
|
||||||
"fa-IR": "波斯語",
|
|
||||||
"fi-FI": "芬蘭語",
|
|
||||||
"fr-FR": "法語",
|
|
||||||
"hi-IN": "印地語",
|
|
||||||
"hu-HU": "匈牙利語",
|
|
||||||
"ja-JP": "日語",
|
|
||||||
"ko-KR": "韓語",
|
|
||||||
"no-NO": "挪威語",
|
|
||||||
"pl-PL": "波蘭語",
|
|
||||||
"pt-BR": "葡萄牙語(巴西)",
|
|
||||||
"ro-RO": "羅馬尼亞語",
|
|
||||||
"ru-RU": "俄語",
|
|
||||||
"th-TH": "泰語",
|
|
||||||
"tr-TR": "土耳其語",
|
|
||||||
"uk-UA": "烏克蘭語",
|
|
||||||
"vi-VN": "越南語",
|
|
||||||
"zh-CN": "中文(简体)",
|
|
||||||
"zh-HK": "中文(繁體)"
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "僅用於展示使用,更改後系統中所有的貨幣單位都將發生變更",
|
"currencyUnitDescription": "僅用於展示使用,更改後系統中所有的貨幣單位都將發生變更",
|
||||||
"saveSuccess": "保存成功"
|
"saveSuccess": "保存成功"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "保存成功",
|
||||||
|
"title": "私隱政策"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "自定義HTML",
|
||||||
|
"customHtmlDescription": "自定義 HTML 代碼,將注入到網站 body 標籤的底部。",
|
||||||
|
"keywords": "關鍵字",
|
||||||
|
"keywordsDescription": "用於SEO目的",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "用於顯示需要展示 LOGO 的位置",
|
"logoDescription": "用於顯示需要展示 LOGO 的位置",
|
||||||
"logoPlaceholder": "請輸入 LOGO 的 URL 地址,不要以 '/' 結尾",
|
"logoPlaceholder": "請輸入 LOGO 的 URL 地址,不要以 '/' 結尾",
|
||||||
|
|||||||
@@ -203,6 +203,29 @@ export async function updateNodeConfig(body: API.NodeConfig, options?: { [key: s
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** get Privacy Policy Config GET /v1/admin/system/privacy */
|
||||||
|
export async function getPrivacyPolicyConfig(options?: { [key: string]: any }) {
|
||||||
|
return request<API.Response & { data?: API.PrivacyPolicyConfig }>('/v1/admin/system/privacy', {
|
||||||
|
method: 'GET',
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Update Privacy Policy Config PUT /v1/admin/system/privacy */
|
||||||
|
export async function updatePrivacyPolicyConfig(
|
||||||
|
body: API.PrivacyPolicyConfig,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.Response & { data?: any }>('/v1/admin/system/privacy', {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** Get register config GET /v1/admin/system/register_config */
|
/** Get register config GET /v1/admin/system/register_config */
|
||||||
export async function getRegisterConfig(options?: { [key: string]: any }) {
|
export async function getRegisterConfig(options?: { [key: string]: any }) {
|
||||||
return request<API.Response & { data?: API.RegisterConfig }>('/v1/admin/system/register_config', {
|
return request<API.Response & { data?: API.RegisterConfig }>('/v1/admin/system/register_config', {
|
||||||
|
|||||||
+7
-1
@@ -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[];
|
||||||
@@ -879,6 +879,10 @@ declare namespace API {
|
|||||||
list: PlatformInfo[];
|
list: PlatformInfo[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type PrivacyPolicyConfig = {
|
||||||
|
privacy_policy: string;
|
||||||
|
};
|
||||||
|
|
||||||
type PubilcRegisterConfig = {
|
type PubilcRegisterConfig = {
|
||||||
stop_register: boolean;
|
stop_register: boolean;
|
||||||
enable_ip_register_limit: boolean;
|
enable_ip_register_limit: boolean;
|
||||||
@@ -1010,6 +1014,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 = {
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ export async function getGlobalConfig(options?: { [key: string]: any }) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get Privacy Policy GET /v1/common/site/privacy */
|
||||||
|
export async function getPrivacyPolicy(options?: { [key: string]: any }) {
|
||||||
|
return request<API.Response & { data?: API.PrivacyPolicyConfig }>('/v1/common/site/privacy', {
|
||||||
|
method: 'GET',
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** Get stat GET /v1/common/site/stat */
|
/** Get stat GET /v1/common/site/stat */
|
||||||
export async function getStat(options?: { [key: string]: any }) {
|
export async function getStat(options?: { [key: string]: any }) {
|
||||||
return request<API.Response & { data?: API.GetStatResponse }>('/v1/common/site/stat', {
|
return request<API.Response & { data?: API.GetStatResponse }>('/v1/common/site/stat', {
|
||||||
|
|||||||
+7
-1
@@ -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[];
|
||||||
@@ -309,6 +309,10 @@ declare namespace API {
|
|||||||
enable: boolean;
|
enable: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type PrivacyPolicyConfig = {
|
||||||
|
privacy_policy: string;
|
||||||
|
};
|
||||||
|
|
||||||
type PubilcRegisterConfig = {
|
type PubilcRegisterConfig = {
|
||||||
stop_register: boolean;
|
stop_register: boolean;
|
||||||
enable_ip_register_limit: boolean;
|
enable_ip_register_limit: boolean;
|
||||||
@@ -431,6 +435,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 = {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { getPrivacyPolicy } from '@/services/common/common';
|
||||||
|
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
||||||
|
|
||||||
|
export default async function Page() {
|
||||||
|
const { data } = await getPrivacyPolicy();
|
||||||
|
return (
|
||||||
|
<div className='container py-8'>
|
||||||
|
<Markdown>{data.data?.privacy_policy || ''}</Markdown>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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,19 @@ export default function LoginForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +82,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,22 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +186,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,19 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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'
|
||||||
@@ -105,7 +114,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,19 @@ 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) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +147,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,22 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +202,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,19 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
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 +145,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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -70,6 +70,9 @@ export default function Footer() {
|
|||||||
<Link href='/tos' className='ml-2 underline'>
|
<Link href='/tos' className='ml-2 underline'>
|
||||||
{t('tos')}
|
{t('tos')}
|
||||||
</Link>
|
</Link>
|
||||||
|
<Link href='/privacy-policy' className='ml-2 underline'>
|
||||||
|
{t('privacyPolicy')}
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -14,6 +14,32 @@ import { getCountry } from '@workspace/ui/utils';
|
|||||||
import { useLocale, useTranslations } from 'next-intl';
|
import { useLocale, useTranslations } from 'next-intl';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
const languages = {
|
||||||
|
'cs-CZ': 'Čeština',
|
||||||
|
'de-DE': 'Deutsch',
|
||||||
|
'en-US': 'English',
|
||||||
|
'es-ES': 'Español',
|
||||||
|
'es-MX': 'Español (México)',
|
||||||
|
'fa-IR': 'فارسی',
|
||||||
|
'fi-FI': 'Suomi',
|
||||||
|
'fr-FR': 'Français',
|
||||||
|
'hi-IN': 'हिन्दी',
|
||||||
|
'hu-HU': 'Magyar',
|
||||||
|
'ja-JP': '日本語',
|
||||||
|
'ko-KR': '한국어',
|
||||||
|
'no-NO': 'Norsk',
|
||||||
|
'pl-PL': 'Polski',
|
||||||
|
'pt-BR': 'Português (Brasil)',
|
||||||
|
'ro-RO': 'Română',
|
||||||
|
'ru-RU': 'Русский',
|
||||||
|
'th-TH': 'ไทย',
|
||||||
|
'tr-TR': 'Türkçe',
|
||||||
|
'uk-UA': 'Українська',
|
||||||
|
'vi-VN': 'Tiếng Việt',
|
||||||
|
'zh-CN': '简体中文',
|
||||||
|
'zh-HK': '繁體中文',
|
||||||
|
} as const;
|
||||||
|
|
||||||
export default function LanguageSwitch() {
|
export default function LanguageSwitch() {
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
const country = getCountry(locale);
|
const country = getCountry(locale);
|
||||||
@@ -31,7 +57,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectValue>
|
<SelectValue>
|
||||||
<div className='flex items-center'>
|
<div className='flex items-center'>
|
||||||
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
<span className='sr-only'>{t(`${locale}`)}</span>
|
<span className='sr-only'>{languages[locale as keyof typeof languages]}</span>
|
||||||
</div>
|
</div>
|
||||||
</SelectValue>
|
</SelectValue>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
@@ -40,7 +66,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
{t(`${item?.lang}-${item?.alpha2}`)}
|
{languages[`${item?.lang}-${item?.alpha2}` as keyof typeof languages]}
|
||||||
</div>
|
</div>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -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: '',
|
||||||
@@ -102,7 +104,7 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
getAppSubLink: (type: string, url: string) => {
|
getAppSubLink: (type: string, url: string) => {
|
||||||
const name = get().common.site.site_name || '';
|
const name = get().common?.site?.site_name || '';
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'Clash':
|
case 'Clash':
|
||||||
return `clash://install-config?url=${url}&name=${name}`;
|
return `clash://install-config?url=${url}&name=${name}`;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Telefon"
|
"mobile": "Telefon"
|
||||||
},
|
},
|
||||||
"orWithEmail": "nebo pomocí e-mailu",
|
"orWithEmail": "nebo pomocí e-mailu",
|
||||||
|
"privacyPolicy": "Zásady ochrany osobních údajů",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Vytvořte si nový účet, vyplňte své údaje pro registraci.",
|
"description": "Vytvořte si nový účet, vyplňte své údaje pro registraci.",
|
||||||
"email": "Zadejte prosím platnou e-mailovou adresu.",
|
"email": "Zadejte prosím platnou e-mailovou adresu.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "čeština",
|
|
||||||
"de-DE": "němčina",
|
|
||||||
"en-US": "angličtina",
|
|
||||||
"es-ES": "španělština",
|
|
||||||
"es-MX": "španělština (Mexiko)",
|
|
||||||
"fa-IR": "Perština",
|
|
||||||
"fi-FI": "finština",
|
|
||||||
"fr-FR": "Francouzština",
|
|
||||||
"hi-IN": "hindština",
|
|
||||||
"hu-HU": "maďarština",
|
|
||||||
"ja-JP": "Japonština",
|
|
||||||
"ko-KR": "Korejština",
|
|
||||||
"no-NO": "norština",
|
|
||||||
"pl-PL": "polština",
|
|
||||||
"pt-BR": "portugalština (Brazílie)",
|
|
||||||
"ro-RO": "Rumunština",
|
|
||||||
"ru-RU": "ruština",
|
|
||||||
"th-TH": "thajština",
|
|
||||||
"tr-TR": "turečtina",
|
|
||||||
"uk-UA": "Ukrajinština",
|
|
||||||
"vi-VN": "Vietnamština",
|
|
||||||
"zh-CN": "čeština (CS)",
|
|
||||||
"zh-HK": "čínština (tradiční)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Telefon"
|
"mobile": "Telefon"
|
||||||
},
|
},
|
||||||
"orWithEmail": "oder mit E-Mail",
|
"orWithEmail": "oder mit E-Mail",
|
||||||
|
"privacyPolicy": "Datenschutzrichtlinie",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Erstellen Sie ein neues Konto, indem Sie Ihre Informationen ausfüllen, um sich zu registrieren.",
|
"description": "Erstellen Sie ein neues Konto, indem Sie Ihre Informationen ausfüllen, um sich zu registrieren.",
|
||||||
"email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
|
"email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tschechisch",
|
|
||||||
"de-DE": "Deutsch",
|
|
||||||
"en-US": "Englisch",
|
|
||||||
"es-ES": "Spanisch",
|
|
||||||
"es-MX": "Spanisch (Mexiko)",
|
|
||||||
"fa-IR": "Persisch",
|
|
||||||
"fi-FI": "Finnisch",
|
|
||||||
"fr-FR": "Französisch",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Ungarisch",
|
|
||||||
"ja-JP": "Japanisch",
|
|
||||||
"ko-KR": "Koreanisch",
|
|
||||||
"no-NO": "Norwegisch",
|
|
||||||
"pl-PL": "Polnisch",
|
|
||||||
"pt-BR": "Portugiesisch (Brasilien)",
|
|
||||||
"ro-RO": "Rumänisch",
|
|
||||||
"ru-RU": "Russisch",
|
|
||||||
"th-TH": "Thailändisch",
|
|
||||||
"tr-TR": "Türkisch",
|
|
||||||
"uk-UA": "Ukrainisch",
|
|
||||||
"vi-VN": "Vietnamesisch",
|
|
||||||
"zh-CN": "Chinesisch (vereinfacht)",
|
|
||||||
"zh-HK": "Chinesisch (Traditionell)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Telephone"
|
"mobile": "Telephone"
|
||||||
},
|
},
|
||||||
"orWithEmail": "Or with Email",
|
"orWithEmail": "Or with Email",
|
||||||
|
"privacyPolicy": "Privacy Policy",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Create a new account, fill in your information to register.",
|
"description": "Create a new account, fill in your information to register.",
|
||||||
"email": "Please enter a valid email address.",
|
"email": "Please enter a valid email address.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Czech",
|
|
||||||
"de-DE": "German",
|
|
||||||
"en-US": "English",
|
|
||||||
"es-ES": "Spanish",
|
|
||||||
"es-MX": "Spanish (Mexico)",
|
|
||||||
"fa-IR": "Persian",
|
|
||||||
"fi-FI": "Finnish",
|
|
||||||
"fr-FR": "French",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Hungarian",
|
|
||||||
"ja-JP": "Japanese",
|
|
||||||
"ko-KR": "Korean",
|
|
||||||
"no-NO": "Norwegian",
|
|
||||||
"pl-PL": "Polish",
|
|
||||||
"pt-BR": "Portuguese (Brazil)",
|
|
||||||
"ro-RO": "Romanian",
|
|
||||||
"ru-RU": "Russian",
|
|
||||||
"th-TH": "Thai",
|
|
||||||
"tr-TR": "Turkish",
|
|
||||||
"uk-UA": "Ukrainian",
|
|
||||||
"vi-VN": "Vietnamese",
|
|
||||||
"zh-CN": "Chinese (Simplified)",
|
|
||||||
"zh-HK": "Chinese (Traditional)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Teléfono"
|
"mobile": "Teléfono"
|
||||||
},
|
},
|
||||||
"orWithEmail": "o usar correo electrónico",
|
"orWithEmail": "o usar correo electrónico",
|
||||||
|
"privacyPolicy": "Política de Privacidad",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Crea una nueva cuenta, completa tu información para registrarte.",
|
"description": "Crea una nueva cuenta, completa tu información para registrarte.",
|
||||||
"email": "Por favor, introduce una dirección de correo electrónico válida.",
|
"email": "Por favor, introduce una dirección de correo electrónico válida.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "Español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "chino (simplificado)",
|
|
||||||
"zh-HK": "chino (tradicional)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Teléfono"
|
"mobile": "Teléfono"
|
||||||
},
|
},
|
||||||
"orWithEmail": "o usar correo electrónico",
|
"orWithEmail": "o usar correo electrónico",
|
||||||
|
"privacyPolicy": "Política de Privacidad",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Crea una nueva cuenta, completa tu información para registrarte.",
|
"description": "Crea una nueva cuenta, completa tu información para registrarte.",
|
||||||
"email": "Por favor, ingresa una dirección de correo electrónico válida.",
|
"email": "Por favor, ingresa una dirección de correo electrónico válida.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "Español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "Portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "Turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "español (México)",
|
|
||||||
"zh-HK": "Chino (Tradicional)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "تلفن"
|
"mobile": "تلفن"
|
||||||
},
|
},
|
||||||
"orWithEmail": "یا با ایمیل",
|
"orWithEmail": "یا با ایمیل",
|
||||||
|
"privacyPolicy": "سیاست حفظ حریم خصوصی",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "ایجاد یک حساب کاربری جدید، اطلاعات خود را برای ثبتنام وارد کنید.",
|
"description": "ایجاد یک حساب کاربری جدید، اطلاعات خود را برای ثبتنام وارد کنید.",
|
||||||
"email": "لطفاً یک آدرس ایمیل معتبر وارد کنید.",
|
"email": "لطفاً یک آدرس ایمیل معتبر وارد کنید.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "چکی",
|
|
||||||
"de-DE": "آلمانی",
|
|
||||||
"en-US": "انگلیسی",
|
|
||||||
"es-ES": "اسپانیایی",
|
|
||||||
"es-MX": "اسپانیایی (مکزیک)",
|
|
||||||
"fa-IR": "فارسی",
|
|
||||||
"fi-FI": "فنلاندی",
|
|
||||||
"fr-FR": "فرانسوی",
|
|
||||||
"hi-IN": "هندی",
|
|
||||||
"hu-HU": "مجاری",
|
|
||||||
"ja-JP": "ژاپنی",
|
|
||||||
"ko-KR": "کرهای",
|
|
||||||
"no-NO": "نروژی",
|
|
||||||
"pl-PL": "لهستانی",
|
|
||||||
"pt-BR": "پرتغالی (برزیل)",
|
|
||||||
"ro-RO": "رومانیایی",
|
|
||||||
"ru-RU": "روسی",
|
|
||||||
"th-TH": "تایلندی",
|
|
||||||
"tr-TR": "ترکی",
|
|
||||||
"uk-UA": "اوکراینی",
|
|
||||||
"vi-VN": "ویتنامی",
|
|
||||||
"zh-CN": "چینی (ساده شده)",
|
|
||||||
"zh-HK": "چینی (سنتی)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Puhelin"
|
"mobile": "Puhelin"
|
||||||
},
|
},
|
||||||
"orWithEmail": "tai käytä sähköpostia",
|
"orWithEmail": "tai käytä sähköpostia",
|
||||||
|
"privacyPolicy": "Tietosuojakäytäntö",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Luo uusi tili täyttämällä tietosi rekisteröityäksesi.",
|
"description": "Luo uusi tili täyttämällä tietosi rekisteröityäksesi.",
|
||||||
"email": "Anna kelvollinen sähköpostiosoite.",
|
"email": "Anna kelvollinen sähköpostiosoite.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "tšekki",
|
|
||||||
"de-DE": "Saksa",
|
|
||||||
"en-US": "englanti",
|
|
||||||
"es-ES": "espanja",
|
|
||||||
"es-MX": "espanja (Meksiko)",
|
|
||||||
"fa-IR": "Persia",
|
|
||||||
"fi-FI": "suomi",
|
|
||||||
"fr-FR": "ranska",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "unkarilainen",
|
|
||||||
"ja-JP": "japani",
|
|
||||||
"ko-KR": "Korea",
|
|
||||||
"no-NO": "norja",
|
|
||||||
"pl-PL": "puola",
|
|
||||||
"pt-BR": "portugali (Brasilia)",
|
|
||||||
"ro-RO": "romania",
|
|
||||||
"ru-RU": "Venäjä",
|
|
||||||
"th-TH": "thaikieli",
|
|
||||||
"tr-TR": "turkki",
|
|
||||||
"uk-UA": "ukrainaksi",
|
|
||||||
"vi-VN": "Vietnamin kieli",
|
|
||||||
"zh-CN": "kiina (yksinkertaistettu)",
|
|
||||||
"zh-HK": "kiina (perinteinen)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Téléphone"
|
"mobile": "Téléphone"
|
||||||
},
|
},
|
||||||
"orWithEmail": "ou utiliser l'e-mail",
|
"orWithEmail": "ou utiliser l'e-mail",
|
||||||
|
"privacyPolicy": "Politique de confidentialité",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Créez un nouveau compte, remplissez vos informations pour vous inscrire.",
|
"description": "Créez un nouveau compte, remplissez vos informations pour vous inscrire.",
|
||||||
"email": "Veuillez entrer une adresse email valide.",
|
"email": "Veuillez entrer une adresse email valide.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "tchèque",
|
|
||||||
"de-DE": "allemand",
|
|
||||||
"en-US": "anglais",
|
|
||||||
"es-ES": "Espagnol",
|
|
||||||
"es-MX": "Espagnol (Mexique)",
|
|
||||||
"fa-IR": "Persan",
|
|
||||||
"fi-FI": "finnois",
|
|
||||||
"fr-FR": "français",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "Hongrois",
|
|
||||||
"ja-JP": "Japonais",
|
|
||||||
"ko-KR": "coréen",
|
|
||||||
"no-NO": "Norvégien",
|
|
||||||
"pl-PL": "Polonais",
|
|
||||||
"pt-BR": "Portugais (Brésil)",
|
|
||||||
"ro-RO": "Roumain",
|
|
||||||
"ru-RU": "Russe",
|
|
||||||
"th-TH": "thaïlandais",
|
|
||||||
"tr-TR": "turc",
|
|
||||||
"uk-UA": "Ukrainien",
|
|
||||||
"vi-VN": "Vietnamien",
|
|
||||||
"zh-CN": "français (France)",
|
|
||||||
"zh-HK": "Chinois (traditionnel)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "टेलीफोन"
|
"mobile": "टेलीफोन"
|
||||||
},
|
},
|
||||||
"orWithEmail": "या ईमेल का उपयोग करें",
|
"orWithEmail": "या ईमेल का उपयोग करें",
|
||||||
|
"privacyPolicy": "गोपनीयता नीति",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "नया खाता बनाएं, पंजीकरण के लिए अपनी जानकारी भरें।",
|
"description": "नया खाता बनाएं, पंजीकरण के लिए अपनी जानकारी भरें।",
|
||||||
"email": "कृपया एक मान्य ईमेल पता दर्ज करें।",
|
"email": "कृपया एक मान्य ईमेल पता दर्ज करें।",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "चेक",
|
|
||||||
"de-DE": "जर्मन",
|
|
||||||
"en-US": "अंग्रेज़ी",
|
|
||||||
"es-ES": "स्पेनिश",
|
|
||||||
"es-MX": "स्पेनिश (मेक्सिको)",
|
|
||||||
"fa-IR": "फ़ारसी",
|
|
||||||
"fi-FI": "फिनिश",
|
|
||||||
"fr-FR": "फ्रेंच",
|
|
||||||
"hi-IN": "हिंदी",
|
|
||||||
"hu-HU": "हंगेरियन",
|
|
||||||
"ja-JP": "जापानी",
|
|
||||||
"ko-KR": "कोरियाई",
|
|
||||||
"no-NO": "नॉर्वेजियन",
|
|
||||||
"pl-PL": "पोलिश",
|
|
||||||
"pt-BR": "पुर्तगाली (ब्राज़ील)",
|
|
||||||
"ro-RO": "रोमानियाई",
|
|
||||||
"ru-RU": "रूसी",
|
|
||||||
"th-TH": "थाई",
|
|
||||||
"tr-TR": "तुर्की",
|
|
||||||
"uk-UA": "यूक्रेनी",
|
|
||||||
"vi-VN": "वियतनामी",
|
|
||||||
"zh-CN": "हिन्दी (भारत)",
|
|
||||||
"zh-HK": "चीनी (पारंपरिक)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Telefon"
|
"mobile": "Telefon"
|
||||||
},
|
},
|
||||||
"orWithEmail": "vagy használja az e-mailt",
|
"orWithEmail": "vagy használja az e-mailt",
|
||||||
|
"privacyPolicy": "Adatvédelmi irányelvek",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Hozzon létre új fiókot, töltse ki adatait a regisztrációhoz.",
|
"description": "Hozzon létre új fiókot, töltse ki adatait a regisztrációhoz.",
|
||||||
"email": "Kérjük, adjon meg egy érvényes e-mail címet.",
|
"email": "Kérjük, adjon meg egy érvényes e-mail címet.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "cseh",
|
|
||||||
"de-DE": "német",
|
|
||||||
"en-US": "angol",
|
|
||||||
"es-ES": "spanyol",
|
|
||||||
"es-MX": "spanyol (Mexikó)",
|
|
||||||
"fa-IR": "Perzsa",
|
|
||||||
"fi-FI": "finn",
|
|
||||||
"fr-FR": "Francia",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "magyar",
|
|
||||||
"ja-JP": "Japán",
|
|
||||||
"ko-KR": "Koreai",
|
|
||||||
"no-NO": "norvég",
|
|
||||||
"pl-PL": "lengyel",
|
|
||||||
"pt-BR": "portugál (Brazília)",
|
|
||||||
"ro-RO": "román nyelv",
|
|
||||||
"ru-RU": "Orosz",
|
|
||||||
"th-TH": "thai",
|
|
||||||
"tr-TR": "török",
|
|
||||||
"uk-UA": "ukrán",
|
|
||||||
"vi-VN": "vietnámi",
|
|
||||||
"zh-CN": "kínai (egyszerűsített)",
|
|
||||||
"zh-HK": "Kínai (hagyományos)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "電話"
|
"mobile": "電話"
|
||||||
},
|
},
|
||||||
"orWithEmail": "またはメールを使用",
|
"orWithEmail": "またはメールを使用",
|
||||||
|
"privacyPolicy": "プライバシーポリシー",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "新しいアカウントを作成し、情報を入力して登録してください。",
|
"description": "新しいアカウントを作成し、情報を入力して登録してください。",
|
||||||
"email": "有効なメールアドレスを入力してください。",
|
"email": "有効なメールアドレスを入力してください。",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "チェコ語",
|
|
||||||
"de-DE": "ドイツ語",
|
|
||||||
"en-US": "英語",
|
|
||||||
"es-ES": "スペイン語",
|
|
||||||
"es-MX": "スペイン語(メキシコ)",
|
|
||||||
"fa-IR": "ペルシャ語",
|
|
||||||
"fi-FI": "フィンランド語",
|
|
||||||
"fr-FR": "フランス語",
|
|
||||||
"hi-IN": "ヒンディー語",
|
|
||||||
"hu-HU": "ハンガリー語",
|
|
||||||
"ja-JP": "日本語",
|
|
||||||
"ko-KR": "韓国語",
|
|
||||||
"no-NO": "ノルウェー語",
|
|
||||||
"pl-PL": "ポーランド語",
|
|
||||||
"pt-BR": "ポルトガル語(ブラジル)",
|
|
||||||
"ro-RO": "ルーマニア語",
|
|
||||||
"ru-RU": "ロシア語",
|
|
||||||
"th-TH": "タイ語",
|
|
||||||
"tr-TR": "トルコ語",
|
|
||||||
"uk-UA": "ウクライナ語",
|
|
||||||
"vi-VN": "ベトナム語",
|
|
||||||
"zh-CN": "日本語",
|
|
||||||
"zh-HK": "中国語(繁体)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "전화"
|
"mobile": "전화"
|
||||||
},
|
},
|
||||||
"orWithEmail": "또는 이메일 사용",
|
"orWithEmail": "또는 이메일 사용",
|
||||||
|
"privacyPolicy": "개인정보 처리방침",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "새 계정을 생성하고 정보를 입력하여 등록하세요.",
|
"description": "새 계정을 생성하고 정보를 입력하여 등록하세요.",
|
||||||
"email": "유효한 이메일 주소를 입력해 주세요.",
|
"email": "유효한 이메일 주소를 입력해 주세요.",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "체코어",
|
|
||||||
"de-DE": "독일어",
|
|
||||||
"en-US": "영어",
|
|
||||||
"es-ES": "스페인어",
|
|
||||||
"es-MX": "스페인어(멕시코)",
|
|
||||||
"fa-IR": "페르시아어",
|
|
||||||
"fi-FI": "핀란드어",
|
|
||||||
"fr-FR": "프랑스어",
|
|
||||||
"hi-IN": "힌디어",
|
|
||||||
"hu-HU": "헝가리어",
|
|
||||||
"ja-JP": "일본어",
|
|
||||||
"ko-KR": "한국어",
|
|
||||||
"no-NO": "노르웨이어",
|
|
||||||
"pl-PL": "폴란드어",
|
|
||||||
"pt-BR": "포르투갈어(브라질)",
|
|
||||||
"ro-RO": "루마니아어",
|
|
||||||
"ru-RU": "러시아어",
|
|
||||||
"th-TH": "태국어",
|
|
||||||
"tr-TR": "터키어",
|
|
||||||
"uk-UA": "우크라이나어",
|
|
||||||
"vi-VN": "베트남어",
|
|
||||||
"zh-CN": "한국어",
|
|
||||||
"zh-HK": "중국어(번체)"
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
"mobile": "Telefon"
|
"mobile": "Telefon"
|
||||||
},
|
},
|
||||||
"orWithEmail": "eller bruk e-post",
|
"orWithEmail": "eller bruk e-post",
|
||||||
|
"privacyPolicy": "Personvernerklæring",
|
||||||
"register": {
|
"register": {
|
||||||
"description": "Opprett en ny konto, fyll inn informasjonen din for å registrere deg.",
|
"description": "Opprett en ny konto, fyll inn informasjonen din for å registrere deg.",
|
||||||
"email": "Vennligst oppgi en gyldig e-postadresse.",
|
"email": "Vennligst oppgi en gyldig e-postadresse.",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user