mirror of
https://github.com/rustmailer/bichon.git
synced 2026-08-03 07:48:34 +02:00
feat: added Cron scheduling for email downloads #211
This commit is contained in:
@@ -143,6 +143,7 @@ export interface AccountModel {
|
||||
imap_quota_window?: QuotaWindow;
|
||||
imap_quota_bytes?: number;
|
||||
auto_download_new_mailboxes?: boolean;
|
||||
download_schedule?: string;
|
||||
}
|
||||
|
||||
export const download_state = async (account_id: number) => {
|
||||
|
||||
@@ -213,37 +213,6 @@ describe('Account Form Schema', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('folder_limit field', () => {
|
||||
it('accepts undefined folder_limit', () => {
|
||||
const result = getAccountSchema(false, t).safeParse(validAccountData)
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
|
||||
it('accepts null folder_limit', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
folder_limit: null,
|
||||
})
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
|
||||
it('rejects folder_limit less than 100', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
folder_limit: 50,
|
||||
})
|
||||
expect(result.success).toBe(false)
|
||||
})
|
||||
|
||||
it('accepts folder_limit of exactly 100', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
folder_limit: 100,
|
||||
})
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('account_name and login_name fields', () => {
|
||||
it('accepts undefined account_name and login_name', () => {
|
||||
const result = getAccountSchema(false, t).safeParse(validAccountData)
|
||||
@@ -266,6 +235,45 @@ describe('Account Form Schema', () => {
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('download_schedule field', () => {
|
||||
it('accepts undefined download_schedule', () => {
|
||||
const result = getAccountSchema(false, t).safeParse(validAccountData)
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
|
||||
it('accepts valid 6-field cron expression', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
download_schedule: '0 0 0 * * *',
|
||||
})
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
|
||||
it('accepts cron with */step syntax', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
download_schedule: '0 */30 8-17 * * 1-5',
|
||||
})
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
|
||||
it('rejects cron with too few fields', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
download_schedule: '0 0 *',
|
||||
})
|
||||
expect(result.success).toBe(false)
|
||||
})
|
||||
|
||||
it('accepts empty string cron (treated as not set)', () => {
|
||||
const result = getAccountSchema(false, t).safeParse({
|
||||
...validAccountData,
|
||||
download_schedule: '',
|
||||
})
|
||||
expect(result.success).toBe(true)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('Auth Config Schema (password validation)', () => {
|
||||
|
||||
@@ -133,8 +133,8 @@ export function AccountDetailDrawer({ open, onOpenChange, currentRow }: Props) {
|
||||
)}
|
||||
</div>
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<span className="text-muted-foreground">{t('accounts.folderLimit')}:</span>
|
||||
<span>{currentRow.folder_limit ? currentRow.folder_limit : t('accounts.notAvailable')}</span>
|
||||
<span className="text-muted-foreground">{t('accounts.downloadSchedule')}:</span>
|
||||
<span>{currentRow.download_schedule || t('accounts.notAvailable')}</span>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
|
||||
@@ -49,7 +49,7 @@ export type Steps = [...Step[]];
|
||||
const getSteps = (t: (key: string) => string): Steps => [
|
||||
{ id: "step-1", name: t('accounts.steps.emailAddress'), fields: ["email", "account_name"] },
|
||||
{ id: "step-2", name: t('accounts.steps.imap'), fields: ["imap", "use_dangerous", "login_name"] },
|
||||
{ id: "step-3", name: t('accounts.steps.syncPreferences'), fields: ["enabled", "date_since", "date_before", "folder_limit", "download_interval_min", "download_batch_size", "auto_download_new_mailboxes"] },
|
||||
{ id: "step-3", name: t('accounts.steps.syncPreferences'), fields: ["enabled", "date_since", "date_before", "download_interval_min", "download_batch_size", "auto_download_new_mailboxes", "download_schedule"] },
|
||||
{ id: "step-4", name: t('accounts.steps.summary'), fields: [] },
|
||||
];
|
||||
|
||||
@@ -79,10 +79,10 @@ const defaultValues: Account = {
|
||||
use_dangerous: false,
|
||||
date_since: undefined,
|
||||
date_before: undefined,
|
||||
folder_limit: undefined,
|
||||
download_interval_min: 60,
|
||||
download_batch_size: 30,
|
||||
auto_download_new_mailboxes: true,
|
||||
download_schedule: undefined,
|
||||
};
|
||||
|
||||
const emptyImap: ImapConfig = {
|
||||
@@ -109,10 +109,10 @@ const mapCurrentRowToFormValues = (currentRow: AccountModel): Account => {
|
||||
use_dangerous: currentRow.use_dangerous,
|
||||
date_since: currentRow.date_since ?? undefined,
|
||||
date_before: currentRow.date_before ?? undefined,
|
||||
folder_limit: currentRow.folder_limit ?? undefined,
|
||||
download_interval_min: currentRow.download_interval_min ?? 60,
|
||||
download_batch_size: currentRow.download_batch_size ?? 30,
|
||||
auto_download_new_mailboxes: currentRow.auto_download_new_mailboxes ?? true,
|
||||
download_schedule: currentRow.download_schedule ?? undefined,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -191,18 +191,18 @@ export function AccountActionDialog({ currentRow, open, onOpenChange }: Props) {
|
||||
use_dangerous: data.use_dangerous,
|
||||
date_since: data.date_since,
|
||||
date_before: data.date_before,
|
||||
folder_limit: data.folder_limit,
|
||||
download_interval_min: data.download_interval_min,
|
||||
download_batch_size: data.download_batch_size,
|
||||
auto_download_new_mailboxes: data.auto_download_new_mailboxes,
|
||||
download_schedule: data.download_schedule || null,
|
||||
};
|
||||
if (isEdit) {
|
||||
const isAllMode = !data.date_since && !data.date_before;
|
||||
const clear_folder_limit = !data.folder_limit;
|
||||
const clear_download_schedule = !data.download_schedule && currentRow?.download_schedule;
|
||||
updateMutation.mutate({
|
||||
...commonData,
|
||||
...(isAllMode ? { clear_date_range: true } : {}),
|
||||
...(clear_folder_limit ? { clear_folder_limit: true } : {})
|
||||
...(clear_download_schedule ? { clear_download_schedule: true } : {})
|
||||
});
|
||||
} else {
|
||||
createMutation.mutate({ ...commonData, account_type: "IMAP" });
|
||||
|
||||
@@ -106,9 +106,12 @@ export function useColumns(): ColumnDef<AccountModel>[] {
|
||||
if (account_type === "NoSync") {
|
||||
return <LongText className="text-center">n/a</LongText>
|
||||
}
|
||||
if (row.original.download_schedule) {
|
||||
return <LongText className="text-center">{row.original.download_schedule}</LongText>
|
||||
}
|
||||
return <LongText className="text-center">{row.original.download_interval_min} min</LongText>
|
||||
},
|
||||
meta: { className: 'text-center max-w-[120px]' },
|
||||
meta: { className: 'text-center max-w-[160px]' },
|
||||
enableHiding: false,
|
||||
},
|
||||
{
|
||||
|
||||
@@ -98,26 +98,6 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) {
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align='end' className='w-[220px]'>
|
||||
|
||||
{showDownload && (
|
||||
<DropdownMenuItem onClick={handleStartDownload}>
|
||||
{t('accounts.startDownload')}
|
||||
<DropdownMenuShortcut>
|
||||
<IconPlayerPlay size={16} />
|
||||
</DropdownMenuShortcut>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
|
||||
|
||||
{showDownload && (
|
||||
<DropdownMenuItem onClick={handleCancelDownload}>
|
||||
{t('accounts.cancelDownload')}
|
||||
<DropdownMenuShortcut>
|
||||
<IconPlayerStop size={16} />
|
||||
</DropdownMenuShortcut>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
{showDownload && <DropdownMenuSeparator />}
|
||||
{hasPermission && <DropdownMenuItem
|
||||
onClick={() => {
|
||||
setCurrentRow(row.original)
|
||||
@@ -169,6 +149,27 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) {
|
||||
</DropdownMenuShortcut>
|
||||
</DropdownMenuItem>}
|
||||
{hasPermission && <DropdownMenuSeparator />}
|
||||
|
||||
{showDownload && (
|
||||
<DropdownMenuItem onClick={handleStartDownload}>
|
||||
{t('accounts.startDownload')}
|
||||
<DropdownMenuShortcut>
|
||||
<IconPlayerPlay size={16} />
|
||||
</DropdownMenuShortcut>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
|
||||
|
||||
{showDownload && (
|
||||
<DropdownMenuItem onClick={handleCancelDownload}>
|
||||
{t('accounts.cancelDownload')}
|
||||
<DropdownMenuShortcut>
|
||||
<IconPlayerStop size={16} />
|
||||
</DropdownMenuShortcut>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
{showDownload && <DropdownMenuSeparator />}
|
||||
|
||||
{hasPermission && <DropdownMenuItem
|
||||
onClick={() => {
|
||||
setCurrentRow(row.original)
|
||||
|
||||
@@ -79,12 +79,6 @@ export const getAccountSchema = (isEdit: boolean, t: (key: string) => string) =>
|
||||
use_dangerous: z.boolean(),
|
||||
date_since: dateSelectionSchema(t).optional(),
|
||||
date_before: relativeDateSchema(t).optional(),
|
||||
folder_limit: z
|
||||
.number({ invalid_type_error: t('validation.folderLimitMustBeNumber') })
|
||||
.int()
|
||||
.min(100, { message: t('validation.folderLimitMustBeAtLeast100') })
|
||||
.nullable()
|
||||
.optional(),
|
||||
download_interval_min: z
|
||||
.number({
|
||||
invalid_type_error: t('validation.incrementalSyncMustBeNumber'),
|
||||
@@ -107,6 +101,18 @@ export const getAccountSchema = (isEdit: boolean, t: (key: string) => string) =>
|
||||
message: t('validation.singleRequestBatchSizeTooLarge'),
|
||||
}),
|
||||
auto_download_new_mailboxes: z.boolean(),
|
||||
download_schedule: z
|
||||
.string()
|
||||
.optional()
|
||||
.refine(
|
||||
(val) => {
|
||||
if (!val || val.trim() === '') return true;
|
||||
const fields = val.trim().split(/\s+/);
|
||||
if (fields.length < 6) return false;
|
||||
return true;
|
||||
},
|
||||
{ message: t('validation.invalidCronExpression') }
|
||||
),
|
||||
})
|
||||
|
||||
export type AccountFormValues = z.infer<
|
||||
|
||||
@@ -48,6 +48,72 @@ import i18n from "@/i18n";
|
||||
|
||||
|
||||
type SyncMode = 'all' | 'since_fixed' | 'since_relative' | 'before_relative';
|
||||
type ScheduleMode = 'interval' | 'cron';
|
||||
type CronMode = 'simple' | 'advanced';
|
||||
type CronFrequency = 'daily' | 'weekly' | 'monthly';
|
||||
|
||||
interface CronSimpleState {
|
||||
frequency: CronFrequency;
|
||||
hour: number;
|
||||
minute: number;
|
||||
dayOfWeek: number;
|
||||
dayOfMonth: number;
|
||||
}
|
||||
|
||||
const DEFAULT_CRON_SIMPLE: CronSimpleState = {
|
||||
frequency: 'daily',
|
||||
hour: 0,
|
||||
minute: 0,
|
||||
dayOfWeek: 1,
|
||||
dayOfMonth: 1,
|
||||
};
|
||||
|
||||
function buildCronFromSimple(s: CronSimpleState): string {
|
||||
switch (s.frequency) {
|
||||
case 'daily':
|
||||
return `0 ${s.minute} ${s.hour} * * *`;
|
||||
case 'weekly':
|
||||
return `0 ${s.minute} ${s.hour} * * ${s.dayOfWeek}`;
|
||||
case 'monthly':
|
||||
return `0 ${s.minute} ${s.hour} ${s.dayOfMonth} * *`;
|
||||
}
|
||||
}
|
||||
|
||||
function tryParseCronToSimple(cron: string): CronSimpleState | null {
|
||||
const fields = cron.trim().split(/\s+/);
|
||||
if (fields.length < 6) return null;
|
||||
|
||||
const sec = fields[0];
|
||||
const min = fields[1];
|
||||
const hour = fields[2];
|
||||
const dom = fields[3];
|
||||
const month = fields[4];
|
||||
const dow = fields[5];
|
||||
|
||||
if (sec !== '0') return null;
|
||||
if (month !== '*') return null;
|
||||
|
||||
const minuteVal = parseInt(min, 10);
|
||||
const hourVal = parseInt(hour, 10);
|
||||
if (isNaN(minuteVal) || isNaN(hourVal)) return null;
|
||||
|
||||
if (dom === '*' && dow === '*') {
|
||||
return { frequency: 'daily', hour: hourVal, minute: minuteVal, dayOfWeek: 1, dayOfMonth: 1 };
|
||||
}
|
||||
if (dom === '*') {
|
||||
const dowVal = parseInt(dow, 10);
|
||||
if (!isNaN(dowVal)) {
|
||||
return { frequency: 'weekly', hour: hourVal, minute: minuteVal, dayOfWeek: dowVal, dayOfMonth: 1 };
|
||||
}
|
||||
}
|
||||
if (dow === '*') {
|
||||
const domVal = parseInt(dom, 10);
|
||||
if (!isNaN(domVal)) {
|
||||
return { frequency: 'monthly', hour: hourVal, minute: minuteVal, dayOfWeek: 1, dayOfMonth: domVal };
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export default function Step3() {
|
||||
const { t } = useTranslation();
|
||||
@@ -61,6 +127,31 @@ export default function Step3() {
|
||||
return 'all';
|
||||
});
|
||||
|
||||
const [scheduleMode, setScheduleMode] = useState<ScheduleMode>(() => {
|
||||
if (current.download_schedule) return 'cron';
|
||||
return 'interval';
|
||||
});
|
||||
|
||||
const [cronMode, setCronMode] = useState<CronMode>(() => {
|
||||
if (current.download_schedule && tryParseCronToSimple(current.download_schedule)) {
|
||||
return 'simple';
|
||||
}
|
||||
if (current.download_schedule) return 'advanced';
|
||||
return 'simple';
|
||||
});
|
||||
|
||||
const [cronSimple, setCronSimple] = useState<CronSimpleState>(() => {
|
||||
if (current.download_schedule) {
|
||||
return tryParseCronToSimple(current.download_schedule) ?? DEFAULT_CRON_SIMPLE;
|
||||
}
|
||||
return DEFAULT_CRON_SIMPLE;
|
||||
});
|
||||
|
||||
const updateCronFromSimple = (partial: Partial<CronSimpleState>) => {
|
||||
const next = { ...cronSimple, ...partial };
|
||||
setCronSimple(next);
|
||||
setValue('download_schedule', buildCronFromSimple(next));
|
||||
};
|
||||
|
||||
const handleModeChange = (mode: SyncMode) => {
|
||||
setSyncMode(mode);
|
||||
@@ -77,41 +168,231 @@ export default function Step3() {
|
||||
}
|
||||
};
|
||||
|
||||
const handleScheduleModeChange = (mode: ScheduleMode) => {
|
||||
setScheduleMode(mode);
|
||||
if (mode === 'interval') {
|
||||
setValue("download_schedule", undefined);
|
||||
} else {
|
||||
setValue("download_interval_min", 60);
|
||||
if (cronMode === 'simple') {
|
||||
updateCronFromSimple(cronSimple);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="space-y-8">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<FormField
|
||||
control={control}
|
||||
name="download_interval_min"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('accounts.downloadInterval')}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="number" {...field} onChange={(e) => field.onChange(parseInt(e.target.value, 10))} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
<FormDescription>
|
||||
{t('accounts.downloadIntervalPlaceholder')}
|
||||
</FormDescription>
|
||||
</FormItem>
|
||||
<div className="space-y-4">
|
||||
<FormItem>
|
||||
<FormLabel className="text-base font-semibold">{t('accounts.scheduleMode')}</FormLabel>
|
||||
<FormDescription>
|
||||
{t('accounts.scheduleModeDescription')}
|
||||
</FormDescription>
|
||||
<Select value={scheduleMode} onValueChange={(v) => handleScheduleModeChange(v as ScheduleMode)}>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="interval">{t('accounts.scheduleModeInterval')}</SelectItem>
|
||||
<SelectItem value="cron">{t('accounts.scheduleModeCron')}</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
{scheduleMode === 'interval' ? (
|
||||
<FormField
|
||||
control={control}
|
||||
name="download_interval_min"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('accounts.downloadInterval')}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="number" {...field} onChange={(e) => field.onChange(parseInt(e.target.value, 10))} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
<FormDescription>
|
||||
{t('accounts.downloadIntervalPlaceholder')}
|
||||
</FormDescription>
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
<div className="flex items-center gap-2">
|
||||
{/* <FormLabel className="text-sm font-medium">{t('accounts.downloadSchedule')}</FormLabel> */}
|
||||
<div className="flex items-center rounded-md border text-xs">
|
||||
<button
|
||||
type="button"
|
||||
className={`px-2 py-1 rounded-l-md ${cronMode === 'simple' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
onClick={() => setCronMode('simple')}
|
||||
>
|
||||
{t('accounts.cronSimple')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={`px-2 py-1 rounded-r-md ${cronMode === 'advanced' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
onClick={() => setCronMode('advanced')}
|
||||
>
|
||||
{t('accounts.cronAdvanced')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{cronMode === 'simple' ? (
|
||||
<div className="flex flex-wrap items-end gap-3">
|
||||
<FormItem className="w-[140px]">
|
||||
<FormLabel className="text-xs">{t('accounts.cronFrequency')}</FormLabel>
|
||||
<Select
|
||||
value={cronSimple.frequency}
|
||||
onValueChange={(v) => updateCronFromSimple({ frequency: v as CronFrequency })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="daily">{t('accounts.cronDaily')}</SelectItem>
|
||||
<SelectItem value="weekly">{t('accounts.cronWeekly')}</SelectItem>
|
||||
<SelectItem value="monthly">{t('accounts.cronMonthly')}</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
|
||||
<FormItem className="w-[80px]">
|
||||
<FormLabel className="text-xs">{t('accounts.cronHour')}</FormLabel>
|
||||
<Select
|
||||
value={String(cronSimple.hour)}
|
||||
onValueChange={(v) => updateCronFromSimple({ hour: parseInt(v, 10) })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{Array.from({ length: 24 }, (_, i) => (
|
||||
<SelectItem key={i} value={String(i)}>
|
||||
{String(i).padStart(2, '0')}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
|
||||
<span className="text-muted-foreground pb-2">:</span>
|
||||
|
||||
<FormItem className="w-[80px]">
|
||||
<FormLabel className="text-xs">{t('accounts.cronMinute')}</FormLabel>
|
||||
<Select
|
||||
value={String(cronSimple.minute)}
|
||||
onValueChange={(v) => updateCronFromSimple({ minute: parseInt(v, 10) })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55].map((m) => (
|
||||
<SelectItem key={m} value={String(m)}>
|
||||
{String(m).padStart(2, '0')}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
|
||||
{cronSimple.frequency === 'weekly' && (
|
||||
<FormItem className="w-[140px]">
|
||||
<FormLabel className="text-xs">{t('accounts.cronDayOfWeek')}</FormLabel>
|
||||
<Select
|
||||
value={String(cronSimple.dayOfWeek)}
|
||||
onValueChange={(v) => updateCronFromSimple({ dayOfWeek: parseInt(v, 10) })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="1">{t('accounts.cronMonday')}</SelectItem>
|
||||
<SelectItem value="2">{t('accounts.cronTuesday')}</SelectItem>
|
||||
<SelectItem value="3">{t('accounts.cronWednesday')}</SelectItem>
|
||||
<SelectItem value="4">{t('accounts.cronThursday')}</SelectItem>
|
||||
<SelectItem value="5">{t('accounts.cronFriday')}</SelectItem>
|
||||
<SelectItem value="6">{t('accounts.cronSaturday')}</SelectItem>
|
||||
<SelectItem value="0">{t('accounts.cronSunday')}</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
)}
|
||||
|
||||
{cronSimple.frequency === 'monthly' && (
|
||||
<FormItem className="w-[90px]">
|
||||
<FormLabel className="text-xs">{t('accounts.cronDayOfMonth')}</FormLabel>
|
||||
<Select
|
||||
value={String(cronSimple.dayOfMonth)}
|
||||
onValueChange={(v) => updateCronFromSimple({ dayOfMonth: parseInt(v, 10) })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="max-h-[200px]">
|
||||
{Array.from({ length: 28 }, (_, i) => i + 1).map((d) => (
|
||||
<SelectItem key={d} value={String(d)}>
|
||||
{d}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormItem>
|
||||
)}
|
||||
|
||||
<div className="text-xs text-muted-foreground pb-2 font-mono">
|
||||
= {buildCronFromSimple(cronSimple)}
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<FormField
|
||||
control={control}
|
||||
name="download_schedule"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormControl>
|
||||
<Input
|
||||
{...field}
|
||||
value={field.value ?? ''}
|
||||
placeholder={t('accounts.downloadSchedulePlaceholder')}
|
||||
/>
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
{t('accounts.downloadScheduleDescription')}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
|
||||
{cronMode === 'simple' && (
|
||||
<FormDescription>{t('accounts.downloadScheduleDescription')}</FormDescription>
|
||||
)}
|
||||
|
||||
<div className="text-xs text-muted-foreground mt-1 flex items-center gap-1">
|
||||
<span>{t('accounts.cronTimezoneNote')}</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={control}
|
||||
name="download_batch_size"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('accounts.downloadBatchSize')}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="number" {...field} onChange={(e) => field.onChange(parseInt(e.target.value, 10))} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
<FormDescription>
|
||||
{t('accounts.downloadBatchSizeDescription')}
|
||||
</FormDescription>
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={control}
|
||||
name="download_batch_size"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('accounts.downloadBatchSize')}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="number" {...field} onChange={(e) => field.onChange(parseInt(e.target.value, 10))} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
<FormDescription>
|
||||
{t('accounts.downloadBatchSizeDescription')}
|
||||
</FormDescription>
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<FormField
|
||||
@@ -249,29 +530,6 @@ export default function Step3() {
|
||||
/>
|
||||
|
||||
<hr className="my-4" />
|
||||
|
||||
<FormField
|
||||
control={control}
|
||||
name="folder_limit"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('accounts.folderLimit')}</FormLabel>
|
||||
<FormDescription>{t('accounts.folderLimitDescription')}</FormDescription>
|
||||
<FormControl>
|
||||
<Input
|
||||
type="number"
|
||||
placeholder={t('accounts.folderLimitPlaceholder')}
|
||||
value={field.value ?? ''}
|
||||
onChange={(e) => {
|
||||
const value = e.target.value;
|
||||
field.onChange(value === '' ? null : Number(value));
|
||||
}}
|
||||
/>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -50,7 +50,7 @@ export default function Step4() {
|
||||
|
||||
return (
|
||||
<div className="rounded-xl">
|
||||
<Accordion type="multiple" defaultValue={['email', 'account_name', 'login_name', 'imap', 'date_since', 'folder_limit', 'sync_interval', 'sync_scope', 'sync_batch_size']}>
|
||||
<Accordion type="multiple" defaultValue={['email', 'account_name', 'login_name', 'imap', 'date_since', 'sync_interval', 'sync_scope', 'sync_batch_size', 'download_schedule']}>
|
||||
<AccordionItem key="email" value="email">
|
||||
<AccordionTrigger className="font-medium capitalize text-gray-600">{t('accounts.email')}:</AccordionTrigger>
|
||||
<AccordionContent>{summaryData.email}</AccordionContent>
|
||||
@@ -154,11 +154,6 @@ export default function Step4() {
|
||||
</AccordionItem>
|
||||
|
||||
|
||||
<AccordionItem key="folder_limit" value="folder_limit">
|
||||
<AccordionTrigger className="font-medium capitalize text-gray-600">{t('accounts.folderLimit')}:</AccordionTrigger>
|
||||
<AccordionContent>{summaryData.folder_limit ?? t('accounts.notAvailable')}</AccordionContent>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem key="sync_interval" value="sync_interval">
|
||||
<AccordionTrigger className="font-medium capitalize text-gray-600">{t('accounts.downloadInterval')}:</AccordionTrigger>
|
||||
<AccordionContent>{summaryData.download_interval_min} {t('accounts.minutes')}</AccordionContent>
|
||||
@@ -169,6 +164,11 @@ export default function Step4() {
|
||||
<AccordionContent>{summaryData.download_batch_size}</AccordionContent>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem key="download_schedule" value="download_schedule">
|
||||
<AccordionTrigger className="font-medium capitalize text-gray-600">{t('accounts.downloadSchedule')}:</AccordionTrigger>
|
||||
<AccordionContent>{summaryData.download_schedule || t('accounts.notAvailable')}</AccordionContent>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem key="auto_download_new_mailboxes" value="auto_download_new_mailboxes">
|
||||
<AccordionTrigger className="font-medium capitalize text-gray-600">{t('accounts.autoDownloadNewMailboxes')}:</AccordionTrigger>
|
||||
<AccordionContent>{summaryData.auto_download_new_mailboxes ? t('common.yes') : t('common.no')}</AccordionContent>
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "متابعة",
|
||||
"createdAt": "تاريخ الإنشاء",
|
||||
"creationFailed": "فشل الإنشاء، يرجى المحاولة مرة أخرى لاحقًا",
|
||||
"cronAdvanced": "تعبير متقدم",
|
||||
"cronDaily": "يومياً",
|
||||
"cronDayOfMonth": "اليوم من الأسبوع",
|
||||
"cronDayOfWeek": "اليوم من الأسبوع",
|
||||
"cronFrequency": "التكرار",
|
||||
"cronFriday": "الجمعة",
|
||||
"cronHour": "الساعة",
|
||||
"cronMinute": "الدقيقة",
|
||||
"cronMonday": "الإثنين",
|
||||
"cronMonthly": "شهرياً",
|
||||
"cronSaturday": "السبت",
|
||||
"cronSimple": "تعبير بسيط",
|
||||
"cronSunday": "الأحد",
|
||||
"cronThursday": "الخميس",
|
||||
"cronTimezoneNote": "جميع الأوقات بالتوقيت المحلي للخادم.",
|
||||
"cronTuesday": "الثلاثاء",
|
||||
"cronWednesday": "الأربعاء",
|
||||
"cronWeekly": "أسبوعياً",
|
||||
"dateSelection": "تحديد التاريخ",
|
||||
"dateSince": "التاريخ منذ",
|
||||
"days": "أيام",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "فشل بدء مهمة التنزيل",
|
||||
"downloadInterval": "دورة التنزيل (بالدقائق)",
|
||||
"downloadIntervalPlaceholder": "أدخل الدقائق",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "كرون من 6 حقول (ثانية-دقائق-ساعات-يوم-شهر-أسبوع) بتوقيت الخادم. يتجاوز الفاصل الزمني.",
|
||||
"downloadSchedulePlaceholder": "مثال: 0 0 * * *",
|
||||
"downloadScope": "استراتيجية التنزيل",
|
||||
"downloadScopeDescription": "اختر رسائل البريد الإلكتروني التي يجب فهرستها وتنزيلها.",
|
||||
"downloadStarted": "بدأت مهمة التنزيل",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "حفظ التغييرات",
|
||||
"scheduleMode": "جدولة التنزيل",
|
||||
"scheduleModeCron": "تعبير Cron",
|
||||
"scheduleModeDescription": "تعيين التنزيل بفواصل زمنية ثابتة أو عبر Cron.",
|
||||
"scheduleModeInterval": "فواصل زمنية ثابتة",
|
||||
"selectAccountType": "اختر نوع الحساب",
|
||||
"selectAtLeastOneFolder": "يرجى تحديد مجلد واحد على الأقل",
|
||||
"selectAuthMethod": "اختر طريقة مصادقة",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "يجب أن يكون منفذ IMAP عددًا صحيحًا موجبًا",
|
||||
"incrementalSyncMustBeAtLeast10": "يجب أن يكون فاصل المزامنة التزايدية 10 دقائق على الأقل",
|
||||
"incrementalSyncMustBeNumber": "يجب أن يكون فاصل المزامنة التزايدية رقمًا",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "عنوان بريد إلكتروني غير صالح",
|
||||
"invalidUrl": "عنوان URL غير صالح",
|
||||
"passwordMinLength": "يجب أن تتكون كلمة المرور من {{min}} أحرف على الأقل",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Fortsæt",
|
||||
"createdAt": "Oprettet",
|
||||
"creationFailed": "Oprettelse mislykkedes, prøv venligst igen senere",
|
||||
"cronAdvanced": "Avanceret udtryk",
|
||||
"cronDaily": "Dagligt",
|
||||
"cronDayOfMonth": "Ugedag",
|
||||
"cronDayOfWeek": "Ugedag",
|
||||
"cronFrequency": "Frekvens",
|
||||
"cronFriday": "Fredag",
|
||||
"cronHour": "Time",
|
||||
"cronMinute": "Minut",
|
||||
"cronMonday": "Mandag",
|
||||
"cronMonthly": "Månedligt",
|
||||
"cronSaturday": "Lørdag",
|
||||
"cronSimple": "Simpelt udtryk",
|
||||
"cronSunday": "Søndag",
|
||||
"cronThursday": "Torsdag",
|
||||
"cronTimezoneNote": "Alle tider er serverens lokale tid.",
|
||||
"cronTuesday": "Tirsdag",
|
||||
"cronWednesday": "Onsdag",
|
||||
"cronWeekly": "Ugentligt",
|
||||
"dateSelection": "Datovalg",
|
||||
"dateSince": "Dato fra",
|
||||
"days": "Dage",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Kunne ikke starte download-opgave",
|
||||
"downloadInterval": "Downloadinterval (minutter)",
|
||||
"downloadIntervalPlaceholder": "Indtast minutter",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-felters Cron (sek min time dag mdr ugedag) i servertid. Tilsidesætter interval.",
|
||||
"downloadSchedulePlaceholder": "F.eks.: 0 0 * * *",
|
||||
"downloadScope": "Downloadstrategi",
|
||||
"downloadScopeDescription": "Vælg hvilke e-mails der skal indekseres og downloades.",
|
||||
"downloadStarted": "Download-opgave startet",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Gem ændringer",
|
||||
"scheduleMode": "Planlægning af download",
|
||||
"scheduleModeCron": "Cron-udtryk",
|
||||
"scheduleModeDescription": "Download via faste intervaller eller Cron.",
|
||||
"scheduleModeInterval": "Fast interval",
|
||||
"selectAccountType": "Vælg kontotype",
|
||||
"selectAtLeastOneFolder": "Vælg venligst mindst én mappe",
|
||||
"selectAuthMethod": "Vælg en godkendelsesmetode",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP-port skal være et positivt heltal",
|
||||
"incrementalSyncMustBeAtLeast10": "Inkrementelt synkroniseringsinterval skal være mindst 10 minutter",
|
||||
"incrementalSyncMustBeNumber": "Inkrementelt synkroniseringsinterval skal være et tal",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Ugyldig e-mailadresse",
|
||||
"invalidUrl": "Ugyldig URL",
|
||||
"passwordMinLength": "Adgangskoden skal være mindst {{min}} tegn lang",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Weiter",
|
||||
"createdAt": "Erstellt am",
|
||||
"creationFailed": "Erstellung fehlgeschlagen, bitte versuchen Sie es später erneut",
|
||||
"cronAdvanced": "Erweiterter Ausdruck",
|
||||
"cronDaily": "Täglich",
|
||||
"cronDayOfMonth": "Wochentag",
|
||||
"cronDayOfWeek": "Wochentag",
|
||||
"cronFrequency": "Häufigkeit",
|
||||
"cronFriday": "Freitag",
|
||||
"cronHour": "Stunde",
|
||||
"cronMinute": "Minute",
|
||||
"cronMonday": "Montag",
|
||||
"cronMonthly": "Monatlich",
|
||||
"cronSaturday": "Samstag",
|
||||
"cronSimple": "Einfacher Ausdruck",
|
||||
"cronSunday": "Sonntag",
|
||||
"cronThursday": "Donnerstag",
|
||||
"cronTimezoneNote": "Alle Zeiten nutzen Server-Ortszeit.",
|
||||
"cronTuesday": "Dienstag",
|
||||
"cronWednesday": "Mittwoch",
|
||||
"cronWeekly": "Wöchentlich",
|
||||
"dateSelection": "Datumsauswahl",
|
||||
"dateSince": "Datum seit",
|
||||
"days": "Tage",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Download-Aufgabe konnte nicht gestartet werden",
|
||||
"downloadInterval": "Download-Intervall (Minuten)",
|
||||
"downloadIntervalPlaceholder": "Minuten eingeben",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-Felder-Cron (Sek Min Std Tag Mon Wochentag) in Serverzeit. Ersetzt Intervall.",
|
||||
"downloadSchedulePlaceholder": "Z. B.: 0 0 * * *",
|
||||
"downloadScope": "Download-Strategie",
|
||||
"downloadScopeDescription": "Wählen Sie aus, welche E-Mails indiziert und heruntergeladen werden sollen.",
|
||||
"downloadStarted": "Download-Aufgabe gestartet",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Änderungen speichern",
|
||||
"scheduleMode": "Download-Zeitplan",
|
||||
"scheduleModeCron": "Cron-Ausdruck",
|
||||
"scheduleModeDescription": "Download nach festem Intervall oder Cron-Ausdruck.",
|
||||
"scheduleModeInterval": "Festes Intervall",
|
||||
"selectAccountType": "Kontotyp auswählen",
|
||||
"selectAtLeastOneFolder": "Wählen Sie mindestens einen Ordner aus",
|
||||
"selectAuthMethod": "Authentifizierungsmethode auswählen",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "Der IMAP-Port muss eine positive ganze Zahl sein",
|
||||
"incrementalSyncMustBeAtLeast10": "Das inkrementelle Synchronisierungsintervall muss mindestens 10 Minuten betragen",
|
||||
"incrementalSyncMustBeNumber": "Das inkrementelle Synchronisierungsintervall muss eine Zahl sein",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Ungültige E-Mail-Adresse",
|
||||
"invalidUrl": "Ungültige URL",
|
||||
"passwordMinLength": "Das Passwort muss mindestens {{min}} Zeichen lang sein",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Continue",
|
||||
"createdAt": "Created At",
|
||||
"creationFailed": "Creation failed, please try again later",
|
||||
"cronAdvanced": "Advanced Expression",
|
||||
"cronDaily": "Daily",
|
||||
"cronDayOfMonth": "Day of Week",
|
||||
"cronDayOfWeek": "Day of Week",
|
||||
"cronFrequency": "Frequency",
|
||||
"cronFriday": "Friday",
|
||||
"cronHour": "Hour",
|
||||
"cronMinute": "Minute",
|
||||
"cronMonday": "Monday",
|
||||
"cronMonthly": "Monthly",
|
||||
"cronSaturday": "Saturday",
|
||||
"cronSimple": "Simple Expression",
|
||||
"cronSunday": "Sunday",
|
||||
"cronThursday": "Thursday",
|
||||
"cronTimezoneNote": "All times use server local timezone.",
|
||||
"cronTuesday": "Tuesday",
|
||||
"cronWednesday": "Wednesday",
|
||||
"cronWeekly": "Weekly",
|
||||
"dateSelection": "Date Selection",
|
||||
"dateSince": "Date Since",
|
||||
"days": "Days",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Failed to start download task",
|
||||
"downloadInterval": "Download Interval (minutes)",
|
||||
"downloadIntervalPlaceholder": "Enter minutes",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-field Cron (sec min hour day month dow) in server time. Overrides interval.",
|
||||
"downloadSchedulePlaceholder": "e.g., 0 0 * * *",
|
||||
"downloadScope": "Download Strategy",
|
||||
"downloadScopeDescription": "Choose which emails should be indexed and downloaded.",
|
||||
"downloadStarted": "Download task started",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Save changes",
|
||||
"scheduleMode": "Download Schedule",
|
||||
"scheduleModeCron": "Cron Expression",
|
||||
"scheduleModeDescription": "Download via fixed intervals or Cron expressions.",
|
||||
"scheduleModeInterval": "Fixed Interval",
|
||||
"selectAccountType": "Select account type",
|
||||
"selectAtLeastOneFolder": "Please select at least one folder",
|
||||
"selectAuthMethod": "Select an authentication method",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP port must be a positive integer",
|
||||
"incrementalSyncMustBeAtLeast10": "Incremental sync interval must be at least 10 minutes",
|
||||
"incrementalSyncMustBeNumber": "Incremental sync interval must be a number",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Invalid email address",
|
||||
"invalidUrl": "Invalid URL",
|
||||
"passwordMinLength": "Password must be at least {{min}} characters long",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Continuar",
|
||||
"createdAt": "Creado el",
|
||||
"creationFailed": "Error al crear, por favor, inténtalo de nuevo más tarde",
|
||||
"cronAdvanced": "Expresión avanzada",
|
||||
"cronDaily": "Diario",
|
||||
"cronDayOfMonth": "Día de la semana",
|
||||
"cronDayOfWeek": "Día de la semana",
|
||||
"cronFrequency": "Frecuencia",
|
||||
"cronFriday": "Viernes",
|
||||
"cronHour": "Hora",
|
||||
"cronMinute": "Minuto",
|
||||
"cronMonday": "Lunes",
|
||||
"cronMonthly": "Mensual",
|
||||
"cronSaturday": "Sábado",
|
||||
"cronSimple": "Expresión simple",
|
||||
"cronSunday": "Domingo",
|
||||
"cronThursday": "Jueves",
|
||||
"cronTimezoneNote": "Horas en zona horaria del servidor.",
|
||||
"cronTuesday": "Martes",
|
||||
"cronWednesday": "Miércoles",
|
||||
"cronWeekly": "Semanal",
|
||||
"dateSelection": "Selección de fecha",
|
||||
"dateSince": "Fecha desde",
|
||||
"days": "Días",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Error al iniciar la tarea de descarga",
|
||||
"downloadInterval": "Intervalo de descarga (minutos)",
|
||||
"downloadIntervalPlaceholder": "Ingresa los minutos",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "Cron de 6 campos (seg min hora día mes día-sem) en hora del servidor. Anula intervalo.",
|
||||
"downloadSchedulePlaceholder": "ej., 0 0 * * *",
|
||||
"downloadScope": "Estrategia de descarga",
|
||||
"downloadScopeDescription": "Elija qué correos electrónicos deben indexarse y descargarse.",
|
||||
"downloadStarted": "Tarea de descarga iniciada",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Guardar cambios",
|
||||
"scheduleMode": "Programación de descarga",
|
||||
"scheduleModeCron": "Expresión Cron",
|
||||
"scheduleModeDescription": "Descarga por intervalos fijos o expresiones Cron.",
|
||||
"scheduleModeInterval": "Intervalo fijo",
|
||||
"selectAccountType": "Seleccionar tipo de cuenta",
|
||||
"selectAtLeastOneFolder": "Selecciona al menos una carpeta",
|
||||
"selectAuthMethod": "Selecciona el método de autenticación",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "El puerto IMAP debe ser un número entero positivo",
|
||||
"incrementalSyncMustBeAtLeast10": "El intervalo de sincronización incremental debe ser de al menos 10 minutos",
|
||||
"incrementalSyncMustBeNumber": "El intervalo de sincronización incremental debe ser un número",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Dirección de correo electrónico inválida",
|
||||
"invalidUrl": "URL inválida",
|
||||
"passwordMinLength": "La contraseña debe tener al menos {{min}} caracteres",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Jatka",
|
||||
"createdAt": "Luotu",
|
||||
"creationFailed": "Luominen epäonnistui, yritä myöhemmin uudelleen",
|
||||
"cronAdvanced": "Edistynyt lauseke",
|
||||
"cronDaily": "Päivittäin",
|
||||
"cronDayOfMonth": "Viikonpäivä",
|
||||
"cronDayOfWeek": "Viikonpäivä",
|
||||
"cronFrequency": "Tiheys",
|
||||
"cronFriday": "Perjantai",
|
||||
"cronHour": "Tunti",
|
||||
"cronMinute": "Minuutti",
|
||||
"cronMonday": "Maanantai",
|
||||
"cronMonthly": "Kuukausittain",
|
||||
"cronSaturday": "Lauantai",
|
||||
"cronSimple": "Yksinkertainen lauseke",
|
||||
"cronSunday": "Sunnuntai",
|
||||
"cronThursday": "Torstai",
|
||||
"cronTimezoneNote": "Kaikki ajat palvelimen paikallista aikaa.",
|
||||
"cronTuesday": "Tiistai",
|
||||
"cronWednesday": "Keskiviikko",
|
||||
"cronWeekly": "Viikoittain",
|
||||
"dateSelection": "Päivämäärän valinta",
|
||||
"dateSince": "Päivämäärä alkaen",
|
||||
"days": "Päivää",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Lataustehtävän aloittaminen epäonnistui",
|
||||
"downloadInterval": "Latausväli (minuuttia)",
|
||||
"downloadIntervalPlaceholder": "Syötä minuutit",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-kenttäinen Cron (sek min tun pv kk vkpv) palvelimen ajassa. Korvaa aikavälin.",
|
||||
"downloadSchedulePlaceholder": "esim. 0 0 * * *",
|
||||
"downloadScope": "Latausstrategia",
|
||||
"downloadScopeDescription": "Valitse, mitkä sähköpostit indeksoidaan ja ladataan.",
|
||||
"downloadStarted": "Lataustehtävä aloitettu",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Tallenna muutokset",
|
||||
"scheduleMode": "Latauksen ajoitus",
|
||||
"scheduleModeCron": "Cron-lauseke",
|
||||
"scheduleModeDescription": "Lataa säännöllisin väliajoin tai Cron-lausekkeella.",
|
||||
"scheduleModeInterval": "Säännöllinen väliaika",
|
||||
"selectAccountType": "Valitse tilityyppi",
|
||||
"selectAtLeastOneFolder": "Valitse vähintään yksi kansio",
|
||||
"selectAuthMethod": "Valitse todennusmenetelmä",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP-portin on oltava positiivinen kokonaisluku",
|
||||
"incrementalSyncMustBeAtLeast10": "Lisäävän synkronoinnin välin on oltava vähintään 10 minuuttia",
|
||||
"incrementalSyncMustBeNumber": "Lisäävän synkronoinnin välin on oltava numero",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Virheellinen sähköpostiosoite",
|
||||
"invalidUrl": "Virheellinen URL-osoite",
|
||||
"passwordMinLength": "Salasanan on oltava vähintään {{min}} merkkiä pitkä",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Continuer",
|
||||
"createdAt": "Créé le",
|
||||
"creationFailed": "La création a échoué, veuillez réessayer plus tard",
|
||||
"cronAdvanced": "Expression avancée",
|
||||
"cronDaily": "Chaque jour",
|
||||
"cronDayOfMonth": "Jour de la semaine",
|
||||
"cronDayOfWeek": "Jour de la semaine",
|
||||
"cronFrequency": "Fréquence",
|
||||
"cronFriday": "Vendredi",
|
||||
"cronHour": "Heure",
|
||||
"cronMinute": "Minute",
|
||||
"cronMonday": "Lundi",
|
||||
"cronMonthly": "Chaque mois",
|
||||
"cronSaturday": "Samedi",
|
||||
"cronSimple": "Expression simple",
|
||||
"cronSunday": "Dimanche",
|
||||
"cronThursday": "Jeudi",
|
||||
"cronTimezoneNote": "Heures au fuseau horaire du serveur.",
|
||||
"cronTuesday": "Mardi",
|
||||
"cronWednesday": "Mercredi",
|
||||
"cronWeekly": "Chaque semaine",
|
||||
"dateSelection": "Sélection de Date",
|
||||
"dateSince": "Date Depuis",
|
||||
"days": "Jours",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Échec du lancement de la tâche de téléchargement",
|
||||
"downloadInterval": "Intervalle de téléchargement (minutes)",
|
||||
"downloadIntervalPlaceholder": "Entrer les minutes",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "Cron à 6 champs (sec min heure jour mois jour-sem) à l'heure du serveur. Remplace l'intervalle.",
|
||||
"downloadSchedulePlaceholder": "ex. 0 0 * * *",
|
||||
"downloadScope": "Stratégie de téléchargement",
|
||||
"downloadScopeDescription": "Choisissez les e-mails à indexer et à télécharger.",
|
||||
"downloadStarted": "Tâche de téléchargement lancée",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Enregistrer les Modifications",
|
||||
"scheduleMode": "Planification de téléchargement",
|
||||
"scheduleModeCron": "Expression Cron",
|
||||
"scheduleModeDescription": "Téléchargement par intervalle fixe ou expression Cron.",
|
||||
"scheduleModeInterval": "Intervalle fixe",
|
||||
"selectAccountType": "Sélectionner le type de compte",
|
||||
"selectAtLeastOneFolder": "Veuillez sélectionner au moins un dossier",
|
||||
"selectAuthMethod": "Sélectionner une méthode d'authentification",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "Le port IMAP doit être un entier positif",
|
||||
"incrementalSyncMustBeAtLeast10": "L'intervalle de synchronisation incrémentielle doit être d'au moins 10 minutes",
|
||||
"incrementalSyncMustBeNumber": "L'intervalle de synchronisation incrémentielle doit être un nombre",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Adresse e-mail non valide",
|
||||
"invalidUrl": "URL non valide",
|
||||
"passwordMinLength": "Le mot de passe doit contenir au moins {{min}} caractères",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Continua",
|
||||
"createdAt": "Creato Il",
|
||||
"creationFailed": "Creazione fallita, riprova più tardi",
|
||||
"cronAdvanced": "Espressione avanzata",
|
||||
"cronDaily": "Ogni giorno",
|
||||
"cronDayOfMonth": "Giorno della settimana",
|
||||
"cronDayOfWeek": "Giorno della settimana",
|
||||
"cronFrequency": "Frequenza",
|
||||
"cronFriday": "Venerdì",
|
||||
"cronHour": "Ora",
|
||||
"cronMinute": "Minuto",
|
||||
"cronMonday": "Lunedì",
|
||||
"cronMonthly": "Ogni mese",
|
||||
"cronSaturday": "Sabato",
|
||||
"cronSimple": "Espressione semplice",
|
||||
"cronSunday": "Domenica",
|
||||
"cronThursday": "Giovedì",
|
||||
"cronTimezoneNote": "Orari nel fuso orario del server.",
|
||||
"cronTuesday": "Martedì",
|
||||
"cronWednesday": "Mercoledì",
|
||||
"cronWeekly": "Ogni settimana",
|
||||
"dateSelection": "Selezione Data",
|
||||
"dateSince": "Data Da",
|
||||
"days": "Giorni",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Avvio attività di download non riuscito",
|
||||
"downloadInterval": "Intervallo di download (minuti)",
|
||||
"downloadIntervalPlaceholder": "Inserisci i minuti",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "Cron a 6 campi (sec min ora giorno mese giorno-sett) in ora del server. Sostituisce l'intervallo.",
|
||||
"downloadSchedulePlaceholder": "es. 0 0 * * *",
|
||||
"downloadScope": "Strategia di download",
|
||||
"downloadScopeDescription": "Scegli quali email indicizzare e scaricare.",
|
||||
"downloadStarted": "Attività di download avviata",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Salva Modifiche",
|
||||
"scheduleMode": "Pianificazione del download",
|
||||
"scheduleModeCron": "Espressione Cron",
|
||||
"scheduleModeDescription": "Download a intervalli fissi o tramite espressioni Cron.",
|
||||
"scheduleModeInterval": "Intervallo fisso",
|
||||
"selectAccountType": "Seleziona tipo di account",
|
||||
"selectAtLeastOneFolder": "Seleziona almeno una cartella",
|
||||
"selectAuthMethod": "Seleziona un metodo di autenticazione",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "La porta IMAP deve essere un numero intero positivo",
|
||||
"incrementalSyncMustBeAtLeast10": "L'intervallo di sincronizzazione incrementale deve essere di almeno 10 minuti",
|
||||
"incrementalSyncMustBeNumber": "L'intervallo di sincronizzazione incrementale deve essere un numero",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Indirizzo email non valido",
|
||||
"invalidUrl": "URL non valido",
|
||||
"passwordMinLength": "La password deve contenere almeno {{min}} caratteri",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "続行",
|
||||
"createdAt": "作成日時",
|
||||
"creationFailed": "作成に失敗しました。しばらくしてからもう一度お試しください。",
|
||||
"cronAdvanced": "高度な式",
|
||||
"cronDaily": "毎日",
|
||||
"cronDayOfMonth": "曜日",
|
||||
"cronDayOfWeek": "曜日",
|
||||
"cronFrequency": "頻度",
|
||||
"cronFriday": "金曜日",
|
||||
"cronHour": "时",
|
||||
"cronMinute": "分",
|
||||
"cronMonday": "月曜日",
|
||||
"cronMonthly": "毎月",
|
||||
"cronSaturday": "土曜日",
|
||||
"cronSimple": "簡易式",
|
||||
"cronSunday": "日曜日",
|
||||
"cronThursday": "木曜日",
|
||||
"cronTimezoneNote": "時間はサーバーの現地時間です。",
|
||||
"cronTuesday": "火曜日",
|
||||
"cronWednesday": "水曜日",
|
||||
"cronWeekly": "毎週",
|
||||
"dateSelection": "日付選択",
|
||||
"dateSince": "同期開始日",
|
||||
"days": "日",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "ダウンロードタスクの起動に失敗しました",
|
||||
"downloadInterval": "ダウンロード間隔 (分)",
|
||||
"downloadIntervalPlaceholder": "分を入力してください",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "サーバー時間の6フィールドCron式(秒分時日月曜日)。設定値より優先。",
|
||||
"downloadSchedulePlaceholder": "例:0 0 * * *",
|
||||
"downloadScope": "ダウンロード戦略",
|
||||
"downloadScopeDescription": "インデックスとダウンロードの対象となるメールを選択してください。",
|
||||
"downloadStarted": "ダウンロードタスクを開始しました",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "変更を保存",
|
||||
"scheduleMode": "ダウンロードスケジュール",
|
||||
"scheduleModeCron": "Cron式",
|
||||
"scheduleModeDescription": "固定間隔またはCron式でダウンロード。",
|
||||
"scheduleModeInterval": "固定間隔",
|
||||
"selectAccountType": "アカウントの種類を選択",
|
||||
"selectAtLeastOneFolder": "少なくとも1つのフォルダーを選択してください",
|
||||
"selectAuthMethod": "認証方式を選択",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAPポートは正の整数である必要があります",
|
||||
"incrementalSyncMustBeAtLeast10": "増分同期間隔は10分以上である必要があります",
|
||||
"incrementalSyncMustBeNumber": "増分同期間隔は数値である必要があります",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "無効なメールアドレスです",
|
||||
"invalidUrl": "無効なURLです",
|
||||
"passwordMinLength": "パスワードは{{min}}文字以上である必要があります",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "계속",
|
||||
"createdAt": "생성일",
|
||||
"creationFailed": "생성에 실패했습니다. 나중에 다시 시도하십시오.",
|
||||
"cronAdvanced": "고급 표현식",
|
||||
"cronDaily": "매일",
|
||||
"cronDayOfMonth": "요일",
|
||||
"cronDayOfWeek": "요일",
|
||||
"cronFrequency": "주기",
|
||||
"cronFriday": "금요일",
|
||||
"cronHour": "시",
|
||||
"cronMinute": "분",
|
||||
"cronMonday": "월요일",
|
||||
"cronMonthly": "매월",
|
||||
"cronSaturday": "토요일",
|
||||
"cronSimple": "간단한 표현식",
|
||||
"cronSunday": "일요일",
|
||||
"cronThursday": "목요일",
|
||||
"cronTimezoneNote": "모든 시간은 서버 현지 시간 기준입니다.",
|
||||
"cronTuesday": "화요일",
|
||||
"cronWednesday": "수요일",
|
||||
"cronWeekly": "매주",
|
||||
"dateSelection": "날짜 선택",
|
||||
"dateSince": "동기화 시작일",
|
||||
"days": "일",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "다운로드 작업 시작 실패",
|
||||
"downloadInterval": "다운로드 주기 (분)",
|
||||
"downloadIntervalPlaceholder": "분 단위 입력",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "서버 시간 기준 6필드 Cron(초 분 시 일 월 요일). 간격 설정보다 우선됨.",
|
||||
"downloadSchedulePlaceholder": "예: 0 0 * * *",
|
||||
"downloadScope": "다운로드 전략",
|
||||
"downloadScopeDescription": "색인화 및 다운로드할 이메일을 선택하십시오.",
|
||||
"downloadStarted": "다운로드 작업 시작됨",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "변경 사항 저장",
|
||||
"scheduleMode": "다운로드 일정",
|
||||
"scheduleModeCron": "Cron 표현식",
|
||||
"scheduleModeDescription": "고정 간격 또는 Cron 표현식으로 다운로드.",
|
||||
"scheduleModeInterval": "고정 간격",
|
||||
"selectAccountType": "계정 유형 선택",
|
||||
"selectAtLeastOneFolder": "하나 이상의 폴더를 선택하십시오",
|
||||
"selectAuthMethod": "인증 방법 선택",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP 포트는 양의 정수여야 합니다",
|
||||
"incrementalSyncMustBeAtLeast10": "증분 동기화 간격은 최소 10분 이상이어야 합니다",
|
||||
"incrementalSyncMustBeNumber": "증분 동기화 간격은 숫자여야 합니다",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "유효하지 않은 이메일 주소",
|
||||
"invalidUrl": "유효하지 않은 URL",
|
||||
"passwordMinLength": "비밀번호는 {{min}}자 이상이어야 합니다",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Doorgaan",
|
||||
"createdAt": "Aangemaakt Op",
|
||||
"creationFailed": "Aanmaken mislukt, probeer het later opnieuw",
|
||||
"cronAdvanced": "Geavanceerde expressie",
|
||||
"cronDaily": "Dagelijks",
|
||||
"cronDayOfMonth": "Dag van de week",
|
||||
"cronDayOfWeek": "Dag van de week",
|
||||
"cronFrequency": "Frequentie",
|
||||
"cronFriday": "Vrijdag",
|
||||
"cronHour": "Uur",
|
||||
"cronMinute": "Minuut",
|
||||
"cronMonday": "Maandag",
|
||||
"cronMonthly": "Maandelijks",
|
||||
"cronSaturday": "Zaterdag",
|
||||
"cronSimple": "Simpele expressie",
|
||||
"cronSunday": "Zondag",
|
||||
"cronThursday": "Donderdag",
|
||||
"cronTimezoneNote": "Alle tijden zijn server-lokale tijd.",
|
||||
"cronTuesday": "Dinsdag",
|
||||
"cronWednesday": "Woensdag",
|
||||
"cronWeekly": "Wekelijks",
|
||||
"dateSelection": "Datumselectie",
|
||||
"dateSince": "Datum Sinds",
|
||||
"days": "Dagen",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Downloadtaak starten mislukt",
|
||||
"downloadInterval": "Download-interval (minuten)",
|
||||
"downloadIntervalPlaceholder": "Voer minuten in",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-velds Cron (sec min uur dag maand dag-week) in servertijd. Overschrijft interval.",
|
||||
"downloadSchedulePlaceholder": "bijv. 0 0 * * *",
|
||||
"downloadScope": "Downloadstrategie",
|
||||
"downloadScopeDescription": "Kies welke e-mails moeten worden geïndexeerd en gedownload.",
|
||||
"downloadStarted": "Downloadtaak gestart",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Wijzigingen opslaan",
|
||||
"scheduleMode": "Downloadschema",
|
||||
"scheduleModeCron": "Cron-expressie",
|
||||
"scheduleModeDescription": "Downloaden via vaste intervallen o f Cron-expressies.",
|
||||
"scheduleModeInterval": "Vast interval",
|
||||
"selectAccountType": "Selecteer accounttype",
|
||||
"selectAtLeastOneFolder": "Selecteer alstublieft ten minste één map",
|
||||
"selectAuthMethod": "Selecteer een authenticatiemethode",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP poort moet een positief geheel getal zijn",
|
||||
"incrementalSyncMustBeAtLeast10": "Incrementaal sync interval moet ten minste 10 minuten zijn",
|
||||
"incrementalSyncMustBeNumber": "Incrementaal sync interval moet een nummer zijn",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Ongeldig e-mailadres",
|
||||
"invalidUrl": "Ongeldige URL",
|
||||
"passwordMinLength": "Wachtwoord moet ten minste {{min}} tekens lang zijn",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Fortsett",
|
||||
"createdAt": "Opprettet",
|
||||
"creationFailed": "Opprettelse mislyktes, prøv igjen senere",
|
||||
"cronAdvanced": "Avansert uttrykk",
|
||||
"cronDaily": "Daglig",
|
||||
"cronDayOfMonth": "Ugedag",
|
||||
"cronDayOfWeek": "Ugedag",
|
||||
"cronFrequency": "Frekvens",
|
||||
"cronFriday": "Fredag",
|
||||
"cronHour": "Time",
|
||||
"cronMinute": "Minutt",
|
||||
"cronMonday": "Mandag",
|
||||
"cronMonthly": "Månedlig",
|
||||
"cronSaturday": "Lørdag",
|
||||
"cronSimple": "Enkelt uttrykk",
|
||||
"cronSunday": "Søndag",
|
||||
"cronThursday": "Torsdag",
|
||||
"cronTimezoneNote": "Alle klokkeslett er serverens lokaltid.",
|
||||
"cronTuesday": "Tirsdag",
|
||||
"cronWednesday": "Onsdag",
|
||||
"cronWeekly": "Ukentlig",
|
||||
"dateSelection": "Datovalg",
|
||||
"dateSince": "Dato siden",
|
||||
"days": "Dager",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Kunne ikke starte nedlastingsoppgave",
|
||||
"downloadInterval": "Nedlastingsintervall (minutter)",
|
||||
"downloadIntervalPlaceholder": "Skriv inn minutter",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-felts Cron (sek min time dag mdr ukedag) i servertid. Overstyrer intervall.",
|
||||
"downloadSchedulePlaceholder": "f.eks.: 0 0 * * *",
|
||||
"downloadScope": "Nedlastingsstrategi",
|
||||
"downloadScopeDescription": "Velg hvilke e-poster som skal indekseres og lastes ned.",
|
||||
"downloadStarted": "Nedlastingsoppgave startet",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Lagre endringer",
|
||||
"scheduleMode": "Nedlastingsplan",
|
||||
"scheduleModeCron": "Cron-uttrykk",
|
||||
"scheduleModeDescription": "Nedlasting med faste intervaller eller Cron-uttrykk.",
|
||||
"scheduleModeInterval": "Fast intervall",
|
||||
"selectAccountType": "Velg kontotype",
|
||||
"selectAtLeastOneFolder": "Vennligst velg minst én mappe",
|
||||
"selectAuthMethod": "Velg en autentiseringsmetode",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP-port må være et positivt heltall",
|
||||
"incrementalSyncMustBeAtLeast10": "Intervall for inkrementell synkronisering må være minst 10 minutter",
|
||||
"incrementalSyncMustBeNumber": "Intervall for inkrementell synkronisering må være et tall",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Ugyldig e-postadresse",
|
||||
"invalidUrl": "Ugyldig URL",
|
||||
"passwordMinLength": "Passordet må være minst {{min}} tegn langt",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Kontynuj",
|
||||
"createdAt": "Utworzono",
|
||||
"creationFailed": "Bład tworzenia, spróbuj później",
|
||||
"cronAdvanced": "Zaawansowane wyrażenie",
|
||||
"cronDaily": "Codziennie",
|
||||
"cronDayOfMonth": "Dzień tygodnia",
|
||||
"cronDayOfWeek": "Dzień tygodnia",
|
||||
"cronFrequency": "Częstotliwość",
|
||||
"cronFriday": "Piątek",
|
||||
"cronHour": "Godzina",
|
||||
"cronMinute": "Minuta",
|
||||
"cronMonday": "Poniedziałek",
|
||||
"cronMonthly": "Co miesiąc",
|
||||
"cronSaturday": "Sobota",
|
||||
"cronSimple": "Proste wyrażenie",
|
||||
"cronSunday": "Niedziela",
|
||||
"cronThursday": "Czwartek",
|
||||
"cronTimezoneNote": "Czas według lokalnej strefy serwera.",
|
||||
"cronTuesday": "Wtorek",
|
||||
"cronWednesday": "Środa",
|
||||
"cronWeekly": "Co tydzień",
|
||||
"dateSelection": "Zaznaczenie daty",
|
||||
"dateSince": "Od kiedy",
|
||||
"days": "Dni",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Nie udało się uruchomić zadania pobierania",
|
||||
"downloadInterval": "Cykl pobierania (minuty)",
|
||||
"downloadIntervalPlaceholder": "Wprowadź minuty",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-polowy Cron (sek min godz dz msc dz-tyg) w czasie serwera. Nadpisuje interwał.",
|
||||
"downloadSchedulePlaceholder": "np. 0 0 * * *",
|
||||
"downloadScope": "Strategia pobierania",
|
||||
"downloadScopeDescription": "Wybierz, które wiadomości e-mail mają być indeksowane i pobierane.",
|
||||
"downloadStarted": "Uruchomiono zadanie pobierania",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Zapisz zmiany",
|
||||
"scheduleMode": "Harmonogram pobierania",
|
||||
"scheduleModeCron": "Wyrażenie Cron",
|
||||
"scheduleModeDescription": "Pobieranie w stałych odstępach lub przez wyrażenia Cron.",
|
||||
"scheduleModeInterval": "Stały odstęp",
|
||||
"selectAccountType": "Wybierz typ konta",
|
||||
"selectAtLeastOneFolder": "Wybierz co najmniej jeden folder",
|
||||
"selectAuthMethod": "Zaznacz metodę uwierzytelniania IMAP",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "Port IMAP musi być liczbą całkowitą dodatnią",
|
||||
"incrementalSyncMustBeAtLeast10": "Przyrostowy interwał synchronizacji musi wynosić co najmniej 10 minut",
|
||||
"incrementalSyncMustBeNumber": "Przyrostowy interwał synchronizacji musi być liczbą",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Niewłaściwy adres email",
|
||||
"invalidUrl": "Niewłaściwy URL",
|
||||
"passwordMinLength": "Hasło musi posiadać conajmniej {{min}} znaków",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Continuar",
|
||||
"createdAt": "Criado Em",
|
||||
"creationFailed": "Falha na criação, por favor, tente novamente mais tarde.",
|
||||
"cronAdvanced": "Expressão avançada",
|
||||
"cronDaily": "Diariamente",
|
||||
"cronDayOfMonth": "Dia da semana",
|
||||
"cronDayOfWeek": "Dia da semana",
|
||||
"cronFrequency": "Frequência",
|
||||
"cronFriday": "Sexta-feira",
|
||||
"cronHour": "Hora",
|
||||
"cronMinute": "Minuto",
|
||||
"cronMonday": "Segunda-feira",
|
||||
"cronMonthly": "Mensalmente",
|
||||
"cronSaturday": "Sábado",
|
||||
"cronSimple": "Expressão simples",
|
||||
"cronSunday": "Domingo",
|
||||
"cronThursday": "Quinta-feira",
|
||||
"cronTimezoneNote": "Horários no fuso horário do servidor.",
|
||||
"cronTuesday": "Terça-feira",
|
||||
"cronWednesday": "Quarta-feira",
|
||||
"cronWeekly": "Semanalmente",
|
||||
"dateSelection": "Seleção de Data",
|
||||
"dateSince": "Data de Início da Sincronização",
|
||||
"days": "Dias",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Falha ao iniciar tarefa de download",
|
||||
"downloadInterval": "Intervalo de download (minutos)",
|
||||
"downloadIntervalPlaceholder": "Insira os minutos",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "Cron de 6 campos (seg min hora dia mês dia-sem) na hora do servidor. Substitui o intervalo.",
|
||||
"downloadSchedulePlaceholder": "ex: 0 0 * * *",
|
||||
"downloadScope": "Estratégia de download",
|
||||
"downloadScopeDescription": "Escolha quais e-mails devem ser indexados e baixados.",
|
||||
"downloadStarted": "Tarefa de download iniciada",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Salvar Alterações",
|
||||
"scheduleMode": "Agendamento de download",
|
||||
"scheduleModeCron": "Expressão Cron",
|
||||
"scheduleModeDescription": "Download por intervalos fixos ou expressões Cron.",
|
||||
"scheduleModeInterval": "Intervalo fixo",
|
||||
"selectAccountType": "Selecionar tipo de conta",
|
||||
"selectAtLeastOneFolder": "Por favor, selecione pelo menos uma pasta",
|
||||
"selectAuthMethod": "Selecionar Método de Autenticação",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "A Porta IMAP deve ser um número inteiro positivo",
|
||||
"incrementalSyncMustBeAtLeast10": "O Intervalo de Sincronização Incremental deve ser de pelo menos 10 minutos",
|
||||
"incrementalSyncMustBeNumber": "O Intervalo de Sincronização Incremental deve ser um número",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Endereço de email inválido",
|
||||
"invalidUrl": "URL inválido",
|
||||
"passwordMinLength": "A senha deve ter pelo menos {{min}} caracteres",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Продолжить",
|
||||
"createdAt": "Создано",
|
||||
"creationFailed": "Ошибка создания, попробуйте позже",
|
||||
"cronAdvanced": "Расширенное выражение",
|
||||
"cronDaily": "Ежедневно",
|
||||
"cronDayOfMonth": "День недели",
|
||||
"cronDayOfWeek": "День недели",
|
||||
"cronFrequency": "Частота",
|
||||
"cronFriday": "Пятница",
|
||||
"cronHour": "Час",
|
||||
"cronMinute": "Минута",
|
||||
"cronMonday": "Понедельник",
|
||||
"cronMonthly": "Ежемесячно",
|
||||
"cronSaturday": "Суббота",
|
||||
"cronSimple": "Простое выражение",
|
||||
"cronSunday": "Воскресенье",
|
||||
"cronThursday": "Четверг",
|
||||
"cronTimezoneNote": "Время по местному часовому поясу сервера.",
|
||||
"cronTuesday": "Вторник",
|
||||
"cronWednesday": "Среда",
|
||||
"cronWeekly": "Еженедельно",
|
||||
"dateSelection": "Выбор даты",
|
||||
"dateSince": "Дата с",
|
||||
"days": "Дни",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Не удалось запустить задачу загрузки",
|
||||
"downloadInterval": "Интервал загрузки (мин.)",
|
||||
"downloadIntervalPlaceholder": "Введите минуты",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-польный Cron (сек мин час день мес день-нед) по времени сервера. Меняет интервал.",
|
||||
"downloadSchedulePlaceholder": "напр., 0 0 * * *",
|
||||
"downloadScope": "Стратегия загрузки",
|
||||
"downloadScopeDescription": "Выберите, какие электронные письма должны быть проиндексированы и скачаны.",
|
||||
"downloadStarted": "Задача загрузки запущена",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Сохранить изменения",
|
||||
"scheduleMode": "Расписание загрузки",
|
||||
"scheduleModeCron": "Выражение Cron",
|
||||
"scheduleModeDescription": "Загрузка с фиксированным интервалом или по Cron.",
|
||||
"scheduleModeInterval": "Фиксированный интервал",
|
||||
"selectAccountType": "Выберите тип аккаунта",
|
||||
"selectAtLeastOneFolder": "Пожалуйста, выберите хотя бы одну папку",
|
||||
"selectAuthMethod": "Выберите метод авторизации",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP порт должен быть положительным целым числом",
|
||||
"incrementalSyncMustBeAtLeast10": "Интервал инкрементальной синхронизации должен быть не менее 10 минут",
|
||||
"incrementalSyncMustBeNumber": "Интервал инкрементальной синхронизации должен быть числом",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Неверный адрес электронной почты",
|
||||
"invalidUrl": "Неверный URL",
|
||||
"passwordMinLength": "Пароль должен быть не менее {{min}} символов",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "Fortsätt",
|
||||
"createdAt": "Skapad",
|
||||
"creationFailed": "Skapande misslyckades, försök igen senare",
|
||||
"cronAdvanced": "Avancerat uttryck",
|
||||
"cronDaily": "Dagligen",
|
||||
"cronDayOfMonth": "Veckodag",
|
||||
"cronDayOfWeek": "Veckodag",
|
||||
"cronFrequency": "Frekvens",
|
||||
"cronFriday": "Fredag",
|
||||
"cronHour": "Timme",
|
||||
"cronMinute": "Minut",
|
||||
"cronMonday": "Måndag",
|
||||
"cronMonthly": "Månadsvis",
|
||||
"cronSaturday": "Lördag",
|
||||
"cronSimple": "Enkelt uttryck",
|
||||
"cronSunday": "Söndag",
|
||||
"cronThursday": "Torsdag",
|
||||
"cronTimezoneNote": "Alla tider visas i serverns lokaltid.",
|
||||
"cronTuesday": "Tisdag",
|
||||
"cronWednesday": "Onsdag",
|
||||
"cronWeekly": "Veckovis",
|
||||
"dateSelection": "Datumsval",
|
||||
"dateSince": "Datum från",
|
||||
"days": "Dagar",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "Misslyckades med att starta hämtningsuppgift",
|
||||
"downloadInterval": "Nedladdningsintervall (minuter)",
|
||||
"downloadIntervalPlaceholder": "Ange minuter",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "6-fälts Cron (sek min tim dag mån veckodag) i servertid. Ersätter intervall.",
|
||||
"downloadSchedulePlaceholder": "t.ex. 0 0 * * *",
|
||||
"downloadScope": "Nedladdningsstrategi",
|
||||
"downloadScopeDescription": "Välj vilka e-postmeddelanden som ska indexeras och laddas ner.",
|
||||
"downloadStarted": "Hämtningsuppgift startad",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "Spara ändringar",
|
||||
"scheduleMode": "Hämtningsschema",
|
||||
"scheduleModeCron": "Cron-uttryck",
|
||||
"scheduleModeDescription": "Hämta med fasta intervall eller Cron-uttryck.",
|
||||
"scheduleModeInterval": "Fast intervall",
|
||||
"selectAccountType": "Välj kontotyp",
|
||||
"selectAtLeastOneFolder": "Vänligen välj minst en mapp",
|
||||
"selectAuthMethod": "Välj en autentiseringsmetod",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP-port måste vara ett positivt heltal",
|
||||
"incrementalSyncMustBeAtLeast10": "Intervall för inkrementell synkronisering måste vara minst 10 minuter",
|
||||
"incrementalSyncMustBeNumber": "Intervall för inkrementell synkronisering måste vara ett tal",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "Ogiltig e-postadress",
|
||||
"invalidUrl": "Ogiltig URL",
|
||||
"passwordMinLength": "Lösenordet måste vara minst {{min}} tecken långt",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "繼續",
|
||||
"createdAt": "建立時間",
|
||||
"creationFailed": "建立失敗,請稍後再試。",
|
||||
"cronAdvanced": "高級表達式",
|
||||
"cronDaily": "每天",
|
||||
"cronDayOfMonth": "星期",
|
||||
"cronDayOfWeek": "星期",
|
||||
"cronFrequency": "頻率",
|
||||
"cronFriday": "星期五",
|
||||
"cronHour": "小時",
|
||||
"cronMinute": "分鐘",
|
||||
"cronMonday": "星期一",
|
||||
"cronMonthly": "每月",
|
||||
"cronSaturday": "星期六",
|
||||
"cronSimple": "简易表達式",
|
||||
"cronSunday": "星期日",
|
||||
"cronThursday": "星期四",
|
||||
"cronTimezoneNote": "所有時間均使用伺服器在地時區。",
|
||||
"cronTuesday": "星期二",
|
||||
"cronWednesday": "星期三",
|
||||
"cronWeekly": "每周",
|
||||
"dateSelection": "日期選擇",
|
||||
"dateSince": "同步起始日期",
|
||||
"days": "天",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "啟動下載任務失敗",
|
||||
"downloadInterval": "下載週期 (分鐘)",
|
||||
"downloadIntervalPlaceholder": "請輸入分鐘數",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "伺服器時間的 6 位 Cron 表達式(秒分時日月週),提供時覆蓋間隔設定。",
|
||||
"downloadSchedulePlaceholder": "例如:0 0 * * *",
|
||||
"downloadScope": "下載策略",
|
||||
"downloadScopeDescription": "選擇哪些郵件應被索引和下載。",
|
||||
"downloadStarted": "下載任務已啟動",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "儲存變更",
|
||||
"scheduleMode": "下載排程",
|
||||
"scheduleModeCron": "Cron 表達式",
|
||||
"scheduleModeDescription": "設定固定間隔或 Cron 表達式下載郵件。",
|
||||
"scheduleModeInterval": "固定間隔",
|
||||
"selectAccountType": "選擇郵件帳戶類型",
|
||||
"selectAtLeastOneFolder": "請至少選擇一個資料夾",
|
||||
"selectAuthMethod": "選擇驗證方法",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP 連接埠必須是正整數",
|
||||
"incrementalSyncMustBeAtLeast10": "增量同步間隔必須至少為 10 分鐘",
|
||||
"incrementalSyncMustBeNumber": "增量同步間隔必須是數字",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "無效的電子郵件地址",
|
||||
"invalidUrl": "無效的網址",
|
||||
"passwordMinLength": "密碼長度必須至少 {{min}} 個字元",
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
"continue": "继续",
|
||||
"createdAt": "创建时间",
|
||||
"creationFailed": "创建失败,请稍后重试",
|
||||
"cronAdvanced": "高级表达式",
|
||||
"cronDaily": "每天",
|
||||
"cronDayOfMonth": "星期",
|
||||
"cronDayOfWeek": "星期",
|
||||
"cronFrequency": "频率",
|
||||
"cronFriday": "星期五",
|
||||
"cronHour": "小时",
|
||||
"cronMinute": "分钟",
|
||||
"cronMonday": "星期一",
|
||||
"cronMonthly": "每月",
|
||||
"cronSaturday": "星期六",
|
||||
"cronSimple": "简易表达式",
|
||||
"cronSunday": "星期日",
|
||||
"cronThursday": "星期四",
|
||||
"cronTimezoneNote": "所有时间均使用服务器本地时区。",
|
||||
"cronTuesday": "星期二",
|
||||
"cronWednesday": "星期三",
|
||||
"cronWeekly": "每周",
|
||||
"dateSelection": "日期选择",
|
||||
"dateSince": "起始日期",
|
||||
"days": "天",
|
||||
@@ -133,6 +151,9 @@
|
||||
"downloadFailed": "启动下载任务失败",
|
||||
"downloadInterval": "下载周期 (分钟)",
|
||||
"downloadIntervalPlaceholder": "请输入分钟数",
|
||||
"downloadSchedule": "Cron Schedule",
|
||||
"downloadScheduleDescription": "服务器时间的 6 位 Cron 表达式(秒分时日月周),提供时覆盖间隔设置。",
|
||||
"downloadSchedulePlaceholder": "例如:0 0 * * *",
|
||||
"downloadScope": "下载策略",
|
||||
"downloadScopeDescription": "选择哪些邮件应被索引和下载。",
|
||||
"downloadStarted": "下载任务已启动",
|
||||
@@ -247,6 +268,10 @@
|
||||
}
|
||||
},
|
||||
"saveChanges": "保存更改",
|
||||
"scheduleMode": "下载调度",
|
||||
"scheduleModeCron": "Cron 表达式",
|
||||
"scheduleModeDescription": "设置固定间隔或 Cron 表达式下载邮件。",
|
||||
"scheduleModeInterval": "固定间隔",
|
||||
"selectAccountType": "选择邮件账户类型",
|
||||
"selectAtLeastOneFolder": "请至少选择一个文件夹",
|
||||
"selectAuthMethod": "选择认证方法",
|
||||
@@ -1658,6 +1683,7 @@
|
||||
"imapPortMustBePositive": "IMAP 端口必须是正整数",
|
||||
"incrementalSyncMustBeAtLeast10": "增量同步间隔必须至少为 10 分钟",
|
||||
"incrementalSyncMustBeNumber": "增量同步间隔必须是数字",
|
||||
"invalidCronExpression": "Invalid cron expression. Must be 6 fields: second minute hour day-of-month month day-of-week (e.g. '0 0 0 * * *')",
|
||||
"invalidEmail": "无效的电子邮件地址",
|
||||
"invalidUrl": "无效的 URL",
|
||||
"passwordMinLength": "密码长度至少为 {{min}} 个字符",
|
||||
|
||||
Reference in New Issue
Block a user