mirror of
https://github.com/rustmailer/bichon.git
synced 2026-08-03 07:48:34 +02:00
update
This commit is contained in:
@@ -82,7 +82,6 @@ export interface DownloadState {
|
||||
history: DownloadSession[];
|
||||
last_trigger_at: number;
|
||||
last_finished_at: number | null;
|
||||
global_errors: AccountError[];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
//
|
||||
// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com)
|
||||
//
|
||||
// This file is part of the Bichon Email Archiving Project
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
import * as React from 'react'
|
||||
import { Mail, Database } from 'lucide-react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
import { cn } from '@/lib/utils'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from '@/components/ui/dialog'
|
||||
import { Label } from '@/components/ui/label'
|
||||
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'
|
||||
import { useAccountContext } from '../context'
|
||||
|
||||
export type AddAccountType = 'IMAP' | 'NoSync'
|
||||
|
||||
interface Props {
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
}
|
||||
|
||||
export function AddAccountDialog({
|
||||
open,
|
||||
onOpenChange
|
||||
}: Props) {
|
||||
const { t } = useTranslation()
|
||||
const { setOpen } = useAccountContext()
|
||||
const [value, setValue] = React.useState<AddAccountType>('IMAP')
|
||||
|
||||
function handleContinue() {
|
||||
if (value === 'IMAP') {
|
||||
setOpen('add-imap')
|
||||
} else {
|
||||
setOpen('add-nosync')
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={onOpenChange}>
|
||||
<DialogContent className="sm:max-w-xl">
|
||||
<DialogHeader className="text-left">
|
||||
<DialogTitle>
|
||||
{t('accounts.add')}
|
||||
</DialogTitle>
|
||||
|
||||
<DialogDescription>
|
||||
{t('accounts.selectAccountType')}
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<RadioGroup
|
||||
value={value}
|
||||
onValueChange={(v) => setValue(v as AddAccountType)}
|
||||
className="space-y-4 py-2"
|
||||
>
|
||||
<Label
|
||||
htmlFor="imap-account"
|
||||
className={cn(
|
||||
'flex cursor-pointer items-start gap-4 rounded-2xl border p-5 transition-all',
|
||||
value === 'IMAP'
|
||||
? 'border-primary bg-muted/50'
|
||||
: 'hover:bg-muted/30'
|
||||
)}
|
||||
>
|
||||
<RadioGroupItem
|
||||
value="IMAP"
|
||||
id="imap-account"
|
||||
className="mt-1"
|
||||
/>
|
||||
|
||||
<div className="flex flex-1 gap-4">
|
||||
<div className="rounded-xl border p-2">
|
||||
<Mail className="h-5 w-5" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-1">
|
||||
<div className="font-medium">
|
||||
{t('accounts.imapAccount')}
|
||||
</div>
|
||||
|
||||
<div className="text-sm text-muted-foreground">
|
||||
{t('accounts.imapAccountDescription')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Label>
|
||||
|
||||
<Label
|
||||
htmlFor="nosync-account"
|
||||
className={cn(
|
||||
'flex cursor-pointer items-start gap-4 rounded-2xl border p-5 transition-all',
|
||||
value === 'NoSync'
|
||||
? 'border-primary bg-muted/50'
|
||||
: 'hover:bg-muted/30'
|
||||
)}
|
||||
>
|
||||
<RadioGroupItem
|
||||
value="NoSync"
|
||||
id="nosync-account"
|
||||
className="mt-1"
|
||||
/>
|
||||
|
||||
<div className="flex flex-1 gap-4">
|
||||
<div className="rounded-xl border p-2">
|
||||
<Database className="h-5 w-5" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-1">
|
||||
<div className="font-medium">
|
||||
{t('accounts.noSyncAccount')}
|
||||
</div>
|
||||
|
||||
<div className="text-sm text-muted-foreground">
|
||||
{t('accounts.noSyncAccountDescription')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Label>
|
||||
</RadioGroup>
|
||||
|
||||
<DialogFooter>
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => onOpenChange(false)}
|
||||
>
|
||||
{t('common.cancel')}
|
||||
</Button>
|
||||
|
||||
<Button onClick={handleContinue}>
|
||||
{t('accounts.continue')}
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
)
|
||||
}
|
||||
@@ -38,7 +38,6 @@ import {
|
||||
AccordionTrigger,
|
||||
} from "@/components/ui/accordion"
|
||||
import {
|
||||
CheckCircle,
|
||||
Clock,
|
||||
Loader2,
|
||||
Activity,
|
||||
@@ -55,7 +54,6 @@ interface Props {
|
||||
}
|
||||
|
||||
function StatusBadge({ status }: { status: string }) {
|
||||
// 保持颜色逻辑,但在暗色模式下这些颜色也相对友好,如果需要完全适配可调整为 bg-primary/10 等
|
||||
const map: Record<string, string> = {
|
||||
Running: 'bg-blue-500/10 text-blue-600',
|
||||
Downloading: 'bg-blue-500/10 text-blue-600',
|
||||
@@ -141,7 +139,6 @@ export function RunningStateDialog({ currentRow, open, onOpenChange }: Props) {
|
||||
|
||||
const session = state?.active_session
|
||||
const history = state?.history || []
|
||||
const globalErrors = state?.global_errors || []
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={onOpenChange}>
|
||||
@@ -168,10 +165,6 @@ export function RunningStateDialog({ currentRow, open, onOpenChange }: Props) {
|
||||
{t('accounts.runningState.tabs.history')}
|
||||
<Badge variant="secondary" className="ml-2 h-4 px-1 text-[10px] font-bold">{history.length}</Badge>
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="errors" className="whitespace-nowrap data-[state=active]:border-b-2 data-[state=active]:border-primary rounded-none h-full bg-transparent shadow-none px-0 text-xs sm:text-sm font-bold">
|
||||
{t('accounts.runningState.tabs.global_errors')}
|
||||
{globalErrors.length > 0 && <Badge variant="destructive" className="ml-2 h-4 px-1 text-[10px] font-bold">{globalErrors.length}</Badge>}
|
||||
</TabsTrigger>
|
||||
</TabsList>
|
||||
</div>
|
||||
|
||||
@@ -395,82 +388,6 @@ export function RunningStateDialog({ currentRow, open, onOpenChange }: Props) {
|
||||
</div>
|
||||
</ScrollArea>
|
||||
</TabsContent>
|
||||
<TabsContent value="errors" className="h-full m-0 data-[state=active]:flex flex-col">
|
||||
<ScrollArea className="flex-1">
|
||||
<div className="p-4 sm:p-6">
|
||||
{globalErrors.length === 0 ? (
|
||||
<div className="py-32 text-center text-muted-foreground">
|
||||
<CheckCircle className="w-12 h-12 mx-auto mb-2 opacity-20" />
|
||||
<p className="font-medium italic text-sm">{t('accounts.runningState.empty.no_global_errors')}</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="relative">
|
||||
<div className="absolute left-[19px] top-2 bottom-2 w-0.5 bg-destructive/20" />
|
||||
<div className="space-y-6">
|
||||
{[...globalErrors]
|
||||
.sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime())
|
||||
.map((e, i) => (
|
||||
<div key={i} className="relative pl-10 min-w-0">
|
||||
<div className="absolute left-0 top-1.5 w-[40px] flex justify-center">
|
||||
{i === 0 ? (
|
||||
<span className="relative flex h-3 w-3">
|
||||
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-destructive opacity-75"></span>
|
||||
<span className="relative inline-flex rounded-full h-3 w-3 bg-destructive"></span>
|
||||
</span>
|
||||
) : (
|
||||
<div className="w-2.5 h-2.5 rounded-full bg-destructive/20 mt-0.5" />
|
||||
)}
|
||||
</div>
|
||||
<div
|
||||
className={`
|
||||
p-4 border rounded-2xl shadow-sm transition-all min-w-0
|
||||
${i === 0
|
||||
? 'border-destructive/20 bg-destructive/5 ring-1 ring-destructive/10'
|
||||
: 'border-border bg-card'}
|
||||
`}
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3 mb-2 min-w-0">
|
||||
<div className="flex items-center gap-1.5 flex-wrap min-w-0">
|
||||
{i === 0 && (
|
||||
<Badge className="bg-destructive hover:bg-destructive text-[9px] h-4 px-1">
|
||||
{t('accounts.runningState.latest')}
|
||||
</Badge>
|
||||
)}
|
||||
|
||||
<div className="text-[10px] font-mono font-bold text-destructive bg-destructive/10 px-1.5 py-0.5 rounded break-all">
|
||||
<span className="sm:hidden">
|
||||
{format(new Date(e.at), 'HH:mm')}
|
||||
</span>
|
||||
<span className="hidden sm:inline">
|
||||
{format(new Date(e.at), 'yyyy-MM-dd HH:mm:ss')}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<AlertTriangle
|
||||
className={`w-4 h-4 shrink-0 ${i === 0 ? 'text-destructive' : 'text-destructive/50'
|
||||
}`}
|
||||
/>
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<p
|
||||
className={`
|
||||
text-xs font-bold leading-relaxed whitespace-pre-wrap break-all min-w-0
|
||||
${i === 0 ? 'text-foreground' : 'text-muted-foreground'}
|
||||
`}
|
||||
>
|
||||
{e.error}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
</TabsContent>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -21,6 +21,7 @@ import { AccountModel } from '@/api/account/api';
|
||||
import React from 'react'
|
||||
|
||||
export type AccountDialogType =
|
||||
| 'add'
|
||||
| 'add-imap'
|
||||
| 'add-nosync'
|
||||
| 'edit-imap'
|
||||
|
||||
@@ -43,6 +43,7 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigge
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { AccountAccessAssignmentDialog } from './components/access-assignment-dialog'
|
||||
import { useCurrentUser } from '@/hooks/use-current-user'
|
||||
import { AddAccountDialog } from './components/add-account-dialog'
|
||||
|
||||
export default function Accounts() {
|
||||
const { t } = useTranslation()
|
||||
@@ -75,29 +76,12 @@ export default function Accounts() {
|
||||
{require_any_permission(['system:root', 'account:create']) && <div className="flex gap-2">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Button
|
||||
onClick={() => setOpen("add-imap")}
|
||||
onClick={() => setOpen("add")}
|
||||
className="rounded-r-none border-r-0"
|
||||
>
|
||||
<Plus className="h-4 w-4" />
|
||||
{t('accounts.addImap')}
|
||||
{t('accounts.add')}
|
||||
</Button>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button
|
||||
size="icon"
|
||||
className="h-9 w-9 rounded-l-none border-l-0"
|
||||
>
|
||||
<MoreVertical className="h-4 w-4" />
|
||||
<span className="sr-only">{t('accounts.moreAccountTypes')}</span>
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align="end">
|
||||
<DropdownMenuItem onClick={() => setOpen("add-nosync")}>
|
||||
<Plus className="h-4 w-4" />
|
||||
{t('accounts.addNoSync')}
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
</div>}
|
||||
</div>
|
||||
@@ -120,8 +104,8 @@ export default function Accounts() {
|
||||
{t('accounts.noAccountConfigurationsDesc')}
|
||||
</p>
|
||||
<div className="mt-4 flex flex-col items-center gap-3 sm:flex-row sm:flex-wrap sm:justify-center sm:gap-4">
|
||||
<Button variant="default" className="w-64" onClick={() => setOpen("add-imap")}>
|
||||
{t('accounts.addConfiguration')}
|
||||
<Button variant="default" className="w-64" onClick={() => setOpen("add")}>
|
||||
{t('accounts.add')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -130,7 +114,10 @@ export default function Accounts() {
|
||||
</div>
|
||||
</div>
|
||||
</Main>
|
||||
|
||||
<AddAccountDialog
|
||||
key='account-add'
|
||||
open={open === 'add'}
|
||||
onOpenChange={() => setOpen('add')} />
|
||||
|
||||
<AccountActionDialog
|
||||
key='imap-account-add'
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
import { useState } from 'react';
|
||||
import { useInfiniteQuery } from '@tanstack/react-query';
|
||||
import { ChevronDown, ChevronUp, Loader2, MessageSquareText } from 'lucide-react';
|
||||
import { Loader2, MessageSquareText } from 'lucide-react';
|
||||
|
||||
import {
|
||||
Dialog,
|
||||
@@ -27,7 +27,9 @@ import {
|
||||
DialogTitle,
|
||||
} from '@/components/ui/dialog';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Badge } from '@/components/ui/badge';
|
||||
import { Card, CardContent, CardHeader } from '@/components/ui/card';
|
||||
import { ScrollArea } from '@/components/ui/scroll-area';
|
||||
import { Skeleton } from '@/components/ui/skeleton';
|
||||
import { get_thread_messages } from '@/api/mailbox/envelope/api';
|
||||
import { MailMessageView } from './mail-message-view';
|
||||
@@ -72,6 +74,7 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps)
|
||||
|
||||
const allMessages = data?.pages.flatMap((page) => page.items) ?? [];
|
||||
const totalCount = data?.pages[0]?.total_items ?? 0;
|
||||
const sortedMessages = [...allMessages].sort((a, b) => a.date - b.date);
|
||||
|
||||
const toggleExpand = (id: string) => {
|
||||
setExpandedIds((prev) => {
|
||||
@@ -84,138 +87,168 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps)
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={onOpenChange}>
|
||||
<DialogContent className="w-full max-width-full p-0 max-h-full flex flex-col md:max-w-3xl lg:max-w-4xl">
|
||||
{/* Header */}
|
||||
<DialogHeader className="p-4 pb-3 border-b shrink-0">
|
||||
<div className="flex items-center justify-between">
|
||||
<DialogTitle className="flex items-center gap-2">
|
||||
<MessageSquareText className="w-5 h-5" />
|
||||
<div className="text-sm">
|
||||
{t('search.thread.title', { count: totalCount })}
|
||||
</div>
|
||||
</DialogTitle>
|
||||
</div>
|
||||
<DialogTitle className="flex items-center gap-2">
|
||||
<MessageSquareText className="w-5 h-5" />
|
||||
<span className="text-sm">
|
||||
{t('search.thread.title', { count: totalCount })}
|
||||
</span>
|
||||
</DialogTitle>
|
||||
</DialogHeader>
|
||||
|
||||
{/* Body */}
|
||||
<div className="flex-1 overflow-y-auto p-4 space-y-4">
|
||||
{isLoading && <ThreadSkeleton />}
|
||||
<ScrollArea className="h-[calc(100vh-260px)] w-full pr-4 -mr-4 py-1">
|
||||
<div className="p-4 sm:p-6">
|
||||
{isLoading && <ThreadSkeleton />}
|
||||
|
||||
{isError && (
|
||||
<div className="text-center text-destructive text-sm">
|
||||
{t('search.thread.error')}: {(error as Error)?.message}
|
||||
</div>
|
||||
)}
|
||||
{isError && (
|
||||
<div className="text-center text-destructive text-sm">
|
||||
{t('search.thread.error')}: {(error as Error)?.message}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!isLoading && allMessages.length === 0 && (
|
||||
<div className="text-center text-muted-foreground text-sm">
|
||||
{t('search.thread.empty')}
|
||||
</div>
|
||||
)}
|
||||
{!isLoading && sortedMessages.length === 0 && (
|
||||
<div className="text-center text-muted-foreground text-sm">
|
||||
{t('search.thread.empty')}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{allMessages
|
||||
.sort((a, b) => a.date - b.date)
|
||||
.map((msg) => {
|
||||
const isExpanded = expandedIds.has(msg.id);
|
||||
const preview = msg.preview;
|
||||
const date = new Date(msg.date);
|
||||
const formattedDate = isNaN(date.getTime())
|
||||
? t('search.thread.invalidDate')
|
||||
: format(date, 'yyyy-MM-dd HH:mm:ss');
|
||||
{sortedMessages.length > 0 && (
|
||||
<div className="relative">
|
||||
<div className="absolute left-[19px] top-2 bottom-2 w-0.5 bg-destructive/20" />
|
||||
<div className="absolute left-[15px] bottom-0 w-0 h-0 border-l-[5px] border-r-[5px] border-t-[7px] border-l-transparent border-r-transparent border-t-destructive/40" />
|
||||
|
||||
return (
|
||||
<Card
|
||||
key={msg.id}
|
||||
className={`transition-all ${isExpanded ? 'ring-2 ring-primary' : ''}`}
|
||||
>
|
||||
<CardHeader
|
||||
className="cursor-pointer pb-3"
|
||||
onClick={() => toggleExpand(msg.id)}
|
||||
>
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="flex items-center gap-2 text-sm">
|
||||
<span className="font-medium truncate">{msg.from}</span>
|
||||
<span className="text-muted-foreground">→</span>
|
||||
<span className="text-muted-foreground truncate">
|
||||
{msg.to.join(', ')}
|
||||
</span>
|
||||
<div className="space-y-6">
|
||||
{sortedMessages.map((msg, i) => {
|
||||
const isExpanded = expandedIds.has(msg.id);
|
||||
const isLatest = i === sortedMessages.length - 1;
|
||||
|
||||
const date = new Date(msg.date);
|
||||
const formattedDate = isNaN(date.getTime())
|
||||
? t('search.thread.invalidDate')
|
||||
: format(date, 'yyyy-MM-dd HH:mm:ss');
|
||||
|
||||
return (
|
||||
<div key={msg.id} className={`relative pl-10 min-w-0 ${isLatest ? 'mt-6' : ''}`}>
|
||||
<div className="absolute left-0 top-1.5 w-[40px] flex flex-col items-center gap-1">
|
||||
{isLatest && (
|
||||
<Badge className="bg-primary hover:bg-primary text-[9px] h-4 px-1 shrink-0 w-fit">
|
||||
{t('search.thread.latest')}
|
||||
</Badge>
|
||||
)}
|
||||
{isLatest ? (
|
||||
<span className="relative flex h-3 w-3">
|
||||
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75" />
|
||||
<span className="relative inline-flex rounded-full h-3 w-3 bg-primary" />
|
||||
</span>
|
||||
) : (
|
||||
<div className="w-2.5 h-2.5 rounded-full bg-muted-foreground/30 mt-0.5" />
|
||||
)}
|
||||
</div>
|
||||
<p className="font-medium mt-1 text-sm">
|
||||
{msg.subject || t('search.thread.noSubject')}
|
||||
</p>
|
||||
{!isExpanded && preview && (
|
||||
<p className="text-xs text-muted-foreground mt-1 line-clamp-2">
|
||||
{preview}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
<Card
|
||||
className={`transition-all min-w-0 shadow-sm ${isLatest
|
||||
? 'border-primary/20 bg-primary/5 ring-1 ring-primary/10'
|
||||
: 'border-border bg-card'
|
||||
} ${isExpanded ? 'ring-2 ring-primary' : ''}`}
|
||||
>
|
||||
<CardHeader
|
||||
className="cursor-pointer pb-3"
|
||||
onClick={() => toggleExpand(msg.id)}
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3 mb-1 min-w-0">
|
||||
<div className="flex items-center gap-1.5 flex-wrap min-w-0">
|
||||
<span className="font-medium truncate text-sm">{msg.from}</span>
|
||||
<span className="text-muted-foreground text-sm">→</span>
|
||||
<span className="text-muted-foreground truncate text-sm">
|
||||
{msg.to.join(', ')}
|
||||
</span>
|
||||
</div>
|
||||
<div className="text-[10px] font-mono font-bold text-muted-foreground bg-muted px-1.5 py-0.5 rounded shrink-0">
|
||||
<span className="sm:hidden">
|
||||
{isNaN(date.getTime()) ? '' : format(date, 'HH:mm')}
|
||||
</span>
|
||||
<span className="hidden sm:inline">{formattedDate}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2 text-xs text-muted-foreground">
|
||||
<span>{formattedDate}</span>
|
||||
{isExpanded ? (
|
||||
<ChevronUp className="w-4 h-4" />
|
||||
) : (
|
||||
<ChevronDown className="w-4 h-4" />
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<p className="font-medium text-sm">
|
||||
{msg.subject || t('search.thread.noSubject')}
|
||||
</p>
|
||||
|
||||
{isExpanded && (
|
||||
<CardContent className="p-0">
|
||||
<div className="h-96 border-t m-5">
|
||||
<MailMessageView
|
||||
envelope={msg}
|
||||
showActions={false}
|
||||
showAttachments={false}
|
||||
showHeader={false}
|
||||
/>
|
||||
{!isExpanded && msg.preview && (
|
||||
<p className="text-xs text-muted-foreground mt-1 line-clamp-2">
|
||||
{msg.preview}
|
||||
</p>
|
||||
)}
|
||||
</CardHeader>
|
||||
|
||||
{isExpanded && (
|
||||
<CardContent className="p-0">
|
||||
<div className="h-96 border-t m-5">
|
||||
<MailMessageView
|
||||
envelope={msg}
|
||||
showActions={false}
|
||||
showAttachments={false}
|
||||
showHeader={false}
|
||||
/>
|
||||
</div>
|
||||
</CardContent>
|
||||
)}
|
||||
</Card>
|
||||
</div>
|
||||
</CardContent>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{hasNextPage && (
|
||||
<div className="flex justify-center py-3 mt-4">
|
||||
<Button
|
||||
onClick={() => fetchNextPage()}
|
||||
disabled={isFetchingNextPage}
|
||||
variant="outline"
|
||||
size="sm"
|
||||
>
|
||||
{isFetchingNextPage ? (
|
||||
<>
|
||||
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
|
||||
{t('search.thread.loadingMore')}
|
||||
</>
|
||||
) : (
|
||||
t('search.thread.loadMore')
|
||||
)}
|
||||
</Card>
|
||||
);
|
||||
})}
|
||||
|
||||
{hasNextPage && (
|
||||
<div className="flex justify-center py-3">
|
||||
<Button
|
||||
onClick={() => fetchNextPage()}
|
||||
disabled={isFetchingNextPage}
|
||||
variant="outline"
|
||||
size="sm"
|
||||
>
|
||||
{isFetchingNextPage ? (
|
||||
<>
|
||||
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
|
||||
{t('search.thread.loadingMore')}
|
||||
</>
|
||||
) : (
|
||||
t('search.thread.loadMore')
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
|
||||
// Skeleton
|
||||
function ThreadSkeleton() {
|
||||
return (
|
||||
<div className="space-y-4">
|
||||
{[...Array(3)].map((_, i) => (
|
||||
<Card key={i}>
|
||||
<CardHeader>
|
||||
<Skeleton className="h-4 w-48 mb-2" />
|
||||
<Skeleton className="h-5 w-64 mb-1" />
|
||||
<Skeleton className="h-4 w-full" />
|
||||
<Skeleton className="h-4 w-32 mt-2" />
|
||||
</CardHeader>
|
||||
</Card>
|
||||
))}
|
||||
<div className="relative">
|
||||
<div className="absolute left-[19px] top-2 bottom-2 w-0.5 bg-destructive/20" />
|
||||
<div className="absolute left-[15px] bottom-0 w-0 h-0 border-l-[5px] border-r-[5px] border-t-[7px] border-l-transparent border-r-transparent border-t-destructive/40" />
|
||||
<div className="space-y-6">
|
||||
{[...Array(3)].map((_, i) => (
|
||||
<div key={i} className="relative pl-10 min-w-0">
|
||||
<div className="absolute left-0 top-1.5 w-[40px] flex justify-center">
|
||||
<div className="w-2.5 h-2.5 rounded-full bg-muted-foreground/30 mt-0.5" />
|
||||
</div>
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<Skeleton className="h-4 w-48 mb-2" />
|
||||
<Skeleton className="h-5 w-64 mb-1" />
|
||||
<Skeleton className="h-4 w-full" />
|
||||
<Skeleton className="h-4 w-32 mt-2" />
|
||||
</CardHeader>
|
||||
</Card>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "تم تحديث الحساب",
|
||||
"accountUpdatedDesc": "تم تحديث حسابك بنجاح.",
|
||||
"actions": "الإجراءات",
|
||||
"add": "إضافة حساب",
|
||||
"addAccount": "إضافة حساب",
|
||||
"addConfiguration": "إضافة تكوين",
|
||||
"addImap": "إضافة IMAP",
|
||||
"addNewEmailAccountHere": "إضافة حساب بريد إلكتروني جديد هنا. ",
|
||||
"addNoSync": "إضافة NoSync",
|
||||
"allMailFolderSelected": "تنبيه: تم تحديد مجلد \"جميع رسائل البريد\"",
|
||||
"allMailFolderSelectedDesc": "من المحتمل أن يؤدي تحديد المجلدات التي تحمل سمة \"جميع رسائل البريد\" إلى تكرار الرسائل التي تمت مزامنتها بالفعل من مجلدات مثل البريد الوارد والمرسل. قد يستهلك هذا مساحة تخزين أكبر بكثير.",
|
||||
"allMailSkipped": "تم تحديد المجلدات القياسية. تم تخطي 'جميع رسائل البريد' لتجنب التكرارات.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "المُضيف",
|
||||
"id": "المعرّف",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "حساب IMAP",
|
||||
"imapAccountDescription": "تنزيل وأرشفة البريد عبر IMAP.",
|
||||
"imapAuthMethod": "طريقة مصادقة IMAP",
|
||||
"imapEncryption": "تشفير IMAP",
|
||||
"imapHost": "مُضيف IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "اسم الدخول",
|
||||
"minutes": "دقائق",
|
||||
"months": "أشهر",
|
||||
"moreAccountTypes": "المزيد من أنواع الحسابات",
|
||||
"mustBeAtLeast1": "يجب أن يكون 1 على الأقل",
|
||||
"name": "الاسم",
|
||||
"nameDescription": "اسم مستخدم IMAP. افتراضياً بريدك الإلكتروني، أو أدخل اسماً مخصصاً.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "لا توجد تكوينات للحساب",
|
||||
"noAccountConfigurationsDesc": "لم تقم بإضافة أي تكوينات للحساب بعد. أضف واحدة لبدء استخدام ميزات الحساب.",
|
||||
"noOAuth2Tokens": "لا توجد رموز OAuth2",
|
||||
"noSyncAccount": "حساب محلي",
|
||||
"noSyncAccountDescription": "حساب محلي للبيانات المستوردة فقط.",
|
||||
"none": "لا شيء",
|
||||
"notAvailable": "غير متاح",
|
||||
"oauth2Tokens": "رموز OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "الجلسة النشطة",
|
||||
"errors": "أخطاء",
|
||||
"folders": "صناديق البريد",
|
||||
"global_errors": "الأخطاء العامة",
|
||||
"history": "السجل"
|
||||
}
|
||||
},
|
||||
"saveChanges": "حفظ التغييرات",
|
||||
"selectAccountType": "اختر نوع الحساب",
|
||||
"selectAtLeastOneFolder": "يرجى تحديد مجلد واحد على الأقل",
|
||||
"selectAuthMethod": "اختر طريقة مصادقة",
|
||||
"selectDate": "اختر تاريخًا",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "لا توجد رسائل في هذه المحادثة",
|
||||
"error": "فشل تحميل المحادثة",
|
||||
"invalidDate": "تاريخ غير صالح",
|
||||
"latest": "الأحدث",
|
||||
"loadMore": "تحميل المزيد",
|
||||
"loadingMore": "جارٍ التحميل...",
|
||||
"noSubject": "(لا يوجد موضوع)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Konto opdateret",
|
||||
"accountUpdatedDesc": "Din konto er blevet opdateret.",
|
||||
"actions": "Handlinger",
|
||||
"add": "Tilføj konto",
|
||||
"addAccount": "Tilføj konto",
|
||||
"addConfiguration": "Tilføj konfiguration",
|
||||
"addImap": "Tilføj IMAP",
|
||||
"addNewEmailAccountHere": "Tilføj ny e-mailkonto her. ",
|
||||
"addNoSync": "Tilføj NoSync",
|
||||
"allMailFolderSelected": "Bemærk: Mappen \"Al mail\" er valgt",
|
||||
"allMailFolderSelectedDesc": "Valg af mapper med attributtet \"Al mail\" vil sandsynligvis resultere i duplikerede meddelelser, der allerede er synkroniseret fra mapper som Indbakke og Sendt. Dette kan optage betydeligt mere lagerplads.",
|
||||
"allMailSkipped": "Valgte standardmapper. \"Al mail\" blev sprunget over for at undgå dubletter.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "vært",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-konto",
|
||||
"imapAccountDescription": "Download og arkiver e-mails via IMAP.",
|
||||
"imapAuthMethod": "IMAP-godkendelsesmetode",
|
||||
"imapEncryption": "IMAP-kryptering",
|
||||
"imapHost": "IMAP-vært",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Logindnavn",
|
||||
"minutes": "minutter",
|
||||
"months": "Måneder",
|
||||
"moreAccountTypes": "Flere kontotyper",
|
||||
"mustBeAtLeast1": "Skal være mindst 1",
|
||||
"name": "Navn",
|
||||
"nameDescription": "IMAP-brugernavn. Standard er din e-mail, ellers angiv et eget.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Ingen kontokonfigurationer",
|
||||
"noAccountConfigurationsDesc": "Du har ikke tilføjet nogen kontokonfigurationer endnu. Tilføj en for at begynde at bruge kontofunktioner.",
|
||||
"noOAuth2Tokens": "Ingen OAuth2-tokens",
|
||||
"noSyncAccount": "Lokal konto",
|
||||
"noSyncAccountDescription": "Lokal konto kun til importerede data.",
|
||||
"none": "Ingen",
|
||||
"notAvailable": "ikke tilgængelig",
|
||||
"oauth2Tokens": "OAuth2-tokens",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktiv session",
|
||||
"errors": "Fejl",
|
||||
"folders": "Postkasser",
|
||||
"global_errors": "Globale fejl",
|
||||
"history": "Historik"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Gem ændringer",
|
||||
"selectAccountType": "Vælg kontotype",
|
||||
"selectAtLeastOneFolder": "Vælg venligst mindst én mappe",
|
||||
"selectAuthMethod": "Vælg en godkendelsesmetode",
|
||||
"selectDate": "Vælg en dato",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Ingen meddelelser i denne tråd",
|
||||
"error": "Kunne ikke indlæse tråd",
|
||||
"invalidDate": "Ugyldig dato",
|
||||
"latest": "Seneste",
|
||||
"loadMore": "Indlæs mere",
|
||||
"loadingMore": "Indlæser...",
|
||||
"noSubject": "(Intet emne)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Konto aktualisiert",
|
||||
"accountUpdatedDesc": "Ihr Konto wurde erfolgreich aktualisiert.",
|
||||
"actions": "Aktionen",
|
||||
"add": "Konto hinzufügen",
|
||||
"addAccount": "Konto hinzufügen",
|
||||
"addConfiguration": "Konfiguration hinzufügen",
|
||||
"addImap": "IMAP hinzufügen",
|
||||
"addNewEmailAccountHere": "Fügen Sie hier ein neues E-Mail-Konto hinzu. ",
|
||||
"addNoSync": "NoSync hinzufügen",
|
||||
"allMailFolderSelected": "Warnung: 'Alle E-Mails'-Ordner ausgewählt",
|
||||
"allMailFolderSelectedDesc": "Die Auswahl von Ordnern mit dem Attribut 'Alle E-Mails' führt wahrscheinlich zur Duplizierung von Nachrichten, die bereits aus Ordnern wie Posteingang und Gesendet synchronisiert wurden. Dies könnte erheblich mehr Speicherplatz verbrauchen.",
|
||||
"allMailSkipped": "Standardordner ausgewählt. 'Alle E-Mails' wurde übersprungen, um Duplikate zu vermeiden.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "Host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-Konto",
|
||||
"imapAccountDescription": "E-Mails über IMAP herunterladen und archivieren.",
|
||||
"imapAuthMethod": "IMAP-Authentifizierungsmethode",
|
||||
"imapEncryption": "IMAP-Verschlüsselung",
|
||||
"imapHost": "IMAP-Host",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Anmeldename",
|
||||
"minutes": "Minuten",
|
||||
"months": "Monate",
|
||||
"moreAccountTypes": "Mehr Kontotypen",
|
||||
"mustBeAtLeast1": "Muss mindestens 1 sein",
|
||||
"name": "Name",
|
||||
"nameDescription": "IMAP-Benutzername. Standardmäßig Ihre E-Mail, sonst hier anpassen.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Keine Kontokonfigurationen",
|
||||
"noAccountConfigurationsDesc": "Sie haben noch keine Kontokonfigurationen hinzugefügt. Fügen Sie eine hinzu, um mit der Nutzung der Kontofunktionen zu beginnen.",
|
||||
"noOAuth2Tokens": "Keine OAuth2-Token",
|
||||
"noSyncAccount": "Lokales Konto",
|
||||
"noSyncAccountDescription": "Lokales Konto nur für importierte Daten.",
|
||||
"none": "Keine",
|
||||
"notAvailable": "nicht verfügbar",
|
||||
"oauth2Tokens": "OAuth2-Token",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktive Sitzung",
|
||||
"errors": "Fehler",
|
||||
"folders": "Postfächer",
|
||||
"global_errors": "Globale Fehler",
|
||||
"history": "Verlauf"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Änderungen speichern",
|
||||
"selectAccountType": "Kontotyp auswählen",
|
||||
"selectAtLeastOneFolder": "Wählen Sie mindestens einen Ordner aus",
|
||||
"selectAuthMethod": "Authentifizierungsmethode auswählen",
|
||||
"selectDate": "Datum auswählen",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Keine Nachrichten in diesem Thread",
|
||||
"error": "Fehler beim Laden des Threads",
|
||||
"invalidDate": "Ungültiges Datum",
|
||||
"latest": "Neueste",
|
||||
"loadMore": "Mehr laden",
|
||||
"loadingMore": "Wird geladen...",
|
||||
"noSubject": "(Kein Betreff)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Account Updated",
|
||||
"accountUpdatedDesc": "Your account has been successfully updated.",
|
||||
"actions": "Actions",
|
||||
"add": "Add account",
|
||||
"addAccount": "Add Account",
|
||||
"addConfiguration": "Add Configuration",
|
||||
"addImap": "Add IMAP",
|
||||
"addNewEmailAccountHere": "Add new email account here. ",
|
||||
"addNoSync": "Add NoSync",
|
||||
"allMailFolderSelected": "Heads Up: \"All Mail\" Folder Selected",
|
||||
"allMailFolderSelectedDesc": "Selecting folders with the \"All Mail\" attribute will likely lead to duplicating messages already synced from folders like Inbox and Sent. This may consume significantly more storage space.",
|
||||
"allMailSkipped": "Selected standard folders. 'All Mail' was skipped to avoid duplicates.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP account",
|
||||
"imapAccountDescription": "Download and archive emails via IMAP.",
|
||||
"imapAuthMethod": "IMAP Auth Method",
|
||||
"imapEncryption": "IMAP Encryption",
|
||||
"imapHost": "IMAP Host",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Login Name",
|
||||
"minutes": "minutes",
|
||||
"months": "Months",
|
||||
"moreAccountTypes": "More account types",
|
||||
"mustBeAtLeast1": "Must be at least 1",
|
||||
"name": "Name",
|
||||
"nameDescription": "IMAP username. Defaults to your email; custom name supported.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "No Account Configurations",
|
||||
"noAccountConfigurationsDesc": "You haven't added any Account configurations yet. Add one to start using Account features.",
|
||||
"noOAuth2Tokens": "No OAuth2 Tokens",
|
||||
"noSyncAccount": "Local account",
|
||||
"noSyncAccountDescription": "Local account for imported data only.",
|
||||
"none": "None",
|
||||
"notAvailable": "n/a",
|
||||
"oauth2Tokens": "OAuth2 Tokens",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Active Session",
|
||||
"errors": "Errors",
|
||||
"folders": "Mailboxes",
|
||||
"global_errors": "Global Errors",
|
||||
"history": "History"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Save changes",
|
||||
"selectAccountType": "Select account type",
|
||||
"selectAtLeastOneFolder": "Please select at least one folder",
|
||||
"selectAuthMethod": "Select an authentication method",
|
||||
"selectDate": "Select a date",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "No messages in this thread",
|
||||
"error": "Failed to load thread",
|
||||
"invalidDate": "Invalid date",
|
||||
"latest": "Latest",
|
||||
"loadMore": "Load more",
|
||||
"loadingMore": "Loading...",
|
||||
"noSubject": "(No subject)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Cuenta actualizada",
|
||||
"accountUpdatedDesc": "Tu cuenta ha sido actualizada con éxito.",
|
||||
"actions": "Acciones",
|
||||
"add": "Añadir cuenta",
|
||||
"addAccount": "Añadir cuenta",
|
||||
"addConfiguration": "Añadir configuración",
|
||||
"addImap": "Añadir IMAP",
|
||||
"addNewEmailAccountHere": "Añade una nueva cuenta de correo electrónico aquí. ",
|
||||
"addNoSync": "Añadir NoSync",
|
||||
"allMailFolderSelected": "Advertencia: Carpeta 'Todo el correo' seleccionada",
|
||||
"allMailFolderSelectedDesc": "Seleccionar carpetas con el atributo 'Todo el correo' probablemente resultará en la duplicación de mensajes ya sincronizados de carpetas como Bandeja de entrada y Enviados. Esto podría consumir significativamente más espacio de almacenamiento.",
|
||||
"allMailSkipped": "Carpetas predeterminadas seleccionadas. 'Todo el correo' omitido para evitar duplicados.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Cuenta IMAP",
|
||||
"imapAccountDescription": "Descargar y archivar correos vía IMAP.",
|
||||
"imapAuthMethod": "Método de autenticación IMAP",
|
||||
"imapEncryption": "Cifrado IMAP",
|
||||
"imapHost": "Host IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Nombre de usuario",
|
||||
"minutes": "minutos",
|
||||
"months": "Meses",
|
||||
"moreAccountTypes": "Más tipos de cuenta",
|
||||
"mustBeAtLeast1": "Debe ser al menos 1",
|
||||
"name": "Nombre",
|
||||
"nameDescription": "Usuario IMAP. Por defecto su email; cámbielo si es necesario.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Sin configuraciones de cuenta",
|
||||
"noAccountConfigurationsDesc": "Aún no has añadido ninguna configuración de cuenta. Añade una para empezar a usar las funcionalidades de la cuenta.",
|
||||
"noOAuth2Tokens": "Sin tokens OAuth2",
|
||||
"noSyncAccount": "Cuenta local",
|
||||
"noSyncAccountDescription": "Cuenta local solo para datos importados.",
|
||||
"none": "Ninguno",
|
||||
"notAvailable": "no disponible",
|
||||
"oauth2Tokens": "Tokens OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Sesión activa",
|
||||
"errors": "Errores",
|
||||
"folders": "Buzones",
|
||||
"global_errors": "Errores globales",
|
||||
"history": "Historial"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Guardar cambios",
|
||||
"selectAccountType": "Seleccionar tipo de cuenta",
|
||||
"selectAtLeastOneFolder": "Selecciona al menos una carpeta",
|
||||
"selectAuthMethod": "Selecciona el método de autenticación",
|
||||
"selectDate": "Seleccionar fecha",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "No hay mensajes en este hilo",
|
||||
"error": "Error al cargar el hilo",
|
||||
"invalidDate": "Fecha inválida",
|
||||
"latest": "Último",
|
||||
"loadMore": "Cargar más",
|
||||
"loadingMore": "Cargando...",
|
||||
"noSubject": "(Sin asunto)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Tili päivitetty",
|
||||
"accountUpdatedDesc": "Tilisi on päivitetty onnistuneesti.",
|
||||
"actions": "Toiminnot",
|
||||
"add": "Lisää tili",
|
||||
"addAccount": "Lisää tili",
|
||||
"addConfiguration": "Lisää määritys",
|
||||
"addImap": "Lisää IMAP",
|
||||
"addNewEmailAccountHere": "Lisää uusi sähköpostitili täällä. ",
|
||||
"addNoSync": "Lisää NoSync",
|
||||
"allMailFolderSelected": "Varoitus: 'Kaikki sähköpostit' -kansio valittu",
|
||||
"allMailFolderSelectedDesc": "Kansioiden valitseminen, joilla on 'Kaikki sähköpostit' -attribuutti, johtaa todennäköisesti jo synkronoitujen viestien kahdentumiseen kansioista, kuten Saapuneet ja Lähetetyt. Tämä voi kuluttaa huomattavasti enemmän tallennustilaa.",
|
||||
"allMailSkipped": "Oletuskansiot valittu. 'Kaikki sähköpostit' ohitettiin päällekkäisyyksien välttämiseksi.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "isäntä",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-tili",
|
||||
"imapAccountDescription": "Lataa ja arkistoi sähköpostit IMAP-yhteydellä.",
|
||||
"imapAuthMethod": "IMAP-todennusmenetelmä",
|
||||
"imapEncryption": "IMAP-salaus",
|
||||
"imapHost": "IMAP-isäntä",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Kirjautumisnimi",
|
||||
"minutes": "minuuttia",
|
||||
"months": "Kuukautta",
|
||||
"moreAccountTypes": "Lisää tilityyppejä",
|
||||
"mustBeAtLeast1": "Täytyy olla vähintään 1",
|
||||
"name": "Nimi",
|
||||
"nameDescription": "IMAP-käyttäjätunnus. Oletuksena sähköposti, tai aseta oma tunnus.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Ei tilimäärityksiä",
|
||||
"noAccountConfigurationsDesc": "Et ole vielä lisännyt tilimäärityksiä. Lisää yksi aloittaaksesi tilitoimintojen käytön.",
|
||||
"noOAuth2Tokens": "Ei OAuth2-tunnuksia",
|
||||
"noSyncAccount": "Paikallinen tili",
|
||||
"noSyncAccountDescription": "Paikallinen tili vain tuodulle ditalle.",
|
||||
"none": "Ei mitään",
|
||||
"notAvailable": "ei saatavilla",
|
||||
"oauth2Tokens": "OAuth2-tunnukset",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktiivinen istunto",
|
||||
"errors": "Virheet",
|
||||
"folders": "Postilaatikot",
|
||||
"global_errors": "Yleiset virheet",
|
||||
"history": "Historia"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Tallenna muutokset",
|
||||
"selectAccountType": "Valitse tilityyppi",
|
||||
"selectAtLeastOneFolder": "Valitse vähintään yksi kansio",
|
||||
"selectAuthMethod": "Valitse todennusmenetelmä",
|
||||
"selectDate": "Valitse päivämäärä",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Ei viestejä tässä keskusteluketjussa",
|
||||
"error": "Keskusteluketjun lataus epäonnistui",
|
||||
"invalidDate": "Virheellinen päivämäärä",
|
||||
"latest": "Uusin",
|
||||
"loadMore": "Lataa lisää",
|
||||
"loadingMore": "Ladataan...",
|
||||
"noSubject": "(Ei aihetta)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Compte Mis à Jour",
|
||||
"accountUpdatedDesc": "Votre compte a été mis à jour avec succès.",
|
||||
"actions": "Actions",
|
||||
"add": "Ajouter un compte",
|
||||
"addAccount": "Ajouter un Compte",
|
||||
"addConfiguration": "Ajouter Configuration",
|
||||
"addImap": "Ajouter IMAP",
|
||||
"addNewEmailAccountHere": "Ajoutez un nouveau compte e-mail ici. ",
|
||||
"addNoSync": "Ajouter NoSync",
|
||||
"allMailFolderSelected": "Attention : Dossier 'Tous les messages' sélectionné",
|
||||
"allMailFolderSelectedDesc": "La sélection de dossiers avec l'attribut 'Tous les messages' entraînera probablement la duplication des messages déjà synchronisés à partir de dossiers tels que Boîte de réception et Éléments envoyés. Cela peut consommer beaucoup plus d'espace de stockage.",
|
||||
"allMailSkipped": "Dossiers par défaut sélectionnés. 'Tous les messages' a été ignoré pour éviter les doublons.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "hôte",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Compte IMAP",
|
||||
"imapAccountDescription": "Télécharger et archiver les e-mails via IMAP.",
|
||||
"imapAuthMethod": "Méthode d'Authentification IMAP",
|
||||
"imapEncryption": "Chiffrement IMAP",
|
||||
"imapHost": "Hôte IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Nom de connexion",
|
||||
"minutes": "minutes",
|
||||
"months": "Mois",
|
||||
"moreAccountTypes": "Plus de types de compte",
|
||||
"mustBeAtLeast1": "Doit être au moins 1",
|
||||
"name": "Nom",
|
||||
"nameDescription": "Nom d'utilisateur IMAP. E-mail par défaut ou nom personnalisé.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Aucune Configuration de Compte",
|
||||
"noAccountConfigurationsDesc": "Vous n'avez pas encore ajouté de Configuration de Compte. Veuillez en ajouter une pour commencer à utiliser les fonctionnalités du Compte.",
|
||||
"noOAuth2Tokens": "Aucun Jeton OAuth2",
|
||||
"noSyncAccount": "Compte local",
|
||||
"noSyncAccountDescription": "Compte local pour données importées uniquement.",
|
||||
"none": "Aucune",
|
||||
"notAvailable": "n.d.",
|
||||
"oauth2Tokens": "Jetons OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Session active",
|
||||
"errors": "Erreurs",
|
||||
"folders": "Boîtes mail",
|
||||
"global_errors": "Erreurs globales",
|
||||
"history": "Historique"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Enregistrer les Modifications",
|
||||
"selectAccountType": "Sélectionner le type de compte",
|
||||
"selectAtLeastOneFolder": "Veuillez sélectionner au moins un dossier",
|
||||
"selectAuthMethod": "Sélectionner une méthode d'authentification",
|
||||
"selectDate": "Sélectionner une date",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Aucun message dans ce fil de discussion",
|
||||
"error": "Échec du chargement du fil de discussion",
|
||||
"invalidDate": "Date invalide",
|
||||
"latest": "Dernier",
|
||||
"loadMore": "Charger plus",
|
||||
"loadingMore": "Chargement en cours...",
|
||||
"noSubject": "(Aucun objet)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Account Aggiornato",
|
||||
"accountUpdatedDesc": "Il tuo account è stato aggiornato con successo.",
|
||||
"actions": "Azioni",
|
||||
"add": "Aggiungi account",
|
||||
"addAccount": "Aggiungi Account",
|
||||
"addConfiguration": "Aggiungi Configurazione",
|
||||
"addImap": "Aggiungi IMAP",
|
||||
"addNewEmailAccountHere": "Aggiungi un nuovo account email qui. ",
|
||||
"addNoSync": "Aggiungi NoSync",
|
||||
"allMailFolderSelected": "Attenzione: Cartella 'Tutta la Posta' Selezionata",
|
||||
"allMailFolderSelectedDesc": "La selezione di cartelle con l'attributo 'Tutta la Posta' probabilmente causerà la duplicazione dei messaggi già sincronizzati da cartelle come Posta in arrivo e Posta inviata. Questo può consumare significativamente più spazio di archiviazione.",
|
||||
"allMailSkipped": "Cartelle predefinite selezionate. 'Tutta la Posta' è stata saltata per evitare duplicati.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Account IMAP",
|
||||
"imapAccountDescription": "Scarica e archivia email via IMAP.",
|
||||
"imapAuthMethod": "Metodo di Autenticazione IMAP",
|
||||
"imapEncryption": "Crittografia IMAP",
|
||||
"imapHost": "Host IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Nome di accesso",
|
||||
"minutes": "minuti",
|
||||
"months": "Mesi",
|
||||
"moreAccountTypes": "Altri tipi di account",
|
||||
"mustBeAtLeast1": "Deve essere almeno 1",
|
||||
"name": "Nome",
|
||||
"nameDescription": "Nome utente IMAP. Predefinito l'email, oppure personalizzalo.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Nessuna Configurazione Account",
|
||||
"noAccountConfigurationsDesc": "Non hai ancora aggiunto alcuna Configurazione Account. Aggiungine una per iniziare a usare le funzionalità Account.",
|
||||
"noOAuth2Tokens": "Nessun Token OAuth2",
|
||||
"noSyncAccount": "Account locale",
|
||||
"noSyncAccountDescription": "Account locale solo per dati importati.",
|
||||
"none": "Nessuna",
|
||||
"notAvailable": "n.d.",
|
||||
"oauth2Tokens": "Token OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Sessione attiva",
|
||||
"errors": "Errori",
|
||||
"folders": "Caselle di posta",
|
||||
"global_errors": "Errori globali",
|
||||
"history": "Cronologia"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Salva Modifiche",
|
||||
"selectAccountType": "Seleziona tipo di account",
|
||||
"selectAtLeastOneFolder": "Seleziona almeno una cartella",
|
||||
"selectAuthMethod": "Seleziona un metodo di autenticazione",
|
||||
"selectDate": "Seleziona una data",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Nessun messaggio in questo thread",
|
||||
"error": "Caricamento thread fallito",
|
||||
"invalidDate": "Data non valida",
|
||||
"latest": "Ultimo",
|
||||
"loadMore": "Carica altro",
|
||||
"loadingMore": "Caricamento in corso...",
|
||||
"noSubject": "(Nessun oggetto)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "アカウントが更新されました",
|
||||
"accountUpdatedDesc": "アカウントが正常に更新されました。",
|
||||
"actions": "アクション",
|
||||
"add": "アカウントを追加",
|
||||
"addAccount": "アカウントを追加",
|
||||
"addConfiguration": "設定を追加",
|
||||
"addImap": "IMAPアカウントを追加",
|
||||
"addNewEmailAccountHere": "こちらで新しいメールアカウントを追加してください。",
|
||||
"addNoSync": "非同期アカウントを追加",
|
||||
"allMailFolderSelected": "ご注意: 「すべてのメール」フォルダーが選択されています",
|
||||
"allMailFolderSelectedDesc": "「すべてのメール」属性を持つフォルダーを選択すると、受信トレイや送信済みなどのフォルダーからすでに同期されているメッセージが重複する可能性があります。これにより、ストレージ容量が大幅に消費される可能性があります。",
|
||||
"allMailSkipped": "標準フォルダーが選択されました。「すべてのメール」は重複を避けるためにスキップされました。",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "ホスト",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP アカウント",
|
||||
"imapAccountDescription": "IMAPでメールをダウンロード・アーカイブ。",
|
||||
"imapAuthMethod": "IMAP認証方式",
|
||||
"imapEncryption": "IMAP暗号化",
|
||||
"imapHost": "IMAPホスト",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "ログイン名",
|
||||
"minutes": "分",
|
||||
"months": "月",
|
||||
"moreAccountTypes": "他のアカウントタイプ",
|
||||
"mustBeAtLeast1": "1以上である必要があります",
|
||||
"name": "名前",
|
||||
"nameDescription": "IMAPユーザー名。通常はメールアドレスですが、変更も可能です。",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "アカウント設定がありません",
|
||||
"noAccountConfigurationsDesc": "まだアカウント設定を追加していません。機能を利用するには設定を追加してください。",
|
||||
"noOAuth2Tokens": "OAuth2トークンなし",
|
||||
"noSyncAccount": "ローカルアカウント",
|
||||
"noSyncAccountDescription": "インポートデータ専用のローカルアカウント。",
|
||||
"none": "なし",
|
||||
"notAvailable": "N/A",
|
||||
"oauth2Tokens": "OAuth2トークン",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "実行中タスク",
|
||||
"errors": "エラー",
|
||||
"folders": "メールボックス",
|
||||
"global_errors": "全体エラー",
|
||||
"history": "履歴"
|
||||
}
|
||||
},
|
||||
"saveChanges": "変更を保存",
|
||||
"selectAccountType": "アカウントの種類を選択",
|
||||
"selectAtLeastOneFolder": "少なくとも1つのフォルダーを選択してください",
|
||||
"selectAuthMethod": "認証方式を選択",
|
||||
"selectDate": "日付を選択",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "このスレッドにメッセージはありません",
|
||||
"error": "スレッドの読み込みに失敗しました",
|
||||
"invalidDate": "無効な日付",
|
||||
"latest": "最新",
|
||||
"loadMore": "さらに読み込む",
|
||||
"loadingMore": "読み込み中...",
|
||||
"noSubject": "(件名なし)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "계정 업데이트됨",
|
||||
"accountUpdatedDesc": "계정이 성공적으로 업데이트되었습니다.",
|
||||
"actions": "작업",
|
||||
"add": "계정 추가",
|
||||
"addAccount": "계정 추가",
|
||||
"addConfiguration": "구성 추가",
|
||||
"addImap": "IMAP 계정 추가",
|
||||
"addNewEmailAccountHere": "여기에서 새 이메일 계정을 추가하십시오.",
|
||||
"addNoSync": "동기화 안 함 계정 추가",
|
||||
"allMailFolderSelected": "주의: '모든 메일' 폴더가 선택되었습니다",
|
||||
"allMailFolderSelectedDesc": "'모든 메일' 속성을 가진 폴더를 선택하면 받은 편지함이나 보낸 항목과 같은 폴더에서 이미 동기화된 메시지가 중복될 수 있습니다. 이로 인해 저장 공간이 상당히 많이 사용될 수 있습니다.",
|
||||
"allMailSkipped": "기본 폴더가 선택되었습니다. 중복을 방지하기 위해 '모든 메일'은 건너뛰었습니다.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "호스트",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP 계정",
|
||||
"imapAccountDescription": "IMAP으로 메일 다운로드 및 보관.",
|
||||
"imapAuthMethod": "IMAP 인증 방법",
|
||||
"imapEncryption": "IMAP 암호화",
|
||||
"imapHost": "IMAP 호스트",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "로그인 이름",
|
||||
"minutes": "분",
|
||||
"months": "개월",
|
||||
"moreAccountTypes": "더 많은 계정 유형",
|
||||
"mustBeAtLeast1": "최소 1 이상이어야 합니다",
|
||||
"name": "이름",
|
||||
"nameDescription": "IMAP 사용자 이름. 기본값은 이메일이며, 직접 입력도 가능합니다.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "계정 구성 없음",
|
||||
"noAccountConfigurationsDesc": "아직 계정 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.",
|
||||
"noOAuth2Tokens": "OAuth2 토큰 없음",
|
||||
"noSyncAccount": "로컬 계정",
|
||||
"noSyncAccountDescription": "가져온 데이터 전용 로컬 계정.",
|
||||
"none": "없음",
|
||||
"notAvailable": "해당 없음",
|
||||
"oauth2Tokens": "OAuth2 토큰",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "현재 작업",
|
||||
"errors": "오류",
|
||||
"folders": "메일함",
|
||||
"global_errors": "전체 오류",
|
||||
"history": "기록"
|
||||
}
|
||||
},
|
||||
"saveChanges": "변경 사항 저장",
|
||||
"selectAccountType": "계정 유형 선택",
|
||||
"selectAtLeastOneFolder": "하나 이상의 폴더를 선택하십시오",
|
||||
"selectAuthMethod": "인증 방법 선택",
|
||||
"selectDate": "날짜 선택",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "이 스레드에 메시지가 없습니다",
|
||||
"error": "스레드 로드 실패",
|
||||
"invalidDate": "유효하지 않은 날짜",
|
||||
"latest": "최신",
|
||||
"loadMore": "더 로드",
|
||||
"loadingMore": "로드 중...",
|
||||
"noSubject": "(제목 없음)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Account Bijgewerkt",
|
||||
"accountUpdatedDesc": "Uw account is succesvol bijgewerkt.",
|
||||
"actions": "Acties",
|
||||
"add": "Account toevoegen",
|
||||
"addAccount": "Account Toevoegen",
|
||||
"addConfiguration": "Configuratie Toevoegen",
|
||||
"addImap": "IMAP Toevoegen",
|
||||
"addNewEmailAccountHere": "Voeg hier een nieuw e-mailaccount toe. ",
|
||||
"addNoSync": "NoSync Toevoegen",
|
||||
"allMailFolderSelected": "Let Op: 'Alle Mail' Map Geselecteerd",
|
||||
"allMailFolderSelectedDesc": "Het selecteren van mappen met het 'Alle Mail'-kenmerk zal waarschijnlijk leiden tot dubbele berichten die al zijn gesynchroniseerd vanuit mappen zoals Postvak In en Verzonden. Dit kan aanzienlijk meer opslagruimte in beslag nemen.",
|
||||
"allMailSkipped": "Standaardmappen geselecteerd. 'Alle Mail' is overgeslagen om duplicaten te voorkomen.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-account",
|
||||
"imapAccountDescription": "E-mails downloaden en archiveren via IMAP.",
|
||||
"imapAuthMethod": "IMAP Autorisatiemethode",
|
||||
"imapEncryption": "IMAP Versleuteling",
|
||||
"imapHost": "IMAP Host",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Inlognaam",
|
||||
"minutes": "minuten",
|
||||
"months": "Maanden",
|
||||
"moreAccountTypes": "Meer accounttypes",
|
||||
"mustBeAtLeast1": "Moet ten minste 1 zijn",
|
||||
"name": "Naam",
|
||||
"nameDescription": "IMAP-gebruikersnaam. Standaard je e-mail, of kies een andere.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Geen Accountconfiguraties",
|
||||
"noAccountConfigurationsDesc": "U heeft nog geen Accountconfiguraties toegevoegd. Voeg er een toe om de Accountfuncties te gebruiken.",
|
||||
"noOAuth2Tokens": "Geen OAuth2 Tokens",
|
||||
"noSyncAccount": "Lokaal account",
|
||||
"noSyncAccountDescription": "Lokaal account alleen voor geïmporteerde gegevens.",
|
||||
"none": "Geen",
|
||||
"notAvailable": "n.v.t.",
|
||||
"oauth2Tokens": "OAuth2 Tokens",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Actieve sessie",
|
||||
"errors": "Fouten",
|
||||
"folders": "Mailboxen",
|
||||
"global_errors": "Globale fouten",
|
||||
"history": "Geschiedenis"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Wijzigingen opslaan",
|
||||
"selectAccountType": "Selecteer accounttype",
|
||||
"selectAtLeastOneFolder": "Selecteer alstublieft ten minste één map",
|
||||
"selectAuthMethod": "Selecteer een authenticatiemethode",
|
||||
"selectDate": "Selecteer een datum",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Geen berichten in deze draad",
|
||||
"error": "Laden van draad mislukt",
|
||||
"invalidDate": "Ongeldige datum",
|
||||
"latest": "Nieuwste",
|
||||
"loadMore": "Meer laden",
|
||||
"loadingMore": "Laden...",
|
||||
"noSubject": "(Geen onderwerp)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Konto oppdatert",
|
||||
"accountUpdatedDesc": "Kontoen din har blitt oppdatert.",
|
||||
"actions": "Handlinger",
|
||||
"add": "Legg til konto",
|
||||
"addAccount": "Legg til konto",
|
||||
"addConfiguration": "Legg til konfigurasjon",
|
||||
"addImap": "Legg til IMAP",
|
||||
"addNewEmailAccountHere": "Legg til ny e-postkonto her. ",
|
||||
"addNoSync": "Legg til NoSync",
|
||||
"allMailFolderSelected": "OBS: Mappen \"All e-post\" er valgt",
|
||||
"allMailFolderSelectedDesc": "Å velge mapper med attributtet \"All e-post\" (All Mail) vil sannsynligvis føre til duplisering av meldinger som allerede er synkronisert fra mapper som Innboks og Sendt. Dette kan forbruke betydelig mer lagringsplass.",
|
||||
"allMailSkipped": "Valgte standardmapper. 'All e-post' ble hoppet over for å unngå duplikater.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "vert",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-konto",
|
||||
"imapAccountDescription": "Last ned og arkiver e-post via IMAP.",
|
||||
"imapAuthMethod": "IMAP-autentiseringsmetode",
|
||||
"imapEncryption": "IMAP-kryptering",
|
||||
"imapHost": "IMAP-vert",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Påloggingsnavn",
|
||||
"minutes": "minutter",
|
||||
"months": "Måneder",
|
||||
"moreAccountTypes": "Flere kontotyper",
|
||||
"mustBeAtLeast1": "Må være minst 1",
|
||||
"name": "Navn",
|
||||
"nameDescription": "IMAP-brukernavn. Bruker e-post som standard, eller velg et eget.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Ingen kontokonfigurasjoner",
|
||||
"noAccountConfigurationsDesc": "Du har ikke lagt til noen kontokonfigurasjoner ennå. Legg til en for å begynne å bruke kontofunksjoner.",
|
||||
"noOAuth2Tokens": "Ingen OAuth2-tokener",
|
||||
"noSyncAccount": "Lokal konto",
|
||||
"noSyncAccountDescription": "Lokal konto kun for importerte data.",
|
||||
"none": "Ingen",
|
||||
"notAvailable": "i/t",
|
||||
"oauth2Tokens": "OAuth2-tokener",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktiv økt",
|
||||
"errors": "Feil",
|
||||
"folders": "Postbokser",
|
||||
"global_errors": "Globale feil",
|
||||
"history": "Historikk"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Lagre endringer",
|
||||
"selectAccountType": "Velg kontotype",
|
||||
"selectAtLeastOneFolder": "Vennligst velg minst én mappe",
|
||||
"selectAuthMethod": "Velg en autentiseringsmetode",
|
||||
"selectDate": "Velg en dato",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Ingen meldinger i denne tråden",
|
||||
"error": "Kunne ikke laste tråd",
|
||||
"invalidDate": "Ugyldig dato",
|
||||
"latest": "Siste",
|
||||
"loadMore": "Last mer",
|
||||
"loadingMore": "Laster...",
|
||||
"noSubject": "(Uten emne)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Konto zaktualizowano",
|
||||
"accountUpdatedDesc": "Twoje konto zostało prawidłowo zaktualizowane.",
|
||||
"actions": "Działania",
|
||||
"add": "Dodaj konto",
|
||||
"addAccount": "Dodaj konto. ",
|
||||
"addConfiguration": "Dodaj konfigurację",
|
||||
"addImap": "Dodaj IMAP",
|
||||
"addNewEmailAccountHere": "Dodaj nowe konto email tutaj. ",
|
||||
"addNoSync": "Dodaj NoSync",
|
||||
"allMailFolderSelected": "Uwaga: folder \"Wszystkie wiadomości\" izostał zaznaczony",
|
||||
"allMailFolderSelectedDesc": "Wybierając foldery z atrybutem \"Wszystkie wiadomości\" prawdopodobnie spowoduje to duplikowanie się wiadomości już zsynchronizowanych z folderów takich jak Skrzynka odbiorcza i Wysłane. Może to zająć znacznie więcej miejsca",
|
||||
"allMailSkipped": "Wybrane foldery standardowe. Pominięto 'Wszystkie wiadomości', aby uniknąć duplikatów.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Konto IMAP",
|
||||
"imapAccountDescription": "Pobieraj i archiwizuj e-maile przez IMAP.",
|
||||
"imapAuthMethod": "Metoda uwierzytelniania IMAP",
|
||||
"imapEncryption": "Szyfrowanie IMAP",
|
||||
"imapHost": "Host IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Login",
|
||||
"minutes": "minut",
|
||||
"months": "Miesiące",
|
||||
"moreAccountTypes": "Więcej typów kont",
|
||||
"mustBeAtLeast1": "Nie mniej jak 1",
|
||||
"name": "Nazwa",
|
||||
"nameDescription": "Nazwa użytkownika IMAP. Domyślnie e-mail lub własna nazwa.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Brak konfiguracji konta",
|
||||
"noAccountConfigurationsDesc": "Nie skonfigurowano jeszcze żadnego konta, aby zacząć korzystać z funkcji dodaj pierwsze konto.",
|
||||
"noOAuth2Tokens": "Brak tokenów OAuth2",
|
||||
"noSyncAccount": "Konto lokalne",
|
||||
"noSyncAccountDescription": "Konto lokalne tylko dla zaimportowanych danych.",
|
||||
"none": "Nigdy",
|
||||
"notAvailable": "niedostępny",
|
||||
"oauth2Tokens": "Tokeny OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktywna sesja",
|
||||
"errors": "Błędy",
|
||||
"folders": "Skrzynki",
|
||||
"global_errors": "Błędy globalne",
|
||||
"history": "Historia"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Zapisz zmiany",
|
||||
"selectAccountType": "Wybierz typ konta",
|
||||
"selectAtLeastOneFolder": "Wybierz co najmniej jeden folder",
|
||||
"selectAuthMethod": "Zaznacz metodę uwierzytelniania IMAP",
|
||||
"selectDate": "Zaznacz datę",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Brak wiadomości w tym wątku",
|
||||
"error": "Nie udało się załadować wątku",
|
||||
"invalidDate": "Nieprawidłowa data",
|
||||
"latest": "Najnowsze",
|
||||
"loadMore": "Załaduj więcej",
|
||||
"loadingMore": "Ładowanie...",
|
||||
"noSubject": "(brak tematu)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Conta Atualizada",
|
||||
"accountUpdatedDesc": "A conta foi atualizada com sucesso.",
|
||||
"actions": "Ações",
|
||||
"add": "Adicionar conta",
|
||||
"addAccount": "Adicionar Conta",
|
||||
"addConfiguration": "Adicionar Configuração",
|
||||
"addImap": "Adicionar Conta IMAP",
|
||||
"addNewEmailAccountHere": "Adicione uma nova conta de email aqui.",
|
||||
"addNoSync": "Adicionar Conta Sem Sincronização",
|
||||
"allMailFolderSelected": "Atenção: A pasta 'Todos os Emails' está selecionada",
|
||||
"allMailFolderSelectedDesc": "Selecionar uma pasta com o atributo 'Todos os Emails' pode duplicar mensagens já sincronizadas de pastas como Caixa de Entrada ou Itens Enviados. Isso pode consumir significativamente o seu armazenamento.",
|
||||
"allMailSkipped": "Pastas padrão selecionadas. 'Todos os Emails' foi ignorado para evitar duplicação.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "Host",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Conta IMAP",
|
||||
"imapAccountDescription": "Baixar e arquivar e-mails via IMAP.",
|
||||
"imapAuthMethod": "Método de Autenticação IMAP",
|
||||
"imapEncryption": "Criptografia IMAP",
|
||||
"imapHost": "Host IMAP",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Nome de login",
|
||||
"minutes": "minutos",
|
||||
"months": "Meses",
|
||||
"moreAccountTypes": "Mais Tipos de Conta",
|
||||
"mustBeAtLeast1": "Deve ser pelo menos 1",
|
||||
"name": "Nome",
|
||||
"nameDescription": "Usuário IMAP. Por padrão é seu e-mail, ou defina um personalizado.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Nenhuma Configuração de Conta",
|
||||
"noAccountConfigurationsDesc": "Você ainda não adicionou nenhuma configuração de conta. Adicione uma para utilizar a funcionalidade.",
|
||||
"noOAuth2Tokens": "Sem Tokens OAuth2",
|
||||
"noSyncAccount": "Conta local",
|
||||
"noSyncAccountDescription": "Conta local apenas para dados importados.",
|
||||
"none": "Nenhum",
|
||||
"notAvailable": "N/D",
|
||||
"oauth2Tokens": "Tokens OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Sessão ativa",
|
||||
"errors": "Erros",
|
||||
"folders": "Caixas de correio",
|
||||
"global_errors": "Erros globais",
|
||||
"history": "Histórico"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Salvar Alterações",
|
||||
"selectAccountType": "Selecionar tipo de conta",
|
||||
"selectAtLeastOneFolder": "Por favor, selecione pelo menos uma pasta",
|
||||
"selectAuthMethod": "Selecionar Método de Autenticação",
|
||||
"selectDate": "Selecionar Data",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Não há mensagens neste tópico",
|
||||
"error": "Falha ao carregar o tópico",
|
||||
"invalidDate": "Data Inválida",
|
||||
"latest": "Mais recente",
|
||||
"loadMore": "Carregar Mais",
|
||||
"loadingMore": "Carregando...",
|
||||
"noSubject": "(Sem Assunto)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Аккаунт обновлен",
|
||||
"accountUpdatedDesc": "Ваш аккаунт был успешно обновлен.",
|
||||
"actions": "Действия",
|
||||
"add": "Добавить аккаунт",
|
||||
"addAccount": "Добавить аккаунт",
|
||||
"addConfiguration": "Добавить конфигурацию",
|
||||
"addImap": "Добавить IMAP",
|
||||
"addNewEmailAccountHere": "Добавьте новый почтовый аккаунт здесь. ",
|
||||
"addNoSync": "Добавить NoSync",
|
||||
"allMailFolderSelected": "Внимание: Выбрана папка \"Вся почта\"",
|
||||
"allMailFolderSelectedDesc": "Выбор папок с атрибутом \"Вся почта\" скорее всего приведет к дублированию сообщений, уже синхронизированных из папок \"Входящие\" и \"Отправленные\". Это может занять значительно больше места.",
|
||||
"allMailSkipped": "Выбраны стандартные папки. Папка 'Вся почта' пропущена во избежание дубликатов.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "хост",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "Аккаунт IMAP",
|
||||
"imapAccountDescription": "Загрузка и архивация почты через IMAP.",
|
||||
"imapAuthMethod": "Метод авторизации IMAP",
|
||||
"imapEncryption": "Шифрование IMAP",
|
||||
"imapHost": "IMAP Хост",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Имя для входа",
|
||||
"minutes": "минут",
|
||||
"months": "Месяцы",
|
||||
"moreAccountTypes": "Другие типы аккаунтов",
|
||||
"mustBeAtLeast1": "Должно быть не менее 1",
|
||||
"name": "Имя",
|
||||
"nameDescription": "Имя пользователя IMAP. По умолчанию email или свой вариант.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Нет настроек учетных записей",
|
||||
"noAccountConfigurationsDesc": "Вы еще не добавили ни одной конфигурации учетной записи. Добавьте одну, чтобы начать использовать функции аккаунта.",
|
||||
"noOAuth2Tokens": "Нет токенов OAuth2",
|
||||
"noSyncAccount": "Локальный аккаунт",
|
||||
"noSyncAccountDescription": "Локальный аккаунт только для импортных данных.",
|
||||
"none": "Нет",
|
||||
"notAvailable": "н/д",
|
||||
"oauth2Tokens": "Токены OAuth2",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Активная сессия",
|
||||
"errors": "Ошибки",
|
||||
"folders": "Почтовые ящики",
|
||||
"global_errors": "Глобальные ошибки",
|
||||
"history": "История"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Сохранить изменения",
|
||||
"selectAccountType": "Выберите тип аккаунта",
|
||||
"selectAtLeastOneFolder": "Пожалуйста, выберите хотя бы одну папку",
|
||||
"selectAuthMethod": "Выберите метод авторизации",
|
||||
"selectDate": "Выберите дату",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Нет сообщений в этой цепочке",
|
||||
"error": "Не удалось загрузить цепочку",
|
||||
"invalidDate": "Неверная дата",
|
||||
"latest": "Последнее",
|
||||
"loadMore": "Загрузить ещё",
|
||||
"loadingMore": "Загрузка...",
|
||||
"noSubject": "(Без темы)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "Konto uppdaterat",
|
||||
"accountUpdatedDesc": "Ditt konto har uppdaterats.",
|
||||
"actions": "Åtgärder",
|
||||
"add": "Lägg till konto",
|
||||
"addAccount": "Lägg till konto",
|
||||
"addConfiguration": "Lägg till konfiguration",
|
||||
"addImap": "Lägg till IMAP",
|
||||
"addNewEmailAccountHere": "Lägg till nytt e-postkonto här. ",
|
||||
"addNoSync": "Lägg till NoSync",
|
||||
"allMailFolderSelected": "Observera: Mappen \"All e-post\" vald",
|
||||
"allMailFolderSelectedDesc": "Att välja mappar med attributet \"All e-post\" (All Mail) leder sannolikt till dubbletter av meddelanden som redan synkroniserats från mappar som Inkorg och Skickat. Detta kan ta upp betydligt mer lagringsutrymme.",
|
||||
"allMailSkipped": "Valde standardmappar. \"All e-post\" hoppades över för att undvika dubbletter.",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "värd",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP-konto",
|
||||
"imapAccountDescription": "Ladda ner och arkivera e-post via IMAP.",
|
||||
"imapAuthMethod": "IMAP-autentiseringsmetod",
|
||||
"imapEncryption": "IMAP-kryptering",
|
||||
"imapHost": "IMAP-värd",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "Inloggningsnamn",
|
||||
"minutes": "minuter",
|
||||
"months": "Månader",
|
||||
"moreAccountTypes": "Fler kontotyper",
|
||||
"mustBeAtLeast1": "Måste vara minst 1",
|
||||
"name": "Namn",
|
||||
"nameDescription": "IMAP-användarnamn. Förvalt är din e-post, eller ange ett valfritt.",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "Inga kontokonfigurationer",
|
||||
"noAccountConfigurationsDesc": "Du har inte lagt till några kontokonfigurationer ännu. Lägg till en för att börja använda kontofunktioner.",
|
||||
"noOAuth2Tokens": "Inga OAuth2-tokens",
|
||||
"noSyncAccount": "Lokalt konto",
|
||||
"noSyncAccountDescription": "Lokalt konto endast för importerad data.",
|
||||
"none": "Ingen",
|
||||
"notAvailable": "ej tillg.",
|
||||
"oauth2Tokens": "OAuth2-tokens",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "Aktiv session",
|
||||
"errors": "Fel",
|
||||
"folders": "Postlådor",
|
||||
"global_errors": "Globala fel",
|
||||
"history": "Historik"
|
||||
}
|
||||
},
|
||||
"saveChanges": "Spara ändringar",
|
||||
"selectAccountType": "Välj kontotyp",
|
||||
"selectAtLeastOneFolder": "Vänligen välj minst en mapp",
|
||||
"selectAuthMethod": "Välj en autentiseringsmetod",
|
||||
"selectDate": "Välj ett datum",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "Inga meddelanden i denna tråd",
|
||||
"error": "Kunde inte ladda tråd",
|
||||
"invalidDate": "Ogiltigt datum",
|
||||
"latest": "Senaste",
|
||||
"loadMore": "Ladda mer",
|
||||
"loadingMore": "Laddar...",
|
||||
"noSubject": "(Inget ämne)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "帳號已更新",
|
||||
"accountUpdatedDesc": "帳號已成功更新。",
|
||||
"actions": "操作",
|
||||
"add": "新增郵件帳戶",
|
||||
"addAccount": "新增帳號",
|
||||
"addConfiguration": "新增設定",
|
||||
"addImap": "新增 IMAP 帳號",
|
||||
"addNewEmailAccountHere": "在此新增電子郵件帳號。",
|
||||
"addNoSync": "新增非同步帳號",
|
||||
"allMailFolderSelected": "注意:「所有郵件」資料夾已選擇",
|
||||
"allMailFolderSelectedDesc": "選擇具有「所有郵件」屬性的資料夾可能會導致已從收件匣或寄件備份等資料夾同步的郵件重複。這可能會大幅增加您的儲存用量。",
|
||||
"allMailSkipped": "標準資料夾已選擇,為避免重複已跳過「所有郵件」。",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "主機",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP 郵件帳戶",
|
||||
"imapAccountDescription": "透過 IMAP 下載並歸檔郵件。",
|
||||
"imapAuthMethod": "IMAP 驗證方法",
|
||||
"imapEncryption": "IMAP 加密",
|
||||
"imapHost": "IMAP 主機",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "登入名稱",
|
||||
"minutes": "分鐘",
|
||||
"months": "月",
|
||||
"moreAccountTypes": "更多帳號類型",
|
||||
"mustBeAtLeast1": "必須大於或等於 1",
|
||||
"name": "名稱",
|
||||
"nameDescription": "IMAP 使用者名稱。預設為電子郵件,也可在此自訂。",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "沒有帳號設定",
|
||||
"noAccountConfigurationsDesc": "您尚未新增任何帳號設定。請新增設定以使用功能。",
|
||||
"noOAuth2Tokens": "無 OAuth2 權杖",
|
||||
"noSyncAccount": "本地帳戶",
|
||||
"noSyncAccountDescription": "僅用於匯入資料的本地帳戶。",
|
||||
"none": "無",
|
||||
"notAvailable": "不適用",
|
||||
"oauth2Tokens": "OAuth2 權杖",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "目前任務",
|
||||
"errors": "錯誤",
|
||||
"folders": "郵件夾",
|
||||
"global_errors": "全域錯誤",
|
||||
"history": "歷史記錄"
|
||||
}
|
||||
},
|
||||
"saveChanges": "儲存變更",
|
||||
"selectAccountType": "選擇郵件帳戶類型",
|
||||
"selectAtLeastOneFolder": "請至少選擇一個資料夾",
|
||||
"selectAuthMethod": "選擇驗證方法",
|
||||
"selectDate": "選擇日期",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "此串流中沒有訊息",
|
||||
"error": "載入串流失敗",
|
||||
"invalidDate": "無效日期",
|
||||
"latest": "最新",
|
||||
"loadMore": "載入更多",
|
||||
"loadingMore": "載入中...",
|
||||
"noSubject": "(無主旨)",
|
||||
|
||||
@@ -92,11 +92,9 @@
|
||||
"accountUpdated": "账户已更新",
|
||||
"accountUpdatedDesc": "您的账户已成功更新。",
|
||||
"actions": "操作",
|
||||
"add": "添加邮件账户",
|
||||
"addAccount": "添加账户",
|
||||
"addConfiguration": "添加配置",
|
||||
"addImap": "添加 IMAP",
|
||||
"addNewEmailAccountHere": "在此添加新邮件账户。",
|
||||
"addNoSync": "添加 NoSync",
|
||||
"allMailFolderSelected": "提示:已选择\"所有邮件\"文件夹",
|
||||
"allMailFolderSelectedDesc": "选择具有\"所有邮件\"属性的文件夹可能会导致重复已从收件箱和已发送等文件夹同步的消息。这可能会消耗更多的存储空间。",
|
||||
"allMailSkipped": "已选择标准文件夹。已跳过'所有邮件'以避免重复。",
|
||||
@@ -170,6 +168,8 @@
|
||||
"host": "主机",
|
||||
"id": "ID",
|
||||
"imap": "IMAP",
|
||||
"imapAccount": "IMAP 邮件账户",
|
||||
"imapAccountDescription": "通过 IMAP 下载并归档邮件。",
|
||||
"imapAuthMethod": "IMAP 认证方法",
|
||||
"imapEncryption": "IMAP 加密",
|
||||
"imapHost": "IMAP 主机",
|
||||
@@ -185,7 +185,6 @@
|
||||
"login_name": "登录名",
|
||||
"minutes": "分钟",
|
||||
"months": "月",
|
||||
"moreAccountTypes": "更多账户类型",
|
||||
"mustBeAtLeast1": "必须至少为 1",
|
||||
"name": "名称",
|
||||
"nameDescription": "IMAP 用户名。默认使用邮箱地址,也可在此自定义。",
|
||||
@@ -193,6 +192,8 @@
|
||||
"noAccountConfigurations": "无账户配置",
|
||||
"noAccountConfigurationsDesc": "您尚未添加任何账户配置。添加一个以开始使用账户功能。",
|
||||
"noOAuth2Tokens": "无 OAuth2 令牌",
|
||||
"noSyncAccount": "本地账户",
|
||||
"noSyncAccountDescription": "仅用于导入数据的本地账户。",
|
||||
"none": "无",
|
||||
"notAvailable": "暂无",
|
||||
"oauth2Tokens": "OAuth2 令牌",
|
||||
@@ -235,11 +236,11 @@
|
||||
"active_session": "当前任务",
|
||||
"errors": "错误",
|
||||
"folders": "邮件夹",
|
||||
"global_errors": "全局错误",
|
||||
"history": "历史记录"
|
||||
}
|
||||
},
|
||||
"saveChanges": "保存更改",
|
||||
"selectAccountType": "选择邮件账户类型",
|
||||
"selectAtLeastOneFolder": "请至少选择一个文件夹",
|
||||
"selectAuthMethod": "选择认证方法",
|
||||
"selectDate": "选择日期",
|
||||
@@ -1033,6 +1034,7 @@
|
||||
"empty": "此会话没有邮件",
|
||||
"error": "加载会话失败",
|
||||
"invalidDate": "无效日期",
|
||||
"latest": "最新",
|
||||
"loadMore": "加载更多",
|
||||
"loadingMore": "加载中...",
|
||||
"noSubject": "(无主题)",
|
||||
|
||||
Reference in New Issue
Block a user