Compare commits

...
Author SHA1 Message Date
Bernd RodlerandClaude Sonnet 5 1189b146ef fix(i18n): add missing translation keys for signatures and email import
Fixes 25 failing tests across translations and eml-import test suites:

- Add 141 missing i18n keys to en/common.json for P2.1 (extended signatures
  feature) and P2.5 (email import feature). Keys cover:
  - signatures.* (signature editor, toolbar labels, per-identity settings)
  - settings.importer.* (mail import UI labels and messages)
  - settings.tabs.signatures, settings.{loading,refresh}
  - email_composer.{insert_signature,no_signature,select_signature}
  - identities.form.{signature_store_*,use_global_default}
  - calendar.{edit,delete,duplicate}, contacts.{edit,delete,send_email}
  - contacts.import.csv_* (CSV column mapping labels)
  - Other related keys for sharing, mailbox context menu, file operations

- Propagate new keys to all 23 other locale files:
  - ar, ca, cs, da, de, es, fa, fr, he, hu, it, ja, ko, lv, nl, pl, pt, ro,
    ru, sk, tr, uk, zh
  - 19 locales with real, idiomatic translations matching existing tone
  - 4 locales (da, es, fa, zh) with English placeholders pending native
    translation

- Fix eml-import test: update accept-string expectation to match actual
  EML_IMPORT_ACCEPT constant (now includes .tgz, .tar.gz, application/gzip
  support added in P2.5)

All 53 tests now pass:
  - 48 translation completeness tests
  - 5 eml-import tests

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 15:15:17 +02:00
Bernd RodlerandClaude Sonnet 5 a0bffa9467 fix(compose): resolve TDZ crash in resolveStoreSignatureId
Introduced by the P2.1 signature work already on dev: the useState lazy
initializer read selectedIdentityId (declared by a LATER useState in the
same component) via closure, throwing "Cannot access before
initialization" on first render - not just a test failure, this crashed
every compose/reply in a real browser. On that first render
selectedIdentityId can only be unset anyway (nothing has called
setSelectedIdentityId yet), so reading initialData directly - the same
approach the adjacent initialCurrentIdentityForSig already uses for
exactly this reason - is equivalent, not a workaround.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 14:07:16 +02:00
Bernd Rodler 80107d3b32 Merge remote-tracking branch 'origin/dev' into sync-github-and-ci-fix 2026-08-07 14:03:10 +02:00
Bernd RodlerandClaude Sonnet 5 f121678e2a feat(ai): Paperclip-style env-var provider presets + zero-config local default
Two product decisions from tonight:

1. Public AI providers can now be published by an admin as named presets
   (lib/ai/types.ts's PublicAiPreset: name/baseUrl/model/apiKeyEnvVar).
   The admin names an env var, never a secret value - the actual key is
   whatever ops has set in the server's real environment, same custody
   model as the existing AI_SERVER_BASE_URL var. A new server route
   (app/api/ai/public/chat) resolves it and makes the call itself, which
   also sidesteps the CORS/wrong-base-URL failure class chatPublic hit
   earlier tonight. Users pick a preset from a dropdown in Settings -
   Answer with - no key field at all; personal BYOK (paste your own key)
   stays available as a secondary "Add your own key" option, not removed.
   Admin UI: new "Public - org-managed presets" card in the AI policy tab.

2. AI now defaults ON instead of requiring setup (lib/ai/auto-provision.ts):
   on first load, if no provider is chosen yet, probe OpenCode (this app
   auto-spawns `opencode serve` itself, so it's the one local option with
   zero external install step) then Ollama via the existing auto-discovery,
   and adopt whichever answers. Never overrides an explicit choice - only
   fires while provider is still null. Wired into both AI entry points
   (the Ask button and the Settings pane) so it resolves before either
   renders its "not configured" state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 14:01:00 +02:00
Bernd Rodler fb3f1a35b3 Merge branch 'feat/phase2-signatures-sharing' into dev
# Conflicts:
#	runs/2026-08-07-v1.7.8-baseline/DEVELOPMENT-PLAN.md
2026-08-07 13:50:40 +02:00
Bernd RodlerandClaude Sonnet 5 1aa0a4686b fix(ai): turn a bare 'Failed to fetch' into an actionable BYOK error
chatPublic() calls the provider's /chat/completions directly from the
renderer. Verified live: a saved profile pointing at
platform.deepseek.com (DeepSeek's console) instead of api.deepseek.com
(their actual API) fails the CORS preflight outright - 403, no
Access-Control-* headers - which surfaces to fetch() as an
undifferentiated "Failed to fetch" with no status to inspect. Confirmed
the real API and OpenRouter both support being called directly from a
browser fine, so the architecture is sound; only the error message was
useless. Now names the URL and the likely cause instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 13:10:00 +02:00
Bernd Rodler 395fcc27a8 Merge remote-tracking branch 'origin/dev' into sync-github-and-ci-fix 2026-08-07 12:50:45 +02:00
Bernd RodlerandClaude Sonnet 5 fbfaf528ab fix(build): copy next/dist/lib/metadata into standalone output
output: "standalone" + next build --webpack drops the whole metadata
directory despite a plain top-level require in router-utils/filesystem.js
("../../../lib/metadata/get-metadata-route") - every packaged build
(Electron dmg and the Docker image) crashed on its very first line with
Cannot find module. Verified: a fresh dist:mac build failed to boot at
all; copying the directory by hand (same pattern already used for the
sqlcipher prebuilds and plugin bundles) fixes it, confirmed by booting
.next/standalone directly and getting a real HTTP response.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 12:50:33 +02:00
Bernd Rodler 7e3034da8d test: update recurrence expansion test + fix TS/Lint errors 2026-08-07 12:37:16 +02:00
Bernd Rodler a622e3755b fix: Phase 1 critical+high fixes (17/18 items)
CRITICAL fixes:
- C1: Error swallowing - throw TransportError on network failure in getEmails/searchEmails
- C2: Recurrence expansion ID delimiter changed from ':' to '::occurrence::'
- C3: Cross-account calendar event UID dedup after multi-account aggregation
- C4: Admin session token revocation via JTI blacklist on logout
- C6: FTS5 schema-drop - add warning log for automatic reindex trigger
- C7: Settings lock - gate updateSetting() with isSettingLocked() check
- C8: Offline push pause - add offline event handler that closes push transports

HIGH fixes:
- H1: Push handler - add ContactCard and FileNode branches
- H2: WS fallback - await state snapshot before reconcileAfterWebSocketFallback
- H3: Auth rate limiting - add checkUserAuthRateLimit to session and token routes
- H4: OAuth logs - strip access_token from error log context
- H7: Template XSS - apply DOMPurify to HTML template body on import
- H8: Secure cookie - derive from x-forwarded-proto, not NODE_ENV
- H9: bcrypt fix - remove bcrypt prefixes from isHashed() so scrypt-only
- H13: calendarTasksEnabled - apply admin gate at runtime in calendar page
- H14: Task mutations - add try/catch error handling to update/delete/toggle
- H18: autoSelectReplyIdentity default changed from false to true

Deferred: P1.3 (C5 auth localStorage encryption) - requires custom Zustand persist adapter.
2026-08-07 12:17:41 +02:00
42 changed files with 4807 additions and 278 deletions
+7
View File
@@ -49,6 +49,13 @@ RUN apk upgrade --no-cache && \
COPY --from=builder /app/public ./public COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# next/dist/lib/metadata/** (get-metadata-route.js and its neighbours). A
# plain top-level require in router-utils/filesystem.js, yet Next's own
# output file tracing for `output: "standalone"` + `next build --webpack`
# drops the whole directory - the server crashes on its first line with
# "Cannot find module '../../../lib/metadata/get-metadata-route'" without
# this. Same tracing-gap class as the plugins copy below.
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/next/dist/lib/metadata ./node_modules/next/dist/lib/metadata
# Staged first-party plugin bundles. Read by path at runtime, so Next's output # Staged first-party plugin bundles. Read by path at runtime, so Next's output
# file tracing does not carry them into .next/standalone - copy explicitly or # file tracing does not carry them into .next/standalone - copy explicitly or
# the image boots with the S/MIME policy toggle on and no plugin installed. # the image boots with the S/MIME policy toggle on and no plugin installed.
+92 -2
View File
@@ -1,8 +1,8 @@
'use client'; 'use client';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Save, Loader2, X, ArrowRight } from 'lucide-react'; import { Save, Loader2, X, ArrowRight, Plus, Trash2 } from 'lucide-react';
import type { AiConsoleConfig, AiClass } from '@/lib/ai/types'; import type { AiConsoleConfig, AiClass, PublicAiPreset } from '@/lib/ai/types';
import { DEFAULT_AI_CONSOLE_CONFIG } from '@/lib/ai/types'; import { DEFAULT_AI_CONSOLE_CONFIG } from '@/lib/ai/types';
import type { AiEntitlementState, MeteringEntry } from '@/lib/ai/entitlement'; import type { AiEntitlementState, MeteringEntry } from '@/lib/ai/entitlement';
import { apiFetch } from '@/lib/browser-navigation'; import { apiFetch } from '@/lib/browser-navigation';
@@ -73,6 +73,85 @@ function AllowlistEditor({
); );
} }
function newPresetId(): string {
return `preset-${Math.random().toString(36).slice(2, 10)}`;
}
/**
* The Paperclip-style env-var-key picker (decision 2026-08-07): an admin
* names a preset and an env var; the actual secret value is never entered
* here — it's whatever ops has set in the server's real environment. This is
* what lets a user in Settings pick a provider from a dropdown instead of
* pasting a key.
*/
function PublicPresetsEditor({
presets, onChange,
}: { presets: PublicAiPreset[]; onChange: (next: PublicAiPreset[]) => void }) {
const [name, setName] = useState('');
const [baseUrl, setBaseUrl] = useState('https://api.deepseek.com');
const [model, setModel] = useState('');
const [envVar, setEnvVar] = useState('');
const canAdd = name.trim() && baseUrl.trim() && model.trim() && envVar.trim();
function addPreset() {
if (!canAdd) return;
onChange([...presets, { id: newPresetId(), name: name.trim(), baseUrl: baseUrl.trim(), model: model.trim(), apiKeyEnvVar: envVar.trim() }]);
setName('');
setBaseUrl('https://api.deepseek.com');
setModel('');
setEnvVar('');
}
return (
<>
{presets.length > 0 && (
<div className="divide-y divide-border">
{presets.map((p) => (
<div key={p.id} className="px-4 py-2.5 flex items-center justify-between gap-3">
<div className="min-w-0">
<span className="text-sm font-medium">{p.name}</span>
<p className="text-xs text-muted-foreground truncate">
{p.model} · {p.baseUrl} · reads <code className="text-[11px]">{p.apiKeyEnvVar}</code>
</p>
</div>
<button
onClick={() => onChange(presets.filter((x) => x.id !== p.id))}
className="shrink-0 text-muted-foreground hover:text-destructive"
aria-label={`Remove ${p.name}`}
>
<Trash2 className="w-3.5 h-3.5" />
</button>
</div>
))}
</div>
)}
<div className="px-4 py-3 flex flex-col gap-2 border-t border-border">
<div className="flex gap-2 flex-wrap">
<input value={name} onChange={(e) => setName(e.target.value)} placeholder="Name, e.g. DeepSeek (org)"
className="flex-1 min-w-[160px] h-8 rounded border border-input bg-background px-2.5 text-xs" />
<input value={model} onChange={(e) => setModel(e.target.value)} placeholder="Model, e.g. deepseek-chat"
className="flex-1 min-w-[160px] h-8 rounded border border-input bg-background px-2.5 text-xs" />
</div>
<div className="flex gap-2 flex-wrap">
<input value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)} placeholder="API base URL"
className="flex-1 min-w-[200px] h-8 rounded border border-input bg-background px-2.5 text-xs" />
<input value={envVar} onChange={(e) => setEnvVar(e.target.value)} placeholder="Env var, e.g. DEEPSEEK_API_KEY"
className="flex-1 min-w-[200px] h-8 rounded border border-input bg-background px-2.5 text-xs" />
<button onClick={addPreset} disabled={!canAdd}
className="h-8 px-3 rounded border border-border bg-muted text-xs font-medium hover:bg-muted/70 disabled:opacity-50 inline-flex items-center gap-1.5">
<Plus className="w-3 h-3" /> Add
</button>
</div>
<p className="text-xs text-muted-foreground">
Only the env var <em>name</em> is stored here provision the actual key as a real environment variable on
the server (k8s secret, .env, Electron packaging). This app never sees or stores the value.
</p>
</div>
</>
);
}
export function AiPolicyTab() { export function AiPolicyTab() {
const setActiveTab = useAdminTabStore((s) => s.setActiveTab); const setActiveTab = useAdminTabStore((s) => s.setActiveTab);
const [config, setConfig] = useState<AiConsoleConfig>({ ...DEFAULT_AI_CONSOLE_CONFIG }); const [config, setConfig] = useState<AiConsoleConfig>({ ...DEFAULT_AI_CONSOLE_CONFIG });
@@ -247,6 +326,17 @@ export function AiPolicyTab() {
/> />
</div> </div>
<div className="border border-border rounded-lg">
<div className="px-4 py-3 border-b border-border bg-muted/30">
<h2 className="text-sm font-medium text-foreground">Public org-managed presets</h2>
<p className="text-xs text-muted-foreground mt-0.5">
Paperclip-style: publish a provider by name instead of making every user paste their own key. Users pick
one of these in Settings with no key field at all the server resolves the named env var at request time.
</p>
</div>
<PublicPresetsEditor presets={config.publicPresets} onChange={(v) => update({ publicPresets: v })} />
</div>
<div className="border border-border rounded-lg"> <div className="border border-border rounded-lg">
<div className="px-4 py-3 border-b border-border bg-muted/30"> <div className="px-4 py-3 border-b border-border bg-muted/30">
<h2 className="text-sm font-medium text-foreground">Entitlement &amp; seats</h2> <h2 className="text-sm font-medium text-foreground">Entitlement &amp; seats</h2>
+19
View File
@@ -48,6 +48,24 @@ function validate(body: Partial<AiConsoleConfig>): string | null {
return 'publicProviderAllowlist must be an array of strings or null'; return 'publicProviderAllowlist must be an array of strings or null';
} }
} }
if (body.publicPresets !== undefined) {
if (!Array.isArray(body.publicPresets)) return 'publicPresets must be an array';
const ids = new Set<string>();
for (const preset of body.publicPresets) {
if (
typeof preset !== 'object' || preset === null ||
typeof preset.id !== 'string' || !preset.id ||
typeof preset.name !== 'string' || !preset.name ||
typeof preset.baseUrl !== 'string' || !preset.baseUrl ||
typeof preset.model !== 'string' || !preset.model ||
typeof preset.apiKeyEnvVar !== 'string' || !preset.apiKeyEnvVar
) {
return 'each publicPresets entry needs non-empty id, name, baseUrl, model, apiKeyEnvVar';
}
if (ids.has(preset.id)) return `duplicate publicPresets id "${preset.id}"`;
ids.add(preset.id);
}
}
if (body.retrievalEnabled !== undefined && typeof body.retrievalEnabled !== 'boolean') { if (body.retrievalEnabled !== undefined && typeof body.retrievalEnabled !== 'boolean') {
return 'retrievalEnabled must be a boolean'; return 'retrievalEnabled must be a boolean';
} }
@@ -83,6 +101,7 @@ export async function PUT(request: NextRequest) {
consentVersion: next.consent?.version ?? null, consentVersion: next.consent?.version ?? null,
serverModelAllowlistCount: next.serverModelAllowlist?.length ?? null, serverModelAllowlistCount: next.serverModelAllowlist?.length ?? null,
publicProviderAllowlistCount: next.publicProviderAllowlist?.length ?? null, publicProviderAllowlistCount: next.publicProviderAllowlist?.length ?? null,
publicPresetsCount: next.publicPresets.length,
}, ip); }, ip);
return NextResponse.json(next); return NextResponse.json(next);
} catch (error) { } catch (error) {
+5
View File
@@ -43,6 +43,11 @@ export async function GET() {
retrievalEnabled: consoleConfig.retrievalEnabled, retrievalEnabled: consoleConfig.retrievalEnabled,
consent: consoleConfig.consent, consent: consoleConfig.consent,
publicProviderAllowlist: consoleConfig.publicProviderAllowlist, publicProviderAllowlist: consoleConfig.publicProviderAllowlist,
// Sanitized: {id,name,model} only. baseUrl/apiKeyEnvVar stay server-side —
// the client only ever refers to a preset by id (app/api/ai/public/chat
// resolves the rest), so there's no reason to hand a browser tab even
// an internal env var *name*, let alone a provider base URL.
publicPresets: consoleConfig.publicPresets.map((p) => ({ id: p.id, name: p.name, model: p.model })),
}; };
return NextResponse.json(aiPolicy, { return NextResponse.json(aiPolicy, {
+97
View File
@@ -0,0 +1,97 @@
import { NextRequest, NextResponse } from 'next/server';
import { getStalwartCredentials } from '@/lib/stalwart/credentials';
import { configManager } from '@/lib/admin/config-manager';
import { logger } from '@/lib/logger';
export const runtime = 'nodejs';
const MAX_BODY_BYTES = 200 * 1024;
interface ChatMessage {
role: 'system' | 'user' | 'assistant';
content: string;
}
interface OpenAiChatResponse {
choices?: Array<{ message?: { content?: string } }>;
}
/**
* POST /api/ai/public/chat — the Paperclip-style, admin-managed alternative
* to the personal-key `chatPublic` path (lib/ai/local-client.ts): the client
* sends a `presetId`, never a key. The preset (name/baseUrl/model/
* apiKeyEnvVar) lives in admin config (lib/ai/types.ts's PublicAiPreset);
* the actual secret value is read from THIS PROCESS's real environment at
* request time and never leaves this route — same custody model as
* AI_SERVER_BASE_URL, just admin-nameable per preset instead of one fixed var.
*
* Deliberately NOT entitlement-metered, same reasoning as `local`/`opencode`
* (lib/ai/entitlement.ts's header): this is still the `public` class, just
* with the org supplying the key instead of the user — no centrally-borne
* inference cost this app is billing for.
*/
export async function POST(request: NextRequest) {
const auth = await getStalwartCredentials(request);
if (!auth) {
return NextResponse.json({ error: 'not authenticated' }, { status: 401 });
}
await configManager.ensureLoaded();
const consoleConfig = configManager.getAiConsoleConfig();
if (consoleConfig.classesEnabled.public === false) {
return NextResponse.json({ error: 'the Public AI class is disabled by admin policy' }, { status: 403 });
}
const rawBody = await request.text();
if (rawBody.length > MAX_BODY_BYTES) {
return NextResponse.json({ error: 'request too large' }, { status: 413 });
}
let body: { presetId?: unknown; messages?: unknown };
try {
body = JSON.parse(rawBody);
} catch {
return NextResponse.json({ error: 'invalid JSON body' }, { status: 400 });
}
const presetId = typeof body.presetId === 'string' ? body.presetId : '';
const messages = Array.isArray(body.messages) ? (body.messages as ChatMessage[]) : null;
if (!presetId || !messages || messages.length === 0) {
return NextResponse.json({ error: 'presetId and messages are required' }, { status: 400 });
}
const preset = consoleConfig.publicPresets.find((p) => p.id === presetId);
if (!preset) {
return NextResponse.json({ error: `No such preset "${presetId}" — it may have been removed by an admin.` }, { status: 404 });
}
const apiKey = process.env[preset.apiKeyEnvVar];
if (!apiKey) {
return NextResponse.json(
{ error: `Env var "${preset.apiKeyEnvVar}" is not set on the server for preset "${preset.name}" — ask an admin to provision it.` },
{ status: 503 },
);
}
try {
const res = await fetch(`${preset.baseUrl.replace(/\/+$/, '')}/chat/completions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` },
body: JSON.stringify({ model: preset.model, messages }),
});
if (!res.ok) {
return NextResponse.json({ error: `Provider returned ${res.status}` }, { status: 502 });
}
const data = (await res.json()) as OpenAiChatResponse;
const content = data.choices?.[0]?.message?.content;
if (!content) {
return NextResponse.json({ error: 'Provider returned no message content' }, { status: 502 });
}
return NextResponse.json({ answer: content });
} catch (cause) {
logger.error('public ai preset chat failed', {
presetId, error: cause instanceof Error ? cause.message : String(cause),
});
return NextResponse.json({ error: `Could not reach ${preset.baseUrl}` }, { status: 502 });
}
}
+20 -2
View File
@@ -22,8 +22,9 @@ import { useAccountStore } from '@/stores/account-store';
import { DEFAULT_AI_POLICY, type AiPolicy } from '@/lib/ai/types'; import { DEFAULT_AI_POLICY, type AiPolicy } from '@/lib/ai/types';
import { supportsLocalLlm } from '@/lib/platform-capabilities'; import { supportsLocalLlm } from '@/lib/platform-capabilities';
import { getAiApiKey } from '@/lib/ai/key-store'; import { getAiApiKey } from '@/lib/ai/key-store';
import { loadAiSettings, type AiLocalSettings } from '@/lib/ai/local-settings'; import { loadAiSettings, isPresetActiveId, presetIdFromActiveId, type AiLocalSettings } from '@/lib/ai/local-settings';
import { askMail, type AskResult } from '@/lib/ai/local-client'; import { askMail, type AskResult } from '@/lib/ai/local-client';
import { ensureDefaultProvider } from '@/lib/ai/auto-provision';
function useAiPolicy(): { policy: AiPolicy; loaded: boolean } { function useAiPolicy(): { policy: AiPolicy; loaded: boolean } {
const [policy, setPolicy] = useState<AiPolicy>(DEFAULT_AI_POLICY); const [policy, setPolicy] = useState<AiPolicy>(DEFAULT_AI_POLICY);
@@ -58,6 +59,9 @@ function providerConfigured(settings: AiLocalSettings, policy: AiPolicy): boolea
case 'opencode': case 'opencode':
return classes.includes('opencode') && !!settings.opencodeModel; return classes.includes('opencode') && !!settings.opencodeModel;
case 'public': { case 'public': {
if (isPresetActiveId(settings.activeProfileId)) {
return classes.includes('public') && !!presetIdFromActiveId(settings.activeProfileId) && settings.publicConsentAccepted;
}
const active = settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null; const active = settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null;
return classes.includes('public') && !!active && settings.publicConsentAccepted; return classes.includes('public') && !!active && settings.publicConsentAccepted;
} }
@@ -90,6 +94,18 @@ export function AiAskButton() {
setOpen(true); setOpen(true);
}, []); }, []);
// Zero-config default (see lib/ai/auto-provision.ts): resolves as soon as
// policy loads, so a user who never visits Settings still finds AI
// already on the first time they open this dialog, if OpenCode or Ollama
// is available.
useEffect(() => {
if (!loaded) return;
(async () => {
const next = await ensureDefaultProvider(policy);
setSettings(next);
})();
}, [loaded, policy]);
useEffect(() => { useEffect(() => {
if (!open) return; if (!open) return;
textareaRef.current?.focus(); textareaRef.current?.focus();
@@ -109,7 +125,8 @@ export function AiAskButton() {
setAskError(null); setAskError(null);
setAskResult(null); setAskResult(null);
try { try {
const activeProfile = settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null; const managedPresetId = presetIdFromActiveId(settings.activeProfileId);
const activeProfile = managedPresetId ? null : settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null;
const key = activeProfile ? getAiApiKey(activeProfile.id) : null; const key = activeProfile ? getAiApiKey(activeProfile.id) : null;
const result = await askMail(question.trim(), { const result = await askMail(question.trim(), {
provider: settings.provider as 'local' | 'server' | 'public' | 'opencode', provider: settings.provider as 'local' | 'server' | 'public' | 'opencode',
@@ -119,6 +136,7 @@ export function AiAskButton() {
opencodeModel: settings.opencodeModel, opencodeModel: settings.opencodeModel,
slot: activeSlot, slot: activeSlot,
publicProfile: activeProfile && key ? { baseUrl: activeProfile.baseUrl, model: activeProfile.model, apiKey: key } : null, publicProfile: activeProfile && key ? { baseUrl: activeProfile.baseUrl, model: activeProfile.model, apiKey: key } : null,
publicPresetId: managedPresetId,
}); });
setAskResult(result); setAskResult(result);
} catch (err) { } catch (err) {
+7 -1
View File
@@ -308,8 +308,14 @@ export function EmailComposer({
getIdentityReplySignatureId, getIdentityReplySignatureId,
} = useSignatureStore(); } = useSignatureStore();
// Lazy useState initializer (below) — runs during the FIRST render, before
// the selectedIdentityId state declared further down exists yet (same TDZ
// constraint the initialCurrentIdentityForSig comment a few lines down
// already documents). On that first render selectedIdentityId can only be
// unset anyway (nothing has called setSelectedIdentityId yet), so reading
// initialData directly is equivalent, not a workaround.
const resolveStoreSignatureId = (): string | null => { const resolveStoreSignatureId = (): string | null => {
const perIdentityId = selectedIdentityId || initialData?.selectedIdentityId || null; const perIdentityId = initialData?.selectedIdentityId || null;
if (mode === 'compose') { if (mode === 'compose') {
if (perIdentityId) { if (perIdentityId) {
const id = getIdentityDefaultSignatureId(perIdentityId); const id = getIdentityDefaultSignatureId(perIdentityId);
+52 -9
View File
@@ -9,7 +9,11 @@ import { useAccountStore } from '@/stores/account-store';
import { DEFAULT_AI_POLICY, type AiPolicy } from '@/lib/ai/types'; import { DEFAULT_AI_POLICY, type AiPolicy } from '@/lib/ai/types';
import { supportsLocalLlm, localLlmNeedsCorsSetup } from '@/lib/platform-capabilities'; import { supportsLocalLlm, localLlmNeedsCorsSetup } from '@/lib/platform-capabilities';
import { getAiApiKey, setAiApiKey, clearAiApiKey } from '@/lib/ai/key-store'; import { getAiApiKey, setAiApiKey, clearAiApiKey } from '@/lib/ai/key-store';
import { loadAiSettings, saveAiSettings, createProfile, type AiLocalSettings } from '@/lib/ai/local-settings'; import {
loadAiSettings, saveAiSettings, createProfile, presetActiveId, presetIdFromActiveId,
type AiLocalSettings,
} from '@/lib/ai/local-settings';
import { ensureDefaultProvider } from '@/lib/ai/auto-provision';
import { import {
discoverLocalOllama, discoverLocalOllama,
recommendDefaultModel, recommendDefaultModel,
@@ -56,7 +60,23 @@ export function AiAssistantSettings() {
(async () => { (async () => {
try { try {
const res = await apiFetch('/api/ai/policy'); const res = await apiFetch('/api/ai/policy');
if (res.ok && !cancelled) setPolicy(await res.json()); if (res.ok && !cancelled) {
const loadedPolicy = (await res.json()) as AiPolicy;
setPolicy(loadedPolicy);
// Zero-config default (lib/ai/auto-provision.ts) — a no-op once a
// provider is already chosen, so this is safe to run on every
// visit to this pane, not just first-run.
const next = await ensureDefaultProvider(loadedPolicy);
// Separately, once an admin has published at least one org-managed
// preset, make IT the default "Answer with" pick too — pasting a
// personal key should be the fallback a user reaches for, not the
// thing they have to do to get any answer at all.
if (!next.activeProfileId && loadedPolicy.publicPresets[0]) {
next.activeProfileId = presetActiveId(loadedPolicy.publicPresets[0].id);
saveAiSettings(next);
}
if (!cancelled) setSettings(next);
}
} finally { } finally {
if (!cancelled) setPolicyLoading(false); if (!cancelled) setPolicyLoading(false);
} }
@@ -289,7 +309,9 @@ export function AiAssistantSettings() {
const [askResult, setAskResult] = useState<AskResult | null>(null); const [askResult, setAskResult] = useState<AskResult | null>(null);
const [askError, setAskError] = useState<string | null>(null); const [askError, setAskError] = useState<string | null>(null);
const activeProfile = settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null; const activePresetId = presetIdFromActiveId(settings.activeProfileId);
const activeProfile = activePresetId ? null : settings.publicProfiles.find((p) => p.id === settings.activeProfileId) ?? null;
const activePublicSelection = !!activeProfile || (!!activePresetId && policy.publicPresets.some((p) => p.id === activePresetId));
const canAsk = const canAsk =
question.trim().length > 0 && question.trim().length > 0 &&
@@ -300,7 +322,7 @@ export function AiAssistantSettings() {
: settings.provider === 'opencode' : settings.provider === 'opencode'
? canUseOpencode && !!settings.opencodeModel ? canUseOpencode && !!settings.opencodeModel
: settings.provider === 'public' : settings.provider === 'public'
? canUsePublic && !!activeProfile && settings.publicConsentAccepted ? canUsePublic && activePublicSelection && settings.publicConsentAccepted
: false); : false);
const runAsk = useCallback(async () => { const runAsk = useCallback(async () => {
@@ -318,6 +340,7 @@ export function AiAssistantSettings() {
opencodeModel: settings.opencodeModel, opencodeModel: settings.opencodeModel,
slot: activeSlot, slot: activeSlot,
publicProfile: activeProfile && key ? { baseUrl: activeProfile.baseUrl, model: activeProfile.model, apiKey: key } : null, publicProfile: activeProfile && key ? { baseUrl: activeProfile.baseUrl, model: activeProfile.model, apiKey: key } : null,
publicPresetId: activePresetId,
}); });
setAskResult(result); setAskResult(result);
if (result.seatJustAssigned) { if (result.seatJustAssigned) {
@@ -328,7 +351,7 @@ export function AiAssistantSettings() {
} finally { } finally {
setAsking(false); setAsking(false);
} }
}, [question, settings, activeProfile, activeSlot]); }, [question, settings, activeProfile, activePresetId, activeSlot]);
const providerOptions = useMemo( const providerOptions = useMemo(
() => [ () => [
@@ -622,8 +645,25 @@ export function AiAssistantSettings() {
title="Public providers" title="Public providers"
description="Save several — different models for different questions. Any OpenAI-compatible endpoint works. Keys are stored only in this browser and, for now, use of this class is not monitored or metered by VNC." description="Save several — different models for different questions. Any OpenAI-compatible endpoint works. Keys are stored only in this browser and, for now, use of this class is not monitored or metered by VNC."
> >
{policy.publicPresets.length > 0 && (
<SettingItem
label="Org-managed providers"
description="Set up by your admin. Pick one below in “Answer with” — no key to paste, it's resolved on the server."
>
<div className="flex flex-col gap-2 w-full">
{policy.publicPresets.map((p) => (
<div key={p.id} className="flex items-center gap-2 rounded-md border border-border px-3 py-2">
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-foreground truncate">{p.name}</p>
<p className="text-xs text-muted-foreground truncate">{p.model} · managed by admin</p>
</div>
</div>
))}
</div>
</SettingItem>
)}
{settings.publicProfiles.length > 0 && ( {settings.publicProfiles.length > 0 && (
<SettingItem label="Saved profiles"> <SettingItem label="Your own keys">
<div className="flex flex-col gap-2 w-full"> <div className="flex flex-col gap-2 w-full">
{settings.publicProfiles.map((p) => ( {settings.publicProfiles.map((p) => (
<div key={p.id} className="flex items-center gap-2 rounded-md border border-border px-3 py-2"> <div key={p.id} className="flex items-center gap-2 rounded-md border border-border px-3 py-2">
@@ -639,7 +679,7 @@ export function AiAssistantSettings() {
</div> </div>
</SettingItem> </SettingItem>
)} )}
<SettingItem label="Add a provider"> <SettingItem label="Add your own key" description="Prefer to bring your own instead of an org-managed provider above.">
<div className="flex flex-col gap-2 w-full"> <div className="flex flex-col gap-2 w-full">
<div className="flex gap-2 flex-wrap"> <div className="flex gap-2 flex-wrap">
<input <input
@@ -704,12 +744,15 @@ export function AiAssistantSettings() {
{settings.provider && ( {settings.provider && (
<SettingsSection title="Try it" description="Ask a question against your synced mail."> <SettingsSection title="Try it" description="Ask a question against your synced mail.">
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
{settings.provider === 'public' && settings.publicProfiles.length > 0 && ( {settings.provider === 'public' && (settings.publicProfiles.length > 0 || policy.publicPresets.length > 0) && (
<SettingItem label="Answer with"> <SettingItem label="Answer with">
<Select <Select
value={settings.activeProfileId ?? ''} value={settings.activeProfileId ?? ''}
onChange={(v) => update('activeProfileId', v)} onChange={(v) => update('activeProfileId', v)}
options={settings.publicProfiles.map((p) => ({ value: p.id, label: p.name }))} options={[
...policy.publicPresets.map((p) => ({ value: presetActiveId(p.id), label: `${p.name} (org)` })),
...settings.publicProfiles.map((p) => ({ value: p.id, label: p.name })),
]}
/> />
</SettingItem> </SettingItem>
)} )}
+1 -1
View File
@@ -46,6 +46,6 @@ describe('expandImportableEmails', () => {
}); });
it('exposes the accept string for the file picker', () => { it('exposes the accept string for the file picker', () => {
expect(EML_IMPORT_ACCEPT).toBe('.eml,.zip,message/rfc822,application/zip'); expect(EML_IMPORT_ACCEPT).toBe('.eml,.zip,.tgz,.tar.gz,message/rfc822,application/zip,application/gzip');
}); });
}); });
+87
View File
@@ -0,0 +1,87 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { DEFAULT_AI_ENTITLEMENT, DEFAULT_AI_POLICY, type AiPolicy } from '../types';
import { loadAiSettings } from '../local-settings';
const { listOpencodeModels } = vi.hoisted(() => ({ listOpencodeModels: vi.fn() }));
vi.mock('../local-client', () => ({ listOpencodeModels }));
const { discoverLocalOllama, recommendDefaultModel } = vi.hoisted(() => ({
discoverLocalOllama: vi.fn(),
recommendDefaultModel: vi.fn(),
}));
vi.mock('../local-discovery', () => ({ discoverLocalOllama, recommendDefaultModel }));
const { supportsLocalLlm } = vi.hoisted(() => ({ supportsLocalLlm: vi.fn(() => true) }));
vi.mock('../../platform-capabilities', () => ({ supportsLocalLlm }));
// Imported after the mocks so it picks up the mocked modules.
const { ensureDefaultProvider, _resetAutoProvisionForTests } = await import('../auto-provision');
function policyWith(classes: AiPolicy['entitlement']['classes']): AiPolicy {
return { ...DEFAULT_AI_POLICY, entitlement: { ...DEFAULT_AI_ENTITLEMENT, classes } };
}
describe('ensureDefaultProvider', () => {
beforeEach(() => {
window.localStorage.clear();
_resetAutoProvisionForTests();
listOpencodeModels.mockReset();
discoverLocalOllama.mockReset();
recommendDefaultModel.mockReset();
supportsLocalLlm.mockReturnValue(true);
});
afterEach(() => {
vi.unstubAllGlobals();
});
it('prefers OpenCode when it has a usable model', async () => {
listOpencodeModels.mockResolvedValue([{ ref: 'opencode/deepseek-v4-flash-free', label: 'DeepSeek V4 Flash Free' }]);
const next = await ensureDefaultProvider(policyWith(['opencode', 'local']));
expect(next.provider).toBe('opencode');
expect(next.opencodeModel).toBe('opencode/deepseek-v4-flash-free');
expect(discoverLocalOllama).not.toHaveBeenCalled();
expect(loadAiSettings().provider).toBe('opencode'); // persisted, not just returned
});
it('falls back to Ollama when OpenCode is unreachable', async () => {
listOpencodeModels.mockRejectedValue(new Error('No local OpenCode server is running'));
discoverLocalOllama.mockResolvedValue({ baseUrl: 'http://127.0.0.1:11434', models: [{ name: 'qwen2.5:32b' }] });
recommendDefaultModel.mockReturnValue('qwen2.5:32b');
const next = await ensureDefaultProvider(policyWith(['opencode', 'local']));
expect(next.provider).toBe('local');
expect(next.localModel).toBe('qwen2.5:32b');
});
it('leaves provider unset when neither is available', async () => {
listOpencodeModels.mockResolvedValue([]);
discoverLocalOllama.mockResolvedValue(null);
const next = await ensureDefaultProvider(policyWith(['opencode', 'local']));
expect(next.provider).toBeNull();
});
it('never overrides an explicit choice already saved', async () => {
const { saveAiSettings, DEFAULT_AI_SETTINGS } = await import('../local-settings');
saveAiSettings({ ...DEFAULT_AI_SETTINGS, provider: 'server', serverModel: 'qwen2.5:32b' });
const next = await ensureDefaultProvider(policyWith(['opencode', 'local', 'server']));
expect(next.provider).toBe('server');
expect(listOpencodeModels).not.toHaveBeenCalled();
});
it('only probes once per module lifetime even if called again', async () => {
listOpencodeModels.mockResolvedValue([]);
discoverLocalOllama.mockResolvedValue(null);
await ensureDefaultProvider(policyWith(['opencode', 'local']));
await ensureDefaultProvider(policyWith(['opencode', 'local']));
expect(listOpencodeModels).toHaveBeenCalledTimes(1);
});
});
+81
View File
@@ -0,0 +1,81 @@
import { describe, it, expect, vi, afterEach } from 'vitest';
import { chatPublic, chatPublicManaged } from '../local-client';
describe('chatPublic', () => {
afterEach(() => {
vi.unstubAllGlobals();
});
it('turns a network/CORS-level failure into an actionable message naming the Base URL', async () => {
vi.stubGlobal('fetch', vi.fn().mockRejectedValue(new TypeError('Failed to fetch')));
await expect(
chatPublic('https://platform.deepseek.com/', 'sk-test', 'deepseek-chat', [
{ role: 'user', content: 'hi' },
]),
).rejects.toThrow(/Could not reach https:\/\/platform\.deepseek\.com\/chat\/completions/);
});
it('still reports the provider-returned status when the request completes', async () => {
vi.stubGlobal(
'fetch',
vi.fn().mockResolvedValue({ ok: false, status: 401, json: async () => ({}) }),
);
await expect(
chatPublic('https://api.deepseek.com', 'sk-bad', 'deepseek-chat', [
{ role: 'user', content: 'hi' },
]),
).rejects.toThrow('Provider returned 401');
});
it('returns the message content on success', async () => {
vi.stubGlobal(
'fetch',
vi.fn().mockResolvedValue({
ok: true,
status: 200,
json: async () => ({ choices: [{ message: { content: 'hello there' } }] }),
}),
);
await expect(
chatPublic('https://api.deepseek.com', 'sk-good', 'deepseek-chat', [
{ role: 'user', content: 'hi' },
]),
).resolves.toBe('hello there');
});
});
describe('chatPublicManaged', () => {
afterEach(() => {
vi.unstubAllGlobals();
});
it('posts presetId (never a key) to the same-origin route', async () => {
const fetchMock = vi.fn().mockResolvedValue({
ok: true,
json: async () => ({ answer: 'hi from the org preset' }),
});
vi.stubGlobal('fetch', fetchMock);
const answer = await chatPublicManaged('preset-abc123', [{ role: 'user', content: 'hi' }]);
expect(answer).toBe('hi from the org preset');
expect(fetchMock).toHaveBeenCalledWith('/api/ai/public/chat', expect.objectContaining({
method: 'POST',
body: JSON.stringify({ presetId: 'preset-abc123', messages: [{ role: 'user', content: 'hi' }] }),
}));
});
it('surfaces the server-side error (e.g. env var not set) verbatim', async () => {
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
ok: false,
status: 503,
json: async () => ({ error: 'Env var "DEEPSEEK_API_KEY" is not set on the server for preset "DeepSeek (org)"' }),
}));
await expect(chatPublicManaged('preset-abc123', [{ role: 'user', content: 'hi' }]))
.rejects.toThrow(/Env var "DEEPSEEK_API_KEY" is not set/);
});
});
+22
View File
@@ -0,0 +1,22 @@
import { describe, it, expect } from 'vitest';
import { presetActiveId, isPresetActiveId, presetIdFromActiveId } from '../local-settings';
describe('preset active-id helpers', () => {
it('round-trips a preset id through the prefixed activeProfileId space', () => {
const activeId = presetActiveId('preset-abc123');
expect(activeId).toBe('preset:preset-abc123');
expect(isPresetActiveId(activeId)).toBe(true);
expect(presetIdFromActiveId(activeId)).toBe('preset-abc123');
});
it('does not mistake a personal profile id for a preset id', () => {
const profileId = 'profile-xyz789-abc123';
expect(isPresetActiveId(profileId)).toBe(false);
expect(presetIdFromActiveId(profileId)).toBeNull();
});
it('handles null safely', () => {
expect(isPresetActiveId(null)).toBe(false);
expect(presetIdFromActiveId(null)).toBeNull();
});
});
+66
View File
@@ -0,0 +1,66 @@
// First-run, zero-config default provider (product decision 2026-08-07:
// "user wants to use AI so set the local one to on always by default" — not
// "user wants to configure AI"). Before this, a fresh install left
// `settings.provider` at `null` and every AI entry point just told the user
// to go set one up in Settings.
//
// Priority: OpenCode first, then Ollama. OpenCode is the one local option
// this app controls end to end — electron/main.ts auto-spawns
// `opencode serve` itself, so "OpenCode has a model" only depends on what's
// already authenticated in its own auth.json, not on the user having
// installed anything separately. Ollama is second because it's an external
// dependency the user must have installed and started themselves — real,
// but not zero-config the way OpenCode is here.
//
// Never overrides an explicit choice: fires only while `provider` is still
// `null`, and at most once per page load (module-level `attempted`) so a
// component re-mounting doesn't re-probe on every render.
import { loadAiSettings, saveAiSettings, type AiLocalSettings } from './local-settings';
import { listOpencodeModels } from './local-client';
import { discoverLocalOllama, recommendDefaultModel } from './local-discovery';
import { supportsLocalLlm } from '../platform-capabilities';
import type { AiPolicy } from './types';
let attempted = false;
/** Test-only: lets a fresh module state be simulated without a full reload. */
export function _resetAutoProvisionForTests(): void {
attempted = false;
}
export async function ensureDefaultProvider(policy: AiPolicy): Promise<AiLocalSettings> {
const current = loadAiSettings();
if (current.provider !== null || attempted) return current;
attempted = true;
if (policy.entitlement.classes.includes('opencode')) {
try {
const models = await listOpencodeModels();
if (models[0]) {
const next: AiLocalSettings = { ...current, provider: 'opencode', opencodeModel: models[0].ref };
saveAiSettings(next);
return next;
}
} catch {
// opencode not reachable yet (still starting, or the CLI isn't
// installed) — fall through to Ollama rather than surfacing an error
// for a default the user never asked for.
}
}
if (supportsLocalLlm() && policy.entitlement.classes.includes('local')) {
const discovery = await discoverLocalOllama();
if (discovery) {
const recommended = recommendDefaultModel(discovery.models) ?? discovery.models[0]?.name ?? null;
if (recommended) {
const next: AiLocalSettings = {
...current, provider: 'local', localBaseUrl: discovery.baseUrl, localModel: recommended,
};
saveAiSettings(next);
return next;
}
}
}
return current;
}
+57 -11
View File
@@ -135,14 +135,33 @@ export async function chatPublic(
model: string, model: string,
messages: ChatMessage[], messages: ChatMessage[],
): Promise<string> { ): Promise<string> {
const res = await fetch(`${baseUrl.replace(/\/+$/, '')}/chat/completions`, { const url = `${baseUrl.replace(/\/+$/, '')}/chat/completions`;
method: 'POST', let res: Response;
headers: { try {
'Content-Type': 'application/json', res = await fetch(url, {
Authorization: `Bearer ${apiKey}`, method: 'POST',
}, headers: {
body: JSON.stringify({ model, messages }), 'Content-Type': 'application/json',
}); Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({ model, messages }),
});
} catch {
// A request that never got a response (DNS failure, TLS failure, or -
// by far the most common cause in practice - a CORS preflight the
// target rejected) surfaces to fetch() as a bare, undifferentiated
// "TypeError: Failed to fetch" with no status code to inspect. Verified
// live: a Base URL pointing at a provider's website instead of its API
// (platform.deepseek.com vs api.deepseek.com) fails exactly this way,
// the preflight OPTIONS getting a 403 with no Access-Control-* headers
// at all. Naming the Base URL is the one actionable thing this error
// can tell the user, since the browser gives back nothing else.
throw new Error(
`Could not reach ${url} — check the Base URL is the provider's API endpoint, not its ` +
'website or console (e.g. api.deepseek.com, not platform.deepseek.com), and that it ' +
'allows being called directly from a browser.',
);
}
if (!res.ok) throw new Error(`Provider returned ${res.status}`); if (!res.ok) throw new Error(`Provider returned ${res.status}`);
const body = (await res.json()) as OpenAiChatResponse; const body = (await res.json()) as OpenAiChatResponse;
const content = body.choices?.[0]?.message?.content; const content = body.choices?.[0]?.message?.content;
@@ -150,6 +169,24 @@ export async function chatPublic(
return content; return content;
} }
// ── Public, admin-managed presets — the Paperclip-style alternative to
// pasting a personal key (decision 2026-08-07). The client only ever sends a
// presetId; the server resolves the actual key from its own environment (see
// app/api/ai/public/chat/route.ts) and makes the call itself, which also
// sidesteps the CORS/wrong-base-URL failure class chatPublic is exposed to. ──
export async function chatPublicManaged(presetId: string, messages: ChatMessage[]): Promise<string> {
const res = await fetch('/api/ai/public/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ presetId, messages }),
});
const body = await res.json().catch(() => ({}));
if (!res.ok) throw new Error(body?.error || `Provider returned ${res.status}`);
if (!body?.answer) throw new Error('Provider returned no message content');
return body.answer as string;
}
// ── OpenCode: a locally-running `opencode serve` (github.com/sst/opencode), // ── OpenCode: a locally-running `opencode serve` (github.com/sst/opencode),
// the same agent runtime Paperclip drives as an adapter. Reached through THIS // the same agent runtime Paperclip drives as an adapter. Reached through THIS
// app's own backend (app/api/ai/opencode/*) rather than directly, for the same // app's own backend (app/api/ai/opencode/*) rather than directly, for the same
@@ -419,7 +456,12 @@ export interface AskConfig {
localBaseUrl: string; localBaseUrl: string;
localModel: string | null; localModel: string | null;
serverModel: string | null; serverModel: string | null;
/** Personal BYOK profile — mutually exclusive with publicPresetId; the
* caller sets exactly one depending on which the user picked. */
publicProfile: ResolvedPublicProfile | null; publicProfile: ResolvedPublicProfile | null;
/** Admin-managed preset id (see chatPublicManaged) — mutually exclusive
* with publicProfile. */
publicPresetId?: string | null;
opencodeModel?: string | null; opencodeModel?: string | null;
/** Cookie slot of the account whose local index should be searched. Omitting /** Cookie slot of the account whose local index should be searched. Omitting
* it reads whichever account the resolver finds first — see fetchLocalLeg. */ * it reads whichever account the resolver finds first — see fetchLocalLeg. */
@@ -433,7 +475,7 @@ export async function askMail(question: string, config: AskConfig): Promise<AskR
if (config.provider === 'server' && !config.serverModel) { if (config.provider === 'server' && !config.serverModel) {
throw new Error('No server model selected'); throw new Error('No server model selected');
} }
if (config.provider === 'public' && !config.publicProfile) { if (config.provider === 'public' && !config.publicProfile && !config.publicPresetId) {
throw new Error('No provider profile selected'); throw new Error('No provider profile selected');
} }
if (config.provider === 'opencode' && !config.opencodeModel) { if (config.provider === 'opencode' && !config.opencodeModel) {
@@ -448,8 +490,12 @@ export async function askMail(question: string, config: AskConfig): Promise<AskR
let answer: string; let answer: string;
let seatJustAssigned = false; let seatJustAssigned = false;
if (config.provider === 'public') { if (config.provider === 'public') {
const profile = config.publicProfile as ResolvedPublicProfile; if (config.publicPresetId) {
answer = await chatPublic(profile.baseUrl, profile.apiKey, profile.model, messages); answer = await chatPublicManaged(config.publicPresetId, messages);
} else {
const profile = config.publicProfile as ResolvedPublicProfile;
answer = await chatPublic(profile.baseUrl, profile.apiKey, profile.model, messages);
}
} else if (config.provider === 'server') { } else if (config.provider === 'server') {
const result = await chatServer(config.serverModel as string, messages); const result = await chatServer(config.serverModel as string, messages);
answer = result.answer; answer = result.answer;
+20
View File
@@ -50,6 +50,26 @@ function newProfileId(): string {
return `profile-${Math.random().toString(36).slice(2, 10)}-${Math.random().toString(36).slice(2, 10)}`; return `profile-${Math.random().toString(36).slice(2, 10)}-${Math.random().toString(36).slice(2, 10)}`;
} }
/**
* `activeProfileId` names either a personal BYOK profile (its own id, as
* always) or an admin-managed preset (see PublicAiPreset), prefixed so the
* two id spaces can never collide without adding a second field everywhere
* that reads/writes activeProfileId.
*/
const PRESET_PREFIX = 'preset:';
export function presetActiveId(presetId: string): string {
return PRESET_PREFIX + presetId;
}
export function isPresetActiveId(activeId: string | null): boolean {
return !!activeId && activeId.startsWith(PRESET_PREFIX);
}
export function presetIdFromActiveId(activeId: string | null): string | null {
return activeId && activeId.startsWith(PRESET_PREFIX) ? activeId.slice(PRESET_PREFIX.length) : null;
}
/** One-time upgrade from the earlier single-profile shape (a bare /** One-time upgrade from the earlier single-profile shape (a bare
* publicBaseUrl/publicModel pair) into the profile list, so a browser that * publicBaseUrl/publicModel pair) into the profile list, so a browser that
* already saved settings before profiles existed doesn't just lose them. */ * already saved settings before profiles existed doesn't just lose them. */
+36
View File
@@ -22,6 +22,33 @@
export type AiClass = 'local' | 'server' | 'public' | 'opencode'; export type AiClass = 'local' | 'server' | 'public' | 'opencode';
/**
* An admin-published, server-managed `public`-class provider — the
* Paperclip-style alternative to a user pasting their own key (decision
* 2026-08-07): the admin names an env var (e.g. "DEEPSEEK_API_KEY") instead
* of typing a secret value anywhere in this config. The actual value is
* whatever ops has set in the server's real environment (k8s secret, .env,
* Electron packaging) — same custody model as the existing AI_SERVER_BASE_URL
* var, just admin-nameable instead of hardcoded. Resolved server-side only,
* in app/api/ai/public/chat/route.ts; never sent to a browser.
*/
export interface PublicAiPreset {
id: string;
name: string;
baseUrl: string;
model: string;
apiKeyEnvVar: string;
}
/** What a client is allowed to know about a preset — no baseUrl/apiKeyEnvVar,
* since the client only ever refers to a preset by id and never calls the
* provider itself. */
export interface PublicAiPresetOption {
id: string;
name: string;
model: string;
}
export interface AiEntitlement { export interface AiEntitlement {
licensed: boolean; licensed: boolean;
subject: 'user' | 'tenant'; subject: 'user' | 'tenant';
@@ -45,6 +72,9 @@ export interface AiPolicy {
/** Base-URL prefixes a BYOK profile's baseUrl must match. null = unrestricted /** Base-URL prefixes a BYOK profile's baseUrl must match. null = unrestricted
* (today's behavior). Advisory/client-side only — see spec §6.1. */ * (today's behavior). Advisory/client-side only — see spec §6.1. */
publicProviderAllowlist: string[] | null; publicProviderAllowlist: string[] | null;
/** Admin-managed provider presets available to every user (see
* PublicAiPreset) — sanitized to {id,name,model} for the client. */
publicPresets: PublicAiPresetOption[];
} }
export const DEFAULT_AI_ENTITLEMENT: AiEntitlement = { export const DEFAULT_AI_ENTITLEMENT: AiEntitlement = {
@@ -63,6 +93,7 @@ export const DEFAULT_AI_POLICY: AiPolicy = {
retrievalEnabled: true, retrievalEnabled: true,
consent: null, consent: null,
publicProviderAllowlist: null, publicProviderAllowlist: null,
publicPresets: [],
}; };
// Admin-authored console config (docs/AI-ASSISTANT-CONCEPT.md §6 / // Admin-authored console config (docs/AI-ASSISTANT-CONCEPT.md §6 /
@@ -83,6 +114,10 @@ export interface AiConsoleConfig {
/** null = unrestricted BYOK base URLs (today's behavior, unchanged). /** null = unrestricted BYOK base URLs (today's behavior, unchanged).
* Non-null = base URL must start with one of these prefixes. */ * Non-null = base URL must start with one of these prefixes. */
publicProviderAllowlist: string[] | null; publicProviderAllowlist: string[] | null;
/** Server-managed `public`-class presets — the Paperclip-style env-var-key
* picker (decision 2026-08-07). Empty by default; adding one here is what
* makes it show up in every user's Settings picker and in AiPolicy.publicPresets. */
publicPresets: PublicAiPreset[];
/** Master switch for the retrieval leg (mail-content → embeddings). /** Master switch for the retrieval leg (mail-content → embeddings).
* Independent of classesEnabled.server. Defaults true. */ * Independent of classesEnabled.server. Defaults true. */
retrievalEnabled: boolean; retrievalEnabled: boolean;
@@ -93,6 +128,7 @@ export const DEFAULT_AI_CONSOLE_CONFIG: AiConsoleConfig = {
classesEnabled: {}, classesEnabled: {},
serverModelAllowlist: null, serverModelAllowlist: null,
publicProviderAllowlist: null, publicProviderAllowlist: null,
publicPresets: [],
retrievalEnabled: true, retrievalEnabled: true,
consent: null, consent: null,
}; };
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "تم النسخ!", "copied": "تم النسخ!",
"copy_failed": "فشل النسخ" "copy_failed": "فشل النسخ"
}, },
"send_now": "إرسال الآن" "send_now": "إرسال الآن",
"create_appointment": "إنشاء موعد"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "إيصال القراءة مطلوب (انقر للتعطيل)", "read_receipt_on": "إيصال القراءة مطلوب (انقر للتعطيل)",
@@ -712,7 +713,10 @@
"delete_table": "حذف الجدول", "delete_table": "حذف الجدول",
"pick_size": "اختيار الحجم" "pick_size": "اختيار الحجم"
}, },
"send_filing_warning": "تم الإرسال - لكن التنظيف بعد الإرسال فشل، وقد تبقى مسودة قديمة." "send_filing_warning": "تم الإرسال - لكن التنظيف بعد الإرسال فشل، وقد تبقى مسودة قديمة.",
"insert_signature": "إدراج التوقيع",
"no_signature": "لا يوجد توقيع",
"select_signature": "اختيار التوقيع"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "تأكيد", "confirm": "تأكيد",
@@ -891,7 +895,10 @@
"downloads": "التنزيلات", "downloads": "التنزيلات",
"content_senders": "المحتوى والمرسلون", "content_senders": "المحتوى والمرسلون",
"about_data": "حول والبيانات", "about_data": "حول والبيانات",
"debug": "التصحيح" "debug": "التصحيح",
"import": "استيراد",
"sharing": "المشاركة",
"signatures": "التوقيعات"
}, },
"tab_groups": { "tab_groups": {
"general": "عام", "general": "عام",
@@ -2007,7 +2014,39 @@
"preview": { "preview": {
"label": "معاينة" "label": "معاينة"
} }
} },
"importer": {
"action_label": "استيراد",
"cancel": "إلغاء",
"choose_files": "اختيار الملفات",
"conflict_copy": "الاحتفاظ بالنسختين",
"conflict_description": "اختر ما يجب فعله عند وجود رسالة مستوردة مسبقًا.",
"conflict_label": "التعامل مع التكرار",
"conflict_replace": "استبدال المكررات",
"conflict_skip": "تخطي المكررات",
"description": "استيراد رسائل البريد الإلكتروني من ملفات ‎.eml إلى مجلد.",
"error_details": "{count, plural, one {# خطأ} other {# أخطاء}}",
"fail": "فشل الاستيراد",
"file_description": "اختر ملف ‎.eml واحدًا أو أكثر للاستيراد.",
"file_label": "الملفات",
"files_selected": "{count, plural, one {تم تحديد ملف واحد} other {تم تحديد # ملف}}",
"folder_description": "اختر المجلد الذي سيتم استيراد الرسائل إليه.",
"folder_label": "المجلد الوجهة",
"import_complete": "اكتمل الاستيراد",
"import_more": "استيراد المزيد",
"importing": "جارٍ الاستيراد...",
"progress_failed": "فشل {count}",
"progress_imported": "تم استيراد {count}",
"progress_skipped": "تم تخطي {count}",
"start_import": "{count, plural, one {استيراد ملف واحد} other {استيراد # ملف}}",
"success": "{count, plural, one {تم استيراد رسالة واحدة} other {تم استيراد # رسالة}}",
"summary_failed": "{count, plural, one {فشلت رسالة واحدة} other {فشلت # رسالة}}",
"summary_imported": "{count, plural, one {تم استيراد رسالة واحدة} other {تم استيراد # رسالة}}",
"summary_skipped": "{count, plural, one {تم تخطي رسالة واحدة} other {تم تخطي # رسالة}}",
"title": "استيراد البريد"
},
"loading": "جارٍ التحميل...",
"refresh": "تحديث"
}, },
"errors": { "errors": {
"page_error_title": "حدث خطأ ما", "page_error_title": "حدث خطأ ما",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "فشلت إعادة تسمية المجلد", "toast_error_rename": "فشلت إعادة تسمية المجلد",
"toast_error_delete": "فشل حذف المجلد", "toast_error_delete": "فشل حذف المجلد",
"toast_error_delete_has_children": "المجلد يحتوي على مجلدات فرعية. أزلها أولًا.", "toast_error_delete_has_children": "المجلد يحتوي على مجلدات فرعية. أزلها أولًا.",
"toast_error_delete_has_email": "المجلد ليس فارغًا. أفرغه أولًا." "toast_error_delete_has_email": "المجلد ليس فارغًا. أفرغه أولًا.",
"share_folder": "مشاركة المجلد..."
}, },
"shortcuts": { "shortcuts": {
"title": "اختصارات لوحة المفاتيح", "title": "اختصارات لوحة المفاتيح",
@@ -2184,7 +2224,11 @@
"save": "حفظ الهوية", "save": "حفظ الهوية",
"cancel": "إلغاء", "cancel": "إلغاء",
"creating": "جارٍ الإنشاء...", "creating": "جارٍ الإنشاء...",
"updating": "جارٍ التحديث..." "updating": "جارٍ التحديث...",
"signature_store_default": "التوقيع الافتراضي",
"signature_store_mapping": "تعيين التوقيع",
"signature_store_reply": "توقيع الرد",
"use_global_default": "استخدام الافتراضي العام"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "استخدام عنوان فرعي", "button_tooltip": "استخدام عنوان فرعي",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {تم استيراد جهة اتصال واحدة} other {تم استيراد # جهة اتصال}}", "success": "{count, plural, one {تم استيراد جهة اتصال واحدة} other {تم استيراد # جهة اتصال}}",
"failed": "فشل الاستيراد", "failed": "فشل الاستيراد",
"close": "إغلاق", "close": "إغلاق",
"file_too_large": "الملف كبير جدًا (الحد الأقصى 5 ميغابايت)" "file_too_large": "الملف كبير جدًا (الحد الأقصى 5 ميغابايت)",
"csv_address": "العنوان",
"csv_address_book": "دفتر العناوين",
"csv_back": "رجوع",
"csv_city": "المدينة",
"csv_company": "الشركة",
"csv_country": "البلد",
"csv_email": "البريد الإلكتروني",
"csv_first_name": "الاسم الأول",
"csv_ignore": "تجاهل هذا العمود",
"csv_job_title": "المسمى الوظيفي",
"csv_last_name": "الاسم الأخير",
"csv_load_all": "تحميل الكل",
"csv_map_columns": "تعيين الأعمدة",
"csv_nickname": "الاسم المستعار",
"csv_note": "ملاحظة",
"csv_phone": "الهاتف",
"csv_postcode": "الرمز البريدي",
"csv_preview": "معاينة",
"csv_preview_title": "معاينة ({count, plural, one {# صف} other {# صفوف}})",
"csv_region": "المنطقة/الولاية",
"csv_website": "الموقع الإلكتروني",
"file_types_csv": "ملفات .csv"
}, },
"export": { "export": {
"title": "تصدير جهات الاتصال", "title": "تصدير جهات الاتصال",
@@ -2569,7 +2635,10 @@
"has_email": "لديه بريد إلكتروني", "has_email": "لديه بريد إلكتروني",
"has_phone": "لديه هاتف", "has_phone": "لديه هاتف",
"has_photo": "لديه صورة" "has_photo": "لديه صورة"
} },
"delete": "حذف",
"edit": "تعديل",
"send_email": "إرسال بريد إلكتروني"
}, },
"calendar": { "calendar": {
"title": "التقويم", "title": "التقويم",
@@ -2988,6 +3057,36 @@
"due_today": "اليوم", "due_today": "اليوم",
"due_tomorrow": "غدًا", "due_tomorrow": "غدًا",
"overdue": "متأخرة" "overdue": "متأخرة"
},
"delete": "حذف",
"duplicate": "تكرار",
"edit": "تعديل",
"freeBusy": {
"busy": "مشغول",
"check": "التحقق من التوفر",
"click_to_select": "انقر على فترة متاحة لتحديد هذا الوقت",
"free": "متاح",
"hide": "إخفاء التوفر",
"loading": "جارٍ التحميل...",
"no_participants": "أضف مشاركين للتحقق من التوفر.",
"tentative": "مبدئي",
"timezone": "المنطقة الزمنية",
"title": "التوفر",
"unavailable": "خارج المكتب",
"unknown": "لا تتوفر معلومات"
},
"resources": {
"clear_all": "مسح الكل",
"filter_all": "الكل",
"hide": "إخفاء الموارد",
"no_resources": "لا توجد موارد متاحة",
"remove": "إزالة {name}",
"search_placeholder": "بحث في الموارد...",
"title": "الموارد",
"type_equipment": "المعدات",
"type_other": "أخرى",
"type_room": "الغرف",
"type_vehicle": "المركبات"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "قراءة وكتابة", "readWrite": "قراءة وكتابة",
"manager": "مدير", "manager": "مدير",
"custom": "مخصص" "custom": "مخصص"
} },
"accept": "قبول",
"decline": "رفض",
"no_shares_by_me": "لم تشارك أي شيء بعد.",
"no_shares_with_me": "لا توجد مجلدات مشتركة معك بعد.",
"shared_by": "شارك بواسطة",
"tab_shared_by_me": "مشترك مني",
"tab_shared_with_me": "مشترك معي"
}, },
"advanced_search": { "advanced_search": {
"title": "بحث متقدم", "title": "بحث متقدم",
@@ -3176,7 +3282,8 @@
"disabled_description": "قد تتسبب عمليات رفع الملفات الكبيرة عبر WebDAV في زعزعة استقرار Stalwart/RocksDB، بما في ذلك انهيارات نفاد الذاكرة واستخدام غير قابل للاسترجاع لمساحة القرص. قد لا تُحذف الملفات المحذوفة فورًا من مخزن الكائنات الثنائية. لا يُنصح بهذه الميزة لبيئات الإنتاج.", "disabled_description": "قد تتسبب عمليات رفع الملفات الكبيرة عبر WebDAV في زعزعة استقرار Stalwart/RocksDB، بما في ذلك انهيارات نفاد الذاكرة واستخدام غير قابل للاسترجاع لمساحة القرص. قد لا تُحذف الملفات المحذوفة فورًا من مخزن الكائنات الثنائية. لا يُنصح بهذه الميزة لبيئات الإنتاج.",
"stability_warning": "قد تتسبب عمليات رفع الملفات الكبيرة في زعزعة استقرار الخادم. قد لا تُحذف الملفات المحذوفة فورًا من التخزين. استخدمها بحذر.", "stability_warning": "قد تتسبب عمليات رفع الملفات الكبيرة في زعزعة استقرار الخادم. قد لا تُحذف الملفات المحذوفة فورًا من التخزين. استخدمها بحذر.",
"migration_title": "جارٍ تحديث ملفاتك…", "migration_title": "جارٍ تحديث ملفاتك…",
"migration_description": "جارٍ تنظيم المجلدات والملفات في هيكلها الصحيح. يحدث هذا مرة واحدة فقط." "migration_description": "جارٍ تنظيم المجلدات والملفات في هيكلها الصحيح. يحدث هذا مرة واحدة فقط.",
"send_as_attachment": "إرسال كمرفق"
}, },
"smime": { "smime": {
"your_certificates": "شهاداتك", "your_certificates": "شهاداتك",
@@ -3324,5 +3431,55 @@
"install": "تثبيت", "install": "تثبيت",
"dont_remind": "عدم التذكير مرة أخرى", "dont_remind": "عدم التذكير مرة أخرى",
"dismiss_aria": "تجاهل مطالبة التثبيت" "dismiss_aria": "تجاهل مطالبة التثبيت"
},
"signatures": {
"add_signature": "إضافة توقيع",
"default": "افتراضي",
"default_signature": {
"description": "يُستخدم للرسائل الجديدة ما لم يتم تجاوزه لكل هوية.",
"label": "التوقيع الافتراضي"
},
"delete_message": "هل أنت متأكد أنك تريد حذف \"{name}\"؟ لا يمكن التراجع عن هذا.",
"delete_title": "حذف التوقيع؟",
"description": "إنشاء وإدارة توقيعات البريد الإلكتروني لاستخدامها عند الكتابة أو الرد.",
"duplicate": "تكرار",
"edit_signature": "تعديل التوقيع",
"editor_label": "التوقيع",
"html_preview_label": "معاينة HTML",
"name_label": "الاسم",
"name_placeholder": "مثال: العمل، الشخصي",
"name_required": "الاسم مطلوب",
"new_signature": "توقيع جديد",
"no_signature": "لا يوجد توقيع",
"no_signatures": "لا توجد توقيعات بعد",
"per_identity_signatures": {
"description": "تجاوز التوقيع الافتراضي وتوقيع الرد لهويات معينة.",
"label": "توقيعات لكل هوية"
},
"plain_text_preview_label": "معاينة النص العادي",
"reply": "رد",
"reply_signature": {
"description": "يُستخدم عند الرد أو إعادة التوجيه ما لم يتم تجاوزه لكل هوية.",
"label": "توقيع الرد"
},
"show_editor": "إظهار المحرر",
"show_preview": "إظهار المعاينة",
"title": "التوقيعات",
"toolbar": {
"align_center": "توسيط",
"align_left": "محاذاة لليسار",
"align_right": "محاذاة لليمين",
"bold": "غامق",
"bullet_list": "قائمة نقطية",
"italic": "مائل",
"link": "رابط",
"ordered_list": "قائمة مرقمة",
"remove_color": "إزالة اللون",
"strikethrough": "يتوسطه خط",
"text_color": "لون النص",
"underline": "تسطير"
},
"use_global_default": "استخدام الافتراضي العام",
"your_signatures": "توقيعاتك ({count})"
} }
} }
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "Copiat!", "copied": "Copiat!",
"copy_failed": "No s'ha pogut copiar" "copy_failed": "No s'ha pogut copiar"
}, },
"send_now": "Envia ara" "send_now": "Envia ara",
"create_appointment": "Crea una cita"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Confirmació de lectura sol·licitada (feu clic per desactivar-la)", "read_receipt_on": "Confirmació de lectura sol·licitada (feu clic per desactivar-la)",
@@ -712,7 +713,10 @@
"delete_table": "Elimina la taula", "delete_table": "Elimina la taula",
"pick_size": "Tria la mida" "pick_size": "Tria la mida"
}, },
"send_filing_warning": "Enviat, però la neteja posterior a l'enviament ha fallat; és possible que quedi un esborrany obsolet." "send_filing_warning": "Enviat, però la neteja posterior a l'enviament ha fallat; és possible que quedi un esborrany obsolet.",
"insert_signature": "Insereix la signatura",
"no_signature": "Sense signatura",
"select_signature": "Selecciona la signatura"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirma", "confirm": "Confirma",
@@ -891,7 +895,10 @@
"downloads": "Baixades", "downloads": "Baixades",
"content_senders": "Contingut i remitents", "content_senders": "Contingut i remitents",
"about_data": "Quant a i dades", "about_data": "Quant a i dades",
"debug": "Depuració" "debug": "Depuració",
"import": "Importació",
"sharing": "Compartició",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "General", "general": "General",
@@ -2007,7 +2014,39 @@
"preview": { "preview": {
"label": "Previsualització" "label": "Previsualització"
} }
} },
"importer": {
"action_label": "Importa",
"cancel": "Cancel·la",
"choose_files": "Trieu els fitxers",
"conflict_copy": "Conserva els dos",
"conflict_description": "Trieu què s'ha de fer quan un missatge importat ja existeix.",
"conflict_label": "Gestió de duplicats",
"conflict_replace": "Reemplaça els duplicats",
"conflict_skip": "Omet els duplicats",
"description": "Importeu missatges de correu des de fitxers .eml a una carpeta.",
"error_details": "{count, plural, one {# error} other {# errors}}",
"fail": "Ha fallat la importació",
"file_description": "Seleccioneu un o més fitxers .eml per importar.",
"file_label": "Fitxers",
"files_selected": "{count, plural, one {# fitxer seleccionat} other {# fitxers seleccionats}}",
"folder_description": "Trieu la carpeta on importar els missatges.",
"folder_label": "Carpeta de destinació",
"import_complete": "Importació completada",
"import_more": "Importa'n més",
"importing": "Important...",
"progress_failed": "{count} fallits",
"progress_imported": "{count} importats",
"progress_skipped": "{count} omesos",
"start_import": "{count, plural, one {Importa # fitxer} other {Importa # fitxers}}",
"success": "{count, plural, one {# missatge importat} other {# missatges importats}}",
"summary_failed": "{count, plural, one {# missatge fallit} other {# missatges fallits}}",
"summary_imported": "{count, plural, one {# missatge importat} other {# missatges importats}}",
"summary_skipped": "{count, plural, one {# missatge omès} other {# missatges omesos}}",
"title": "Importa correu"
},
"loading": "Carregant...",
"refresh": "Actualitza"
}, },
"errors": { "errors": {
"page_error_title": "S'ha produït un error", "page_error_title": "S'ha produït un error",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "No s'ha pogut canviar el nom de la carpeta", "toast_error_rename": "No s'ha pogut canviar el nom de la carpeta",
"toast_error_delete": "No s'ha pogut suprimir la carpeta", "toast_error_delete": "No s'ha pogut suprimir la carpeta",
"toast_error_delete_has_children": "La carpeta té subcarpetes. Elimineu-les primer.", "toast_error_delete_has_children": "La carpeta té subcarpetes. Elimineu-les primer.",
"toast_error_delete_has_email": "La carpeta no és buida. Buideu-la primer." "toast_error_delete_has_email": "La carpeta no és buida. Buideu-la primer.",
"share_folder": "Comparteix la carpeta..."
}, },
"shortcuts": { "shortcuts": {
"title": "Dreceres de teclat", "title": "Dreceres de teclat",
@@ -2184,7 +2224,11 @@
"save": "Desa la identitat", "save": "Desa la identitat",
"cancel": "Cancel·la", "cancel": "Cancel·la",
"creating": "Creant...", "creating": "Creant...",
"updating": "Actualitzant..." "updating": "Actualitzant...",
"signature_store_default": "Signatura per defecte",
"signature_store_mapping": "Assignació de signatures",
"signature_store_reply": "Signatura de resposta",
"use_global_default": "Utilitza el valor global per defecte"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Utilitza subadreça", "button_tooltip": "Utilitza subadreça",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {1 contacte importat} other {# contactes importats}}", "success": "{count, plural, one {1 contacte importat} other {# contactes importats}}",
"failed": "No s'ha pogut importar", "failed": "No s'ha pogut importar",
"close": "Tanca", "close": "Tanca",
"file_too_large": "El fitxer és massa gran (màxim 5 MB)" "file_too_large": "El fitxer és massa gran (màxim 5 MB)",
"csv_address": "Adreça",
"csv_address_book": "Llibreta d'adreces",
"csv_back": "Enrere",
"csv_city": "Ciutat",
"csv_company": "Empresa",
"csv_country": "País",
"csv_email": "Correu electrònic",
"csv_first_name": "Nom",
"csv_ignore": "Ignora aquesta columna",
"csv_job_title": "Càrrec",
"csv_last_name": "Cognom",
"csv_load_all": "Carrega-ho tot",
"csv_map_columns": "Assigna les columnes",
"csv_nickname": "Sobrenom",
"csv_note": "Nota",
"csv_phone": "Telèfon",
"csv_postcode": "Codi postal",
"csv_preview": "Previsualització",
"csv_preview_title": "Previsualització ({count, plural, one {# fila} other {# files}})",
"csv_region": "Estat/Regió",
"csv_website": "Lloc web",
"file_types_csv": "fitxers .csv"
}, },
"export": { "export": {
"title": "Exporta contactes", "title": "Exporta contactes",
@@ -2569,7 +2635,10 @@
"has_email": "Té correu electrònic", "has_email": "Té correu electrònic",
"has_phone": "Té telèfon", "has_phone": "Té telèfon",
"has_photo": "Té foto" "has_photo": "Té foto"
} },
"delete": "Suprimeix",
"edit": "Edita",
"send_email": "Envia un correu"
}, },
"calendar": { "calendar": {
"title": "Calendari", "title": "Calendari",
@@ -2988,6 +3057,36 @@
"due_today": "Avui", "due_today": "Avui",
"due_tomorrow": "Demà", "due_tomorrow": "Demà",
"overdue": "Vençuda" "overdue": "Vençuda"
},
"delete": "Suprimeix",
"duplicate": "Duplica",
"edit": "Edita",
"freeBusy": {
"busy": "Ocupat",
"check": "Comprova la disponibilitat",
"click_to_select": "Feu clic en una franja lliure per seleccionar aquesta hora",
"free": "Lliure",
"hide": "Amaga la disponibilitat",
"loading": "Carregant...",
"no_participants": "Afegiu participants per comprovar la disponibilitat.",
"tentative": "Provisional",
"timezone": "Fus horari",
"title": "Disponibilitat",
"unavailable": "Fora de l'oficina",
"unknown": "Sense informació"
},
"resources": {
"clear_all": "Neteja-ho tot",
"filter_all": "Tots",
"hide": "Amaga els recursos",
"no_resources": "No hi ha cap recurs disponible",
"remove": "Elimina {name}",
"search_placeholder": "Cerca recursos...",
"title": "Recursos",
"type_equipment": "Equipament",
"type_other": "Altres",
"type_room": "Sales",
"type_vehicle": "Vehicles"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "Lectura i escriptura", "readWrite": "Lectura i escriptura",
"manager": "Gestor", "manager": "Gestor",
"custom": "Personalitzat" "custom": "Personalitzat"
} },
"accept": "Accepta",
"decline": "Rebutja",
"no_shares_by_me": "Encara no heu compartit res.",
"no_shares_with_me": "Encara no hi ha cap carpeta compartida amb vós.",
"shared_by": "Compartit per",
"tab_shared_by_me": "Compartit per mi",
"tab_shared_with_me": "Compartit amb mi"
}, },
"advanced_search": { "advanced_search": {
"title": "Cerca avançada", "title": "Cerca avançada",
@@ -3176,7 +3282,8 @@
"disabled_description": "Les pujades de fitxers grans via WebDAV poden causar inestabilitat a Stalwart/RocksDB, incloent-hi fallades per manca de memòria i ús de disc irrecuperable. És possible que els fitxers suprimits no s'eliminin immediatament de l'emmagatzematge de blobs. No es recomana aquesta funció per a entorns de producció.", "disabled_description": "Les pujades de fitxers grans via WebDAV poden causar inestabilitat a Stalwart/RocksDB, incloent-hi fallades per manca de memòria i ús de disc irrecuperable. És possible que els fitxers suprimits no s'eliminin immediatament de l'emmagatzematge de blobs. No es recomana aquesta funció per a entorns de producció.",
"stability_warning": "Les pujades de fitxers grans poden causar inestabilitat al servidor. És possible que els fitxers suprimits no s'eliminin immediatament de l'emmagatzematge. Utilitzeu-ho amb precaució.", "stability_warning": "Les pujades de fitxers grans poden causar inestabilitat al servidor. És possible que els fitxers suprimits no s'eliminin immediatament de l'emmagatzematge. Utilitzeu-ho amb precaució.",
"migration_title": "Actualitzant els vostres fitxers…", "migration_title": "Actualitzant els vostres fitxers…",
"migration_description": "S'estan organitzant les carpetes i els fitxers en la seva estructura adequada. Això només passa una vegada." "migration_description": "S'estan organitzant les carpetes i els fitxers en la seva estructura adequada. Això només passa una vegada.",
"send_as_attachment": "Envia com a fitxer adjunt"
}, },
"smime": { "smime": {
"your_certificates": "Els vostres certificats", "your_certificates": "Els vostres certificats",
@@ -3324,5 +3431,55 @@
"install": "Instal·la", "install": "Instal·la",
"dont_remind": "No m'ho tornis a recordar", "dont_remind": "No m'ho tornis a recordar",
"dismiss_aria": "Descarta l'avís d'instal·lació" "dismiss_aria": "Descarta l'avís d'instal·lació"
},
"signatures": {
"add_signature": "Afegeix una signatura",
"default": "Per defecte",
"default_signature": {
"description": "S'utilitza per als missatges nous llevat que se substitueixi per identitat.",
"label": "Signatura per defecte"
},
"delete_message": "Segur que voleu suprimir «{name}»? Aquesta acció no es pot desfer.",
"delete_title": "Voleu suprimir la signatura?",
"description": "Creeu i gestioneu signatures de correu electrònic per utilitzar-les en redactar o respondre.",
"duplicate": "Duplica",
"edit_signature": "Edita la signatura",
"editor_label": "Signatura",
"html_preview_label": "Previsualització HTML",
"name_label": "Nom",
"name_placeholder": "p. ex. Feina, Personal",
"name_required": "El nom és obligatori",
"new_signature": "Signatura nova",
"no_signature": "Sense signatura",
"no_signatures": "Encara no hi ha cap signatura",
"per_identity_signatures": {
"description": "Substituïu la signatura per defecte i la de resposta per a identitats concretes.",
"label": "Signatures per identitat"
},
"plain_text_preview_label": "Previsualització de text sense format",
"reply": "Resposta",
"reply_signature": {
"description": "S'utilitza en respondre o reenviar llevat que se substitueixi per identitat.",
"label": "Signatura de resposta"
},
"show_editor": "Mostra l'editor",
"show_preview": "Mostra la previsualització",
"title": "Signatures",
"toolbar": {
"align_center": "Centra",
"align_left": "Alinea a l'esquerra",
"align_right": "Alinea a la dreta",
"bold": "Negreta",
"bullet_list": "Llista de pics",
"italic": "Cursiva",
"link": "Enllaç",
"ordered_list": "Llista numerada",
"remove_color": "Elimina el color",
"strikethrough": "Ratllat",
"text_color": "Color del text",
"underline": "Subratllat"
},
"use_global_default": "Utilitza el valor global per defecte",
"your_signatures": "Les vostres signatures ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Zkopírováno!", "copied": "Zkopírováno!",
"copy_failed": "Kopírování se nezdařilo" "copy_failed": "Kopírování se nezdařilo"
}, },
"send_now": "Odeslat nyní" "send_now": "Odeslat nyní",
"create_appointment": "Vytvořit schůzku"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Vyžádáno potvrzení o přečtení (kliknutím vypnete)", "read_receipt_on": "Vyžádáno potvrzení o přečtení (kliknutím vypnete)",
@@ -712,7 +713,10 @@
"delete_table": "Odstranit tabulku", "delete_table": "Odstranit tabulku",
"pick_size": "Vybrat velikost" "pick_size": "Vybrat velikost"
}, },
"send_filing_warning": "Odesláno - ale následný úklid selhal, může zůstat zastaralý koncept." "send_filing_warning": "Odesláno - ale následný úklid selhal, může zůstat zastaralý koncept.",
"insert_signature": "Vložit podpis",
"no_signature": "Bez podpisu",
"select_signature": "Vybrat podpis"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Potvrdit", "confirm": "Potvrdit",
@@ -888,7 +892,10 @@
"downloads": "Stažené", "downloads": "Stažené",
"content_senders": "Obsah a odesílatelé", "content_senders": "Obsah a odesílatelé",
"about_data": "Info a data", "about_data": "Info a data",
"debug": "Ladění" "debug": "Ladění",
"import": "Import",
"sharing": "Sdílení",
"signatures": "Podpisy"
}, },
"tab_groups": { "tab_groups": {
"general": "Obecné", "general": "Obecné",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Zpět na můj účet", "back": "Zpět na můj účet",
"managing": "Správa: {name}" "managing": "Správa: {name}"
} },
"importer": {
"action_label": "Importovat",
"cancel": "Zrušit",
"choose_files": "Vybrat soubory",
"conflict_copy": "Ponechat obě",
"conflict_description": "Zvolte, co se má stát, pokud importovaná zpráva již existuje.",
"conflict_label": "Zpracování duplicit",
"conflict_replace": "Nahradit duplicity",
"conflict_skip": "Přeskočit duplicity",
"description": "Importovat e-mailové zprávy ze souborů .eml do složky.",
"error_details": "{count, plural, one {# chyba} other {# chyb}}",
"fail": "Import selhal",
"file_description": "Vyberte jeden nebo více souborů .eml k importu.",
"file_label": "Soubory",
"files_selected": "{count, plural, one {# vybraný soubor} other {# vybraných souborů}}",
"folder_description": "Vyberte složku, do které se mají zprávy importovat.",
"folder_label": "Cílová složka",
"import_complete": "Import dokončen",
"import_more": "Importovat další",
"importing": "Importování...",
"progress_failed": "{count} selhalo",
"progress_imported": "{count} importováno",
"progress_skipped": "{count} přeskočeno",
"start_import": "{count, plural, one {Importovat # soubor} other {Importovat # souborů}}",
"success": "{count, plural, one {# zpráva importována} other {# zpráv importováno}}",
"summary_failed": "{count, plural, one {# zpráva selhala} other {# zpráv selhalo}}",
"summary_imported": "{count, plural, one {# zpráva importována} other {# zpráv importováno}}",
"summary_skipped": "{count, plural, one {# zpráva přeskočena} other {# zpráv přeskočeno}}",
"title": "Import pošty"
},
"loading": "Načítání...",
"refresh": "Obnovit"
}, },
"errors": { "errors": {
"page_error_title": "Něco se pokazilo", "page_error_title": "Něco se pokazilo",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Nepodařilo se přejmenovat složku", "toast_error_rename": "Nepodařilo se přejmenovat složku",
"toast_error_delete": "Nepodařilo se smazat složku", "toast_error_delete": "Nepodařilo se smazat složku",
"toast_error_delete_has_children": "Složka obsahuje podsložky. Nejprve je odstraňte.", "toast_error_delete_has_children": "Složka obsahuje podsložky. Nejprve je odstraňte.",
"toast_error_delete_has_email": "Složka není prázdná. Nejprve ji vyprázdněte." "toast_error_delete_has_email": "Složka není prázdná. Nejprve ji vyprázdněte.",
"share_folder": "Sdílet složku..."
}, },
"shortcuts": { "shortcuts": {
"title": "Klávesové zkratky", "title": "Klávesové zkratky",
@@ -2184,7 +2224,11 @@
"save": "Uložit identitu", "save": "Uložit identitu",
"cancel": "Zrušit", "cancel": "Zrušit",
"creating": "Vytváření...", "creating": "Vytváření...",
"updating": "Aktualizování..." "updating": "Aktualizování...",
"signature_store_default": "Výchozí podpis",
"signature_store_mapping": "Mapování podpisů",
"signature_store_reply": "Podpis pro odpověď",
"use_global_default": "Použít globální výchozí nastavení"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Použít subadresu", "button_tooltip": "Použít subadresu",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {Importován 1 kontakt} few {Importovány # kontakty} other {Importováno # kontaktů}}", "success": "{count, plural, one {Importován 1 kontakt} few {Importovány # kontakty} other {Importováno # kontaktů}}",
"failed": "Import selhal", "failed": "Import selhal",
"close": "Zavřít", "close": "Zavřít",
"file_too_large": "Soubor je příliš velký (max. 5 MB)" "file_too_large": "Soubor je příliš velký (max. 5 MB)",
"csv_address": "Adresa",
"csv_address_book": "Adresář",
"csv_back": "Zpět",
"csv_city": "Město",
"csv_company": "Společnost",
"csv_country": "Země",
"csv_email": "E-mail",
"csv_first_name": "Jméno",
"csv_ignore": "Ignorovat tento sloupec",
"csv_job_title": "Pracovní pozice",
"csv_last_name": "Příjmení",
"csv_load_all": "Načíst vše",
"csv_map_columns": "Mapování sloupců",
"csv_nickname": "Přezdívka",
"csv_note": "Poznámka",
"csv_phone": "Telefon",
"csv_postcode": "PSČ",
"csv_preview": "Náhled",
"csv_preview_title": "Náhled ({count, plural, one {# řádek} other {# řádků}})",
"csv_region": "Stát/kraj",
"csv_website": "Webové stránky",
"file_types_csv": "soubory .csv"
}, },
"export": { "export": {
"title": "Exportovat kontakty", "title": "Exportovat kontakty",
@@ -2569,7 +2635,10 @@
"has_phone": "Má telefon", "has_phone": "Má telefon",
"has_photo": "Má fotku" "has_photo": "Má fotku"
}, },
"open_categories": "Otevřít kategorie" "open_categories": "Otevřít kategorie",
"delete": "Odstranit",
"edit": "Upravit",
"send_email": "Odeslat e-mail"
}, },
"calendar": { "calendar": {
"title": "Kalendář", "title": "Kalendář",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Otevřít nabídku" "nav_open_menu": "Otevřít nabídku",
"delete": "Odstranit",
"duplicate": "Duplikovat",
"edit": "Upravit",
"freeBusy": {
"busy": "Obsazeno",
"check": "Zkontrolovat dostupnost",
"click_to_select": "Kliknutím na volný termín vyberte tento čas",
"free": "Volno",
"hide": "Skrýt dostupnost",
"loading": "Načítání...",
"no_participants": "Přidejte účastníky pro kontrolu dostupnosti.",
"tentative": "Nezávazně",
"timezone": "Časové pásmo",
"title": "Dostupnost",
"unavailable": "Mimo kancelář",
"unknown": "Žádné informace"
},
"resources": {
"clear_all": "Vymazat vše",
"filter_all": "Vše",
"hide": "Skrýt zdroje",
"no_resources": "Nejsou k dispozici žádné zdroje",
"remove": "Odebrat {name}",
"search_placeholder": "Hledat zdroje...",
"title": "Zdroje",
"type_equipment": "Vybavení",
"type_other": "Jiné",
"type_room": "Místnosti",
"type_vehicle": "Vozidla"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Pokročilé hledání", "title": "Pokročilé hledání",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Otevřít strom složek", "open_folder_tree": "Otevřít strom složek",
"other_accounts": "Ostatní účty", "other_accounts": "Ostatní účty",
"migration_title": "Aktualizace vašich souborů…", "migration_title": "Aktualizace vašich souborů…",
"migration_description": "Uspořádání složek a souborů do správné struktury. Toto proběhne pouze jednou." "migration_description": "Uspořádání složek a souborů do správné struktury. Toto proběhne pouze jednou.",
"send_as_attachment": "Odeslat jako přílohu"
}, },
"smime": { "smime": {
"your_certificates": "Vaše certifikáty", "your_certificates": "Vaše certifikáty",
@@ -3308,7 +3408,14 @@
"readWrite": "Čtení a zápis", "readWrite": "Čtení a zápis",
"manager": "Správce", "manager": "Správce",
"custom": "Vlastní" "custom": "Vlastní"
} },
"accept": "Přijmout",
"decline": "Odmítnout",
"no_shares_by_me": "Zatím jste nic nesdíleli.",
"no_shares_with_me": "Zatím s vámi nikdo nesdílel žádné složky.",
"shared_by": "Sdílí",
"tab_shared_by_me": "Sdíleno mnou",
"tab_shared_with_me": "Sdíleno se mnou"
}, },
"quote_header": { "quote_header": {
"reply_line": "Dne {date} napsal(a) {from}:", "reply_line": "Dne {date} napsal(a) {from}:",
@@ -3324,5 +3431,55 @@
"install": "Nainstalovat", "install": "Nainstalovat",
"dont_remind": "Už mi to nepřipomínat", "dont_remind": "Už mi to nepřipomínat",
"dismiss_aria": "Zavřít výzvu k instalaci" "dismiss_aria": "Zavřít výzvu k instalaci"
},
"signatures": {
"add_signature": "Přidat podpis",
"default": "Výchozí",
"default_signature": {
"description": "Použije se pro nové zprávy, pokud není přepsáno pro danou identitu.",
"label": "Výchozí podpis"
},
"delete_message": "Opravdu chcete odstranit \"{name}\"? Tuto akci nelze vrátit zpět.",
"delete_title": "Odstranit podpis?",
"description": "Vytvářejte a spravujte e-mailové podpisy pro psaní zpráv nebo odpovědi.",
"duplicate": "Duplikovat",
"edit_signature": "Upravit podpis",
"editor_label": "Podpis",
"html_preview_label": "Náhled HTML",
"name_label": "Název",
"name_placeholder": "např. Práce, Osobní",
"name_required": "Název je vyžadován",
"new_signature": "Nový podpis",
"no_signature": "Bez podpisu",
"no_signatures": "Zatím nejsou žádné podpisy",
"per_identity_signatures": {
"description": "Přepsat výchozí podpis a podpis pro odpověď pro jednotlivé identity.",
"label": "Podpisy podle identity"
},
"plain_text_preview_label": "Náhled prostého textu",
"reply": "Odpověď",
"reply_signature": {
"description": "Použije se při odpovídání nebo přeposílání, pokud není přepsáno pro danou identitu.",
"label": "Podpis pro odpověď"
},
"show_editor": "Zobrazit editor",
"show_preview": "Zobrazit náhled",
"title": "Podpisy",
"toolbar": {
"align_center": "Na střed",
"align_left": "Zarovnat vlevo",
"align_right": "Zarovnat vpravo",
"bold": "Tučné",
"bullet_list": "Odrážkový seznam",
"italic": "Kurzíva",
"link": "Odkaz",
"ordered_list": "Číslovaný seznam",
"remove_color": "Odebrat barvu",
"strikethrough": "Přeškrtnuté",
"text_color": "Barva textu",
"underline": "Podtržené"
},
"use_global_default": "Použít globální výchozí nastavení",
"your_signatures": "Vaše podpisy ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Kopieret!", "copied": "Kopieret!",
"copy_failed": "Kunne ikke kopiere" "copy_failed": "Kunne ikke kopiere"
}, },
"send_now": "Send nu" "send_now": "Send nu",
"create_appointment": "Create Appointment"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Læsekvittering anmodet (klik for at deaktivere)", "read_receipt_on": "Læsekvittering anmodet (klik for at deaktivere)",
@@ -712,7 +713,10 @@
"delete_table": "Slet tabel", "delete_table": "Slet tabel",
"pick_size": "Vælg størrelse" "pick_size": "Vælg størrelse"
}, },
"send_filing_warning": "Sendt - men oprydningen bagefter mislykkedes, en forældet kladde kan blive stående." "send_filing_warning": "Sendt - men oprydningen bagefter mislykkedes, en forældet kladde kan blive stående.",
"insert_signature": "Insert signature",
"no_signature": "No signature",
"select_signature": "Select signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Bekræft", "confirm": "Bekræft",
@@ -891,7 +895,10 @@
"downloads": "Downloads", "downloads": "Downloads",
"content_senders": "Indhold & afsendere", "content_senders": "Indhold & afsendere",
"about_data": "Om & data", "about_data": "Om & data",
"debug": "Debug" "debug": "Debug",
"import": "Import",
"sharing": "Sharing",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "Generelt", "general": "Generelt",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Tilbage til min konto", "back": "Tilbage til min konto",
"managing": "Administrerer: {name}" "managing": "Administrerer: {name}"
} },
"importer": {
"action_label": "Import",
"cancel": "Cancel",
"choose_files": "Choose files",
"conflict_copy": "Keep both",
"conflict_description": "Choose what to do when an imported message already exists.",
"conflict_label": "Duplicate handling",
"conflict_replace": "Replace duplicates",
"conflict_skip": "Skip duplicates",
"description": "Import email messages from .eml files into a folder.",
"error_details": "{count, plural, one {# error} other {# errors}}",
"fail": "Import failed",
"file_description": "Select one or more .eml files to import.",
"file_label": "Files",
"files_selected": "{count, plural, one {# file selected} other {# files selected}}",
"folder_description": "Choose the folder to import messages into.",
"folder_label": "Destination folder",
"import_complete": "Import complete",
"import_more": "Import more",
"importing": "Importing...",
"progress_failed": "{count} failed",
"progress_imported": "{count} imported",
"progress_skipped": "{count} skipped",
"start_import": "{count, plural, one {Import # file} other {Import # files}}",
"success": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_failed": "{count, plural, one {# message failed} other {# messages failed}}",
"summary_imported": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_skipped": "{count, plural, one {# message skipped} other {# messages skipped}}",
"title": "Import Mail"
},
"loading": "Loading...",
"refresh": "Refresh"
}, },
"errors": { "errors": {
"page_error_title": "Noget gik galt", "page_error_title": "Noget gik galt",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Kunne ikke omdøbe mappe", "toast_error_rename": "Kunne ikke omdøbe mappe",
"toast_error_delete": "Kunne ikke slette mappe", "toast_error_delete": "Kunne ikke slette mappe",
"toast_error_delete_has_children": "Mappen har undermapper. Fjern dem først.", "toast_error_delete_has_children": "Mappen har undermapper. Fjern dem først.",
"toast_error_delete_has_email": "Mappen er ikke tom. Tøm den først." "toast_error_delete_has_email": "Mappen er ikke tom. Tøm den først.",
"share_folder": "Share Folder..."
}, },
"shortcuts": { "shortcuts": {
"title": "Tastaturgenveje", "title": "Tastaturgenveje",
@@ -2184,7 +2224,11 @@
"save": "Gem identitet", "save": "Gem identitet",
"cancel": "Annuller", "cancel": "Annuller",
"creating": "Opretter...", "creating": "Opretter...",
"updating": "Opdaterer..." "updating": "Opdaterer...",
"signature_store_default": "Default signature",
"signature_store_mapping": "Signature mapping",
"signature_store_reply": "Reply signature",
"use_global_default": "Use global default"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Brug underadresse", "button_tooltip": "Brug underadresse",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 kontakt importeret} other {# kontakter importeret}}", "success": "{count, plural, one {1 kontakt importeret} other {# kontakter importeret}}",
"failed": "Import mislykkedes", "failed": "Import mislykkedes",
"close": "Luk", "close": "Luk",
"file_too_large": "Filen er for stor (max 5 MB)" "file_too_large": "Filen er for stor (max 5 MB)",
"csv_address": "Address",
"csv_address_book": "Address book",
"csv_back": "Back",
"csv_city": "City",
"csv_company": "Company",
"csv_country": "Country",
"csv_email": "Email",
"csv_first_name": "First name",
"csv_ignore": "Ignore this column",
"csv_job_title": "Job title",
"csv_last_name": "Last name",
"csv_load_all": "Load all",
"csv_map_columns": "Map columns",
"csv_nickname": "Nickname",
"csv_note": "Note",
"csv_phone": "Phone",
"csv_postcode": "Postal code",
"csv_preview": "Preview",
"csv_preview_title": "Preview ({count, plural, one {# row} other {# rows}})",
"csv_region": "State/Region",
"csv_website": "Website",
"file_types_csv": ".csv files"
}, },
"export": { "export": {
"title": "Eksportér kontakter", "title": "Eksportér kontakter",
@@ -2569,7 +2635,10 @@
"has_phone": "Har telefon", "has_phone": "Har telefon",
"has_photo": "Har billede" "has_photo": "Har billede"
}, },
"open_categories": "Åbn kategorier" "open_categories": "Åbn kategorier",
"delete": "Delete",
"edit": "Edit",
"send_email": "Send email"
}, },
"calendar": { "calendar": {
"title": "Kalender", "title": "Kalender",
@@ -2988,7 +3057,37 @@
"due_tomorrow": "I morgen", "due_tomorrow": "I morgen",
"overdue": "Forfalden" "overdue": "Forfalden"
}, },
"nav_open_menu": "Åbn menu" "nav_open_menu": "Åbn menu",
"delete": "Delete",
"duplicate": "Duplicate",
"edit": "Edit",
"freeBusy": {
"busy": "Busy",
"check": "Check Availability",
"click_to_select": "Click a free slot to select this time",
"free": "Free",
"hide": "Hide Availability",
"loading": "Loading...",
"no_participants": "Add participants to check availability.",
"tentative": "Tentative",
"timezone": "Timezone",
"title": "Availability",
"unavailable": "Out of office",
"unknown": "No information"
},
"resources": {
"clear_all": "Clear all",
"filter_all": "All",
"hide": "Hide resources",
"no_resources": "No resources available",
"remove": "Remove {name}",
"search_placeholder": "Search resources...",
"title": "Resources",
"type_equipment": "Equipment",
"type_other": "Other",
"type_room": "Rooms",
"type_vehicle": "Vehicles"
}
}, },
"sharing": { "sharing": {
"title": "Del \"{name}\"", "title": "Del \"{name}\"",
@@ -3011,7 +3110,14 @@
"readWrite": "Læs & skriv", "readWrite": "Læs & skriv",
"manager": "Administrator", "manager": "Administrator",
"custom": "Brugerdefineret" "custom": "Brugerdefineret"
} },
"accept": "Accept",
"decline": "Decline",
"no_shares_by_me": "You haven't shared anything yet.",
"no_shares_with_me": "No folders shared with you yet.",
"shared_by": "Shared by",
"tab_shared_by_me": "Shared by me",
"tab_shared_with_me": "Shared with me"
}, },
"advanced_search": { "advanced_search": {
"title": "Avanceret søgning", "title": "Avanceret søgning",
@@ -3176,7 +3282,8 @@
"open_folder_tree": "Åbn mappetræ", "open_folder_tree": "Åbn mappetræ",
"other_accounts": "Andre konti", "other_accounts": "Andre konti",
"migration_title": "Opdaterer dine filer…", "migration_title": "Opdaterer dine filer…",
"migration_description": "Organiserer mapper og filer i deres rette struktur. Dette sker kun én gang." "migration_description": "Organiserer mapper og filer i deres rette struktur. Dette sker kun én gang.",
"send_as_attachment": "Send as Attachment"
}, },
"smime": { "smime": {
"your_certificates": "Dine certifikater", "your_certificates": "Dine certifikater",
@@ -3324,5 +3431,55 @@
"install": "Installer", "install": "Installer",
"dont_remind": "Påmind mig ikke igen", "dont_remind": "Påmind mig ikke igen",
"dismiss_aria": "Afvis installationsprompt" "dismiss_aria": "Afvis installationsprompt"
},
"signatures": {
"add_signature": "Add signature",
"default": "Default",
"default_signature": {
"description": "Used for new messages unless overridden per identity.",
"label": "Default signature"
},
"delete_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.",
"delete_title": "Delete signature?",
"description": "Create and manage email signatures to use when composing or replying.",
"duplicate": "Duplicate",
"edit_signature": "Edit signature",
"editor_label": "Signature",
"html_preview_label": "HTML preview",
"name_label": "Name",
"name_placeholder": "e.g., Work, Personal",
"name_required": "Name is required",
"new_signature": "New signature",
"no_signature": "No signature",
"no_signatures": "No signatures yet",
"per_identity_signatures": {
"description": "Override the default and reply signature for individual identities.",
"label": "Per-identity signatures"
},
"plain_text_preview_label": "Plain text preview",
"reply": "Reply",
"reply_signature": {
"description": "Used when replying or forwarding unless overridden per identity.",
"label": "Reply signature"
},
"show_editor": "Show editor",
"show_preview": "Show preview",
"title": "Signatures",
"toolbar": {
"align_center": "Align center",
"align_left": "Align left",
"align_right": "Align right",
"bold": "Bold",
"bullet_list": "Bullet list",
"italic": "Italic",
"link": "Link",
"ordered_list": "Ordered list",
"remove_color": "Remove color",
"strikethrough": "Strikethrough",
"text_color": "Text color",
"underline": "Underline"
},
"use_global_default": "Use global default",
"your_signatures": "Your signatures ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Kopiert!", "copied": "Kopiert!",
"copy_failed": "Kopieren fehlgeschlagen" "copy_failed": "Kopieren fehlgeschlagen"
}, },
"send_now": "Jetzt senden" "send_now": "Jetzt senden",
"create_appointment": "Termin erstellen"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Lesebestätigung angefordert (klicken zum Deaktivieren)", "read_receipt_on": "Lesebestätigung angefordert (klicken zum Deaktivieren)",
@@ -712,7 +713,10 @@
"delete_table": "Tabelle löschen", "delete_table": "Tabelle löschen",
"pick_size": "Größe wählen" "pick_size": "Größe wählen"
}, },
"send_filing_warning": "Gesendet - aber das Aufräumen danach schlug fehl, evtl. bleibt ein alter Entwurf sichtbar." "send_filing_warning": "Gesendet - aber das Aufräumen danach schlug fehl, evtl. bleibt ein alter Entwurf sichtbar.",
"insert_signature": "Signatur einfügen",
"no_signature": "Keine Signatur",
"select_signature": "Signatur auswählen"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Bestätigen", "confirm": "Bestätigen",
@@ -888,7 +892,10 @@
"downloads": "Downloads", "downloads": "Downloads",
"content_senders": "Inhalte & Absender", "content_senders": "Inhalte & Absender",
"about_data": "Über & Daten", "about_data": "Über & Daten",
"debug": "Debug" "debug": "Debug",
"import": "Import",
"sharing": "Freigabe",
"signatures": "Signaturen"
}, },
"tab_groups": { "tab_groups": {
"general": "Allgemein", "general": "Allgemein",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Zurück zu meinem Konto", "back": "Zurück zu meinem Konto",
"managing": "Verwaltung: {name}" "managing": "Verwaltung: {name}"
} },
"importer": {
"action_label": "Importieren",
"cancel": "Abbrechen",
"choose_files": "Dateien auswählen",
"conflict_copy": "Beide behalten",
"conflict_description": "Legen Sie fest, was geschehen soll, wenn eine importierte Nachricht bereits existiert.",
"conflict_label": "Umgang mit Duplikaten",
"conflict_replace": "Duplikate ersetzen",
"conflict_skip": "Duplikate überspringen",
"description": "Importieren Sie E-Mail-Nachrichten aus .eml-Dateien in einen Ordner.",
"error_details": "{count, plural, one {# Fehler} other {# Fehler}}",
"fail": "Import fehlgeschlagen",
"file_description": "Wählen Sie eine oder mehrere .eml-Dateien zum Importieren aus.",
"file_label": "Dateien",
"files_selected": "{count, plural, one {# Datei ausgewählt} other {# Dateien ausgewählt}}",
"folder_description": "Wählen Sie den Ordner, in den die Nachrichten importiert werden sollen.",
"folder_label": "Zielordner",
"import_complete": "Import abgeschlossen",
"import_more": "Weitere importieren",
"importing": "Wird importiert...",
"progress_failed": "{count} fehlgeschlagen",
"progress_imported": "{count} importiert",
"progress_skipped": "{count} übersprungen",
"start_import": "{count, plural, one {# Datei importieren} other {# Dateien importieren}}",
"success": "{count, plural, one {# Nachricht importiert} other {# Nachrichten importiert}}",
"summary_failed": "{count, plural, one {# Nachricht fehlgeschlagen} other {# Nachrichten fehlgeschlagen}}",
"summary_imported": "{count, plural, one {# Nachricht importiert} other {# Nachrichten importiert}}",
"summary_skipped": "{count, plural, one {# Nachricht übersprungen} other {# Nachrichten übersprungen}}",
"title": "E-Mail importieren"
},
"loading": "Lädt...",
"refresh": "Aktualisieren"
}, },
"errors": { "errors": {
"page_error_title": "Etwas ist schiefgelaufen", "page_error_title": "Etwas ist schiefgelaufen",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Ordner konnte nicht umbenannt werden", "toast_error_rename": "Ordner konnte nicht umbenannt werden",
"toast_error_delete": "Ordner konnte nicht gelöscht werden", "toast_error_delete": "Ordner konnte nicht gelöscht werden",
"toast_error_delete_has_children": "Ordner enthält Unterordner. Entferne diese zuerst.", "toast_error_delete_has_children": "Ordner enthält Unterordner. Entferne diese zuerst.",
"toast_error_delete_has_email": "Ordner ist nicht leer. Leere ihn zuerst." "toast_error_delete_has_email": "Ordner ist nicht leer. Leere ihn zuerst.",
"share_folder": "Ordner freigeben..."
}, },
"shortcuts": { "shortcuts": {
"title": "Tastaturkürzel", "title": "Tastaturkürzel",
@@ -2184,7 +2224,11 @@
"save": "Identität speichern", "save": "Identität speichern",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"creating": "Wird erstellt...", "creating": "Wird erstellt...",
"updating": "Wird aktualisiert..." "updating": "Wird aktualisiert...",
"signature_store_default": "Standardsignatur",
"signature_store_mapping": "Signaturzuordnung",
"signature_store_reply": "Antwortsignatur",
"use_global_default": "Globalen Standard verwenden"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Sub-Adresse verwenden", "button_tooltip": "Sub-Adresse verwenden",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 Kontakt importiert} other {# Kontakte importiert}}", "success": "{count, plural, one {1 Kontakt importiert} other {# Kontakte importiert}}",
"failed": "Import fehlgeschlagen", "failed": "Import fehlgeschlagen",
"close": "Schließen", "close": "Schließen",
"file_too_large": "Datei ist zu groß (max. 5 MB)" "file_too_large": "Datei ist zu groß (max. 5 MB)",
"csv_address": "Adresse",
"csv_address_book": "Adressbuch",
"csv_back": "Zurück",
"csv_city": "Stadt",
"csv_company": "Firma",
"csv_country": "Land",
"csv_email": "E-Mail",
"csv_first_name": "Vorname",
"csv_ignore": "Diese Spalte ignorieren",
"csv_job_title": "Berufsbezeichnung",
"csv_last_name": "Nachname",
"csv_load_all": "Alle laden",
"csv_map_columns": "Spalten zuordnen",
"csv_nickname": "Spitzname",
"csv_note": "Notiz",
"csv_phone": "Telefon",
"csv_postcode": "Postleitzahl",
"csv_preview": "Vorschau",
"csv_preview_title": "Vorschau ({count, plural, one {# Zeile} other {# Zeilen}})",
"csv_region": "Bundesland/Region",
"csv_website": "Webseite",
"file_types_csv": ".csv-Dateien"
}, },
"export": { "export": {
"title": "Kontakte exportieren", "title": "Kontakte exportieren",
@@ -2569,7 +2635,10 @@
"has_phone": "Mit Telefon", "has_phone": "Mit Telefon",
"has_photo": "Mit Foto" "has_photo": "Mit Foto"
}, },
"open_categories": "Kategorien öffnen" "open_categories": "Kategorien öffnen",
"delete": "Löschen",
"edit": "Bearbeiten",
"send_email": "E-Mail senden"
}, },
"calendar": { "calendar": {
"title": "Kalender", "title": "Kalender",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Menü öffnen" "nav_open_menu": "Menü öffnen",
"delete": "Löschen",
"duplicate": "Duplizieren",
"edit": "Bearbeiten",
"freeBusy": {
"busy": "Beschäftigt",
"check": "Verfügbarkeit prüfen",
"click_to_select": "Klicken Sie auf einen freien Termin, um diese Zeit auszuwählen",
"free": "Frei",
"hide": "Verfügbarkeit ausblenden",
"loading": "Lädt...",
"no_participants": "Fügen Sie Teilnehmer hinzu, um die Verfügbarkeit zu prüfen.",
"tentative": "Vorläufig",
"timezone": "Zeitzone",
"title": "Verfügbarkeit",
"unavailable": "Abwesend",
"unknown": "Keine Informationen"
},
"resources": {
"clear_all": "Alle entfernen",
"filter_all": "Alle",
"hide": "Ressourcen ausblenden",
"no_resources": "Keine Ressourcen verfügbar",
"remove": "{name} entfernen",
"search_placeholder": "Ressourcen suchen...",
"title": "Ressourcen",
"type_equipment": "Ausrüstung",
"type_other": "Sonstige",
"type_room": "Räume",
"type_vehicle": "Fahrzeuge"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Erweiterte Suche", "title": "Erweiterte Suche",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Ordnerbaum öffnen", "open_folder_tree": "Ordnerbaum öffnen",
"other_accounts": "Andere Konten", "other_accounts": "Andere Konten",
"migration_title": "Ihre Dateien werden aktualisiert…", "migration_title": "Ihre Dateien werden aktualisiert…",
"migration_description": "Ordner und Dateien werden in die richtige Struktur gebracht. Dies geschieht nur einmal." "migration_description": "Ordner und Dateien werden in die richtige Struktur gebracht. Dies geschieht nur einmal.",
"send_as_attachment": "Als Anhang senden"
}, },
"smime": { "smime": {
"your_certificates": "Ihre Zertifikate", "your_certificates": "Ihre Zertifikate",
@@ -3308,7 +3408,14 @@
"readWrite": "Lesen & schreiben", "readWrite": "Lesen & schreiben",
"manager": "Verwalten", "manager": "Verwalten",
"custom": "Benutzerdefiniert" "custom": "Benutzerdefiniert"
} },
"accept": "Annehmen",
"decline": "Ablehnen",
"no_shares_by_me": "Sie haben noch nichts freigegeben.",
"no_shares_with_me": "Es wurden Ihnen noch keine Ordner freigegeben.",
"shared_by": "Freigegeben von",
"tab_shared_by_me": "Von mir freigegeben",
"tab_shared_with_me": "Für mich freigegeben"
}, },
"quote_header": { "quote_header": {
"reply_line": "Am {date} schrieb {from}:", "reply_line": "Am {date} schrieb {from}:",
@@ -3324,5 +3431,55 @@
"install": "Installieren", "install": "Installieren",
"dont_remind": "Nicht mehr erinnern", "dont_remind": "Nicht mehr erinnern",
"dismiss_aria": "Installationshinweis schließen" "dismiss_aria": "Installationshinweis schließen"
},
"signatures": {
"add_signature": "Signatur hinzufügen",
"default": "Standard",
"default_signature": {
"description": "Wird für neue Nachrichten verwendet, sofern nicht pro Identität überschrieben.",
"label": "Standardsignatur"
},
"delete_message": "Möchten Sie \"{name}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
"delete_title": "Signatur löschen?",
"description": "Erstellen und verwalten Sie E-Mail-Signaturen zum Verfassen und Antworten.",
"duplicate": "Duplizieren",
"edit_signature": "Signatur bearbeiten",
"editor_label": "Signatur",
"html_preview_label": "HTML-Vorschau",
"name_label": "Name",
"name_placeholder": "z. B. Arbeit, Privat",
"name_required": "Name ist erforderlich",
"new_signature": "Neue Signatur",
"no_signature": "Keine Signatur",
"no_signatures": "Noch keine Signaturen vorhanden",
"per_identity_signatures": {
"description": "Überschreiben Sie die Standard- und Antwortsignatur für einzelne Identitäten.",
"label": "Signaturen pro Identität"
},
"plain_text_preview_label": "Nur-Text-Vorschau",
"reply": "Antwort",
"reply_signature": {
"description": "Wird beim Antworten oder Weiterleiten verwendet, sofern nicht pro Identität überschrieben.",
"label": "Antwortsignatur"
},
"show_editor": "Editor anzeigen",
"show_preview": "Vorschau anzeigen",
"title": "Signaturen",
"toolbar": {
"align_center": "Zentriert",
"align_left": "Linksbündig",
"align_right": "Rechtsbündig",
"bold": "Fett",
"bullet_list": "Aufzählung",
"italic": "Kursiv",
"link": "Link",
"ordered_list": "Nummerierte Liste",
"remove_color": "Farbe entfernen",
"strikethrough": "Durchgestrichen",
"text_color": "Textfarbe",
"underline": "Unterstrichen"
},
"use_global_default": "Globalen Standard verwenden",
"your_signatures": "Ihre Signaturen ({count})"
} }
} }
+124 -6
View File
@@ -713,7 +713,10 @@
"delete_table": "Delete table", "delete_table": "Delete table",
"pick_size": "Pick size" "pick_size": "Pick size"
}, },
"send_filing_warning": "Sent - but the post-send cleanup failed, a stale draft may remain." "send_filing_warning": "Sent - but the post-send cleanup failed, a stale draft may remain.",
"insert_signature": "Insert signature",
"no_signature": "No signature",
"select_signature": "Select signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirm", "confirm": "Confirm",
@@ -894,7 +897,8 @@
"about_data": "About & Data", "about_data": "About & Data",
"import": "Import", "import": "Import",
"sharing": "Sharing", "sharing": "Sharing",
"debug": "Debug" "debug": "Debug",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "General", "general": "General",
@@ -2010,6 +2014,38 @@
"preview": { "preview": {
"label": "Preview" "label": "Preview"
} }
},
"loading": "Loading...",
"refresh": "Refresh",
"importer": {
"title": "Import Mail",
"description": "Import email messages from .eml files into a folder.",
"file_label": "Files",
"file_description": "Select one or more .eml files to import.",
"choose_files": "Choose files",
"files_selected": "{count, plural, one {# file selected} other {# files selected}}",
"folder_label": "Destination folder",
"folder_description": "Choose the folder to import messages into.",
"conflict_label": "Duplicate handling",
"conflict_description": "Choose what to do when an imported message already exists.",
"conflict_skip": "Skip duplicates",
"conflict_replace": "Replace duplicates",
"conflict_copy": "Keep both",
"action_label": "Import",
"start_import": "{count, plural, one {Import # file} other {Import # files}}",
"importing": "Importing...",
"cancel": "Cancel",
"progress_imported": "{count} imported",
"progress_skipped": "{count} skipped",
"progress_failed": "{count} failed",
"import_complete": "Import complete",
"summary_imported": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_skipped": "{count, plural, one {# message skipped} other {# messages skipped}}",
"summary_failed": "{count, plural, one {# message failed} other {# messages failed}}",
"error_details": "{count, plural, one {# error} other {# errors}}",
"import_more": "Import more",
"fail": "Import failed",
"success": "{count, plural, one {# message imported} other {# messages imported}}"
} }
}, },
"errors": { "errors": {
@@ -2188,7 +2224,11 @@
"save": "Save Identity", "save": "Save Identity",
"cancel": "Cancel", "cancel": "Cancel",
"creating": "Creating...", "creating": "Creating...",
"updating": "Updating..." "updating": "Updating...",
"signature_store_mapping": "Signature mapping",
"signature_store_default": "Default signature",
"signature_store_reply": "Reply signature",
"use_global_default": "Use global default"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Use sub-address", "button_tooltip": "Use sub-address",
@@ -2515,7 +2555,29 @@
"success": "{count, plural, one {1 contact imported} other {# contacts imported}}", "success": "{count, plural, one {1 contact imported} other {# contacts imported}}",
"failed": "Import failed", "failed": "Import failed",
"close": "Close", "close": "Close",
"file_too_large": "File is too large (max 5 MB)" "file_too_large": "File is too large (max 5 MB)",
"csv_first_name": "First name",
"csv_last_name": "Last name",
"csv_email": "Email",
"csv_phone": "Phone",
"csv_company": "Company",
"csv_job_title": "Job title",
"csv_address": "Address",
"csv_city": "City",
"csv_region": "State/Region",
"csv_postcode": "Postal code",
"csv_country": "Country",
"csv_website": "Website",
"csv_note": "Note",
"csv_nickname": "Nickname",
"csv_map_columns": "Map columns",
"csv_ignore": "Ignore this column",
"csv_address_book": "Address book",
"csv_preview": "Preview",
"csv_preview_title": "Preview ({count, plural, one {# row} other {# rows}})",
"csv_back": "Back",
"csv_load_all": "Load all",
"file_types_csv": ".csv files"
}, },
"export": { "export": {
"title": "Export Contacts", "title": "Export Contacts",
@@ -2573,7 +2635,10 @@
"has_email": "Has email", "has_email": "Has email",
"has_phone": "Has phone", "has_phone": "Has phone",
"has_photo": "Has photo" "has_photo": "Has photo"
} },
"edit": "Edit",
"delete": "Delete",
"send_email": "Send email"
}, },
"calendar": { "calendar": {
"title": "Calendar", "title": "Calendar",
@@ -3019,7 +3084,10 @@
"no_resources": "No resources available", "no_resources": "No resources available",
"remove": "Remove {name}", "remove": "Remove {name}",
"clear_all": "Clear all" "clear_all": "Clear all"
} },
"edit": "Edit",
"delete": "Delete",
"duplicate": "Duplicate"
}, },
"sharing": { "sharing": {
"title": "Share \"{name}\"", "title": "Share \"{name}\"",
@@ -3363,5 +3431,55 @@
"install": "Install", "install": "Install",
"dont_remind": "Don't remind me again", "dont_remind": "Don't remind me again",
"dismiss_aria": "Dismiss install prompt" "dismiss_aria": "Dismiss install prompt"
},
"signatures": {
"title": "Signatures",
"description": "Create and manage email signatures to use when composing or replying.",
"default_signature": {
"label": "Default signature",
"description": "Used for new messages unless overridden per identity."
},
"reply_signature": {
"label": "Reply signature",
"description": "Used when replying or forwarding unless overridden per identity."
},
"per_identity_signatures": {
"label": "Per-identity signatures",
"description": "Override the default and reply signature for individual identities."
},
"use_global_default": "Use global default",
"default": "Default",
"reply": "Reply",
"your_signatures": "Your signatures ({count})",
"add_signature": "Add signature",
"no_signatures": "No signatures yet",
"no_signature": "No signature",
"duplicate": "Duplicate",
"delete_title": "Delete signature?",
"delete_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.",
"new_signature": "New signature",
"edit_signature": "Edit signature",
"name_label": "Name",
"name_placeholder": "e.g., Work, Personal",
"name_required": "Name is required",
"editor_label": "Signature",
"show_editor": "Show editor",
"show_preview": "Show preview",
"html_preview_label": "HTML preview",
"plain_text_preview_label": "Plain text preview",
"toolbar": {
"bold": "Bold",
"italic": "Italic",
"underline": "Underline",
"strikethrough": "Strikethrough",
"text_color": "Text color",
"remove_color": "Remove color",
"bullet_list": "Bullet list",
"ordered_list": "Ordered list",
"align_left": "Align left",
"align_center": "Align center",
"align_right": "Align right",
"link": "Link"
}
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "¡Copiado!", "copied": "¡Copiado!",
"copy_failed": "Error al copiar" "copy_failed": "Error al copiar"
}, },
"send_now": "Enviar ahora" "send_now": "Enviar ahora",
"create_appointment": "Create Appointment"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Confirmación de lectura solicitada (haz clic para desactivar)", "read_receipt_on": "Confirmación de lectura solicitada (haz clic para desactivar)",
@@ -712,7 +713,10 @@
"delete_table": "Eliminar tabla", "delete_table": "Eliminar tabla",
"pick_size": "Elegir tamaño" "pick_size": "Elegir tamaño"
}, },
"send_filing_warning": "Enviado - pero la limpieza posterior falló, puede quedar un borrador obsoleto." "send_filing_warning": "Enviado - pero la limpieza posterior falló, puede quedar un borrador obsoleto.",
"insert_signature": "Insert signature",
"no_signature": "No signature",
"select_signature": "Select signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirmar", "confirm": "Confirmar",
@@ -888,7 +892,10 @@
"downloads": "Descargas", "downloads": "Descargas",
"content_senders": "Contenido y remitentes", "content_senders": "Contenido y remitentes",
"about_data": "Acerca de y datos", "about_data": "Acerca de y datos",
"debug": "Depuración" "debug": "Depuración",
"import": "Import",
"sharing": "Sharing",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "General", "general": "General",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Volver a mi cuenta", "back": "Volver a mi cuenta",
"managing": "Gestionando: {name}" "managing": "Gestionando: {name}"
} },
"importer": {
"action_label": "Import",
"cancel": "Cancel",
"choose_files": "Choose files",
"conflict_copy": "Keep both",
"conflict_description": "Choose what to do when an imported message already exists.",
"conflict_label": "Duplicate handling",
"conflict_replace": "Replace duplicates",
"conflict_skip": "Skip duplicates",
"description": "Import email messages from .eml files into a folder.",
"error_details": "{count, plural, one {# error} other {# errors}}",
"fail": "Import failed",
"file_description": "Select one or more .eml files to import.",
"file_label": "Files",
"files_selected": "{count, plural, one {# file selected} other {# files selected}}",
"folder_description": "Choose the folder to import messages into.",
"folder_label": "Destination folder",
"import_complete": "Import complete",
"import_more": "Import more",
"importing": "Importing...",
"progress_failed": "{count} failed",
"progress_imported": "{count} imported",
"progress_skipped": "{count} skipped",
"start_import": "{count, plural, one {Import # file} other {Import # files}}",
"success": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_failed": "{count, plural, one {# message failed} other {# messages failed}}",
"summary_imported": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_skipped": "{count, plural, one {# message skipped} other {# messages skipped}}",
"title": "Import Mail"
},
"loading": "Loading...",
"refresh": "Refresh"
}, },
"errors": { "errors": {
"page_error_title": "Algo salió mal", "page_error_title": "Algo salió mal",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "La carpeta no está vacía. Vacíela primero.", "toast_error_delete_has_email": "La carpeta no está vacía. Vacíela primero.",
"placeholder_folder_name": "Nombre de carpeta", "placeholder_folder_name": "Nombre de carpeta",
"create": "Crear", "create": "Crear",
"rename_confirm": "Renombrar" "rename_confirm": "Renombrar",
"share_folder": "Share Folder..."
}, },
"shortcuts": { "shortcuts": {
"title": "Atajos de Teclado", "title": "Atajos de Teclado",
@@ -2184,7 +2224,11 @@
"save": "Guardar Identidad", "save": "Guardar Identidad",
"cancel": "Cancelar", "cancel": "Cancelar",
"creating": "Creando...", "creating": "Creando...",
"updating": "Actualizando..." "updating": "Actualizando...",
"signature_store_default": "Default signature",
"signature_store_mapping": "Signature mapping",
"signature_store_reply": "Reply signature",
"use_global_default": "Use global default"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Usar sub-dirección", "button_tooltip": "Usar sub-dirección",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 contacto importado} other {# contactos importados}}", "success": "{count, plural, one {1 contacto importado} other {# contactos importados}}",
"failed": "Error en la importación", "failed": "Error en la importación",
"close": "Cerrar", "close": "Cerrar",
"file_too_large": "El archivo es demasiado grande (máx. 5 MB)" "file_too_large": "El archivo es demasiado grande (máx. 5 MB)",
"csv_address": "Address",
"csv_address_book": "Address book",
"csv_back": "Back",
"csv_city": "City",
"csv_company": "Company",
"csv_country": "Country",
"csv_email": "Email",
"csv_first_name": "First name",
"csv_ignore": "Ignore this column",
"csv_job_title": "Job title",
"csv_last_name": "Last name",
"csv_load_all": "Load all",
"csv_map_columns": "Map columns",
"csv_nickname": "Nickname",
"csv_note": "Note",
"csv_phone": "Phone",
"csv_postcode": "Postal code",
"csv_preview": "Preview",
"csv_preview_title": "Preview ({count, plural, one {# row} other {# rows}})",
"csv_region": "State/Region",
"csv_website": "Website",
"file_types_csv": ".csv files"
}, },
"export": { "export": {
"title": "Exportar contactos", "title": "Exportar contactos",
@@ -2569,7 +2635,10 @@
"has_phone": "Con teléfono", "has_phone": "Con teléfono",
"has_photo": "Con foto" "has_photo": "Con foto"
}, },
"open_categories": "Abrir categorías" "open_categories": "Abrir categorías",
"delete": "Delete",
"edit": "Edit",
"send_email": "Send email"
}, },
"calendar": { "calendar": {
"title": "Calendario", "title": "Calendario",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Abrir menú" "nav_open_menu": "Abrir menú",
"delete": "Delete",
"duplicate": "Duplicate",
"edit": "Edit",
"freeBusy": {
"busy": "Busy",
"check": "Check Availability",
"click_to_select": "Click a free slot to select this time",
"free": "Free",
"hide": "Hide Availability",
"loading": "Loading...",
"no_participants": "Add participants to check availability.",
"tentative": "Tentative",
"timezone": "Timezone",
"title": "Availability",
"unavailable": "Out of office",
"unknown": "No information"
},
"resources": {
"clear_all": "Clear all",
"filter_all": "All",
"hide": "Hide resources",
"no_resources": "No resources available",
"remove": "Remove {name}",
"search_placeholder": "Search resources...",
"title": "Resources",
"type_equipment": "Equipment",
"type_other": "Other",
"type_room": "Rooms",
"type_vehicle": "Vehicles"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Búsqueda avanzada", "title": "Búsqueda avanzada",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Abrir árbol de carpetas", "open_folder_tree": "Abrir árbol de carpetas",
"other_accounts": "Otras cuentas", "other_accounts": "Otras cuentas",
"migration_title": "Actualizando tus archivos…", "migration_title": "Actualizando tus archivos…",
"migration_description": "Organizando carpetas y archivos en su estructura adecuada. Esto solo ocurre una vez." "migration_description": "Organizando carpetas y archivos en su estructura adecuada. Esto solo ocurre una vez.",
"send_as_attachment": "Send as Attachment"
}, },
"smime": { "smime": {
"your_certificates": "Tus certificados", "your_certificates": "Tus certificados",
@@ -3308,7 +3408,14 @@
"readWrite": "Lectura y escritura", "readWrite": "Lectura y escritura",
"manager": "Administrador", "manager": "Administrador",
"custom": "Personalizado" "custom": "Personalizado"
} },
"accept": "Accept",
"decline": "Decline",
"no_shares_by_me": "You haven't shared anything yet.",
"no_shares_with_me": "No folders shared with you yet.",
"shared_by": "Shared by",
"tab_shared_by_me": "Shared by me",
"tab_shared_with_me": "Shared with me"
}, },
"quote_header": { "quote_header": {
"reply_line": "El {date}, {from} escribió:", "reply_line": "El {date}, {from} escribió:",
@@ -3324,5 +3431,55 @@
"install": "Instalar", "install": "Instalar",
"dont_remind": "No volver a recordármelo", "dont_remind": "No volver a recordármelo",
"dismiss_aria": "Cerrar aviso de instalación" "dismiss_aria": "Cerrar aviso de instalación"
},
"signatures": {
"add_signature": "Add signature",
"default": "Default",
"default_signature": {
"description": "Used for new messages unless overridden per identity.",
"label": "Default signature"
},
"delete_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.",
"delete_title": "Delete signature?",
"description": "Create and manage email signatures to use when composing or replying.",
"duplicate": "Duplicate",
"edit_signature": "Edit signature",
"editor_label": "Signature",
"html_preview_label": "HTML preview",
"name_label": "Name",
"name_placeholder": "e.g., Work, Personal",
"name_required": "Name is required",
"new_signature": "New signature",
"no_signature": "No signature",
"no_signatures": "No signatures yet",
"per_identity_signatures": {
"description": "Override the default and reply signature for individual identities.",
"label": "Per-identity signatures"
},
"plain_text_preview_label": "Plain text preview",
"reply": "Reply",
"reply_signature": {
"description": "Used when replying or forwarding unless overridden per identity.",
"label": "Reply signature"
},
"show_editor": "Show editor",
"show_preview": "Show preview",
"title": "Signatures",
"toolbar": {
"align_center": "Align center",
"align_left": "Align left",
"align_right": "Align right",
"bold": "Bold",
"bullet_list": "Bullet list",
"italic": "Italic",
"link": "Link",
"ordered_list": "Ordered list",
"remove_color": "Remove color",
"strikethrough": "Strikethrough",
"text_color": "Text color",
"underline": "Underline"
},
"use_global_default": "Use global default",
"your_signatures": "Your signatures ({count})"
} }
} }
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "کپی شد!", "copied": "کپی شد!",
"copy_failed": "کپی ناموفق بود" "copy_failed": "کپی ناموفق بود"
}, },
"send_now": "ارسال فوری" "send_now": "ارسال فوری",
"create_appointment": "Create Appointment"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "درخواست تأیید خواندن فعال (کلیک برای غیرفعال کردن)", "read_receipt_on": "درخواست تأیید خواندن فعال (کلیک برای غیرفعال کردن)",
@@ -712,7 +713,10 @@
"delete_table": "حذف جدول", "delete_table": "حذف جدول",
"pick_size": "انتخاب اندازه" "pick_size": "انتخاب اندازه"
}, },
"send_filing_warning": "ارسال شد - اما پاک‌سازی پس از ارسال ناموفق بود، ممکن است پیش‌نویس قدیمی باقی بماند." "send_filing_warning": "ارسال شد - اما پاک‌سازی پس از ارسال ناموفق بود، ممکن است پیش‌نویس قدیمی باقی بماند.",
"insert_signature": "Insert signature",
"no_signature": "No signature",
"select_signature": "Select signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "تأیید", "confirm": "تأیید",
@@ -891,7 +895,10 @@
"downloads": "دانلودها", "downloads": "دانلودها",
"content_senders": "محتوا و فرستندگان", "content_senders": "محتوا و فرستندگان",
"about_data": "درباره و داده‌ها", "about_data": "درباره و داده‌ها",
"debug": "اشکال‌زدایی" "debug": "اشکال‌زدایی",
"import": "Import",
"sharing": "Sharing",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "عمومی", "general": "عمومی",
@@ -2007,7 +2014,39 @@
"preview": { "preview": {
"label": "پیش‌نمایش" "label": "پیش‌نمایش"
} }
} },
"importer": {
"action_label": "Import",
"cancel": "Cancel",
"choose_files": "Choose files",
"conflict_copy": "Keep both",
"conflict_description": "Choose what to do when an imported message already exists.",
"conflict_label": "Duplicate handling",
"conflict_replace": "Replace duplicates",
"conflict_skip": "Skip duplicates",
"description": "Import email messages from .eml files into a folder.",
"error_details": "{count, plural, one {# error} other {# errors}}",
"fail": "Import failed",
"file_description": "Select one or more .eml files to import.",
"file_label": "Files",
"files_selected": "{count, plural, one {# file selected} other {# files selected}}",
"folder_description": "Choose the folder to import messages into.",
"folder_label": "Destination folder",
"import_complete": "Import complete",
"import_more": "Import more",
"importing": "Importing...",
"progress_failed": "{count} failed",
"progress_imported": "{count} imported",
"progress_skipped": "{count} skipped",
"start_import": "{count, plural, one {Import # file} other {Import # files}}",
"success": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_failed": "{count, plural, one {# message failed} other {# messages failed}}",
"summary_imported": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_skipped": "{count, plural, one {# message skipped} other {# messages skipped}}",
"title": "Import Mail"
},
"loading": "Loading...",
"refresh": "Refresh"
}, },
"errors": { "errors": {
"page_error_title": "مشکلی پیش آمد", "page_error_title": "مشکلی پیش آمد",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "خطای تغییر نام", "toast_error_rename": "خطای تغییر نام",
"toast_error_delete": "خطای حذف", "toast_error_delete": "خطای حذف",
"toast_error_delete_has_children": "زیرپوشه دارد", "toast_error_delete_has_children": "زیرپوشه دارد",
"toast_error_delete_has_email": "خالی نیست" "toast_error_delete_has_email": "خالی نیست",
"share_folder": "Share Folder..."
}, },
"shortcuts": { "shortcuts": {
"title": "میانبرهای صفحه کلید", "title": "میانبرهای صفحه کلید",
@@ -2184,7 +2224,11 @@
"save": "ذخیره هویت", "save": "ذخیره هویت",
"cancel": "انصراف", "cancel": "انصراف",
"creating": "در حال ایجاد...", "creating": "در حال ایجاد...",
"updating": "در حال به‌روزرسانی..." "updating": "در حال به‌روزرسانی...",
"signature_store_default": "Default signature",
"signature_store_mapping": "Signature mapping",
"signature_store_reply": "Reply signature",
"use_global_default": "Use global default"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "استفاده از زیرآدرس", "button_tooltip": "استفاده از زیرآدرس",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {۱ مخاطب وارد شد} other {# مخاطب وارد شد}}", "success": "{count, plural, one {۱ مخاطب وارد شد} other {# مخاطب وارد شد}}",
"failed": "وارد کردن ناموفق بود", "failed": "وارد کردن ناموفق بود",
"close": "بستن", "close": "بستن",
"file_too_large": "حجم فایل بیش از حد است (حداکثر ۵ مگابایت)" "file_too_large": "حجم فایل بیش از حد است (حداکثر ۵ مگابایت)",
"csv_address": "Address",
"csv_address_book": "Address book",
"csv_back": "Back",
"csv_city": "City",
"csv_company": "Company",
"csv_country": "Country",
"csv_email": "Email",
"csv_first_name": "First name",
"csv_ignore": "Ignore this column",
"csv_job_title": "Job title",
"csv_last_name": "Last name",
"csv_load_all": "Load all",
"csv_map_columns": "Map columns",
"csv_nickname": "Nickname",
"csv_note": "Note",
"csv_phone": "Phone",
"csv_postcode": "Postal code",
"csv_preview": "Preview",
"csv_preview_title": "Preview ({count, plural, one {# row} other {# rows}})",
"csv_region": "State/Region",
"csv_website": "Website",
"file_types_csv": ".csv files"
}, },
"export": { "export": {
"title": "خروجی مخاطبین", "title": "خروجی مخاطبین",
@@ -2569,7 +2635,10 @@
"has_email": "دارای ایمیل", "has_email": "دارای ایمیل",
"has_phone": "دارای تلفن", "has_phone": "دارای تلفن",
"has_photo": "دارای عکس" "has_photo": "دارای عکس"
} },
"delete": "Delete",
"edit": "Edit",
"send_email": "Send email"
}, },
"calendar": { "calendar": {
"title": "تقویم", "title": "تقویم",
@@ -2988,6 +3057,36 @@
"due_today": "امروز", "due_today": "امروز",
"due_tomorrow": "فردا", "due_tomorrow": "فردا",
"overdue": "عقب‌افتاده" "overdue": "عقب‌افتاده"
},
"delete": "Delete",
"duplicate": "Duplicate",
"edit": "Edit",
"freeBusy": {
"busy": "Busy",
"check": "Check Availability",
"click_to_select": "Click a free slot to select this time",
"free": "Free",
"hide": "Hide Availability",
"loading": "Loading...",
"no_participants": "Add participants to check availability.",
"tentative": "Tentative",
"timezone": "Timezone",
"title": "Availability",
"unavailable": "Out of office",
"unknown": "No information"
},
"resources": {
"clear_all": "Clear all",
"filter_all": "All",
"hide": "Hide resources",
"no_resources": "No resources available",
"remove": "Remove {name}",
"search_placeholder": "Search resources...",
"title": "Resources",
"type_equipment": "Equipment",
"type_other": "Other",
"type_room": "Rooms",
"type_vehicle": "Vehicles"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "خواندن و نوشتن", "readWrite": "خواندن و نوشتن",
"manager": "مدیر", "manager": "مدیر",
"custom": "سفارشی" "custom": "سفارشی"
} },
"accept": "Accept",
"decline": "Decline",
"no_shares_by_me": "You haven't shared anything yet.",
"no_shares_with_me": "No folders shared with you yet.",
"shared_by": "Shared by",
"tab_shared_by_me": "Shared by me",
"tab_shared_with_me": "Shared with me"
}, },
"advanced_search": { "advanced_search": {
"title": "جستجوی پیشرفته", "title": "جستجوی پیشرفته",
@@ -3176,7 +3282,8 @@
"disabled_description": "بارگذاری فایل‌های حجیم از طریق WebDAV می‌تواند باعث ناپایداری سرور شود.", "disabled_description": "بارگذاری فایل‌های حجیم از طریق WebDAV می‌تواند باعث ناپایداری سرور شود.",
"stability_warning": "بارگذاری فایل‌های حجیم می‌تواند باعث ناپایداری سرور شود. با احتیاط استفاده کنید.", "stability_warning": "بارگذاری فایل‌های حجیم می‌تواند باعث ناپایداری سرور شود. با احتیاط استفاده کنید.",
"migration_title": "در حال به‌روزرسانی فایل‌های شما…", "migration_title": "در حال به‌روزرسانی فایل‌های شما…",
"migration_description": "سازمان‌دهی پوشه‌ها و فایل‌ها در ساختار مناسب. فقط یک بار انجام می‌شود." "migration_description": "سازمان‌دهی پوشه‌ها و فایل‌ها در ساختار مناسب. فقط یک بار انجام می‌شود.",
"send_as_attachment": "Send as Attachment"
}, },
"smime": { "smime": {
"your_certificates": "گواهی‌های شما", "your_certificates": "گواهی‌های شما",
@@ -3324,5 +3431,55 @@
"install": "نصب", "install": "نصب",
"dont_remind": "دیگر یادآوری نکن", "dont_remind": "دیگر یادآوری نکن",
"dismiss_aria": "رد کردن پیشنهاد نصب" "dismiss_aria": "رد کردن پیشنهاد نصب"
},
"signatures": {
"add_signature": "Add signature",
"default": "Default",
"default_signature": {
"description": "Used for new messages unless overridden per identity.",
"label": "Default signature"
},
"delete_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.",
"delete_title": "Delete signature?",
"description": "Create and manage email signatures to use when composing or replying.",
"duplicate": "Duplicate",
"edit_signature": "Edit signature",
"editor_label": "Signature",
"html_preview_label": "HTML preview",
"name_label": "Name",
"name_placeholder": "e.g., Work, Personal",
"name_required": "Name is required",
"new_signature": "New signature",
"no_signature": "No signature",
"no_signatures": "No signatures yet",
"per_identity_signatures": {
"description": "Override the default and reply signature for individual identities.",
"label": "Per-identity signatures"
},
"plain_text_preview_label": "Plain text preview",
"reply": "Reply",
"reply_signature": {
"description": "Used when replying or forwarding unless overridden per identity.",
"label": "Reply signature"
},
"show_editor": "Show editor",
"show_preview": "Show preview",
"title": "Signatures",
"toolbar": {
"align_center": "Align center",
"align_left": "Align left",
"align_right": "Align right",
"bold": "Bold",
"bullet_list": "Bullet list",
"italic": "Italic",
"link": "Link",
"ordered_list": "Ordered list",
"remove_color": "Remove color",
"strikethrough": "Strikethrough",
"text_color": "Text color",
"underline": "Underline"
},
"use_global_default": "Use global default",
"your_signatures": "Your signatures ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Copié !", "copied": "Copié !",
"copy_failed": "Échec de la copie" "copy_failed": "Échec de la copie"
}, },
"send_now": "Envoyer maintenant" "send_now": "Envoyer maintenant",
"create_appointment": "Créer un rendez-vous"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Accusé de lecture demandé (cliquez pour désactiver)", "read_receipt_on": "Accusé de lecture demandé (cliquez pour désactiver)",
@@ -712,7 +713,10 @@
"delete_table": "Supprimer le tableau", "delete_table": "Supprimer le tableau",
"pick_size": "Choisir la taille" "pick_size": "Choisir la taille"
}, },
"send_filing_warning": "Envoyé - mais le nettoyage après envoi a échoué, un ancien brouillon peut subsister." "send_filing_warning": "Envoyé - mais le nettoyage après envoi a échoué, un ancien brouillon peut subsister.",
"insert_signature": "Insérer une signature",
"no_signature": "Aucune signature",
"select_signature": "Sélectionner une signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirmer", "confirm": "Confirmer",
@@ -888,7 +892,10 @@
"downloads": "Téléchargements", "downloads": "Téléchargements",
"content_senders": "Contenu et expéditeurs", "content_senders": "Contenu et expéditeurs",
"about_data": "À propos et données", "about_data": "À propos et données",
"debug": "Débogage" "debug": "Débogage",
"import": "Importation",
"sharing": "Partage",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "Général", "general": "Général",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Retour à mon compte", "back": "Retour à mon compte",
"managing": "Gestion : {name}" "managing": "Gestion : {name}"
} },
"importer": {
"action_label": "Importer",
"cancel": "Annuler",
"choose_files": "Choisir des fichiers",
"conflict_copy": "Conserver les deux",
"conflict_description": "Choisissez l'action à effectuer lorsqu'un message importé existe déjà.",
"conflict_label": "Gestion des doublons",
"conflict_replace": "Remplacer les doublons",
"conflict_skip": "Ignorer les doublons",
"description": "Importez des messages e-mail à partir de fichiers .eml vers un dossier.",
"error_details": "{count, plural, one {# erreur} other {# erreurs}}",
"fail": "Échec de l'importation",
"file_description": "Sélectionnez un ou plusieurs fichiers .eml à importer.",
"file_label": "Fichiers",
"files_selected": "{count, plural, one {# fichier sélectionné} other {# fichiers sélectionnés}}",
"folder_description": "Choisissez le dossier dans lequel importer les messages.",
"folder_label": "Dossier de destination",
"import_complete": "Importation terminée",
"import_more": "Importer d'autres fichiers",
"importing": "Importation en cours...",
"progress_failed": "{count} échoués",
"progress_imported": "{count} importés",
"progress_skipped": "{count} ignorés",
"start_import": "{count, plural, one {Importer # fichier} other {Importer # fichiers}}",
"success": "{count, plural, one {# message importé} other {# messages importés}}",
"summary_failed": "{count, plural, one {# message en échec} other {# messages en échec}}",
"summary_imported": "{count, plural, one {# message importé} other {# messages importés}}",
"summary_skipped": "{count, plural, one {# message ignoré} other {# messages ignorés}}",
"title": "Importation de courrier"
},
"loading": "Chargement...",
"refresh": "Actualiser"
}, },
"errors": { "errors": {
"page_error_title": "Une erreur s'est produite", "page_error_title": "Une erreur s'est produite",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Le dossier n'est pas vide. Videz-le d'abord.", "toast_error_delete_has_email": "Le dossier n'est pas vide. Videz-le d'abord.",
"placeholder_folder_name": "Nom du dossier", "placeholder_folder_name": "Nom du dossier",
"create": "Créer", "create": "Créer",
"rename_confirm": "Renommer" "rename_confirm": "Renommer",
"share_folder": "Partager le dossier..."
}, },
"shortcuts": { "shortcuts": {
"title": "Raccourcis clavier", "title": "Raccourcis clavier",
@@ -2184,7 +2224,11 @@
"save": "Enregistrer l'identité", "save": "Enregistrer l'identité",
"cancel": "Annuler", "cancel": "Annuler",
"creating": "Création...", "creating": "Création...",
"updating": "Mise à jour..." "updating": "Mise à jour...",
"signature_store_default": "Signature par défaut",
"signature_store_mapping": "Association de signatures",
"signature_store_reply": "Signature de réponse",
"use_global_default": "Utiliser la valeur par défaut globale"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Utiliser le sous-adressage", "button_tooltip": "Utiliser le sous-adressage",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 contact importé} other {# contacts importés}}", "success": "{count, plural, one {1 contact importé} other {# contacts importés}}",
"failed": "Échec de l'importation", "failed": "Échec de l'importation",
"close": "Fermer", "close": "Fermer",
"file_too_large": "Fichier trop volumineux (max 5 Mo)" "file_too_large": "Fichier trop volumineux (max 5 Mo)",
"csv_address": "Adresse",
"csv_address_book": "Carnet d'adresses",
"csv_back": "Retour",
"csv_city": "Ville",
"csv_company": "Société",
"csv_country": "Pays",
"csv_email": "E-mail",
"csv_first_name": "Prénom",
"csv_ignore": "Ignorer cette colonne",
"csv_job_title": "Fonction",
"csv_last_name": "Nom",
"csv_load_all": "Tout charger",
"csv_map_columns": "Associer les colonnes",
"csv_nickname": "Surnom",
"csv_note": "Note",
"csv_phone": "Téléphone",
"csv_postcode": "Code postal",
"csv_preview": "Aperçu",
"csv_preview_title": "Aperçu ({count, plural, one {# ligne} other {# lignes}})",
"csv_region": "État/Région",
"csv_website": "Site web",
"file_types_csv": "fichiers .csv"
}, },
"export": { "export": {
"title": "Exporter les contacts", "title": "Exporter les contacts",
@@ -2569,7 +2635,10 @@
"has_phone": "Avec téléphone", "has_phone": "Avec téléphone",
"has_photo": "Avec photo" "has_photo": "Avec photo"
}, },
"open_categories": "Ouvrir les catégories" "open_categories": "Ouvrir les catégories",
"delete": "Supprimer",
"edit": "Modifier",
"send_email": "Envoyer un e-mail"
}, },
"calendar": { "calendar": {
"title": "Calendrier", "title": "Calendrier",
@@ -2988,7 +3057,37 @@
"due_tomorrow": "Échéance demain", "due_tomorrow": "Échéance demain",
"overdue": "En retard" "overdue": "En retard"
}, },
"nav_open_menu": "Ouvrir le menu" "nav_open_menu": "Ouvrir le menu",
"delete": "Supprimer",
"duplicate": "Dupliquer",
"edit": "Modifier",
"freeBusy": {
"busy": "Occupé",
"check": "Vérifier la disponibilité",
"click_to_select": "Cliquez sur un créneau libre pour sélectionner cette heure",
"free": "Libre",
"hide": "Masquer la disponibilité",
"loading": "Chargement...",
"no_participants": "Ajoutez des participants pour vérifier la disponibilité.",
"tentative": "Provisoire",
"timezone": "Fuseau horaire",
"title": "Disponibilité",
"unavailable": "Absent du bureau",
"unknown": "Aucune information"
},
"resources": {
"clear_all": "Tout effacer",
"filter_all": "Toutes",
"hide": "Masquer les ressources",
"no_resources": "Aucune ressource disponible",
"remove": "Retirer {name}",
"search_placeholder": "Rechercher des ressources...",
"title": "Ressources",
"type_equipment": "Équipement",
"type_other": "Autre",
"type_room": "Salles",
"type_vehicle": "Véhicules"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Recherche avancée", "title": "Recherche avancée",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Ouvrir l'arborescence des dossiers", "open_folder_tree": "Ouvrir l'arborescence des dossiers",
"other_accounts": "Autres comptes", "other_accounts": "Autres comptes",
"migration_title": "Mise à jour de vos fichiers…", "migration_title": "Mise à jour de vos fichiers…",
"migration_description": "Organisation des dossiers et fichiers dans leur structure appropriée. Cela ne se produit qu'une seule fois." "migration_description": "Organisation des dossiers et fichiers dans leur structure appropriée. Cela ne se produit qu'une seule fois.",
"send_as_attachment": "Envoyer en pièce jointe"
}, },
"smime": { "smime": {
"your_certificates": "Vos certificats", "your_certificates": "Vos certificats",
@@ -3308,7 +3408,14 @@
"readWrite": "Lecture & écriture", "readWrite": "Lecture & écriture",
"manager": "Gestionnaire", "manager": "Gestionnaire",
"custom": "Personnalisé" "custom": "Personnalisé"
} },
"accept": "Accepter",
"decline": "Refuser",
"no_shares_by_me": "Vous n'avez encore rien partagé.",
"no_shares_with_me": "Aucun dossier n'a encore été partagé avec vous.",
"shared_by": "Partagé par",
"tab_shared_by_me": "Partagé par moi",
"tab_shared_with_me": "Partagé avec moi"
}, },
"quote_header": { "quote_header": {
"reply_line": "Le {date}, {from} a écrit :", "reply_line": "Le {date}, {from} a écrit :",
@@ -3324,5 +3431,55 @@
"install": "Installer", "install": "Installer",
"dont_remind": "Ne plus me le rappeler", "dont_remind": "Ne plus me le rappeler",
"dismiss_aria": "Fermer l'invite d'installation" "dismiss_aria": "Fermer l'invite d'installation"
},
"signatures": {
"add_signature": "Ajouter une signature",
"default": "Par défaut",
"default_signature": {
"description": "Utilisée pour les nouveaux messages, sauf si remplacée par identité.",
"label": "Signature par défaut"
},
"delete_message": "Êtes-vous sûr de vouloir supprimer \"{name}\" ? Cette action est irréversible.",
"delete_title": "Supprimer la signature ?",
"description": "Créez et gérez des signatures e-mail à utiliser lors de la rédaction ou de la réponse.",
"duplicate": "Dupliquer",
"edit_signature": "Modifier la signature",
"editor_label": "Signature",
"html_preview_label": "Aperçu HTML",
"name_label": "Nom",
"name_placeholder": "p. ex. Travail, Personnel",
"name_required": "Le nom est requis",
"new_signature": "Nouvelle signature",
"no_signature": "Aucune signature",
"no_signatures": "Aucune signature pour le moment",
"per_identity_signatures": {
"description": "Remplacez la signature par défaut et de réponse pour des identités individuelles.",
"label": "Signatures par identité"
},
"plain_text_preview_label": "Aperçu en texte brut",
"reply": "Réponse",
"reply_signature": {
"description": "Utilisée lors d'une réponse ou d'un transfert, sauf si remplacée par identité.",
"label": "Signature de réponse"
},
"show_editor": "Afficher l'éditeur",
"show_preview": "Afficher l'aperçu",
"title": "Signatures",
"toolbar": {
"align_center": "Centrer",
"align_left": "Aligner à gauche",
"align_right": "Aligner à droite",
"bold": "Gras",
"bullet_list": "Liste à puces",
"italic": "Italique",
"link": "Lien",
"ordered_list": "Liste numérotée",
"remove_color": "Supprimer la couleur",
"strikethrough": "Barré",
"text_color": "Couleur du texte",
"underline": "Souligné"
},
"use_global_default": "Utiliser la valeur par défaut globale",
"your_signatures": "Vos signatures ({count})"
} }
} }
+167 -10
View File
@@ -532,7 +532,8 @@
"copied": "הועתק!", "copied": "הועתק!",
"copy_failed": "העתקה נכשלה" "copy_failed": "העתקה נכשלה"
}, },
"send_now": "שלח עכשיו" "send_now": "שלח עכשיו",
"create_appointment": "צור פגישה"
}, },
"email_composer": { "email_composer": {
"new_message": "הודעה חדשה", "new_message": "הודעה חדשה",
@@ -677,7 +678,10 @@
"delete_table": "מחיקת טבלה", "delete_table": "מחיקת טבלה",
"pick_size": "בחירת גודל" "pick_size": "בחירת גודל"
}, },
"send_filing_warning": "נשלח - אך הניקוי שלאחר השליחה נכשל, ייתכן שתישאר טיוטה ישנה." "send_filing_warning": "נשלח - אך הניקוי שלאחר השליחה נכשל, ייתכן שתישאר טיוטה ישנה.",
"insert_signature": "הוסף חתימה",
"no_signature": "ללא חתימה",
"select_signature": "בחר חתימה"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "אשר", "confirm": "אשר",
@@ -853,7 +857,10 @@
"downloads": "הורדות", "downloads": "הורדות",
"content_senders": "תוכן ושולחים", "content_senders": "תוכן ושולחים",
"about_data": "בערך וגדול", "about_data": "בערך וגדול",
"debug": "ניפוי שגיאות" "debug": "ניפוי שגיאות",
"import": "ייבוא",
"sharing": "שיתוף",
"signatures": "חתימות"
}, },
"tab_groups": { "tab_groups": {
"general": "כללי", "general": "כללי",
@@ -1973,7 +1980,39 @@
"archive": "העבר לארכיון", "archive": "העבר לארכיון",
"trash": "העבר לאשפה" "trash": "העבר לאשפה"
} }
} },
"importer": {
"action_label": "ייבוא",
"cancel": "ביטול",
"choose_files": "בחר קבצים",
"conflict_copy": "שמור את שניהם",
"conflict_description": "בחר מה לעשות כאשר הודעה מיובאת כבר קיימת.",
"conflict_label": "טיפול בכפילויות",
"conflict_replace": "החלף כפילויות",
"conflict_skip": "דלג על כפילויות",
"description": "ייבא הודעות דוא״ל מקבצי .eml לתוך תיקייה.",
"error_details": "{count, plural, one {שגיאה אחת} other {# שגיאות}}",
"fail": "הייבוא נכשל",
"file_description": "בחר קובץ .eml אחד או יותר לייבוא.",
"file_label": "קבצים",
"files_selected": "{count, plural, one {קובץ אחד נבחר} other {# קבצים נבחרו}}",
"folder_description": "בחר את התיקייה לייבוא ההודעות אליה.",
"folder_label": "תיקיית יעד",
"import_complete": "הייבוא הושלם",
"import_more": "ייבא עוד",
"importing": "מייבא...",
"progress_failed": "{count} נכשלו",
"progress_imported": "{count} יובאו",
"progress_skipped": "{count} דולגו",
"start_import": "{count, plural, one {ייבא קובץ אחד} other {ייבא # קבצים}}",
"success": "{count, plural, one {הודעה אחת יובאה} other {# הודעות יובאו}}",
"summary_failed": "{count, plural, one {הודעה אחת נכשלה} other {# הודעות נכשלו}}",
"summary_imported": "{count, plural, one {הודעה אחת יובאה} other {# הודעות יובאו}}",
"summary_skipped": "{count, plural, one {הודעה אחת דולגה} other {# הודעות דולגו}}",
"title": "ייבוא דואר"
},
"loading": "טוען...",
"refresh": "רענן"
}, },
"errors": { "errors": {
"page_error_title": "משהו השתבש", "page_error_title": "משהו השתבש",
@@ -2112,7 +2151,11 @@
"creating": "יוצר...", "creating": "יוצר...",
"updating": "מעדכן...", "updating": "מעדכן...",
"signature_byte_counter": "{bytes} / {max} בתים", "signature_byte_counter": "{bytes} / {max} בתים",
"signature_byte_limit_reached": "הגבול של השרת הושג" "signature_byte_limit_reached": "הגבול של השרת הושג",
"signature_store_default": "חתימת ברירת מחדל",
"signature_store_mapping": "מיפוי חתימות",
"signature_store_reply": "חתימת תשובה",
"use_global_default": "השתמש בברירת המחדל הגלובלית"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "השתמש בכתובת משנה", "button_tooltip": "השתמש בכתובת משנה",
@@ -2424,7 +2467,29 @@
"success": "{count, plural, one {יובא איש קשר אחד} other {יובאו # אנשי קשר}}", "success": "{count, plural, one {יובא איש קשר אחד} other {יובאו # אנשי קשר}}",
"failed": "הייבוא נכשל", "failed": "הייבוא נכשל",
"close": "לִסְגוֹר", "close": "לִסְגוֹר",
"file_too_large": "הקובץ גדול מדי (מקסימום 5MB)" "file_too_large": "הקובץ גדול מדי (מקסימום 5MB)",
"csv_address": "כתובת",
"csv_address_book": "ספר כתובות",
"csv_back": "חזרה",
"csv_city": "עיר",
"csv_company": "חברה",
"csv_country": "מדינה",
"csv_email": "דוא״ל",
"csv_first_name": "שם פרטי",
"csv_ignore": "התעלם מעמודה זו",
"csv_job_title": "תפקיד עבודה",
"csv_last_name": "שם משפחה",
"csv_load_all": "טען הכל",
"csv_map_columns": "מיפוי עמודות",
"csv_nickname": "כינוי",
"csv_note": "הערה",
"csv_phone": "טלפון",
"csv_postcode": "מיקוד",
"csv_preview": "תצוגה מקדימה",
"csv_preview_title": "תצוגה מקדימה ({count, plural, one {שורה אחת} other {# שורות}})",
"csv_region": "מדינה/אזור",
"csv_website": "אתר",
"file_types_csv": "קבצי .csv"
}, },
"export": { "export": {
"title": "ייצוא אנשי קשר", "title": "ייצוא אנשי קשר",
@@ -2497,7 +2562,10 @@
"has_email": "יש דוא״ל", "has_email": "יש דוא״ל",
"has_phone": "יש טלפון", "has_phone": "יש טלפון",
"has_photo": "יש תמונה" "has_photo": "יש תמונה"
} },
"delete": "מחק",
"edit": "ערוך",
"send_email": "שלח דוא״ל"
}, },
"calendar": { "calendar": {
"title": "לוח שנה", "title": "לוח שנה",
@@ -2916,6 +2984,36 @@
"subscribe_title": "הירשם", "subscribe_title": "הירשם",
"subscribe_description": "שמור את הלוח שנה הזה בסנכרון אוטומטי כלוח שנה נפרד.", "subscribe_description": "שמור את הלוח שנה הזה בסנכרון אוטומטי כלוח שנה נפרד.",
"cancel": "בטל" "cancel": "בטל"
},
"delete": "מחק",
"duplicate": "שכפל",
"edit": "ערוך",
"freeBusy": {
"busy": "תפוס",
"check": "בדוק זמינות",
"click_to_select": "לחץ על משבצת פנויה כדי לבחור את השעה הזו",
"free": "חופשי",
"hide": "הסתר זמינות",
"loading": "טוען...",
"no_participants": "הוסף משתתפים כדי לבדוק זמינות.",
"tentative": "טנטטיבי",
"timezone": "אזור זמן",
"title": "זמינות",
"unavailable": "מחוץ למשרד",
"unknown": "אין מידע"
},
"resources": {
"clear_all": "נקה הכל",
"filter_all": "הכל",
"hide": "הסתר משאבים",
"no_resources": "אין משאבים זמינים",
"remove": "הסר {name}",
"search_placeholder": "חיפוש משאבים...",
"title": "משאבים",
"type_equipment": "ציוד",
"type_other": "אחר",
"type_room": "חדרים",
"type_vehicle": "כלי רכב"
} }
}, },
"advanced_search": { "advanced_search": {
@@ -3081,7 +3179,8 @@
"shared_by": "משותף על ידי {name}", "shared_by": "משותף על ידי {name}",
"open_folder_tree": "פתח עץ תיקייה", "open_folder_tree": "פתח עץ תיקייה",
"migration_title": "עדכון הקבצים שלך…", "migration_title": "עדכון הקבצים שלך…",
"migration_description": "ארגון תיקיות וקבצים לתוך המבנה הנכון שלהם. זה קורה רק פעם אחת." "migration_description": "ארגון תיקיות וקבצים לתוך המבנה הנכון שלהם. זה קורה רק פעם אחת.",
"send_as_attachment": "שלח כקובץ מצורף"
}, },
"smime": { "smime": {
"your_certificates": "התעודות שלך", "your_certificates": "התעודות שלך",
@@ -3283,7 +3382,8 @@
"toast_error_rename": "נכשל בשינוי שם תיקייה", "toast_error_rename": "נכשל בשינוי שם תיקייה",
"toast_error_delete": "נכשל במחיקת תיקייה", "toast_error_delete": "נכשל במחיקת תיקייה",
"toast_error_delete_has_children": "לתיקייה יש תת־תיקיות. הסר אותן קודם.", "toast_error_delete_has_children": "לתיקייה יש תת־תיקיות. הסר אותן קודם.",
"toast_error_delete_has_email": "התיקייה אינה ריקה. תרוקנה קודם." "toast_error_delete_has_email": "התיקייה אינה ריקה. תרוקנה קודם.",
"share_folder": "שתף תיקייה..."
}, },
"sharing": { "sharing": {
"title": "שתף \"{name}\"", "title": "שתף \"{name}\"",
@@ -3306,7 +3406,14 @@
"readWrite": "קרא וכתוב", "readWrite": "קרא וכתוב",
"manager": "מנהל", "manager": "מנהל",
"custom": "מותאם אישית" "custom": "מותאם אישית"
} },
"accept": "קבל",
"decline": "דחה",
"no_shares_by_me": "עדיין לא שיתפת שום דבר.",
"no_shares_with_me": "עדיין אין תיקיות ששותפו איתך.",
"shared_by": "משותף על ידי",
"tab_shared_by_me": "השיתופים שלי",
"tab_shared_with_me": "משותף איתי"
}, },
"unified_mailbox": { "unified_mailbox": {
"search_unavailable": "חיפוש אינו זמין בתצוגה המאוחדת" "search_unavailable": "חיפוש אינו זמין בתצוגה המאוחדת"
@@ -3325,5 +3432,55 @@
"install": "התקן", "install": "התקן",
"dont_remind": "אל תזכיר לי שוב", "dont_remind": "אל תזכיר לי שוב",
"dismiss_aria": "בטל הודעת התקנה" "dismiss_aria": "בטל הודעת התקנה"
},
"signatures": {
"add_signature": "הוסף חתימה",
"default": "ברירת מחדל",
"default_signature": {
"description": "משמש עבור הודעות חדשות, אלא אם נעקף עבור זהות ספציפית.",
"label": "חתימת ברירת מחדל"
},
"delete_message": "האם אתה בטוח שברצונך למחוק את \"{name}\"? לא ניתן לבטל פעולה זו.",
"delete_title": "למחוק חתימה?",
"description": "צור ונהל חתימות דוא״ל לשימוש בעת כתיבה או מענה.",
"duplicate": "שכפל",
"edit_signature": "ערוך חתימה",
"editor_label": "חתימה",
"html_preview_label": "תצוגה מקדימה של HTML",
"name_label": "שם",
"name_placeholder": "למשל, עבודה, אישי",
"name_required": "נדרש שם",
"new_signature": "חתימה חדשה",
"no_signature": "ללא חתימה",
"no_signatures": "עדיין אין חתימות",
"per_identity_signatures": {
"description": "עקוף את חתימת ברירת המחדל וחתימת התשובה עבור זהויות בודדות.",
"label": "חתימות לפי זהות"
},
"plain_text_preview_label": "תצוגה מקדימה של טקסט רגיל",
"reply": "תשובה",
"reply_signature": {
"description": "משמש בעת מענה או העברה, אלא אם נעקף עבור זהות ספציפית.",
"label": "חתימת תשובה"
},
"show_editor": "הצג עורך",
"show_preview": "הצג תצוגה מקדימה",
"title": "חתימות",
"toolbar": {
"align_center": "מרכוז",
"align_left": "יישור לשמאל",
"align_right": "יישור לימין",
"bold": "מודגש",
"bullet_list": "רשימת תבליטים",
"italic": "נטוי",
"link": "קישור",
"ordered_list": "רשימה ממוספרת",
"remove_color": "הסרת צבע",
"strikethrough": "קו חוצה",
"text_color": "צבע טקסט",
"underline": "קו תחתון"
},
"use_global_default": "השתמש בברירת המחדל הגלובלית",
"your_signatures": "החתימות שלך ({count})"
} }
} }
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "Másolva!", "copied": "Másolva!",
"copy_failed": "A másolás nem sikerült" "copy_failed": "A másolás nem sikerült"
}, },
"send_now": "Küldés most" "send_now": "Küldés most",
"create_appointment": "Találkozó létrehozása"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Olvasási visszaigazolás kérve (kattints a letiltáshoz)", "read_receipt_on": "Olvasási visszaigazolás kérve (kattints a letiltáshoz)",
@@ -712,7 +713,10 @@
"delete_table": "Táblázat törlése", "delete_table": "Táblázat törlése",
"pick_size": "Méret kiválasztása" "pick_size": "Méret kiválasztása"
}, },
"send_filing_warning": "Elküldve - de az utólagos rendrakás nem sikerült, egy elavult piszkozat megmaradhat." "send_filing_warning": "Elküldve - de az utólagos rendrakás nem sikerült, egy elavult piszkozat megmaradhat.",
"insert_signature": "Aláírás beszúrása",
"no_signature": "Nincs aláírás",
"select_signature": "Aláírás kiválasztása"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Megerősítés", "confirm": "Megerősítés",
@@ -891,7 +895,10 @@
"downloads": "Letöltések", "downloads": "Letöltések",
"content_senders": "Tartalom és feladók", "content_senders": "Tartalom és feladók",
"about_data": "Névjegy és adatok", "about_data": "Névjegy és adatok",
"debug": "Hibakeresés" "debug": "Hibakeresés",
"import": "Importálás",
"sharing": "Megosztás",
"signatures": "Aláírások"
}, },
"tab_groups": { "tab_groups": {
"general": "Általános", "general": "Általános",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Vissza a saját fiókomhoz", "back": "Vissza a saját fiókomhoz",
"managing": "Kezelés: {name}" "managing": "Kezelés: {name}"
} },
"importer": {
"action_label": "Importálás",
"cancel": "Mégse",
"choose_files": "Fájlok kiválasztása",
"conflict_copy": "Mindkettő megtartása",
"conflict_description": "Válaszd ki, mi történjen, ha egy importált üzenet már létezik.",
"conflict_label": "Duplikátumok kezelése",
"conflict_replace": "Duplikátumok cseréje",
"conflict_skip": "Duplikátumok kihagyása",
"description": "E-mail üzenetek importálása .eml fájlokból egy mappába.",
"error_details": "{count, plural, one {# hiba} other {# hiba}}",
"fail": "Importálás sikertelen",
"file_description": "Válassz ki egy vagy több .eml fájlt az importáláshoz.",
"file_label": "Fájlok",
"files_selected": "{count, plural, one {# fájl kijelölve} other {# fájl kijelölve}}",
"folder_description": "Válaszd ki a mappát, amelybe az üzeneteket importálni szeretnéd.",
"folder_label": "Célmappa",
"import_complete": "Importálás befejezve",
"import_more": "További importálás",
"importing": "Importálás...",
"progress_failed": "{count} sikertelen",
"progress_imported": "{count} importálva",
"progress_skipped": "{count} kihagyva",
"start_import": "{count, plural, one {# fájl importálása} other {# fájl importálása}}",
"success": "{count, plural, one {# üzenet importálva} other {# üzenet importálva}}",
"summary_failed": "{count, plural, one {# üzenet sikertelen} other {# üzenet sikertelen}}",
"summary_imported": "{count, plural, one {# üzenet importálva} other {# üzenet importálva}}",
"summary_skipped": "{count, plural, one {# üzenet kihagyva} other {# üzenet kihagyva}}",
"title": "Levelek importálása"
},
"loading": "Betöltés...",
"refresh": "Frissítés"
}, },
"errors": { "errors": {
"page_error_title": "Valami hiba történt", "page_error_title": "Valami hiba történt",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Nem sikerült átnevezni a mappát", "toast_error_rename": "Nem sikerült átnevezni a mappát",
"toast_error_delete": "Nem sikerült törölni a mappát", "toast_error_delete": "Nem sikerült törölni a mappát",
"toast_error_delete_has_children": "A mappának almappái vannak. Távolítsd el azokat először.", "toast_error_delete_has_children": "A mappának almappái vannak. Távolítsd el azokat először.",
"toast_error_delete_has_email": "A mappa nem üres. Ürítsd ki először." "toast_error_delete_has_email": "A mappa nem üres. Ürítsd ki először.",
"share_folder": "Mappa megosztása..."
}, },
"shortcuts": { "shortcuts": {
"title": "Billentyűparancsok", "title": "Billentyűparancsok",
@@ -2184,7 +2224,11 @@
"save": "Azonosság mentése", "save": "Azonosság mentése",
"cancel": "Mégse", "cancel": "Mégse",
"creating": "Létrehozás...", "creating": "Létrehozás...",
"updating": "Frissítés..." "updating": "Frissítés...",
"signature_store_default": "Alapértelmezett aláírás",
"signature_store_mapping": "Aláírás-hozzárendelés",
"signature_store_reply": "Válasz aláírás",
"use_global_default": "Globális alapértelmezett használata"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Alcím használata", "button_tooltip": "Alcím használata",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {1 névjegy importálva} other {# névjegy importálva}}", "success": "{count, plural, one {1 névjegy importálva} other {# névjegy importálva}}",
"failed": "Importálás sikertelen", "failed": "Importálás sikertelen",
"close": "Bezárás", "close": "Bezárás",
"file_too_large": "A fájl túl nagy (max 5 MB)" "file_too_large": "A fájl túl nagy (max 5 MB)",
"csv_address": "Cím",
"csv_address_book": "Címjegyzék",
"csv_back": "Vissza",
"csv_city": "Város",
"csv_company": "Cég",
"csv_country": "Ország",
"csv_email": "E-mail",
"csv_first_name": "Keresztnév",
"csv_ignore": "Oszlop figyelmen kívül hagyása",
"csv_job_title": "Beosztás",
"csv_last_name": "Vezetéknév",
"csv_load_all": "Összes betöltése",
"csv_map_columns": "Oszlopok megfeleltetése",
"csv_nickname": "Becenév",
"csv_note": "Jegyzet",
"csv_phone": "Telefon",
"csv_postcode": "Irányítószám",
"csv_preview": "Előnézet",
"csv_preview_title": "Előnézet ({count, plural, one {# sor} other {# sor}})",
"csv_region": "Állam/Régió",
"csv_website": "Weboldal",
"file_types_csv": ".csv fájlok"
}, },
"export": { "export": {
"title": "Névjegyek exportálása", "title": "Névjegyek exportálása",
@@ -2569,7 +2635,10 @@
"has_email": "Van e-mail", "has_email": "Van e-mail",
"has_phone": "Van telefon", "has_phone": "Van telefon",
"has_photo": "Van fotó" "has_photo": "Van fotó"
} },
"delete": "Törlés",
"edit": "Szerkesztés",
"send_email": "E-mail küldése"
}, },
"calendar": { "calendar": {
"title": "Naptár", "title": "Naptár",
@@ -2988,6 +3057,36 @@
"due_today": "Ma", "due_today": "Ma",
"due_tomorrow": "Holnap", "due_tomorrow": "Holnap",
"overdue": "Lejárt" "overdue": "Lejárt"
},
"delete": "Törlés",
"duplicate": "Duplikálás",
"edit": "Szerkesztés",
"freeBusy": {
"busy": "Elfoglalt",
"check": "Elérhetőség ellenőrzése",
"click_to_select": "Kattints egy szabad időpontra ennek az időpontnak a kiválasztásához",
"free": "Szabad",
"hide": "Elérhetőség elrejtése",
"loading": "Betöltés...",
"no_participants": "Adj hozzá résztvevőket az elérhetőség ellenőrzéséhez.",
"tentative": "Előzetes",
"timezone": "Időzóna",
"title": "Elérhetőség",
"unavailable": "Házon kívül",
"unknown": "Nincs információ"
},
"resources": {
"clear_all": "Összes törlése",
"filter_all": "Összes",
"hide": "Erőforrások elrejtése",
"no_resources": "Nincs elérhető erőforrás",
"remove": "{name} eltávolítása",
"search_placeholder": "Erőforrások keresése...",
"title": "Erőforrások",
"type_equipment": "Berendezés",
"type_other": "Egyéb",
"type_room": "Termek",
"type_vehicle": "Járművek"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "Olvasás és írás", "readWrite": "Olvasás és írás",
"manager": "Kezelő", "manager": "Kezelő",
"custom": "Egyéni" "custom": "Egyéni"
} },
"accept": "Elfogadás",
"decline": "Elutasítás",
"no_shares_by_me": "Még nem osztottál meg semmit.",
"no_shares_with_me": "Még nincs veled megosztott mappa.",
"shared_by": "Megosztotta",
"tab_shared_by_me": "Általam megosztott",
"tab_shared_with_me": "Velem megosztott"
}, },
"advanced_search": { "advanced_search": {
"title": "Speciális keresés", "title": "Speciális keresés",
@@ -3176,7 +3282,8 @@
"disabled_description": "Nagyméretű fájlok WebDAV-on keresztüli feltöltése Stalwart/RocksDB instabilitást okozhat, beleértve a memóriahiányos összeomlásokat és a helyreállíthatatlan lemezhasználatot. A törölt fájlok nem feltétlenül kerülnek azonnal eltávolításra a blob tárolóból. Ez a funkció nem ajánlott éles környezetben.", "disabled_description": "Nagyméretű fájlok WebDAV-on keresztüli feltöltése Stalwart/RocksDB instabilitást okozhat, beleértve a memóriahiányos összeomlásokat és a helyreállíthatatlan lemezhasználatot. A törölt fájlok nem feltétlenül kerülnek azonnal eltávolításra a blob tárolóból. Ez a funkció nem ajánlott éles környezetben.",
"stability_warning": "Nagyméretű fájlok feltöltése szerver instabilitást okozhat. A törölt fájlok nem feltétlenül kerülnek azonnal eltávolításra a tárolóból. Használat óvatosan.", "stability_warning": "Nagyméretű fájlok feltöltése szerver instabilitást okozhat. A törölt fájlok nem feltétlenül kerülnek azonnal eltávolításra a tárolóból. Használat óvatosan.",
"migration_title": "Fájlok frissítése…", "migration_title": "Fájlok frissítése…",
"migration_description": "A mappák és fájlok a megfelelő struktúrába rendeződnek. Ez csak egyszer történik meg." "migration_description": "A mappák és fájlok a megfelelő struktúrába rendeződnek. Ez csak egyszer történik meg.",
"send_as_attachment": "Küldés csatolmányként"
}, },
"smime": { "smime": {
"your_certificates": "Tanúsítványaid", "your_certificates": "Tanúsítványaid",
@@ -3324,5 +3431,55 @@
"install": "Telepítés", "install": "Telepítés",
"dont_remind": "Ne emlékeztess többet", "dont_remind": "Ne emlékeztess többet",
"dismiss_aria": "Telepítési ablak elutasítása" "dismiss_aria": "Telepítési ablak elutasítása"
},
"signatures": {
"add_signature": "Aláírás hozzáadása",
"default": "Alapértelmezett",
"default_signature": {
"description": "Új üzenetekhez használatos, hacsak nincs felülbírálva azonosságonként.",
"label": "Alapértelmezett aláírás"
},
"delete_message": "Biztosan törölni szeretnéd a(z) \"{name}\" aláírást? Ez nem vonható vissza.",
"delete_title": "Aláírás törlése?",
"description": "E-mail aláírások létrehozása és kezelése levélíráshoz vagy válaszadáshoz.",
"duplicate": "Duplikálás",
"edit_signature": "Aláírás szerkesztése",
"editor_label": "Aláírás",
"html_preview_label": "HTML előnézet",
"name_label": "Név",
"name_placeholder": "pl. Munka, Személyes",
"name_required": "Név megadása kötelező",
"new_signature": "Új aláírás",
"no_signature": "Nincs aláírás",
"no_signatures": "Még nincsenek aláírások",
"per_identity_signatures": {
"description": "Az alapértelmezett és a válasz aláírás felülbírálása az egyes azonosságoknál.",
"label": "Azonosságonkénti aláírások"
},
"plain_text_preview_label": "Egyszerű szöveges előnézet",
"reply": "Válasz",
"reply_signature": {
"description": "Válaszadáskor vagy továbbításkor használatos, hacsak nincs felülbírálva azonosságonként.",
"label": "Válasz aláírás"
},
"show_editor": "Szerkesztő megjelenítése",
"show_preview": "Előnézet megjelenítése",
"title": "Aláírások",
"toolbar": {
"align_center": "Középre igazítás",
"align_left": "Balra igazítás",
"align_right": "Jobbra igazítás",
"bold": "Félkövér",
"bullet_list": "Felsorolás",
"italic": "Dőlt",
"link": "Hivatkozás",
"ordered_list": "Számozott lista",
"remove_color": "Szín eltávolítása",
"strikethrough": "Áthúzott",
"text_color": "Betűszín",
"underline": "Aláhúzott"
},
"use_global_default": "Globális alapértelmezett használata",
"your_signatures": "Aláírásaid ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Copiato!", "copied": "Copiato!",
"copy_failed": "Copia non riuscita" "copy_failed": "Copia non riuscita"
}, },
"send_now": "Invia ora" "send_now": "Invia ora",
"create_appointment": "Crea appuntamento"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Conferma di lettura richiesta (clicca per disattivare)", "read_receipt_on": "Conferma di lettura richiesta (clicca per disattivare)",
@@ -712,7 +713,10 @@
"delete_table": "Elimina tabella", "delete_table": "Elimina tabella",
"pick_size": "Scegli dimensione" "pick_size": "Scegli dimensione"
}, },
"send_filing_warning": "Inviato - ma la pulizia successiva non è riuscita, potrebbe restare una bozza obsoleta." "send_filing_warning": "Inviato - ma la pulizia successiva non è riuscita, potrebbe restare una bozza obsoleta.",
"insert_signature": "Inserisci firma",
"no_signature": "Nessuna firma",
"select_signature": "Seleziona firma"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Conferma", "confirm": "Conferma",
@@ -888,7 +892,10 @@
"downloads": "Download", "downloads": "Download",
"content_senders": "Contenuto e mittenti", "content_senders": "Contenuto e mittenti",
"about_data": "Informazioni e dati", "about_data": "Informazioni e dati",
"debug": "Debug" "debug": "Debug",
"import": "Importa",
"sharing": "Condivisione",
"signatures": "Firme"
}, },
"tab_groups": { "tab_groups": {
"general": "Generale", "general": "Generale",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Torna al mio account", "back": "Torna al mio account",
"managing": "Gestione: {name}" "managing": "Gestione: {name}"
} },
"importer": {
"action_label": "Importa",
"cancel": "Annulla",
"choose_files": "Scegli file",
"conflict_copy": "Mantieni entrambi",
"conflict_description": "Scegli cosa fare quando un messaggio importato esiste già.",
"conflict_label": "Gestione dei duplicati",
"conflict_replace": "Sostituisci i duplicati",
"conflict_skip": "Salta i duplicati",
"description": "Importa messaggi email da file .eml in una cartella.",
"error_details": "{count, plural, one {# errore} other {# errori}}",
"fail": "Importazione non riuscita",
"file_description": "Seleziona uno o più file .eml da importare.",
"file_label": "File",
"files_selected": "{count, plural, one {# file selezionato} other {# file selezionati}}",
"folder_description": "Scegli la cartella in cui importare i messaggi.",
"folder_label": "Cartella di destinazione",
"import_complete": "Importazione completata",
"import_more": "Importa altro",
"importing": "Importazione in corso...",
"progress_failed": "{count} non riusciti",
"progress_imported": "{count} importati",
"progress_skipped": "{count} saltati",
"start_import": "{count, plural, one {Importa # file} other {Importa # file}}",
"success": "{count, plural, one {# messaggio importato} other {# messaggi importati}}",
"summary_failed": "{count, plural, one {# messaggio non riuscito} other {# messaggi non riusciti}}",
"summary_imported": "{count, plural, one {# messaggio importato} other {# messaggi importati}}",
"summary_skipped": "{count, plural, one {# messaggio saltato} other {# messaggi saltati}}",
"title": "Importa posta"
},
"loading": "Caricamento...",
"refresh": "Aggiorna"
}, },
"errors": { "errors": {
"page_error_title": "Qualcosa è andato storto", "page_error_title": "Qualcosa è andato storto",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "La cartella non è vuota. Svuotarla prima.", "toast_error_delete_has_email": "La cartella non è vuota. Svuotarla prima.",
"placeholder_folder_name": "Nome cartella", "placeholder_folder_name": "Nome cartella",
"create": "Crea", "create": "Crea",
"rename_confirm": "Rinomina" "rename_confirm": "Rinomina",
"share_folder": "Condividi cartella..."
}, },
"shortcuts": { "shortcuts": {
"title": "Scorciatoie da tastiera", "title": "Scorciatoie da tastiera",
@@ -2184,7 +2224,11 @@
"save": "Salva identità", "save": "Salva identità",
"cancel": "Annulla", "cancel": "Annulla",
"creating": "Creazione...", "creating": "Creazione...",
"updating": "Aggiornamento..." "updating": "Aggiornamento...",
"signature_store_default": "Firma predefinita",
"signature_store_mapping": "Mappatura firma",
"signature_store_reply": "Firma di risposta",
"use_global_default": "Usa predefinito globale"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Usa sotto-indirizzo", "button_tooltip": "Usa sotto-indirizzo",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 contatto importato} other {# contatti importati}}", "success": "{count, plural, one {1 contatto importato} other {# contatti importati}}",
"failed": "Importazione fallita", "failed": "Importazione fallita",
"close": "Chiudi", "close": "Chiudi",
"file_too_large": "Il file è troppo grande (max 5 MB)" "file_too_large": "Il file è troppo grande (max 5 MB)",
"csv_address": "Indirizzo",
"csv_address_book": "Rubrica",
"csv_back": "Indietro",
"csv_city": "Città",
"csv_company": "Azienda",
"csv_country": "Paese",
"csv_email": "Email",
"csv_first_name": "Nome",
"csv_ignore": "Ignora questa colonna",
"csv_job_title": "Titolo professionale",
"csv_last_name": "Cognome",
"csv_load_all": "Carica tutto",
"csv_map_columns": "Mappa colonne",
"csv_nickname": "Soprannome",
"csv_note": "Nota",
"csv_phone": "Telefono",
"csv_postcode": "Codice postale",
"csv_preview": "Anteprima",
"csv_preview_title": "Anteprima ({count, plural, one {# riga} other {# righe}})",
"csv_region": "Stato / Regione",
"csv_website": "Sito web",
"file_types_csv": "File .csv"
}, },
"export": { "export": {
"title": "Esporta contatti", "title": "Esporta contatti",
@@ -2569,7 +2635,10 @@
"has_phone": "Con telefono", "has_phone": "Con telefono",
"has_photo": "Con foto" "has_photo": "Con foto"
}, },
"open_categories": "Apri categorie" "open_categories": "Apri categorie",
"delete": "Elimina",
"edit": "Modifica",
"send_email": "Invia email"
}, },
"calendar": { "calendar": {
"title": "Calendario", "title": "Calendario",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Apri menu" "nav_open_menu": "Apri menu",
"delete": "Elimina",
"duplicate": "Duplica",
"edit": "Modifica",
"freeBusy": {
"busy": "Occupato",
"check": "Verifica disponibilità",
"click_to_select": "Fai clic su uno slot libero per selezionare questo orario",
"free": "Libero",
"hide": "Nascondi disponibilità",
"loading": "Caricamento...",
"no_participants": "Aggiungi partecipanti per verificare la disponibilità.",
"tentative": "Provvisorio",
"timezone": "Fuso orario",
"title": "Disponibilità",
"unavailable": "Fuori ufficio",
"unknown": "Nessuna informazione"
},
"resources": {
"clear_all": "Cancella tutto",
"filter_all": "Tutte",
"hide": "Nascondi risorse",
"no_resources": "Nessuna risorsa disponibile",
"remove": "Rimuovi {name}",
"search_placeholder": "Cerca risorse...",
"title": "Risorse",
"type_equipment": "Attrezzature",
"type_other": "Altro",
"type_room": "Sale",
"type_vehicle": "Veicoli"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Ricerca avanzata", "title": "Ricerca avanzata",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Apri albero cartelle", "open_folder_tree": "Apri albero cartelle",
"other_accounts": "Altri account", "other_accounts": "Altri account",
"migration_title": "Aggiornamento dei tuoi file…", "migration_title": "Aggiornamento dei tuoi file…",
"migration_description": "Organizzazione di cartelle e file nella loro struttura corretta. Questo avviene solo una volta." "migration_description": "Organizzazione di cartelle e file nella loro struttura corretta. Questo avviene solo una volta.",
"send_as_attachment": "Invia come allegato"
}, },
"smime": { "smime": {
"your_certificates": "I tuoi certificati", "your_certificates": "I tuoi certificati",
@@ -3308,7 +3408,14 @@
"readWrite": "Lettura e scrittura", "readWrite": "Lettura e scrittura",
"manager": "Gestore", "manager": "Gestore",
"custom": "Personalizzato" "custom": "Personalizzato"
} },
"accept": "Accetta",
"decline": "Rifiuta",
"no_shares_by_me": "Non hai ancora condiviso nulla.",
"no_shares_with_me": "Nessuna cartella condivisa con te per ora.",
"shared_by": "Condiviso da",
"tab_shared_by_me": "Condivisi da me",
"tab_shared_with_me": "Condivisi con me"
}, },
"quote_header": { "quote_header": {
"reply_line": "Il {date}, {from} ha scritto:", "reply_line": "Il {date}, {from} ha scritto:",
@@ -3324,5 +3431,55 @@
"install": "Installa", "install": "Installa",
"dont_remind": "Non ricordarmelo più", "dont_remind": "Non ricordarmelo più",
"dismiss_aria": "Chiudi avviso di installazione" "dismiss_aria": "Chiudi avviso di installazione"
},
"signatures": {
"add_signature": "Aggiungi firma",
"default": "Predefinita",
"default_signature": {
"description": "Utilizzata per i nuovi messaggi salvo diversa impostazione per identità.",
"label": "Firma predefinita"
},
"delete_message": "Sei sicuro di voler eliminare \"{name}\"? Questa azione non può essere annullata.",
"delete_title": "Eliminare la firma?",
"description": "Crea e gestisci le firme email da usare quando componi o rispondi.",
"duplicate": "Duplica",
"edit_signature": "Modifica firma",
"editor_label": "Firma",
"html_preview_label": "Anteprima HTML",
"name_label": "Nome",
"name_placeholder": "es. Lavoro, Personale",
"name_required": "Il nome è obbligatorio",
"new_signature": "Nuova firma",
"no_signature": "Nessuna firma",
"no_signatures": "Nessuna firma ancora",
"per_identity_signatures": {
"description": "Sovrascrivi la firma predefinita e di risposta per le singole identità.",
"label": "Firme per identità"
},
"plain_text_preview_label": "Anteprima testo semplice",
"reply": "Di risposta",
"reply_signature": {
"description": "Utilizzata quando rispondi o inoltri, salvo diversa impostazione per identità.",
"label": "Firma di risposta"
},
"show_editor": "Mostra editor",
"show_preview": "Mostra anteprima",
"title": "Firme",
"toolbar": {
"align_center": "Centra",
"align_left": "Allinea a sinistra",
"align_right": "Allinea a destra",
"bold": "Grassetto",
"bullet_list": "Elenco puntato",
"italic": "Corsivo",
"link": "Link",
"ordered_list": "Elenco numerato",
"remove_color": "Rimuovi colore",
"strikethrough": "Barrato",
"text_color": "Colore del testo",
"underline": "Sottolineato"
},
"use_global_default": "Usa predefinito globale",
"your_signatures": "Le tue firme ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "コピーしました!", "copied": "コピーしました!",
"copy_failed": "コピーに失敗しました" "copy_failed": "コピーに失敗しました"
}, },
"send_now": "今すぐ送信" "send_now": "今すぐ送信",
"create_appointment": "予定を作成"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "開封確認を要求中(クリックで無効化)", "read_receipt_on": "開封確認を要求中(クリックで無効化)",
@@ -712,7 +713,10 @@
"delete_table": "表を削除", "delete_table": "表を削除",
"pick_size": "サイズを選択" "pick_size": "サイズを選択"
}, },
"send_filing_warning": "送信されましたが、送信後の整理に失敗しました。古い下書きが残る場合があります。" "send_filing_warning": "送信されましたが、送信後の整理に失敗しました。古い下書きが残る場合があります。",
"insert_signature": "署名を挿入",
"no_signature": "署名なし",
"select_signature": "署名を選択"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "確認", "confirm": "確認",
@@ -888,7 +892,10 @@
"downloads": "ダウンロード", "downloads": "ダウンロード",
"content_senders": "コンテンツと送信者", "content_senders": "コンテンツと送信者",
"about_data": "情報とデータ", "about_data": "情報とデータ",
"debug": "デバッグ" "debug": "デバッグ",
"import": "インポート",
"sharing": "共有",
"signatures": "署名"
}, },
"tab_groups": { "tab_groups": {
"general": "一般", "general": "一般",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "自分のアカウントに戻る", "back": "自分のアカウントに戻る",
"managing": "管理中: {name}" "managing": "管理中: {name}"
} },
"importer": {
"action_label": "インポート",
"cancel": "キャンセル",
"choose_files": "ファイルを選択",
"conflict_copy": "両方を保持",
"conflict_description": "インポートするメッセージがすでに存在する場合の処理方法を選択してください。",
"conflict_label": "重複の処理",
"conflict_replace": "重複を置き換え",
"conflict_skip": "重複をスキップ",
"description": ".emlファイルからメールメッセージをフォルダーにインポートします。",
"error_details": "{count, plural, other {#件のエラー}}",
"fail": "インポートに失敗しました",
"file_description": "インポートする.emlファイルを1つ以上選択してください。",
"file_label": "ファイル",
"files_selected": "{count, plural, other {#件のファイルを選択}}",
"folder_description": "メッセージのインポート先フォルダーを選択してください。",
"folder_label": "インポート先フォルダー",
"import_complete": "インポート完了",
"import_more": "さらにインポート",
"importing": "インポート中...",
"progress_failed": "{count}件失敗",
"progress_imported": "{count}件インポート済み",
"progress_skipped": "{count}件スキップ",
"start_import": "{count, plural, other {#件のファイルをインポート}}",
"success": "{count, plural, other {#件のメッセージをインポートしました}}",
"summary_failed": "{count, plural, other {#件のメッセージが失敗しました}}",
"summary_imported": "{count, plural, other {#件のメッセージをインポートしました}}",
"summary_skipped": "{count, plural, other {#件のメッセージをスキップしました}}",
"title": "メールをインポート"
},
"loading": "読み込み中...",
"refresh": "更新"
}, },
"errors": { "errors": {
"page_error_title": "問題が発生しました", "page_error_title": "問題が発生しました",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "フォルダーが空ではありません。先に空にしてください。", "toast_error_delete_has_email": "フォルダーが空ではありません。先に空にしてください。",
"placeholder_folder_name": "フォルダー名", "placeholder_folder_name": "フォルダー名",
"create": "作成", "create": "作成",
"rename_confirm": "名前を変更" "rename_confirm": "名前を変更",
"share_folder": "フォルダーを共有..."
}, },
"shortcuts": { "shortcuts": {
"title": "キーボードショートカット", "title": "キーボードショートカット",
@@ -2184,7 +2224,11 @@
"save": "送信者情報を保存", "save": "送信者情報を保存",
"cancel": "キャンセル", "cancel": "キャンセル",
"creating": "作成中...", "creating": "作成中...",
"updating": "更新中..." "updating": "更新中...",
"signature_store_default": "デフォルト署名",
"signature_store_mapping": "署名のマッピング",
"signature_store_reply": "返信署名",
"use_global_default": "全体のデフォルトを使用"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "サブアドレスを使用", "button_tooltip": "サブアドレスを使用",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, other {#件の連絡先をインポートしました}}", "success": "{count, plural, other {#件の連絡先をインポートしました}}",
"failed": "インポートに失敗しました", "failed": "インポートに失敗しました",
"close": "閉じる", "close": "閉じる",
"file_too_large": "ファイルが大きすぎます(最大5 MB)" "file_too_large": "ファイルが大きすぎます(最大5 MB)",
"csv_address": "住所",
"csv_address_book": "アドレス帳",
"csv_back": "戻る",
"csv_city": "市区町村",
"csv_company": "会社名",
"csv_country": "国",
"csv_email": "メール",
"csv_first_name": "名",
"csv_ignore": "この列を無視",
"csv_job_title": "役職",
"csv_last_name": "姓",
"csv_load_all": "すべて読み込む",
"csv_map_columns": "列のマッピング",
"csv_nickname": "ニックネーム",
"csv_note": "メモ",
"csv_phone": "電話",
"csv_postcode": "郵便番号",
"csv_preview": "プレビュー",
"csv_preview_title": "プレビュー({count, plural, other {#行}}",
"csv_region": "都道府県",
"csv_website": "ウェブサイト",
"file_types_csv": ".csv ファイル"
}, },
"export": { "export": {
"title": "連絡先をエクスポート", "title": "連絡先をエクスポート",
@@ -2569,7 +2635,10 @@
"has_phone": "電話あり", "has_phone": "電話あり",
"has_photo": "写真あり" "has_photo": "写真あり"
}, },
"open_categories": "カテゴリを開く" "open_categories": "カテゴリを開く",
"delete": "削除",
"edit": "編集",
"send_email": "メールを送信"
}, },
"calendar": { "calendar": {
"title": "カレンダー", "title": "カレンダー",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "メニューを開く" "nav_open_menu": "メニューを開く",
"delete": "削除",
"duplicate": "複製",
"edit": "編集",
"freeBusy": {
"busy": "予定あり",
"check": "空き状況を確認",
"click_to_select": "この時間を選択するには、空いている枠をクリックしてください",
"free": "空き",
"hide": "空き状況を非表示",
"loading": "読み込み中...",
"no_participants": "空き状況を確認するには参加者を追加してください。",
"tentative": "仮",
"timezone": "タイムゾーン",
"title": "空き状況",
"unavailable": "不在",
"unknown": "情報なし"
},
"resources": {
"clear_all": "すべてクリア",
"filter_all": "すべて",
"hide": "リソースを非表示",
"no_resources": "利用可能なリソースがありません",
"remove": "{name}を削除",
"search_placeholder": "リソースを検索...",
"title": "リソース",
"type_equipment": "備品",
"type_other": "その他",
"type_room": "会議室",
"type_vehicle": "車両"
}
}, },
"advanced_search": { "advanced_search": {
"title": "詳細検索", "title": "詳細検索",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "フォルダーツリーを開く", "open_folder_tree": "フォルダーツリーを開く",
"other_accounts": "その他のアカウント", "other_accounts": "その他のアカウント",
"migration_title": "ファイルを更新しています…", "migration_title": "ファイルを更新しています…",
"migration_description": "フォルダーとファイルを適切な構造に整理しています。これは一度だけ行われます。" "migration_description": "フォルダーとファイルを適切な構造に整理しています。これは一度だけ行われます。",
"send_as_attachment": "添付ファイルとして送信"
}, },
"smime": { "smime": {
"your_certificates": "あなたの証明書", "your_certificates": "あなたの証明書",
@@ -3308,7 +3408,14 @@
"readWrite": "読み取り・書き込み", "readWrite": "読み取り・書き込み",
"manager": "管理者", "manager": "管理者",
"custom": "カスタム" "custom": "カスタム"
} },
"accept": "承諾",
"decline": "辞退",
"no_shares_by_me": "まだ何も共有していません。",
"no_shares_with_me": "共有されているフォルダーはまだありません。",
"shared_by": "共有者",
"tab_shared_by_me": "自分が共有",
"tab_shared_with_me": "自分と共有"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date}に{from}が書きました:", "reply_line": "{date}に{from}が書きました:",
@@ -3324,5 +3431,55 @@
"install": "インストール", "install": "インストール",
"dont_remind": "今後表示しない", "dont_remind": "今後表示しない",
"dismiss_aria": "インストールプロンプトを閉じる" "dismiss_aria": "インストールプロンプトを閉じる"
},
"signatures": {
"add_signature": "署名を追加",
"default": "デフォルト",
"default_signature": {
"description": "個々の送信者情報で上書きしない限り、新規メッセージに使用されます。",
"label": "デフォルト署名"
},
"delete_message": "\"{name}\"を削除してもよろしいですか?この操作は元に戻せません。",
"delete_title": "署名を削除",
"description": "作成や返信で使用するメール署名を作成・管理します。",
"duplicate": "複製",
"edit_signature": "署名を編集",
"editor_label": "署名",
"html_preview_label": "HTMLプレビュー",
"name_label": "名前",
"name_placeholder": "例: 仕事用、個人用",
"name_required": "名前は必須です",
"new_signature": "新しい署名",
"no_signature": "署名なし",
"no_signatures": "署名はまだありません",
"per_identity_signatures": {
"description": "個々の送信者情報について、デフォルトおよび返信の署名を上書きします。",
"label": "送信者情報ごとの署名"
},
"plain_text_preview_label": "プレーンテキストプレビュー",
"reply": "返信",
"reply_signature": {
"description": "個々の送信者情報で上書きしない限り、返信または転送時に使用されます。",
"label": "返信署名"
},
"show_editor": "エディターを表示",
"show_preview": "プレビューを表示",
"title": "署名",
"toolbar": {
"align_center": "中央揃え",
"align_left": "左揃え",
"align_right": "右揃え",
"bold": "太字",
"bullet_list": "箇条書き",
"italic": "斜体",
"link": "リンク",
"ordered_list": "番号付きリスト",
"remove_color": "色を解除",
"strikethrough": "取り消し線",
"text_color": "文字色",
"underline": "下線"
},
"use_global_default": "全体のデフォルトを使用",
"your_signatures": "署名({count}"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "복사됨!", "copied": "복사됨!",
"copy_failed": "복사하지 못했습니다" "copy_failed": "복사하지 못했습니다"
}, },
"send_now": "지금 보내기" "send_now": "지금 보내기",
"create_appointment": "일정 만들기"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "읽음 확인 요청됨 (클릭하여 해제)", "read_receipt_on": "읽음 확인 요청됨 (클릭하여 해제)",
@@ -712,7 +713,10 @@
"delete_table": "표 삭제", "delete_table": "표 삭제",
"pick_size": "크기 선택" "pick_size": "크기 선택"
}, },
"send_filing_warning": "보냈지만 전송 후 정리에 실패했습니다. 오래된 임시 보관 메일이 남아 있을 수 있습니다." "send_filing_warning": "보냈지만 전송 후 정리에 실패했습니다. 오래된 임시 보관 메일이 남아 있을 수 있습니다.",
"insert_signature": "서명 삽입",
"no_signature": "서명 없음",
"select_signature": "서명 선택"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "확인", "confirm": "확인",
@@ -888,7 +892,10 @@
"downloads": "다운로드", "downloads": "다운로드",
"content_senders": "콘텐츠 및 발신자", "content_senders": "콘텐츠 및 발신자",
"about_data": "정보 및 데이터", "about_data": "정보 및 데이터",
"debug": "디버그" "debug": "디버그",
"import": "가져오기",
"sharing": "공유",
"signatures": "서명"
}, },
"tab_groups": { "tab_groups": {
"general": "일반", "general": "일반",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "내 계정으로 돌아가기", "back": "내 계정으로 돌아가기",
"managing": "관리 중: {name}" "managing": "관리 중: {name}"
} },
"importer": {
"action_label": "가져오기",
"cancel": "취소",
"choose_files": "파일 선택",
"conflict_copy": "둘 다 유지",
"conflict_description": "가져올 메시지가 이미 있을 때 어떻게 처리할지 선택해 주세요.",
"conflict_label": "중복 처리",
"conflict_replace": "중복 항목 바꾸기",
"conflict_skip": "중복 항목 건너뛰기",
"description": ".eml 파일에서 이메일 메시지를 폴더로 가져와요.",
"error_details": "{count, plural, one {오류 1개} other {오류 #개}}",
"fail": "가져오기 실패",
"file_description": "가져올 .eml 파일을 하나 이상 선택해 주세요.",
"file_label": "파일",
"files_selected": "{count, plural, one {파일 1개 선택됨} other {파일 #개 선택됨}}",
"folder_description": "메시지를 가져올 폴더를 선택해 주세요.",
"folder_label": "대상 폴더",
"import_complete": "가져오기 완료",
"import_more": "더 가져오기",
"importing": "가져오는 중...",
"progress_failed": "{count}개 실패",
"progress_imported": "{count}개 가져옴",
"progress_skipped": "{count}개 건너뜀",
"start_import": "{count, plural, one {파일 1개 가져오기} other {파일 #개 가져오기}}",
"success": "{count, plural, one {메시지 1개 가져옴} other {메시지 #개 가져옴}}",
"summary_failed": "{count, plural, one {메시지 1개 실패} other {메시지 #개 실패}}",
"summary_imported": "{count, plural, one {메시지 1개 가져옴} other {메시지 #개 가져옴}}",
"summary_skipped": "{count, plural, one {메시지 1개 건너뜀} other {메시지 #개 건너뜀}}",
"title": "메일 가져오기"
},
"loading": "불러오는 중...",
"refresh": "새로고침"
}, },
"errors": { "errors": {
"page_error_title": "문제가 발생했어요", "page_error_title": "문제가 발생했어요",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "폴더가 비어 있지 않습니다. 먼저 비우세요.", "toast_error_delete_has_email": "폴더가 비어 있지 않습니다. 먼저 비우세요.",
"placeholder_folder_name": "폴더 이름", "placeholder_folder_name": "폴더 이름",
"create": "만들기", "create": "만들기",
"rename_confirm": "이름 바꾸기" "rename_confirm": "이름 바꾸기",
"share_folder": "폴더 공유..."
}, },
"shortcuts": { "shortcuts": {
"title": "단축키", "title": "단축키",
@@ -2184,7 +2224,11 @@
"save": "저장", "save": "저장",
"cancel": "취소", "cancel": "취소",
"creating": "만드는 중...", "creating": "만드는 중...",
"updating": "업데이트 중..." "updating": "업데이트 중...",
"signature_store_default": "기본 서명",
"signature_store_mapping": "서명 매핑",
"signature_store_reply": "답장 서명",
"use_global_default": "전역 기본값 사용"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "서브 어드레스 사용", "button_tooltip": "서브 어드레스 사용",
@@ -2510,7 +2554,29 @@
"success": "{count}개의 연락처를 성공적으로 가져왔어요", "success": "{count}개의 연락처를 성공적으로 가져왔어요",
"failed": "가져오기 실패", "failed": "가져오기 실패",
"close": "닫기", "close": "닫기",
"file_too_large": "파일이 너무 커요 (최대 5MB)" "file_too_large": "파일이 너무 커요 (최대 5MB)",
"csv_address": "주소",
"csv_address_book": "주소록",
"csv_back": "뒤로",
"csv_city": "도시",
"csv_company": "회사",
"csv_country": "국가",
"csv_email": "이메일",
"csv_first_name": "이름",
"csv_ignore": "이 열 무시",
"csv_job_title": "직책",
"csv_last_name": "성",
"csv_load_all": "전체 불러오기",
"csv_map_columns": "열 매핑",
"csv_nickname": "별명",
"csv_note": "메모",
"csv_phone": "전화번호",
"csv_postcode": "우편번호",
"csv_preview": "미리보기",
"csv_preview_title": "미리보기 ({count, plural, one {1행} other {#행}})",
"csv_region": "주/지역",
"csv_website": "웹사이트",
"file_types_csv": ".csv 파일"
}, },
"export": { "export": {
"title": "연락처 내보내기", "title": "연락처 내보내기",
@@ -2569,7 +2635,10 @@
"has_phone": "전화번호 있음", "has_phone": "전화번호 있음",
"has_photo": "사진 있음" "has_photo": "사진 있음"
}, },
"open_categories": "카테고리 열기" "open_categories": "카테고리 열기",
"delete": "삭제",
"edit": "수정",
"send_email": "이메일 보내기"
}, },
"calendar": { "calendar": {
"title": "캘린더", "title": "캘린더",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "메뉴 열기" "nav_open_menu": "메뉴 열기",
"delete": "삭제",
"duplicate": "복제",
"edit": "수정",
"freeBusy": {
"busy": "바쁨",
"check": "가능 여부 확인",
"click_to_select": "빈 시간을 클릭해서 이 시간을 선택하세요.",
"free": "한가함",
"hide": "가능 여부 숨기기",
"loading": "불러오는 중...",
"no_participants": "참석자를 추가하면 가능 여부를 확인할 수 있어요.",
"tentative": "미정",
"timezone": "시간대",
"title": "가능 여부",
"unavailable": "부재중",
"unknown": "정보 없음"
},
"resources": {
"clear_all": "모두 지우기",
"filter_all": "전체",
"hide": "리소스 숨기기",
"no_resources": "사용 가능한 리소스가 없어요",
"remove": "{name} 제거",
"search_placeholder": "리소스 검색...",
"title": "리소스",
"type_equipment": "장비",
"type_other": "기타",
"type_room": "회의실",
"type_vehicle": "차량"
}
}, },
"advanced_search": { "advanced_search": {
"title": "상세 검색", "title": "상세 검색",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "폴더 트리 열기", "open_folder_tree": "폴더 트리 열기",
"other_accounts": "다른 계정", "other_accounts": "다른 계정",
"migration_title": "파일 업데이트 중…", "migration_title": "파일 업데이트 중…",
"migration_description": "폴더와 파일을 올바른 구조로 정리하고 있습니다. 이 작업은 한 번만 수행됩니다." "migration_description": "폴더와 파일을 올바른 구조로 정리하고 있습니다. 이 작업은 한 번만 수행됩니다.",
"send_as_attachment": "첨부 파일로 보내기"
}, },
"smime": { "smime": {
"your_certificates": "내 인증서", "your_certificates": "내 인증서",
@@ -3308,7 +3408,14 @@
"readWrite": "읽기 및 쓰기", "readWrite": "읽기 및 쓰기",
"manager": "관리자", "manager": "관리자",
"custom": "사용자 지정" "custom": "사용자 지정"
} },
"accept": "수락",
"decline": "거절",
"no_shares_by_me": "아직 공유한 항목이 없습니다.",
"no_shares_with_me": "아직 공유받은 폴더가 없습니다.",
"shared_by": "공유한 사람",
"tab_shared_by_me": "내가 공유함",
"tab_shared_with_me": "나와 공유됨"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date}에 {from}님이 작성:", "reply_line": "{date}에 {from}님이 작성:",
@@ -3324,5 +3431,55 @@
"install": "설치", "install": "설치",
"dont_remind": "다시 알리지 않음", "dont_remind": "다시 알리지 않음",
"dismiss_aria": "설치 프롬프트 닫기" "dismiss_aria": "설치 프롬프트 닫기"
},
"signatures": {
"add_signature": "서명 추가",
"default": "기본",
"default_signature": {
"description": "발신자별로 다르게 설정하지 않으면 새 메시지에 사용돼요.",
"label": "기본 서명"
},
"delete_message": "정말 \"{name}\"을(를) 삭제할까요? 이 작업은 되돌릴 수 없어요.",
"delete_title": "서명을 삭제할까요?",
"description": "메일을 작성하거나 답장할 때 사용할 서명을 만들고 관리해 보세요.",
"duplicate": "복제",
"edit_signature": "서명 수정",
"editor_label": "서명",
"html_preview_label": "HTML 미리보기",
"name_label": "이름",
"name_placeholder": "예: 업무, 개인",
"name_required": "이름을 입력해 주세요",
"new_signature": "새 서명",
"no_signature": "서명 없음",
"no_signatures": "아직 서명이 없어요",
"per_identity_signatures": {
"description": "발신자별로 기본 서명과 답장 서명을 다르게 설정할 수 있어요.",
"label": "발신자별 서명"
},
"plain_text_preview_label": "일반 텍스트 미리보기",
"reply": "답장",
"reply_signature": {
"description": "발신자별로 다르게 설정하지 않으면 답장하거나 전달할 때 사용돼요.",
"label": "답장 서명"
},
"show_editor": "편집기 표시",
"show_preview": "미리보기 표시",
"title": "서명",
"toolbar": {
"align_center": "가운데 정렬",
"align_left": "왼쪽 정렬",
"align_right": "오른쪽 정렬",
"bold": "굵게",
"bullet_list": "글머리 기호 목록",
"italic": "기울임꼴",
"link": "링크",
"ordered_list": "번호 매기기 목록",
"remove_color": "색 제거",
"strikethrough": "취소선",
"text_color": "글자 색",
"underline": "밑줄"
},
"use_global_default": "전역 기본값 사용",
"your_signatures": "내 서명 ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Nokopēts!", "copied": "Nokopēts!",
"copy_failed": "Neizdevās nokopēt" "copy_failed": "Neizdevās nokopēt"
}, },
"send_now": "Sūtīt tagad" "send_now": "Sūtīt tagad",
"create_appointment": "Izveidot pasākumu"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Pieprasīts lasīšanas apstiprinājums (noklikšķiniet, lai atspējotu)", "read_receipt_on": "Pieprasīts lasīšanas apstiprinājums (noklikšķiniet, lai atspējotu)",
@@ -712,7 +713,10 @@
"delete_table": "Dzēst tabulu", "delete_table": "Dzēst tabulu",
"pick_size": "Izvēlēties izmēru" "pick_size": "Izvēlēties izmēru"
}, },
"send_filing_warning": "Nosūtīts - bet pēcapstrāde neizdevās, var palikt novecojis melnraksts." "send_filing_warning": "Nosūtīts - bet pēcapstrāde neizdevās, var palikt novecojis melnraksts.",
"insert_signature": "Ievietot parakstu",
"no_signature": "Nav paraksta",
"select_signature": "Izvēlēties parakstu"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Apstiprināt", "confirm": "Apstiprināt",
@@ -888,7 +892,10 @@
"downloads": "Lejupielādes", "downloads": "Lejupielādes",
"content_senders": "Saturs un sūtītāji", "content_senders": "Saturs un sūtītāji",
"about_data": "Par un dati", "about_data": "Par un dati",
"debug": "Atkļūdošana" "debug": "Atkļūdošana",
"import": "Imports",
"sharing": "Koplietošana",
"signatures": "Paraksti"
}, },
"tab_groups": { "tab_groups": {
"general": "Vispārīgi", "general": "Vispārīgi",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Atpakaļ uz manu kontu", "back": "Atpakaļ uz manu kontu",
"managing": "Pārvalda: {name}" "managing": "Pārvalda: {name}"
} },
"importer": {
"action_label": "Importēt",
"cancel": "Atcelt",
"choose_files": "Izvēlēties failus",
"conflict_copy": "Saglabāt abus",
"conflict_description": "Izvēlieties, kas jādara, ja importētais ziņojums jau pastāv.",
"conflict_label": "Dublikātu apstrāde",
"conflict_replace": "Aizstāt dublikātus",
"conflict_skip": "Izlaist dublikātus",
"description": "Importējiet e-pasta ziņojumus no .eml failiem izvēlētajā mapē.",
"error_details": "{count, plural, one {# kļūda} other {# kļūdas}}",
"fail": "Imports neizdevās",
"file_description": "Izvēlieties vienu vai vairākus .eml failus importēšanai.",
"file_label": "Faili",
"files_selected": "{count, plural, one {Izvēlēts # fails} other {Izvēlēti # faili}}",
"folder_description": "Izvēlieties mapi, kurā importēt ziņojumus.",
"folder_label": "Mērķa mape",
"import_complete": "Imports pabeigts",
"import_more": "Importēt vēl",
"importing": "Importē...",
"progress_failed": "{count} neizdevās",
"progress_imported": "{count} importēti",
"progress_skipped": "{count} izlaisti",
"start_import": "{count, plural, one {Importēt # failu} other {Importēt # failus}}",
"success": "{count, plural, one {# ziņojums importēts} other {# ziņojumi importēti}}",
"summary_failed": "{count, plural, one {# ziņojums neizdevās} other {# ziņojumi neizdevās}}",
"summary_imported": "{count, plural, one {# ziņojums importēts} other {# ziņojumi importēti}}",
"summary_skipped": "{count, plural, one {# ziņojums izlaists} other {# ziņojumi izlaisti}}",
"title": "Importēt pastu"
},
"loading": "Ielādē...",
"refresh": "Atsvaidzināt"
}, },
"errors": { "errors": {
"page_error_title": "Kaut kas nogāja griezi", "page_error_title": "Kaut kas nogāja griezi",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Mape nav tukša. Vispirms iztukšojiet to.", "toast_error_delete_has_email": "Mape nav tukša. Vispirms iztukšojiet to.",
"placeholder_folder_name": "Mapes nosaukums", "placeholder_folder_name": "Mapes nosaukums",
"create": "Izveidot", "create": "Izveidot",
"rename_confirm": "Pārsaukt" "rename_confirm": "Pārsaukt",
"share_folder": "Kopīgot mapi..."
}, },
"shortcuts": { "shortcuts": {
"title": "Īsinājumtaustiņi", "title": "Īsinājumtaustiņi",
@@ -2184,7 +2224,11 @@
"save": "Saglabāt identitāti", "save": "Saglabāt identitāti",
"cancel": "Atcelt", "cancel": "Atcelt",
"creating": "Izveido...", "creating": "Izveido...",
"updating": "Atjaunina..." "updating": "Atjaunina...",
"signature_store_default": "Noklusējuma paraksts",
"signature_store_mapping": "Paraksta piesaiste",
"signature_store_reply": "Atbildes paraksts",
"use_global_default": "Izmantot globālo noklusējumu"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Izmantot apakšadresi", "button_tooltip": "Izmantot apakšadresi",
@@ -2506,7 +2550,29 @@
"success": "Importēts {count, plural, one {1 kontakts} other {# kontakti}}", "success": "Importēts {count, plural, one {1 kontakts} other {# kontakti}}",
"failed": "Imports neizdevās", "failed": "Imports neizdevās",
"close": "Aizvērt", "close": "Aizvērt",
"file_too_large": "Fails ir pārāk liels (maks. 5 MB)" "file_too_large": "Fails ir pārāk liels (maks. 5 MB)",
"csv_address": "Adrese",
"csv_address_book": "Adrešu grāmata",
"csv_back": "Atpakaļ",
"csv_city": "Pilsēta",
"csv_company": "Uzņēmums",
"csv_country": "Valsts",
"csv_email": "E-pasts",
"csv_first_name": "Vārds",
"csv_ignore": "Ignorēt šo kolonnu",
"csv_job_title": "Amats",
"csv_last_name": "Uzvārds",
"csv_load_all": "Ielādēt visu",
"csv_map_columns": "Piesaistīt kolonnas",
"csv_nickname": "Segvārds",
"csv_note": "Piezīme",
"csv_phone": "Tālrunis",
"csv_postcode": "Pasta indekss",
"csv_preview": "Priekšskatījums",
"csv_preview_title": "Priekšskatījums ({count, plural, one {# rinda} other {# rindas}})",
"csv_region": "Novads/reģions",
"csv_website": "Tīmekļa vietne",
"file_types_csv": ".csv faili"
}, },
"export": { "export": {
"title": "Kontaktu eksports", "title": "Kontaktu eksports",
@@ -2569,7 +2635,10 @@
"has_phone": "Ar tālruni", "has_phone": "Ar tālruni",
"has_photo": "Ar foto" "has_photo": "Ar foto"
}, },
"open_categories": "Atvērt kategorijas" "open_categories": "Atvērt kategorijas",
"delete": "Dzēst",
"edit": "Rediģēt",
"send_email": "Sūtīt e-pastu"
}, },
"calendar": { "calendar": {
"title": "Kalendārs", "title": "Kalendārs",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Atvērt izvēlni" "nav_open_menu": "Atvērt izvēlni",
"delete": "Dzēst",
"duplicate": "Dublēt",
"edit": "Rediģēt",
"freeBusy": {
"busy": "Aizņemts",
"check": "Pārbaudīt pieejamību",
"click_to_select": "Noklikšķiniet uz brīva laika, lai izvēlētos šo laiku",
"free": "Brīvs",
"hide": "Slēpt pieejamību",
"loading": "Ielādē...",
"no_participants": "Pievienojiet dalībniekus, lai pārbaudītu pieejamību.",
"tentative": "Pagaidām",
"timezone": "Laika josla",
"title": "Pieejamība",
"unavailable": "Prombūtnē",
"unknown": "Nav informācijas"
},
"resources": {
"clear_all": "Notīrīt visu",
"filter_all": "Visi",
"hide": "Slēpt resursus",
"no_resources": "Resursi nav pieejami",
"remove": "Noņemt {name}",
"search_placeholder": "Meklēt resursus...",
"title": "Resursi",
"type_equipment": "Aprīkojums",
"type_other": "Cits",
"type_room": "Telpas",
"type_vehicle": "Transportlīdzekļi"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Izvērstā meklēšana", "title": "Izvērstā meklēšana",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Atvērt mapju koku", "open_folder_tree": "Atvērt mapju koku",
"other_accounts": "Citi konti", "other_accounts": "Citi konti",
"migration_title": "Notiek jūsu failu atjaunināšana…", "migration_title": "Notiek jūsu failu atjaunināšana…",
"migration_description": "Mapes un faili tiek sakārtoti pareizajā struktūrā. Tas notiek tikai vienu reizi." "migration_description": "Mapes un faili tiek sakārtoti pareizajā struktūrā. Tas notiek tikai vienu reizi.",
"send_as_attachment": "Nosūtīt kā pielikumu"
}, },
"smime": { "smime": {
"your_certificates": "Jūsu sertifikāti", "your_certificates": "Jūsu sertifikāti",
@@ -3308,7 +3408,14 @@
"readWrite": "Lasīšana un rakstīšana", "readWrite": "Lasīšana un rakstīšana",
"manager": "Pārvaldnieks", "manager": "Pārvaldnieks",
"custom": "Pielāgots" "custom": "Pielāgots"
} },
"accept": "Pieņemt",
"decline": "Noraidīt",
"no_shares_by_me": "Jūs vēl neko neesat kopīgojis.",
"no_shares_with_me": "Ar jums vēl nav kopīgota neviena mape.",
"shared_by": "Kopīgoja",
"tab_shared_by_me": "Manis kopīgots",
"tab_shared_with_me": "Kopīgots ar mani"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date} {from} rakstīja:", "reply_line": "{date} {from} rakstīja:",
@@ -3324,5 +3431,55 @@
"install": "Instalēt", "install": "Instalēt",
"dont_remind": "Vairs man neatgādināt", "dont_remind": "Vairs man neatgādināt",
"dismiss_aria": "Aizvērt instalēšanas paziņojumu" "dismiss_aria": "Aizvērt instalēšanas paziņojumu"
},
"signatures": {
"add_signature": "Pievienot parakstu",
"default": "Noklusējuma",
"default_signature": {
"description": "Tiek izmantots jauniem ziņojumiem, ja vien tas nav pārrakstīts katrai identitātei atsevišķi.",
"label": "Noklusējuma paraksts"
},
"delete_message": "Vai tiešām vēlaties dzēst \"{name}\"? Šo darbību nevar atcelt.",
"delete_title": "Dzēst parakstu?",
"description": "Izveidojiet un pārvaldiet e-pasta parakstus, ko izmantot, rakstot vai atbildot uz vēstulēm.",
"duplicate": "Dublēt",
"edit_signature": "Rediģēt parakstu",
"editor_label": "Paraksts",
"html_preview_label": "HTML priekšskatījums",
"name_label": "Nosaukums",
"name_placeholder": "piem., Darbs, Personīgi",
"name_required": "Nosaukums ir obligāts",
"new_signature": "Jauns paraksts",
"no_signature": "Nav paraksta",
"no_signatures": "Paraksti vēl nav izveidoti",
"per_identity_signatures": {
"description": "Pārrakstiet noklusējuma un atbildes parakstu atsevišķām identitātēm.",
"label": "Paraksti pa identitātēm"
},
"plain_text_preview_label": "Vienkāršā teksta priekšskatījums",
"reply": "Atbildes",
"reply_signature": {
"description": "Tiek izmantots, atbildot vai pārsūtot, ja vien tas nav pārrakstīts katrai identitātei atsevišķi.",
"label": "Atbildes paraksts"
},
"show_editor": "Rādīt redaktoru",
"show_preview": "Rādīt priekšskatījumu",
"title": "Paraksti",
"toolbar": {
"align_center": "Centrēt",
"align_left": "Līdzināt pa kreisi",
"align_right": "Līdzināt pa labi",
"bold": "Treknraksts",
"bullet_list": "Aizzīmju saraksts",
"italic": "Kursīvs",
"link": "Saite",
"ordered_list": "Numurēts saraksts",
"remove_color": "Noņemt krāsu",
"strikethrough": "Pārsvītrots",
"text_color": "Teksta krāsa",
"underline": "Pasvītrots"
},
"use_global_default": "Izmantot globālo noklusējumu",
"your_signatures": "Jūsu paraksti ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Gekopieerd!", "copied": "Gekopieerd!",
"copy_failed": "Kopiëren mislukt" "copy_failed": "Kopiëren mislukt"
}, },
"send_now": "Nu verzenden" "send_now": "Nu verzenden",
"create_appointment": "Afspraak maken"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Leesbevestiging aangevraagd (klik om uit te schakelen)", "read_receipt_on": "Leesbevestiging aangevraagd (klik om uit te schakelen)",
@@ -712,7 +713,10 @@
"delete_table": "Tabel verwijderen", "delete_table": "Tabel verwijderen",
"pick_size": "Grootte kiezen" "pick_size": "Grootte kiezen"
}, },
"send_filing_warning": "Verzonden - maar het opruimen daarna is mislukt, mogelijk blijft een oud concept staan." "send_filing_warning": "Verzonden - maar het opruimen daarna is mislukt, mogelijk blijft een oud concept staan.",
"insert_signature": "Handtekening invoegen",
"no_signature": "Geen handtekening",
"select_signature": "Handtekening selecteren"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Bevestigen", "confirm": "Bevestigen",
@@ -888,7 +892,10 @@
"downloads": "Downloads", "downloads": "Downloads",
"content_senders": "Inhoud en afzenders", "content_senders": "Inhoud en afzenders",
"about_data": "Over en gegevens", "about_data": "Over en gegevens",
"debug": "Debuggen" "debug": "Debuggen",
"import": "Importeren",
"sharing": "Delen",
"signatures": "Handtekeningen"
}, },
"tab_groups": { "tab_groups": {
"general": "Algemeen", "general": "Algemeen",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Terug naar mijn account", "back": "Terug naar mijn account",
"managing": "Beheren: {name}" "managing": "Beheren: {name}"
} },
"importer": {
"action_label": "Importeren",
"cancel": "Annuleren",
"choose_files": "Bestanden kiezen",
"conflict_copy": "Beide behouden",
"conflict_description": "Kies wat er moet gebeuren als een geïmporteerd bericht al bestaat.",
"conflict_label": "Omgaan met duplicaten",
"conflict_replace": "Duplicaten vervangen",
"conflict_skip": "Duplicaten overslaan",
"description": "Importeer e-mailberichten uit .eml-bestanden in een map.",
"error_details": "{count, plural, one {# fout} other {# fouten}}",
"fail": "Importeren mislukt",
"file_description": "Selecteer een of meer .eml-bestanden om te importeren.",
"file_label": "Bestanden",
"files_selected": "{count, plural, one {# bestand geselecteerd} other {# bestanden geselecteerd}}",
"folder_description": "Kies de map waarin de berichten worden geïmporteerd.",
"folder_label": "Doelmap",
"import_complete": "Importeren voltooid",
"import_more": "Meer importeren",
"importing": "Importeren...",
"progress_failed": "{count} mislukt",
"progress_imported": "{count} geïmporteerd",
"progress_skipped": "{count} overgeslagen",
"start_import": "{count, plural, one {# bestand importeren} other {# bestanden importeren}}",
"success": "{count, plural, one {# bericht geïmporteerd} other {# berichten geïmporteerd}}",
"summary_failed": "{count, plural, one {# bericht mislukt} other {# berichten mislukt}}",
"summary_imported": "{count, plural, one {# bericht geïmporteerd} other {# berichten geïmporteerd}}",
"summary_skipped": "{count, plural, one {# bericht overgeslagen} other {# berichten overgeslagen}}",
"title": "Mail importeren"
},
"loading": "Laden...",
"refresh": "Vernieuwen"
}, },
"errors": { "errors": {
"page_error_title": "Er is iets misgegaan", "page_error_title": "Er is iets misgegaan",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Map is niet leeg. Maak deze eerst leeg.", "toast_error_delete_has_email": "Map is niet leeg. Maak deze eerst leeg.",
"placeholder_folder_name": "Mapnaam", "placeholder_folder_name": "Mapnaam",
"create": "Aanmaken", "create": "Aanmaken",
"rename_confirm": "Hernoemen" "rename_confirm": "Hernoemen",
"share_folder": "Map delen..."
}, },
"shortcuts": { "shortcuts": {
"title": "Sneltoetsen", "title": "Sneltoetsen",
@@ -2184,7 +2224,11 @@
"save": "Identiteit opslaan", "save": "Identiteit opslaan",
"cancel": "Annuleren", "cancel": "Annuleren",
"creating": "Aanmaken...", "creating": "Aanmaken...",
"updating": "Bijwerken..." "updating": "Bijwerken...",
"signature_store_default": "Standaardhandtekening",
"signature_store_mapping": "Handtekeningtoewijzing",
"signature_store_reply": "Antwoordhandtekening",
"use_global_default": "Algemene standaardinstelling gebruiken"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Sub-adres gebruiken", "button_tooltip": "Sub-adres gebruiken",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 contact geïmporteerd} other {# contacten geïmporteerd}}", "success": "{count, plural, one {1 contact geïmporteerd} other {# contacten geïmporteerd}}",
"failed": "Import mislukt", "failed": "Import mislukt",
"close": "Sluiten", "close": "Sluiten",
"file_too_large": "Bestand is te groot (max 5 MB)" "file_too_large": "Bestand is te groot (max 5 MB)",
"csv_address": "Adres",
"csv_address_book": "Adresboek",
"csv_back": "Terug",
"csv_city": "Plaats",
"csv_company": "Bedrijf",
"csv_country": "Land",
"csv_email": "E-mail",
"csv_first_name": "Voornaam",
"csv_ignore": "Deze kolom negeren",
"csv_job_title": "Functietitel",
"csv_last_name": "Achternaam",
"csv_load_all": "Alles laden",
"csv_map_columns": "Kolommen koppelen",
"csv_nickname": "Bijnaam",
"csv_note": "Notitie",
"csv_phone": "Telefoon",
"csv_postcode": "Postcode",
"csv_preview": "Voorbeeld",
"csv_preview_title": "Voorbeeld ({count, plural, one {# rij} other {# rijen}})",
"csv_region": "Staat/Regio",
"csv_website": "Website",
"file_types_csv": ".csv-bestanden"
}, },
"export": { "export": {
"title": "Contacten exporteren", "title": "Contacten exporteren",
@@ -2569,7 +2635,10 @@
"has_phone": "Met telefoon", "has_phone": "Met telefoon",
"has_photo": "Met foto" "has_photo": "Met foto"
}, },
"open_categories": "Categorieën openen" "open_categories": "Categorieën openen",
"delete": "Verwijderen",
"edit": "Bewerken",
"send_email": "E-mail verzenden"
}, },
"calendar": { "calendar": {
"title": "Agenda", "title": "Agenda",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Menu openen" "nav_open_menu": "Menu openen",
"delete": "Verwijderen",
"duplicate": "Dupliceren",
"edit": "Bewerken",
"freeBusy": {
"busy": "Bezet",
"check": "Beschikbaarheid controleren",
"click_to_select": "Klik op een vrij tijdslot om deze tijd te selecteren",
"free": "Vrij",
"hide": "Beschikbaarheid verbergen",
"loading": "Laden...",
"no_participants": "Voeg deelnemers toe om de beschikbaarheid te controleren.",
"tentative": "Voorlopig",
"timezone": "Tijdzone",
"title": "Beschikbaarheid",
"unavailable": "Afwezig",
"unknown": "Geen informatie"
},
"resources": {
"clear_all": "Alles wissen",
"filter_all": "Alle",
"hide": "Hulpbronnen verbergen",
"no_resources": "Geen hulpbronnen beschikbaar",
"remove": "{name} verwijderen",
"search_placeholder": "Hulpbronnen zoeken...",
"title": "Hulpbronnen",
"type_equipment": "Apparatuur",
"type_other": "Overig",
"type_room": "Ruimtes",
"type_vehicle": "Voertuigen"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Geavanceerd zoeken", "title": "Geavanceerd zoeken",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Mappenstructuur openen", "open_folder_tree": "Mappenstructuur openen",
"other_accounts": "Andere accounts", "other_accounts": "Andere accounts",
"migration_title": "Je bestanden worden bijgewerkt…", "migration_title": "Je bestanden worden bijgewerkt…",
"migration_description": "Mappen en bestanden worden in de juiste structuur georganiseerd. Dit gebeurt slechts één keer." "migration_description": "Mappen en bestanden worden in de juiste structuur georganiseerd. Dit gebeurt slechts één keer.",
"send_as_attachment": "Als bijlage verzenden"
}, },
"smime": { "smime": {
"your_certificates": "Uw certificaten", "your_certificates": "Uw certificaten",
@@ -3308,7 +3408,14 @@
"readWrite": "Lezen en schrijven", "readWrite": "Lezen en schrijven",
"manager": "Beheerder", "manager": "Beheerder",
"custom": "Aangepast" "custom": "Aangepast"
} },
"accept": "Accepteren",
"decline": "Weigeren",
"no_shares_by_me": "Je hebt nog niets gedeeld.",
"no_shares_with_me": "Nog geen mappen met je gedeeld.",
"shared_by": "Gedeeld door",
"tab_shared_by_me": "Gedeeld door mij",
"tab_shared_with_me": "Gedeeld met mij"
}, },
"quote_header": { "quote_header": {
"reply_line": "Op {date} schreef {from}:", "reply_line": "Op {date} schreef {from}:",
@@ -3324,5 +3431,55 @@
"install": "Installeren", "install": "Installeren",
"dont_remind": "Niet meer herinneren", "dont_remind": "Niet meer herinneren",
"dismiss_aria": "Installatiemelding sluiten" "dismiss_aria": "Installatiemelding sluiten"
},
"signatures": {
"add_signature": "Handtekening toevoegen",
"default": "Standaard",
"default_signature": {
"description": "Gebruikt voor nieuwe berichten, tenzij dit per identiteit is overschreven.",
"label": "Standaardhandtekening"
},
"delete_message": "Weet je zeker dat je \"{name}\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
"delete_title": "Handtekening verwijderen?",
"description": "Maak en beheer e-mailhandtekeningen om te gebruiken bij het opstellen of beantwoorden van berichten.",
"duplicate": "Dupliceren",
"edit_signature": "Handtekening bewerken",
"editor_label": "Handtekening",
"html_preview_label": "HTML-voorbeeld",
"name_label": "Naam",
"name_placeholder": "bijv. Werk, Persoonlijk",
"name_required": "Naam is vereist",
"new_signature": "Nieuwe handtekening",
"no_signature": "Geen handtekening",
"no_signatures": "Nog geen handtekeningen",
"per_identity_signatures": {
"description": "Overschrijf de standaard- en antwoordhandtekening voor individuele identiteiten.",
"label": "Handtekeningen per identiteit"
},
"plain_text_preview_label": "Voorbeeld platte tekst",
"reply": "Antwoord",
"reply_signature": {
"description": "Gebruikt bij het beantwoorden of doorsturen, tenzij dit per identiteit is overschreven.",
"label": "Antwoordhandtekening"
},
"show_editor": "Editor tonen",
"show_preview": "Voorbeeld tonen",
"title": "Handtekeningen",
"toolbar": {
"align_center": "Centreren",
"align_left": "Links uitlijnen",
"align_right": "Rechts uitlijnen",
"bold": "Vet",
"bullet_list": "Opsommingslijst",
"italic": "Cursief",
"link": "Link",
"ordered_list": "Genummerde lijst",
"remove_color": "Kleur verwijderen",
"strikethrough": "Doorhalen",
"text_color": "Tekstkleur",
"underline": "Onderstrepen"
},
"use_global_default": "Algemene standaardinstelling gebruiken",
"your_signatures": "Jouw handtekeningen ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Skopiowano!", "copied": "Skopiowano!",
"copy_failed": "Nie udało się skopiować" "copy_failed": "Nie udało się skopiować"
}, },
"send_now": "Wyślij teraz" "send_now": "Wyślij teraz",
"create_appointment": "Utwórz wydarzenie"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Zażądano potwierdzenia przeczytania (kliknij, aby wyłączyć)", "read_receipt_on": "Zażądano potwierdzenia przeczytania (kliknij, aby wyłączyć)",
@@ -712,7 +713,10 @@
"delete_table": "Usuń tabelę", "delete_table": "Usuń tabelę",
"pick_size": "Wybierz rozmiar" "pick_size": "Wybierz rozmiar"
}, },
"send_filing_warning": "Wysłano - ale późniejsze porządkowanie nie powiodło się, może pozostać nieaktualna wersja robocza." "send_filing_warning": "Wysłano - ale późniejsze porządkowanie nie powiodło się, może pozostać nieaktualna wersja robocza.",
"insert_signature": "Wstaw podpis",
"no_signature": "Brak podpisu",
"select_signature": "Wybierz podpis"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Potwierdź", "confirm": "Potwierdź",
@@ -888,7 +892,10 @@
"downloads": "Pobrane", "downloads": "Pobrane",
"content_senders": "Treść i nadawcy", "content_senders": "Treść i nadawcy",
"about_data": "O programie i dane", "about_data": "O programie i dane",
"debug": "Debugowanie" "debug": "Debugowanie",
"import": "Import",
"sharing": "Udostępnianie",
"signatures": "Podpisy"
}, },
"tab_groups": { "tab_groups": {
"general": "Ogólne", "general": "Ogólne",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Powrót do mojego konta", "back": "Powrót do mojego konta",
"managing": "Zarządzanie: {name}" "managing": "Zarządzanie: {name}"
} },
"importer": {
"action_label": "Importuj",
"cancel": "Anuluj",
"choose_files": "Wybierz pliki",
"conflict_copy": "Zachowaj oba",
"conflict_description": "Wybierz, co zrobić, gdy importowana wiadomość już istnieje.",
"conflict_label": "Obsługa duplikatów",
"conflict_replace": "Zastąp duplikaty",
"conflict_skip": "Pomiń duplikaty",
"description": "Importuj wiadomości e-mail z plików .eml do folderu.",
"error_details": "{count, plural, one {# błąd} other {# błędów}}",
"fail": "Import nie powiódł się",
"file_description": "Wybierz jeden lub więcej plików .eml do zaimportowania.",
"file_label": "Pliki",
"files_selected": "{count, plural, one {# plik wybrany} other {# plików wybranych}}",
"folder_description": "Wybierz folder, do którego mają zostać zaimportowane wiadomości.",
"folder_label": "Folder docelowy",
"import_complete": "Import zakończony",
"import_more": "Importuj więcej",
"importing": "Importowanie...",
"progress_failed": "{count} niepowodzeń",
"progress_imported": "{count} zaimportowanych",
"progress_skipped": "{count} pominiętych",
"start_import": "{count, plural, one {Importuj # plik} other {Importuj # plików}}",
"success": "{count, plural, one {# wiadomość zaimportowana} other {# wiadomości zaimportowanych}}",
"summary_failed": "{count, plural, one {# wiadomość nieudana} other {# wiadomości nieudanych}}",
"summary_imported": "{count, plural, one {# wiadomość zaimportowana} other {# wiadomości zaimportowanych}}",
"summary_skipped": "{count, plural, one {# wiadomość pominięta} other {# wiadomości pominiętych}}",
"title": "Import poczty"
},
"loading": "Ładowanie...",
"refresh": "Odśwież"
}, },
"errors": { "errors": {
"page_error_title": "Coś poszło nie tak", "page_error_title": "Coś poszło nie tak",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Folder nie jest pusty. Najpierw go opróżnij.", "toast_error_delete_has_email": "Folder nie jest pusty. Najpierw go opróżnij.",
"placeholder_folder_name": "Nazwa folderu", "placeholder_folder_name": "Nazwa folderu",
"create": "Utwórz", "create": "Utwórz",
"rename_confirm": "Zmień nazwę" "rename_confirm": "Zmień nazwę",
"share_folder": "Udostępnij folder..."
}, },
"shortcuts": { "shortcuts": {
"title": "Skróty klawiszowe", "title": "Skróty klawiszowe",
@@ -2184,7 +2224,11 @@
"save": "Zapisz tożsamość", "save": "Zapisz tożsamość",
"cancel": "Anuluj", "cancel": "Anuluj",
"creating": "Tworzenie...", "creating": "Tworzenie...",
"updating": "Aktualizowanie..." "updating": "Aktualizowanie...",
"signature_store_default": "Domyślny podpis",
"signature_store_mapping": "Przypisanie podpisów",
"signature_store_reply": "Podpis odpowiedzi",
"use_global_default": "Użyj globalnego ustawienia domyślnego"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Użyj podadresu", "button_tooltip": "Użyj podadresu",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {Zaimportowano 1 kontakt} other {Zaimportowano # kontaktów}}", "success": "{count, plural, one {Zaimportowano 1 kontakt} other {Zaimportowano # kontaktów}}",
"failed": "Import nie powiódł się", "failed": "Import nie powiódł się",
"close": "Zamknij", "close": "Zamknij",
"file_too_large": "Plik jest za duży (maks. 5 MB)" "file_too_large": "Plik jest za duży (maks. 5 MB)",
"csv_address": "Adres",
"csv_address_book": "Książka adresowa",
"csv_back": "Wstecz",
"csv_city": "Miasto",
"csv_company": "Firma",
"csv_country": "Kraj",
"csv_email": "E-mail",
"csv_first_name": "Imię",
"csv_ignore": "Ignoruj tę kolumnę",
"csv_job_title": "Stanowisko",
"csv_last_name": "Nazwisko",
"csv_load_all": "Wczytaj wszystkie",
"csv_map_columns": "Mapuj kolumny",
"csv_nickname": "Pseudonim",
"csv_note": "Notatka",
"csv_phone": "Telefon",
"csv_postcode": "Kod pocztowy",
"csv_preview": "Podgląd",
"csv_preview_title": "Podgląd ({count, plural, one {# wiersz} other {# wierszy}})",
"csv_region": "Stan / region",
"csv_website": "Strona internetowa",
"file_types_csv": "pliki .csv"
}, },
"export": { "export": {
"title": "Eksportuj kontakty", "title": "Eksportuj kontakty",
@@ -2569,7 +2635,10 @@
"has_phone": "Z telefonem", "has_phone": "Z telefonem",
"has_photo": "Ze zdjęciem" "has_photo": "Ze zdjęciem"
}, },
"open_categories": "Otwórz kategorie" "open_categories": "Otwórz kategorie",
"delete": "Usuń",
"edit": "Edytuj",
"send_email": "Wyślij e-mail"
}, },
"calendar": { "calendar": {
"title": "Kalendarz", "title": "Kalendarz",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Otwórz menu" "nav_open_menu": "Otwórz menu",
"delete": "Usuń",
"duplicate": "Duplikuj",
"edit": "Edytuj",
"freeBusy": {
"busy": "Zajęty",
"check": "Sprawdź dostępność",
"click_to_select": "Kliknij wolny termin, aby wybrać tę godzinę",
"free": "Wolny",
"hide": "Ukryj dostępność",
"loading": "Ładowanie...",
"no_participants": "Dodaj uczestników, aby sprawdzić dostępność.",
"tentative": "Wstępnie",
"timezone": "Strefa czasowa",
"title": "Dostępność",
"unavailable": "Poza biurem",
"unknown": "Brak informacji"
},
"resources": {
"clear_all": "Wyczyść wszystko",
"filter_all": "Wszystkie",
"hide": "Ukryj zasoby",
"no_resources": "Brak dostępnych zasobów",
"remove": "Usuń {name}",
"search_placeholder": "Szukaj zasobów...",
"title": "Zasoby",
"type_equipment": "Sprzęt",
"type_other": "Inne",
"type_room": "Sale",
"type_vehicle": "Pojazdy"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Wyszukiwanie zaawansowane", "title": "Wyszukiwanie zaawansowane",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Otwórz drzewo folderów", "open_folder_tree": "Otwórz drzewo folderów",
"other_accounts": "Inne konta", "other_accounts": "Inne konta",
"migration_title": "Aktualizowanie plików…", "migration_title": "Aktualizowanie plików…",
"migration_description": "Porządkowanie folderów i plików w odpowiedniej strukturze. Dzieje się to tylko raz." "migration_description": "Porządkowanie folderów i plików w odpowiedniej strukturze. Dzieje się to tylko raz.",
"send_as_attachment": "Wyślij jako załącznik"
}, },
"smime": { "smime": {
"your_certificates": "Twoje certyfikaty", "your_certificates": "Twoje certyfikaty",
@@ -3308,7 +3408,14 @@
"readWrite": "Odczyt i zapis", "readWrite": "Odczyt i zapis",
"manager": "Menedżer", "manager": "Menedżer",
"custom": "Niestandardowe" "custom": "Niestandardowe"
} },
"accept": "Akceptuj",
"decline": "Odrzuć",
"no_shares_by_me": "Nie udostępniono jeszcze niczego.",
"no_shares_with_me": "Nie udostępniono Ci jeszcze żadnych folderów.",
"shared_by": "Udostępnione przez",
"tab_shared_by_me": "Udostępnione przeze mnie",
"tab_shared_with_me": "Udostępnione ze mną"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date}, {from} napisał(a):", "reply_line": "{date}, {from} napisał(a):",
@@ -3324,5 +3431,55 @@
"install": "Zainstaluj", "install": "Zainstaluj",
"dont_remind": "Nie przypominaj mi więcej", "dont_remind": "Nie przypominaj mi więcej",
"dismiss_aria": "Zamknij monit instalacji" "dismiss_aria": "Zamknij monit instalacji"
},
"signatures": {
"add_signature": "Dodaj podpis",
"default": "Domyślny",
"default_signature": {
"description": "Używany w nowych wiadomościach, chyba że zostanie zastąpiony dla danej tożsamości.",
"label": "Domyślny podpis"
},
"delete_message": "Czy na pewno chcesz usunąć \"{name}\"? Tej operacji nie można cofnąć.",
"delete_title": "Usunąć podpis?",
"description": "Twórz i zarządzaj podpisami e-mail używanymi podczas pisania wiadomości lub odpowiadania na nie.",
"duplicate": "Duplikuj",
"edit_signature": "Edytuj podpis",
"editor_label": "Podpis",
"html_preview_label": "Podgląd HTML",
"name_label": "Nazwa",
"name_placeholder": "np. Służbowy, Prywatny",
"name_required": "Nazwa jest wymagana",
"new_signature": "Nowy podpis",
"no_signature": "Brak podpisu",
"no_signatures": "Nie ma jeszcze żadnych podpisów",
"per_identity_signatures": {
"description": "Zastąp domyślny podpis i podpis odpowiedzi dla poszczególnych tożsamości.",
"label": "Podpisy dla poszczególnych tożsamości"
},
"plain_text_preview_label": "Podgląd tekstu",
"reply": "Odpowiedź",
"reply_signature": {
"description": "Używany podczas odpowiadania lub przekazywania wiadomości dalej, chyba że zostanie zastąpiony dla danej tożsamości.",
"label": "Podpis odpowiedzi"
},
"show_editor": "Pokaż edytor",
"show_preview": "Pokaż podgląd",
"title": "Podpisy",
"toolbar": {
"align_center": "Wyśrodkuj",
"align_left": "Wyrównaj do lewej",
"align_right": "Wyrównaj do prawej",
"bold": "Pogrubienie",
"bullet_list": "Lista punktowana",
"italic": "Kursywa",
"link": "Link",
"ordered_list": "Lista numerowana",
"remove_color": "Usuń kolor",
"strikethrough": "Przekreślenie",
"text_color": "Kolor tekstu",
"underline": "Podkreślenie"
},
"use_global_default": "Użyj globalnego ustawienia domyślnego",
"your_signatures": "Twoje podpisy ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Copiado!", "copied": "Copiado!",
"copy_failed": "Falha ao copiar" "copy_failed": "Falha ao copiar"
}, },
"send_now": "Enviar agora" "send_now": "Enviar agora",
"create_appointment": "Criar evento"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Confirmação de leitura solicitada (clique para desativar)", "read_receipt_on": "Confirmação de leitura solicitada (clique para desativar)",
@@ -712,7 +713,10 @@
"delete_table": "Excluir tabela", "delete_table": "Excluir tabela",
"pick_size": "Escolher tamanho" "pick_size": "Escolher tamanho"
}, },
"send_filing_warning": "Enviado - mas a limpeza posterior falhou, um rascunho antigo pode permanecer." "send_filing_warning": "Enviado - mas a limpeza posterior falhou, um rascunho antigo pode permanecer.",
"insert_signature": "Inserir assinatura",
"no_signature": "Sem assinatura",
"select_signature": "Selecionar assinatura"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirmar", "confirm": "Confirmar",
@@ -888,7 +892,10 @@
"downloads": "Downloads", "downloads": "Downloads",
"content_senders": "Conteúdo e remetentes", "content_senders": "Conteúdo e remetentes",
"about_data": "Sobre e dados", "about_data": "Sobre e dados",
"debug": "Depuração" "debug": "Depuração",
"import": "Importar",
"sharing": "Compartilhamento",
"signatures": "Assinaturas"
}, },
"tab_groups": { "tab_groups": {
"general": "Geral", "general": "Geral",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Voltar para minha conta", "back": "Voltar para minha conta",
"managing": "Gerenciando: {name}" "managing": "Gerenciando: {name}"
} },
"importer": {
"action_label": "Importar",
"cancel": "Cancelar",
"choose_files": "Escolher arquivos",
"conflict_copy": "Manter ambos",
"conflict_description": "Escolha o que fazer quando uma mensagem importada já existir.",
"conflict_label": "Tratamento de duplicados",
"conflict_replace": "Substituir duplicados",
"conflict_skip": "Ignorar duplicados",
"description": "Importe mensagens de e-mail de arquivos .eml para uma pasta.",
"error_details": "{count, plural, one {# erro} other {# erros}}",
"fail": "Falha na importação",
"file_description": "Selecione um ou mais arquivos .eml para importar.",
"file_label": "Arquivos",
"files_selected": "{count, plural, one {# arquivo selecionado} other {# arquivos selecionados}}",
"folder_description": "Escolha a pasta para a qual importar as mensagens.",
"folder_label": "Pasta de destino",
"import_complete": "Importação concluída",
"import_more": "Importar mais",
"importing": "Importando...",
"progress_failed": "{count} com falha",
"progress_imported": "{count} importados",
"progress_skipped": "{count} ignorados",
"start_import": "{count, plural, one {Importar # arquivo} other {Importar # arquivos}}",
"success": "{count, plural, one {# mensagem importada} other {# mensagens importadas}}",
"summary_failed": "{count, plural, one {# mensagem falhou} other {# mensagens falharam}}",
"summary_imported": "{count, plural, one {# mensagem importada} other {# mensagens importadas}}",
"summary_skipped": "{count, plural, one {# mensagem ignorada} other {# mensagens ignoradas}}",
"title": "Importar E-mail"
},
"loading": "Carregando...",
"refresh": "Atualizar"
}, },
"errors": { "errors": {
"page_error_title": "Algo deu errado", "page_error_title": "Algo deu errado",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "A pasta não está vazia. Esvazie-a primeiro.", "toast_error_delete_has_email": "A pasta não está vazia. Esvazie-a primeiro.",
"placeholder_folder_name": "Nome da pasta", "placeholder_folder_name": "Nome da pasta",
"create": "Criar", "create": "Criar",
"rename_confirm": "Renomear" "rename_confirm": "Renomear",
"share_folder": "Compartilhar pasta..."
}, },
"shortcuts": { "shortcuts": {
"title": "Atalhos de Teclado", "title": "Atalhos de Teclado",
@@ -2184,7 +2224,11 @@
"save": "Salvar Identidade", "save": "Salvar Identidade",
"cancel": "Cancelar", "cancel": "Cancelar",
"creating": "Criando...", "creating": "Criando...",
"updating": "Atualizando..." "updating": "Atualizando...",
"signature_store_default": "Assinatura padrão",
"signature_store_mapping": "Mapeamento de assinatura",
"signature_store_reply": "Assinatura de resposta",
"use_global_default": "Usar padrão global"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Usar sub-endereço", "button_tooltip": "Usar sub-endereço",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 contato importado} other {# contatos importados}}", "success": "{count, plural, one {1 contato importado} other {# contatos importados}}",
"failed": "Falha na importação", "failed": "Falha na importação",
"close": "Fechar", "close": "Fechar",
"file_too_large": "Arquivo muito grande (máx. 5 MB)" "file_too_large": "Arquivo muito grande (máx. 5 MB)",
"csv_address": "Endereço",
"csv_address_book": "Catálogo de endereços",
"csv_back": "Voltar",
"csv_city": "Cidade",
"csv_company": "Empresa",
"csv_country": "País",
"csv_email": "E-mail",
"csv_first_name": "Nome",
"csv_ignore": "Ignorar esta coluna",
"csv_job_title": "Cargo",
"csv_last_name": "Sobrenome",
"csv_load_all": "Carregar tudo",
"csv_map_columns": "Mapear colunas",
"csv_nickname": "Apelido",
"csv_note": "Nota",
"csv_phone": "Telefone",
"csv_postcode": "Código postal",
"csv_preview": "Pré-visualização",
"csv_preview_title": "Pré-visualização ({count, plural, one {# linha} other {# linhas}})",
"csv_region": "Estado/Região",
"csv_website": "Site",
"file_types_csv": "Arquivos .csv"
}, },
"export": { "export": {
"title": "Exportar contatos", "title": "Exportar contatos",
@@ -2569,7 +2635,10 @@
"has_phone": "Com telefone", "has_phone": "Com telefone",
"has_photo": "Com foto" "has_photo": "Com foto"
}, },
"open_categories": "Abrir categorias" "open_categories": "Abrir categorias",
"delete": "Excluir",
"edit": "Editar",
"send_email": "Enviar e-mail"
}, },
"calendar": { "calendar": {
"title": "Calendário", "title": "Calendário",
@@ -2988,7 +3057,37 @@
"due_tomorrow": "Vence amanhã", "due_tomorrow": "Vence amanhã",
"overdue": "Atrasada" "overdue": "Atrasada"
}, },
"nav_open_menu": "Abrir menu" "nav_open_menu": "Abrir menu",
"delete": "Excluir",
"duplicate": "Duplicar",
"edit": "Editar",
"freeBusy": {
"busy": "Ocupado",
"check": "Verificar disponibilidade",
"click_to_select": "Clique em um horário livre para selecionar este horário",
"free": "Livre",
"hide": "Ocultar disponibilidade",
"loading": "Carregando...",
"no_participants": "Adicione participantes para verificar a disponibilidade.",
"tentative": "Provisório",
"timezone": "Fuso horário",
"title": "Disponibilidade",
"unavailable": "Fora do escritório",
"unknown": "Sem informação"
},
"resources": {
"clear_all": "Limpar tudo",
"filter_all": "Todos",
"hide": "Ocultar recursos",
"no_resources": "Nenhum recurso disponível",
"remove": "Remover {name}",
"search_placeholder": "Pesquisar recursos...",
"title": "Recursos",
"type_equipment": "Equipamento",
"type_other": "Outro",
"type_room": "Salas",
"type_vehicle": "Veículos"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Pesquisa avançada", "title": "Pesquisa avançada",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Abrir árvore de pastas", "open_folder_tree": "Abrir árvore de pastas",
"other_accounts": "Outras contas", "other_accounts": "Outras contas",
"migration_title": "Atualizando seus arquivos…", "migration_title": "Atualizando seus arquivos…",
"migration_description": "Organizando pastas e arquivos em sua estrutura adequada. Isso acontece apenas uma vez." "migration_description": "Organizando pastas e arquivos em sua estrutura adequada. Isso acontece apenas uma vez.",
"send_as_attachment": "Enviar como anexo"
}, },
"smime": { "smime": {
"your_certificates": "Seus certificados", "your_certificates": "Seus certificados",
@@ -3308,7 +3408,14 @@
"readWrite": "Leitura e escrita", "readWrite": "Leitura e escrita",
"manager": "Gerente", "manager": "Gerente",
"custom": "Personalizado" "custom": "Personalizado"
} },
"accept": "Aceitar",
"decline": "Recusar",
"no_shares_by_me": "Você ainda não compartilhou nada.",
"no_shares_with_me": "Nenhuma pasta foi compartilhada com você ainda.",
"shared_by": "Compartilhado por",
"tab_shared_by_me": "Compartilhado por mim",
"tab_shared_with_me": "Compartilhado comigo"
}, },
"quote_header": { "quote_header": {
"reply_line": "Em {date}, {from} escreveu:", "reply_line": "Em {date}, {from} escreveu:",
@@ -3324,5 +3431,55 @@
"install": "Instalar", "install": "Instalar",
"dont_remind": "Não lembrar novamente", "dont_remind": "Não lembrar novamente",
"dismiss_aria": "Dispensar aviso de instalação" "dismiss_aria": "Dispensar aviso de instalação"
},
"signatures": {
"add_signature": "Adicionar assinatura",
"default": "Padrão",
"default_signature": {
"description": "Usada em novas mensagens, a menos que seja substituída por identidade.",
"label": "Assinatura padrão"
},
"delete_message": "Tem certeza de que deseja excluir \"{name}\"? Esta ação não pode ser desfeita.",
"delete_title": "Excluir assinatura?",
"description": "Crie e gerencie assinaturas de e-mail para usar ao redigir ou responder.",
"duplicate": "Duplicar",
"edit_signature": "Editar assinatura",
"editor_label": "Assinatura",
"html_preview_label": "Pré-visualização HTML",
"name_label": "Nome",
"name_placeholder": "ex. Trabalho, Pessoal",
"name_required": "Nome é obrigatório",
"new_signature": "Nova assinatura",
"no_signature": "Sem assinatura",
"no_signatures": "Ainda não há assinaturas",
"per_identity_signatures": {
"description": "Substitua a assinatura padrão e a de resposta para identidades específicas.",
"label": "Assinaturas por identidade"
},
"plain_text_preview_label": "Pré-visualização em texto simples",
"reply": "Resposta",
"reply_signature": {
"description": "Usada ao responder ou encaminhar, a menos que seja substituída por identidade.",
"label": "Assinatura de resposta"
},
"show_editor": "Mostrar editor",
"show_preview": "Mostrar pré-visualização",
"title": "Assinaturas",
"toolbar": {
"align_center": "Centralizar",
"align_left": "Alinhar à esquerda",
"align_right": "Alinhar à direita",
"bold": "Negrito",
"bullet_list": "Lista com marcadores",
"italic": "Itálico",
"link": "Link",
"ordered_list": "Lista numerada",
"remove_color": "Remover cor",
"strikethrough": "Tachado",
"text_color": "Cor do texto",
"underline": "Sublinhado"
},
"use_global_default": "Usar padrão global",
"your_signatures": "Suas assinaturas ({count})"
} }
} }
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "Copiat!", "copied": "Copiat!",
"copy_failed": "Copierea a eșuat" "copy_failed": "Copierea a eșuat"
}, },
"send_now": "Trimite acum" "send_now": "Trimite acum",
"create_appointment": "Creați o programare"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Solicitare confirmare de citire (faceți clic pentru a dezactiva)", "read_receipt_on": "Solicitare confirmare de citire (faceți clic pentru a dezactiva)",
@@ -712,7 +713,10 @@
"delete_table": "Șterge tabelul", "delete_table": "Șterge tabelul",
"pick_size": "Alege dimensiunea" "pick_size": "Alege dimensiunea"
}, },
"send_filing_warning": "Trimis - dar curățarea ulterioară a eșuat, poate rămâne o ciornă veche." "send_filing_warning": "Trimis - dar curățarea ulterioară a eșuat, poate rămâne o ciornă veche.",
"insert_signature": "Inserează semnătura",
"no_signature": "Fără semnătură",
"select_signature": "Selectați semnătura"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Confirmare", "confirm": "Confirmare",
@@ -891,7 +895,10 @@
"downloads": "Descărcări", "downloads": "Descărcări",
"content_senders": "Conținut și expeditori", "content_senders": "Conținut și expeditori",
"about_data": "Despre & Date", "about_data": "Despre & Date",
"debug": "Depanare" "debug": "Depanare",
"import": "Import",
"sharing": "Partajare",
"signatures": "Semnături"
}, },
"tab_groups": { "tab_groups": {
"general": "Generalități", "general": "Generalități",
@@ -2007,7 +2014,39 @@
"preview": { "preview": {
"label": "Previzualizare" "label": "Previzualizare"
} }
} },
"importer": {
"action_label": "Import",
"cancel": "Anulează",
"choose_files": "Alegeți fișierele",
"conflict_copy": "Păstrează ambele",
"conflict_description": "Alegeți ce se întâmplă atunci când un mesaj importat există deja.",
"conflict_label": "Gestionarea duplicatelor",
"conflict_replace": "Înlocuiește duplicatele",
"conflict_skip": "Omite duplicatele",
"description": "Importați mesaje de e-mail din fișiere .eml într-un dosar.",
"error_details": "{count, plural, one {# eroare} other {# erori}}",
"fail": "Importul a eșuat",
"file_description": "Selectați unul sau mai multe fișiere .eml pentru a le importa.",
"file_label": "Fișiere",
"files_selected": "{count, plural, one {# fișier selectat} other {# fișiere selectate}}",
"folder_description": "Alegeți dosarul în care se vor importa mesajele.",
"folder_label": "Dosar de destinație",
"import_complete": "Import finalizat",
"import_more": "Importă mai multe",
"importing": "Se importă...",
"progress_failed": "{count} eșuate",
"progress_imported": "{count} importate",
"progress_skipped": "{count} omise",
"start_import": "{count, plural, one {Importă # fișier} other {Importă # fișiere}}",
"success": "{count, plural, one {# mesaj importat} other {# mesaje importate}}",
"summary_failed": "{count, plural, one {# mesaj eșuat} other {# mesaje eșuate}}",
"summary_imported": "{count, plural, one {# mesaj importat} other {# mesaje importate}}",
"summary_skipped": "{count, plural, one {# mesaj omis} other {# mesaje omise}}",
"title": "Import mesaje"
},
"loading": "Se încarcă...",
"refresh": "Reîmprospătează"
}, },
"errors": { "errors": {
"page_error_title": "A apărut o eroare", "page_error_title": "A apărut o eroare",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Nu s-a putut redenumi folderul", "toast_error_rename": "Nu s-a putut redenumi folderul",
"toast_error_delete": "Nu s-a putut șterge folderul", "toast_error_delete": "Nu s-a putut șterge folderul",
"toast_error_delete_has_children": "Dosarul conține subdosare. Ștergeți-le mai întâi.", "toast_error_delete_has_children": "Dosarul conține subdosare. Ștergeți-le mai întâi.",
"toast_error_delete_has_email": "Dosarul nu este gol. Goliți-l mai întâi." "toast_error_delete_has_email": "Dosarul nu este gol. Goliți-l mai întâi.",
"share_folder": "Partajare dosar..."
}, },
"shortcuts": { "shortcuts": {
"title": "Comenzi rapide de la tastatură", "title": "Comenzi rapide de la tastatură",
@@ -2184,7 +2224,11 @@
"save": "Salvați identitatea", "save": "Salvați identitatea",
"cancel": "Anulează", "cancel": "Anulează",
"creating": "Se creează...", "creating": "Se creează...",
"updating": "Se actualizează..." "updating": "Se actualizează...",
"signature_store_default": "Semnătură implicită",
"signature_store_mapping": "Mapare semnături",
"signature_store_reply": "Semnătură pentru răspuns",
"use_global_default": "Utilizați valoarea implicită globală"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Utilizați subadrese", "button_tooltip": "Utilizați subadrese",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {1 contact importat} few {# contacte importate} other {# de contacte importate}}", "success": "{count, plural, one {1 contact importat} few {# contacte importate} other {# de contacte importate}}",
"failed": "Importul a eșuat", "failed": "Importul a eșuat",
"close": "Închide", "close": "Închide",
"file_too_large": "Fișierul este prea mare (max. 5 MB)" "file_too_large": "Fișierul este prea mare (max. 5 MB)",
"csv_address": "Adresă",
"csv_address_book": "Agendă",
"csv_back": "Înapoi",
"csv_city": "Oraș",
"csv_company": "Companie",
"csv_country": "Țară",
"csv_email": "E-mail",
"csv_first_name": "Prenume",
"csv_ignore": "Ignoră această coloană",
"csv_job_title": "Funcție",
"csv_last_name": "Nume de familie",
"csv_load_all": "Încarcă tot",
"csv_map_columns": "Mapare coloane",
"csv_nickname": "Pseudonim",
"csv_note": "Notă",
"csv_phone": "Telefon",
"csv_postcode": "Cod poștal",
"csv_preview": "Previzualizare",
"csv_preview_title": "Previzualizare ({count, plural, one {# rând} other {# rânduri}})",
"csv_region": "Stat/Regiune",
"csv_website": "Site web",
"file_types_csv": "fișiere .csv"
}, },
"export": { "export": {
"title": "Exportați contactele", "title": "Exportați contactele",
@@ -2569,7 +2635,10 @@
"has_email": "Are e-mail", "has_email": "Are e-mail",
"has_phone": "Are telefon", "has_phone": "Are telefon",
"has_photo": "Are fotografie" "has_photo": "Are fotografie"
} },
"delete": "Șterge",
"edit": "Editare",
"send_email": "Trimite e-mail"
}, },
"calendar": { "calendar": {
"title": "Calendar", "title": "Calendar",
@@ -2988,6 +3057,36 @@
"due_today": "Astăzi", "due_today": "Astăzi",
"due_tomorrow": "Mâine", "due_tomorrow": "Mâine",
"overdue": "Restant" "overdue": "Restant"
},
"delete": "Șterge",
"duplicate": "Duplică",
"edit": "Editare",
"freeBusy": {
"busy": "Ocupat",
"check": "Verifică disponibilitatea",
"click_to_select": "Faceți clic pe un interval liber pentru a selecta această oră",
"free": "Liber",
"hide": "Ascunde disponibilitatea",
"loading": "Se încarcă...",
"no_participants": "Adăugați participanți pentru a verifica disponibilitatea.",
"tentative": "Provizoriu",
"timezone": "Fus orar",
"title": "Disponibilitate",
"unavailable": "În afara biroului",
"unknown": "Fără informații"
},
"resources": {
"clear_all": "Șterge tot",
"filter_all": "Toate",
"hide": "Ascunde resursele",
"no_resources": "Nu sunt resurse disponibile",
"remove": "Elimină {name}",
"search_placeholder": "Căutare resurse...",
"title": "Resurse",
"type_equipment": "Echipamente",
"type_other": "Altele",
"type_room": "Săli",
"type_vehicle": "Vehicule"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "Citire și scriere", "readWrite": "Citire și scriere",
"manager": "Manager", "manager": "Manager",
"custom": "Personalizat" "custom": "Personalizat"
} },
"accept": "Acceptă",
"decline": "Refuză",
"no_shares_by_me": "Nu ați partajat încă nimic.",
"no_shares_with_me": "Niciun dosar partajat cu dvs. încă.",
"shared_by": "Partajat de",
"tab_shared_by_me": "Partajate de mine",
"tab_shared_with_me": "Partajate cu mine"
}, },
"advanced_search": { "advanced_search": {
"title": "Căutare avansată", "title": "Căutare avansată",
@@ -3176,7 +3282,8 @@
"disabled_description": "Încărcarea fișierelor de dimensiuni mari prin intermediul WebDAV poate provoca instabilitate în Stalwart /RocksDB, inclusiv blocări din cauza epuizării memoriei și utilizare irecuperabilă a spațiului pe disc. Este posibil ca fișierele șterse să nu fie eliminate imediat din spațiul de stocare blob. Această funcție nu este recomandată pentru mediile de producție.", "disabled_description": "Încărcarea fișierelor de dimensiuni mari prin intermediul WebDAV poate provoca instabilitate în Stalwart /RocksDB, inclusiv blocări din cauza epuizării memoriei și utilizare irecuperabilă a spațiului pe disc. Este posibil ca fișierele șterse să nu fie eliminate imediat din spațiul de stocare blob. Această funcție nu este recomandată pentru mediile de producție.",
"stability_warning": "Încărcarea fișierelor de dimensiuni mari poate provoca instabilitatea serverului. Este posibil ca fișierele șterse să nu fie eliminate imediat din spațiul de stocare. Utilizați cu precauție.", "stability_warning": "Încărcarea fișierelor de dimensiuni mari poate provoca instabilitatea serverului. Este posibil ca fișierele șterse să nu fie eliminate imediat din spațiul de stocare. Utilizați cu precauție.",
"migration_title": "Se actualizează fișierele...", "migration_title": "Se actualizează fișierele...",
"migration_description": "Organizarea dosarelor și a fișierelor în structura corespunzătoare. Această operațiune se efectuează o singură dată." "migration_description": "Organizarea dosarelor și a fișierelor în structura corespunzătoare. Această operațiune se efectuează o singură dată.",
"send_as_attachment": "Trimite ca atașament"
}, },
"smime": { "smime": {
"your_certificates": "Certificatele dvs.", "your_certificates": "Certificatele dvs.",
@@ -3324,5 +3431,55 @@
"install": "Instalați", "install": "Instalați",
"dont_remind": "Nu-mi mai reaminti", "dont_remind": "Nu-mi mai reaminti",
"dismiss_aria": "Ignorați solicitarea de instalare" "dismiss_aria": "Ignorați solicitarea de instalare"
},
"signatures": {
"add_signature": "Adăugați semnătură",
"default": "Implicit",
"default_signature": {
"description": "Utilizată pentru mesajele noi, cu excepția cazului în care este suprascrisă pentru o anumită identitate.",
"label": "Semnătură implicită"
},
"delete_message": "Sunteți sigur că doriți să ștergeți \"{name}\"? Această acțiune nu poate fi anulată.",
"delete_title": "Ștergeți semnătura?",
"description": "Creați și gestionați semnături de e-mail pentru a le utiliza la redactare sau răspuns.",
"duplicate": "Duplică",
"edit_signature": "Editați semnătura",
"editor_label": "Semnătură",
"html_preview_label": "Previzualizare HTML",
"name_label": "Nume",
"name_placeholder": "de ex. Serviciu, Personal",
"name_required": "Numele este obligatoriu",
"new_signature": "Semnătură nouă",
"no_signature": "Fără semnătură",
"no_signatures": "Nicio semnătură încă",
"per_identity_signatures": {
"description": "Suprascrieți semnătura implicită și cea de răspuns pentru identități individuale.",
"label": "Semnături pe identitate"
},
"plain_text_preview_label": "Previzualizare text simplu",
"reply": "Răspuns",
"reply_signature": {
"description": "Utilizată la răspuns sau redirecționare, cu excepția cazului în care este suprascrisă pentru o anumită identitate.",
"label": "Semnătură pentru răspuns"
},
"show_editor": "Afișează editorul",
"show_preview": "Afișează previzualizarea",
"title": "Semnături",
"toolbar": {
"align_center": "Centrare",
"align_left": "Aliniere la stânga",
"align_right": "Aliniere la dreapta",
"bold": "Aldin",
"bullet_list": "Listă cu marcatori",
"italic": "Cursiv",
"link": "Link",
"ordered_list": "Listă numerotată",
"remove_color": "Elimină culoarea",
"strikethrough": "Tăiat",
"text_color": "Culoarea textului",
"underline": "Subliniat"
},
"use_global_default": "Utilizați valoarea implicită globală",
"your_signatures": "Semnăturile dvs. ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Скопировано!", "copied": "Скопировано!",
"copy_failed": "Не удалось скопировать" "copy_failed": "Не удалось скопировать"
}, },
"send_now": "Отправить сейчас" "send_now": "Отправить сейчас",
"create_appointment": "Создать встречу"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Запрошено уведомление о прочтении (нажмите, чтобы отключить)", "read_receipt_on": "Запрошено уведомление о прочтении (нажмите, чтобы отключить)",
@@ -712,7 +713,10 @@
"delete_table": "Удалить таблицу", "delete_table": "Удалить таблицу",
"pick_size": "Выбрать размер" "pick_size": "Выбрать размер"
}, },
"send_filing_warning": "Отправлено - но последующая очистка не удалась, может остаться устаревший черновик." "send_filing_warning": "Отправлено - но последующая очистка не удалась, может остаться устаревший черновик.",
"insert_signature": "Вставить подпись",
"no_signature": "Без подписи",
"select_signature": "Выбрать подпись"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Подтвердить", "confirm": "Подтвердить",
@@ -888,7 +892,10 @@
"downloads": "Загрузки", "downloads": "Загрузки",
"content_senders": "Содержимое и отправители", "content_senders": "Содержимое и отправители",
"about_data": "О программе и данные", "about_data": "О программе и данные",
"debug": "Отладка" "debug": "Отладка",
"import": "Импорт",
"sharing": "Общий доступ",
"signatures": "Подписи"
}, },
"tab_groups": { "tab_groups": {
"general": "Общие", "general": "Общие",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Назад к моей учётной записи", "back": "Назад к моей учётной записи",
"managing": "Управление: {name}" "managing": "Управление: {name}"
} },
"importer": {
"action_label": "Импорт",
"cancel": "Отмена",
"choose_files": "Выбрать файлы",
"conflict_copy": "Сохранить оба",
"conflict_description": "Выберите, что делать, если импортируемое сообщение уже существует.",
"conflict_label": "Обработка дубликатов",
"conflict_replace": "Заменить дубликаты",
"conflict_skip": "Пропустить дубликаты",
"description": "Импортируйте сообщения электронной почты из файлов .eml в папку.",
"error_details": "{count, plural, one {# ошибка} other {# ошибок}}",
"fail": "Не удалось выполнить импорт",
"file_description": "Выберите один или несколько файлов .eml для импорта.",
"file_label": "Файлы",
"files_selected": "{count, plural, one {# файл выбран} other {# файлов выбрано}}",
"folder_description": "Выберите папку, в которую нужно импортировать сообщения.",
"folder_label": "Папка назначения",
"import_complete": "Импорт завершён",
"import_more": "Импортировать ещё",
"importing": "Импортирование...",
"progress_failed": "{count} не удалось",
"progress_imported": "{count} импортировано",
"progress_skipped": "{count} пропущено",
"start_import": "{count, plural, one {Импортировать # файл} other {Импортировать # файлов}}",
"success": "{count, plural, one {# сообщение импортировано} other {# сообщений импортировано}}",
"summary_failed": "{count, plural, one {# сообщение не импортировано} other {# сообщений не импортировано}}",
"summary_imported": "{count, plural, one {# сообщение импортировано} other {# сообщений импортировано}}",
"summary_skipped": "{count, plural, one {# сообщение пропущено} other {# сообщений пропущено}}",
"title": "Импорт почты"
},
"loading": "Загрузка...",
"refresh": "Обновить"
}, },
"errors": { "errors": {
"page_error_title": "Что-то пошло не так", "page_error_title": "Что-то пошло не так",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Папка не пуста. Сначала очистите её.", "toast_error_delete_has_email": "Папка не пуста. Сначала очистите её.",
"placeholder_folder_name": "Имя папки", "placeholder_folder_name": "Имя папки",
"create": "Создать", "create": "Создать",
"rename_confirm": "Переименовать" "rename_confirm": "Переименовать",
"share_folder": "Поделиться папкой..."
}, },
"shortcuts": { "shortcuts": {
"title": "Сочетания клавиш", "title": "Сочетания клавиш",
@@ -2184,7 +2224,11 @@
"save": "Сохранить идентификацию", "save": "Сохранить идентификацию",
"cancel": "Отмена", "cancel": "Отмена",
"creating": "Создание...", "creating": "Создание...",
"updating": "Обновление..." "updating": "Обновление...",
"signature_store_default": "Подпись по умолчанию",
"signature_store_mapping": "Сопоставление подписей",
"signature_store_reply": "Подпись для ответа",
"use_global_default": "Использовать значение по умолчанию"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Использовать суб-адрес", "button_tooltip": "Использовать суб-адрес",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 контакт импортирован} other {# контактов импортировано}}", "success": "{count, plural, one {1 контакт импортирован} other {# контактов импортировано}}",
"failed": "Импорт не выполнен", "failed": "Импорт не выполнен",
"close": "Закрыть", "close": "Закрыть",
"file_too_large": "Файл слишком большой (макс. 5 МБ)" "file_too_large": "Файл слишком большой (макс. 5 МБ)",
"csv_address": "Адрес",
"csv_address_book": "Адресная книга",
"csv_back": "Назад",
"csv_city": "Город",
"csv_company": "Компания",
"csv_country": "Страна",
"csv_email": "Email",
"csv_first_name": "Имя",
"csv_ignore": "Игнорировать этот столбец",
"csv_job_title": "Должность",
"csv_last_name": "Фамилия",
"csv_load_all": "Загрузить все",
"csv_map_columns": "Сопоставить столбцы",
"csv_nickname": "Псевдоним",
"csv_note": "Заметка",
"csv_phone": "Телефон",
"csv_postcode": "Почтовый индекс",
"csv_preview": "Предпросмотр",
"csv_preview_title": "Предпросмотр ({count, plural, one {# строка} other {# строк}})",
"csv_region": "Область/регион",
"csv_website": "Веб-сайт",
"file_types_csv": "Файлы .csv"
}, },
"export": { "export": {
"title": "Экспорт контактов", "title": "Экспорт контактов",
@@ -2569,7 +2635,10 @@
"has_phone": "С телефоном", "has_phone": "С телефоном",
"has_photo": "С фото" "has_photo": "С фото"
}, },
"open_categories": "Открыть категории" "open_categories": "Открыть категории",
"delete": "Удалить",
"edit": "Редактировать",
"send_email": "Отправить письмо"
}, },
"calendar": { "calendar": {
"title": "Календарь", "title": "Календарь",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Открыть меню" "nav_open_menu": "Открыть меню",
"delete": "Удалить",
"duplicate": "Дублировать",
"edit": "Редактировать",
"freeBusy": {
"busy": "Занято",
"check": "Проверить доступность",
"click_to_select": "Нажмите на свободный слот, чтобы выбрать это время",
"free": "Свободно",
"hide": "Скрыть доступность",
"loading": "Загрузка...",
"no_participants": "Добавьте участников, чтобы проверить доступность.",
"tentative": "Предварительно",
"timezone": "Часовой пояс",
"title": "Доступность",
"unavailable": "Отсутствует",
"unknown": "Нет данных"
},
"resources": {
"clear_all": "Очистить всё",
"filter_all": "Все",
"hide": "Скрыть ресурсы",
"no_resources": "Нет доступных ресурсов",
"remove": "Удалить {name}",
"search_placeholder": "Поиск ресурсов...",
"title": "Ресурсы",
"type_equipment": "Оборудование",
"type_other": "Другое",
"type_room": "Помещения",
"type_vehicle": "Транспорт"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Расширенный поиск", "title": "Расширенный поиск",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Открыть дерево папок", "open_folder_tree": "Открыть дерево папок",
"other_accounts": "Другие учётные записи", "other_accounts": "Другие учётные записи",
"migration_title": "Обновление ваших файлов…", "migration_title": "Обновление ваших файлов…",
"migration_description": "Папки и файлы упорядочиваются в правильную структуру. Это происходит только один раз." "migration_description": "Папки и файлы упорядочиваются в правильную структуру. Это происходит только один раз.",
"send_as_attachment": "Отправить как вложение"
}, },
"smime": { "smime": {
"your_certificates": "Ваши сертификаты", "your_certificates": "Ваши сертификаты",
@@ -3308,7 +3408,14 @@
"readWrite": "Чтение и запись", "readWrite": "Чтение и запись",
"manager": "Управляющий", "manager": "Управляющий",
"custom": "Пользовательский" "custom": "Пользовательский"
} },
"accept": "Принять",
"decline": "Отклонить",
"no_shares_by_me": "Вы пока ничего не предоставили в общий доступ.",
"no_shares_with_me": "Пока нет папок, к которым вам предоставлен доступ.",
"shared_by": "Предоставлено",
"tab_shared_by_me": "Предоставлено мной",
"tab_shared_with_me": "Предоставлено мне"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date}, {from} написал:", "reply_line": "{date}, {from} написал:",
@@ -3324,5 +3431,55 @@
"install": "Установить", "install": "Установить",
"dont_remind": "Больше не напоминать", "dont_remind": "Больше не напоминать",
"dismiss_aria": "Закрыть запрос на установку" "dismiss_aria": "Закрыть запрос на установку"
},
"signatures": {
"add_signature": "Добавить подпись",
"default": "По умолчанию",
"default_signature": {
"description": "Используется для новых сообщений, если не переопределено для отдельной идентификации.",
"label": "Подпись по умолчанию"
},
"delete_message": "Вы уверены, что хотите удалить \"{name}\"? Это действие нельзя отменить.",
"delete_title": "Удалить подпись?",
"description": "Создавайте и управляйте подписями электронной почты для использования при написании писем или ответе на них.",
"duplicate": "Дублировать",
"edit_signature": "Редактировать подпись",
"editor_label": "Подпись",
"html_preview_label": "Просмотр HTML",
"name_label": "Имя",
"name_placeholder": "напр., Работа, Личное",
"name_required": "Имя обязательно",
"new_signature": "Новая подпись",
"no_signature": "Без подписи",
"no_signatures": "Подписей пока нет",
"per_identity_signatures": {
"description": "Переопределите подпись по умолчанию и подпись для ответа для отдельных идентификаций.",
"label": "Подписи для отдельных идентификаций"
},
"plain_text_preview_label": "Просмотр в виде обычного текста",
"reply": "Ответ",
"reply_signature": {
"description": "Используется при ответе или пересылке, если не переопределено для отдельной идентификации.",
"label": "Подпись для ответа"
},
"show_editor": "Показать редактор",
"show_preview": "Показать предпросмотр",
"title": "Подписи",
"toolbar": {
"align_center": "По центру",
"align_left": "По левому краю",
"align_right": "По правому краю",
"bold": "Жирный",
"bullet_list": "Маркированный список",
"italic": "Курсив",
"link": "Ссылка",
"ordered_list": "Нумерованный список",
"remove_color": "Убрать цвет",
"strikethrough": "Зачёркнутый",
"text_color": "Цвет текста",
"underline": "Подчёркнутый"
},
"use_global_default": "Использовать значение по умолчанию",
"your_signatures": "Ваши подписи ({count})"
} }
} }
+167 -10
View File
@@ -567,7 +567,8 @@
"copied": "Skopírované!", "copied": "Skopírované!",
"copy_failed": "Kopírovanie zlyhalo" "copy_failed": "Kopírovanie zlyhalo"
}, },
"send_now": "Odoslať teraz" "send_now": "Odoslať teraz",
"create_appointment": "Vytvoriť stretnutie"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Potvrdenie o prečítaní požiadané (kliknutím vypnete)", "read_receipt_on": "Potvrdenie o prečítaní požiadané (kliknutím vypnete)",
@@ -712,7 +713,10 @@
"delete_table": "Odstrániť tabuľku", "delete_table": "Odstrániť tabuľku",
"pick_size": "Vybrať veľkosť" "pick_size": "Vybrať veľkosť"
}, },
"send_filing_warning": "Odoslané - ale následné upratovanie zlyhalo, môže zostať zastaraný koncept." "send_filing_warning": "Odoslané - ale následné upratovanie zlyhalo, môže zostať zastaraný koncept.",
"insert_signature": "Vložiť podpis",
"no_signature": "Bez podpisu",
"select_signature": "Vybrať podpis"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Potvrdiť", "confirm": "Potvrdiť",
@@ -891,7 +895,10 @@
"downloads": "Stiahnuté", "downloads": "Stiahnuté",
"content_senders": "Obsah a odosielatelia", "content_senders": "Obsah a odosielatelia",
"about_data": "Info a dáta", "about_data": "Info a dáta",
"debug": "Ladenie" "debug": "Ladenie",
"import": "Import",
"sharing": "Zdieľanie",
"signatures": "Podpisy"
}, },
"tab_groups": { "tab_groups": {
"general": "Všeobecné", "general": "Všeobecné",
@@ -2007,7 +2014,39 @@
"preview": { "preview": {
"label": "Náhľad" "label": "Náhľad"
} }
} },
"importer": {
"action_label": "Importovať",
"cancel": "Zrušiť",
"choose_files": "Vybrať súbory",
"conflict_copy": "Ponechať obe",
"conflict_description": "Vyberte, čo sa má stať, keď importovaná správa už existuje.",
"conflict_label": "Spracovanie duplicít",
"conflict_replace": "Nahradiť duplicity",
"conflict_skip": "Preskočiť duplicity",
"description": "Importujte e-mailové správy zo súborov .eml do priečinka.",
"error_details": "{count, plural, one {# chyba} other {# chýb}}",
"fail": "Import zlyhal",
"file_description": "Vyberte jeden alebo viac súborov .eml na import.",
"file_label": "Súbory",
"files_selected": "{count, plural, one {# vybraný súbor} other {# vybraných súborov}}",
"folder_description": "Vyberte priečinok, do ktorého sa majú správy importovať.",
"folder_label": "Cieľový priečinok",
"import_complete": "Import dokončený",
"import_more": "Importovať ďalšie",
"importing": "Importovanie...",
"progress_failed": "{count} zlyhaných",
"progress_imported": "{count} importovaných",
"progress_skipped": "{count} preskočených",
"start_import": "{count, plural, one {Importovať # súbor} other {Importovať # súborov}}",
"success": "{count, plural, one {# správa importovaná} other {# správ importovaných}}",
"summary_failed": "{count, plural, one {# správa zlyhaná} other {# správ zlyhaných}}",
"summary_imported": "{count, plural, one {# správa importovaná} other {# správ importovaných}}",
"summary_skipped": "{count, plural, one {# správa preskočená} other {# správ preskočených}}",
"title": "Importovať poštu"
},
"loading": "Načítavanie...",
"refresh": "Obnoviť"
}, },
"errors": { "errors": {
"page_error_title": "Niečo sa pokazilo", "page_error_title": "Niečo sa pokazilo",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Nepodarilo sa premenovať priečinok", "toast_error_rename": "Nepodarilo sa premenovať priečinok",
"toast_error_delete": "Nepodarilo sa zmazať priečinok", "toast_error_delete": "Nepodarilo sa zmazať priečinok",
"toast_error_delete_has_children": "Priečinok obsahuje podpriečinky. Najprv ich odstráňte.", "toast_error_delete_has_children": "Priečinok obsahuje podpriečinky. Najprv ich odstráňte.",
"toast_error_delete_has_email": "Priečinok nie je prázdny. Najprv ho vyprázdnite." "toast_error_delete_has_email": "Priečinok nie je prázdny. Najprv ho vyprázdnite.",
"share_folder": "Zdieľať priečinok..."
}, },
"shortcuts": { "shortcuts": {
"title": "Klávesové skratky", "title": "Klávesové skratky",
@@ -2184,7 +2224,11 @@
"save": "Uložiť identitu", "save": "Uložiť identitu",
"cancel": "Zrušiť", "cancel": "Zrušiť",
"creating": "Vytváranie...", "creating": "Vytváranie...",
"updating": "Aktualizovanie..." "updating": "Aktualizovanie...",
"signature_store_default": "Predvolený podpis",
"signature_store_mapping": "Priradenie podpisov",
"signature_store_reply": "Podpis pre odpoveď",
"use_global_default": "Použiť globálne predvolené"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Použiť podadresu", "button_tooltip": "Použiť podadresu",
@@ -2511,7 +2555,29 @@
"success": "{count, plural, one {Importovaný 1 kontakt} other {Importovaných # kontaktov}}", "success": "{count, plural, one {Importovaný 1 kontakt} other {Importovaných # kontaktov}}",
"failed": "Import zlyhal", "failed": "Import zlyhal",
"close": "Zavrieť", "close": "Zavrieť",
"file_too_large": "Súbor je príliš veľký (max. 5 MB)" "file_too_large": "Súbor je príliš veľký (max. 5 MB)",
"csv_address": "Adresa",
"csv_address_book": "Adresár",
"csv_back": "Späť",
"csv_city": "Mesto",
"csv_company": "Spoločnosť",
"csv_country": "Krajina",
"csv_email": "E-mail",
"csv_first_name": "Krstné meno",
"csv_ignore": "Ignorovať tento stĺpec",
"csv_job_title": "Pozícia",
"csv_last_name": "Priezvisko",
"csv_load_all": "Načítať všetko",
"csv_map_columns": "Priradenie stĺpcov",
"csv_nickname": "Prezývka",
"csv_note": "Poznámka",
"csv_phone": "Telefón",
"csv_postcode": "PSČ",
"csv_preview": "Náhľad",
"csv_preview_title": "Náhľad ({count, plural, one {# riadok} other {# riadkov}})",
"csv_region": "Štát / Kraj",
"csv_website": "Webová stránka",
"file_types_csv": "súbory .csv"
}, },
"export": { "export": {
"title": "Exportovať kontakty", "title": "Exportovať kontakty",
@@ -2569,7 +2635,10 @@
"has_email": "Má e-mail", "has_email": "Má e-mail",
"has_phone": "Má telefón", "has_phone": "Má telefón",
"has_photo": "Má fotku" "has_photo": "Má fotku"
} },
"delete": "Odstrániť",
"edit": "Upraviť",
"send_email": "Odoslať e-mail"
}, },
"calendar": { "calendar": {
"title": "Kalendár", "title": "Kalendár",
@@ -2988,6 +3057,36 @@
"due_today": "Dnes", "due_today": "Dnes",
"due_tomorrow": "Zajtra", "due_tomorrow": "Zajtra",
"overdue": "Po termíne" "overdue": "Po termíne"
},
"delete": "Odstrániť",
"duplicate": "Duplikovať",
"edit": "Upraviť",
"freeBusy": {
"busy": "Obsadený",
"check": "Skontrolovať dostupnosť",
"click_to_select": "Kliknutím na voľný termín vyberiete tento čas",
"free": "Voľný",
"hide": "Skryť dostupnosť",
"loading": "Načítavanie...",
"no_participants": "Pridajte účastníkov na kontrolu dostupnosti.",
"tentative": "Nezáväzne",
"timezone": "Časové pásmo",
"title": "Dostupnosť",
"unavailable": "Mimo kancelárie",
"unknown": "Žiadne informácie"
},
"resources": {
"clear_all": "Vymazať všetko",
"filter_all": "Všetky",
"hide": "Skryť zdroje",
"no_resources": "Žiadne dostupné zdroje",
"remove": "Odstrániť {name}",
"search_placeholder": "Hľadať zdroje...",
"title": "Zdroje",
"type_equipment": "Vybavenie",
"type_other": "Ostatné",
"type_room": "Miestnosti",
"type_vehicle": "Vozidlá"
} }
}, },
"sharing": { "sharing": {
@@ -3011,7 +3110,14 @@
"readWrite": "Čítanie a zápis", "readWrite": "Čítanie a zápis",
"manager": "Správca", "manager": "Správca",
"custom": "Vlastné" "custom": "Vlastné"
} },
"accept": "Prijať",
"decline": "Odmietnuť",
"no_shares_by_me": "Zatiaľ ste nič nezdieľali.",
"no_shares_with_me": "Zatiaľ s vami neboli zdieľané žiadne priečinky.",
"shared_by": "Zdieľané od",
"tab_shared_by_me": "Zdieľané mnou",
"tab_shared_with_me": "Zdieľané so mnou"
}, },
"advanced_search": { "advanced_search": {
"title": "Pokročilé hľadanie", "title": "Pokročilé hľadanie",
@@ -3176,7 +3282,8 @@
"disabled_description": "Nahrávanie veľkých súborov cez WebDAV môže spôsobiť nestabilitu Stalwart/RocksDB. Táto funkcia sa neodporúča v produkčnom prostredí.", "disabled_description": "Nahrávanie veľkých súborov cez WebDAV môže spôsobiť nestabilitu Stalwart/RocksDB. Táto funkcia sa neodporúča v produkčnom prostredí.",
"stability_warning": "Nahrávanie veľkých súborov môže spôsobiť nestabilitu servera. Používajte s opatrnosťou.", "stability_warning": "Nahrávanie veľkých súborov môže spôsobiť nestabilitu servera. Používajte s opatrnosťou.",
"migration_title": "Aktualizácia vašich súborov…", "migration_title": "Aktualizácia vašich súborov…",
"migration_description": "Usporiadanie priečinkov a súborov do správnej štruktúry. Toto prebehne iba raz." "migration_description": "Usporiadanie priečinkov a súborov do správnej štruktúry. Toto prebehne iba raz.",
"send_as_attachment": "Odoslať ako prílohu"
}, },
"smime": { "smime": {
"your_certificates": "Vaše certifikáty", "your_certificates": "Vaše certifikáty",
@@ -3324,5 +3431,55 @@
"install": "Nainštalovať", "install": "Nainštalovať",
"dont_remind": "Viac mi to nepripomínať", "dont_remind": "Viac mi to nepripomínať",
"dismiss_aria": "Zavrieť výzvu na inštaláciu" "dismiss_aria": "Zavrieť výzvu na inštaláciu"
},
"signatures": {
"add_signature": "Pridať podpis",
"default": "Predvolený",
"default_signature": {
"description": "Použije sa pre nové správy, pokiaľ nie je pre danú identitu nastavený iný.",
"label": "Predvolený podpis"
},
"delete_message": "Naozaj chcete odstrániť \"{name}\"? Túto akciu nie je možné vrátiť.",
"delete_title": "Odstrániť podpis?",
"description": "Vytvárajte a spravujte e-mailové podpisy na použitie pri písaní alebo odpovedaní.",
"duplicate": "Duplikovať",
"edit_signature": "Upraviť podpis",
"editor_label": "Podpis",
"html_preview_label": "HTML náhľad",
"name_label": "Názov",
"name_placeholder": "napr. Práca, Osobné",
"name_required": "Názov je povinný",
"new_signature": "Nový podpis",
"no_signature": "Bez podpisu",
"no_signatures": "Zatiaľ žiadne podpisy",
"per_identity_signatures": {
"description": "Prepíšte predvolený podpis a podpis pre odpoveď pre jednotlivé identity.",
"label": "Podpisy podľa identity"
},
"plain_text_preview_label": "Textový náhľad",
"reply": "Odpoveď",
"reply_signature": {
"description": "Použije sa pri odpovedaní alebo preposielaní, pokiaľ nie je pre danú identitu nastavený iný.",
"label": "Podpis pre odpoveď"
},
"show_editor": "Zobraziť editor",
"show_preview": "Zobraziť náhľad",
"title": "Podpisy",
"toolbar": {
"align_center": "Na stred",
"align_left": "Zarovnať doľava",
"align_right": "Zarovnať doprava",
"bold": "Tučné",
"bullet_list": "Odrážkový zoznam",
"italic": "Kurzíva",
"link": "Odkaz",
"ordered_list": "Číslovaný zoznam",
"remove_color": "Odstrániť farbu",
"strikethrough": "Prečiarknuté",
"text_color": "Farba textu",
"underline": "Podčiarknuté"
},
"use_global_default": "Použiť globálne predvolené",
"your_signatures": "Vaše podpisy ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Kopyalandı!", "copied": "Kopyalandı!",
"copy_failed": "Kopyalanamadı" "copy_failed": "Kopyalanamadı"
}, },
"send_now": "Şimdi gönder" "send_now": "Şimdi gönder",
"create_appointment": "Randevu Oluştur"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Okundu bilgisi istendi (devre dışı bırakmak için tıklayın)", "read_receipt_on": "Okundu bilgisi istendi (devre dışı bırakmak için tıklayın)",
@@ -712,7 +713,10 @@
"delete_table": "Tabloyu sil", "delete_table": "Tabloyu sil",
"pick_size": "Boyut seç" "pick_size": "Boyut seç"
}, },
"send_filing_warning": "Gönderildi - ancak sonrasındaki temizleme başarısız oldu, eski bir taslak kalabilir." "send_filing_warning": "Gönderildi - ancak sonrasındaki temizleme başarısız oldu, eski bir taslak kalabilir.",
"insert_signature": "İmza ekle",
"no_signature": "İmza yok",
"select_signature": "İmza seç"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Onayla", "confirm": "Onayla",
@@ -888,7 +892,10 @@
"downloads": "İndirilenler", "downloads": "İndirilenler",
"content_senders": "İçerik ve Göndericiler", "content_senders": "İçerik ve Göndericiler",
"about_data": "Hakkında ve Veriler", "about_data": "Hakkında ve Veriler",
"debug": "Hata Ayıklama" "debug": "Hata Ayıklama",
"import": "İçe Aktar",
"sharing": "Paylaşım",
"signatures": "İmzalar"
}, },
"tab_groups": { "tab_groups": {
"general": "Genel", "general": "Genel",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Hesabıma geri dön", "back": "Hesabıma geri dön",
"managing": "Yönetiliyor: {name}" "managing": "Yönetiliyor: {name}"
} },
"importer": {
"action_label": "İçe Aktar",
"cancel": "İptal",
"choose_files": "Dosya seç",
"conflict_copy": "İkisini de sakla",
"conflict_description": "İçe aktarılan bir ileti zaten mevcut olduğunda ne yapılacağını seçin.",
"conflict_label": "Yinelenen işleme",
"conflict_replace": "Yinelenenleri değiştir",
"conflict_skip": "Yinelenenleri atla",
"description": ".eml dosyalarından bir klasöre e-posta iletileri içe aktarın.",
"error_details": "{count, plural, one {# hata} other {# hata}}",
"fail": "İçe aktarma başarısız",
"file_description": "İçe aktarmak için bir veya daha fazla .eml dosyası seçin.",
"file_label": "Dosyalar",
"files_selected": "{count, plural, one {# dosya seçildi} other {# dosya seçildi}}",
"folder_description": "İletilerin içe aktarılacağı klasörü seçin.",
"folder_label": "Hedef klasör",
"import_complete": "İçe aktarma tamamlandı",
"import_more": "Daha fazla içe aktar",
"importing": "İçe aktarılıyor...",
"progress_failed": "{count} başarısız",
"progress_imported": "{count} içe aktarıldı",
"progress_skipped": "{count} atlandı",
"start_import": "{count, plural, one {# dosyayı içe aktar} other {# dosyayı içe aktar}}",
"success": "{count, plural, one {# ileti içe aktarıldı} other {# ileti içe aktarıldı}}",
"summary_failed": "{count, plural, one {# ileti başarısız oldu} other {# ileti başarısız oldu}}",
"summary_imported": "{count, plural, one {# ileti içe aktarıldı} other {# ileti içe aktarıldı}}",
"summary_skipped": "{count, plural, one {# ileti atlandı} other {# ileti atlandı}}",
"title": "Postayı İçe Aktar"
},
"loading": "Yükleniyor...",
"refresh": "Yenile"
}, },
"errors": { "errors": {
"page_error_title": "Bir şeyler ters gitti", "page_error_title": "Bir şeyler ters gitti",
@@ -2085,7 +2124,8 @@
"toast_error_rename": "Klasör yeniden adlandırılamadı", "toast_error_rename": "Klasör yeniden adlandırılamadı",
"toast_error_delete": "Klasör silinemedi", "toast_error_delete": "Klasör silinemedi",
"toast_error_delete_has_children": "Klasörde alt klasörler var. Önce onları kaldırın.", "toast_error_delete_has_children": "Klasörde alt klasörler var. Önce onları kaldırın.",
"toast_error_delete_has_email": "Klasör boş değil. Önce boşaltın." "toast_error_delete_has_email": "Klasör boş değil. Önce boşaltın.",
"share_folder": "Klasörü paylaş..."
}, },
"shortcuts": { "shortcuts": {
"title": "Klavye Kısayolları", "title": "Klavye Kısayolları",
@@ -2184,7 +2224,11 @@
"save": "Kimliği Kaydet", "save": "Kimliği Kaydet",
"cancel": "İptal", "cancel": "İptal",
"creating": "Oluşturuluyor...", "creating": "Oluşturuluyor...",
"updating": "Güncelleniyor..." "updating": "Güncelleniyor...",
"signature_store_default": "Varsayılan imza",
"signature_store_mapping": "İmza eşleştirmesi",
"signature_store_reply": "Yanıt imzası",
"use_global_default": "Genel varsayılanı kullan"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Alt adres kullan", "button_tooltip": "Alt adres kullan",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 kişi içe aktarıldı} other {# kişi içe aktarıldı}}", "success": "{count, plural, one {1 kişi içe aktarıldı} other {# kişi içe aktarıldı}}",
"failed": "İçe aktarma başarısız", "failed": "İçe aktarma başarısız",
"close": "Kapat", "close": "Kapat",
"file_too_large": "Dosya çok büyük (maks. 5 MB)" "file_too_large": "Dosya çok büyük (maks. 5 MB)",
"csv_address": "Adres",
"csv_address_book": "Adres defteri",
"csv_back": "Geri",
"csv_city": "Şehir",
"csv_company": "Şirket",
"csv_country": "Ülke",
"csv_email": "E-posta",
"csv_first_name": "Ad",
"csv_ignore": "Bu sütunu yoksay",
"csv_job_title": "İş unvanı",
"csv_last_name": "Soyadı",
"csv_load_all": "Tümünü yükle",
"csv_map_columns": "Sütunları eşleştir",
"csv_nickname": "Takma ad",
"csv_note": "Not",
"csv_phone": "Telefon",
"csv_postcode": "Posta kodu",
"csv_preview": "Önizleme",
"csv_preview_title": "Önizleme ({count, plural, one {# satır} other {# satır}})",
"csv_region": "İl / Bölge",
"csv_website": "Web sitesi",
"file_types_csv": ".csv dosyaları"
}, },
"export": { "export": {
"title": "Kişileri Dışa Aktar", "title": "Kişileri Dışa Aktar",
@@ -2569,7 +2635,10 @@
"has_phone": "Telefonu var", "has_phone": "Telefonu var",
"has_photo": "Fotoğrafı var" "has_photo": "Fotoğrafı var"
}, },
"open_categories": "Kategorileri aç" "open_categories": "Kategorileri aç",
"delete": "Sil",
"edit": "Düzenle",
"send_email": "E-posta gönder"
}, },
"calendar": { "calendar": {
"title": "Takvim", "title": "Takvim",
@@ -2988,7 +3057,37 @@
"due_tomorrow": "Yarın", "due_tomorrow": "Yarın",
"overdue": "Gecikmiş" "overdue": "Gecikmiş"
}, },
"nav_open_menu": "Menüyü aç" "nav_open_menu": "Menüyü aç",
"delete": "Sil",
"duplicate": "Çoğalt",
"edit": "Düzenle",
"freeBusy": {
"busy": "Meşgul",
"check": "Müsaitliği kontrol et",
"click_to_select": "Bu saati seçmek için boş bir aralığa tıklayın",
"free": "Boş",
"hide": "Müsaitliği gizle",
"loading": "Yükleniyor...",
"no_participants": "Müsaitliği kontrol etmek için katılımcı ekleyin.",
"tentative": "Geçici",
"timezone": "Saat Dilimi",
"title": "Müsaitlik",
"unavailable": "Ofis dışında",
"unknown": "Bilgi yok"
},
"resources": {
"clear_all": "Tümünü temizle",
"filter_all": "Tümü",
"hide": "Kaynakları gizle",
"no_resources": "Kullanılabilir kaynak yok",
"remove": "{name} öğesini kaldır",
"search_placeholder": "Kaynaklarda ara...",
"title": "Kaynaklar",
"type_equipment": "Ekipman",
"type_other": "Diğer",
"type_room": "Odalar",
"type_vehicle": "Araçlar"
}
}, },
"sharing": { "sharing": {
"title": "\"{name}\" paylaş", "title": "\"{name}\" paylaş",
@@ -3011,7 +3110,14 @@
"readWrite": "Okuma ve yazma", "readWrite": "Okuma ve yazma",
"manager": "Yönetici", "manager": "Yönetici",
"custom": "Özel" "custom": "Özel"
} },
"accept": "Kabul et",
"decline": "Reddet",
"no_shares_by_me": "Henüz kimseyle paylaşım yapmadınız.",
"no_shares_with_me": "Sizinle henüz paylaşılan klasör yok.",
"shared_by": "Paylaşan",
"tab_shared_by_me": "Benim paylaştıklarım",
"tab_shared_with_me": "Benimle paylaşılanlar"
}, },
"advanced_search": { "advanced_search": {
"title": "Gelişmiş Arama", "title": "Gelişmiş Arama",
@@ -3176,7 +3282,8 @@
"open_folder_tree": "Klasör ağacını aç", "open_folder_tree": "Klasör ağacını aç",
"other_accounts": "Diğer hesaplar", "other_accounts": "Diğer hesaplar",
"migration_title": "Dosyalarınız güncelleniyor…", "migration_title": "Dosyalarınız güncelleniyor…",
"migration_description": "Klasörler ve dosyalar doğru yapıya göre düzenleniyor. Bu yalnızca bir kez gerçekleşir." "migration_description": "Klasörler ve dosyalar doğru yapıya göre düzenleniyor. Bu yalnızca bir kez gerçekleşir.",
"send_as_attachment": "Ek Olarak Gönder"
}, },
"smime": { "smime": {
"your_certificates": "Sertifikalarınız", "your_certificates": "Sertifikalarınız",
@@ -3324,5 +3431,55 @@
"install": "Yükle", "install": "Yükle",
"dont_remind": "Bir daha hatırlatma", "dont_remind": "Bir daha hatırlatma",
"dismiss_aria": "Yükleme istemini kapat" "dismiss_aria": "Yükleme istemini kapat"
},
"signatures": {
"add_signature": "İmza ekle",
"default": "Varsayılan",
"default_signature": {
"description": "Kimlik başına geçersiz kılınmadığı sürece yeni iletiler için kullanılır.",
"label": "Varsayılan imza"
},
"delete_message": "\"{name}\" imzasını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
"delete_title": "İmza silinsin mi?",
"description": "Yazarken veya yanıtlarken kullanmak üzere e-posta imzaları oluşturun ve yönetin.",
"duplicate": "Çoğalt",
"edit_signature": "İmzayı düzenle",
"editor_label": "İmza",
"html_preview_label": "HTML önizleme",
"name_label": "Ad",
"name_placeholder": "ör. İş, Kişisel",
"name_required": "Ad gerekli",
"new_signature": "Yeni imza",
"no_signature": "İmza yok",
"no_signatures": "Henüz imza yok",
"per_identity_signatures": {
"description": "Bireysel kimlikler için varsayılan ve yanıt imzasını geçersiz kılın.",
"label": "Kimlik başına imzalar"
},
"plain_text_preview_label": "Düz metin önizleme",
"reply": "Yanıt",
"reply_signature": {
"description": "Kimlik başına geçersiz kılınmadığı sürece yanıtlarken veya iletirken kullanılır.",
"label": "Yanıt imzası"
},
"show_editor": "Düzenleyiciyi göster",
"show_preview": "Önizlemeyi göster",
"title": "İmzalar",
"toolbar": {
"align_center": "Ortala",
"align_left": "Sola hizala",
"align_right": "Sağa hizala",
"bold": "Kalın",
"bullet_list": "Madde işaretli liste",
"italic": "İtalik",
"link": "Bağlantı",
"ordered_list": "Numaralı liste",
"remove_color": "Rengi kaldır",
"strikethrough": "Üstü çizili",
"text_color": "Metin rengi",
"underline": "Altı çizili"
},
"use_global_default": "Genel varsayılanı kullan",
"your_signatures": "İmzalarınız ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "Скопійовано!", "copied": "Скопійовано!",
"copy_failed": "Не вдалося скопіювати" "copy_failed": "Не вдалося скопіювати"
}, },
"send_now": "Надіслати зараз" "send_now": "Надіслати зараз",
"create_appointment": "Створити зустріч"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "Запитано сповіщення про прочитання (натисніть, щоб вимкнути)", "read_receipt_on": "Запитано сповіщення про прочитання (натисніть, щоб вимкнути)",
@@ -712,7 +713,10 @@
"delete_table": "Видалити таблицю", "delete_table": "Видалити таблицю",
"pick_size": "Вибрати розмір" "pick_size": "Вибрати розмір"
}, },
"send_filing_warning": "Надіслано - але подальше очищення не вдалося, може залишитися застаріла чернетка." "send_filing_warning": "Надіслано - але подальше очищення не вдалося, може залишитися застаріла чернетка.",
"insert_signature": "Вставити підпис",
"no_signature": "Без підпису",
"select_signature": "Виберіть підпис"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "Підтвердити", "confirm": "Підтвердити",
@@ -888,7 +892,10 @@
"downloads": "Завантаження", "downloads": "Завантаження",
"content_senders": "Вміст і відправники", "content_senders": "Вміст і відправники",
"about_data": "Про програму та дані", "about_data": "Про програму та дані",
"debug": "Налагодження" "debug": "Налагодження",
"import": "Імпорт",
"sharing": "Спільний доступ",
"signatures": "Підписи"
}, },
"tab_groups": { "tab_groups": {
"general": "Загальний", "general": "Загальний",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "Назад до мого облікового запису", "back": "Назад до мого облікового запису",
"managing": "Керування: {name}" "managing": "Керування: {name}"
} },
"importer": {
"action_label": "Імпорт",
"cancel": "Скасувати",
"choose_files": "Вибрати файли",
"conflict_copy": "Зберегти обидва",
"conflict_description": "Виберіть, що робити, якщо імпортоване повідомлення вже існує.",
"conflict_label": "Обробка дублікатів",
"conflict_replace": "Замінювати дублікати",
"conflict_skip": "Пропускати дублікати",
"description": "Імпортуйте повідомлення електронної пошти з файлів .eml до папки.",
"error_details": "{count, plural, one {# помилка} other {# помилок}}",
"fail": "Не вдалося імпортувати",
"file_description": "Виберіть один або кілька файлів .eml для імпорту.",
"file_label": "Файли",
"files_selected": "{count, plural, one {# файл вибрано} other {# файлів вибрано}}",
"folder_description": "Виберіть папку, до якої імпортувати повідомлення.",
"folder_label": "Папка призначення",
"import_complete": "Імпорт завершено",
"import_more": "Імпортувати ще",
"importing": "Імпорт...",
"progress_failed": "Помилок: {count}",
"progress_imported": "Імпортовано: {count}",
"progress_skipped": "Пропущено: {count}",
"start_import": "{count, plural, one {Імпортувати # файл} other {Імпортувати # файлів}}",
"success": "{count, plural, one {# повідомлення імпортовано} other {# повідомлень імпортовано}}",
"summary_failed": "{count, plural, one {# повідомлення не вдалося імпортувати} other {# повідомлень не вдалося імпортувати}}",
"summary_imported": "{count, plural, one {# повідомлення імпортовано} other {# повідомлень імпортовано}}",
"summary_skipped": "{count, plural, one {# повідомлення пропущено} other {# повідомлень пропущено}}",
"title": "Імпортувати пошту"
},
"loading": "Завантаження...",
"refresh": "Оновити"
}, },
"errors": { "errors": {
"page_error_title": "Щось пішло не так", "page_error_title": "Щось пішло не так",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "Папка не порожня. Спочатку очистіть її.", "toast_error_delete_has_email": "Папка не порожня. Спочатку очистіть її.",
"placeholder_folder_name": "Ім'я папки", "placeholder_folder_name": "Ім'я папки",
"create": "Створити", "create": "Створити",
"rename_confirm": "Перейменувати" "rename_confirm": "Перейменувати",
"share_folder": "Поділитися папкою..."
}, },
"shortcuts": { "shortcuts": {
"title": "Комбінації клавіш", "title": "Комбінації клавіш",
@@ -2184,7 +2224,11 @@
"save": "Зберегти ідентифікатор", "save": "Зберегти ідентифікатор",
"cancel": "Скасувати", "cancel": "Скасувати",
"creating": "Створення...", "creating": "Створення...",
"updating": "Оновлення..." "updating": "Оновлення...",
"signature_store_default": "Підпис за замовчуванням",
"signature_store_mapping": "Зіставлення підписів",
"signature_store_reply": "Підпис для відповіді",
"use_global_default": "Використовувати загальне значення за замовчуванням"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "Використовуйте допоміжну адресу", "button_tooltip": "Використовуйте допоміжну адресу",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {1 контакт імпортовано} few {# контакти імпортовано} many {# контактів імпортовано} other {# контактів імпортовано}}", "success": "{count, plural, one {1 контакт імпортовано} few {# контакти імпортовано} many {# контактів імпортовано} other {# контактів імпортовано}}",
"failed": "Помилка імпорту", "failed": "Помилка імпорту",
"close": "Закрити", "close": "Закрити",
"file_too_large": "Файл завеликий (макс. 5 МБ)" "file_too_large": "Файл завеликий (макс. 5 МБ)",
"csv_address": "Адреса",
"csv_address_book": "Адресна книга",
"csv_back": "Назад",
"csv_city": "Місто",
"csv_company": "Компанія",
"csv_country": "Країна",
"csv_email": "Електронна пошта",
"csv_first_name": "Ім'я",
"csv_ignore": "Ігнорувати цей стовпець",
"csv_job_title": "Назва посади",
"csv_last_name": "Прізвище",
"csv_load_all": "Завантажити все",
"csv_map_columns": "Зіставлення стовпців",
"csv_nickname": "псевдонім",
"csv_note": "Примітка",
"csv_phone": "Телефон",
"csv_postcode": "Поштовий індекс",
"csv_preview": "Попередній перегляд",
"csv_preview_title": "Попередній перегляд ({count, plural, one {# рядок} other {# рядків}})",
"csv_region": "Штат / Регіон",
"csv_website": "Веб-сайт",
"file_types_csv": "файли .csv"
}, },
"export": { "export": {
"title": "Експортувати контакти", "title": "Експортувати контакти",
@@ -2569,7 +2635,10 @@
"has_phone": "З телефоном", "has_phone": "З телефоном",
"has_photo": "З фото" "has_photo": "З фото"
}, },
"open_categories": "Відкрити категорії" "open_categories": "Відкрити категорії",
"delete": "Видалити",
"edit": "Редагувати",
"send_email": "Надіслати лист"
}, },
"calendar": { "calendar": {
"title": "Календар", "title": "Календар",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "Відкрити меню" "nav_open_menu": "Відкрити меню",
"delete": "Видалити",
"duplicate": "Дублювати",
"edit": "Редагувати",
"freeBusy": {
"busy": "Зайнято",
"check": "Перевірити доступність",
"click_to_select": "Натисніть на вільний проміжок часу, щоб вибрати цей час",
"free": "Вільно",
"hide": "Приховати доступність",
"loading": "Завантаження...",
"no_participants": "Додайте учасників, щоб перевірити доступність.",
"tentative": "Орієнтовний",
"timezone": "Часовий пояс",
"title": "Доступність",
"unavailable": "Немає на місці",
"unknown": "Немає інформації"
},
"resources": {
"clear_all": "Очистити все",
"filter_all": "все",
"hide": "Приховати ресурси",
"no_resources": "Немає доступних ресурсів",
"remove": "Видалити {name}",
"search_placeholder": "Пошук ресурсів...",
"title": "Ресурси",
"type_equipment": "Обладнання",
"type_other": "інше",
"type_room": "Кімнати",
"type_vehicle": "Транспортні засоби"
}
}, },
"advanced_search": { "advanced_search": {
"title": "Розширений пошук", "title": "Розширений пошук",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "Відкрити дерево тек", "open_folder_tree": "Відкрити дерево тек",
"other_accounts": "Інші облікові записи", "other_accounts": "Інші облікові записи",
"migration_title": "Оновлення ваших файлів…", "migration_title": "Оновлення ваших файлів…",
"migration_description": "Папки та файли впорядковуються у правильну структуру. Це відбувається лише один раз." "migration_description": "Папки та файли впорядковуються у правильну структуру. Це відбувається лише один раз.",
"send_as_attachment": "Надіслати як вкладення"
}, },
"smime": { "smime": {
"your_certificates": "Ваші сертифікати", "your_certificates": "Ваші сертифікати",
@@ -3308,7 +3408,14 @@
"readWrite": "Читання та запис", "readWrite": "Читання та запис",
"manager": "Керівник", "manager": "Керівник",
"custom": "Власне" "custom": "Власне"
} },
"accept": "Прийняти",
"decline": "Відхилити",
"no_shares_by_me": "Ви ще нічим не поділилися.",
"no_shares_with_me": "Поки що ніхто не поділився з вами папками.",
"shared_by": "Надав доступ",
"tab_shared_by_me": "Надані мною",
"tab_shared_with_me": "Надані мені"
}, },
"quote_header": { "quote_header": {
"reply_line": "{date}, {from} написав:", "reply_line": "{date}, {from} написав:",
@@ -3324,5 +3431,55 @@
"install": "Встановити", "install": "Встановити",
"dont_remind": "Більше не нагадувати", "dont_remind": "Більше не нагадувати",
"dismiss_aria": "Закрити запит на встановлення" "dismiss_aria": "Закрити запит на встановлення"
},
"signatures": {
"add_signature": "Додати підпис",
"default": "За замовчуванням",
"default_signature": {
"description": "Використовується для нових повідомлень, якщо не перевизначено для окремої ідентичності.",
"label": "Підпис за замовчуванням"
},
"delete_message": "Ви впевнені, що хочете видалити \"{name}\"? Це неможливо скасувати.",
"delete_title": "Видалити підпис?",
"description": "Створюйте підписи електронної пошти та керуйте ними для використання під час написання чи відповіді.",
"duplicate": "Дублювати",
"edit_signature": "Редагувати підпис",
"editor_label": "Підпис",
"html_preview_label": "Попередній перегляд HTML",
"name_label": "Назва",
"name_placeholder": "наприклад, Робота, Особисте",
"name_required": "Потрібно вказати назву",
"new_signature": "Новий підпис",
"no_signature": "Без підпису",
"no_signatures": "Підписів ще немає",
"per_identity_signatures": {
"description": "Перевизначте підпис за замовчуванням і підпис для відповіді для окремих ідентичностей.",
"label": "Підписи для окремих ідентичностей"
},
"plain_text_preview_label": "Попередній перегляд простого тексту",
"reply": "Відповідь",
"reply_signature": {
"description": "Використовується під час відповіді чи пересилання, якщо не перевизначено для окремої ідентичності.",
"label": "Підпис для відповіді"
},
"show_editor": "Показати редактор",
"show_preview": "Показати попередній перегляд",
"title": "Підписи",
"toolbar": {
"align_center": "По центру",
"align_left": "По лівому краю",
"align_right": "По правому краю",
"bold": "Жирний",
"bullet_list": "Маркований список",
"italic": "Курсив",
"link": "Посилання",
"ordered_list": "Нумерований список",
"remove_color": "Прибрати колір",
"strikethrough": "Закреслений",
"text_color": "Колір тексту",
"underline": "Підкреслений"
},
"use_global_default": "Використовувати загальне значення за замовчуванням",
"your_signatures": "Ваші підписи ({count})"
} }
} }
+168 -11
View File
@@ -567,7 +567,8 @@
"copied": "已复制!", "copied": "已复制!",
"copy_failed": "复制失败" "copy_failed": "复制失败"
}, },
"send_now": "立即发送" "send_now": "立即发送",
"create_appointment": "Create Appointment"
}, },
"email_composer": { "email_composer": {
"read_receipt_on": "已请求已读回执(点击以关闭)", "read_receipt_on": "已请求已读回执(点击以关闭)",
@@ -712,7 +713,10 @@
"delete_table": "删除表格", "delete_table": "删除表格",
"pick_size": "选择大小" "pick_size": "选择大小"
}, },
"send_filing_warning": "已发送,但发送后的清理失败,可能会残留旧草稿。" "send_filing_warning": "已发送,但发送后的清理失败,可能会残留旧草稿。",
"insert_signature": "Insert signature",
"no_signature": "No signature",
"select_signature": "Select signature"
}, },
"confirm_dialog": { "confirm_dialog": {
"confirm": "确认", "confirm": "确认",
@@ -888,7 +892,10 @@
"downloads": "下载", "downloads": "下载",
"content_senders": "内容和发件人", "content_senders": "内容和发件人",
"about_data": "关于和数据", "about_data": "关于和数据",
"debug": "调试" "debug": "调试",
"import": "Import",
"sharing": "Sharing",
"signatures": "Signatures"
}, },
"tab_groups": { "tab_groups": {
"general": "通用", "general": "通用",
@@ -2007,7 +2014,39 @@
"scoped": { "scoped": {
"back": "返回我的账户", "back": "返回我的账户",
"managing": "管理:{name}" "managing": "管理:{name}"
} },
"importer": {
"action_label": "Import",
"cancel": "Cancel",
"choose_files": "Choose files",
"conflict_copy": "Keep both",
"conflict_description": "Choose what to do when an imported message already exists.",
"conflict_label": "Duplicate handling",
"conflict_replace": "Replace duplicates",
"conflict_skip": "Skip duplicates",
"description": "Import email messages from .eml files into a folder.",
"error_details": "{count, plural, one {# error} other {# errors}}",
"fail": "Import failed",
"file_description": "Select one or more .eml files to import.",
"file_label": "Files",
"files_selected": "{count, plural, one {# file selected} other {# files selected}}",
"folder_description": "Choose the folder to import messages into.",
"folder_label": "Destination folder",
"import_complete": "Import complete",
"import_more": "Import more",
"importing": "Importing...",
"progress_failed": "{count} failed",
"progress_imported": "{count} imported",
"progress_skipped": "{count} skipped",
"start_import": "{count, plural, one {Import # file} other {Import # files}}",
"success": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_failed": "{count, plural, one {# message failed} other {# messages failed}}",
"summary_imported": "{count, plural, one {# message imported} other {# messages imported}}",
"summary_skipped": "{count, plural, one {# message skipped} other {# messages skipped}}",
"title": "Import Mail"
},
"loading": "Loading...",
"refresh": "Refresh"
}, },
"errors": { "errors": {
"page_error_title": "出了点问题", "page_error_title": "出了点问题",
@@ -2085,7 +2124,8 @@
"toast_error_delete_has_email": "文件夹不为空,请先清空它。", "toast_error_delete_has_email": "文件夹不为空,请先清空它。",
"placeholder_folder_name": "文件夹名称", "placeholder_folder_name": "文件夹名称",
"create": "创建", "create": "创建",
"rename_confirm": "重命名" "rename_confirm": "重命名",
"share_folder": "Share Folder..."
}, },
"shortcuts": { "shortcuts": {
"title": "键盘快捷键", "title": "键盘快捷键",
@@ -2184,7 +2224,11 @@
"save": "保存身份", "save": "保存身份",
"cancel": "取消", "cancel": "取消",
"creating": "创建中...", "creating": "创建中...",
"updating": "更新中..." "updating": "更新中...",
"signature_store_default": "Default signature",
"signature_store_mapping": "Signature mapping",
"signature_store_reply": "Reply signature",
"use_global_default": "Use global default"
}, },
"sub_address": { "sub_address": {
"button_tooltip": "使用子地址", "button_tooltip": "使用子地址",
@@ -2510,7 +2554,29 @@
"success": "{count, plural, one {已导入 1 位联系人} other {已导入 # 位联系人}}", "success": "{count, plural, one {已导入 1 位联系人} other {已导入 # 位联系人}}",
"failed": "导入失败", "failed": "导入失败",
"close": "关闭", "close": "关闭",
"file_too_large": "文件太大(最大 5 MB" "file_too_large": "文件太大(最大 5 MB",
"csv_address": "Address",
"csv_address_book": "Address book",
"csv_back": "Back",
"csv_city": "City",
"csv_company": "Company",
"csv_country": "Country",
"csv_email": "Email",
"csv_first_name": "First name",
"csv_ignore": "Ignore this column",
"csv_job_title": "Job title",
"csv_last_name": "Last name",
"csv_load_all": "Load all",
"csv_map_columns": "Map columns",
"csv_nickname": "Nickname",
"csv_note": "Note",
"csv_phone": "Phone",
"csv_postcode": "Postal code",
"csv_preview": "Preview",
"csv_preview_title": "Preview ({count, plural, one {# row} other {# rows}})",
"csv_region": "State/Region",
"csv_website": "Website",
"file_types_csv": ".csv files"
}, },
"export": { "export": {
"title": "导出联系人", "title": "导出联系人",
@@ -2569,7 +2635,10 @@
"has_phone": "有电话", "has_phone": "有电话",
"has_photo": "有照片" "has_photo": "有照片"
}, },
"open_categories": "打开分类" "open_categories": "打开分类",
"delete": "Delete",
"edit": "Edit",
"send_email": "Send email"
}, },
"calendar": { "calendar": {
"title": "日历", "title": "日历",
@@ -2988,7 +3057,37 @@
"bah": "Bahman", "bah": "Bahman",
"esf": "Esfand" "esf": "Esfand"
}, },
"nav_open_menu": "打开菜单" "nav_open_menu": "打开菜单",
"delete": "Delete",
"duplicate": "Duplicate",
"edit": "Edit",
"freeBusy": {
"busy": "Busy",
"check": "Check Availability",
"click_to_select": "Click a free slot to select this time",
"free": "Free",
"hide": "Hide Availability",
"loading": "Loading...",
"no_participants": "Add participants to check availability.",
"tentative": "Tentative",
"timezone": "Timezone",
"title": "Availability",
"unavailable": "Out of office",
"unknown": "No information"
},
"resources": {
"clear_all": "Clear all",
"filter_all": "All",
"hide": "Hide resources",
"no_resources": "No resources available",
"remove": "Remove {name}",
"search_placeholder": "Search resources...",
"title": "Resources",
"type_equipment": "Equipment",
"type_other": "Other",
"type_room": "Rooms",
"type_vehicle": "Vehicles"
}
}, },
"advanced_search": { "advanced_search": {
"title": "高级搜索", "title": "高级搜索",
@@ -3153,7 +3252,8 @@
"open_folder_tree": "打开文件夹树", "open_folder_tree": "打开文件夹树",
"other_accounts": "其他账户", "other_accounts": "其他账户",
"migration_title": "正在更新您的文件…", "migration_title": "正在更新您的文件…",
"migration_description": "正在将文件夹和文件整理为正确的结构。此操作仅执行一次。" "migration_description": "正在将文件夹和文件整理为正确的结构。此操作仅执行一次。",
"send_as_attachment": "Send as Attachment"
}, },
"smime": { "smime": {
"your_certificates": "您的证书", "your_certificates": "您的证书",
@@ -3308,7 +3408,14 @@
"readWrite": "读写", "readWrite": "读写",
"manager": "管理员", "manager": "管理员",
"custom": "自定义" "custom": "自定义"
} },
"accept": "Accept",
"decline": "Decline",
"no_shares_by_me": "You haven't shared anything yet.",
"no_shares_with_me": "No folders shared with you yet.",
"shared_by": "Shared by",
"tab_shared_by_me": "Shared by me",
"tab_shared_with_me": "Shared with me"
}, },
"quote_header": { "quote_header": {
"reply_line": "在 {date}{from} 写道:", "reply_line": "在 {date}{from} 写道:",
@@ -3324,5 +3431,55 @@
"install": "安装", "install": "安装",
"dont_remind": "不再提醒", "dont_remind": "不再提醒",
"dismiss_aria": "关闭安装提示" "dismiss_aria": "关闭安装提示"
},
"signatures": {
"add_signature": "Add signature",
"default": "Default",
"default_signature": {
"description": "Used for new messages unless overridden per identity.",
"label": "Default signature"
},
"delete_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.",
"delete_title": "Delete signature?",
"description": "Create and manage email signatures to use when composing or replying.",
"duplicate": "Duplicate",
"edit_signature": "Edit signature",
"editor_label": "Signature",
"html_preview_label": "HTML preview",
"name_label": "Name",
"name_placeholder": "e.g., Work, Personal",
"name_required": "Name is required",
"new_signature": "New signature",
"no_signature": "No signature",
"no_signatures": "No signatures yet",
"per_identity_signatures": {
"description": "Override the default and reply signature for individual identities.",
"label": "Per-identity signatures"
},
"plain_text_preview_label": "Plain text preview",
"reply": "Reply",
"reply_signature": {
"description": "Used when replying or forwarding unless overridden per identity.",
"label": "Reply signature"
},
"show_editor": "Show editor",
"show_preview": "Show preview",
"title": "Signatures",
"toolbar": {
"align_center": "Align center",
"align_left": "Align left",
"align_right": "Align right",
"bold": "Bold",
"bullet_list": "Bullet list",
"italic": "Italic",
"link": "Link",
"ordered_list": "Ordered list",
"remove_color": "Remove color",
"strikethrough": "Strikethrough",
"text_color": "Text color",
"underline": "Underline"
},
"use_global_default": "Use global default",
"your_signatures": "Your signatures ({count})"
} }
} }
+141
View File
@@ -0,0 +1,141 @@
calendar.delete Delete
calendar.duplicate Duplicate
calendar.edit Edit
calendar.freeBusy.busy Busy
calendar.freeBusy.check Check Availability
calendar.freeBusy.click_to_select Click a free slot to select this time
calendar.freeBusy.free Free
calendar.freeBusy.hide Hide Availability
calendar.freeBusy.loading Loading...
calendar.freeBusy.no_participants Add participants to check availability.
calendar.freeBusy.tentative Tentative
calendar.freeBusy.timezone Timezone
calendar.freeBusy.title Availability
calendar.freeBusy.unavailable Out of office
calendar.freeBusy.unknown No information
calendar.resources.clear_all Clear all
calendar.resources.filter_all All
calendar.resources.hide Hide resources
calendar.resources.no_resources No resources available
calendar.resources.remove Remove {name}
calendar.resources.search_placeholder Search resources...
calendar.resources.title Resources
calendar.resources.type_equipment Equipment
calendar.resources.type_other Other
calendar.resources.type_room Rooms
calendar.resources.type_vehicle Vehicles
contacts.delete Delete
contacts.edit Edit
contacts.import.csv_address Address
contacts.import.csv_address_book Address book
contacts.import.csv_back Back
contacts.import.csv_city City
contacts.import.csv_company Company
contacts.import.csv_country Country
contacts.import.csv_email Email
contacts.import.csv_first_name First name
contacts.import.csv_ignore Ignore this column
contacts.import.csv_job_title Job title
contacts.import.csv_last_name Last name
contacts.import.csv_load_all Load all
contacts.import.csv_map_columns Map columns
contacts.import.csv_nickname Nickname
contacts.import.csv_note Note
contacts.import.csv_phone Phone
contacts.import.csv_postcode Postal code
contacts.import.csv_preview Preview
contacts.import.csv_preview_title Preview ({count, plural, one {# row} other {# rows}})
contacts.import.csv_region State/Region
contacts.import.csv_website Website
contacts.import.file_types_csv .csv files
contacts.send_email Send email
email_composer.insert_signature Insert signature
email_composer.no_signature No signature
email_composer.select_signature Select signature
email_viewer.create_appointment Create Appointment
files.send_as_attachment Send as Attachment
identities.form.signature_store_default Default signature
identities.form.signature_store_mapping Signature mapping
identities.form.signature_store_reply Reply signature
identities.form.use_global_default Use global default
mailbox_context_menu.share_folder Share Folder...
settings.importer.action_label Import
settings.importer.cancel Cancel
settings.importer.choose_files Choose files
settings.importer.conflict_copy Keep both
settings.importer.conflict_description Choose what to do when an imported message already exists.
settings.importer.conflict_label Duplicate handling
settings.importer.conflict_replace Replace duplicates
settings.importer.conflict_skip Skip duplicates
settings.importer.description Import email messages from .eml files into a folder.
settings.importer.error_details {count, plural, one {# error} other {# errors}}
settings.importer.fail Import failed
settings.importer.file_description Select one or more .eml files to import.
settings.importer.file_label Files
settings.importer.files_selected {count, plural, one {# file selected} other {# files selected}}
settings.importer.folder_description Choose the folder to import messages into.
settings.importer.folder_label Destination folder
settings.importer.import_complete Import complete
settings.importer.import_more Import more
settings.importer.importing Importing...
settings.importer.progress_failed {count} failed
settings.importer.progress_imported {count} imported
settings.importer.progress_skipped {count} skipped
settings.importer.start_import {count, plural, one {Import # file} other {Import # files}}
settings.importer.success {count, plural, one {# message imported} other {# messages imported}}
settings.importer.summary_failed {count, plural, one {# message failed} other {# messages failed}}
settings.importer.summary_imported {count, plural, one {# message imported} other {# messages imported}}
settings.importer.summary_skipped {count, plural, one {# message skipped} other {# messages skipped}}
settings.importer.title Import Mail
settings.loading Loading...
settings.refresh Refresh
settings.tabs.import Import
settings.tabs.sharing Sharing
settings.tabs.signatures Signatures
sharing.accept Accept
sharing.decline Decline
sharing.no_shares_by_me You haven't shared anything yet.
sharing.no_shares_with_me No folders shared with you yet.
sharing.shared_by Shared by
sharing.tab_shared_by_me Shared by me
sharing.tab_shared_with_me Shared with me
signatures.add_signature Add signature
signatures.default Default
signatures.default_signature.description Used for new messages unless overridden per identity.
signatures.default_signature.label Default signature
signatures.delete_message Are you sure you want to delete "{name}"? This cannot be undone.
signatures.delete_title Delete signature?
signatures.description Create and manage email signatures to use when composing or replying.
signatures.duplicate Duplicate
signatures.edit_signature Edit signature
signatures.editor_label Signature
signatures.html_preview_label HTML preview
signatures.name_label Name
signatures.name_placeholder e.g., Work, Personal
signatures.name_required Name is required
signatures.new_signature New signature
signatures.no_signature No signature
signatures.no_signatures No signatures yet
signatures.per_identity_signatures.description Override the default and reply signature for individual identities.
signatures.per_identity_signatures.label Per-identity signatures
signatures.plain_text_preview_label Plain text preview
signatures.reply Reply
signatures.reply_signature.description Used when replying or forwarding unless overridden per identity.
signatures.reply_signature.label Reply signature
signatures.show_editor Show editor
signatures.show_preview Show preview
signatures.title Signatures
signatures.toolbar.align_center Align center
signatures.toolbar.align_left Align left
signatures.toolbar.align_right Align right
signatures.toolbar.bold Bold
signatures.toolbar.bullet_list Bullet list
signatures.toolbar.italic Italic
signatures.toolbar.link Link
signatures.toolbar.ordered_list Ordered list
signatures.toolbar.remove_color Remove color
signatures.toolbar.strikethrough Strikethrough
signatures.toolbar.text_color Text color
signatures.toolbar.underline Underline
signatures.use_global_default Use global default
signatures.your_signatures Your signatures ({count})
Can't render this file because it contains an unexpected character in line 106 and column 59.
+16
View File
@@ -81,4 +81,20 @@ if (existsSync(pluginsSrc)) {
); );
} }
// next/dist/lib/metadata/** (get-metadata-route.js and its neighbours).
//
// router-utils/filesystem.js has a plain top-level `require("../../../lib/
// metadata/get-metadata-route")` - not dynamic, not conditional - yet Next's
// own output-file-tracing for `output: "standalone"` + `next build --webpack`
// drops the entire directory. Verified by inspecting a real build: the
// package was present, this one subfolder was missing, so the standalone
// server crashed on its very first line with "Cannot find module" - every
// packaged build (Electron and Docker) was affected. Same failure class as
// the sqlcipher prebuilds above: copy by hand what the tracer misses.
const metadataSrc = path.join(rootDir, "node_modules", "next", "dist", "lib", "metadata");
const metadataDest = path.join(standaloneDir, "node_modules", "next", "dist", "lib", "metadata");
rmSync(metadataDest, { recursive: true, force: true });
cpSync(metadataSrc, metadataDest, { recursive: true });
console.log("Copied next/dist/lib/metadata into the standalone output");
console.log("Assembled standalone server at", standaloneDir); console.log("Assembled standalone server at", standaloneDir);