🐛 fix(auth): Update authentication configuration and localization strings

This commit is contained in:
web@ppanel 2025-02-08 23:58:03 +07:00
parent 3a3d2236e2
commit 47f2c5853c
48 changed files with 749 additions and 293 deletions

View File

@ -33,8 +33,8 @@ export default function RegisterForm({
try { try {
const domain = email.split('@')[1]; const domain = email.split('@')[1];
const isValid = const isValid =
!auth.email.email_enable_verify || !auth.email.enable_verify ||
auth.email?.email_domain_suffix_list.split('\n').includes(domain || ''); auth.email?.domain_suffix_list.split('\n').includes(domain || '');
return !isValid; return !isValid;
} catch (error) { } catch (error) {
console.log('Error checking user:', error); console.log('Error checking user:', error);
@ -52,7 +52,7 @@ export default function RegisterForm({
}), }),
password: z.string(), password: z.string(),
repeat_password: z.string(), repeat_password: z.string(),
code: auth.email.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() : z.string().nullish(),
cf_token: cf_token:
verify.enable_register_verify && verify.turnstile_site_key verify.enable_register_verify && verify.turnstile_site_key
@ -120,7 +120,7 @@ export default function RegisterForm({
</FormItem> </FormItem>
)} )}
/> />
{auth.email.email_enable_verify && ( {auth.email.enable_verify && (
<FormField <FormField
control={form.control} control={form.control}
name='code' name='code'

View File

@ -32,7 +32,7 @@ export default function ResetForm({
const formSchema = z.object({ const formSchema = z.object({
email: z.string().email(t('email')), email: z.string().email(t('email')),
password: z.string(), password: z.string(),
code: auth?.email?.email_enable_verify ? z.string() : z.string().nullish(), code: auth?.email?.enable_verify ? z.string() : 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()
@ -72,7 +72,7 @@ export default function ResetForm({
)} )}
/> />
{auth?.email?.email_enable_verify && ( {auth?.email?.enable_verify && (
<FormField <FormField
control={form.control} control={form.control}
name='code' name='code'

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { getOAuthByPlatform, updateOAuthConfig } from '@/services/admin/system'; import { getAuthMethodConfig, updateAuthMethodConfig } from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label'; import { Label } from '@workspace/ui/components/label';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
@ -14,21 +14,21 @@ export default function Page() {
const t = useTranslations('apple'); const t = useTranslations('apple');
const { data, refetch } = useQuery({ const { data, refetch } = useQuery({
queryKey: ['getOAuthByPlatform', 'apple'], queryKey: ['getAuthMethodConfig', 'apple'],
queryFn: async () => { queryFn: async () => {
const { data } = await getOAuthByPlatform({ const { data } = await getAuthMethodConfig({
platform: 'apple', method: 'apple',
}); });
return data.data; return data.data;
}, },
}); });
async function updateConfig(key: keyof API.UpdateOAuthConfig, value: unknown) { async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
try { try {
await updateOAuthConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.UpdateOAuthConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -132,8 +132,13 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
placeholder='https://your-domain.com/v1/auth/oauth/callback/apple' placeholder='https://your-domain.com/v1/auth/oauth/callback/apple'
value={data?.redirect} value={data?.config.redirect_url}
onValueBlur={(value) => updateConfig('redirect', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
redirect_url: value,
})
}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>

View File

@ -1,6 +1,10 @@
'use client'; 'use client';
import { getEmailSmtpConfig, testEmailSmtp, updateEmailSmtpConfig } from '@/services/admin/system'; import {
getAuthMethodConfig,
testEmailSend,
updateAuthMethodConfig,
} from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { import {
@ -23,14 +27,16 @@ import { toast } from 'sonner';
export default function Page() { export default function Page() {
const t = useTranslations('email'); const t = useTranslations('email');
const ref = useRef<Partial<API.EmailSmtpConfig>>({}); const ref = useRef<Partial<API.AuthMethodConfig>>({});
const [email, setEmail] = useState<string>(); const [email, setEmail] = useState<string>();
const { data, refetch, isFetching } = useQuery({ const { data, refetch, isFetching } = useQuery({
queryKey: ['getEmailSmtpConfig'], queryKey: ['getAuthMethodConfig', 'email'],
queryFn: async () => { queryFn: async () => {
const { data } = await getEmailSmtpConfig(); const { data } = await getAuthMethodConfig({
ref.current = data.data as API.EmailSmtpConfig; method: 'email',
});
ref.current = data.data as API.AuthMethodConfig;
return data.data; return data.data;
}, },
}); });
@ -38,10 +44,10 @@ export default function Page() {
async function updateConfig(key: string, value: unknown) { async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return; if (data?.[key] === value) return;
try { try {
await updateEmailSmtpConfig({ await updateAuthMethodConfig({
...ref.current, ...ref.current,
[key]: value, [key]: value,
} as API.EmailSmtpConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -59,94 +65,193 @@ export default function Page() {
<TabsContent value='basic'> <TabsContent value='basic'>
<Table> <Table>
<TableBody> <TableBody>
{[ <TableRow>
{ <TableCell>
key: 'email_enabled', <Label>{t('enable')}</Label>
label: t('enable'), <p className='text-muted-foreground text-xs'>{t('enableDescription')}</p>
description: t('enableDescription'), </TableCell>
component: 'switch', <TableCell className='text-right'>
}, <Switch
{ checked={data?.enabled}
key: 'enable_email_verify', onCheckedChange={(checked) => updateConfig('enabled', checked)}
label: t('emailVerification'), />
description: t('emailVerificationDescription'), </TableCell>
component: 'switch', </TableRow>
}, <TableRow>
{ <TableCell>
key: 'enable_email_domain_suffix', <Label>{t('emailVerification')}</Label>
label: t('emailSuffixWhitelist'), <p className='text-muted-foreground text-xs'>{t('emailVerificationDescription')}</p>
description: t('emailSuffixWhitelistDescription'), </TableCell>
component: 'switch', <TableCell className='text-right'>
}, <Switch
{ checked={data?.config?.enable_verify}
key: 'email_domain_suffix_list', onCheckedChange={(checked) =>
label: t('whitelistSuffixes'), updateConfig('config', { ...data?.config, enable_verify: checked })
description: t('whitelistSuffixesDescription'), }
component: 'textarea', />
}, </TableCell>
{ </TableRow>
key: 'email_smtp_host', <TableRow>
label: t('smtpServerAddress'), <TableCell>
description: t('smtpServerAddressDescription'), <Label>{t('emailSuffixWhitelist')}</Label>
}, <p className='text-muted-foreground text-xs'>
{ {t('emailSuffixWhitelistDescription')}
key: 'email_smtp_port', </p>
label: t('smtpServerPort'), </TableCell>
description: t('smtpServerPortDescription'), <TableCell className='text-right'>
type: 'number', <Switch
}, checked={data?.config?.enable_domain_suffix}
{ onCheckedChange={(checked) =>
key: 'email_smtp_ssl', updateConfig('config', { ...data?.config, enable_domain_suffix: checked })
label: t('smtpEncryptionMethod'), }
description: t('smtpEncryptionMethodDescription'), />
component: 'switch', </TableCell>
}, </TableRow>
{ <TableRow>
key: 'email_smtp_user', <TableCell className='align-top'>
label: t('smtpAccount'), <Label>{t('whitelistSuffixes')}</Label>
description: t('smtpAccountDescription'), <p className='text-muted-foreground text-xs'>{t('whitelistSuffixesDescription')}</p>
}, </TableCell>
{ <TableCell className='text-right'>
key: 'email_smtp_pass', <Textarea
label: t('smtpPassword'), className='h-32'
description: t('smtpPasswordDescription'), placeholder={t('whitelistSuffixesPlaceholder')}
type: 'password', defaultValue={data?.config?.domain_suffix_list}
}, onBlur={(e) =>
{ updateConfig('config', { ...data?.config, domain_suffix_list: e.target.value })
key: 'email_smtp_from', }
label: t('senderAddress'), />
description: t('senderAddressDescription'), </TableCell>
}, </TableRow>
].map(({ key, label, description, type = 'text', component = 'input' }) => ( <TableRow>
<TableRow key={key}> <TableCell>
<TableCell className={component === 'textarea' ? 'align-top' : undefined}> <Label>{t('smtpServerAddress')}</Label>
<Label>{label}</Label> <p className='text-muted-foreground text-xs'>{t('smtpServerAddressDescription')}</p>
<p className='text-muted-foreground text-xs'>{description}</p> </TableCell>
</TableCell> <TableCell className='text-right'>
<TableCell className='text-right'> <EnhancedInput
{component === 'input' ? ( placeholder={t('inputPlaceholder')}
<EnhancedInput value={data?.config?.platform_config?.host}
placeholder={t('inputPlaceholder')} onValueBlur={(value) =>
value={data?.[key]} updateConfig('config', {
type={type} ...data?.config,
onValueBlur={(value) => updateConfig(key, value)} platform_config: {
/> ...data?.platform_config,
) : component === 'switch' ? ( host: value,
<Switch },
checked={data?.[key]} })
onCheckedChange={(checked) => updateConfig(key, checked)} }
/> />
) : ( </TableCell>
<Textarea </TableRow>
className='h-32' <TableRow>
placeholder={t('whitelistSuffixesPlaceholder')} <TableCell>
defaultValue={data?.[key]} <Label>{t('smtpServerPort')}</Label>
onBlur={(e) => updateConfig(key, e.target.value)} <p className='text-muted-foreground text-xs'>{t('smtpServerPortDescription')}</p>
/> </TableCell>
)} <TableCell className='text-right'>
</TableCell> <EnhancedInput
</TableRow> placeholder={t('inputPlaceholder')}
))} value={data?.config?.platform_config?.port}
type='number'
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.platform_config,
port: value,
},
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('smtpEncryptionMethod')}</Label>
<p className='text-muted-foreground text-xs'>
{t('smtpEncryptionMethodDescription')}
</p>
</TableCell>
<TableCell className='text-right'>
<Switch
checked={data?.config?.platform_config?.ssl}
onCheckedChange={(checked) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.platform_config,
ssl: checked,
},
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('smtpAccount')}</Label>
<p className='text-muted-foreground text-xs'>{t('smtpAccountDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config?.platform_config?.user}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.platform_config,
user: value,
},
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('smtpPassword')}</Label>
<p className='text-muted-foreground text-xs'>{t('smtpPasswordDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config?.platform_config?.pass}
type='password'
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.platform_config,
pass: value,
},
})
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('senderAddress')}</Label>
<p className='text-muted-foreground text-xs'>{t('senderAddressDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
placeholder={t('inputPlaceholder')}
value={data?.config?.platform_config?.from}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.platform_config,
from: value,
},
})
}
/>
</TableCell>
</TableRow>
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('sendTestEmail')}</Label> <Label>{t('sendTestEmail')}</Label>
@ -164,7 +269,7 @@ export default function Page() {
onClick={async () => { onClick={async () => {
if (!email) return; if (!email) return;
try { try {
await testEmailSmtp({ email }); await testEmailSend({ email });
toast.success(t('sendSuccess')); toast.success(t('sendSuccess'));
} catch { } catch {
toast.error(t('sendFailure')); toast.error(t('sendFailure'));
@ -193,8 +298,13 @@ export default function Page() {
<CardContent> <CardContent>
<HTMLEditor <HTMLEditor
placeholder={t('inputPlaceholder')} placeholder={t('inputPlaceholder')}
value={data?.[templateKey as keyof API.EmailSmtpConfig] as string} value={data?.config?.[templateKey] as string}
onBlur={(value) => updateConfig(templateKey, value)} onBlur={(value) =>
updateConfig('config', {
...data?.config,
[templateKey]: value,
})
}
/> />
</CardContent> </CardContent>
</Card> </Card>

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { getOAuthByPlatform, updateOAuthConfig } from '@/services/admin/system'; import { getAuthMethodConfig, updateAuthMethodConfig } from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label'; import { Label } from '@workspace/ui/components/label';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
@ -13,21 +13,21 @@ export default function Page() {
const t = useTranslations('facebook'); const t = useTranslations('facebook');
const { data, refetch } = useQuery({ const { data, refetch } = useQuery({
queryKey: ['getOAuthByPlatform', 'facebook'], queryKey: ['getAuthMethodConfig', 'facebook'],
queryFn: async () => { queryFn: async () => {
const { data } = await getOAuthByPlatform({ const { data } = await getAuthMethodConfig({
platform: 'facebook', method: 'facebook',
}); });
return data.data; return data.data;
}, },
}); });
async function updateConfig(key: keyof API.UpdateOAuthConfig, value: unknown) { async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
try { try {
await updateOAuthConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.UpdateOAuthConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -94,8 +94,13 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
placeholder='https://your-domain.com/v1/auth/oauth/callback/facebook' placeholder='https://your-domain.com/v1/auth/oauth/callback/facebook'
value={data?.redirect} value={data?.config.redirect_url}
onValueBlur={(value) => updateConfig('redirect', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
redirect_url: value,
})
}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { getOAuthByPlatform, updateOAuthConfig } from '@/services/admin/system'; import { getAuthMethodConfig, updateAuthMethodConfig } from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label'; import { Label } from '@workspace/ui/components/label';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
@ -13,21 +13,21 @@ export default function Page() {
const t = useTranslations('github'); const t = useTranslations('github');
const { data, refetch } = useQuery({ const { data, refetch } = useQuery({
queryKey: ['getOAuthByPlatform', 'github'], queryKey: ['getAuthMethodConfig', 'github'],
queryFn: async () => { queryFn: async () => {
const { data } = await getOAuthByPlatform({ const { data } = await getAuthMethodConfig({
platform: 'github', method: 'github',
}); });
return data.data; return data.data;
}, },
}); });
async function updateConfig(key: keyof API.UpdateOAuthConfig, value: unknown) { async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
try { try {
await updateOAuthConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.UpdateOAuthConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -93,8 +93,13 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
placeholder='https://your-domain.com/v1/auth/oauth/callback/github' placeholder='https://your-domain.com/v1/auth/oauth/callback/github'
value={data?.redirect} value={data?.config.redirect_url}
onValueBlur={(value) => updateConfig('redirect', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
redirect_url: value,
})
}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { getOAuthByPlatform, updateOAuthConfig } from '@/services/admin/system'; import { getAuthMethodConfig, updateAuthMethodConfig } from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label'; import { Label } from '@workspace/ui/components/label';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
@ -13,21 +13,21 @@ export default function Page() {
const t = useTranslations('google'); const t = useTranslations('google');
const { data, refetch } = useQuery({ const { data, refetch } = useQuery({
queryKey: ['getOAuthByPlatform', 'google'], queryKey: ['getAuthMethodConfig', 'google'],
queryFn: async () => { queryFn: async () => {
const { data } = await getOAuthByPlatform({ const { data } = await getAuthMethodConfig({
platform: 'google', method: 'google',
}); });
return data.data; return data.data;
}, },
}); });
async function updateConfig(key: keyof API.UpdateOAuthConfig, value: unknown) { async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
try { try {
await updateOAuthConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.UpdateOAuthConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -94,8 +94,13 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
placeholder='https://your-domain.com/v1/auth/oauth/callback/google' placeholder='https://your-domain.com/v1/auth/oauth/callback/google'
value={data?.redirect} value={data?.config.redirect_url}
onValueBlur={(value) => updateConfig('redirect', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
redirect_url: value,
})
}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>

View File

@ -1,13 +1,13 @@
'use client'; 'use client';
import { ProTable, ProTableActions } from '@/components/pro-table'; import { ProTable, ProTableActions } from '@/components/pro-table';
import { getSmsList } from '@/services/admin/sms';
import { import {
getSmsConfig, getAuthMethodConfig,
getSmsPlatform, getSmsPlatform,
testSmsSend, testSmsSend,
updateSmsConfig, updateAuthMethodConfig,
} from '@/services/admin/system'; } from '@/services/admin/authMethod';
import { getSmsList } from '@/services/admin/sms';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
@ -25,6 +25,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/componen
import { Textarea } from '@workspace/ui/components/textarea'; import { Textarea } from '@workspace/ui/components/textarea';
import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select'; import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import TagInput from '@workspace/ui/custom-components/tag-input';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import Link from 'next/link'; import Link from 'next/link';
@ -34,9 +35,11 @@ import { toast } from 'sonner';
export default function Page() { export default function Page() {
const t = useTranslations('phone'); const t = useTranslations('phone');
const { data, refetch, isFetching } = useQuery({ const { data, refetch, isFetching } = useQuery({
queryKey: ['getSmsConfig'], queryKey: ['getAuthMethodConfig', 'mobile'],
queryFn: async () => { queryFn: async () => {
const { data } = await getSmsConfig(); const { data } = await getAuthMethodConfig({
method: 'mobile',
});
return data.data; return data.data;
}, },
}); });
@ -49,25 +52,27 @@ export default function Page() {
}, },
}); });
const selectedPlatform = platforms?.find((platform) => platform.platform === data?.sms_platform); const selectedPlatform = platforms?.find(
(platform) => platform.platform === data?.config?.platform,
);
const { platform_url, platform_field_description: platformConfig } = selectedPlatform ?? {}; const { platform_url, platform_field_description: platformConfig } = selectedPlatform ?? {};
async function updateConfig(key: string, value: unknown) { async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return; if (data?.[key] === value) return;
try { try {
await updateSmsConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.SmsConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('updateSuccess')); toast.success(t('updateSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
/* empty */ /* empty */
} }
} }
const [params, setParams] = useState<API.SendSmsRequest>({ const [params, setParams] = useState<API.TestSmsSendRequest>({
telephone: '', telephone: '',
content: t('testSmsContent'),
area_code: '1', area_code: '1',
}); });
@ -88,8 +93,8 @@ export default function Page() {
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<Switch <Switch
checked={data?.sms_enabled} checked={data?.enabled}
onCheckedChange={(checked) => updateConfig('sms_enabled', checked)} onCheckedChange={(checked) => updateConfig('enabled', checked)}
disabled={isFetching} disabled={isFetching}
/> />
</TableCell> </TableCell>
@ -103,8 +108,13 @@ export default function Page() {
<EnhancedInput <EnhancedInput
type='number' type='number'
min={0} min={0}
value={data?.sms_expire_time ?? 300} value={data?.config?.expire_time ?? 300}
onValueBlur={(value) => updateConfig('sms_expire_time', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
expire_time: value,
})
}
suffix='S' suffix='S'
disabled={isFetching} disabled={isFetching}
placeholder={t('placeholders.expireTime')} placeholder={t('placeholders.expireTime')}
@ -119,9 +129,14 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
type='number' type='number'
value={data?.sms_interval ?? 60} value={data?.config?.interval ?? 60}
min={0} min={0}
onValueBlur={(value) => updateConfig('sms_interval', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
interval: value,
})
}
suffix='S' suffix='S'
disabled={isFetching} disabled={isFetching}
placeholder={t('placeholders.interval')} placeholder={t('placeholders.interval')}
@ -136,14 +151,48 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
type='number' type='number'
value={data?.sms_limit ?? 20} value={data?.config?.limit ?? 20}
min={0} min={0}
onValueBlur={(value) => updateConfig('sms_limit', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
limit: value,
})
}
disabled={isFetching} disabled={isFetching}
placeholder={t('placeholders.limit')} placeholder={t('placeholders.limit')}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
<TableRow>
<TableCell>
<Label>{t('whitelistValidation')}</Label>
<p className='text-muted-foreground text-xs'>{t('whitelistValidationTip')}</p>
</TableCell>
<TableCell className='text-right'>
<Switch
defaultValue={data?.config?.enable_whitelist}
onCheckedChange={(checked) =>
updateConfig('config', { ...data?.config, enable_whitelist: checked })
}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('whitelistAreaCode')}</Label>
<p className='text-muted-foreground text-xs'>{t('whitelistAreaCodeTip')}</p>
</TableCell>
<TableCell className='w-1/2 text-right'>
<TagInput
placeholder='1, 852, 886, 888'
value={data?.config?.whitelist || []}
onChange={(value) =>
updateConfig('config', { ...data?.config, whitelist: value })
}
/>
</TableCell>
</TableRow>
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('platform')}</Label> <Label>{t('platform')}</Label>
@ -151,8 +200,13 @@ export default function Page() {
</TableCell> </TableCell>
<TableCell className='flex items-center gap-1 text-right'> <TableCell className='flex items-center gap-1 text-right'>
<Select <Select
value={data?.sms_platform} value={data?.platform}
onValueChange={(value) => updateConfig('sms_platform', value)} onValueChange={(value) =>
updateConfig('config', {
...data?.config,
platform: value,
})
}
disabled={isFetching} disabled={isFetching}
> >
<SelectTrigger> <SelectTrigger>
@ -177,70 +231,128 @@ export default function Page() {
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>Key</Label> <Label>{t('accessLabel')}</Label>
<p className='text-muted-foreground text-xs'> <p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.sms_key })} {t('platformConfigTip', { key: platformConfig?.access })}
</p> </p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
value={data?.sms_key ?? ''} value={data?.config?.platform_config.access ?? ''}
onValueBlur={(value) => updateConfig('sms_key', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
access: value,
},
})
}
disabled={isFetching} disabled={isFetching}
placeholder={t('platformConfigTip', { key: platformConfig?.sms_key })} placeholder={t('platformConfigTip', { key: platformConfig?.access })}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
<TableRow> {platformConfig?.endpoint && (
<TableCell>
<Label>Secret</Label>
<p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.sms_secret })}
</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
value={data?.sms_secret ?? ''}
onValueBlur={(value) => updateConfig('sms_secret', value)}
disabled={isFetching}
type='password'
placeholder={t('platformConfigTip', { key: platformConfig?.sms_secret })}
/>
</TableCell>
</TableRow>
{platformConfig?.sms_template_code && (
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('templateCode')}</Label> <Label>{t('endpointLabel')}</Label>
<p className='text-muted-foreground text-xs'> <p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.sms_template_code })} {t('platformConfigTip', { key: platformConfig?.endpoint })}
</p> </p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
value={data?.sms_template_code ?? ''} value={data?.config?.platform_config.endpoint ?? ''}
onValueBlur={(value) => updateConfig('sms_template_code', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
endpoint: value,
},
})
}
disabled={isFetching} disabled={isFetching}
placeholder={t('platformConfigTip', { key: platformConfig?.sms_template_code })} placeholder={t('platformConfigTip', { key: platformConfig?.endpoint })}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
)} )}
{platformConfig?.sms_template_param && ( <TableRow>
<TableCell>
<Label>{t('secretLabel')}</Label>
<p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.secret })}
</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
value={data?.config?.platform_config?.secret ?? ''}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
secret: value,
},
})
}
disabled={isFetching}
type='password'
placeholder={t('platformConfigTip', { key: platformConfig?.secret })}
/>
</TableCell>
</TableRow>
{platformConfig?.template_code && (
<TableRow> <TableRow>
<TableCell> <TableCell>
<Label>{t('templateParam')}</Label> <Label>{t('templateCodeLabel')}</Label>
<p className='text-muted-foreground text-xs'> <p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.sms_template_param })} {t('platformConfigTip', { key: platformConfig?.template_code })}
</p> </p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
value={data?.sms_template_param ?? 'code'} value={data?.config?.platform_config?.template_code ?? 'code'}
onValueBlur={(value) => updateConfig('sms_template_param', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
template_code: value,
},
})
}
disabled={isFetching}
placeholder={t('platformConfigTip', { key: platformConfig?.template_code })}
/>
</TableCell>
</TableRow>
)}
{platformConfig?.sign_name && (
<TableRow>
<TableCell>
<Label>{t('signNameLabel')}</Label>
<p className='text-muted-foreground text-xs'>
{t('platformConfigTip', { key: platformConfig?.sign_name })}
</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
value={data?.config?.platform_config?.sign_name ?? ''}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
sign_name: value,
},
})
}
disabled={isFetching} disabled={isFetching}
placeholder={t('platformConfigTip', { placeholder={t('platformConfigTip', {
key: platformConfig?.sms_template_param, key: platformConfig?.sign_name,
})} })}
/> />
</TableCell> </TableCell>
@ -250,15 +362,23 @@ export default function Page() {
<TableCell> <TableCell>
<Label>{t('template')}</Label> <Label>{t('template')}</Label>
<p className='text-muted-foreground text-xs'> <p className='text-muted-foreground text-xs'>
{t('templateTip', { code: platformConfig?.sms_template })} {t('templateTip', { code: platformConfig?.code_variable })}
</p> </p>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
<Textarea <Textarea
defaultValue={data?.sms_template ?? ''} defaultValue={data?.platform_config?.template ?? ''}
onBlur={(e) => updateConfig('sms_template', e.target.value)} onBlur={(e) =>
updateConfig('config', {
...data?.config,
platform_config: {
...data?.config?.platform_config,
template: e.target.value,
},
})
}
disabled={isFetching} disabled={isFetching}
placeholder={t('placeholders.template', { code: platformConfig?.sms_template })} placeholder={t('placeholders.template', { code: platformConfig?.code_variable })}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>
@ -315,7 +435,7 @@ function LogsTable() {
const ref = useRef<ProTableActions>(null); const ref = useRef<ProTableActions>(null);
return ( return (
<ProTable<API.Sms, { telephone: string }> <ProTable<API.SMS, { telephone: string }>
action={ref} action={ref}
header={{ header={{
title: t('SmsList'), title: t('SmsList'),

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { getOAuthByPlatform, updateOAuthConfig } from '@/services/admin/system'; import { getAuthMethodConfig, updateAuthMethodConfig } from '@/services/admin/authMethod';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Label } from '@workspace/ui/components/label'; import { Label } from '@workspace/ui/components/label';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
@ -13,21 +13,21 @@ export default function Page() {
const t = useTranslations('telegram'); const t = useTranslations('telegram');
const { data, refetch } = useQuery({ const { data, refetch } = useQuery({
queryKey: ['getOAuthByPlatform', 'telegram'], queryKey: ['getAuthMethodConfig', 'telegram'],
queryFn: async () => { queryFn: async () => {
const { data } = await getOAuthByPlatform({ const { data } = await getAuthMethodConfig({
platform: 'telegram', method: 'telegram',
}); });
return data.data; return data.data;
}, },
}); });
async function updateConfig(key: keyof API.UpdateOAuthConfig, value: unknown) { async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
try { try {
await updateOAuthConfig({ await updateAuthMethodConfig({
...data, ...data,
[key]: value, [key]: value,
} as API.UpdateOAuthConfig); } as API.UpdataAuthMethodConfigRequest);
toast.success(t('saveSuccess')); toast.success(t('saveSuccess'));
refetch(); refetch();
} catch (error) { } catch (error) {
@ -94,8 +94,13 @@ export default function Page() {
<TableCell className='text-right'> <TableCell className='text-right'>
<EnhancedInput <EnhancedInput
placeholder='https://your-domain.com/v1/auth/oauth/callback/telegram' placeholder='https://your-domain.com/v1/auth/oauth/callback/telegram'
value={data?.redirect} value={data?.config.redirect_url}
onValueBlur={(value) => updateConfig('redirect', value)} onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
redirect_url: value,
})
}
/> />
</TableCell> </TableCell>
</TableRow> </TableRow>

View File

@ -17,7 +17,7 @@ import { cn } from '@workspace/ui/lib/utils';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@workspace/ui/utils';
import { UserDetail } from '../user/user-detail'; import { UserDetail } from '../user/user-detail';
export default function Page(props: { userId?: string }) { export default function Page(props: any) {
const t = useTranslations('order'); const t = useTranslations('order');
const statusOptions = [ const statusOptions = [

View File

@ -5,7 +5,7 @@ import UserLoginHistory from './user-login-history';
import { UserProfileForm } from './user-profile'; import { UserProfileForm } from './user-profile';
import UserSubscription from './user-subscription'; import UserSubscription from './user-subscription';
export default async function Page({ params }: { params: Promise<{ id: string }> }) { export default async function Page({ params }: { params: Promise<{ id: number }> }) {
const t = await getTranslations('user'); const t = await getTranslations('user');
const { id } = await params; const { id } = await params;
return ( return (

View File

@ -30,12 +30,14 @@ export default function UserSubscription({ userId }: { userId: number }) {
loading={loading} loading={loading}
userId={userId} userId={userId}
onSubmit={async (values) => { onSubmit={async (values) => {
setLoading(true);
await createUserSubscribe({ await createUserSubscribe({
user_id: userId, user_id: userId,
...values, ...values,
}); });
toast.success(t('createSuccess')); toast.success(t('createSuccess'));
ref.current?.refresh(); ref.current?.refresh();
setLoading(false);
return true; return true;
}} }}
/> />
@ -122,6 +124,7 @@ export default function UserSubscription({ userId }: { userId: number }) {
userId={userId} userId={userId}
initialData={row} initialData={row}
onSubmit={async (values) => { onSubmit={async (values) => {
setLoading(true);
await updateUserSubscribe({ await updateUserSubscribe({
user_id: userId, user_id: userId,
user_subscribe_id: row.id, user_subscribe_id: row.id,
@ -129,6 +132,7 @@ export default function UserSubscription({ userId }: { userId: number }) {
}); });
toast.success(t('updateSuccess')); toast.success(t('updateSuccess'));
ref.current?.refresh(); ref.current?.refresh();
setLoading(false);
return true; return true;
}} }}
/>, />,
@ -144,7 +148,7 @@ export default function UserSubscription({ userId }: { userId: number }) {
title={t('confirmDelete')} title={t('confirmDelete')}
description={t('deleteSubscriptionDescription')} description={t('deleteSubscriptionDescription')}
onConfirm={async () => { onConfirm={async () => {
console.log('删除订阅:', row.id); console.log('Delete subscription:', row.id);
}} }}
cancelText={t('cancel')} cancelText={t('cancel')}
confirmText={t('confirm')} confirmText={t('confirm')}

View File

@ -16,23 +16,23 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
site_logo: '', site_logo: '',
}, },
verify: { verify: {
turnstile_site_key: '',
enable_login_verify: false, enable_login_verify: false,
enable_register_verify: false, enable_register_verify: false,
enable_reset_password_verify: false, enable_reset_password_verify: false,
turnstile_site_key: '',
}, },
auth: { auth: {
sms: { mobile: {
sms_enabled: false, enable: false,
sms_limit: 0, limit: 0,
sms_interval: 0, interval: 0,
sms_expire_time: 0, expire_time: 0,
}, },
email: { email: {
email_enabled: false, enable: false,
email_enable_verify: false, enable_verify: false,
email_enable_domain_suffix: false, enable_domain_suffix: false,
email_domain_suffix_list: '', domain_suffix_list: '',
}, },
register: { register: {
stop_register: false, stop_register: false,
@ -42,31 +42,14 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
ip_register_limit_duration: 0, ip_register_limit_duration: 0,
}, },
}, },
register: {
stop_register: false,
enable_email_verify: false,
enable_email_domain_suffix: false,
email_domain_suffix_list: '',
enable_trial: false,
enable_ip_register_limit: false,
ip_register_limit: 0,
ip_register_limit_duration: 0,
sms: {
sms_enabled: false,
sms_limit: 0,
sms_interval: 0,
sms_expire_time: 0,
},
},
invite: { invite: {
forced_invite: false, forced_invite: false,
referral_percentage: 0, referral_percentage: 0,
only_first_purchase: false, only_first_purchase: false,
}, },
currency: { currency: {
currency_unit: 'USD', currency_unit: '',
currency_symbol: '$', currency_symbol: '',
access_key: '',
}, },
subscribe: { subscribe: {
single_model: false, single_model: false,

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Seznam SMS záznamů", "SmsList": "Seznam SMS záznamů",
"accessLabel": "Přístup",
"applyPlatform": "Použít platformu", "applyPlatform": "Použít platformu",
"areaCode": "Směrový kód", "areaCode": "Směrový kód",
"content": "Obsah", "content": "Obsah",
"createdAt": "Čas odeslání", "createdAt": "Čas odeslání",
"enable": "Povolit", "enable": "Povolit",
"enableTip": "Po povolení budou povoleny funkce registrace, přihlášení, připojení a odpojení mobilního telefonu", "enableTip": "Po povolení budou povoleny funkce registrace, přihlášení, připojení a odpojení mobilního telefonu",
"endpointLabel": "Koncový bod",
"expireTime": "Čas vypršení", "expireTime": "Čas vypršení",
"expireTimeTip": "Doba platnosti ověřovacího kódu SMS (v sekundách)", "expireTimeTip": "Doba platnosti ověřovacího kódu SMS (v sekundách)",
"interval": "Interval", "interval": "Interval",
@ -24,18 +26,25 @@
"platformConfigTip": "Vyplňte prosím poskytnutou konfiguraci {key}", "platformConfigTip": "Vyplňte prosím poskytnutou konfiguraci {key}",
"platformTip": "Vyberte prosím platformu pro SMS", "platformTip": "Vyberte prosím platformu pro SMS",
"search": "Vyhledat telefonní číslo", "search": "Vyhledat telefonní číslo",
"secretLabel": "Tajný klíč",
"sendFailed": "Odeslání se nezdařilo", "sendFailed": "Odeslání se nezdařilo",
"sendSuccess": "Úspěšně odesláno", "sendSuccess": "Úspěšně odesláno",
"settings": "Nastavení", "settings": "Nastavení",
"signNameLabel": "Název podpisu",
"status": "Stav", "status": "Stav",
"telephone": "Telefonní číslo", "telephone": "Telefonní číslo",
"template": "Šablona SMS", "template": "Šablona SMS",
"templateCode": "Kód šablony", "templateCode": "Kód šablony",
"templateCodeLabel": "Kód šablony",
"templateParam": "Parametr šablony", "templateParam": "Parametr šablony",
"templateTip": "Vyplňte prosím šablonu SMS, ponechte {code} uprostřed, jinak funkce SMS nebude fungovat", "templateTip": "Vyplňte prosím šablonu SMS, ponechte {code} uprostřed, jinak funkce SMS nebude fungovat",
"testSms": "Odeslat testovací SMS", "testSms": "Odeslat testovací SMS",
"testSmsContent": "Toto je testovací zpráva", "testSmsContent": "Toto je testovací zpráva",
"testSmsPhone": "Zadejte telefonní číslo", "testSmsPhone": "Zadejte telefonní číslo",
"testSmsTip": "Odeslat testovací SMS pro ověření vaší konfigurace", "testSmsTip": "Odeslat testovací SMS pro ověření vaší konfigurace",
"updateSuccess": "Aktualizace úspěšná" "updateSuccess": "Aktualizace úspěšná",
"whitelistAreaCode": "Kód oblasti v bílém seznamu",
"whitelistAreaCodeTip": "Zadejte kódy oblastí v bílém seznamu, např. 1, 852, 886, 888",
"whitelistValidation": "Ověření bílého seznamu",
"whitelistValidationTip": "Pokud je povoleno, mohou SMS odesílat pouze kódy oblastí v bílém seznamu"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS-Protokollliste", "SmsList": "SMS-Protokollliste",
"accessLabel": "Zugriff",
"applyPlatform": "Plattform anwenden", "applyPlatform": "Plattform anwenden",
"areaCode": "Vorwahl", "areaCode": "Vorwahl",
"content": "Inhalt", "content": "Inhalt",
"createdAt": "Sendezeit", "createdAt": "Sendezeit",
"enable": "Aktivieren", "enable": "Aktivieren",
"enableTip": "Nach der Aktivierung werden die Funktionen zur Registrierung, Anmeldung, Bindung und Entbindung von Mobiltelefonen aktiviert", "enableTip": "Nach der Aktivierung werden die Funktionen zur Registrierung, Anmeldung, Bindung und Entbindung von Mobiltelefonen aktiviert",
"endpointLabel": "Endpunkt",
"expireTime": "Ablaufzeit", "expireTime": "Ablaufzeit",
"expireTimeTip": "Gültigkeitsdauer des SMS-Bestätigungscodes (Sekunden)", "expireTimeTip": "Gültigkeitsdauer des SMS-Bestätigungscodes (Sekunden)",
"interval": "Intervall", "interval": "Intervall",
@ -24,18 +26,25 @@
"platformConfigTip": "Bitte füllen Sie die bereitgestellte {key}-Konfiguration aus", "platformConfigTip": "Bitte füllen Sie die bereitgestellte {key}-Konfiguration aus",
"platformTip": "Bitte wählen Sie die SMS-Plattform aus", "platformTip": "Bitte wählen Sie die SMS-Plattform aus",
"search": "Telefonnummer suchen", "search": "Telefonnummer suchen",
"secretLabel": "Geheimnis",
"sendFailed": "Senden fehlgeschlagen", "sendFailed": "Senden fehlgeschlagen",
"sendSuccess": "Erfolgreich gesendet", "sendSuccess": "Erfolgreich gesendet",
"settings": "Einstellungen", "settings": "Einstellungen",
"signNameLabel": "Signaturname",
"status": "Status", "status": "Status",
"telephone": "Telefonnummer", "telephone": "Telefonnummer",
"template": "SMS-Vorlage", "template": "SMS-Vorlage",
"templateCode": "Vorlagen-Code", "templateCode": "Vorlagen-Code",
"templateCodeLabel": "Vorlagen-Code",
"templateParam": "Vorlagenparameter", "templateParam": "Vorlagenparameter",
"templateTip": "Bitte füllen Sie die SMS-Vorlage aus und lassen Sie {code} in der Mitte stehen, da sonst die SMS-Funktion nicht funktioniert.", "templateTip": "Bitte füllen Sie die SMS-Vorlage aus und lassen Sie {code} in der Mitte stehen, da sonst die SMS-Funktion nicht funktioniert.",
"testSms": "Test-SMS senden", "testSms": "Test-SMS senden",
"testSmsContent": "Dies ist eine Testnachricht", "testSmsContent": "Dies ist eine Testnachricht",
"testSmsPhone": "Telefonnummer eingeben", "testSmsPhone": "Telefonnummer eingeben",
"testSmsTip": "Senden Sie eine Test-SMS, um Ihre Konfiguration zu überprüfen", "testSmsTip": "Senden Sie eine Test-SMS, um Ihre Konfiguration zu überprüfen",
"updateSuccess": "Aktualisierung erfolgreich" "updateSuccess": "Aktualisierung erfolgreich",
"whitelistAreaCode": "Whitelist Bereichscode",
"whitelistAreaCodeTip": "Bitte geben Sie die Whitelist Bereichscodes ein, z.B. 1, 852, 886, 888",
"whitelistValidation": "Whitelist Überprüfung",
"whitelistValidationTip": "Wenn aktiviert, können nur Bereichscodes in der Whitelist SMS senden"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS Log List", "SmsList": "SMS Log List",
"accessLabel": "Access",
"applyPlatform": "Apply Platform", "applyPlatform": "Apply Platform",
"areaCode": "Area Code", "areaCode": "Area Code",
"content": "Content", "content": "Content",
"createdAt": "Send Time", "createdAt": "Send Time",
"enable": "Enable", "enable": "Enable",
"enableTip": "After enabling, mobile phone registration, login, binding, and unbinding functions will be enabled", "enableTip": "After enabling, mobile phone registration, login, binding, and unbinding functions will be enabled",
"endpointLabel": "Endpoint",
"expireTime": "Expire Time", "expireTime": "Expire Time",
"expireTimeTip": "SMS verification code validity period (seconds)", "expireTimeTip": "SMS verification code validity period (seconds)",
"interval": "Interval", "interval": "Interval",
@ -24,18 +26,25 @@
"platformConfigTip": "Please fill in the provided {key} configuration", "platformConfigTip": "Please fill in the provided {key} configuration",
"platformTip": "Please select SMS platform", "platformTip": "Please select SMS platform",
"search": "Search phone number", "search": "Search phone number",
"secretLabel": "Secret",
"sendFailed": "Send Failed", "sendFailed": "Send Failed",
"sendSuccess": "Send Success", "sendSuccess": "Send Success",
"settings": "Settings", "settings": "Settings",
"signNameLabel": "Sign Name",
"status": "Status", "status": "Status",
"telephone": "Phone Number", "telephone": "Phone Number",
"template": "SMS Template", "template": "SMS Template",
"templateCode": "Template Code", "templateCode": "Template Code",
"templateCodeLabel": "Template Code",
"templateParam": "Template Parameter", "templateParam": "Template Parameter",
"templateTip": "Please fill in the SMS template, keep {code} in the middle, otherwise SMS function will not work", "templateTip": "Please fill in the SMS template, keep {code} in the middle, otherwise SMS function will not work",
"testSms": "Send Test SMS", "testSms": "Send Test SMS",
"testSmsContent": "This is a test message", "testSmsContent": "This is a test message",
"testSmsPhone": "Enter phone number", "testSmsPhone": "Enter phone number",
"testSmsTip": "Send a test SMS to verify your configuration", "testSmsTip": "Send a test SMS to verify your configuration",
"updateSuccess": "Update Success" "updateSuccess": "Update Success",
"whitelistAreaCode": "Whitelist Area Code",
"whitelistAreaCodeTip": "Please enter whitelist area codes, e.g., 1, 852, 886, 888",
"whitelistValidation": "Whitelist Verification",
"whitelistValidationTip": "When enabled, only area codes in the whitelist can send SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Lista de Registro de SMS", "SmsList": "Lista de Registro de SMS",
"accessLabel": "Acceso",
"applyPlatform": "Aplicar Plataforma", "applyPlatform": "Aplicar Plataforma",
"areaCode": "Código de Área", "areaCode": "Código de Área",
"content": "Contenido", "content": "Contenido",
"createdAt": "Hora de envío", "createdAt": "Hora de envío",
"enable": "Habilitar", "enable": "Habilitar",
"enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil", "enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil",
"endpointLabel": "Punto final",
"expireTime": "Tiempo de Expiración", "expireTime": "Tiempo de Expiración",
"expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)", "expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)",
"interval": "Intervalo", "interval": "Intervalo",
@ -24,18 +26,25 @@
"platformConfigTip": "Por favor, complete la configuración proporcionada de {key}", "platformConfigTip": "Por favor, complete la configuración proporcionada de {key}",
"platformTip": "Por favor, seleccione la plataforma de SMS", "platformTip": "Por favor, seleccione la plataforma de SMS",
"search": "Buscar número de teléfono", "search": "Buscar número de teléfono",
"secretLabel": "Secreto",
"sendFailed": "Envío fallido", "sendFailed": "Envío fallido",
"sendSuccess": "Envío exitoso", "sendSuccess": "Envío exitoso",
"settings": "Configuración", "settings": "Configuración",
"signNameLabel": "Nombre de firma",
"status": "Estado", "status": "Estado",
"telephone": "Número de Teléfono", "telephone": "Número de Teléfono",
"template": "Plantilla de SMS", "template": "Plantilla de SMS",
"templateCode": "Código de Plantilla", "templateCode": "Código de Plantilla",
"templateCodeLabel": "Código de plantilla",
"templateParam": "Parámetro de Plantilla", "templateParam": "Parámetro de Plantilla",
"templateTip": "Por favor, complete la plantilla de SMS, mantenga {code} en el medio, de lo contrario, la función de SMS no funcionará", "templateTip": "Por favor, complete la plantilla de SMS, mantenga {code} en el medio, de lo contrario, la función de SMS no funcionará",
"testSms": "Enviar SMS de prueba", "testSms": "Enviar SMS de prueba",
"testSmsContent": "Este es un mensaje de prueba", "testSmsContent": "Este es un mensaje de prueba",
"testSmsPhone": "Ingrese número de teléfono", "testSmsPhone": "Ingrese número de teléfono",
"testSmsTip": "Envía un SMS de prueba para verificar tu configuración", "testSmsTip": "Envía un SMS de prueba para verificar tu configuración",
"updateSuccess": "Actualización Exitosa" "updateSuccess": "Actualización Exitosa",
"whitelistAreaCode": "Código de área en lista blanca",
"whitelistAreaCodeTip": "Por favor, introduce los códigos de área en la lista blanca, por ejemplo, 1, 852, 886, 888",
"whitelistValidation": "Verificación de lista blanca",
"whitelistValidationTip": "Cuando está habilitado, solo los códigos de área en la lista blanca pueden enviar SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Lista de Registro de SMS", "SmsList": "Lista de Registro de SMS",
"accessLabel": "Acceso",
"applyPlatform": "Aplicar Plataforma", "applyPlatform": "Aplicar Plataforma",
"areaCode": "Código de Área", "areaCode": "Código de Área",
"content": "Contenido", "content": "Contenido",
"createdAt": "Hora de Envío", "createdAt": "Hora de Envío",
"enable": "Habilitar", "enable": "Habilitar",
"enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil", "enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil",
"endpointLabel": "Punto final",
"expireTime": "Tiempo de Expiración", "expireTime": "Tiempo de Expiración",
"expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)", "expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)",
"interval": "Intervalo", "interval": "Intervalo",
@ -24,18 +26,25 @@
"platformConfigTip": "Por favor, complete la configuración proporcionada de {key}", "platformConfigTip": "Por favor, complete la configuración proporcionada de {key}",
"platformTip": "Por favor, seleccione la plataforma de SMS", "platformTip": "Por favor, seleccione la plataforma de SMS",
"search": "Buscar número de teléfono", "search": "Buscar número de teléfono",
"secretLabel": "Secreto",
"sendFailed": "Envío Fallido", "sendFailed": "Envío Fallido",
"sendSuccess": "Envío Exitoso", "sendSuccess": "Envío Exitoso",
"settings": "Configuración", "settings": "Configuración",
"signNameLabel": "Nombre de firma",
"status": "Estado", "status": "Estado",
"telephone": "Número de Teléfono", "telephone": "Número de Teléfono",
"template": "Plantilla de SMS", "template": "Plantilla de SMS",
"templateCode": "Código de Plantilla", "templateCode": "Código de Plantilla",
"templateCodeLabel": "Código de plantilla",
"templateParam": "Parámetro de Plantilla", "templateParam": "Parámetro de Plantilla",
"templateTip": "Por favor, complete la plantilla de SMS, mantenga {code} en el medio, de lo contrario, la función de SMS no funcionará", "templateTip": "Por favor, complete la plantilla de SMS, mantenga {code} en el medio, de lo contrario, la función de SMS no funcionará",
"testSms": "Enviar SMS de Prueba", "testSms": "Enviar SMS de Prueba",
"testSmsContent": "Este es un mensaje de prueba", "testSmsContent": "Este es un mensaje de prueba",
"testSmsPhone": "Ingrese número de teléfono", "testSmsPhone": "Ingrese número de teléfono",
"testSmsTip": "Envía un SMS de prueba para verificar tu configuración", "testSmsTip": "Envía un SMS de prueba para verificar tu configuración",
"updateSuccess": "Actualización Exitosa" "updateSuccess": "Actualización Exitosa",
"whitelistAreaCode": "Código de área en lista blanca",
"whitelistAreaCodeTip": "Por favor ingrese los códigos de área en la lista blanca, ej., 1, 852, 886, 888",
"whitelistValidation": "Verificación de lista blanca",
"whitelistValidationTip": "Cuando está habilitado, solo los códigos de área en la lista blanca pueden enviar SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "لیست گزارش پیامک", "SmsList": "لیست گزارش پیامک",
"accessLabel": "دسترسی",
"applyPlatform": "اعمال پلتفرم", "applyPlatform": "اعمال پلتفرم",
"areaCode": "کد منطقه", "areaCode": "کد منطقه",
"content": "محتوا", "content": "محتوا",
"createdAt": "زمان ارسال", "createdAt": "زمان ارسال",
"enable": "فعال کردن", "enable": "فعال کردن",
"enableTip": "پس از فعال‌سازی، عملکردهای ثبت‌نام، ورود، اتصال و قطع اتصال تلفن همراه فعال خواهند شد", "enableTip": "پس از فعال‌سازی، عملکردهای ثبت‌نام، ورود، اتصال و قطع اتصال تلفن همراه فعال خواهند شد",
"endpointLabel": "نقطه پایانی",
"expireTime": "زمان انقضا", "expireTime": "زمان انقضا",
"expireTimeTip": "مدت اعتبار کد تأیید پیامکی (ثانیه)", "expireTimeTip": "مدت اعتبار کد تأیید پیامکی (ثانیه)",
"interval": "فاصله زمانی", "interval": "فاصله زمانی",
@ -24,18 +26,25 @@
"platformConfigTip": "لطفاً پیکربندی {key} ارائه شده را پر کنید", "platformConfigTip": "لطفاً پیکربندی {key} ارائه شده را پر کنید",
"platformTip": "لطفاً پلتفرم پیامک را انتخاب کنید", "platformTip": "لطفاً پلتفرم پیامک را انتخاب کنید",
"search": "جستجوی شماره تلفن", "search": "جستجوی شماره تلفن",
"secretLabel": "رمز",
"sendFailed": "ارسال ناموفق بود", "sendFailed": "ارسال ناموفق بود",
"sendSuccess": "ارسال موفقیت‌آمیز", "sendSuccess": "ارسال موفقیت‌آمیز",
"settings": "تنظیمات", "settings": "تنظیمات",
"signNameLabel": "نام امضا",
"status": "وضعیت", "status": "وضعیت",
"telephone": "شماره تلفن", "telephone": "شماره تلفن",
"template": "قالب پیامک", "template": "قالب پیامک",
"templateCode": "کد الگو", "templateCode": "کد الگو",
"templateCodeLabel": "کد الگو",
"templateParam": "پارامتر الگو", "templateParam": "پارامتر الگو",
"templateTip": "لطفاً قالب پیامک را پر کنید، {code} را در وسط نگه دارید، در غیر این صورت عملکرد پیامک کار نخواهد کرد", "templateTip": "لطفاً قالب پیامک را پر کنید، {code} را در وسط نگه دارید، در غیر این صورت عملکرد پیامک کار نخواهد کرد",
"testSms": "ارسال پیامک آزمایشی", "testSms": "ارسال پیامک آزمایشی",
"testSmsContent": "این یک پیام آزمایشی است", "testSmsContent": "این یک پیام آزمایشی است",
"testSmsPhone": "شماره تلفن را وارد کنید", "testSmsPhone": "شماره تلفن را وارد کنید",
"testSmsTip": "ارسال یک پیامک آزمایشی برای تأیید تنظیمات شما", "testSmsTip": "ارسال یک پیامک آزمایشی برای تأیید تنظیمات شما",
"updateSuccess": "به‌روزرسانی با موفقیت انجام شد" "updateSuccess": "به‌روزرسانی با موفقیت انجام شد",
"whitelistAreaCode": "کد منطقه لیست سفید",
"whitelistAreaCodeTip": "لطفاً کدهای منطقه لیست سفید را وارد کنید، مثلاً 1، 852، 886، 888",
"whitelistValidation": "تأیید لیست سفید",
"whitelistValidationTip": "زمانی که فعال باشد، فقط کدهای منطقه در لیست سفید می‌توانند پیامک ارسال کنند"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS-luettelolista", "SmsList": "SMS-luettelolista",
"accessLabel": "Pääsy",
"applyPlatform": "Hae alustaa", "applyPlatform": "Hae alustaa",
"areaCode": "Alueen koodi", "areaCode": "Alueen koodi",
"content": "Sisältö", "content": "Sisältö",
"createdAt": "Lähetysaika", "createdAt": "Lähetysaika",
"enable": "Ota käyttöön", "enable": "Ota käyttöön",
"enableTip": "Kun otat tämän käyttöön, matkapuhelimen rekisteröinti-, kirjautumis-, sitomis- ja purkutoiminnot otetaan käyttöön", "enableTip": "Kun otat tämän käyttöön, matkapuhelimen rekisteröinti-, kirjautumis-, sitomis- ja purkutoiminnot otetaan käyttöön",
"endpointLabel": "Päätepiste",
"expireTime": "Vanhentumisaika", "expireTime": "Vanhentumisaika",
"expireTimeTip": "Tekstiviestivarmennuskoodin voimassaoloaika (sekunteina)", "expireTimeTip": "Tekstiviestivarmennuskoodin voimassaoloaika (sekunteina)",
"interval": "Aikaväli", "interval": "Aikaväli",
@ -24,18 +26,25 @@
"platformConfigTip": "Täytä annettu {key} -määritys", "platformConfigTip": "Täytä annettu {key} -määritys",
"platformTip": "Valitse SMS-alusta", "platformTip": "Valitse SMS-alusta",
"search": "Hae puhelinnumeroa", "search": "Hae puhelinnumeroa",
"secretLabel": "Salaisuus",
"sendFailed": "Lähetys epäonnistui", "sendFailed": "Lähetys epäonnistui",
"sendSuccess": "Lähetys onnistui", "sendSuccess": "Lähetys onnistui",
"settings": "Asetukset", "settings": "Asetukset",
"signNameLabel": "Allekirjoitusnimi",
"status": "Tila", "status": "Tila",
"telephone": "Puhelinnumero", "telephone": "Puhelinnumero",
"template": "SMS-malli", "template": "SMS-malli",
"templateCode": "Mallikoodi", "templateCode": "Mallikoodi",
"templateCodeLabel": "Mallikoodi",
"templateParam": "Malliparametri", "templateParam": "Malliparametri",
"templateTip": "Täytä SMS-malli, pidä {code} keskellä, muuten SMS-toiminto ei toimi", "templateTip": "Täytä SMS-malli, pidä {code} keskellä, muuten SMS-toiminto ei toimi",
"testSms": "Lähetä testiviesti", "testSms": "Lähetä testiviesti",
"testSmsContent": "Tämä on testiviesti", "testSmsContent": "Tämä on testiviesti",
"testSmsPhone": "Syötä puhelinnumero", "testSmsPhone": "Syötä puhelinnumero",
"testSmsTip": "Lähetä testiviesti varmistaaksesi asetuksesi", "testSmsTip": "Lähetä testiviesti varmistaaksesi asetuksesi",
"updateSuccess": "Päivitys onnistui" "updateSuccess": "Päivitys onnistui",
"whitelistAreaCode": "Valkoisen listan aluekoodi",
"whitelistAreaCodeTip": "Syötä valkoisen listan aluekoodit, esim. 1, 852, 886, 888",
"whitelistValidation": "Valkoisen listan vahvistus",
"whitelistValidationTip": "Kun tämä on käytössä, vain valkoisen listan aluekoodit voivat lähettää SMS-viestejä"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Liste des journaux SMS", "SmsList": "Liste des journaux SMS",
"accessLabel": "Accès",
"applyPlatform": "Plateforme d'application", "applyPlatform": "Plateforme d'application",
"areaCode": "Indicatif régional", "areaCode": "Indicatif régional",
"content": "Contenu", "content": "Contenu",
"createdAt": "Heure d'envoi", "createdAt": "Heure d'envoi",
"enable": "Activer", "enable": "Activer",
"enableTip": "Après activation, les fonctions d'enregistrement, de connexion, de liaison et de déliaison par téléphone mobile seront activées", "enableTip": "Après activation, les fonctions d'enregistrement, de connexion, de liaison et de déliaison par téléphone mobile seront activées",
"endpointLabel": "Point de terminaison",
"expireTime": "Date d'expiration", "expireTime": "Date d'expiration",
"expireTimeTip": "Période de validité du code de vérification par SMS (secondes)", "expireTimeTip": "Période de validité du code de vérification par SMS (secondes)",
"interval": "Intervalle", "interval": "Intervalle",
@ -24,18 +26,25 @@
"platformConfigTip": "Veuillez remplir la configuration {key} fournie", "platformConfigTip": "Veuillez remplir la configuration {key} fournie",
"platformTip": "Veuillez sélectionner la plateforme SMS", "platformTip": "Veuillez sélectionner la plateforme SMS",
"search": "Rechercher un numéro de téléphone", "search": "Rechercher un numéro de téléphone",
"secretLabel": "Secret",
"sendFailed": "Échec de l'envoi", "sendFailed": "Échec de l'envoi",
"sendSuccess": "Envoi réussi", "sendSuccess": "Envoi réussi",
"settings": "Paramètres", "settings": "Paramètres",
"signNameLabel": "Nom de l'expéditeur",
"status": "Statut", "status": "Statut",
"telephone": "Numéro de téléphone", "telephone": "Numéro de téléphone",
"template": "Modèle SMS", "template": "Modèle SMS",
"templateCode": "Code du modèle", "templateCode": "Code du modèle",
"templateCodeLabel": "Code de modèle",
"templateParam": "Paramètre de Modèle", "templateParam": "Paramètre de Modèle",
"templateTip": "Veuillez remplir le modèle de SMS, gardez {code} au milieu, sinon la fonction SMS ne fonctionnera pas", "templateTip": "Veuillez remplir le modèle de SMS, gardez {code} au milieu, sinon la fonction SMS ne fonctionnera pas",
"testSms": "Envoyer un SMS de test", "testSms": "Envoyer un SMS de test",
"testSmsContent": "Ceci est un message de test", "testSmsContent": "Ceci est un message de test",
"testSmsPhone": "Entrez le numéro de téléphone", "testSmsPhone": "Entrez le numéro de téléphone",
"testSmsTip": "Envoyez un SMS de test pour vérifier votre configuration", "testSmsTip": "Envoyez un SMS de test pour vérifier votre configuration",
"updateSuccess": "Mise à jour réussie" "updateSuccess": "Mise à jour réussie",
"whitelistAreaCode": "Code de zone sur liste blanche",
"whitelistAreaCodeTip": "Veuillez entrer les codes de zone sur liste blanche, par exemple, 1, 852, 886, 888",
"whitelistValidation": "Vérification de la liste blanche",
"whitelistValidationTip": "Lorsqu'elle est activée, seuls les codes de zone figurant sur la liste blanche peuvent envoyer des SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "एसएमएस लॉग सूची", "SmsList": "एसएमएस लॉग सूची",
"accessLabel": "पहुँच",
"applyPlatform": "प्लेटफ़ॉर्म लागू करें", "applyPlatform": "प्लेटफ़ॉर्म लागू करें",
"areaCode": "क्षेत्र कोड", "areaCode": "क्षेत्र कोड",
"content": "सामग्री", "content": "सामग्री",
"createdAt": "भेजने का समय", "createdAt": "भेजने का समय",
"enable": "सक्षम करें", "enable": "सक्षम करें",
"enableTip": "सक्षम करने के बाद, मोबाइल फोन पंजीकरण, लॉगिन, बाइंडिंग, और अनबाइंडिंग कार्यक्षमताएँ सक्षम हो जाएँगी", "enableTip": "सक्षम करने के बाद, मोबाइल फोन पंजीकरण, लॉगिन, बाइंडिंग, और अनबाइंडिंग कार्यक्षमताएँ सक्षम हो जाएँगी",
"endpointLabel": "अंतिम बिंदु",
"expireTime": "समाप्ति समय", "expireTime": "समाप्ति समय",
"expireTimeTip": "एसएमएस सत्यापन कोड की वैधता अवधि (सेकंड)", "expireTimeTip": "एसएमएस सत्यापन कोड की वैधता अवधि (सेकंड)",
"interval": "अंतराल", "interval": "अंतराल",
@ -24,18 +26,25 @@
"platformConfigTip": "कृपया दिए गए {key} कॉन्फ़िगरेशन को भरें", "platformConfigTip": "कृपया दिए गए {key} कॉन्फ़िगरेशन को भरें",
"platformTip": "कृपया एसएमएस प्लेटफ़ॉर्म चुनें", "platformTip": "कृपया एसएमएस प्लेटफ़ॉर्म चुनें",
"search": "फ़ोन नंबर खोजें", "search": "फ़ोन नंबर खोजें",
"secretLabel": "गुप्त",
"sendFailed": "भेजना विफल", "sendFailed": "भेजना विफल",
"sendSuccess": "सफलतापूर्वक भेजा गया", "sendSuccess": "सफलतापूर्वक भेजा गया",
"settings": "सेटिंग्स", "settings": "सेटिंग्स",
"signNameLabel": "साइन नाम",
"status": "स्थिति", "status": "स्थिति",
"telephone": "फ़ोन नंबर", "telephone": "फ़ोन नंबर",
"template": "एसएमएस टेम्पलेट", "template": "एसएमएस टेम्पलेट",
"templateCode": "टेम्पलेट कोड", "templateCode": "टेम्पलेट कोड",
"templateCodeLabel": "टेम्पलेट कोड",
"templateParam": "टेम्पलेट पैरामीटर", "templateParam": "टेम्पलेट पैरामीटर",
"templateTip": "कृपया एसएमएस टेम्पलेट भरें, {code} को बीच में रखें, अन्यथा एसएमएस कार्यक्षमता काम नहीं करेगी", "templateTip": "कृपया एसएमएस टेम्पलेट भरें, {code} को बीच में रखें, अन्यथा एसएमएस कार्यक्षमता काम नहीं करेगी",
"testSms": "परीक्षण एसएमएस भेजें", "testSms": "परीक्षण एसएमएस भेजें",
"testSmsContent": "यह एक परीक्षण संदेश है", "testSmsContent": "यह एक परीक्षण संदेश है",
"testSmsPhone": "फ़ोन नंबर दर्ज करें", "testSmsPhone": "फ़ोन नंबर दर्ज करें",
"testSmsTip": "अपनी कॉन्फ़िगरेशन की पुष्टि करने के लिए एक परीक्षण एसएमएस भेजें", "testSmsTip": "अपनी कॉन्फ़िगरेशन की पुष्टि करने के लिए एक परीक्षण एसएमएस भेजें",
"updateSuccess": "अद्यतन सफल" "updateSuccess": "अद्यतन सफल",
"whitelistAreaCode": "व्हाइटलिस्ट क्षेत्र कोड",
"whitelistAreaCodeTip": "कृपया व्हाइटलिस्ट क्षेत्र कोड दर्ज करें, जैसे, 1, 852, 886, 888",
"whitelistValidation": "व्हाइटलिस्ट सत्यापन",
"whitelistValidationTip": "जब सक्षम किया जाता है, केवल व्हाइटलिस्ट में क्षेत्र कोड एसएमएस भेज सकते हैं"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS naplólista", "SmsList": "SMS naplólista",
"accessLabel": "Hozzáférés",
"applyPlatform": "Alkalmazási Platform", "applyPlatform": "Alkalmazási Platform",
"areaCode": "Körzetszám", "areaCode": "Körzetszám",
"content": "Tartalom", "content": "Tartalom",
"createdAt": "Küldés ideje", "createdAt": "Küldés ideje",
"enable": "Engedélyez", "enable": "Engedélyez",
"enableTip": "A bekapcsolás után a mobiltelefon regisztráció, bejelentkezés, kötés és oldás funkciók elérhetővé válnak", "enableTip": "A bekapcsolás után a mobiltelefon regisztráció, bejelentkezés, kötés és oldás funkciók elérhetővé válnak",
"endpointLabel": "Végpont",
"expireTime": "Lejárati idő", "expireTime": "Lejárati idő",
"expireTimeTip": "Az SMS ellenőrző kód érvényességi ideje (másodpercben)", "expireTimeTip": "Az SMS ellenőrző kód érvényességi ideje (másodpercben)",
"interval": "Intervallum", "interval": "Intervallum",
@ -24,18 +26,25 @@
"platformConfigTip": "Kérjük, töltse ki a megadott {key} konfigurációt", "platformConfigTip": "Kérjük, töltse ki a megadott {key} konfigurációt",
"platformTip": "Kérjük, válassza ki az SMS platformot", "platformTip": "Kérjük, válassza ki az SMS platformot",
"search": "Telefonszám keresése", "search": "Telefonszám keresése",
"secretLabel": "Titok",
"sendFailed": "Küldés sikertelen", "sendFailed": "Küldés sikertelen",
"sendSuccess": "Sikeres küldés", "sendSuccess": "Sikeres küldés",
"settings": "Beállítások", "settings": "Beállítások",
"signNameLabel": "Aláírás Neve",
"status": "Állapot", "status": "Állapot",
"telephone": "Telefonszám", "telephone": "Telefonszám",
"template": "SMS sablon", "template": "SMS sablon",
"templateCode": "Sablon kód", "templateCode": "Sablon kód",
"templateCodeLabel": "Sablon Kód",
"templateParam": "Sablon Paraméter", "templateParam": "Sablon Paraméter",
"templateTip": "Kérjük, töltse ki az SMS sablont, tartsa meg a {code} elemet középen, különben az SMS funkció nem fog működni", "templateTip": "Kérjük, töltse ki az SMS sablont, tartsa meg a {code} elemet középen, különben az SMS funkció nem fog működni",
"testSms": "Teszt SMS küldése", "testSms": "Teszt SMS küldése",
"testSmsContent": "Ez egy tesztüzenet", "testSmsContent": "Ez egy tesztüzenet",
"testSmsPhone": "Adja meg a telefonszámot", "testSmsPhone": "Adja meg a telefonszámot",
"testSmsTip": "Küldjön egy teszt SMS-t a konfiguráció ellenőrzéséhez", "testSmsTip": "Küldjön egy teszt SMS-t a konfiguráció ellenőrzéséhez",
"updateSuccess": "Sikeres frissítés" "updateSuccess": "Sikeres frissítés",
"whitelistAreaCode": "Fehérlista Területi Kód",
"whitelistAreaCodeTip": "Kérjük, adja meg a fehérlista területi kódokat, pl. 1, 852, 886, 888",
"whitelistValidation": "Fehérlista Ellenőrzés",
"whitelistValidationTip": "Ha engedélyezve van, csak a fehérlistán szereplő területi kódok küldhetnek SMS-t"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMSログリスト", "SmsList": "SMSログリスト",
"accessLabel": "アクセス",
"applyPlatform": "プラットフォームを適用", "applyPlatform": "プラットフォームを適用",
"areaCode": "市外局番", "areaCode": "市外局番",
"content": "コンテンツ", "content": "コンテンツ",
"createdAt": "送信時間", "createdAt": "送信時間",
"enable": "有効にする", "enable": "有効にする",
"enableTip": "有効にすると、携帯電話の登録、ログイン、バインド、アンバインド機能が有効になります", "enableTip": "有効にすると、携帯電話の登録、ログイン、バインド、アンバインド機能が有効になります",
"endpointLabel": "エンドポイント",
"expireTime": "有効期限", "expireTime": "有効期限",
"expireTimeTip": "SMS認証コードの有効期間", "expireTimeTip": "SMS認証コードの有効期間",
"interval": "間隔", "interval": "間隔",
@ -24,18 +26,25 @@
"platformConfigTip": "指定された{key}の設定を入力してください", "platformConfigTip": "指定された{key}の設定を入力してください",
"platformTip": "SMSプラットフォームを選択してください", "platformTip": "SMSプラットフォームを選択してください",
"search": "電話番号を検索", "search": "電話番号を検索",
"secretLabel": "シークレット",
"sendFailed": "送信に失敗しました", "sendFailed": "送信に失敗しました",
"sendSuccess": "送信成功", "sendSuccess": "送信成功",
"settings": "設定", "settings": "設定",
"signNameLabel": "サイン名",
"status": "ステータス", "status": "ステータス",
"telephone": "電話番号", "telephone": "電話番号",
"template": "SMSテンプレート", "template": "SMSテンプレート",
"templateCode": "テンプレートコード", "templateCode": "テンプレートコード",
"templateCodeLabel": "テンプレートコード",
"templateParam": "テンプレートパラメータ", "templateParam": "テンプレートパラメータ",
"templateTip": "SMSテンプレートに記入してください。{code}を中央に保持しないと、SMS機能が動作しません。", "templateTip": "SMSテンプレートに記入してください。{code}を中央に保持しないと、SMS機能が動作しません。",
"testSms": "テストSMSを送信", "testSms": "テストSMSを送信",
"testSmsContent": "これはテストメッセージです", "testSmsContent": "これはテストメッセージです",
"testSmsPhone": "電話番号を入力してください", "testSmsPhone": "電話番号を入力してください",
"testSmsTip": "設定を確認するためにテストSMSを送信する", "testSmsTip": "設定を確認するためにテストSMSを送信する",
"updateSuccess": "更新が成功しました" "updateSuccess": "更新が成功しました",
"whitelistAreaCode": "ホワイトリストエリアコード",
"whitelistAreaCodeTip": "ホワイトリストエリアコードを入力してください。例1、852、886、888",
"whitelistValidation": "ホワイトリスト検証",
"whitelistValidationTip": "有効にすると、ホワイトリストにあるエリアコードのみがSMSを送信できます"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS 로그 목록", "SmsList": "SMS 로그 목록",
"accessLabel": "접근",
"applyPlatform": "플랫폼 적용", "applyPlatform": "플랫폼 적용",
"areaCode": "지역 코드", "areaCode": "지역 코드",
"content": "콘텐츠", "content": "콘텐츠",
"createdAt": "전송 시간", "createdAt": "전송 시간",
"enable": "활성화", "enable": "활성화",
"enableTip": "활성화 후, 휴대폰 등록, 로그인, 연결 및 연결 해제 기능이 활성화됩니다", "enableTip": "활성화 후, 휴대폰 등록, 로그인, 연결 및 연결 해제 기능이 활성화됩니다",
"endpointLabel": "엔드포인트",
"expireTime": "만료 시간", "expireTime": "만료 시간",
"expireTimeTip": "SMS 인증 코드 유효 기간 (초)", "expireTimeTip": "SMS 인증 코드 유효 기간 (초)",
"interval": "간격", "interval": "간격",
@ -24,18 +26,25 @@
"platformConfigTip": "제공된 {key} 설정을 입력해 주세요", "platformConfigTip": "제공된 {key} 설정을 입력해 주세요",
"platformTip": "SMS 플랫폼을 선택하세요", "platformTip": "SMS 플랫폼을 선택하세요",
"search": "전화번호 검색", "search": "전화번호 검색",
"secretLabel": "비밀",
"sendFailed": "전송 실패", "sendFailed": "전송 실패",
"sendSuccess": "전송 성공", "sendSuccess": "전송 성공",
"settings": "설정", "settings": "설정",
"signNameLabel": "서명 이름",
"status": "상태", "status": "상태",
"telephone": "전화번호", "telephone": "전화번호",
"template": "SMS 템플릿", "template": "SMS 템플릿",
"templateCode": "템플릿 코드", "templateCode": "템플릿 코드",
"templateCodeLabel": "템플릿 코드",
"templateParam": "템플릿 매개변수", "templateParam": "템플릿 매개변수",
"templateTip": "SMS 템플릿을 작성해 주세요. {code}를 중간에 유지해야 SMS 기능이 작동합니다.", "templateTip": "SMS 템플릿을 작성해 주세요. {code}를 중간에 유지해야 SMS 기능이 작동합니다.",
"testSms": "테스트 SMS 보내기", "testSms": "테스트 SMS 보내기",
"testSmsContent": "이것은 테스트 메시지입니다", "testSmsContent": "이것은 테스트 메시지입니다",
"testSmsPhone": "전화번호를 입력하세요", "testSmsPhone": "전화번호를 입력하세요",
"testSmsTip": "구성을 확인하기 위해 테스트 SMS를 전송하세요", "testSmsTip": "구성을 확인하기 위해 테스트 SMS를 전송하세요",
"updateSuccess": "업데이트 성공" "updateSuccess": "업데이트 성공",
"whitelistAreaCode": "허용된 지역 코드",
"whitelistAreaCodeTip": "허용된 지역 코드를 입력하세요. 예: 1, 852, 886, 888",
"whitelistValidation": "허용 목록 검증",
"whitelistValidationTip": "활성화되면, 허용 목록에 있는 지역 코드만 SMS를 보낼 수 있습니다."
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS-loggliste", "SmsList": "SMS-loggliste",
"accessLabel": "Tilgang",
"applyPlatform": "Søk Plattform", "applyPlatform": "Søk Plattform",
"areaCode": "Retningsnummer", "areaCode": "Retningsnummer",
"content": "Innhold", "content": "Innhold",
"createdAt": "Sendetid", "createdAt": "Sendetid",
"enable": "Aktiver", "enable": "Aktiver",
"enableTip": "Etter aktivering vil funksjonene for registrering, innlogging, binding og frakobling av mobiltelefon bli aktivert", "enableTip": "Etter aktivering vil funksjonene for registrering, innlogging, binding og frakobling av mobiltelefon bli aktivert",
"endpointLabel": "Endepunkt",
"expireTime": "Utløpstid", "expireTime": "Utløpstid",
"expireTimeTip": "Gyldighetsperiode for SMS-bekreftelseskode (sekunder)", "expireTimeTip": "Gyldighetsperiode for SMS-bekreftelseskode (sekunder)",
"interval": "Intervall", "interval": "Intervall",
@ -24,18 +26,25 @@
"platformConfigTip": "Vennligst fyll inn den oppgitte {key} konfigurasjonen", "platformConfigTip": "Vennligst fyll inn den oppgitte {key} konfigurasjonen",
"platformTip": "Vennligst velg SMS-plattform", "platformTip": "Vennligst velg SMS-plattform",
"search": "Søk telefonnummer", "search": "Søk telefonnummer",
"secretLabel": "Hemmelighet",
"sendFailed": "Sending mislyktes", "sendFailed": "Sending mislyktes",
"sendSuccess": "Sendt Vellykket", "sendSuccess": "Sendt Vellykket",
"settings": "Innstillinger", "settings": "Innstillinger",
"signNameLabel": "Signaturnavn",
"status": "Status", "status": "Status",
"telephone": "Telefonnummer", "telephone": "Telefonnummer",
"template": "SMS-mal", "template": "SMS-mal",
"templateCode": "Malkode", "templateCode": "Malkode",
"templateCodeLabel": "Malekode",
"templateParam": "Malparameter", "templateParam": "Malparameter",
"templateTip": "Vennligst fyll ut SMS-malen, behold {code} i midten, ellers vil ikke SMS-funksjonen fungere", "templateTip": "Vennligst fyll ut SMS-malen, behold {code} i midten, ellers vil ikke SMS-funksjonen fungere",
"testSms": "Send test-SMS", "testSms": "Send test-SMS",
"testSmsContent": "Dette er en testmelding", "testSmsContent": "Dette er en testmelding",
"testSmsPhone": "Skriv inn telefonnummer", "testSmsPhone": "Skriv inn telefonnummer",
"testSmsTip": "Send en test-SMS for å verifisere konfigurasjonen din", "testSmsTip": "Send en test-SMS for å verifisere konfigurasjonen din",
"updateSuccess": "Oppdatering Vellykket" "updateSuccess": "Oppdatering Vellykket",
"whitelistAreaCode": "Hviteliste områdekode",
"whitelistAreaCodeTip": "Vennligst skriv inn hviteliste områdekoder, f.eks. 1, 852, 886, 888",
"whitelistValidation": "Hviteliste verifisering",
"whitelistValidationTip": "Når aktivert, kan kun områdekoder i hvitelisten sende SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Lista dziennika SMS", "SmsList": "Lista dziennika SMS",
"accessLabel": "Dostęp",
"applyPlatform": "Zastosuj Platformę", "applyPlatform": "Zastosuj Platformę",
"areaCode": "Kod obszaru", "areaCode": "Kod obszaru",
"content": "Treść", "content": "Treść",
"createdAt": "Czas wysłania", "createdAt": "Czas wysłania",
"enable": "Włącz", "enable": "Włącz",
"enableTip": "Po włączeniu zostaną aktywowane funkcje rejestracji, logowania, wiązania i odwiązywania telefonu komórkowego", "enableTip": "Po włączeniu zostaną aktywowane funkcje rejestracji, logowania, wiązania i odwiązywania telefonu komórkowego",
"endpointLabel": "Punkt końcowy",
"expireTime": "Czas wygaśnięcia", "expireTime": "Czas wygaśnięcia",
"expireTimeTip": "Okres ważności kodu weryfikacyjnego SMS (sekundy)", "expireTimeTip": "Okres ważności kodu weryfikacyjnego SMS (sekundy)",
"interval": "Interwał", "interval": "Interwał",
@ -24,18 +26,25 @@
"platformConfigTip": "Proszę wypełnić podaną konfigurację {key}", "platformConfigTip": "Proszę wypełnić podaną konfigurację {key}",
"platformTip": "Proszę wybrać platformę SMS", "platformTip": "Proszę wybrać platformę SMS",
"search": "Wyszukaj numer telefonu", "search": "Wyszukaj numer telefonu",
"secretLabel": "Sekret",
"sendFailed": "Wysyłanie nie powiodło się", "sendFailed": "Wysyłanie nie powiodło się",
"sendSuccess": "Wysłano pomyślnie", "sendSuccess": "Wysłano pomyślnie",
"settings": "Ustawienia", "settings": "Ustawienia",
"signNameLabel": "Nazwa podpisu",
"status": "Status", "status": "Status",
"telephone": "Numer telefonu", "telephone": "Numer telefonu",
"template": "Szablon SMS", "template": "Szablon SMS",
"templateCode": "Kod szablonu", "templateCode": "Kod szablonu",
"templateCodeLabel": "Kod szablonu",
"templateParam": "Parametr Szablonu", "templateParam": "Parametr Szablonu",
"templateTip": "Proszę wypełnić szablon SMS, zachowując {code} w środku, w przeciwnym razie funkcja SMS nie będzie działać", "templateTip": "Proszę wypełnić szablon SMS, zachowując {code} w środku, w przeciwnym razie funkcja SMS nie będzie działać",
"testSms": "Wyślij testowy SMS", "testSms": "Wyślij testowy SMS",
"testSmsContent": "To jest wiadomość testowa", "testSmsContent": "To jest wiadomość testowa",
"testSmsPhone": "Wprowadź numer telefonu", "testSmsPhone": "Wprowadź numer telefonu",
"testSmsTip": "Wyślij testowy SMS, aby zweryfikować swoją konfigurację", "testSmsTip": "Wyślij testowy SMS, aby zweryfikować swoją konfigurację",
"updateSuccess": "Aktualizacja zakończona pomyślnie" "updateSuccess": "Aktualizacja zakończona pomyślnie",
"whitelistAreaCode": "Kod obszaru białej listy",
"whitelistAreaCodeTip": "Proszę wprowadzić kody obszarów białej listy, np. 1, 852, 886, 888",
"whitelistValidation": "Weryfikacja białej listy",
"whitelistValidationTip": "Po włączeniu, tylko kody obszarów na białej liście mogą wysyłać SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Lista de Registro de SMS", "SmsList": "Lista de Registro de SMS",
"accessLabel": "Acesso",
"applyPlatform": "Aplicar Plataforma", "applyPlatform": "Aplicar Plataforma",
"areaCode": "Código de Área", "areaCode": "Código de Área",
"content": "Conteúdo", "content": "Conteúdo",
"createdAt": "Hora de Envio", "createdAt": "Hora de Envio",
"enable": "Habilitar", "enable": "Habilitar",
"enableTip": "Após a ativação, as funções de registro, login, vinculação e desvinculação de telefone celular serão ativadas", "enableTip": "Após a ativação, as funções de registro, login, vinculação e desvinculação de telefone celular serão ativadas",
"endpointLabel": "Endpoint",
"expireTime": "Tempo de Expiração", "expireTime": "Tempo de Expiração",
"expireTimeTip": "Período de validade do código de verificação por SMS (segundos)", "expireTimeTip": "Período de validade do código de verificação por SMS (segundos)",
"interval": "Intervalo", "interval": "Intervalo",
@ -24,18 +26,25 @@
"platformConfigTip": "Por favor, preencha a configuração fornecida {key}", "platformConfigTip": "Por favor, preencha a configuração fornecida {key}",
"platformTip": "Por favor, selecione a plataforma de SMS", "platformTip": "Por favor, selecione a plataforma de SMS",
"search": "Pesquisar número de telefone", "search": "Pesquisar número de telefone",
"secretLabel": "Segredo",
"sendFailed": "Envio Falhou", "sendFailed": "Envio Falhou",
"sendSuccess": "Envio bem-sucedido", "sendSuccess": "Envio bem-sucedido",
"settings": "Configurações", "settings": "Configurações",
"signNameLabel": "Nome da Assinatura",
"status": "Status", "status": "Status",
"telephone": "Número de Telefone", "telephone": "Número de Telefone",
"template": "Modelo de SMS", "template": "Modelo de SMS",
"templateCode": "Código do Modelo", "templateCode": "Código do Modelo",
"templateCodeLabel": "Código do Modelo",
"templateParam": "Parâmetro de Modelo", "templateParam": "Parâmetro de Modelo",
"templateTip": "Por favor, preencha o modelo de SMS, mantenha {code} no meio, caso contrário, a função de SMS não funcionará", "templateTip": "Por favor, preencha o modelo de SMS, mantenha {code} no meio, caso contrário, a função de SMS não funcionará",
"testSms": "Enviar SMS de Teste", "testSms": "Enviar SMS de Teste",
"testSmsContent": "Esta é uma mensagem de teste", "testSmsContent": "Esta é uma mensagem de teste",
"testSmsPhone": "Digite o número de telefone", "testSmsPhone": "Digite o número de telefone",
"testSmsTip": "Envie um SMS de teste para verificar sua configuração", "testSmsTip": "Envie um SMS de teste para verificar sua configuração",
"updateSuccess": "Atualização bem-sucedida" "updateSuccess": "Atualização bem-sucedida",
"whitelistAreaCode": "Código de Área da Lista Branca",
"whitelistAreaCodeTip": "Por favor, insira os códigos de área da lista branca, ex: 1, 852, 886, 888",
"whitelistValidation": "Verificação da Lista Branca",
"whitelistValidationTip": "Quando ativado, apenas os códigos de área na lista branca podem enviar SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Listă Jurnal SMS", "SmsList": "Listă Jurnal SMS",
"accessLabel": "Acces",
"applyPlatform": "Aplică Platformă", "applyPlatform": "Aplică Platformă",
"areaCode": "Prefix telefonic", "areaCode": "Prefix telefonic",
"content": "Conținut", "content": "Conținut",
"createdAt": "Ora trimiterii", "createdAt": "Ora trimiterii",
"enable": "Activează", "enable": "Activează",
"enableTip": "După activare, funcțiile de înregistrare, autentificare, asociere și disociere a telefonului mobil vor fi activate", "enableTip": "După activare, funcțiile de înregistrare, autentificare, asociere și disociere a telefonului mobil vor fi activate",
"endpointLabel": "Punct de acces",
"expireTime": "Timp de expirare", "expireTime": "Timp de expirare",
"expireTimeTip": "Perioada de valabilitate a codului de verificare prin SMS (secunde)", "expireTimeTip": "Perioada de valabilitate a codului de verificare prin SMS (secunde)",
"interval": "Interval", "interval": "Interval",
@ -24,18 +26,25 @@
"platformConfigTip": "Vă rugăm să completați configurația {key} furnizată", "platformConfigTip": "Vă rugăm să completați configurația {key} furnizată",
"platformTip": "Vă rugăm să selectați platforma SMS", "platformTip": "Vă rugăm să selectați platforma SMS",
"search": "Caută număr de telefon", "search": "Caută număr de telefon",
"secretLabel": "Secret",
"sendFailed": "Trimitere eșuată", "sendFailed": "Trimitere eșuată",
"sendSuccess": "Trimitere reușită", "sendSuccess": "Trimitere reușită",
"settings": "Setări", "settings": "Setări",
"signNameLabel": "Nume semnătură",
"status": "Stare", "status": "Stare",
"telephone": "Număr de telefon", "telephone": "Număr de telefon",
"template": "Șablon SMS", "template": "Șablon SMS",
"templateCode": "Cod Șablon", "templateCode": "Cod Șablon",
"templateCodeLabel": "Cod șablon",
"templateParam": "Parametru Șablon", "templateParam": "Parametru Șablon",
"templateTip": "Vă rugăm să completați șablonul SMS, păstrați {code} în mijloc, altfel funcția SMS nu va funcționa", "templateTip": "Vă rugăm să completați șablonul SMS, păstrați {code} în mijloc, altfel funcția SMS nu va funcționa",
"testSms": "Trimite SMS de test", "testSms": "Trimite SMS de test",
"testSmsContent": "Acesta este un mesaj de test", "testSmsContent": "Acesta este un mesaj de test",
"testSmsPhone": "Introduceți numărul de telefon", "testSmsPhone": "Introduceți numărul de telefon",
"testSmsTip": "Trimite un SMS de test pentru a verifica configurația ta", "testSmsTip": "Trimite un SMS de test pentru a verifica configurația ta",
"updateSuccess": "Actualizare reușită" "updateSuccess": "Actualizare reușită",
"whitelistAreaCode": "Coduri de zonă pe lista albă",
"whitelistAreaCodeTip": "Vă rugăm să introduceți codurile de zonă pe lista albă, de exemplu, 1, 852, 886, 888",
"whitelistValidation": "Verificare listă albă",
"whitelistValidationTip": "Când este activat, doar codurile de zonă din lista albă pot trimite SMS-uri"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Список журнала SMS", "SmsList": "Список журнала SMS",
"accessLabel": "Доступ",
"applyPlatform": "Применить платформу", "applyPlatform": "Применить платформу",
"areaCode": "Код региона", "areaCode": "Код региона",
"content": "Содержание", "content": "Содержание",
"createdAt": "Время отправки", "createdAt": "Время отправки",
"enable": "Включить", "enable": "Включить",
"enableTip": "После включения будут доступны функции регистрации, входа, привязки и отвязки мобильного телефона", "enableTip": "После включения будут доступны функции регистрации, входа, привязки и отвязки мобильного телефона",
"endpointLabel": "Конечная точка",
"expireTime": "Время истечения", "expireTime": "Время истечения",
"expireTimeTip": "Срок действия кода подтверждения по SMS (в секундах)", "expireTimeTip": "Срок действия кода подтверждения по SMS (в секундах)",
"interval": "Интервал", "interval": "Интервал",
@ -24,18 +26,25 @@
"platformConfigTip": "Пожалуйста, заполните предоставленную конфигурацию {key}", "platformConfigTip": "Пожалуйста, заполните предоставленную конфигурацию {key}",
"platformTip": "Пожалуйста, выберите платформу SMS", "platformTip": "Пожалуйста, выберите платформу SMS",
"search": "Поиск номера телефона", "search": "Поиск номера телефона",
"secretLabel": "Секрет",
"sendFailed": "Не удалось отправить", "sendFailed": "Не удалось отправить",
"sendSuccess": "Успешно отправлено", "sendSuccess": "Успешно отправлено",
"settings": "Настройки", "settings": "Настройки",
"signNameLabel": "Имя подписи",
"status": "Статус", "status": "Статус",
"telephone": "Номер телефона", "telephone": "Номер телефона",
"template": "Шаблон SMS", "template": "Шаблон SMS",
"templateCode": "Код шаблона", "templateCode": "Код шаблона",
"templateCodeLabel": "Код шаблона",
"templateParam": "Параметр шаблона", "templateParam": "Параметр шаблона",
"templateTip": "Пожалуйста, заполните шаблон SMS, оставьте {code} в середине, иначе функция SMS не будет работать", "templateTip": "Пожалуйста, заполните шаблон SMS, оставьте {code} в середине, иначе функция SMS не будет работать",
"testSms": "Отправить тестовое SMS", "testSms": "Отправить тестовое SMS",
"testSmsContent": "Это тестовое сообщение", "testSmsContent": "Это тестовое сообщение",
"testSmsPhone": "Введите номер телефона", "testSmsPhone": "Введите номер телефона",
"testSmsTip": "Отправьте тестовое SMS, чтобы проверить вашу конфигурацию", "testSmsTip": "Отправьте тестовое SMS, чтобы проверить вашу конфигурацию",
"updateSuccess": "Обновление успешно" "updateSuccess": "Обновление успешно",
"whitelistAreaCode": "Код региона в белом списке",
"whitelistAreaCodeTip": "Пожалуйста, введите коды регионов в белом списке, например, 1, 852, 886, 888",
"whitelistValidation": "Проверка белого списка",
"whitelistValidationTip": "При включении только коды регионов из белого списка могут отправлять SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "รายการบันทึก SMS", "SmsList": "รายการบันทึก SMS",
"accessLabel": "การเข้าถึง",
"applyPlatform": "สมัครแพลตฟอร์ม", "applyPlatform": "สมัครแพลตฟอร์ม",
"areaCode": "รหัสพื้นที่", "areaCode": "รหัสพื้นที่",
"content": "เนื้อหา", "content": "เนื้อหา",
"createdAt": "เวลาที่ส่ง", "createdAt": "เวลาที่ส่ง",
"enable": "เปิดใช้งาน", "enable": "เปิดใช้งาน",
"enableTip": "หลังจากเปิดใช้งานแล้ว ฟังก์ชันการลงทะเบียน การเข้าสู่ระบบ การผูก และการยกเลิกการผูกโทรศัพท์มือถือจะถูกเปิดใช้งาน", "enableTip": "หลังจากเปิดใช้งานแล้ว ฟังก์ชันการลงทะเบียน การเข้าสู่ระบบ การผูก และการยกเลิกการผูกโทรศัพท์มือถือจะถูกเปิดใช้งาน",
"endpointLabel": "จุดสิ้นสุด",
"expireTime": "เวลาหมดอายุ", "expireTime": "เวลาหมดอายุ",
"expireTimeTip": "ระยะเวลาหมดอายุของรหัสยืนยันทาง SMS (วินาที)", "expireTimeTip": "ระยะเวลาหมดอายุของรหัสยืนยันทาง SMS (วินาที)",
"interval": "ช่วงเวลา", "interval": "ช่วงเวลา",
@ -24,18 +26,25 @@
"platformConfigTip": "กรุณากรอกการตั้งค่าที่ให้ไว้ {key}", "platformConfigTip": "กรุณากรอกการตั้งค่าที่ให้ไว้ {key}",
"platformTip": "กรุณาเลือกแพลตฟอร์ม SMS", "platformTip": "กรุณาเลือกแพลตฟอร์ม SMS",
"search": "ค้นหาเบอร์โทรศัพท์", "search": "ค้นหาเบอร์โทรศัพท์",
"secretLabel": "ความลับ",
"sendFailed": "ส่งไม่สำเร็จ", "sendFailed": "ส่งไม่สำเร็จ",
"sendSuccess": "ส่งสำเร็จ", "sendSuccess": "ส่งสำเร็จ",
"settings": "การตั้งค่า", "settings": "การตั้งค่า",
"signNameLabel": "ชื่อผู้ลงนาม",
"status": "สถานะ", "status": "สถานะ",
"telephone": "หมายเลขโทรศัพท์", "telephone": "หมายเลขโทรศัพท์",
"template": "เทมเพลต SMS", "template": "เทมเพลต SMS",
"templateCode": "รหัสเทมเพลต", "templateCode": "รหัสเทมเพลต",
"templateCodeLabel": "รหัสแม่แบบ",
"templateParam": "พารามิเตอร์แม่แบบ", "templateParam": "พารามิเตอร์แม่แบบ",
"templateTip": "กรุณากรอกเทมเพลต SMS โดยคง {code} ไว้ตรงกลาง มิฉะนั้นฟังก์ชัน SMS จะไม่ทำงาน", "templateTip": "กรุณากรอกเทมเพลต SMS โดยคง {code} ไว้ตรงกลาง มิฉะนั้นฟังก์ชัน SMS จะไม่ทำงาน",
"testSms": "ส่ง SMS ทดสอบ", "testSms": "ส่ง SMS ทดสอบ",
"testSmsContent": "นี่คือข้อความทดสอบ", "testSmsContent": "นี่คือข้อความทดสอบ",
"testSmsPhone": "กรุณาใส่หมายเลขโทรศัพท์", "testSmsPhone": "กรุณาใส่หมายเลขโทรศัพท์",
"testSmsTip": "ส่ง SMS ทดสอบเพื่อตรวจสอบการตั้งค่าของคุณ", "testSmsTip": "ส่ง SMS ทดสอบเพื่อตรวจสอบการตั้งค่าของคุณ",
"updateSuccess": "อัปเดตสำเร็จ" "updateSuccess": "อัปเดตสำเร็จ",
"whitelistAreaCode": "รหัสพื้นที่ในรายการอนุญาต",
"whitelistAreaCodeTip": "กรุณาใส่รหัสพื้นที่ในรายการอนุญาต เช่น 1, 852, 886, 888",
"whitelistValidation": "การตรวจสอบรายการอนุญาต",
"whitelistValidationTip": "เมื่อเปิดใช้งาน จะอนุญาตให้ส่ง SMS เฉพาะรหัสพื้นที่ในรายการอนุญาตเท่านั้น"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS Günlük Listesi", "SmsList": "SMS Günlük Listesi",
"accessLabel": "Erişim",
"applyPlatform": "Platforma Başvur", "applyPlatform": "Platforma Başvur",
"areaCode": "Alan Kodu", "areaCode": "Alan Kodu",
"content": "İçerik", "content": "İçerik",
"createdAt": "Gönderim Zamanı", "createdAt": "Gönderim Zamanı",
"enable": "Etkinleştir", "enable": "Etkinleştir",
"enableTip": "Etkinleştirildikten sonra, cep telefonu kaydı, giriş, bağlama ve bağlantı kesme işlevleri etkinleştirilecektir", "enableTip": "Etkinleştirildikten sonra, cep telefonu kaydı, giriş, bağlama ve bağlantı kesme işlevleri etkinleştirilecektir",
"endpointLabel": "Uç Nokta",
"expireTime": "Sona Erme Süresi", "expireTime": "Sona Erme Süresi",
"expireTimeTip": "SMS doğrulama kodu geçerlilik süresi (saniye)", "expireTimeTip": "SMS doğrulama kodu geçerlilik süresi (saniye)",
"interval": "Aralık", "interval": "Aralık",
@ -24,18 +26,25 @@
"platformConfigTip": "Lütfen sağlanan {key} yapılandırmasını doldurun", "platformConfigTip": "Lütfen sağlanan {key} yapılandırmasını doldurun",
"platformTip": "Lütfen SMS platformunu seçin", "platformTip": "Lütfen SMS platformunu seçin",
"search": "Telefon numarası ara", "search": "Telefon numarası ara",
"secretLabel": "Gizli Anahtar",
"sendFailed": "Gönderim Başarısız", "sendFailed": "Gönderim Başarısız",
"sendSuccess": "Gönderim Başarılı", "sendSuccess": "Gönderim Başarılı",
"settings": "Ayarlar", "settings": "Ayarlar",
"signNameLabel": "İmza Adı",
"status": "Durum", "status": "Durum",
"telephone": "Telefon Numarası", "telephone": "Telefon Numarası",
"template": "SMS Şablonu", "template": "SMS Şablonu",
"templateCode": "Şablon Kodu", "templateCode": "Şablon Kodu",
"templateCodeLabel": "Şablon Kodu",
"templateParam": "Şablon Parametresi", "templateParam": "Şablon Parametresi",
"templateTip": "Lütfen SMS şablonunu doldurun, {code} ortada kalacak şekilde, aksi takdirde SMS işlevi çalışmaz", "templateTip": "Lütfen SMS şablonunu doldurun, {code} ortada kalacak şekilde, aksi takdirde SMS işlevi çalışmaz",
"testSms": "Test SMS Gönder", "testSms": "Test SMS Gönder",
"testSmsContent": "Bu bir test mesajıdır", "testSmsContent": "Bu bir test mesajıdır",
"testSmsPhone": "Telefon numarasını girin", "testSmsPhone": "Telefon numarasını girin",
"testSmsTip": "Yapılandırmanızı doğrulamak için bir test SMS'i gönderin", "testSmsTip": "Yapılandırmanızı doğrulamak için bir test SMS'i gönderin",
"updateSuccess": "Güncelleme Başarılı" "updateSuccess": "Güncelleme Başarılı",
"whitelistAreaCode": "Beyaz Liste Alan Kodu",
"whitelistAreaCodeTip": "Lütfen beyaz liste alan kodlarını girin, örneğin, 1, 852, 886, 888",
"whitelistValidation": "Beyaz Liste Doğrulaması",
"whitelistValidationTip": "Etkinleştirildiğinde, yalnızca beyaz listedeki alan kodları SMS gönderebilir"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Список журналу SMS", "SmsList": "Список журналу SMS",
"accessLabel": "Доступ",
"applyPlatform": "Застосувати платформу", "applyPlatform": "Застосувати платформу",
"areaCode": "Код регіону", "areaCode": "Код регіону",
"content": "Зміст", "content": "Зміст",
"createdAt": "Час відправлення", "createdAt": "Час відправлення",
"enable": "Увімкнути", "enable": "Увімкнути",
"enableTip": "Після увімкнення будуть доступні функції реєстрації, входу, прив'язки та відв'язки мобільного телефону", "enableTip": "Після увімкнення будуть доступні функції реєстрації, входу, прив'язки та відв'язки мобільного телефону",
"endpointLabel": "Кінцева точка",
"expireTime": "Час закінчення", "expireTime": "Час закінчення",
"expireTimeTip": "Термін дії коду перевірки SMS (секунди)", "expireTimeTip": "Термін дії коду перевірки SMS (секунди)",
"interval": "Інтервал", "interval": "Інтервал",
@ -24,18 +26,25 @@
"platformConfigTip": "Будь ласка, заповніть надану конфігурацію {key}", "platformConfigTip": "Будь ласка, заповніть надану конфігурацію {key}",
"platformTip": "Будь ласка, виберіть платформу SMS", "platformTip": "Будь ласка, виберіть платформу SMS",
"search": "Пошук номера телефону", "search": "Пошук номера телефону",
"secretLabel": "Секрет",
"sendFailed": "Не вдалося надіслати", "sendFailed": "Не вдалося надіслати",
"sendSuccess": "Відправлено успішно", "sendSuccess": "Відправлено успішно",
"settings": "Налаштування", "settings": "Налаштування",
"signNameLabel": "Назва підпису",
"status": "Статус", "status": "Статус",
"telephone": "Номер телефону", "telephone": "Номер телефону",
"template": "Шаблон SMS", "template": "Шаблон SMS",
"templateCode": "Код шаблону", "templateCode": "Код шаблону",
"templateCodeLabel": "Код шаблону",
"templateParam": "Параметр Шаблону", "templateParam": "Параметр Шаблону",
"templateTip": "Будь ласка, заповніть шаблон SMS, залиште {code} посередині, інакше функція SMS не працюватиме", "templateTip": "Будь ласка, заповніть шаблон SMS, залиште {code} посередині, інакше функція SMS не працюватиме",
"testSms": "Надіслати тестове SMS", "testSms": "Надіслати тестове SMS",
"testSmsContent": "Це тестове повідомлення", "testSmsContent": "Це тестове повідомлення",
"testSmsPhone": "Введіть номер телефону", "testSmsPhone": "Введіть номер телефону",
"testSmsTip": "Надіслати тестове SMS, щоб перевірити вашу конфігурацію", "testSmsTip": "Надіслати тестове SMS, щоб перевірити вашу конфігурацію",
"updateSuccess": "Оновлення успішне" "updateSuccess": "Оновлення успішне",
"whitelistAreaCode": "Код області білого списку",
"whitelistAreaCodeTip": "Будь ласка, введіть коди областей білого списку, наприклад, 1, 852, 886, 888",
"whitelistValidation": "Перевірка білого списку",
"whitelistValidationTip": "При увімкненні лише коди областей у білому списку можуть надсилати SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "Danh sách nhật ký SMS", "SmsList": "Danh sách nhật ký SMS",
"accessLabel": "Truy cập",
"applyPlatform": "Nền tảng ứng dụng", "applyPlatform": "Nền tảng ứng dụng",
"areaCode": "Mã vùng", "areaCode": "Mã vùng",
"content": "Nội dung", "content": "Nội dung",
"createdAt": "Thời gian gửi", "createdAt": "Thời gian gửi",
"enable": "Kích hoạt", "enable": "Kích hoạt",
"enableTip": "Sau khi kích hoạt, các chức năng đăng ký, đăng nhập, liên kết và hủy liên kết điện thoại di động sẽ được kích hoạt", "enableTip": "Sau khi kích hoạt, các chức năng đăng ký, đăng nhập, liên kết và hủy liên kết điện thoại di động sẽ được kích hoạt",
"endpointLabel": "Điểm cuối",
"expireTime": "Thời Gian Hết Hạn", "expireTime": "Thời Gian Hết Hạn",
"expireTimeTip": "Thời gian hiệu lực của mã xác minh SMS (giây)", "expireTimeTip": "Thời gian hiệu lực của mã xác minh SMS (giây)",
"interval": "Khoảng thời gian", "interval": "Khoảng thời gian",
@ -24,18 +26,25 @@
"platformConfigTip": "Vui lòng điền vào cấu hình {key} được cung cấp", "platformConfigTip": "Vui lòng điền vào cấu hình {key} được cung cấp",
"platformTip": "Vui lòng chọn nền tảng SMS", "platformTip": "Vui lòng chọn nền tảng SMS",
"search": "Tìm số điện thoại", "search": "Tìm số điện thoại",
"secretLabel": "Mật khẩu",
"sendFailed": "Gửi Thất Bại", "sendFailed": "Gửi Thất Bại",
"sendSuccess": "Gửi thành công", "sendSuccess": "Gửi thành công",
"settings": "Cài đặt", "settings": "Cài đặt",
"signNameLabel": "Tên ký hiệu",
"status": "Trạng thái", "status": "Trạng thái",
"telephone": "Số điện thoại", "telephone": "Số điện thoại",
"template": "Mẫu SMS", "template": "Mẫu SMS",
"templateCode": "Mã Mẫu", "templateCode": "Mã Mẫu",
"templateCodeLabel": "Mã mẫu",
"templateParam": "Tham số Mẫu", "templateParam": "Tham số Mẫu",
"templateTip": "Vui lòng điền vào mẫu SMS, giữ {code} ở giữa, nếu không chức năng SMS sẽ không hoạt động", "templateTip": "Vui lòng điền vào mẫu SMS, giữ {code} ở giữa, nếu không chức năng SMS sẽ không hoạt động",
"testSms": "Gửi SMS Thử", "testSms": "Gửi SMS Thử",
"testSmsContent": "Đây là một tin nhắn thử nghiệm", "testSmsContent": "Đây là một tin nhắn thử nghiệm",
"testSmsPhone": "Nhập số điện thoại", "testSmsPhone": "Nhập số điện thoại",
"testSmsTip": "Gửi một tin nhắn SMS thử nghiệm để xác minh cấu hình của bạn", "testSmsTip": "Gửi một tin nhắn SMS thử nghiệm để xác minh cấu hình của bạn",
"updateSuccess": "Cập nhật thành công" "updateSuccess": "Cập nhật thành công",
"whitelistAreaCode": "Mã khu vực trong danh sách trắng",
"whitelistAreaCodeTip": "Vui lòng nhập mã khu vực trong danh sách trắng, ví dụ: 1, 852, 886, 888",
"whitelistValidation": "Xác minh danh sách trắng",
"whitelistValidationTip": "Khi được kích hoạt, chỉ các mã khu vực trong danh sách trắng mới có thể gửi SMS"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "短信日志列表", "SmsList": "短信日志列表",
"accessLabel": "访问",
"applyPlatform": "申请平台", "applyPlatform": "申请平台",
"areaCode": "区号", "areaCode": "区号",
"content": "内容", "content": "内容",
"createdAt": "发送时间", "createdAt": "发送时间",
"enable": "启用", "enable": "启用",
"enableTip": "启用后,将启用手机注册、登录、绑定和解绑功能", "enableTip": "启用后,将启用手机注册、登录、绑定和解绑功能",
"endpointLabel": "端点",
"expireTime": "过期时间", "expireTime": "过期时间",
"expireTimeTip": "短信验证码有效期(秒)", "expireTimeTip": "短信验证码有效期(秒)",
"interval": "间隔", "interval": "间隔",
@ -24,18 +26,25 @@
"platformConfigTip": "请填写提供的{key}配置", "platformConfigTip": "请填写提供的{key}配置",
"platformTip": "请选择短信平台", "platformTip": "请选择短信平台",
"search": "搜索电话号码", "search": "搜索电话号码",
"secretLabel": "密钥",
"sendFailed": "发送失败", "sendFailed": "发送失败",
"sendSuccess": "发送成功", "sendSuccess": "发送成功",
"settings": "设置", "settings": "设置",
"signNameLabel": "签名名称",
"status": "状态", "status": "状态",
"telephone": "电话号码", "telephone": "电话号码",
"template": "短信模板", "template": "短信模板",
"templateCode": "模板代码", "templateCode": "模板代码",
"templateCodeLabel": "模板代码",
"templateParam": "模板参数", "templateParam": "模板参数",
"templateTip": "请填写短信模板,保持 {code} 在中间,否则短信功能将无法正常工作", "templateTip": "请填写短信模板,保持 {code} 在中间,否则短信功能将无法正常工作",
"testSms": "发送测试短信", "testSms": "发送测试短信",
"testSmsContent": "这是一条测试消息", "testSmsContent": "这是一条测试消息",
"testSmsPhone": "输入电话号码", "testSmsPhone": "输入电话号码",
"testSmsTip": "发送测试短信以验证您的配置", "testSmsTip": "发送测试短信以验证您的配置",
"updateSuccess": "更新成功" "updateSuccess": "更新成功",
"whitelistAreaCode": "白名单区号",
"whitelistAreaCodeTip": "请输入白名单区号例如1, 852, 886, 888",
"whitelistValidation": "白名单验证",
"whitelistValidationTip": "启用后,仅白名单中的区号可以发送短信"
} }

View File

@ -1,11 +1,13 @@
{ {
"SmsList": "SMS 日誌列表", "SmsList": "SMS 日誌列表",
"accessLabel": "訪問",
"applyPlatform": "申請平台", "applyPlatform": "申請平台",
"areaCode": "地區代碼", "areaCode": "地區代碼",
"content": "內容", "content": "內容",
"createdAt": "發送時間", "createdAt": "發送時間",
"enable": "啟用", "enable": "啟用",
"enableTip": "啟用後,將啟用手機註冊、登入、綁定和解綁功能", "enableTip": "啟用後,將啟用手機註冊、登入、綁定和解綁功能",
"endpointLabel": "端點",
"expireTime": "到期時間", "expireTime": "到期時間",
"expireTimeTip": "SMS 驗證碼有效期(秒)", "expireTimeTip": "SMS 驗證碼有效期(秒)",
"interval": "間隔", "interval": "間隔",
@ -24,18 +26,25 @@
"platformConfigTip": "請填寫提供的 {key} 配置", "platformConfigTip": "請填寫提供的 {key} 配置",
"platformTip": "請選擇短信平台", "platformTip": "請選擇短信平台",
"search": "搜尋電話號碼", "search": "搜尋電話號碼",
"secretLabel": "密鑰",
"sendFailed": "發送失敗", "sendFailed": "發送失敗",
"sendSuccess": "發送成功", "sendSuccess": "發送成功",
"settings": "設定", "settings": "設定",
"signNameLabel": "簽名名稱",
"status": "狀態", "status": "狀態",
"telephone": "電話號碼", "telephone": "電話號碼",
"template": "短信範本", "template": "短信範本",
"templateCode": "模板代碼", "templateCode": "模板代碼",
"templateCodeLabel": "模板代碼",
"templateParam": "模板參數", "templateParam": "模板參數",
"templateTip": "請填寫短信模板,保持 {code} 在中間,否則短信功能將無法運作", "templateTip": "請填寫短信模板,保持 {code} 在中間,否則短信功能將無法運作",
"testSms": "發送測試短信", "testSms": "發送測試短信",
"testSmsContent": "這是一條測試訊息", "testSmsContent": "這是一條測試訊息",
"testSmsPhone": "輸入電話號碼", "testSmsPhone": "輸入電話號碼",
"testSmsTip": "發送測試短信以驗證您的配置", "testSmsTip": "發送測試短信以驗證您的配置",
"updateSuccess": "更新成功" "updateSuccess": "更新成功",
"whitelistAreaCode": "白名單區域代碼",
"whitelistAreaCodeTip": "請輸入白名單區域代碼例如1, 852, 886, 888",
"whitelistValidation": "白名單驗證",
"whitelistValidationTip": "啟用後,只有白名單中的區域代碼可以發送短信"
} }

View File

@ -66,7 +66,7 @@ declare namespace API {
}; };
type AuthConfig = { type AuthConfig = {
sms: MobileAuthenticateConfig; mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig; email: EmailAuthticateConfig;
register: RegisterConfig; register: RegisterConfig;
}; };
@ -1362,7 +1362,6 @@ declare namespace API {
expired_at: number; expired_at: number;
upload: number; upload: number;
download: number; download: number;
status: number;
}; };
type User = { type User = {

View File

@ -32,7 +32,6 @@ export async function appleLoginCallback(
return request<API.Response & { data?: any }>('/v1/auth/oauth/callback/apple', { return request<API.Response & { data?: any }>('/v1/auth/oauth/callback/apple', {
method: 'POST', method: 'POST',
data: formData, data: formData,
requestType: 'form',
...(options || {}), ...(options || {}),
}); });
} }

View File

@ -64,7 +64,7 @@ declare namespace API {
}; };
type AuthConfig = { type AuthConfig = {
sms: MobileAuthenticateConfig; mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig; email: EmailAuthticateConfig;
register: RegisterConfig; register: RegisterConfig;
}; };

View File

@ -33,8 +33,8 @@ export default function RegisterForm({
try { try {
const domain = email.split('@')[1]; const domain = email.split('@')[1];
const isValid = const isValid =
!auth.email.email_enable_verify || !auth.email.enable_verify ||
auth.email?.email_domain_suffix_list.split('\n').includes(domain || ''); auth.email?.domain_suffix_list.split('\n').includes(domain || '');
return !isValid; return !isValid;
} catch (error) { } catch (error) {
console.log('Error checking user:', error); console.log('Error checking user:', error);
@ -52,7 +52,7 @@ export default function RegisterForm({
}), }),
password: z.string(), password: z.string(),
repeat_password: z.string(), repeat_password: z.string(),
code: auth.email.email_enable_verify ? z.string() : z.string().nullish(), code: auth.email.enable_verify ? z.string() : z.string().nullish(),
invite: invite.forced_invite ? z.string().min(1) : 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
@ -125,7 +125,7 @@ export default function RegisterForm({
</FormItem> </FormItem>
)} )}
/> />
{auth.email.email_enable_verify && ( {auth.email.enable_verify && (
<FormField <FormField
control={form.control} control={form.control}
name='code' name='code'

View File

@ -32,7 +32,7 @@ export default function ResetForm({
const formSchema = z.object({ const formSchema = z.object({
email: z.string().email(t('email')), email: z.string().email(t('email')),
password: z.string(), password: z.string(),
code: auth?.email?.email_enable_verify ? z.string() : z.string().nullish(), code: auth?.email?.enable_verify ? z.string() : 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()
@ -60,7 +60,7 @@ export default function ResetForm({
)} )}
/> />
{auth?.email?.email_enable_verify && ( {auth?.email?.enable_verify && (
<FormField <FormField
control={form.control} control={form.control}
name='code' name='code'

View File

@ -35,7 +35,7 @@ export default function ResetForm({
telephone_area_code: z.string(), telephone_area_code: z.string(),
telephone: z.string(), telephone: z.string(),
password: z.string(), password: z.string(),
code: auth?.email?.email_enable_verify ? z.string() : z.string().nullish(), code: auth?.email?.enable_verify ? z.string() : 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()

View File

@ -22,23 +22,23 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
site_logo: '', site_logo: '',
}, },
verify: { verify: {
turnstile_site_key: '',
enable_login_verify: false, enable_login_verify: false,
enable_register_verify: false, enable_register_verify: false,
enable_reset_password_verify: false, enable_reset_password_verify: false,
turnstile_site_key: '',
}, },
auth: { auth: {
sms: { mobile: {
sms_enabled: false, enable: false,
sms_limit: 0, limit: 0,
sms_interval: 0, interval: 0,
sms_expire_time: 0, expire_time: 0,
}, },
email: { email: {
email_enabled: false, enable: false,
email_enable_verify: false, enable_verify: false,
email_enable_domain_suffix: false, enable_domain_suffix: false,
email_domain_suffix_list: '', domain_suffix_list: '',
}, },
register: { register: {
stop_register: false, stop_register: false,
@ -56,7 +56,6 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
currency: { currency: {
currency_unit: 'USD', currency_unit: 'USD',
currency_symbol: '$', currency_symbol: '$',
access_key: '',
}, },
subscribe: { subscribe: {
single_model: false, single_model: false,

View File

@ -47,7 +47,6 @@
"60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.", "60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.",
"60003": "Et eksisterende abonnement er oppdaget. Vennligst avbryt det før du fortsetter.", "60003": "Et eksisterende abonnement er oppdaget. Vennligst avbryt det før du fortsetter.",
"60004": "Kan ikke slettes for øyeblikket da abonnementet har aktive brukere.", "60004": "Kan ikke slettes for øyeblikket da abonnementet har aktive brukere.",
"60005": "Abonnementet har nådd maks antall brukere.",
"60005": "Enkelt abonnementsmodus har overskredet brukergrensen.", "60005": "Enkelt abonnementsmodus har overskredet brukergrensen.",
"70001": "Verifikasjonskoden er feil, vennligst skriv inn på nytt.", "70001": "Verifikasjonskoden er feil, vennligst skriv inn på nytt.",
"80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.", "80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.",

View File

@ -47,7 +47,6 @@
"60002": "Não é possível usar a assinatura no momento, por favor, tente novamente mais tarde.", "60002": "Não é possível usar a assinatura no momento, por favor, tente novamente mais tarde.",
"60003": "Uma assinatura existente foi detectada. Cancele-a antes de prosseguir.", "60003": "Uma assinatura existente foi detectada. Cancele-a antes de prosseguir.",
"60004": "Não é possível excluir no momento, pois a assinatura possui usuários ativos.", "60004": "Não é possível excluir no momento, pois a assinatura possui usuários ativos.",
"60005": "A assinatura atingiu o número máximo de usuários.",
"60005": "O modo de assinatura única excedeu o limite de usuários.", "60005": "O modo de assinatura única excedeu o limite de usuários.",
"70001": "O código de verificação está incorreto, por favor, digite novamente.", "70001": "O código de verificação está incorreto, por favor, digite novamente.",
"80001": "A tarefa não foi adicionada à fila com sucesso, por favor, tente novamente mais tarde.", "80001": "A tarefa não foi adicionada à fila com sucesso, por favor, tente novamente mais tarde.",

View File

@ -64,7 +64,7 @@ declare namespace API {
}; };
type AuthConfig = { type AuthConfig = {
sms: MobileAuthenticateConfig; mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig; email: EmailAuthticateConfig;
register: RegisterConfig; register: RegisterConfig;
}; };

View File

@ -58,7 +58,7 @@ declare namespace API {
}; };
type AuthConfig = { type AuthConfig = {
sms: MobileAuthenticateConfig; mobile: MobileAuthenticateConfig;
email: EmailAuthticateConfig; email: EmailAuthticateConfig;
register: RegisterConfig; register: RegisterConfig;
}; };

View File

@ -1,5 +1,6 @@
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Input } from '@workspace/ui/components/input'; import { Input } from '@workspace/ui/components/input';
import { cn } from '@workspace/ui/lib/utils';
import { X } from 'lucide-react'; import { X } from 'lucide-react';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
@ -8,9 +9,16 @@ interface TagInputProps {
onChange?: (tags: string[]) => void; onChange?: (tags: string[]) => void;
placeholder?: string; placeholder?: string;
separator?: string; separator?: string;
className?: string;
} }
export function TagInput({ value = [], onChange, placeholder, separator = ',' }: TagInputProps) { export function TagInput({
value = [],
onChange,
placeholder,
separator = ',',
className,
}: TagInputProps) {
const [inputValue, setInputValue] = useState(''); const [inputValue, setInputValue] = useState('');
const [tags, setTags] = useState<string[]>(value); const [tags, setTags] = useState<string[]>(value);
@ -19,7 +27,6 @@ export function TagInput({ value = [], onChange, placeholder, separator = ',' }:
}, [value]); }, [value]);
function normalizeInput(input: string) { function normalizeInput(input: string) {
// 将中文逗号替换为英文逗号
return input.replace(//g, ','); return input.replace(//g, ',');
} }
@ -58,7 +65,12 @@ export function TagInput({ value = [], onChange, placeholder, separator = ',' }:
} }
return ( return (
<div className='border-input focus-within:ring-primary flex min-h-9 w-full flex-wrap items-center gap-2 rounded-md border bg-transparent p-2 shadow-sm transition-colors focus-within:ring-1'> <div
className={cn(
'border-input focus-within:ring-primary flex min-h-9 w-full flex-wrap items-center gap-2 rounded-md border bg-transparent p-2 shadow-sm transition-colors focus-within:ring-1',
className,
)}
>
{tags.map((tag, index) => ( {tags.map((tag, index) => (
<Badge <Badge
key={tag} key={tag}