refactor: reorder import UI flow to select files before folder

This commit is contained in:
rustmailer
2026-08-19 15:00:06 +08:00
parent 1b2952a6b0
commit eaba876de5
19 changed files with 371 additions and 257 deletions

View File

@@ -363,196 +363,20 @@ export default function ImportPage() {
</Command>
</PopoverContent>
</Popover>
{!accountId && (
<p className="text-xs text-destructive mt-1.5 flex items-center gap-1">
<AlertTriangle className="h-3 w-3" />
{t('import.selectAccountRequired', 'Please select a target account before importing.')}
</p>
)}
</div>
</CardContent>
</Card>
{/* Step 2: Folder determination mode */}
{/* Step 2: File upload */}
<Card>
<CardHeader className="pb-3">
<CardTitle className="text-sm font-medium">
{isPstSelected
? t('import.folderStructure', '2. Folder structure')
: t('import.folderMethod', '2. Choose folder method')}
</CardTitle>
<CardDescription className="text-xs">
{isPstSelected
? t('import.pstFolderDesc', 'The PST file contains its own folder structure (e.g. Inbox, Sent Items, etc.). Folders will be automatically created during import.')
: files.length === 0
? t('import.selectFileFirst', 'Select a file first to determine available options.')
: t('import.folderMethodDesc', 'How should the target mail folder be determined?')}
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
{!isPstSelected && (
<RadioGroup
value={folderMode}
onValueChange={(v) => handleModeChange(v as FolderMode)}
className="gap-3"
>
{/* Mode 1: Auto-detect from headers */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'header'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
)}
>
<RadioGroupItem value="header" id="mode-header" className="mt-0.5" />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<Sparkles className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeHeader', 'Auto-detect from email headers')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeHeaderDesc', 'Read X-Gmail-Labels / X-Bichon-Metadata from the uploaded file. Falls back to filename.')}
</p>
{folderMode === 'header' && (
<div className="mt-2 flex items-center gap-2">
<Badge variant="secondary" className="text-xs font-normal">
{folderHint
? t('import.detectedFolder', 'Detected') + ': ' + headerFolder
: t('import.noFileYet', 'No file selected yet')}
</Badge>
{folderHint && (
<span className="text-[10px] text-muted-foreground">
({t('import.source')}: {folderHintLabel(folderHint)}{files.length > 1 && `, ${folderHint.fileName}`})
</span>
)}
</div>
)}
</div>
</label>
{/* Mode 2: Pick from existing mailboxes */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'existing'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
!accountId && 'opacity-50 pointer-events-none',
)}
>
<RadioGroupItem value="existing" id="mode-existing" className="mt-0.5" disabled={!accountId} />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<ListTree className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeExisting', 'Choose from existing mailboxes')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeExistingDesc', 'Select one of the mailboxes already present in this account.')}
</p>
{folderMode === 'existing' && (
<div className="mt-2">
{mailboxes.length === 0 ? (
<span className="text-xs text-muted-foreground">
{accountId
? t('import.noMailboxes', 'No mailboxes found in this account.')
: t('import.selectAccountFirst', 'Select an account first.')}
</span>
) : (
<Popover open={mailboxOpen} onOpenChange={setMailboxOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
role="combobox"
className="h-8 justify-between text-xs max-w-xs w-full"
>
<span className="truncate">
{folder || t('import.selectMailbox', 'Select a mailbox...')}
</span>
<ChevronsUpDown className="ml-2 h-3.5 w-3.5 shrink-0 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[280px] p-0" align="start">
<Command>
<CommandInput
placeholder={t('import.searchMailbox', 'Search mailboxes...')}
className="h-9 text-xs"
/>
<CommandList>
<CommandEmpty>
{t('import.noMailboxFound', 'No mailbox found.')}
</CommandEmpty>
<CommandGroup>
{mailboxes.map((mb) => (
<CommandItem
key={mb.id}
value={mb.name}
onSelect={(value) => {
setFolder(value);
setMailboxOpen(false);
}}
className='text-xs'
>
<Check
className={cn(
'h-4 w-4',
folder === mb.name ? 'opacity-100' : 'opacity-0',
)}
/>
{mb.name}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
)}
</div>
)}
</div>
</label>
{/* Mode 3: Manual input */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'custom'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
)}
>
<RadioGroupItem value="custom" id="mode-custom" className="mt-0.5" />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<PenLine className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeCustom', 'Enter a custom folder name')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeCustomDesc', 'Manually type the target mail folder name.')}
</p>
{folderMode === 'custom' && (
<div className="mt-2">
<Input
className="h-8 text-xs max-w-xs"
value={folder}
onChange={(e) => setFolder(e.target.value)}
placeholder="INBOX"
/>
</div>
)}
</div>
</label>
</RadioGroup>
)}
</CardContent>
</Card>
{/* Step 3: File upload */}
<Card>
<CardHeader className="pb-3">
<CardTitle className="text-sm font-medium">
{t('import.chooseFiles', '3. Choose files')}
{t('import.chooseFiles', '2. Choose files')}
</CardTitle>
<CardDescription className="text-xs">
{t('import.limits', {
@@ -631,9 +455,194 @@ export default function ImportPage() {
))}
</div>
)}
{files.length === 0 && phase === 'idle' && (
<div className="mt-3 text-xs text-destructive flex items-center gap-1.5">
<AlertTriangle className="h-3.5 w-3.5" />
<span>{t('import.noFilesSelected')}</span>
</div>
)}
</CardContent>
</Card>
{/* Step 3: Folder determination mode */}
<Card>
<CardHeader className="pb-3">
<CardTitle className="text-sm font-medium">
{isPstSelected
? t('import.folderStructure', '3. Folder structure')
: t('import.folderMethod', '3. Choose folder method')}
</CardTitle>
<CardDescription className="text-xs">
{isPstSelected
? t('import.pstFolderDesc', 'The PST file contains its own folder structure (e.g. Inbox, Sent Items, etc.). Folders will be automatically created during import.')
: files.length === 0
? t('import.selectFileFirst', 'Select a file first to determine available options.')
: t('import.folderMethodDesc', 'How should the target mail folder be determined?')}
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
{!isPstSelected && (
<RadioGroup
value={folderMode}
onValueChange={(v) => handleModeChange(v as FolderMode)}
className="gap-3"
>
{/* Mode 1: Auto-detect from headers */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'header'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
)}
>
<RadioGroupItem value="header" id="mode-header" className="mt-0.5" />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<Sparkles className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeHeader', 'Auto-detect from email headers')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeHeaderDesc', 'Read X-Gmail-Labels / X-Bichon-Metadata from the uploaded file. Falls back to filename.')}
</p>
{folderMode === 'header' && (
<div className="mt-2 flex items-center gap-2">
<Badge variant="secondary" className="text-xs font-normal">
{folderHint
? t('import.detectedFolder', 'Detected') + ': ' + headerFolder
: t('import.noFileYet', 'No file selected yet')}
</Badge>
{folderHint && (
<span className="text-[10px] text-muted-foreground">
({t('import.source')}: {folderHintLabel(folderHint)}{files.length > 1 && `, ${folderHint.fileName}`})
</span>
)}
</div>
)}
</div>
</label>
{/* Mode 2: Pick from existing mailboxes */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'existing'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
!accountId && 'opacity-50 pointer-events-none',
)}
>
<RadioGroupItem value="existing" id="mode-existing" className="mt-0.5" disabled={!accountId} />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<ListTree className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeExisting', 'Choose from existing mailboxes')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeExistingDesc', 'Select one of the mailboxes already present in this account.')}
</p>
{folderMode === 'existing' && (
<div className="mt-2">
{mailboxes.length === 0 ? (
<span className="text-xs text-muted-foreground">
{accountId
? t('import.noMailboxes', 'No mailboxes found in this account.')
: t('import.selectAccountFirst', 'Select an account first.')}
</span>
) : (
<Popover open={mailboxOpen} onOpenChange={setMailboxOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
role="combobox"
className="h-8 justify-between text-xs max-w-xs w-full"
>
<span className="truncate">
{folder || t('import.selectMailbox', 'Select a mailbox...')}
</span>
<ChevronsUpDown className="ml-2 h-3.5 w-3.5 shrink-0 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[280px] p-0" align="start">
<Command>
<CommandInput
placeholder={t('import.searchMailbox', 'Search mailboxes...')}
className="h-9 text-xs"
/>
<CommandList>
<CommandEmpty>
{t('import.noMailboxFound', 'No mailbox found.')}
</CommandEmpty>
<CommandGroup>
{mailboxes.map((mb) => (
<CommandItem
key={mb.id}
value={mb.name}
onSelect={(value) => {
setFolder(value);
setMailboxOpen(false);
}}
className='text-xs'
>
<Check
className={cn(
'h-4 w-4',
folder === mb.name ? 'opacity-100' : 'opacity-0',
)}
/>
{mb.name}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
)}
</div>
)}
</div>
</label>
{/* Mode 3: Manual input */}
<label
className={cn(
'flex items-start gap-3 rounded-lg border p-3 cursor-pointer transition-colors',
folderMode === 'custom'
? 'border-primary bg-primary/5'
: 'border-border hover:bg-muted/50',
)}
>
<RadioGroupItem value="custom" id="mode-custom" className="mt-0.5" />
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<PenLine className="h-4 w-4 text-primary" />
<span className="text-sm font-medium">
{t('import.modeCustom', 'Enter a custom folder name')}
</span>
</div>
<p className="text-xs text-muted-foreground mt-1">
{t('import.modeCustomDesc', 'Manually type the target mail folder name.')}
</p>
{folderMode === 'custom' && (
<div className="mt-2">
<Input
className="h-8 text-xs max-w-xs"
value={folder}
onChange={(e) => setFolder(e.target.value)}
placeholder="INBOX"
/>
</div>
)}
</div>
</label>
</RadioGroup>
)}
</CardContent>
</Card>
{/* Step 4: Progress & Results */}
{(phase !== 'idle' || progress) && (
<Card>
@@ -707,27 +716,43 @@ export default function ImportPage() {
</Card>
)}
{/* Import button */}
<div className="flex justify-between items-center">
<div className="text-xs text-muted-foreground">
{isPstSelected
? t('import.pstFolders', 'PST folder structure will be preserved during import')
: (<>{t('import.willImportTo', 'Will import to')}: <span className="font-medium text-foreground">{effectiveFolder}</span>{files.length > 1 && <> · {t('import.fileCount', { count: files.length })}</>}</>)}
<div className="flex flex-col gap-2">
<div className="flex justify-between items-center">
<div className="text-xs text-muted-foreground">
{isPstSelected
? t('import.pstFolders', 'PST folder structure will be preserved during import')
: (<>{t('import.willImportTo', 'Will import to')}: <span className="font-medium text-foreground">{effectiveFolder}</span>{files.length > 1 && <> · {t('import.fileCount', { count: files.length })}</>}</>)}
</div>
<Button
onClick={() => importMutation.mutate()}
disabled={!canImport || importMutation.isPending}
className="gap-2"
>
{importMutation.isPending ? (
<Upload className="h-4 w-4 animate-pulse" />
) : (
<Upload className="h-4 w-4" />
)}
{t('import.startImport', 'Import')}
</Button>
</div>
<Button
onClick={() => importMutation.mutate()}
disabled={!canImport || importMutation.isPending}
className="gap-2"
>
{importMutation.isPending ? (
<Upload className="h-4 w-4 animate-pulse" />
) : (
<Upload className="h-4 w-4" />
)}
{t('import.startImport', 'Import')}
</Button>
{(!accountId || files.length === 0) && (
<div className="text-xs text-destructive flex items-center justify-end gap-1.5">
<AlertTriangle className="h-3.5 w-3.5" />
<span>
{!accountId && !files.length && (
t('import.selectAccountAndFiles', 'Please select a target account and files first.')
)}
{!accountId && files.length > 0 && (
t('import.selectAccountRequired', 'Please select a target account first.')
)}
{accountId && files.length === 0 && (
t('import.selectFilesRequired', 'Please select files to import.')
)}
</span>
</div>
)}
</div>
{/* Import history */}
{history.length > 0 && (
<CollapsibleHistory

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "الحساب",
"chooseFiles": "3. اختر الملفات",
"chooseFiles": "2. اختر الملفات",
"completed": "اكتمل الاستيراد",
"description": "استيراد ملفات البريد إلى حساب محلي (NoSync). للملفات الكبيرة، استخدم CLI.",
"detectedFolder": "مكتشف",
@@ -730,10 +730,11 @@
"failed": "فشل الاستيراد",
"failedCount": "{{count}} فشل",
"failedDetails": "العناصر الفاشلة",
"fileCount": "{{count}} ملف",
"folder": "المجلد",
"folderMethod": "2. اختر طريقة تحديد المجلد",
"folderMethod": "3. اختر طريقة تحديد المجلد",
"folderMethodDesc": "كيف سيتم تحديد مجلد البريد المستهدف؟",
"folderStructure": "2. هيكل المجلدات",
"folderStructure": "3. هيكل المجلدات",
"importHistory": "سجل الاستيراد",
"limits": "الحد الأقصى: EML 100 م.ب · MBOX {{maxMbox}} م.ب · PST {{maxPst}} م.ب. للملفات الأكبر ← CLI.",
"modeCustom": "أدخل اسم مجلد مخصص",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "قراءة X-Gmail-Labels / X-Bichon-Metadata من الملف. يعتمد على اسم الملف كبديل.",
"noAccountFound": "لم يتم العثور على حساب.",
"noFileYet": "لم يتم اختيار أي ملف بعد",
"noFilesSelected": "لم يتم تحديد أي ملفات",
"noMailboxFound": "لم يتم العثور على صندوق بريد.",
"noMailboxes": "لم يتم العثور على صناديق بريد في هذا الحساب.",
"orClick": "أو انقر للتصفح",
@@ -754,8 +756,11 @@
"searchAccount": "البحث عن الحسابات...",
"searchMailbox": "البحث عن صناديق البريد...",
"selectAccount": "اختر حسابًا",
"selectAccountAndFiles": "يرجى تحديد الحساب المستهدف والملفات أولاً.",
"selectAccountFirst": "يرجى اختيار حساب أولاً.",
"selectAccountRequired": "يرجى تحديد الحساب المستهدف أولاً.",
"selectFileFirst": "يرجى اختيار ملف أولاً لتحديد الخيارات المتاحة.",
"selectFilesRequired": "يرجى تحديد الملفات للاستيراد.",
"selectMailbox": "اختر صندوق بريد...",
"source": "المصدر",
"startImport": "استيراد",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Konto",
"chooseFiles": "3. Vælg filer",
"chooseFiles": "2. Vælg filer",
"completed": "Import fuldført",
"description": "Importer e-mailfiler til en lokal konto (NoSync). Brug CLI til større filer.",
"detectedFolder": "Registreret",
@@ -730,10 +730,11 @@
"failed": "Import mislykkedes",
"failedCount": "{{count}} fejlet",
"failedDetails": "Fejlede elementer",
"fileCount": "{{count}} filer",
"folder": "Mappe",
"folderMethod": "2. Vælg mappemetode",
"folderMethod": "3. Vælg mappemetode",
"folderMethodDesc": "Hvordan skal destinationsmappen bestemmes?",
"folderStructure": "2. Mappestruktur",
"folderStructure": "3. Mappestruktur",
"importHistory": "Importhistorik",
"limits": "Maks: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Større filer → CLI.",
"modeCustom": "Indtast et brugerdefineret mappenavn",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Læs X-Gmail-Labels / X-Bichon-Metadata fra filen. Falder tilbage til filnavn.",
"noAccountFound": "Ingen konto fundet.",
"noFileYet": "Ingen fil valgt endnu",
"noFilesSelected": "Ingen filer valgt",
"noMailboxFound": "Ingen postkasse fundet.",
"noMailboxes": "Ingen postkasser fundet på denne konto.",
"orClick": "eller klik for at gennemse",
@@ -754,8 +756,11 @@
"searchAccount": "Søg efter konti...",
"searchMailbox": "Søg efter postkasser...",
"selectAccount": "Vælg en konto",
"selectAccountAndFiles": "Vælg venligst en målkonto og filer først.",
"selectAccountFirst": "Vælg en konto først.",
"selectAccountRequired": "Vælg venligst en målkonto først.",
"selectFileFirst": "Vælg en fil først for at bestemme tilgængelige muligheder.",
"selectFilesRequired": "Vælg venligst filer, der skal importeres.",
"selectMailbox": "Vælg en postkasse...",
"source": "kilde",
"startImport": "Importer",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Konto",
"chooseFiles": "3. Dateien auswählen",
"chooseFiles": "2. Dateien auswählen",
"completed": "Import abgeschlossen",
"description": "E-Mail-Dateien in ein lokales Konto (NoSync) importieren. Für größere Dateien CLI nutzen.",
"detectedFolder": "Erkannt",
@@ -730,10 +730,11 @@
"failed": "Import fehlgeschlagen",
"failedCount": "{{count}} fehlgeschlagen",
"failedDetails": "Fehlgeschlagene Elemente",
"fileCount": "{{count}} Dateien",
"folder": "Ordner",
"folderMethod": "2. Ordnermethode wählen",
"folderMethod": "3. Ordnermethode wählen",
"folderMethodDesc": "Wie soll der Zielordner bestimmt werden?",
"folderStructure": "2. Ordnerstruktur",
"folderStructure": "3. Ordnerstruktur",
"importHistory": "Importverlauf",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Größere Dateien → CLI.",
"modeCustom": "Benutzerdefinierten Ordnernamen eingeben",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Liest X-Gmail-Labels / X-Bichon-Metadata aus der Datei. Fallback auf Dateiname.",
"noAccountFound": "Kein Konto gefunden.",
"noFileYet": "Noch keine Datei ausgewählt",
"noFilesSelected": "Keine Dateien ausgewählt",
"noMailboxFound": "Kein Postfach gefunden.",
"noMailboxes": "Keine Postfächer in diesem Konto gefunden.",
"orClick": "oder zum Durchsuchen klicken",
@@ -754,8 +756,11 @@
"searchAccount": "Konten suchen...",
"searchMailbox": "Postfächer suchen...",
"selectAccount": "Konto auswählen",
"selectAccountAndFiles": "Bitte wählen Sie zuerst ein Zielkonto und Dateien aus.",
"selectAccountFirst": "Wählen Sie zuerst ein Konto aus.",
"selectAccountRequired": "Bitte wählen Sie zuerst ein Zielkonto aus.",
"selectFileFirst": "Wählen Sie zuerst eine Datei aus, um die verfügbaren Optionen zu ermitteln.",
"selectFilesRequired": "Bitte wählen Sie die zu importierenden Dateien aus.",
"selectMailbox": "Postfach auswählen...",
"source": "Quelle",
"startImport": "Importieren",

View File

@@ -733,7 +733,7 @@
},
"import": {
"account": "Account",
"chooseFiles": "3. Choose files",
"chooseFiles": "2. Choose files",
"completed": "Import complete",
"description": "Import email files into a local account (NoSync). For larger files, use the CLI.",
"detectedFolder": "Detected",
@@ -744,9 +744,9 @@
"failedDetails": "Failed items",
"fileCount": "{{count}} files",
"folder": "Folder",
"folderMethod": "2. Choose folder method",
"folderMethod": "3. Choose folder method",
"folderMethodDesc": "How should the target mail folder be determined?",
"folderStructure": "2. Folder structure",
"folderStructure": "3. Folder structure",
"importHistory": "Import History",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Larger files → CLI.",
"modeCustom": "Enter a custom folder name",
@@ -757,6 +757,7 @@
"modeHeaderDesc": "Read X-Gmail-Labels / X-Bichon-Metadata from the uploaded file. Falls back to filename.",
"noAccountFound": "No account found.",
"noFileYet": "No file selected yet",
"noFilesSelected": "No files selected",
"noMailboxFound": "No mailbox found.",
"noMailboxes": "No mailboxes found in this account.",
"orClick": "or click to browse",
@@ -767,8 +768,11 @@
"searchAccount": "Search accounts...",
"searchMailbox": "Search mailboxes...",
"selectAccount": "Select an account",
"selectAccountAndFiles": "Please select a target account and files first.",
"selectAccountFirst": "Select an account first.",
"selectAccountRequired": "Please select a target account first.",
"selectFileFirst": "Select a file first to determine available options.",
"selectFilesRequired": "Please select files to import.",
"selectMailbox": "Select a mailbox...",
"source": "source",
"startImport": "Import",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Cuenta",
"chooseFiles": "3. Seleccionar archivos",
"chooseFiles": "2. Seleccionar archivos",
"completed": "Importación completada",
"description": "Importar archivos de correo a una cuenta local (NoSync). Para archivos más grandes, use la CLI.",
"detectedFolder": "Detectado",
@@ -730,10 +730,11 @@
"failed": "Error al importar",
"failedCount": "{{count}} fallidos",
"failedDetails": "Elementos fallidos",
"fileCount": "{{count}} archivos",
"folder": "Carpeta",
"folderMethod": "2. Elegir método de carpeta",
"folderMethod": "3. Elegir método de carpeta",
"folderMethodDesc": "¿Cómo se debe determinar la carpeta de correo de destino?",
"folderStructure": "2. Estructura de carpetas",
"folderStructure": "3. Estructura de carpetas",
"importHistory": "Historial de importación",
"limits": "Máx: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Archivos más grandes → CLI.",
"modeCustom": "Ingresar un nombre de carpeta personalizado",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Lee X-Gmail-Labels / X-Bichon-Metadata del archivo. Alternativa: nombre del archivo.",
"noAccountFound": "No se encontró ninguna cuenta.",
"noFileYet": "Ningún archivo seleccionado",
"noFilesSelected": "No hay archivos seleccionados",
"noMailboxFound": "No se encontró ningún buzón.",
"noMailboxes": "No se encontraron buzones en esta cuenta.",
"orClick": "o haga clic para buscar",
@@ -754,8 +756,11 @@
"searchAccount": "Buscar cuentas...",
"searchMailbox": "Buscar buzones...",
"selectAccount": "Seleccionar una cuenta",
"selectAccountAndFiles": "Seleccione primero una cuenta de destino y los archivos.",
"selectAccountFirst": "Seleccione una cuenta primero.",
"selectAccountRequired": "Seleccione primero una cuenta de destino.",
"selectFileFirst": "Seleccione un archivo primero para determinar las opciones disponibles.",
"selectFilesRequired": "Seleccione los archivos que desea importar.",
"selectMailbox": "Seleccionar buzón...",
"source": "origen",
"startImport": "Importar",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Tili",
"chooseFiles": "3. Valitse tiedostot",
"chooseFiles": "2. Valitse tiedostot",
"completed": "Tuonti valmis",
"description": "Tuo sähköpostitiedostoja paikalliselle tilille (NoSync). Käytä CLI:tä suuremmille tiedostoille.",
"detectedFolder": "Tunnistettu",
@@ -730,10 +730,11 @@
"failed": "Tuonti epäonnistui",
"failedCount": "{{count}} epäonnistui",
"failedDetails": "Epäonnistuneet kohteet",
"fileCount": "{{count}} tiedostoa",
"folder": "Kansio",
"folderMethod": "2. Valitse kansiomenetelmä",
"folderMethod": "3. Valitse kansiomenetelmä",
"folderMethodDesc": "Miten kohdekansio tulisi määrittää?",
"folderStructure": "2. Kansionrakenne",
"folderStructure": "3. Kansionrakenne",
"importHistory": "Tuontihistoria",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Suuremmat tiedostot → CLI.",
"modeCustom": "Syötä mukautettu kansion nimi",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Lue X-Gmail-Labels / X-Bichon-Metadata tiedostosta. Varajärjestelmänä tiedostonimi.",
"noAccountFound": "Tiliä ei löytynyt.",
"noFileYet": "Ei valittua tiedostoa",
"noFilesSelected": "Ei valittuja tiedostoja",
"noMailboxFound": "Postilaatikkoa ei löytynyt.",
"noMailboxes": "Tältä tililtä ei löytynyt postilaatikoita.",
"orClick": "tai napsauta selataksesi",
@@ -754,8 +756,11 @@
"searchAccount": "Etsi tilejä...",
"searchMailbox": "Etsi postilaatikoita...",
"selectAccount": "Valitse tili",
"selectAccountAndFiles": "Valitse ensin kohdetili ja tiedostot.",
"selectAccountFirst": "Valitse ensin tili.",
"selectAccountRequired": "Valitse ensin kohdetili.",
"selectFileFirst": "Valitse ensin tiedosto määrittääksesi käytettävissä olevat vaihtoehdot.",
"selectFilesRequired": "Valitse tuotavat tiedostot.",
"selectMailbox": "Valitse postilaatikko...",
"source": "lähde",
"startImport": "Tuo",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Compte",
"chooseFiles": "3. Choisir les fichiers",
"chooseFiles": "2. Choisir les fichiers",
"completed": "Importation terminée",
"description": "Importer des fichiers d'e-mails dans un compte local (NoSync). Pour les gros fichiers, utilisez le CLI.",
"detectedFolder": "Détecté",
@@ -730,10 +730,11 @@
"failed": "Échec de l'importation",
"failedCount": "{{count}} échoué(s)",
"failedDetails": "Éléments en échec",
"fileCount": "{{count}} fichiers",
"folder": "Dossier",
"folderMethod": "2. Choisir la méthode de dossier",
"folderMethod": "3. Choisir la méthode de dossier",
"folderMethodDesc": "Comment le dossier de destination doit-il être déterminé ?",
"folderStructure": "2. Structure des dossiers",
"folderStructure": "3. Structure des dossiers",
"importHistory": "Historique d'importation",
"limits": "Max : EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Fichiers plus volumineux → CLI.",
"modeCustom": "Saisir un nom de dossier personnalisé",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Lit X-Gmail-Labels / X-Bichon-Metadata depuis le fichier. Alternative : nom du fichier.",
"noAccountFound": "Aucun compte trouvé.",
"noFileYet": "Aucun fichier sélectionné",
"noFilesSelected": "Aucun fichier sélectionné",
"noMailboxFound": "Aucune boîte aux lettres trouvée.",
"noMailboxes": "Aucune boîte aux lettres trouvée dans ce compte.",
"orClick": "ou cliquez pour parcourir",
@@ -754,8 +756,11 @@
"searchAccount": "Rechercher des comptes...",
"searchMailbox": "Rechercher des boîtes...",
"selectAccount": "Sélectionner un compte",
"selectAccountAndFiles": "Veuillez d'abord sélectionner un compte cible et des fichiers.",
"selectAccountFirst": "Sélectionnez d'abord un compte.",
"selectAccountRequired": "Veuillez d'abord sélectionner un compte cible.",
"selectFileFirst": "Sélectionnez d'abord un fichier si vous souhaitez déterminer les options disponibles.",
"selectFilesRequired": "Veuillez sélectionner les fichiers à importer.",
"selectMailbox": "Sélectionner une boîte...",
"source": "source",
"startImport": "Importer",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Account",
"chooseFiles": "3. Scegli i file",
"chooseFiles": "2. Scegli i file",
"completed": "Importazione completata",
"description": "Importa file email in un account locale (NoSync). Per file più grandi, usa la CLI.",
"detectedFolder": "Rilevato",
@@ -730,10 +730,11 @@
"failed": "Importazione fallita",
"failedCount": "{{count}} falliti",
"failedDetails": "Elementi falliti",
"fileCount": "{{count}} file",
"folder": "Cartella",
"folderMethod": "2. Scegli il metodo della cartella",
"folderMethod": "3. Scegli il metodo della cartella",
"folderMethodDesc": "Come determinare la cartella di posta di destinazione?",
"folderStructure": "2. Struttura delle cartelle",
"folderStructure": "3. Struttura delle cartelle",
"importHistory": "Cronologia importazioni",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. File più grandi → CLI.",
"modeCustom": "Inserisci un nome cartella personalizzato",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Legge X-Gmail-Labels / X-Bichon-Metadata dal file. Alternativa: nome del file.",
"noAccountFound": "Nessun account trovato.",
"noFileYet": "Nessun file selezionato",
"noFilesSelected": "Nessun file selezionato",
"noMailboxFound": "Nessuna casella postale trouvata.",
"noMailboxes": "Nessuna casella postale trovata in questo account.",
"orClick": "o clicca per sfogliare",
@@ -754,8 +756,11 @@
"searchAccount": "Cerca account...",
"searchMailbox": "Cerca caselle postali...",
"selectAccount": "Seleziona un account",
"selectAccountAndFiles": "Seleziona prima un account di destinazione e i file.",
"selectAccountFirst": "Seleziona prima un account.",
"selectAccountRequired": "Seleziona prima un account di destinazione.",
"selectFileFirst": "Seleziona prima un file per determinare le opzioni disponibili.",
"selectFilesRequired": "Seleziona i file da importare.",
"selectMailbox": "Seleziona una casella...",
"source": "origine",
"startImport": "Importa",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "アカウント",
"chooseFiles": "3. ファイルを選択",
"chooseFiles": "2. ファイルを選択",
"completed": "インポート完了",
"description": "NoSyncローカルアカウントにメールファイルをインポートします。大容量ファイルはCLIを使用してください。",
"detectedFolder": "放出演出",
@@ -730,10 +730,11 @@
"failed": "インポート失敗",
"failedCount": "{{count}} 件の失敗",
"failedDetails": "失敗したアイテム",
"fileCount": "{{count}} 件のファイル",
"folder": "フォルダ",
"folderMethod": "2. フォルダ指定方法の選択",
"folderMethod": "3. フォルダ指定方法の選択",
"folderMethodDesc": "インポート先のフォルダをどのように決定しますか?",
"folderStructure": "2. フォルダ構造",
"folderStructure": "3. フォルダ構造",
"importHistory": "インポート履歴",
"limits": "上限: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB。これ以上のサイズは → CLIへ。",
"modeCustom": "カスタムフォルダ名を入力",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "ファイルから X-Gmail-Labels / X-Bichon-Metadata を読み取ります。ない場合はファイル名を使用します。",
"noAccountFound": "アカウントが見つかりません。",
"noFileYet": "ファイルが選択されていません",
"noFilesSelected": "ファイルが選択されていません",
"noMailboxFound": "メールボックスが見つかりません。",
"noMailboxes": "このアカウントにメールボックスが見つかりません。",
"orClick": "またはクリックしてファイルを選択",
@@ -754,8 +756,11 @@
"searchAccount": "アカウントを検索...",
"searchMailbox": "メールボックスを検索...",
"selectAccount": "アカウントを選択",
"selectAccountAndFiles": "最初に対象のアカウントとファイルを選択してください。",
"selectAccountFirst": "最初にアカウントを選択してください。",
"selectAccountRequired": "最初に対象のアカウントを選択してください。",
"selectFileFirst": "利用可能なオプションを確認するには、最初にファイルを選択してください。",
"selectFilesRequired": "インポートするファイルを選択してください。",
"selectMailbox": "メールボックスを選択...",
"source": "ソース",
"startImport": "インポート",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "계정",
"chooseFiles": "3. 파일 선택",
"chooseFiles": "2. 파일 선택",
"completed": "가져오기 완료",
"description": "로컬 계정(NoSync)으로 이메일 파일을 가져옵니다. 대용량 파일은 CLI를 사용하세요.",
"detectedFolder": "감지됨",
@@ -730,10 +730,11 @@
"failed": "가져오기 실패",
"failedCount": "{{count}}개 실패",
"failedDetails": "실패한 항목",
"fileCount": "{{count}}개 파일",
"folder": "폴더",
"folderMethod": "2. 폴더 지정 방식 선택",
"folderMethod": "3. 폴더 지정 방식 선택",
"folderMethodDesc": "가져올 메일 폴더를 어떻게 결정하시겠습니까?",
"folderStructure": "2. 폴더 구조",
"folderStructure": "3. 폴더 구조",
"importHistory": "가져오기 기록",
"limits": "제한: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. 더 큰 파일은 → CLI 사용.",
"modeCustom": "사용자 지정 폴더 이름 입력",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "파일에서 X-Gmail-Labels / X-Bichon-Metadata를 읽습니다. 없을 경우 파일명을 사용합니다.",
"noAccountFound": "계정을 찾을 수 없습니다.",
"noFileYet": "선택된 파일 없음",
"noFilesSelected": "선택된 파일이 없습니다",
"noMailboxFound": "편지함을 찾을 수 없습니다.",
"noMailboxes": "이 계정에서 편지함을 찾을 수 없습니다.",
"orClick": "또는 클릭하여 찾아보기",
@@ -754,8 +756,11 @@
"searchAccount": "계정 검색...",
"searchMailbox": "편지함 검색...",
"selectAccount": "계정 선택",
"selectAccountAndFiles": "먼저 대상 계정과 파일을 선택해 주세요.",
"selectAccountFirst": "계정을 먼저 선택해 주세요.",
"selectAccountRequired": "먼저 대상 계정을 선택해 주세요.",
"selectFileFirst": "사용 가능한 옵션을 확인하려면 먼저 파일을 선택해 주세요.",
"selectFilesRequired": "가져올 파일을 선택해 주세요.",
"selectMailbox": "편지함 선택...",
"source": "소스",
"startImport": "가져오기",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Account",
"chooseFiles": "3. Kies bestanden",
"chooseFiles": "2. Kies bestanden",
"completed": "Import voltooid",
"description": "Importeer e-mailbestanden in een lokaal account (NoSync). Gebruik de CLI voor grotere bestanden.",
"detectedFolder": "Gedetecteerd",
@@ -730,10 +730,11 @@
"failed": "Import mislukt",
"failedCount": "{{count}} mislukt",
"failedDetails": "Mislukte items",
"fileCount": "{{count}} bestanden",
"folder": "Map",
"folderMethod": "2. Kies mapmethode",
"folderMethod": "3. Kies mapmethode",
"folderMethodDesc": "Hoe moet de doelmap voor e-mail worden bepaald?",
"folderStructure": "2. Mapstructuur",
"folderStructure": "3. Mapstructuur",
"importHistory": "Importgeschiedenis",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Grotere bestanden → CLI.",
"modeCustom": "Voer een aangepaste mapnaam in",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Leest X-Gmail-Labels / X-Bichon-Metadata uit het bestand. Valt terug op bestandsnaam.",
"noAccountFound": "Geen account gevonden.",
"noFileYet": "Nog geen bestand geselecteerd",
"noFilesSelected": "Geen bestanden geselecteerd",
"noMailboxFound": "Geen mailbox gevonden.",
"noMailboxes": "Geen mailboxen gevonden in dit account.",
"orClick": "of klik om te bladeren",
@@ -754,8 +756,11 @@
"searchAccount": "Accounts zoeken...",
"searchMailbox": "Mailboxen zoeken...",
"selectAccount": "Selecteer een account",
"selectAccountAndFiles": "Selecteer eerst een doelaccount en bestanden.",
"selectAccountFirst": "Selecteer eerst een account.",
"selectAccountRequired": "Selecteer eerst een doelaccount.",
"selectFileFirst": "Selecteer eerst een bestand om de beschikbare opties te bepalen.",
"selectFilesRequired": "Selecteer de te importeren bestanden.",
"selectMailbox": "Selecteer een mailbox...",
"source": "bron",
"startImport": "Importeren",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Konto",
"chooseFiles": "3. Velg filer",
"chooseFiles": "2. Velg filer",
"completed": "Import fullført",
"description": "Importer e-postfiler til en lokal konto (NoSync). Bruk CLI for større filer.",
"detectedFolder": "Registrert",
@@ -730,10 +730,11 @@
"failed": "Import mislyktes",
"failedCount": "{{count}} feilet",
"failedDetails": "Feilede elementer",
"fileCount": "{{count}} filer",
"folder": "Mappe",
"folderMethod": "2. Velg mappemetode",
"folderMethod": "3. Velg mappemetode",
"folderMethodDesc": "Hvordan skal målmappen for e-post bestemmes?",
"folderStructure": "2. Mappestruktur",
"folderStructure": "3. Mappestruktur",
"importHistory": "Importhistorikk",
"limits": "Maks: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Større filer → CLI.",
"modeCustom": "Skriv inn et egendefinert mappenavn",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Leser X-Gmail-Labels / X-Bichon-Metadata fra filen. Faller tillbaka til filnavn.",
"noAccountFound": "Ingen konto fundet.",
"noFileYet": "Ingen fil valgt ennå",
"noFilesSelected": "Ingen filer valgt",
"noMailboxFound": "Ingen postboks funnet.",
"noMailboxes": "Ingen postbokser funnet på denne kontoen.",
"orClick": "eller klikk for å bla gjennom",
@@ -754,8 +756,11 @@
"searchAccount": "Søk etter kontoer...",
"searchMailbox": "Søk etter postbokser...",
"selectAccount": "Velg en konto",
"selectAccountAndFiles": "Velg en målkonto og filer først.",
"selectAccountFirst": "Velg en konto først.",
"selectAccountRequired": "Velg en målkonto først.",
"selectFileFirst": "Velg en fil først for å se tilgjengelige alternativer.",
"selectFilesRequired": "Velg filene som skal importeres.",
"selectMailbox": "Velg en postboks...",
"source": "kilde",
"startImport": "Importer",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Konto",
"chooseFiles": "3. Wybierz pliki",
"chooseFiles": "2. Wybierz pliki",
"completed": "Import zakończony",
"description": "Importuj pliki e-mail do konta lokalnego (NoSync). W przypadku większych plików użyj CLI.",
"detectedFolder": "Wykryto",
@@ -730,10 +730,11 @@
"failed": "Import nie powiódł się",
"failedCount": "Niepowodzenie: {{count}}",
"failedDetails": "Nieudane elementy",
"fileCount": "Liczba plików: {{count}}",
"folder": "Folder",
"folderMethod": "2. Wybierz metodę folderu",
"folderMethod": "3. Wybierz metodę folderu",
"folderMethodDesc": "Jak ma zostać określony docelowy folder poczty?",
"folderStructure": "2. Struktura folderów",
"folderStructure": "3. Struktura folderów",
"importHistory": "Historia importu",
"limits": "Maks: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Większe pliki → CLI.",
"modeCustom": "Wprowadź własną nazwę folderu",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Odczytaj X-Gmail-Labels / X-Bichon-Metadata z pliku. W przypadku braku użyta zostanie nazwa pliku.",
"noAccountFound": "Nie znaleziono konta.",
"noFileYet": "Nie wybrano jeszcze żadnego pliku",
"noFilesSelected": "Nie wybrano żadnych plików",
"noMailboxFound": "Nie znaleziono skrzynki pocztowej.",
"noMailboxes": "Nie znaleziono skrzynek pocztowych na tym koncie.",
"orClick": "lub kliknij, aby przeglądać",
@@ -754,8 +756,11 @@
"searchAccount": "Szukaj kont...",
"searchMailbox": "Szukaj skrzynek...",
"selectAccount": "Wybierz konto",
"selectAccountAndFiles": "Najpierw wybierz konto docelowe i pliki.",
"selectAccountFirst": "Najpierw wybierz konto.",
"selectAccountRequired": "Najpierw wybierz konto docelowe.",
"selectFileFirst": "Najpierw wybierz plik, aby określić dostępne opcje.",
"selectFilesRequired": "Wybierz pliki do importu.",
"selectMailbox": "Wybierz skrzynkę...",
"source": "źródło",
"startImport": "Importuj",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Conta",
"chooseFiles": "3. Escolher arquivos",
"chooseFiles": "2. Escolher arquivos",
"completed": "Importação concluída",
"description": "Importar arquivos de e-mail para uma conta local (NoSync). Para arquivos maiores, use a CLI.",
"detectedFolder": "Detectado",
@@ -730,10 +730,11 @@
"failed": "Falha na importação",
"failedCount": "{{count}} falharam",
"failedDetails": "Itens com falha",
"fileCount": "{{count}} arquivos",
"folder": "Pasta",
"folderMethod": "2. Escolher método de pasta",
"folderMethod": "3. Escolher método de pasta",
"folderMethodDesc": "Como a pasta de e-mail de destino deve ser determinada?",
"folderStructure": "2. Estrutura de pastas",
"folderStructure": "3. Estrutura de pastas",
"importHistory": "Histórico de importação",
"limits": "Máx: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Arquivos maiores → CLI.",
"modeCustom": "Digitar um nome de pasta personalizado",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Lê X-Gmail-Labels / X-Bichon-Metadata do arquivo. Alternativa: nome do arquivo.",
"noAccountFound": "Nenhuma conta encontrada.",
"noFileYet": "Nenhum arquivo selecionado",
"noFilesSelected": "Nenhum arquivo selecionado",
"noMailboxFound": "Nenhuma caixa de correio encontrada.",
"noMailboxes": "Nenhuma caixa de correio encontrada nesta conta.",
"orClick": "ou clique para navegar",
@@ -754,8 +756,11 @@
"searchAccount": "Buscar contas...",
"searchMailbox": "Buscar caixas de correio...",
"selectAccount": "Selecionar uma conta",
"selectAccountAndFiles": "Selecione uma conta de destino e os arquivos primeiro.",
"selectAccountFirst": "Selecione uma conta primeiro.",
"selectAccountRequired": "Selecione uma conta de destino primeiro.",
"selectFileFirst": "Selecione um arquivo primeiro para determinar as opções disponíveis.",
"selectFilesRequired": "Selecione os arquivos para importar.",
"selectMailbox": "Selecionar caixa de correio...",
"source": "origem",
"startImport": "Importar",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Аккаунт",
"chooseFiles": "3. Выбрать файлы",
"chooseFiles": "2. Выбрать файлы",
"completed": "Импорт завершен",
"description": "Импорт файлов писем в локальный аккаунт (NoSync). Для больших файлов используйте CLI.",
"detectedFolder": "Обнаружено",
@@ -730,10 +730,11 @@
"failed": "Ошибка импорта",
"failedCount": "Ошибок: {{count}}",
"failedDetails": "Неудачные элементы",
"fileCount": "{{count}} файлов",
"folder": "Папка",
"folderMethod": "2. Выберите метод определения папки",
"folderMethod": "3. Выберите метод определения папки",
"folderMethodDesc": "Как следует определять целевую папку для писем?",
"folderStructure": "2. Структура папок",
"folderStructure": "3. Структура папок",
"importHistory": "История импорта",
"limits": "Макс: EML 100 МБ · MBOX {{maxMbox}} МБ · PST {{maxPst}} МБ. Для больших файлов → CLI.",
"modeCustom": "Ввести имя папки вручную",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Чтение X-Gmail-Labels / X-Bichon-Metadata из файла. Если их нет, используется имя файла.",
"noAccountFound": "Аккаунт не найден.",
"noFileYet": "Файл еще не выбран",
"noFilesSelected": "Файлы не выбраны",
"noMailboxFound": "Почтовый ящик не найден.",
"noMailboxes": "В этом аккаунте не найдено почтовых ящиков.",
"orClick": "или нажмите для обзора",
@@ -754,8 +756,11 @@
"searchAccount": "Поиск аккаунтов...",
"searchMailbox": "Поиск почтовых ящиков...",
"selectAccount": "Выберите аккаунт",
"selectAccountAndFiles": "Сначала выберите целевой аккаунт и файлы.",
"selectAccountFirst": "Сначала выберите аккаунт.",
"selectAccountRequired": "Сначала выберите целевой аккаунт.",
"selectFileFirst": "Сначала выберите файл, чтобы определить доступные параметры.",
"selectFilesRequired": "Выберите файлы для импорта.",
"selectMailbox": "Выберите почтовый ящик...",
"source": "источник",
"startImport": "Импортировать",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "Konto",
"chooseFiles": "3. Välj filer",
"chooseFiles": "2. Välj filer",
"completed": "Import slutförd",
"description": "Importera e-postfiler till ett lokalt konto (NoSync). Använd CLI för större filer.",
"detectedFolder": "Identifierad",
@@ -730,10 +730,11 @@
"failed": "Import misslyckades",
"failedCount": "{{count}} misslyckades",
"failedDetails": "Misslyckade objekt",
"fileCount": "{{count}} filer",
"folder": "Mapp",
"folderMethod": "2. Välj mappemetod",
"folderMethod": "3. Välj mappemetod",
"folderMethodDesc": "Hur ska målmappen for e-post bestämmas?",
"folderStructure": "2. Mappstruktur",
"folderStructure": "3. Mappstruktur",
"importHistory": "Importhistorik",
"limits": "Max: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB. Større filer → CLI.",
"modeCustom": "Ange ett anpassat mappnamn",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "Läser X-Gmail-Labels / X-Bichon-Metadata från filen. Faller tillbaka på filnamn.",
"noAccountFound": "Inget konto hittades.",
"noFileYet": "Ingen fil har valts än",
"noFilesSelected": "Inga filer valda",
"noMailboxFound": "Ingen brevlåda hittades.",
"noMailboxes": "Inga brevlådor hittades på detta konto.",
"orClick": "eller klicka för att bläddra",
@@ -754,8 +756,11 @@
"searchAccount": "Sök konton...",
"searchMailbox": "Sök brevlådor...",
"selectAccount": "Välj ett konto",
"selectAccountAndFiles": "Välj ett målkonto och filer först.",
"selectAccountFirst": "Välj ett konto först.",
"selectAccountRequired": "Välj ett målkonto först.",
"selectFileFirst": "Välj en fil först för att se tillgängliga alternativ.",
"selectFilesRequired": "Välj filer att importera.",
"selectMailbox": "Välj en brevlåda...",
"source": "källa",
"startImport": "Importera",

View File

@@ -721,7 +721,7 @@
},
"import": {
"account": "帳戶",
"chooseFiles": "3. 選擇檔案",
"chooseFiles": "2. 選擇檔案",
"completed": "匯入完成",
"description": "將郵件檔案匯入至本地帳戶 (NoSync)。大檔案請使用 CLI 命令行工具。",
"detectedFolder": "已識別",
@@ -730,10 +730,11 @@
"failed": "匯入失敗",
"failedCount": "{{count}} 個失敗",
"failedDetails": "失敗詳情",
"fileCount": "{{count}} 個檔案",
"folder": "資料夾",
"folderMethod": "2. 選擇資料夾比對策略",
"folderMethod": "3. 選擇資料夾比對策略",
"folderMethodDesc": "如何確定匯入 Target 郵件資料夾?",
"folderStructure": "2. 資料夾結構",
"folderStructure": "3. 資料夾結構",
"importHistory": "匯入歷史",
"limits": "限制: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB。超過限制請使用 CLI。",
"modeCustom": "指定自訂資料夾名稱",
@@ -744,6 +745,7 @@
"modeHeaderDesc": "讀取檔案中的 X-Gmail-Labels / X-Bichon-Metadata 標籤,未識別時預設使用檔案名稱。",
"noAccountFound": "未找到相關帳戶。",
"noFileYet": "尚未選擇任何檔案",
"noFilesSelected": "未選擇任何檔案",
"noMailboxFound": "未找到郵箱。",
"noMailboxes": "該帳戶下未找到任何郵箱。",
"orClick": "或點擊瀏覽檔案",
@@ -754,8 +756,11 @@
"searchAccount": "搜尋帳戶...",
"searchMailbox": "搜尋郵箱...",
"selectAccount": "選擇帳戶",
"selectAccountAndFiles": "請先選擇目標郵箱帳號和檔案。",
"selectAccountFirst": "請先選擇一個帳戶。",
"selectAccountRequired": "請先選擇目標郵箱帳號。",
"selectFileFirst": "請先選擇檔案以確定可用選項。",
"selectFilesRequired": "請選擇要匯入的檔案。",
"selectMailbox": "選擇郵箱...",
"source": "來源",
"startImport": "開始匯入",

View File

@@ -731,7 +731,7 @@
},
"import": {
"account": "账户",
"chooseFiles": "3. 选择文件",
"chooseFiles": "2. 选择文件",
"completed": "导入完成",
"description": "将邮件文件导入至本地账户 (NoSync)。大文件请使用 CLI 命令行工具。",
"detectedFolder": "已识别",
@@ -740,10 +740,11 @@
"failed": "导入失败",
"failedCount": "{{count}} 个失败",
"failedDetails": "失败详情",
"fileCount": "{{count}} 个文件",
"folder": "文件夹",
"folderMethod": "2. 选择文件夹匹配策略",
"folderMethod": "3. 选择文件夹匹配策略",
"folderMethodDesc": "如何确定导入的目标邮件文件夹?",
"folderStructure": "2. 文件夹结构",
"folderStructure": "3. 文件夹结构",
"importHistory": "导入历史",
"limits": "限制: EML 100 MB · MBOX {{maxMbox}} MB · PST {{maxPst}} MB。超过限制请使用 CLI。",
"modeCustom": "指定自定义文件夹名称",
@@ -754,6 +755,7 @@
"modeHeaderDesc": "读取文件中的 X-Gmail-Labels / X-Bichon-Metadata 标签,未识别时默认使用文件名。",
"noAccountFound": "未找到相关账户。",
"noFileYet": "尚未选择任何文件",
"noFilesSelected": "未选择任何文件",
"noMailboxFound": "未找到邮箱。",
"noMailboxes": "该账户下未找到任何邮箱。",
"orClick": "或点击浏览文件",
@@ -764,8 +766,11 @@
"searchAccount": "搜索账户...",
"searchMailbox": "搜索邮箱...",
"selectAccount": "选择账户",
"selectAccountAndFiles": "请先选择目标邮箱账号和文件。",
"selectAccountFirst": "请先选择一个账户。",
"selectAccountRequired": "请先选择目标邮箱账号。",
"selectFileFirst": "请先选择文件以确定可用选项。",
"selectFilesRequired": "请选择要导入的文件。",
"selectMailbox": "选择邮箱...",
"source": "来源",
"startImport": "开始导入",