mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-10-31 00:12:39 +00:00
feat: let users install their own plugins, with admin review of the actual code
The admin page offered "User Plugin Uploads" and "Require Admin Approval", but nothing in Settings used them: there was no upload, no uninstall and no way to ask for approval, and the admin had no list of requests. The approval code that existed pinned a hash of the code only and showed the admin a manifest the browser sent, never the code. Now: - Settings > Plugins has an install button (when uploads are allowed), a remove button for the user's own plugins, and lists in plain language what each plugin may do, high-risk items first - an install sends the ZIP to the server, which reads the manifest and code itself and pins the request to a hash of both - the admin Plugins tab lists requests with the code and approves or denies them; a user may have 10 open requests - a user plugin is checked again on every start, so a revoked approval or turning user plugins off takes effect - the consent dialog and the plugin settings are translated, use the theme colours, and show the sites a plugin may send data to
This commit is contained in:
@@ -0,0 +1,192 @@
|
||||
'use client';
|
||||
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { AlertTriangle, Check, Code, Loader2, ShieldCheck, X } from '@/components/icons';
|
||||
import { apiFetch } from '@/lib/browser-navigation';
|
||||
import { HIGH_RISK_PERMISSIONS } from '@/lib/plugin-sandbox/permission-text';
|
||||
|
||||
interface ApprovalEntry {
|
||||
pluginId: string;
|
||||
bundleHash: string;
|
||||
status: 'pending' | 'approved' | 'denied';
|
||||
manifest: {
|
||||
name?: string;
|
||||
version?: string;
|
||||
author?: string;
|
||||
description?: string;
|
||||
permissions?: string[];
|
||||
httpOrigins?: string[];
|
||||
apiPostPaths?: string[];
|
||||
};
|
||||
requestedBy: string;
|
||||
requestedAt: string;
|
||||
decidedAt?: string;
|
||||
}
|
||||
|
||||
interface SourceView {
|
||||
entry: ApprovalEntry;
|
||||
code?: string;
|
||||
warnings?: string[];
|
||||
error?: string;
|
||||
}
|
||||
|
||||
const STATUS_STYLE: Record<ApprovalEntry['status'], string> = {
|
||||
pending: 'bg-orange-100 text-orange-700 dark:bg-orange-950/30 dark:text-orange-400',
|
||||
approved: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/30 dark:text-emerald-400',
|
||||
denied: 'bg-muted text-muted-foreground',
|
||||
};
|
||||
|
||||
/**
|
||||
* Plugins users installed themselves and asked to have approved. The admin
|
||||
* decides on the package the user uploaded: its manifest and code are read
|
||||
* on the server, and the approval is pinned to that exact package.
|
||||
*/
|
||||
export function PluginApprovalsPanel() {
|
||||
const [entries, setEntries] = useState<ApprovalEntry[] | null>(null);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [busy, setBusy] = useState<string | null>(null);
|
||||
const [source, setSource] = useState<SourceView | null>(null);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
try {
|
||||
const res = await apiFetch('/api/admin/plugin-approvals');
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
const data = await res.json() as { entries: ApprovalEntry[] };
|
||||
setEntries([...data.entries].sort((a, b) =>
|
||||
Number(b.status === 'pending') - Number(a.status === 'pending') || b.requestedAt.localeCompare(a.requestedAt)));
|
||||
setError(null);
|
||||
} catch (e) {
|
||||
setError(`Could not load approval requests (${(e as Error).message})`);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => { void load(); }, [load]);
|
||||
|
||||
async function decide(entry: ApprovalEntry, decision: 'approved' | 'denied' | 'revoke') {
|
||||
const key = `${entry.pluginId}:${entry.bundleHash}`;
|
||||
setBusy(key);
|
||||
try {
|
||||
const res = decision === 'revoke'
|
||||
? await apiFetch(`/api/admin/plugin-approvals?pluginId=${encodeURIComponent(entry.pluginId)}&bundleHash=${encodeURIComponent(entry.bundleHash)}`, { method: 'DELETE' })
|
||||
: await apiFetch('/api/admin/plugin-approvals', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ pluginId: entry.pluginId, bundleHash: entry.bundleHash, decision }),
|
||||
});
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
await load();
|
||||
} catch (e) {
|
||||
setError(`Could not save the decision (${(e as Error).message})`);
|
||||
} finally {
|
||||
setBusy(null);
|
||||
}
|
||||
}
|
||||
|
||||
async function viewSource(entry: ApprovalEntry) {
|
||||
setSource({ entry });
|
||||
try {
|
||||
const res = await apiFetch(`/api/admin/plugin-approvals/source?pluginId=${encodeURIComponent(entry.pluginId)}&bundleHash=${encodeURIComponent(entry.bundleHash)}`);
|
||||
const data = await res.json();
|
||||
if (!res.ok) throw new Error(data.error ?? `HTTP ${res.status}`);
|
||||
setSource({ entry, code: data.code, warnings: data.warnings });
|
||||
} catch (e) {
|
||||
setSource({ entry, error: (e as Error).message });
|
||||
}
|
||||
}
|
||||
|
||||
const pending = entries?.filter((e) => e.status === 'pending').length ?? 0;
|
||||
|
||||
return (
|
||||
<div className="border border-border rounded-lg">
|
||||
<div className="px-4 py-3 border-b border-border bg-muted/30">
|
||||
<div className="flex items-center gap-2">
|
||||
<ShieldCheck className="w-4 h-4 text-muted-foreground" />
|
||||
<h2 className="text-sm font-medium text-foreground">Approval Requests</h2>
|
||||
{pending > 0 && (
|
||||
<span className="text-xs px-1.5 py-0.5 rounded bg-orange-100 text-orange-700 dark:bg-orange-950/30 dark:text-orange-400">{pending} waiting</span>
|
||||
)}
|
||||
</div>
|
||||
<p className="text-xs text-muted-foreground mt-0.5">Plugins users installed themselves. Read the code before you approve: an approved plugin runs in that user's mail.</p>
|
||||
</div>
|
||||
|
||||
{error && <div className="px-4 py-2 text-sm text-destructive">{error}</div>}
|
||||
|
||||
{entries === null ? (
|
||||
<div className="p-6 text-center text-sm text-muted-foreground"><Loader2 className="inline w-4 h-4 animate-spin" /></div>
|
||||
) : entries.length === 0 ? (
|
||||
<div className="p-6 text-center text-sm text-muted-foreground">No requests yet</div>
|
||||
) : (
|
||||
<div className="divide-y divide-border">
|
||||
{entries.map((entry) => {
|
||||
const key = `${entry.pluginId}:${entry.bundleHash}`;
|
||||
const perms = entry.manifest.permissions ?? [];
|
||||
return (
|
||||
<div key={key} className="px-4 py-3 space-y-2">
|
||||
<div className="flex flex-wrap items-center gap-x-2 gap-y-1">
|
||||
<span className="text-sm font-medium text-foreground">{entry.manifest.name ?? entry.pluginId}</span>
|
||||
<span className="text-xs text-muted-foreground">v{entry.manifest.version}</span>
|
||||
<span className={`text-xs px-1.5 py-0.5 rounded ${STATUS_STYLE[entry.status]}`}>{entry.status}</span>
|
||||
</div>
|
||||
{entry.manifest.description && <p className="text-xs text-muted-foreground">{entry.manifest.description}</p>}
|
||||
<div className="text-xs text-muted-foreground">
|
||||
{entry.pluginId} · by {entry.manifest.author ?? 'unknown'} · requested by {entry.requestedBy} on {new Date(entry.requestedAt).toLocaleString()}
|
||||
</div>
|
||||
{perms.length > 0 && (
|
||||
<div className="flex flex-wrap gap-1">
|
||||
{perms.map((p) => (
|
||||
<span key={p} className={`text-[11px] px-1.5 py-0.5 rounded font-mono ${HIGH_RISK_PERMISSIONS.has(p) ? 'bg-warning/15 text-foreground' : 'bg-muted text-muted-foreground'}`}>{p}</span>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{[...(entry.manifest.httpOrigins ?? []), ...(entry.manifest.apiPostPaths ?? [])].length > 0 && (
|
||||
<div className="text-xs text-muted-foreground break-all">
|
||||
Can send data to: {[...(entry.manifest.httpOrigins ?? []), ...(entry.manifest.apiPostPaths ?? [])].join(', ')}
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-wrap gap-2 pt-1">
|
||||
<button type="button" onClick={() => viewSource(entry)} className="inline-flex items-center gap-1.5 h-7 px-3 rounded-md border border-border text-xs hover:bg-accent">
|
||||
<Code className="w-3.5 h-3.5" /> View code
|
||||
</button>
|
||||
{entry.status !== 'approved' && (
|
||||
<button type="button" disabled={busy === key} onClick={() => decide(entry, 'approved')} className="inline-flex items-center gap-1.5 h-7 px-3 rounded-md bg-emerald-600 text-white text-xs font-medium hover:bg-emerald-700 disabled:opacity-50">
|
||||
<Check className="w-3.5 h-3.5" /> Approve
|
||||
</button>
|
||||
)}
|
||||
{entry.status !== 'denied' && (
|
||||
<button type="button" disabled={busy === key} onClick={() => decide(entry, 'denied')} className="inline-flex items-center gap-1.5 h-7 px-3 rounded-md bg-muted text-foreground text-xs font-medium hover:bg-accent disabled:opacity-50">
|
||||
<X className="w-3.5 h-3.5" /> Deny
|
||||
</button>
|
||||
)}
|
||||
{entry.status !== 'pending' && (
|
||||
<button type="button" disabled={busy === key} onClick={() => decide(entry, 'revoke')} className="inline-flex items-center gap-1.5 h-7 px-3 rounded-md text-xs text-muted-foreground hover:text-destructive disabled:opacity-50">
|
||||
Forget decision
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{source && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4" onMouseDown={(e) => { if (e.target === e.currentTarget) setSource(null); }}>
|
||||
<div role="dialog" aria-modal="true" aria-label="Plugin code" className="flex max-h-[90vh] w-full max-w-4xl flex-col rounded-lg border border-border bg-background shadow-xl">
|
||||
<div className="flex items-center justify-between border-b border-border px-4 py-3">
|
||||
<span className="text-sm font-medium">{source.entry.manifest.name ?? source.entry.pluginId} v{source.entry.manifest.version}</span>
|
||||
<button type="button" onClick={() => setSource(null)} aria-label="Close" className="rounded p-1 hover:bg-accent"><X className="h-4 w-4" /></button>
|
||||
</div>
|
||||
{source.warnings && source.warnings.length > 0 && (
|
||||
<div className="flex items-start gap-2 border-b border-border px-4 py-2 text-xs text-foreground">
|
||||
<AlertTriangle className="mt-0.5 h-3.5 w-3.5 text-warning" /> {source.warnings.join('; ')}
|
||||
</div>
|
||||
)}
|
||||
<pre className="min-h-0 flex-1 overflow-auto p-4 text-[11px] leading-relaxed font-mono whitespace-pre-wrap break-all">
|
||||
{source.error ?? source.code ?? 'Loading…'}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import type { SettingsPolicy } from '@/lib/admin/types';
|
||||
import { DEFAULT_POLICY } from '@/lib/admin/types';
|
||||
import { apiFetch } from '@/lib/browser-navigation';
|
||||
import { PluginConfigPanel } from './plugin-config-panel';
|
||||
import { PluginApprovalsPanel } from './plugin-approvals-panel';
|
||||
|
||||
interface PluginEntry {
|
||||
id: string;
|
||||
@@ -374,6 +375,8 @@ export function PluginsTab() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{pluginsUploadEnabled && <PluginApprovalsPanel />}
|
||||
|
||||
<div className="border border-border rounded-lg">
|
||||
<div className="px-4 py-3 border-b border-border bg-muted/30">
|
||||
<div className="flex items-center gap-2">
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import { requireAdminAuth } from '@/lib/admin/session';
|
||||
import { logger } from '@/lib/logger';
|
||||
import { readApprovalBundle } from '@/lib/admin/plugin-approvals';
|
||||
import { readPluginPackage } from '@/lib/extension-package';
|
||||
|
||||
/**
|
||||
* GET /api/admin/plugin-approvals/source?pluginId=…&bundleHash=…
|
||||
*
|
||||
* The manifest and code of a plugin a user asked to have approved, read
|
||||
* from the ZIP they uploaded, so the admin decides on what will actually run.
|
||||
*/
|
||||
export async function GET(request: NextRequest) {
|
||||
try {
|
||||
const result = await requireAdminAuth(request);
|
||||
if ('error' in result) return result.error;
|
||||
|
||||
const pluginId = request.nextUrl.searchParams.get('pluginId') ?? '';
|
||||
const bundleHash = request.nextUrl.searchParams.get('bundleHash') ?? '';
|
||||
if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(pluginId) || !/^[a-f0-9]{64}$/.test(bundleHash)) {
|
||||
return NextResponse.json({ error: 'invalid pluginId or bundleHash' }, { status: 400 });
|
||||
}
|
||||
const zip = await readApprovalBundle(pluginId, bundleHash);
|
||||
if (!zip) return NextResponse.json({ error: 'No package stored for this request' }, { status: 404 });
|
||||
const pkg = await readPluginPackage(zip);
|
||||
return NextResponse.json(
|
||||
{ manifest: pkg.manifest, code: pkg.code, warnings: pkg.warnings },
|
||||
{ headers: { 'Cache-Control': 'no-store' } },
|
||||
);
|
||||
} catch (err) {
|
||||
logger.error('plugin-approvals source GET', { error: err instanceof Error ? err.message : String(err) });
|
||||
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* @vitest-environment node
|
||||
*/
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { NextRequest } from 'next/server';
|
||||
import JSZip from 'jszip';
|
||||
|
||||
vi.mock('next/headers', () => ({ cookies: async () => ({ get: () => undefined }) }));
|
||||
vi.mock('@/lib/stalwart/auth-context', () => ({
|
||||
readStalwartAuthContextFromStore: (_store: unknown, slot: number) => (slot === 0 ? { username: currentUser } : null),
|
||||
}));
|
||||
vi.mock('@/lib/security/same-origin', () => ({ rejectCrossOriginRequest: () => null }));
|
||||
|
||||
let currentUser = 'alice@example.org';
|
||||
const entries: Array<Record<string, unknown>> = [];
|
||||
const bundles = new Map<string, Uint8Array>();
|
||||
vi.mock('@/lib/admin/plugin-approvals', async (orig) => {
|
||||
const real = await orig<typeof import('@/lib/admin/plugin-approvals')>();
|
||||
return {
|
||||
...real,
|
||||
getApprovalStatus: vi.fn(async () => ({ status: 'not-requested' })),
|
||||
requestApproval: vi.fn(async (pluginId: string, bundleHash: string, manifest: unknown, requestedBy: string) => {
|
||||
const pending = entries.filter((e) => e.status === 'pending' && e.requestedBy === requestedBy).length;
|
||||
if (pending >= real.MAX_PENDING_PER_USER) throw new real.ApprovalLimitError('too many');
|
||||
const entry = { pluginId, bundleHash, manifest, requestedBy, status: 'pending', requestedAt: 'now' };
|
||||
entries.push(entry);
|
||||
return entry;
|
||||
}),
|
||||
saveApprovalBundle: vi.fn(async (id: string, hash: string, zip: Uint8Array) => { bundles.set(`${id}:${hash}`, zip); }),
|
||||
};
|
||||
});
|
||||
|
||||
import { POST } from '../route';
|
||||
import { packageHash, checkPluginManifest } from '@/lib/extension-package';
|
||||
|
||||
const MANIFEST = {
|
||||
id: 'my-plugin', name: 'Mine', version: '1.0.0', author: 'me', description: 'd',
|
||||
type: 'hook', permissions: ['email:read'], entrypoint: 'index.js',
|
||||
};
|
||||
|
||||
async function zipOf(manifest: Record<string, unknown>, code = 'module.exports = {}') {
|
||||
const zip = new JSZip();
|
||||
zip.file('manifest.json', JSON.stringify(manifest));
|
||||
zip.file('index.js', code);
|
||||
return zip.generateAsync({ type: 'uint8array' });
|
||||
}
|
||||
|
||||
async function submit(bytes: Uint8Array) {
|
||||
const form = new FormData();
|
||||
form.append('file', new File([bytes as BlobPart], 'p.zip'));
|
||||
return POST(new NextRequest('http://localhost/api/plugin-approval-status', { method: 'POST', body: form }));
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
entries.length = 0;
|
||||
bundles.clear();
|
||||
currentUser = 'alice@example.org';
|
||||
});
|
||||
|
||||
describe('POST /api/plugin-approval-status', () => {
|
||||
it('pins the request to the hash of the code and manifest it read itself', async () => {
|
||||
const res = await submit(await zipOf(MANIFEST));
|
||||
const body = await res.json();
|
||||
|
||||
const expected = await packageHash(checkPluginManifest(MANIFEST).manifest!, 'module.exports = {}');
|
||||
expect(res.status).toBe(200);
|
||||
expect(body.bundleHash).toBe(expected);
|
||||
expect(entries[0].manifest).toMatchObject({ name: 'Mine', permissions: ['email:read'] });
|
||||
expect(bundles.has(`my-plugin:${expected}`)).toBe(true);
|
||||
});
|
||||
|
||||
it('gives the same code with wider permissions a different hash', async () => {
|
||||
const narrow = await (await submit(await zipOf(MANIFEST))).json();
|
||||
const wide = await (await submit(await zipOf({ ...MANIFEST, permissions: ['email:read', 'http:fetch'], httpOrigins: ['https://evil.example'] }))).json();
|
||||
|
||||
expect(wide.bundleHash).not.toBe(narrow.bundleHash);
|
||||
});
|
||||
|
||||
it('refuses the old form where the client named the hash and manifest', async () => {
|
||||
const res = await POST(new NextRequest('http://localhost/api/plugin-approval-status', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ pluginId: 'my-plugin', bundleHash: 'a'.repeat(64), manifest: { permissions: [] } }),
|
||||
headers: { 'content-type': 'application/json' },
|
||||
}));
|
||||
|
||||
expect(res.status).toBe(400);
|
||||
expect(entries).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('limits how many requests one user can have open', async () => {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
expect((await submit(await zipOf({ ...MANIFEST, id: `p-${i}x` }))).status).toBe(200);
|
||||
}
|
||||
const res = await submit(await zipOf({ ...MANIFEST, id: 'one-more' }));
|
||||
|
||||
expect(res.status).toBe(429);
|
||||
});
|
||||
});
|
||||
@@ -6,7 +6,14 @@ import { sessionCookieName } from '@/lib/auth/session-cookie';
|
||||
import { readStalwartAuthContextFromStore } from '@/lib/stalwart/auth-context';
|
||||
import { MAX_ACCOUNT_SLOTS } from '@/lib/account-utils';
|
||||
import { logger } from '@/lib/logger';
|
||||
import { getApprovalStatus, requestApproval, type ApprovalEntry } from '@/lib/admin/plugin-approvals';
|
||||
import {
|
||||
ApprovalLimitError,
|
||||
getApprovalStatus,
|
||||
requestApproval,
|
||||
saveApprovalBundle,
|
||||
type ApprovalEntry,
|
||||
} from '@/lib/admin/plugin-approvals';
|
||||
import { ExtensionPackageError, packageHash, readPluginPackage } from '@/lib/extension-package';
|
||||
|
||||
/**
|
||||
* GET /api/plugin-approval-status?pluginId=X&bundleHash=Y
|
||||
@@ -15,8 +22,9 @@ import { getApprovalStatus, requestApproval, type ApprovalEntry } from '@/lib/ad
|
||||
* they want to enable. The client uses this BEFORE running `enablePlugin`
|
||||
* when the `requirePluginApproval` policy is set.
|
||||
*
|
||||
* POST same path with body `{ pluginId, bundleHash, manifest }` creates a
|
||||
* pending approval entry (or returns the existing one).
|
||||
* POST same path with the plugin ZIP as multipart `file` creates a pending
|
||||
* approval entry (or returns the existing one) for the package hash the
|
||||
* server computes, and keeps the ZIP for the admin to review.
|
||||
*/
|
||||
|
||||
async function resolveUsername(): Promise<string | null> {
|
||||
@@ -67,26 +75,55 @@ export async function POST(request: NextRequest) {
|
||||
const username = await resolveUsername();
|
||||
if (!username) return NextResponse.json({ error: 'unauthenticated' }, { status: 401 });
|
||||
|
||||
let body: unknown;
|
||||
try { body = await request.json(); } catch { body = null; }
|
||||
const b = (body ?? {}) as { pluginId?: unknown; bundleHash?: unknown; manifest?: unknown };
|
||||
if (!isValidId(b.pluginId) || !isValidHash(b.bundleHash)) {
|
||||
return NextResponse.json({ error: 'invalid pluginId or bundleHash' }, { status: 400 });
|
||||
// The request carries the package itself. The admin reviews the code
|
||||
// and manifest the server read from it, and the approval is pinned to
|
||||
// the hash the server computed, not to anything the client claims.
|
||||
let file: File | null = null;
|
||||
try {
|
||||
const form = await request.formData();
|
||||
const value = form.get('file');
|
||||
file = value instanceof File ? value : null;
|
||||
} catch { /* not multipart */ }
|
||||
if (!file) {
|
||||
return NextResponse.json({ error: 'Send the plugin ZIP as "file"' }, { status: 400 });
|
||||
}
|
||||
const bytes = new Uint8Array(await file.arrayBuffer());
|
||||
|
||||
const m = (b.manifest ?? {}) as Record<string, unknown>;
|
||||
const manifest: ApprovalEntry['manifest'] = {
|
||||
name: typeof m.name === 'string' ? m.name.slice(0, 200) : undefined,
|
||||
version: typeof m.version === 'string' ? m.version.slice(0, 64) : undefined,
|
||||
author: typeof m.author === 'string' ? m.author.slice(0, 200) : undefined,
|
||||
description: typeof m.description === 'string' ? m.description.slice(0, 500) : undefined,
|
||||
permissions: Array.isArray(m.permissions) ? (m.permissions as unknown[]).filter((x): x is string => typeof x === 'string').slice(0, 50) : undefined,
|
||||
httpOrigins: Array.isArray(m.httpOrigins) ? (m.httpOrigins as unknown[]).filter((x): x is string => typeof x === 'string').slice(0, 20) : undefined,
|
||||
apiPostPaths: Array.isArray(m.apiPostPaths) ? (m.apiPostPaths as unknown[]).filter((x): x is string => typeof x === 'string').slice(0, 20) : undefined,
|
||||
let pkg;
|
||||
try {
|
||||
pkg = await readPluginPackage(bytes, { appVersion: process.env.NEXT_PUBLIC_APP_VERSION });
|
||||
} catch (err) {
|
||||
if (err instanceof ExtensionPackageError) return NextResponse.json({ error: err.message }, { status: 400 });
|
||||
throw err;
|
||||
}
|
||||
const { manifest, code } = pkg;
|
||||
const hash = await packageHash(manifest, code);
|
||||
|
||||
const snapshot: ApprovalEntry['manifest'] = {
|
||||
name: manifest.name,
|
||||
version: manifest.version,
|
||||
author: manifest.author,
|
||||
description: manifest.description,
|
||||
permissions: manifest.permissions,
|
||||
httpOrigins: manifest.httpOrigins,
|
||||
apiPostPaths: manifest.apiPostPaths,
|
||||
};
|
||||
|
||||
const entry = await requestApproval(b.pluginId as string, b.bundleHash as string, manifest, username);
|
||||
return NextResponse.json({ status: entry.status, requestedAt: entry.requestedAt, decidedAt: entry.decidedAt });
|
||||
let entry: ApprovalEntry;
|
||||
try {
|
||||
entry = await requestApproval(manifest.id, hash, snapshot, username);
|
||||
} catch (err) {
|
||||
if (err instanceof ApprovalLimitError) return NextResponse.json({ error: err.message }, { status: 429 });
|
||||
throw err;
|
||||
}
|
||||
if (entry.status === 'pending') await saveApprovalBundle(manifest.id, hash, bytes);
|
||||
return NextResponse.json({
|
||||
pluginId: manifest.id,
|
||||
bundleHash: hash,
|
||||
status: entry.status,
|
||||
requestedAt: entry.requestedAt,
|
||||
decidedAt: entry.decidedAt,
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error('plugin-approval-status POST', { error: err instanceof Error ? err.message : String(err) });
|
||||
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
||||
|
||||
@@ -4,109 +4,61 @@
|
||||
// the plugin's manifest declares. Accepting persists the grant on the
|
||||
// plugin record so future enables skip the prompt.
|
||||
|
||||
import React, { useEffect, useSyncExternalStore } from 'react';
|
||||
import { head, resolveHead, subscribe, describePermission } from '@/lib/plugin-sandbox/consent';
|
||||
import React, { useId, useSyncExternalStore } from 'react';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { head, resolveHead, subscribe } from '@/lib/plugin-sandbox/consent';
|
||||
import { HIGH_RISK_PERMISSIONS } from '@/lib/plugin-sandbox/permission-text';
|
||||
import { useFocusTrap } from '@/hooks/use-focus-trap';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { PluginPermissionList } from './plugin-permission-list';
|
||||
|
||||
export function PluginConsentDialog(): React.JSX.Element | null {
|
||||
const current = useSyncExternalStore(subscribe, head, () => null);
|
||||
|
||||
useEffect(() => {
|
||||
if (!current) return;
|
||||
function onKey(e: KeyboardEvent) {
|
||||
if (e.key === 'Escape') {
|
||||
e.preventDefault();
|
||||
resolveHead(false);
|
||||
}
|
||||
}
|
||||
document.addEventListener('keydown', onKey, true);
|
||||
return () => document.removeEventListener('keydown', onKey, true);
|
||||
}, [current]);
|
||||
const t = useTranslations('plugins.consent');
|
||||
const id = useId();
|
||||
const dialogRef = useFocusTrap({
|
||||
isActive: !!current,
|
||||
onEscape: () => resolveHead(false),
|
||||
restoreFocus: true,
|
||||
});
|
||||
|
||||
if (!current) return null;
|
||||
const risky = current.permissions.some((p) => HIGH_RISK_PERMISSIONS.has(p));
|
||||
|
||||
return (
|
||||
<div
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="plugin-consent-title"
|
||||
style={{
|
||||
position: 'fixed', inset: 0,
|
||||
background: 'rgba(0,0,0,0.55)',
|
||||
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
||||
zIndex: 100001,
|
||||
}}
|
||||
className="fixed inset-0 z-[100001] flex items-center justify-center bg-black/50 p-4"
|
||||
onMouseDown={(e) => { if (e.target === e.currentTarget) resolveHead(false); }}
|
||||
>
|
||||
<div style={{
|
||||
background: 'var(--background, #fff)',
|
||||
color: 'var(--foreground, #0f172a)',
|
||||
border: '1px solid var(--border, #e2e8f0)',
|
||||
borderRadius: 12,
|
||||
padding: 20,
|
||||
maxWidth: 560,
|
||||
width: '92%',
|
||||
boxShadow: '0 16px 48px rgba(0,0,0,0.35)',
|
||||
}}>
|
||||
<h2 id="plugin-consent-title" style={{ fontSize: 16, fontWeight: 600, margin: '0 0 6px 0' }}>
|
||||
Allow “{current.pluginName}” to access your data?
|
||||
</h2>
|
||||
<p style={{ fontSize: 12, color: 'var(--muted-foreground, #64748b)', margin: '0 0 14px 0' }}>
|
||||
This plugin is requesting the permissions below. You can revoke them by uninstalling the plugin.
|
||||
</p>
|
||||
|
||||
<ul style={{ listStyle: 'none', padding: 0, margin: '0 0 16px 0', maxHeight: 320, overflowY: 'auto' }}>
|
||||
{current.permissions.map((perm) => {
|
||||
const desc = describePermission(perm);
|
||||
return (
|
||||
<li
|
||||
key={perm}
|
||||
style={{
|
||||
padding: '10px 12px',
|
||||
marginBottom: 6,
|
||||
borderRadius: 8,
|
||||
background: 'var(--accent, #f1f5f9)',
|
||||
border: '1px solid var(--border, #e2e8f0)',
|
||||
}}
|
||||
>
|
||||
<div style={{ fontSize: 13, fontWeight: 600, marginBottom: 2 }}>{desc.title}</div>
|
||||
<div style={{ fontSize: 12, color: 'var(--muted-foreground, #64748b)' }}>{desc.body}</div>
|
||||
<code style={{ fontSize: 10, color: 'var(--muted-foreground, #94a3b8)', display: 'block', marginTop: 4 }}>{perm}</code>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
|
||||
<div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end' }}>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => resolveHead(false)}
|
||||
style={{
|
||||
padding: '8px 16px', borderRadius: 8, fontSize: 13, fontWeight: 500,
|
||||
cursor: 'pointer',
|
||||
border: '1px solid var(--border, #e2e8f0)',
|
||||
background: 'transparent',
|
||||
color: 'inherit',
|
||||
}}
|
||||
>
|
||||
Deny
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
autoFocus
|
||||
onClick={() => resolveHead(true)}
|
||||
style={{
|
||||
padding: '8px 16px', borderRadius: 8, fontSize: 13, fontWeight: 500,
|
||||
cursor: 'pointer',
|
||||
border: '1px solid transparent',
|
||||
background: '#3b82f6',
|
||||
color: '#fff',
|
||||
}}
|
||||
>
|
||||
Allow
|
||||
</button>
|
||||
<div
|
||||
ref={dialogRef}
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby={`${id}-title`}
|
||||
className="flex max-h-[90vh] w-full max-w-lg flex-col rounded-lg border border-border bg-background shadow-xl"
|
||||
>
|
||||
<div className="p-5 pb-3">
|
||||
<h2 id={`${id}-title`} className="text-base font-semibold text-foreground">
|
||||
{t('title', { name: current.pluginName })}
|
||||
</h2>
|
||||
<p className="mt-1 text-sm text-muted-foreground">{t('intro')}</p>
|
||||
{risky && (
|
||||
<p className="mt-2 rounded-md bg-warning/10 px-3 py-2 text-xs text-foreground">{t('high_risk_note')}</p>
|
||||
)}
|
||||
</div>
|
||||
<div style={{ marginTop: 12, fontSize: 11, color: 'var(--muted-foreground, #94a3b8)', textAlign: 'right' }}>
|
||||
Plugin: {current.pluginId}
|
||||
<div className="min-h-0 flex-1 overflow-y-auto px-5">
|
||||
<PluginPermissionList
|
||||
permissions={current.permissions}
|
||||
httpOrigins={current.httpOrigins}
|
||||
apiPostPaths={current.apiPostPaths}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3 p-5 pt-4 sm:flex-row sm:items-center sm:justify-between">
|
||||
<span className="text-xs text-muted-foreground">{t('revoke_hint')}</span>
|
||||
<div className="flex justify-end gap-2">
|
||||
<Button variant="outline" className="whitespace-nowrap" onClick={() => resolveHead(false)}>{t('deny')}</Button>
|
||||
<Button autoFocus className="whitespace-nowrap" onClick={() => resolveHead(true)}>{t('allow')}</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
'use client';
|
||||
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { AlertTriangle } from '@/components/icons';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { HIGH_RISK_PERMISSIONS, permissionKey, visiblePermissions } from '@/lib/plugin-sandbox/permission-text';
|
||||
|
||||
interface PluginPermissionListProps {
|
||||
permissions: readonly string[];
|
||||
/** Sites the plugin may send requests to (manifest httpOrigins). */
|
||||
httpOrigins?: readonly string[];
|
||||
/** Server endpoints it may call with the user's login (apiPostPaths). */
|
||||
apiPostPaths?: readonly string[];
|
||||
compact?: boolean;
|
||||
}
|
||||
|
||||
/** Plain-language list of what a plugin may do, high-risk items first. */
|
||||
export function PluginPermissionList({ permissions, httpOrigins, apiPostPaths, compact }: PluginPermissionListProps) {
|
||||
const t = useTranslations('plugins.permissions');
|
||||
const perms = visiblePermissions(permissions);
|
||||
if (perms.length === 0) {
|
||||
return <p className="text-xs text-muted-foreground">{t('none')}</p>;
|
||||
}
|
||||
return (
|
||||
<ul className={cn('space-y-1.5', compact && 'space-y-1')}>
|
||||
{perms.map((perm) => {
|
||||
const key = permissionKey(perm);
|
||||
const risky = HIGH_RISK_PERMISSIONS.has(perm);
|
||||
const targets = perm === 'http:fetch' ? httpOrigins : perm === 'http:post' ? apiPostPaths : undefined;
|
||||
return (
|
||||
<li
|
||||
key={perm}
|
||||
className={cn(
|
||||
'rounded-md border px-3 py-2',
|
||||
risky ? 'border-warning/40 bg-warning/10' : 'border-border bg-muted/40',
|
||||
)}
|
||||
>
|
||||
<div className="flex items-start gap-2">
|
||||
{risky && <AlertTriangle className="mt-0.5 h-3.5 w-3.5 flex-shrink-0 text-warning" aria-label={t('high_risk')} />}
|
||||
<div className="min-w-0">
|
||||
<div className="text-sm font-medium text-foreground">{t(`${key}.title`)}</div>
|
||||
{!compact && <div className="text-xs text-muted-foreground">{t(`${key}.body`)}</div>}
|
||||
{targets && targets.length > 0 && (
|
||||
<ul className="mt-1 space-y-0.5">
|
||||
{targets.map((target) => (
|
||||
<li key={target} className="break-all font-mono text-[11px] text-foreground">{target}</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
);
|
||||
}
|
||||
@@ -1,12 +1,17 @@
|
||||
'use client';
|
||||
|
||||
import { useState, useEffect } from 'react';
|
||||
import { useState, useEffect, useRef } from 'react';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { usePluginStore } from '@/stores/plugin-store';
|
||||
import { usePolicyStore } from '@/stores/policy-store';
|
||||
import { useConfig } from '@/hooks/use-config';
|
||||
import { SettingsSection, ToggleSwitch } from './settings-section';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { AlertTriangle, Puzzle, Lock, Server } from '@/components/icons';
|
||||
import { AlertTriangle, Puzzle, Lock, Server, Upload, Trash2, Loader2 } from '@/components/icons';
|
||||
import { toast } from '@/stores/toast-store';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { ConfirmDialog } from '@/components/ui/confirm-dialog';
|
||||
import { PluginPermissionList } from '@/components/plugins/plugin-permission-list';
|
||||
import type { InstalledPlugin, PluginStatus, SettingFieldSchema } from '@/lib/plugin-types';
|
||||
|
||||
const STATUS_COLORS: Record<PluginStatus, string> = {
|
||||
@@ -17,10 +22,19 @@ const STATUS_COLORS: Record<PluginStatus, string> = {
|
||||
error: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
|
||||
};
|
||||
|
||||
/** Errors the store records as codes, so they can be shown translated. */
|
||||
const ERROR_CODES = new Set(['user-plugins-off', 'approval-unavailable', 'approval-denied', 'approval-pending']);
|
||||
|
||||
export function PluginsSettings() {
|
||||
const { plugins, enablePlugin, disablePlugin, updatePluginSettings, initializePlugins, initialized } = usePluginStore();
|
||||
const { isFeatureEnabled, isPluginForceEnabled, isPluginApproved, fetchPolicy, loaded } = usePolicyStore();
|
||||
const t = useTranslations('plugins.settings');
|
||||
const { plugins, installPlugin, uninstallPlugin, enablePlugin, disablePlugin, updatePluginSettings, initializePlugins, initialized } = usePluginStore();
|
||||
const { isFeatureEnabled, isPluginForceEnabled, fetchPolicy, loaded } = usePolicyStore();
|
||||
const { demoMode } = useConfig();
|
||||
const [expandedPlugin, setExpandedPlugin] = useState<string | null>(null);
|
||||
const [installing, setInstalling] = useState(false);
|
||||
const [installError, setInstallError] = useState<string | null>(null);
|
||||
const [removing, setRemoving] = useState<InstalledPlugin | null>(null);
|
||||
const fileInput = useRef<HTMLInputElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (!loaded) {
|
||||
@@ -45,67 +59,137 @@ export function PluginsSettings() {
|
||||
return null;
|
||||
}
|
||||
|
||||
const uploadsAllowed = isFeatureEnabled('pluginsUploadEnabled') && !demoMode;
|
||||
const requireApproval = isFeatureEnabled('requirePluginApproval');
|
||||
|
||||
const handleToggle = async (plugin: InstalledPlugin) => {
|
||||
if (!initialized) return;
|
||||
|
||||
const isForceEnabled = plugin.forceEnabled || isPluginForceEnabled(plugin.id);
|
||||
if (isForceEnabled) {
|
||||
toast.info(`Plugin "${plugin.name}" is forced by admin and cannot be disabled`);
|
||||
return;
|
||||
}
|
||||
|
||||
const requireApproval = isFeatureEnabled('requirePluginApproval');
|
||||
const isApproved = plugin.adminApproved || plugin.managed || isPluginApproved(plugin.id);
|
||||
if (!plugin.enabled && requireApproval && !isApproved) {
|
||||
toast.info(`Plugin "${plugin.name}" requires admin approval before it can be enabled`);
|
||||
if (plugin.forceEnabled || isPluginForceEnabled(plugin.id)) {
|
||||
toast.info(t('toast_forced', { name: plugin.name }));
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin.enabled) {
|
||||
disablePlugin(plugin.id);
|
||||
toast.info(`Plugin "${plugin.name}" disabled`);
|
||||
} else {
|
||||
await enablePlugin(plugin.id);
|
||||
toast.success(`Plugin "${plugin.name}" enabled`);
|
||||
toast.info(t('toast_disabled', { name: plugin.name }));
|
||||
return;
|
||||
}
|
||||
await enablePlugin(plugin.id);
|
||||
const after = usePluginStore.getState().plugins.find((p) => p.id === plugin.id);
|
||||
if (after?.enabled) {
|
||||
toast.success(t('toast_enabled', { name: plugin.name }));
|
||||
} else if (after?.error === 'approval-pending') {
|
||||
toast.info(t('toast_approval_requested', { name: plugin.name }));
|
||||
}
|
||||
};
|
||||
|
||||
const handleInstall = async (file: File | undefined) => {
|
||||
if (!file) return;
|
||||
setInstalling(true);
|
||||
setInstallError(null);
|
||||
try {
|
||||
const result = await installPlugin(file);
|
||||
if (!result.success) {
|
||||
setInstallError(
|
||||
result.reason === 'uploads-disabled' ? t('install_uploads_off')
|
||||
: result.reason === 'managed-id' ? t('install_managed_id')
|
||||
: t('install_invalid', { details: result.error ?? '' }),
|
||||
);
|
||||
return;
|
||||
}
|
||||
toast.success(result.approvalStatus === 'pending'
|
||||
? t('toast_installed_pending')
|
||||
: t('toast_installed'));
|
||||
} finally {
|
||||
setInstalling(false);
|
||||
if (fileInput.current) fileInput.current.value = '';
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<SettingsSection title="Plugins" description="Plugins deployed by your administrator. Toggle to enable or disable for your account.">
|
||||
{/* Plugin List */}
|
||||
<SettingsSection
|
||||
title={t('title')}
|
||||
description={demoMode ? t('description_demo') : uploadsAllowed ? t('description_uploads') : t('description')}
|
||||
>
|
||||
{uploadsAllowed && (
|
||||
<div className="space-y-2">
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => fileInput.current?.click()}
|
||||
disabled={installing}
|
||||
>
|
||||
{installing ? <Loader2 className="h-4 w-4 animate-spin" /> : <Upload className="h-4 w-4" />}
|
||||
{t('install_button')}
|
||||
</Button>
|
||||
<span className="text-xs text-muted-foreground">
|
||||
{requireApproval ? t('install_hint_approval') : t('install_hint')}
|
||||
</span>
|
||||
<input
|
||||
ref={fileInput}
|
||||
type="file"
|
||||
accept=".zip,application/zip"
|
||||
className="sr-only"
|
||||
aria-label={t('install_button')}
|
||||
onChange={(e) => handleInstall(e.target.files?.[0])}
|
||||
/>
|
||||
</div>
|
||||
{installError && (
|
||||
<div role="alert" className="flex items-start gap-2 rounded-md bg-destructive/10 p-2 text-xs text-destructive">
|
||||
<AlertTriangle className="mt-0.5 h-3.5 w-3.5 flex-shrink-0" />
|
||||
<span className="break-words">{installError}</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{plugins.length === 0 ? (
|
||||
<div className="flex flex-col items-center justify-center py-12 text-center">
|
||||
<Puzzle className="w-12 h-12 text-muted-foreground/30 mb-3" />
|
||||
<p className="text-sm text-muted-foreground mb-1">No plugins available</p>
|
||||
<p className="text-xs text-muted-foreground/70">Your administrator has not deployed any plugins</p>
|
||||
<Puzzle className="mb-3 h-12 w-12 text-muted-foreground/30" />
|
||||
<p className="mb-1 text-sm text-muted-foreground">{t('empty_title')}</p>
|
||||
<p className="text-xs text-muted-foreground/70">
|
||||
{demoMode ? t('empty_demo') : uploadsAllowed ? t('empty_uploads') : t('empty_admin')}
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{plugins.map(plugin => {
|
||||
const requireApproval = isFeatureEnabled('requirePluginApproval');
|
||||
const isApproved = plugin.adminApproved || plugin.managed || isPluginApproved(plugin.id);
|
||||
const needsApproval = requireApproval && !isApproved;
|
||||
return (
|
||||
{plugins.map(plugin => (
|
||||
<PluginCard
|
||||
key={plugin.id}
|
||||
plugin={plugin}
|
||||
isExpanded={expandedPlugin === plugin.id}
|
||||
isForceEnabled={plugin.forceEnabled || isPluginForceEnabled(plugin.id)}
|
||||
isManaged={Boolean(plugin.managed)}
|
||||
needsApproval={needsApproval}
|
||||
controlsDisabled={!initialized}
|
||||
onToggleExpand={() => setExpandedPlugin(expandedPlugin === plugin.id ? null : plugin.id)}
|
||||
onToggle={() => handleToggle(plugin)}
|
||||
onRemove={() => setRemoving(plugin)}
|
||||
onUpdateSettings={(settings) => updatePluginSettings(plugin.id, settings)}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!initialized && plugins.length > 0 && (
|
||||
<p className="text-xs text-muted-foreground">Syncing plugin policy and managed state...</p>
|
||||
<p className="text-xs text-muted-foreground">{t('syncing')}</p>
|
||||
)}
|
||||
|
||||
<ConfirmDialog
|
||||
isOpen={removing !== null}
|
||||
onClose={() => setRemoving(null)}
|
||||
onConfirm={() => {
|
||||
if (removing) {
|
||||
uninstallPlugin(removing.id);
|
||||
toast.info(t('toast_removed', { name: removing.name }));
|
||||
}
|
||||
setRemoving(null);
|
||||
}}
|
||||
title={t('remove_title', { name: removing?.name ?? '' })}
|
||||
message={t('remove_message')}
|
||||
confirmText={t('remove_confirm')}
|
||||
variant="destructive"
|
||||
/>
|
||||
</SettingsSection>
|
||||
);
|
||||
}
|
||||
@@ -116,15 +200,22 @@ interface PluginCardProps {
|
||||
plugin: InstalledPlugin;
|
||||
isExpanded: boolean;
|
||||
isForceEnabled: boolean;
|
||||
isManaged: boolean;
|
||||
needsApproval: boolean;
|
||||
controlsDisabled: boolean;
|
||||
onToggleExpand: () => void;
|
||||
onToggle: () => void;
|
||||
onRemove: () => void;
|
||||
onUpdateSettings: (settings: Record<string, unknown>) => void;
|
||||
}
|
||||
|
||||
function PluginCard({ plugin, isExpanded, isForceEnabled, isManaged, needsApproval, controlsDisabled, onToggleExpand, onToggle, onUpdateSettings }: PluginCardProps) {
|
||||
function PluginCard({ plugin, isExpanded, isForceEnabled, controlsDisabled, onToggleExpand, onToggle, onRemove, onUpdateSettings }: PluginCardProps) {
|
||||
const t = useTranslations('plugins.settings');
|
||||
const isManaged = Boolean(plugin.managed);
|
||||
const awaiting = !isManaged && plugin.approvalStatus === 'pending';
|
||||
const denied = !isManaged && plugin.approvalStatus === 'denied';
|
||||
const errorText = plugin.error
|
||||
? ERROR_CODES.has(plugin.error) ? t(`error_${plugin.error.replace(/-/g, '_')}`) : plugin.error
|
||||
: null;
|
||||
|
||||
return (
|
||||
<div
|
||||
data-search-label={plugin.name}
|
||||
@@ -133,84 +224,83 @@ function PluginCard({ plugin, isExpanded, isForceEnabled, isManaged, needsApprov
|
||||
plugin.status === 'error' ? 'border-destructive/40' : 'border-border',
|
||||
)}
|
||||
>
|
||||
{/* Header */}
|
||||
<div className="flex items-center gap-3 p-3">
|
||||
<div className="flex-1 min-w-0 cursor-pointer" onClick={onToggleExpand}>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-sm font-medium text-foreground truncate">{plugin.name}</span>
|
||||
<span className={cn('text-[10px] px-1.5 py-0.5 rounded-full font-medium', STATUS_COLORS[plugin.status])}>
|
||||
{plugin.status}
|
||||
<button
|
||||
type="button"
|
||||
className="min-w-0 flex-1 text-left"
|
||||
onClick={onToggleExpand}
|
||||
aria-expanded={isExpanded}
|
||||
>
|
||||
<div className="flex flex-wrap items-center gap-x-2 gap-y-1">
|
||||
<span className="truncate text-sm font-medium text-foreground">{plugin.name}</span>
|
||||
<span className={cn('rounded-full px-1.5 py-0.5 text-[10px] font-medium', STATUS_COLORS[plugin.status])}>
|
||||
{t(`status_${plugin.status}`)}
|
||||
</span>
|
||||
{isForceEnabled && (
|
||||
<span className="text-[10px] px-1.5 py-0.5 rounded-full font-medium bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400 flex items-center gap-0.5">
|
||||
<Lock className="w-2.5 h-2.5" /> Forced
|
||||
<span className="flex items-center gap-0.5 rounded-full bg-amber-100 px-1.5 py-0.5 text-[10px] font-medium text-amber-700 dark:bg-amber-900/30 dark:text-amber-400">
|
||||
<Lock className="h-2.5 w-2.5" /> {t('badge_forced')}
|
||||
</span>
|
||||
)}
|
||||
{isManaged && (
|
||||
<span className="text-[10px] px-1.5 py-0.5 rounded-full font-medium bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400 flex items-center gap-0.5">
|
||||
<Server className="w-2.5 h-2.5" /> Managed
|
||||
</span>
|
||||
)}
|
||||
{needsApproval && (
|
||||
<span className="text-[10px] px-1.5 py-0.5 rounded-full font-medium bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400">
|
||||
Awaiting approval
|
||||
<span className={cn(
|
||||
'flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-[10px] font-medium',
|
||||
isManaged
|
||||
? 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400'
|
||||
: 'bg-muted text-muted-foreground',
|
||||
)}>
|
||||
{isManaged && <Server className="h-2.5 w-2.5" />} {isManaged ? t('badge_managed') : t('badge_yours')}
|
||||
</span>
|
||||
{awaiting && (
|
||||
<span className="rounded-full bg-orange-100 px-1.5 py-0.5 text-[10px] font-medium text-orange-700 dark:bg-orange-900/30 dark:text-orange-400">
|
||||
{t('badge_awaiting')}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center gap-2 mt-0.5">
|
||||
<span className="text-xs text-muted-foreground">{plugin.author}</span>
|
||||
<span className="text-xs text-muted-foreground/50">v{plugin.version}</span>
|
||||
<span className="text-xs text-muted-foreground/50">{plugin.type}</span>
|
||||
<div className="mt-0.5 flex items-center gap-2">
|
||||
<span className="truncate text-xs text-muted-foreground">{plugin.author}</span>
|
||||
<span className="text-xs text-muted-foreground/70">v{plugin.version}</span>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<div className="flex items-center gap-2 flex-shrink-0">
|
||||
<ToggleSwitch checked={plugin.enabled} onChange={onToggle} disabled={controlsDisabled || isForceEnabled || needsApproval} />
|
||||
<div className="flex flex-shrink-0 items-center gap-2">
|
||||
<ToggleSwitch
|
||||
checked={plugin.enabled}
|
||||
onChange={onToggle}
|
||||
disabled={controlsDisabled || isForceEnabled || denied}
|
||||
ariaLabel={t('toggle_label', { name: plugin.name })}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Expanded Details */}
|
||||
{isExpanded && (
|
||||
<div className="border-t border-border p-3 space-y-3">
|
||||
{isForceEnabled && (
|
||||
<p className="text-xs text-amber-600 dark:text-amber-400">This plugin is forced by an administrator and cannot be disabled.</p>
|
||||
)}
|
||||
<div className="space-y-3 border-t border-border p-3">
|
||||
{isForceEnabled && <p className="text-xs text-amber-600 dark:text-amber-400">{t('forced_note')}</p>}
|
||||
|
||||
{needsApproval && (
|
||||
<p className="text-xs text-orange-600 dark:text-orange-400">This plugin is awaiting admin approval and cannot be enabled until an administrator approves it.</p>
|
||||
)}
|
||||
{plugin.description && <p className="text-xs text-muted-foreground">{plugin.description}</p>}
|
||||
|
||||
{/* Description */}
|
||||
{plugin.description && (
|
||||
<p className="text-xs text-muted-foreground">{plugin.description}</p>
|
||||
)}
|
||||
|
||||
{/* Error */}
|
||||
{plugin.error && (
|
||||
<div className="flex items-start gap-2 p-2 rounded bg-destructive/10 text-destructive text-xs">
|
||||
<AlertTriangle className="w-3.5 h-3.5 flex-shrink-0 mt-0.5" />
|
||||
<span>{plugin.error}</span>
|
||||
{errorText && (
|
||||
<div className="flex items-start gap-2 rounded bg-destructive/10 p-2 text-xs text-destructive">
|
||||
<AlertTriangle className="mt-0.5 h-3.5 w-3.5 flex-shrink-0" />
|
||||
<span className="break-words">{errorText}</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Permissions */}
|
||||
{plugin.permissions.length > 0 && (
|
||||
<div>
|
||||
<span className="text-xs font-medium text-foreground">Permissions:</span>
|
||||
<div className="flex flex-wrap gap-1 mt-1">
|
||||
{plugin.permissions.map(perm => (
|
||||
<span key={perm} className="text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground">
|
||||
{perm}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
<div>
|
||||
<span className="text-xs font-medium text-foreground">
|
||||
{isManaged ? t('permissions_managed') : t('permissions')}
|
||||
</span>
|
||||
<div className="mt-1.5">
|
||||
<PluginPermissionList
|
||||
permissions={plugin.permissions}
|
||||
httpOrigins={plugin.httpOrigins}
|
||||
apiPostPaths={plugin.apiPostPaths}
|
||||
compact
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Settings (auto-generated from schema) */}
|
||||
{plugin.settingsSchema && Object.keys(plugin.settingsSchema).length > 0 && (
|
||||
<div className="space-y-2">
|
||||
<span className="text-xs font-medium text-foreground">Settings:</span>
|
||||
<span className="text-xs font-medium text-foreground">{t('settings')}</span>
|
||||
{Object.entries(plugin.settingsSchema).map(([key, schema]) => (
|
||||
<PluginSettingField
|
||||
key={key}
|
||||
@@ -222,6 +312,15 @@ function PluginCard({ plugin, isExpanded, isForceEnabled, isManaged, needsApprov
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!isManaged && (
|
||||
<div className="flex justify-end">
|
||||
<Button variant="ghost" size="sm" onClick={onRemove} className="text-destructive hover:text-destructive">
|
||||
<Trash2 className="h-4 w-4" />
|
||||
{t('remove')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -237,32 +336,34 @@ interface PluginSettingFieldProps {
|
||||
onChange: (value: unknown) => void;
|
||||
}
|
||||
|
||||
function PluginSettingField({ schema, value, onChange }: PluginSettingFieldProps) {
|
||||
function PluginSettingField({ fieldKey, schema, value, onChange }: PluginSettingFieldProps) {
|
||||
const inputId = `plugin-setting-${fieldKey}`;
|
||||
switch (schema.type) {
|
||||
case 'boolean':
|
||||
return (
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between">
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between gap-3">
|
||||
<div>
|
||||
<span className="text-xs text-foreground">{schema.label}</span>
|
||||
{schema.description && <p className="text-[10px] text-muted-foreground">{schema.description}</p>}
|
||||
</div>
|
||||
<ToggleSwitch checked={value as boolean} onChange={(v) => onChange(v)} />
|
||||
<ToggleSwitch checked={value as boolean} onChange={(v) => onChange(v)} ariaLabel={schema.label} />
|
||||
</div>
|
||||
);
|
||||
|
||||
case 'select':
|
||||
return (
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between">
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between gap-3">
|
||||
<div>
|
||||
<span className="text-xs text-foreground">{schema.label}</span>
|
||||
<label htmlFor={inputId} className="text-xs text-foreground">{schema.label}</label>
|
||||
{schema.description && <p className="text-[10px] text-muted-foreground">{schema.description}</p>}
|
||||
</div>
|
||||
<select
|
||||
id={inputId}
|
||||
value={String(value)}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
className="text-xs bg-background border border-border rounded px-2 py-1 text-foreground"
|
||||
className="rounded border border-border bg-background px-2 py-1 text-xs text-foreground"
|
||||
>
|
||||
{schema.options?.map(opt => (
|
||||
{(Array.isArray(schema.options) ? schema.options : []).map(opt => (
|
||||
<option key={opt} value={opt}>{opt}</option>
|
||||
))}
|
||||
</select>
|
||||
@@ -272,31 +373,33 @@ function PluginSettingField({ schema, value, onChange }: PluginSettingFieldProps
|
||||
case 'string':
|
||||
return (
|
||||
<div data-search-label={schema.label}>
|
||||
<span className="text-xs text-foreground">{schema.label}</span>
|
||||
<label htmlFor={inputId} className="text-xs text-foreground">{schema.label}</label>
|
||||
{schema.description && <p className="text-[10px] text-muted-foreground">{schema.description}</p>}
|
||||
<input
|
||||
id={inputId}
|
||||
type="text"
|
||||
value={String(value ?? '')}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
className="mt-1 w-full text-xs bg-background border border-border rounded px-2 py-1 text-foreground"
|
||||
className="mt-1 w-full rounded border border-border bg-background px-2 py-1 text-xs text-foreground"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
case 'number':
|
||||
return (
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between">
|
||||
<div data-search-label={schema.label} className="flex items-center justify-between gap-3">
|
||||
<div>
|
||||
<span className="text-xs text-foreground">{schema.label}</span>
|
||||
<label htmlFor={inputId} className="text-xs text-foreground">{schema.label}</label>
|
||||
{schema.description && <p className="text-[10px] text-muted-foreground">{schema.description}</p>}
|
||||
</div>
|
||||
<input
|
||||
id={inputId}
|
||||
type="number"
|
||||
value={Number(value ?? schema.default ?? 0)}
|
||||
min={schema.min}
|
||||
max={schema.max}
|
||||
onChange={(e) => onChange(Number(e.target.value))}
|
||||
className="w-20 text-xs bg-background border border-border rounded px-2 py-1 text-foreground"
|
||||
className="w-20 rounded border border-border bg-background px-2 py-1 text-xs text-foreground"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -243,3 +243,94 @@ describe('installPlugin', () => {
|
||||
expect(usePluginStore.getState().plugins[0].locales).toEqual({ de: { hello: 'Hallo' } });
|
||||
});
|
||||
});
|
||||
|
||||
describe('plugins the user installs', () => {
|
||||
const MANIFEST = {
|
||||
id: 'mine', name: 'Mine', version: '1.0.0', author: 'a', description: '', type: 'hook' as const,
|
||||
permissions: [], entrypoint: 'index.js',
|
||||
};
|
||||
|
||||
async function setFeatures(features: Record<string, boolean>) {
|
||||
const { usePolicyStore } = await import('@/stores/policy-store');
|
||||
const { DEFAULT_POLICY } = await import('@/lib/admin/types');
|
||||
usePolicyStore.setState({ policy: { ...DEFAULT_POLICY, features: { ...DEFAULT_POLICY.features, ...features } } });
|
||||
}
|
||||
|
||||
async function mockExtract() {
|
||||
const { extractPlugin } = await import('@/lib/plugin-validator');
|
||||
vi.mocked(extractPlugin).mockResolvedValue({
|
||||
valid: true, errors: [], warnings: [], preview: null, code: 'module.exports = {}', manifest: MANIFEST,
|
||||
});
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
resetStore();
|
||||
localStorage.removeItem('server-managed-plugin-ids');
|
||||
mocks.apiFetch.mockReset();
|
||||
});
|
||||
|
||||
it('refuses an install when the admin turned uploads off', async () => {
|
||||
await setFeatures({ pluginsUploadEnabled: false });
|
||||
await mockExtract();
|
||||
|
||||
const result = await usePluginStore.getState().installPlugin(new File(['x'], 'p.zip'));
|
||||
|
||||
expect(result).toMatchObject({ success: false, reason: 'uploads-disabled' });
|
||||
expect(usePluginStore.getState().plugins).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('refuses a package that reuses the id of an admin plugin', async () => {
|
||||
await setFeatures({ pluginsUploadEnabled: true, requirePluginApproval: false });
|
||||
await mockExtract();
|
||||
usePluginStore.setState({ plugins: [mockPlugin({ id: 'mine', managed: true })] });
|
||||
|
||||
const result = await usePluginStore.getState().installPlugin(new File(['x'], 'p.zip'));
|
||||
|
||||
expect(result).toMatchObject({ success: false, reason: 'managed-id' });
|
||||
expect(usePluginStore.getState().plugins[0].managed).toBe(true);
|
||||
});
|
||||
|
||||
it('sends the package for approval and keeps it off until approved', async () => {
|
||||
await setFeatures({ pluginsUploadEnabled: true, requirePluginApproval: true });
|
||||
await mockExtract();
|
||||
mocks.apiFetch.mockImplementation(async (url: string, init?: RequestInit) => {
|
||||
if (init?.method === 'POST') return new Response(JSON.stringify({ status: 'pending' }));
|
||||
return new Response(JSON.stringify({ status: 'pending' }));
|
||||
});
|
||||
|
||||
const result = await usePluginStore.getState().installPlugin(new File(['x'], 'p.zip'));
|
||||
await usePluginStore.getState().enablePlugin('mine');
|
||||
|
||||
expect(result.approvalStatus).toBe('pending');
|
||||
const posted = mocks.apiFetch.mock.calls.find(([, init]) => (init as RequestInit | undefined)?.method === 'POST');
|
||||
expect((posted?.[1] as RequestInit).body).toBeInstanceOf(FormData);
|
||||
const plugin = usePluginStore.getState().plugins[0];
|
||||
expect(plugin.enabled).toBe(false);
|
||||
expect(plugin.error).toBe('approval-pending');
|
||||
});
|
||||
|
||||
it('turns an approved package on', async () => {
|
||||
await setFeatures({ pluginsUploadEnabled: true, requirePluginApproval: true });
|
||||
await mockExtract();
|
||||
mocks.apiFetch.mockImplementation(async () => new Response(JSON.stringify({ status: 'approved' })));
|
||||
|
||||
await usePluginStore.getState().installPlugin(new File(['x'], 'p.zip'));
|
||||
await usePluginStore.getState().enablePlugin('mine');
|
||||
|
||||
expect(usePluginStore.getState().plugins[0].enabled).toBe(true);
|
||||
});
|
||||
|
||||
it('does not load a user plugin whose approval was revoked', async () => {
|
||||
await setFeatures({ pluginsUploadEnabled: true, requirePluginApproval: true });
|
||||
const { loadPlugin } = await import('@/lib/plugin-loader');
|
||||
vi.mocked(loadPlugin).mockClear();
|
||||
usePluginStore.setState({ plugins: [mockPlugin({ id: 'mine', enabled: true, status: 'enabled', managed: false, approvalHash: 'a'.repeat(64) })] });
|
||||
mocks.apiFetch.mockImplementation(async (url: string) =>
|
||||
url.startsWith('/api/plugins') ? new Response(JSON.stringify({ plugins: [], themes: [] })) : new Response(JSON.stringify({ status: 'denied' })));
|
||||
|
||||
await usePluginStore.getState().initializePlugins();
|
||||
|
||||
expect(loadPlugin).not.toHaveBeenCalled();
|
||||
expect(usePluginStore.getState().plugins[0].error).toBe('approval-denied');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
// admin), 'approved' (admin signed off), 'denied' (admin refused - kept so we
|
||||
// don't keep asking).
|
||||
|
||||
import { readFile, writeFile, rename } from 'node:fs/promises';
|
||||
import { readFile, writeFile, rename, mkdir, unlink } from 'node:fs/promises';
|
||||
import nodePath from 'node:path';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { logger } from '@/lib/logger';
|
||||
import { ensureConfigDir, getConfigPath, assertWritable } from './paths';
|
||||
@@ -43,6 +44,31 @@ interface ApprovalsFile {
|
||||
|
||||
const APPROVALS_FILE = 'plugin-approvals.json';
|
||||
const MAX_ENTRIES = 500; // hard cap so a misbehaving client can't grow the file unboundedly
|
||||
/** Open requests one user may have at a time, so one account can't crowd out the rest. */
|
||||
export const MAX_PENDING_PER_USER = 10;
|
||||
|
||||
/** The package a user asked to have approved, kept so the admin can read the code. */
|
||||
function bundlePath(pluginId: string, bundleHash: string): string {
|
||||
return nodePath.join(getConfigPath('plugin-approvals'), `${pluginId}-${bundleHash}.zip`);
|
||||
}
|
||||
|
||||
export async function saveApprovalBundle(pluginId: string, bundleHash: string, zip: Uint8Array): Promise<void> {
|
||||
assertWritable('plugin-approvals.saveBundle');
|
||||
await mkdir(getConfigPath('plugin-approvals'), { recursive: true });
|
||||
await writeFile(bundlePath(pluginId, bundleHash), zip);
|
||||
}
|
||||
|
||||
export async function readApprovalBundle(pluginId: string, bundleHash: string): Promise<Uint8Array | null> {
|
||||
try {
|
||||
return new Uint8Array(await readFile(bundlePath(pluginId, bundleHash)));
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteApprovalBundle(pluginId: string, bundleHash: string): Promise<void> {
|
||||
try { await unlink(bundlePath(pluginId, bundleHash)); } catch { /* none */ }
|
||||
}
|
||||
|
||||
let cached: ApprovalsFile | null = null;
|
||||
let loadPromise: Promise<void> | null = null;
|
||||
@@ -122,12 +148,20 @@ export async function requestApproval(
|
||||
const file = cached!;
|
||||
const existing = findEntry(file, pluginId, bundleHash);
|
||||
if (existing) return existing;
|
||||
const pendingByUser = file.entries.filter(e => e.status === 'pending' && e.requestedBy === requestedBy).length;
|
||||
if (pendingByUser >= MAX_PENDING_PER_USER) {
|
||||
throw new ApprovalLimitError(`You already have ${MAX_PENDING_PER_USER} plugins waiting for approval`);
|
||||
}
|
||||
if (file.entries.length >= MAX_ENTRIES) {
|
||||
// Drop the oldest pending entry so a new request can land. Approved/denied
|
||||
// entries are preserved.
|
||||
const oldestPendingIdx = file.entries.findIndex(e => e.status === 'pending');
|
||||
if (oldestPendingIdx >= 0) file.entries.splice(oldestPendingIdx, 1);
|
||||
else throw new Error('plugin-approvals file is full');
|
||||
if (oldestPendingIdx >= 0) {
|
||||
const [dropped] = file.entries.splice(oldestPendingIdx, 1);
|
||||
await deleteApprovalBundle(dropped.pluginId, dropped.bundleHash);
|
||||
} else {
|
||||
throw new ApprovalLimitError('The approval queue is full; ask an administrator to clear old requests');
|
||||
}
|
||||
}
|
||||
const entry: ApprovalEntry = {
|
||||
pluginId,
|
||||
@@ -166,4 +200,7 @@ export async function revokeApproval(pluginId: string, bundleHash: string): Prom
|
||||
if (idx < 0) return;
|
||||
file.entries.splice(idx, 1);
|
||||
await flushToDisk();
|
||||
await deleteApprovalBundle(pluginId, bundleHash);
|
||||
}
|
||||
|
||||
export class ApprovalLimitError extends Error {}
|
||||
|
||||
@@ -141,6 +141,10 @@ export interface SettingsPolicy {
|
||||
/** Plugin IDs that are force-enabled (users cannot disable) */
|
||||
forceEnabledPlugins: string[];
|
||||
/** Plugin IDs that have been approved by admin (users can enable) */
|
||||
/**
|
||||
* @deprecated Never had a writer, and approving an id approved any code
|
||||
* under it. Approvals are per package now (lib/admin/plugin-approvals.ts).
|
||||
*/
|
||||
approvedPlugins: string[];
|
||||
/** Theme IDs that are force-enabled (users cannot deactivate) */
|
||||
forceEnabledThemes: string[];
|
||||
|
||||
@@ -479,6 +479,29 @@ export function suspiciousCode(code: string): string[] {
|
||||
return SUSPICIOUS_JS_PATTERNS.filter(({ pattern }) => pattern.test(code)).map(({ label }) => label);
|
||||
}
|
||||
|
||||
function canonicalJson(value: unknown): string {
|
||||
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;
|
||||
if (value && typeof value === 'object') {
|
||||
const entries = Object.entries(value as Record<string, unknown>)
|
||||
.filter(([, v]) => v !== undefined)
|
||||
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
||||
return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
|
||||
}
|
||||
return JSON.stringify(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* SHA-256 over the validated manifest and the code. An admin approval is
|
||||
* pinned to this, so re-zipping the same code with more permissions or
|
||||
* other origins needs a new approval. Same result in the browser and on
|
||||
* the server.
|
||||
*/
|
||||
export async function packageHash(manifest: ValidatedPluginManifest, code: string): Promise<string> {
|
||||
const data = new TextEncoder().encode(`${canonicalJson(manifest)}\n${code}`);
|
||||
const digest = await crypto.subtle.digest('SHA-256', data);
|
||||
return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
|
||||
export interface PluginPackage {
|
||||
manifest: ValidatedPluginManifest;
|
||||
code: string;
|
||||
|
||||
@@ -12,6 +12,9 @@ export interface ConsentRequest {
|
||||
pluginId: string;
|
||||
pluginName: string;
|
||||
permissions: Permission[];
|
||||
/** Where the plugin may send data, shown under http:fetch / http:post. */
|
||||
httpOrigins?: string[];
|
||||
apiPostPaths?: string[];
|
||||
resolve: (granted: boolean) => void;
|
||||
}
|
||||
|
||||
@@ -28,9 +31,14 @@ function uid(): string {
|
||||
return Math.random().toString(36).slice(2) + Date.now().toString(36);
|
||||
}
|
||||
|
||||
export function requestConsent(pluginId: string, pluginName: string, permissions: Permission[]): Promise<boolean> {
|
||||
export function requestConsent(
|
||||
pluginId: string,
|
||||
pluginName: string,
|
||||
permissions: Permission[],
|
||||
targets: { httpOrigins?: string[]; apiPostPaths?: string[] } = {},
|
||||
): Promise<boolean> {
|
||||
return new Promise<boolean>((resolve) => {
|
||||
queue.push({ id: uid(), pluginId, pluginName, permissions, resolve });
|
||||
queue.push({ id: uid(), pluginId, pluginName, permissions, ...targets, resolve });
|
||||
notify();
|
||||
});
|
||||
}
|
||||
@@ -50,47 +58,3 @@ export function subscribe(listener: () => void): () => void {
|
||||
listeners.add(listener);
|
||||
return () => { listeners.delete(listener); };
|
||||
}
|
||||
|
||||
// ─── Friendly labels for permission strings ───────────────────
|
||||
|
||||
const PERMISSION_LABELS: Record<string, { title: string; body: string }> = {
|
||||
'email:read': { title: 'Read your email', body: 'Access subjects, senders, recipients, body previews, and message bodies of your messages.' },
|
||||
'email:write': { title: 'Modify your email', body: 'Move, delete, flag, archive, or change keywords on your messages.' },
|
||||
'email:send': { title: 'Send mail and transform drafts', body: 'Compose and send messages, and modify content right before delivery.' },
|
||||
'crypto:full': { title: 'Full cryptographic access (high risk)', body: 'Runs with full cryptographic access in a privileged, same-origin context. It can read your message bodies and private keys, store key material, and sign/encrypt on your behalf. Only enable plugins you fully trust — this is comparable to a full-access browser extension.' },
|
||||
'email:raw-send': { title: 'Send raw messages', body: 'Submit fully-formed (e.g. signed or encrypted) messages on your behalf.' },
|
||||
'email:blob-read': { title: 'Read raw message content', body: 'Fetch the raw bytes of your messages and attachments (needed to decrypt and verify them). This also lets the plugin read the full contents of every file you attach to a message, before it is sent.' },
|
||||
'email:blob-write': { title: 'Replace raw message content', body: 'Replace the contents of a file you attached, after you attached it and before it is sent to the server (needed to encrypt attachments).' },
|
||||
'email:render-takeover': { title: 'Replace rendered email content', body: 'Replace the displayed content of an opened message (e.g. to show decrypted text and a signature-verification badge).' },
|
||||
'calendar:read': { title: 'Read your calendar', body: 'Access events, calendars, RSVPs, and reminders.' },
|
||||
'calendar:write': { title: 'Modify your calendar', body: 'Create, edit, or delete events.' },
|
||||
'contacts:read': { title: 'Read your contacts', body: 'Access your address book entries.' },
|
||||
'contacts:write': { title: 'Modify your contacts', body: 'Create, edit, or delete contact entries.' },
|
||||
'files:read': { title: 'Read your files', body: 'Browse files stored in your WebDAV folders.' },
|
||||
'files:write': { title: 'Modify your files', body: 'Create, edit, rename, move, or delete files.' },
|
||||
'identity:read': { title: 'Read your identities', body: 'Access the From addresses and signatures you send mail from.' },
|
||||
'identity:write': { title: 'Modify your identities', body: 'Create, edit, or delete identities.' },
|
||||
'filters:read': { title: 'Read your filters', body: 'Access your Sieve mail-filter rules.' },
|
||||
'filters:write': { title: 'Modify your filters', body: 'Create, edit, or delete Sieve filter rules.' },
|
||||
'tasks:read': { title: 'Read your tasks', body: 'Access your task list.' },
|
||||
'tasks:write': { title: 'Modify your tasks', body: 'Create, edit, or delete tasks.' },
|
||||
'templates:read': { title: 'Read your templates', body: 'Access stored mail templates.' },
|
||||
'templates:write': { title: 'Modify your templates', body: 'Create, edit, or delete mail templates.' },
|
||||
'smime:read': { title: 'Read your S/MIME state', body: 'Access information about installed S/MIME keys and certificates.' },
|
||||
'vacation:read': { title: 'Read your vacation auto-reply', body: 'See the configured vacation auto-reply state.' },
|
||||
'vacation:write': { title: 'Modify your vacation auto-reply',body: 'Create, change, or remove the vacation auto-reply.' },
|
||||
'settings:read': { title: 'Read your settings', body: 'Access non-secret user preferences.' },
|
||||
'settings:write': { title: 'Modify your settings', body: 'Change non-secret user preferences.' },
|
||||
'security:read': { title: 'Read account security state', body: 'See whether TOTP / encryption are enabled (no secrets exposed).' },
|
||||
'auth:observe': { title: 'Observe login events', body: 'See when you log in, log out, or switch accounts.' },
|
||||
'auth:emit': { title: 'Emit login events', body: 'Emit auth events such as logout.' },
|
||||
'http:post': { title: 'Call same-origin APIs', body: 'Make authenticated requests to the webmail backend on your behalf.' },
|
||||
'http:fetch': { title: 'Talk to external services', body: 'Make uncredentialled requests to the third-party origins listed in the manifest.' },
|
||||
'admin:config': { title: 'Read/write admin config', body: 'Access this plugin\'s admin-supplied configuration values.' },
|
||||
'ui:download-file': { title: 'Download files', body: 'Download custom files generated by the plugin.' },
|
||||
'account:read': { title: 'Read your accounts', body: 'Access the list of accounts you have configured in the app.' },
|
||||
};
|
||||
|
||||
export function describePermission(perm: string): { title: string; body: string } {
|
||||
return PERMISSION_LABELS[perm] ?? { title: perm, body: 'No description available.' };
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// How permissions are shown to people: the consent dialog and the plugin list
|
||||
// in Settings. The text itself lives in the locale files under
|
||||
// `plugins.permissions.<key>.{title,body}`.
|
||||
|
||||
import { ALL_PERMISSIONS, IMPLICIT_PERMISSIONS } from '../plugin-types';
|
||||
|
||||
/**
|
||||
* Permissions that let a plugin read or send mail content, change what is
|
||||
* sent or shown, run with full access, or move data off the device. The
|
||||
* consent dialog lists them first and marks them.
|
||||
*/
|
||||
export const HIGH_RISK_PERMISSIONS: ReadonlySet<string> = new Set([
|
||||
'crypto:full',
|
||||
'email:send',
|
||||
'email:raw-send',
|
||||
'email:blob-read',
|
||||
'email:blob-write',
|
||||
'email:render-takeover',
|
||||
'http:fetch',
|
||||
'http:post',
|
||||
'filters:write',
|
||||
]);
|
||||
|
||||
/** Locale key segment for a permission: `email:read` → `email_read`. */
|
||||
export function permissionKey(perm: string): string {
|
||||
return perm.replace(/[:-]/g, '_');
|
||||
}
|
||||
|
||||
/** Permissions worth showing: known, not implicit, high-risk first. */
|
||||
export function visiblePermissions(perms: readonly string[]): string[] {
|
||||
const known = new Set<string>(ALL_PERMISSIONS);
|
||||
const implicit = new Set<string>(IMPLICIT_PERMISSIONS);
|
||||
return [...new Set(perms)]
|
||||
.filter((p) => known.has(p) && !implicit.has(p))
|
||||
.sort((a, b) => Number(HIGH_RISK_PERMISSIONS.has(b)) - Number(HIGH_RISK_PERMISSIONS.has(a)));
|
||||
}
|
||||
@@ -270,6 +270,15 @@ export interface InstalledPlugin {
|
||||
* skip the consent prompt (admin pre-approval).
|
||||
*/
|
||||
grantedPermissions?: string[];
|
||||
/**
|
||||
* For plugins the user installed: the validated manifest, kept so the
|
||||
* package can be rebuilt for an approval request, and the hash an admin
|
||||
* approval is pinned to (see packageHash in lib/extension-package.ts).
|
||||
*/
|
||||
packageManifest?: Record<string, unknown>;
|
||||
approvalHash?: string;
|
||||
/** Last answer from the server about this package's approval. */
|
||||
approvalStatus?: 'pending' | 'approved' | 'denied' | 'not-requested';
|
||||
}
|
||||
|
||||
// ─── UI Slots ────────────────────────────────────────────────
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "فشل التفويض: {error}",
|
||||
"missing_params": "رمز التفويض أو الحالة مفقود.",
|
||||
"delivery_failed": "تعذّر إرسال نتيجة التفويض إلى تبويب التطبيق. يرجى إغلاق هذه النافذة والمحاولة مرة أخرى."
|
||||
},
|
||||
"settings": {
|
||||
"title": "الإضافات",
|
||||
"description": "إضافات أضافها المسؤول. فعّلها أو أوقفها لحسابك.",
|
||||
"description_uploads": "تضيف الإضافات ميزات إلى تطبيق البريد. فعّلها أو أوقفها لحسابك، أو ثبّت إضافاتك الخاصة.",
|
||||
"description_demo": "الإضافات غير متاحة في الوضع التجريبي.",
|
||||
"install_button": "تثبيت إضافة",
|
||||
"install_hint": "اختر ملف ZIP لإضافة.",
|
||||
"install_hint_approval": "اختر ملف ZIP لإضافة. يجب أن يوافق عليها المسؤول قبل أن تتمكن من تفعيلها.",
|
||||
"install_uploads_off": "لا يسمح المسؤول بتثبيت الإضافات.",
|
||||
"install_managed_id": "يوفّر المسؤول بالفعل إضافة بهذا الاسم، لذا لا يمكن استبدالها.",
|
||||
"install_invalid": "هذا الملف ليس إضافة قابلة للتثبيت: {details}",
|
||||
"toast_installed": "تم تثبيت الإضافة. فعّلها أدناه.",
|
||||
"toast_installed_pending": "تم تثبيت الإضافة وإرسالها إلى المسؤول للموافقة عليها.",
|
||||
"toast_enabled": "تم تفعيل {name}",
|
||||
"toast_disabled": "تم إيقاف {name}",
|
||||
"toast_removed": "تمت إزالة {name}",
|
||||
"toast_forced": "يُبقي المسؤول {name} مفعّلة",
|
||||
"toast_approval_requested": "{name} بانتظار موافقة المسؤول",
|
||||
"empty_title": "لا توجد إضافات بعد",
|
||||
"empty_admin": "لم يُضف المسؤول أي إضافات.",
|
||||
"empty_uploads": "ثبّت إضافة من ملف ZIP للبدء.",
|
||||
"empty_demo": "تحتاج الإضافات إلى حساب حقيقي، لذا لا يتضمن الوضع التجريبي أيًّا منها.",
|
||||
"syncing": "جارٍ التحقق من الإضافات مع الخادم…",
|
||||
"status_installed": "متوقفة",
|
||||
"status_enabled": "جارٍ التشغيل",
|
||||
"status_running": "مفعّلة",
|
||||
"status_disabled": "متوقفة",
|
||||
"status_error": "مشكلة",
|
||||
"badge_forced": "مطلوبة",
|
||||
"badge_managed": "من المسؤول",
|
||||
"badge_yours": "ثبّتها أنت",
|
||||
"badge_awaiting": "بانتظار الموافقة",
|
||||
"toggle_label": "تفعيل {name} أو إيقافها",
|
||||
"forced_note": "يشترط المسؤول هذه الإضافة، لذا لا يمكن إيقافها.",
|
||||
"permissions": "ما يمكنها فعله",
|
||||
"permissions_managed": "ما يمكنها فعله (بموافقة المسؤول)",
|
||||
"settings": "الإعدادات",
|
||||
"remove": "إزالة",
|
||||
"remove_title": "إزالة {name}؟",
|
||||
"remove_message": "ستُحذف الإضافة وكل ما خزّنته في هذا المتصفح. يمكنك تثبيتها مرة أخرى لاحقًا.",
|
||||
"remove_confirm": "إزالة",
|
||||
"error_user_plugins_off": "أوقف المسؤول الإضافات التي يثبّتها المستخدمون، لذا لا تعمل هذه الإضافة.",
|
||||
"error_approval_unavailable": "ثُبّتت هذه الإضافة قبل أن تصبح الموافقة مطلوبة. أزلها وثبّتها مرة أخرى لإرسالها للموافقة.",
|
||||
"error_approval_denied": "لم يوافق المسؤول على هذه الإضافة.",
|
||||
"error_approval_pending": "بانتظار موافقة المسؤول على هذه الإضافة."
|
||||
},
|
||||
"consent": {
|
||||
"title": "هل تسمح لـ {name} بذلك؟",
|
||||
"intro": "تطلب الإضافة الأذونات أدناه. لن تحصل عليها إلا إذا سمحت بذلك.",
|
||||
"high_risk_note": "العناصر المميّزة تمنح الإضافة وصولًا إلى محتوى بريدك أو تتيح لها إرسال البيانات إلى جهات أخرى. لا تسمح بها إلا للإضافات التي تثق بها.",
|
||||
"revoke_hint": "يمكنك إيقاف الإضافة أو إزالتها من الإعدادات في أي وقت.",
|
||||
"deny": "عدم السماح",
|
||||
"allow": "سماح"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "لا تحتاج إلى أذونات خاصة.",
|
||||
"high_risk": "تتطلب الحذر",
|
||||
"email_read": {
|
||||
"title": "قراءة بريدك",
|
||||
"body": "عرض المرسلين والمستلمين والمواضيع والنص الكامل للرسائل التي تفتحها ولقائمة الرسائل."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "تغيير الوسوم والعلامات على بريدك",
|
||||
"body": "إضافة الوسوم والعلامات والكلمات المفتاحية الأخرى إلى رسائلك أو إزالتها."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "تغيير البريد قبل إرساله",
|
||||
"body": "قراءة وتغيير المستلمين والموضوع والنص والمرفقات في الرسائل التي تكتبها، ومنع إرسال رسالة."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "وصول كامل إلى هذا التطبيق",
|
||||
"body": "تعمل بالصلاحيات نفسها التي يملكها تطبيق البريد. يمكنها قراءة كل بريدك ومفاتيحك المخزّنة والتصرف نيابةً عنك. لا تسمح بذلك إلا للإضافات التي تثق بها تمامًا."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "إرسال رسائل أنشأتها بنفسها",
|
||||
"body": "إرسال رسائل كاملة من حسابك، مثل الرسائل الموقّعة أو المشفّرة."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "قراءة المحتوى الخام للرسائل",
|
||||
"body": "قراءة البيانات الأصلية لرسائلك ومرفقاتها، ولكل ملف ترفقه قبل إرساله."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "استبدال المرفقات قبل الإرسال",
|
||||
"body": "رفع ملفات إلى خادم البريد واستبدال ملف أرفقته بملف آخر قبل إرسال الرسالة."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "تغيير طريقة عرض الرسائل",
|
||||
"body": "استبدال نص الرسائل التي تفتحها ونص قائمة الرسائل، مثلًا لعرض محتوى مفكوك التشفير."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "قراءة تقويمك",
|
||||
"body": "عرض تقويماتك وأحداثها."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "تغيير تقويمك",
|
||||
"body": "إنشاء الأحداث وتغييرها وحذفها."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "قراءة جهات اتصالك",
|
||||
"body": "البحث في دفاتر العناوين وقراءتها."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "تغيير جهات اتصالك",
|
||||
"body": "إنشاء جهات الاتصال ودفاتر العناوين وتغييرها وحذفها."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "قراءة ملفاتك",
|
||||
"body": "تصفّح الملفات المخزّنة في حسابك وفتحها."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "تغيير ملفاتك",
|
||||
"body": "رفع الملفات في حسابك وإعادة تسميتها ونقلها وحذفها."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "عرض عناوين المرسل",
|
||||
"body": "عرض العناوين التي ترسل منها وتوقيعاتها."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "تغيير عناوين المرسل",
|
||||
"body": "إنشاء عناوين المرسل والتوقيعات وتغييرها وحذفها."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "قراءة مرشحات البريد",
|
||||
"body": "عرض القواعد التي تفرز بريدك الوارد."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "تغيير مرشحات البريد",
|
||||
"body": "إضافة قواعد إلى المرشحات على الخادم. يمكن لهذه القواعد نقل البريد الوارد أو إعادة توجيهه أو حذفه."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "قراءة مهامك",
|
||||
"body": "عرض قوائم المهام والمهام."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "تغيير مهامك",
|
||||
"body": "إنشاء المهام وتغييرها وإكمالها وحذفها."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "قراءة قوالبك",
|
||||
"body": "عرض قوالب الرسائل المحفوظة."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "تغيير قوالبك",
|
||||
"body": "إنشاء قوالب الرسائل وتغييرها وحذفها."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "عرض حالة S/MIME",
|
||||
"body": "معرفة ما إذا كانت لديك مفاتيح وشهادات S/MIME، دون الوصول إلى المفاتيح."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "عرض الرد التلقائي أثناء الغياب",
|
||||
"body": "معرفة ما إذا كان الرد التلقائي مفعّلًا وما يقوله."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "تغيير الرد التلقائي أثناء الغياب",
|
||||
"body": "تفعيل الرد التلقائي أو إيقافه وتغيير نصه وتواريخه."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "قراءة إعداداتك",
|
||||
"body": "عرض تفضيلاتك وتعريفات الوسوم."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "تغيير إعداداتك",
|
||||
"body": "إضافة الوسوم وإعادة ترتيبها وتغيير تفضيلاتك."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "عرض أمان حسابك",
|
||||
"body": "معرفة ما إذا كانت المصادقة الثنائية والتشفير مفعّلين، دون الوصول إلى البيانات السرية."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "معرفة وقت تسجيل دخولك",
|
||||
"body": "تلقّي إشعار عند تسجيل دخولك أو تبديل الحسابات أو تجديد جلستك."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "تسجيل خروجك",
|
||||
"body": "تسجيل خروجك من تطبيق البريد."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "عرض حساباتك",
|
||||
"body": "عرض الحسابات التي أضفتها، مع عناوينها وخوادمها."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "استخدام خادم البريد نيابةً عنك",
|
||||
"body": "استدعاء نقاط النهاية هذه على الخادم ببيانات دخولك:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "الاتصال بمواقع أخرى",
|
||||
"body": "إرسال طلبات إلى هذه المواقع. قد يُرسل إليها أي شيء تستطيع الإضافة قراءته:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "قراءة إعداداتها من المسؤول",
|
||||
"body": "قراءة الإعدادات التي حفظها المسؤول لهذه الإضافة."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "تتبّع موقعك في التطبيق",
|
||||
"body": "معرفة الصفحة المفتوحة والتفاعل مع الروابط التي تنقر عليها."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "إضافة أزرار إلى شريط أدوات الرسالة",
|
||||
"body": "عرض أزرارها الخاصة فوق الرسالة المفتوحة."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "عرض شريط في الأعلى",
|
||||
"body": "عرض إشعار على امتداد أعلى التطبيق."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "عرض إشعارات على الرسائل",
|
||||
"body": "عرض إشعار فوق نص الرسالة المفتوحة."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "إضافة محتوى أسفل الرسائل",
|
||||
"body": "عرض محتواها الخاص أسفل الرسالة المفتوحة."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "عرض مفاتيح تشفير جهات الاتصال",
|
||||
"body": "عرض مفاتيح التشفير لجهة اتصال وإدارتها."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "إضافة لوحات إلى تفاصيل الرسالة",
|
||||
"body": "عرض لوحتها الخاصة بجانب الرسالة المفتوحة أو أسفلها."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "حفظ الملفات على جهازك",
|
||||
"body": "إتاحة ملفات أنشأتها للتنزيل."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "إضافة علامات تبويب إلى البريد الوارد",
|
||||
"body": "فرز البريد الوارد في علامات تبويب مثل التحديثات أو العروض الترويجية."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "إضافة أزرار إلى محرر الرسائل",
|
||||
"body": "عرض أزرارها الخاصة أثناء كتابة رسالة."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "إضافة لوحة إلى محرر الرسائل",
|
||||
"body": "عرض لوحتها الخاصة بجانب الرسالة التي تكتبها."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "إضافة مربع إلى الشريط الجانبي",
|
||||
"body": "عرض محتواها الخاص في الشريط الجانبي للبريد."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "إضافة صفحة إعدادات",
|
||||
"body": "عرض صفحتها الخاصة في الإعدادات."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "الإضافة إلى قائمة الرسالة",
|
||||
"body": "إضافة عناصر إلى القائمة التي تظهر عند النقر بالزر الأيمن على رسالة."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "الإضافة إلى شريط التنقل",
|
||||
"body": "عرض زرها الخاص في شريط التنقل."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "إضافة اختصارات لوحة المفاتيح",
|
||||
"body": "الاستجابة لاختصارات لوحة المفاتيح التي تحددها."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "إضافة أزرار إلى الأحداث",
|
||||
"body": "عرض أزرارها الخاصة عند إنشاء حدث أو تحريره."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "إضافة صفحة إدارة",
|
||||
"body": "عرض صفحتها الخاصة في إعدادات الإدارة."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "معرفة وقت بدء التطبيق وتوقفه",
|
||||
"body": "تلقّي إشعار عند بدء التطبيق أو انقطاع اتصاله أو تسجيل خروجك."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Ha fallat lautorització: {error}",
|
||||
"missing_params": "Falta el codi dautorització o lestat.",
|
||||
"delivery_failed": "No sha pogut lliurar el resultat de lautorització a la pestanya de laplicació. Tanqueu aquesta finestra i torneu-ho a provar."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Connectors",
|
||||
"description": "Connectors que ha afegit l'administrador. Activeu-los o desactiveu-los per al vostre compte.",
|
||||
"description_uploads": "Els connectors afegeixen funcions al webmail. Activeu-los o desactiveu-los per al vostre compte, o instal·leu-ne de propis.",
|
||||
"description_demo": "Els connectors no estan disponibles a la demo.",
|
||||
"install_button": "Instal·la un connector",
|
||||
"install_hint": "Trieu un fitxer ZIP de connector.",
|
||||
"install_hint_approval": "Trieu un fitxer ZIP de connector. Un administrador l'ha d'aprovar abans que el pugueu activar.",
|
||||
"install_uploads_off": "L'administrador no permet instal·lar connectors.",
|
||||
"install_managed_id": "L'administrador ja proporciona un connector amb aquest nom, així que no es pot substituir.",
|
||||
"install_invalid": "Aquest fitxer no és un connector que es pugui instal·lar: {details}",
|
||||
"toast_installed": "S'ha instal·lat el connector. Activeu-lo a continuació.",
|
||||
"toast_installed_pending": "S'ha instal·lat el connector i s'ha enviat a l'administrador perquè l'aprovi.",
|
||||
"toast_enabled": "{name} està activat",
|
||||
"toast_disabled": "{name} està desactivat",
|
||||
"toast_removed": "S'ha eliminat {name}",
|
||||
"toast_forced": "L'administrador manté {name} activat",
|
||||
"toast_approval_requested": "{name} està pendent de l'aprovació de l'administrador",
|
||||
"empty_title": "Encara no hi ha connectors",
|
||||
"empty_admin": "L'administrador no ha afegit cap connector.",
|
||||
"empty_uploads": "Per començar, instal·leu un connector des d'un fitxer ZIP.",
|
||||
"empty_demo": "Els connectors necessiten un compte real, així que la demo no en té cap.",
|
||||
"syncing": "S'estan comprovant els connectors amb el servidor…",
|
||||
"status_installed": "Desactivat",
|
||||
"status_enabled": "S'està iniciant",
|
||||
"status_running": "Activat",
|
||||
"status_disabled": "Desactivat",
|
||||
"status_error": "Problema",
|
||||
"badge_forced": "Obligatori",
|
||||
"badge_managed": "De l'administrador",
|
||||
"badge_yours": "Instal·lat per vós",
|
||||
"badge_awaiting": "Pendent d'aprovació",
|
||||
"toggle_label": "Activa o desactiva {name}",
|
||||
"forced_note": "L'administrador requereix aquest connector, així que no es pot desactivar.",
|
||||
"permissions": "Què pot fer",
|
||||
"permissions_managed": "Què pot fer (aprovat per l'administrador)",
|
||||
"settings": "Configuració",
|
||||
"remove": "Elimina",
|
||||
"remove_title": "Voleu eliminar {name}?",
|
||||
"remove_message": "S'eliminaran el connector i tot el que ha desat en aquest navegador. El podeu tornar a instal·lar més endavant.",
|
||||
"remove_confirm": "Elimina",
|
||||
"error_user_plugins_off": "L'administrador ha desactivat els connectors instal·lats pels usuaris, així que aquest connector no s'executa.",
|
||||
"error_approval_unavailable": "Aquest connector es va instal·lar abans que calgués l'aprovació. Elimineu-lo i torneu-lo a instal·lar per enviar-lo a aprovar.",
|
||||
"error_approval_denied": "L'administrador no ha aprovat aquest connector.",
|
||||
"error_approval_pending": "S'espera que l'administrador aprovi aquest connector."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Voleu permetre que {name} faci això?",
|
||||
"intro": "El connector demana els permisos següents. Només els obté si ho permeteu.",
|
||||
"high_risk_note": "Els elements marcats donen al connector accés al contingut del vostre correu o li permeten enviar dades a altres llocs. Permeteu-los només als connectors de confiança.",
|
||||
"revoke_hint": "Podeu desactivar o eliminar el connector a Configuració en qualsevol moment.",
|
||||
"deny": "No ho permetis",
|
||||
"allow": "Permet"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "No necessita cap permís especial.",
|
||||
"high_risk": "Cal anar amb compte",
|
||||
"email_read": {
|
||||
"title": "Llegir el vostre correu",
|
||||
"body": "Veure remitents, destinataris, assumptes i el text complet dels missatges que obriu i de la llista de missatges."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Canviar les etiquetes i marques del correu",
|
||||
"body": "Afegir o treure etiquetes, marques i altres paraules clau dels vostres missatges."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Canviar el correu abans d'enviar-lo",
|
||||
"body": "Llegir i canviar els destinataris, l'assumpte, el text i els adjunts dels missatges que escriviu, i impedir que s'enviï un missatge."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Accés complet a aquesta aplicació",
|
||||
"body": "S'executa amb els mateixos drets que el mateix webmail. Pot llegir tot el vostre correu i les claus desades i actuar en nom vostre. Permeteu-ho només als connectors en què confieu plenament."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Enviar missatges que ha creat ell mateix",
|
||||
"body": "Enviar missatges complets, per exemple signats o xifrats, des del vostre compte."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Llegir el contingut original dels missatges",
|
||||
"body": "Llegir les dades originals dels vostres missatges i adjunts, i de cada fitxer que adjunteu abans d'enviar-lo."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Substituir adjunts abans d'enviar",
|
||||
"body": "Pujar fitxers al vostre servidor de correu i substituir un fitxer adjunt per un altre abans que s'enviï el missatge."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Canviar com es mostren els missatges",
|
||||
"body": "Substituir el text dels missatges que obriu i de la llista de missatges, per exemple per mostrar contingut desxifrat."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Llegir el vostre calendari",
|
||||
"body": "Veure els vostres calendaris i els seus esdeveniments."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Canviar el vostre calendari",
|
||||
"body": "Crear, canviar i suprimir esdeveniments."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Llegir els vostres contactes",
|
||||
"body": "Cercar i llegir les vostres llibretes d'adreces."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Canviar els vostres contactes",
|
||||
"body": "Crear, canviar i suprimir contactes i llibretes d'adreces."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Llegir els vostres fitxers",
|
||||
"body": "Navegar pels fitxers desats al vostre compte i obrir-los."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Canviar els vostres fitxers",
|
||||
"body": "Pujar, canviar el nom, moure i suprimir fitxers del vostre compte."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Veure les vostres identitats d'enviament",
|
||||
"body": "Veure les adreces des de les quals envieu i les seves signatures."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Canviar les vostres identitats d'enviament",
|
||||
"body": "Crear, canviar i suprimir identitats d'enviament i signatures."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Llegir els vostres filtres de correu",
|
||||
"body": "Veure les regles que classifiquen el correu entrant."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Canviar els vostres filtres de correu",
|
||||
"body": "Afegir regles als filtres del servidor. Aquestes regles poden moure, reenviar o suprimir el correu entrant."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Llegir les vostres tasques",
|
||||
"body": "Veure les vostres llistes de tasques i les tasques."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Canviar les vostres tasques",
|
||||
"body": "Crear, canviar, completar i suprimir tasques."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Llegir les vostres plantilles",
|
||||
"body": "Veure les plantilles de missatge desades."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Canviar les vostres plantilles",
|
||||
"body": "Crear, canviar i suprimir plantilles de missatge."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Veure l'estat de S/MIME",
|
||||
"body": "Veure si teniu claus i certificats S/MIME, sense accés a les claus."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Veure la resposta automàtica",
|
||||
"body": "Veure si la resposta automàtica està activada i què diu."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Canviar la resposta automàtica",
|
||||
"body": "Activar o desactivar la resposta automàtica i canviar-ne el text i les dates."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Llegir la vostra configuració",
|
||||
"body": "Veure les vostres preferències i les definicions d'etiquetes."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Canviar la vostra configuració",
|
||||
"body": "Afegir i reordenar etiquetes i canviar les vostres preferències."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Veure la seguretat del compte",
|
||||
"body": "Veure si l'autenticació de dos factors i el xifratge estan activats, sense accés als secrets."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Saber quan inicieu la sessió",
|
||||
"body": "Rebre un avís quan inicieu la sessió, canvieu de compte o es renova la sessió."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Tancar la vostra sessió",
|
||||
"body": "Tancar la vostra sessió al webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Veure els vostres comptes",
|
||||
"body": "Veure els comptes que heu afegit, amb les seves adreces i servidors."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Fer servir el servidor del webmail en nom vostre",
|
||||
"body": "Cridar aquests punts d'accés del servidor amb el vostre inici de sessió:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Connectar-se a altres llocs web",
|
||||
"body": "Enviar peticions a aquests llocs. Qualsevol cosa que el connector pugui llegir s'hi pot enviar:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Llegir la configuració que li ha posat l'administrador",
|
||||
"body": "Llegir la configuració que l'administrador ha desat per a aquest connector."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Seguir on sou dins l'aplicació",
|
||||
"body": "Saber quina pàgina està oberta i reaccionar als enllaços en què feu clic."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Afegir botons a la barra d'eines del missatge",
|
||||
"body": "Mostrar botons propis a sobre d'un missatge obert."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Mostrar un bàner a dalt",
|
||||
"body": "Mostrar un avís a la part superior de l'aplicació."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Mostrar avisos als missatges",
|
||||
"body": "Mostrar un avís a sobre del text d'un missatge obert."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Afegir contingut sota els missatges",
|
||||
"body": "Mostrar contingut propi a sota d'un missatge obert."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Mostrar les claus de xifratge dels contactes",
|
||||
"body": "Mostrar i gestionar les claus de xifratge d'un contacte."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Afegir panells als detalls del missatge",
|
||||
"body": "Mostrar un panell propi al costat o a sota d'un missatge obert."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Desar fitxers al dispositiu",
|
||||
"body": "Oferir per baixar fitxers que ha creat."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Afegir pestanyes a la safata d'entrada",
|
||||
"body": "Classificar la safata d'entrada en pestanyes com ara Actualitzacions o Promocions."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Afegir botons al redactor",
|
||||
"body": "Mostrar botons propis mentre escriviu un missatge."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Afegir un panell al redactor",
|
||||
"body": "Mostrar un panell propi al costat del missatge que escriviu."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Afegir un quadre a la barra lateral",
|
||||
"body": "Mostrar contingut propi a la barra lateral del correu."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Afegir una pàgina de configuració",
|
||||
"body": "Mostrar una pàgina pròpia a Configuració."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Afegir elements al menú del missatge",
|
||||
"body": "Afegir elements al menú que s'obre quan feu clic amb el botó dret en un missatge."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Afegir elements a la barra de navegació",
|
||||
"body": "Mostrar un botó propi a la barra de navegació."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Afegir dreceres de teclat",
|
||||
"body": "Reaccionar a les dreceres de teclat que defineix."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Afegir botons als esdeveniments",
|
||||
"body": "Mostrar botons propis quan creeu o editeu un esdeveniment."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Afegir una pàgina d'administració",
|
||||
"body": "Mostrar una pàgina pròpia a la configuració d'administració."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Saber quan l'aplicació s'inicia i s'atura",
|
||||
"body": "Rebre un avís quan l'aplicació s'inicia, es queda sense connexió o tanqueu la sessió."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorizace se nezdařila: {error}",
|
||||
"missing_params": "Chybí autorizační kód nebo stav.",
|
||||
"delivery_failed": "Výsledek autorizace se nepodařilo předat kartě aplikace. Zavřete toto okno a zkuste to znovu."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Pluginy",
|
||||
"description": "Pluginy přidané vaším správcem. Pro svůj účet je můžete zapnout nebo vypnout.",
|
||||
"description_uploads": "Pluginy přidávají do webmailu další funkce. Pro svůj účet je můžete zapnout nebo vypnout, případně nainstalovat vlastní.",
|
||||
"description_demo": "Pluginy nejsou v ukázkové verzi k dispozici.",
|
||||
"install_button": "Nainstalovat plugin",
|
||||
"install_hint": "Vyberte soubor ZIP s pluginem.",
|
||||
"install_hint_approval": "Vyberte soubor ZIP s pluginem. Než ho budete moci zapnout, musí ho schválit správce.",
|
||||
"install_uploads_off": "Váš správce nepovoluje instalaci pluginů.",
|
||||
"install_managed_id": "Váš správce už poskytuje plugin s tímto názvem, proto ho nelze nahradit.",
|
||||
"install_invalid": "Tento soubor není plugin, který lze nainstalovat: {details}",
|
||||
"toast_installed": "Plugin nainstalován. Zapněte ho níže.",
|
||||
"toast_installed_pending": "Plugin nainstalován a odeslán správci ke schválení.",
|
||||
"toast_enabled": "Plugin {name} je zapnutý",
|
||||
"toast_disabled": "Plugin {name} je vypnutý",
|
||||
"toast_removed": "Plugin {name} byl odstraněn",
|
||||
"toast_forced": "Váš správce ponechává plugin {name} zapnutý",
|
||||
"toast_approval_requested": "Plugin {name} čeká na schválení správcem",
|
||||
"empty_title": "Zatím žádné pluginy",
|
||||
"empty_admin": "Váš správce zatím nepřidal žádné pluginy.",
|
||||
"empty_uploads": "Začněte instalací pluginu ze souboru ZIP.",
|
||||
"empty_demo": "Pluginy vyžadují skutečný účet, proto je ukázková verze nemá.",
|
||||
"syncing": "Kontrola pluginů na serveru…",
|
||||
"status_installed": "Vypnuto",
|
||||
"status_enabled": "Spouští se",
|
||||
"status_running": "Zapnuto",
|
||||
"status_disabled": "Vypnuto",
|
||||
"status_error": "Problém",
|
||||
"badge_forced": "Povinný",
|
||||
"badge_managed": "Od správce",
|
||||
"badge_yours": "Nainstalováno vámi",
|
||||
"badge_awaiting": "Čeká na schválení",
|
||||
"toggle_label": "Zapnout nebo vypnout plugin {name}",
|
||||
"forced_note": "Váš správce tento plugin vyžaduje, proto ho nelze vypnout.",
|
||||
"permissions": "Co může dělat",
|
||||
"permissions_managed": "Co může dělat (schváleno správcem)",
|
||||
"settings": "Nastavení",
|
||||
"remove": "Odstranit",
|
||||
"remove_title": "Odstranit plugin {name}?",
|
||||
"remove_message": "Plugin i vše, co uložil v tomto prohlížeči, bude smazáno. Později ho můžete nainstalovat znovu.",
|
||||
"remove_confirm": "Odstranit",
|
||||
"error_user_plugins_off": "Váš správce vypnul pluginy instalované uživateli, proto tento plugin neběží.",
|
||||
"error_approval_unavailable": "Tento plugin byl nainstalován dříve, než bylo vyžadováno schválení. Odstraňte ho a nainstalujte znovu, aby se odeslal ke schválení.",
|
||||
"error_approval_denied": "Váš správce tento plugin neschválil.",
|
||||
"error_approval_pending": "Čeká se, až správce tento plugin schválí."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Povolit pluginu {name} tyto akce?",
|
||||
"intro": "Plugin žádá o níže uvedená oprávnění. Dostane je, jen pokud je povolíte.",
|
||||
"high_risk_note": "Označené položky dávají pluginu přístup k obsahu vaší pošty nebo mu umožňují posílat data jinam. Povolte je jen pluginům, kterým důvěřujete.",
|
||||
"revoke_hint": "Plugin můžete kdykoli vypnout nebo odstranit v Nastavení.",
|
||||
"deny": "Nepovolit",
|
||||
"allow": "Povolit"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Nepotřebuje žádná zvláštní oprávnění.",
|
||||
"high_risk": "Vyžaduje opatrnost",
|
||||
"email_read": {
|
||||
"title": "Číst vaši poštu",
|
||||
"body": "Vidí odesílatele, příjemce, předměty a celý text zpráv, které otevřete, i seznamu zpráv."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Měnit štítky a příznaky pošty",
|
||||
"body": "Přidává nebo odebírá štítky, příznaky a další klíčová slova u vašich zpráv."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Měnit poštu před odesláním",
|
||||
"body": "Čte a mění příjemce, předmět, text a přílohy zpráv, které píšete, a může zastavit odeslání zprávy."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Plný přístup k této aplikaci",
|
||||
"body": "Běží se stejnými právy jako samotný webmail. Může číst veškerou vaši poštu a uložené klíče a jednat vaším jménem. Povolte to jen pluginům, kterým plně důvěřujete."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Odesílat zprávy, které sám vytvořil",
|
||||
"body": "Odesílá z vašeho účtu kompletní zprávy, například podepsané nebo šifrované."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Číst nezpracovaný obsah zpráv",
|
||||
"body": "Čte původní data vašich zpráv a příloh i každého souboru, který připojíte před odesláním."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Nahrazovat přílohy před odesláním",
|
||||
"body": "Nahrává soubory na váš poštovní server a před odesláním zprávy nahradí připojený soubor jiným."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Měnit zobrazení zpráv",
|
||||
"body": "Nahrazuje text zpráv, které otevřete, i seznamu zpráv, například aby zobrazil dešifrovaný obsah."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Číst váš kalendář",
|
||||
"body": "Vidí vaše kalendáře a jejich události."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Měnit váš kalendář",
|
||||
"body": "Vytváří, mění a maže události."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Číst vaše kontakty",
|
||||
"body": "Prohledává a čte vaše adresáře."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Měnit vaše kontakty",
|
||||
"body": "Vytváří, mění a maže kontakty a adresáře."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Číst vaše soubory",
|
||||
"body": "Prochází a otevírá soubory uložené ve vašem účtu."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Měnit vaše soubory",
|
||||
"body": "Nahrává, přejmenovává, přesouvá a maže soubory ve vašem účtu."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Vidět vaše identity odesílatele",
|
||||
"body": "Vidí adresy, ze kterých odesíláte, a jejich podpisy."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Měnit vaše identity odesílatele",
|
||||
"body": "Vytváří, mění a maže identity odesílatele a podpisy."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Číst vaše filtry pošty",
|
||||
"body": "Vidí pravidla, která třídí vaši příchozí poštu."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Měnit vaše filtry pošty",
|
||||
"body": "Přidává pravidla do filtrů na serveru. Taková pravidla mohou příchozí poštu přesouvat, přeposílat nebo mazat."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Číst vaše úkoly",
|
||||
"body": "Vidí vaše seznamy úkolů a úkoly."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Měnit vaše úkoly",
|
||||
"body": "Vytváří, mění, dokončuje a maže úkoly."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Číst vaše šablony",
|
||||
"body": "Vidí vaše uložené šablony zpráv."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Měnit vaše šablony",
|
||||
"body": "Vytváří, mění a maže šablony zpráv."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Vidět stav S/MIME",
|
||||
"body": "Vidí, zda máte klíče a certifikáty S/MIME, bez přístupu ke klíčům."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Vidět automatickou odpověď v nepřítomnosti",
|
||||
"body": "Vidí, zda je automatická odpověď zapnutá a co obsahuje."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Měnit automatickou odpověď v nepřítomnosti",
|
||||
"body": "Zapíná a vypíná automatickou odpověď a mění její text a data."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Číst vaše nastavení",
|
||||
"body": "Vidí vaše předvolby a definice štítků."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Měnit vaše nastavení",
|
||||
"body": "Přidává štítky, mění jejich pořadí a mění vaše předvolby."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Vidět zabezpečení účtu",
|
||||
"body": "Vidí, zda je zapnuté dvoufázové ověření a šifrování, bez přístupu k tajným údajům."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Vědět, kdy se přihlásíte",
|
||||
"body": "Dostává zprávu, když se přihlásíte, přepnete účet nebo se obnoví vaše relace."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Odhlásit vás",
|
||||
"body": "Může vás odhlásit z webmailu."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Vidět vaše účty",
|
||||
"body": "Vidí účty, které jste přidali, včetně jejich adres a serverů."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Používat server webmailu vaším jménem",
|
||||
"body": "Volá tyto koncové body serveru s vaším přihlášením:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Připojovat se k jiným webům",
|
||||
"body": "Odesílá požadavky na tyto weby. Cokoli, co plugin může číst, tam může být odesláno:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Číst nastavení od správce",
|
||||
"body": "Čte nastavení, která pro tento plugin uložil váš správce."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Sledovat, kde se v aplikaci nacházíte",
|
||||
"body": "Ví, která stránka je otevřená, a reaguje na odkazy, na které kliknete."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Přidávat tlačítka na panel nástrojů zprávy",
|
||||
"body": "Zobrazuje vlastní tlačítka nad otevřenou zprávou."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Zobrazovat banner nahoře",
|
||||
"body": "Zobrazuje oznámení přes horní část aplikace."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Zobrazovat oznámení u zpráv",
|
||||
"body": "Zobrazuje oznámení nad textem otevřené zprávy."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Přidávat obsah pod zprávy",
|
||||
"body": "Zobrazuje vlastní obsah pod otevřenou zprávou."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Zobrazovat šifrovací klíče kontaktů",
|
||||
"body": "Zobrazuje a spravuje šifrovací klíče u kontaktu."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Přidávat panely do podrobností zprávy",
|
||||
"body": "Zobrazuje vlastní panel vedle otevřené zprávy nebo pod ní."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Ukládat soubory do zařízení",
|
||||
"body": "Nabízí ke stažení soubory, které vytvořil."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Přidávat karty do Doručených",
|
||||
"body": "Rozděluje Doručené do karet, například Aktualizace nebo Akce."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Přidávat tlačítka do editoru zprávy",
|
||||
"body": "Zobrazuje vlastní tlačítka, když píšete zprávu."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Přidávat panel do editoru zprávy",
|
||||
"body": "Zobrazuje vlastní panel vedle zprávy, kterou píšete."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Přidávat pole do postranního panelu",
|
||||
"body": "Zobrazuje vlastní obsah v postranním panelu pošty."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Přidávat stránku nastavení",
|
||||
"body": "Zobrazuje vlastní stránku v Nastavení."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Přidávat položky do nabídky zprávy",
|
||||
"body": "Přidává položky do nabídky, která se otevře po kliknutí pravým tlačítkem na zprávu."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Přidávat tlačítko do navigačního panelu",
|
||||
"body": "Zobrazuje vlastní tlačítko v navigačním panelu."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Přidávat klávesové zkratky",
|
||||
"body": "Reaguje na klávesové zkratky, které sám definuje."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Přidávat tlačítka k událostem",
|
||||
"body": "Zobrazuje vlastní tlačítka, když vytváříte nebo upravujete událost."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Přidávat stránku administrace",
|
||||
"body": "Zobrazuje vlastní stránku v nastavení administrace."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Vědět, kdy se aplikace spouští a ukončuje",
|
||||
"body": "Dostává zprávu, když se aplikace spustí, přejde do režimu offline nebo když se odhlásíte."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Godkendelse mislykkedes: {error}",
|
||||
"missing_params": "Autorisationskode eller tilstand mangler.",
|
||||
"delivery_failed": "Resultatet af godkendelsen kunne ikke leveres til app-fanen. Luk dette vindue og prøv igen."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugins",
|
||||
"description": "Plugins, som din administrator har tilføjet. Slå dem til eller fra for din konto.",
|
||||
"description_uploads": "Plugins tilføjer funktioner til webmailen. Slå dem til eller fra for din konto, eller installer dine egne.",
|
||||
"description_demo": "Plugins er ikke tilgængelige i demoen.",
|
||||
"install_button": "Installer plugin",
|
||||
"install_hint": "Vælg en ZIP-fil med et plugin.",
|
||||
"install_hint_approval": "Vælg en ZIP-fil med et plugin. En administrator skal godkende det, før du kan slå det til.",
|
||||
"install_uploads_off": "Din administrator tillader ikke, at du installerer plugins.",
|
||||
"install_managed_id": "Din administrator leverer allerede et plugin med dette navn, så det kan ikke erstattes.",
|
||||
"install_invalid": "Filen er ikke et plugin, der kan installeres: {details}",
|
||||
"toast_installed": "Plugin installeret. Slå det til herunder.",
|
||||
"toast_installed_pending": "Plugin installeret og sendt til din administrator til godkendelse.",
|
||||
"toast_enabled": "{name} er slået til",
|
||||
"toast_disabled": "{name} er slået fra",
|
||||
"toast_removed": "{name} er fjernet",
|
||||
"toast_forced": "Din administrator holder {name} slået til",
|
||||
"toast_approval_requested": "{name} venter på godkendelse fra din administrator",
|
||||
"empty_title": "Ingen plugins endnu",
|
||||
"empty_admin": "Din administrator har ikke tilføjet nogen plugins.",
|
||||
"empty_uploads": "Installer et plugin fra en ZIP-fil for at komme i gang.",
|
||||
"empty_demo": "Plugins kræver en rigtig konto, så demoen har ingen.",
|
||||
"syncing": "Tjekker plugins med serveren…",
|
||||
"status_installed": "Fra",
|
||||
"status_enabled": "Starter",
|
||||
"status_running": "Til",
|
||||
"status_disabled": "Fra",
|
||||
"status_error": "Problem",
|
||||
"badge_forced": "Påkrævet",
|
||||
"badge_managed": "Fra din administrator",
|
||||
"badge_yours": "Installeret af dig",
|
||||
"badge_awaiting": "Venter på godkendelse",
|
||||
"toggle_label": "Slå {name} til eller fra",
|
||||
"forced_note": "Din administrator kræver dette plugin, så det kan ikke slås fra.",
|
||||
"permissions": "Hvad det kan",
|
||||
"permissions_managed": "Hvad det kan (godkendt af din administrator)",
|
||||
"settings": "Indstillinger",
|
||||
"remove": "Fjern",
|
||||
"remove_title": "Fjern {name}?",
|
||||
"remove_message": "Pluginnet og alt, hvad det har gemt i denne browser, slettes. Du kan installere det igen senere.",
|
||||
"remove_confirm": "Fjern",
|
||||
"error_user_plugins_off": "Din administrator har slået plugins installeret af brugere fra, så dette plugin kører ikke.",
|
||||
"error_approval_unavailable": "Dette plugin blev installeret, før godkendelse var påkrævet. Fjern det, og installer det igen for at sende det til godkendelse.",
|
||||
"error_approval_denied": "Din administrator har ikke godkendt dette plugin.",
|
||||
"error_approval_pending": "Venter på, at din administrator godkender dette plugin."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Vil du tillade {name} at gøre dette?",
|
||||
"intro": "Pluginnet beder om tilladelserne herunder. Det får dem kun, hvis du tillader det.",
|
||||
"high_risk_note": "Markerede punkter giver pluginnet adgang til indholdet af dine e-mails eller lader det sende data andre steder hen. Tillad dem kun for plugins, du stoler på.",
|
||||
"revoke_hint": "Du kan altid slå pluginnet fra eller fjerne det under Indstillinger.",
|
||||
"deny": "Tillad ikke",
|
||||
"allow": "Tillad"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Det kræver ingen særlige tilladelser.",
|
||||
"high_risk": "Kræver omtanke",
|
||||
"email_read": {
|
||||
"title": "Læse dine e-mails",
|
||||
"body": "Se afsendere, modtagere, emner og den fulde tekst i de beskeder, du åbner, og i beskedlisten."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Ændre tags og markeringer på dine e-mails",
|
||||
"body": "Tilføje eller fjerne tags, markeringer og andre nøgleord på dine beskeder."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Ændre e-mails, før de sendes",
|
||||
"body": "Læse og ændre modtagere, emne, tekst og vedhæftninger i de beskeder, du skriver, og forhindre, at en besked bliver sendt."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Fuld adgang til denne app",
|
||||
"body": "Kører med de samme rettigheder som selve webmailen. Det kan læse alle dine e-mails og gemte nøgler og handle på dine vegne. Tillad det kun for plugins, du stoler fuldt ud på."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Sende beskeder, det selv har lavet",
|
||||
"body": "Sende færdige beskeder, f.eks. signerede eller krypterede, fra din konto."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Læse beskeders rå indhold",
|
||||
"body": "Læse de originale data i dine beskeder og vedhæftninger og i alle filer, du vedhæfter, før de sendes."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Erstatte vedhæftninger før afsendelse",
|
||||
"body": "Uploade filer til din mailserver og erstatte en vedhæftet fil med en anden, før beskeden sendes."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Ændre, hvordan beskeder vises",
|
||||
"body": "Erstatte teksten i de beskeder, du åbner, og i beskedlisten, f.eks. for at vise dekrypteret indhold."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Læse din kalender",
|
||||
"body": "Se dine kalendere og deres begivenheder."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Ændre din kalender",
|
||||
"body": "Oprette, ændre og slette begivenheder."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Læse dine kontakter",
|
||||
"body": "Søge i og læse dine adressebøger."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Ændre dine kontakter",
|
||||
"body": "Oprette, ændre og slette kontakter og adressebøger."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Læse dine filer",
|
||||
"body": "Gennemse og åbne de filer, der er gemt på din konto."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Ændre dine filer",
|
||||
"body": "Uploade, omdøbe, flytte og slette filer på din konto."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Se dine afsenderidentiteter",
|
||||
"body": "Se de adresser, du sender fra, og deres signaturer."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Ændre dine afsenderidentiteter",
|
||||
"body": "Oprette, ændre og slette afsenderidentiteter og signaturer."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Læse dine mailfiltre",
|
||||
"body": "Se de regler, der sorterer din indgående mail."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Ændre dine mailfiltre",
|
||||
"body": "Tilføje regler til dine filtre på serveren. Sådanne regler kan flytte, videresende eller slette indgående mail."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Læse dine opgaver",
|
||||
"body": "Se dine opgavelister og opgaver."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Ændre dine opgaver",
|
||||
"body": "Oprette, ændre, fuldføre og slette opgaver."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Læse dine skabeloner",
|
||||
"body": "Se dine gemte beskedskabeloner."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Ændre dine skabeloner",
|
||||
"body": "Oprette, ændre og slette beskedskabeloner."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Se din S/MIME-status",
|
||||
"body": "Se, om du har S/MIME-nøgler og -certifikater, uden adgang til nøglerne."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Se dit fraværssvar",
|
||||
"body": "Se, om dit automatiske svar er slået til, og hvad der står i det."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Ændre dit fraværssvar",
|
||||
"body": "Slå dit automatiske svar til eller fra og ændre teksten og datoerne."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Læse dine indstillinger",
|
||||
"body": "Se dine præferencer og tagdefinitioner."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Ændre dine indstillinger",
|
||||
"body": "Tilføje og omarrangere tags og ændre dine præferencer."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Se din kontos sikkerhed",
|
||||
"body": "Se, om to-faktor-godkendelse og kryptering er slået til, uden adgang til hemmeligheder."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Vide, når du logger ind",
|
||||
"body": "Få besked, når du logger ind, skifter konto, eller din session fornyes."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Logge dig ud",
|
||||
"body": "Logge dig ud af webmailen."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Se dine konti",
|
||||
"body": "Se de konti, du har tilføjet, med deres adresser og servere."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Bruge webmail-serveren for dig",
|
||||
"body": "Kalde disse server-endpoints med dit login:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Forbinde til andre websteder",
|
||||
"body": "Sende forespørgsler til disse websteder. Alt, hvad pluginnet kan læse, kan blive sendt dertil:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Læse sine indstillinger fra din administrator",
|
||||
"body": "Læse de indstillinger, din administrator har gemt for dette plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Følge med i, hvor du er i appen",
|
||||
"body": "Vide, hvilken side der er åben, og reagere på links, du klikker på."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Tilføje knapper til beskedens værktøjslinje",
|
||||
"body": "Vise sine egne knapper over en åben besked."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Vise et banner øverst",
|
||||
"body": "Vise en meddelelse hen over toppen af appen."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Vise meddelelser på beskeder",
|
||||
"body": "Vise en meddelelse over teksten i en åben besked."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Tilføje indhold under beskeder",
|
||||
"body": "Vise sit eget indhold under en åben besked."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Vise kontakters krypteringsnøgler",
|
||||
"body": "Vise og administrere krypteringsnøglerne på en kontakt."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Tilføje paneler til beskeddetaljer",
|
||||
"body": "Vise sit eget panel ved siden af eller under en åben besked."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Gemme filer på din enhed",
|
||||
"body": "Tilbyde filer, det har lavet, til download."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Tilføje faner til din indbakke",
|
||||
"body": "Sortere din indbakke i faner som Opdateringer eller Kampagner."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Tilføje knapper til komponisten",
|
||||
"body": "Vise sine egne knapper, mens du skriver en besked."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Tilføje et panel til komponisten",
|
||||
"body": "Vise sit eget panel ved siden af den besked, du skriver."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Tilføje en boks til sidepanelet",
|
||||
"body": "Vise sit eget indhold i mailens sidepanel."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Tilføje en indstillingsside",
|
||||
"body": "Vise sin egen side under Indstillinger."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Tilføje til beskedmenuen",
|
||||
"body": "Tilføje punkter til den menu, der åbner, når du højreklikker på en besked."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Tilføje til navigationslinjen",
|
||||
"body": "Vise sin egen knap på navigationslinjen."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Tilføje tastaturgenveje",
|
||||
"body": "Reagere på tastaturgenveje, som det selv definerer."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Tilføje knapper til begivenheder",
|
||||
"body": "Vise sine egne knapper, når du opretter eller redigerer en begivenhed."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Tilføje en administratorside",
|
||||
"body": "Vise sin egen side i administratorindstillingerne."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Vide, når appen starter og stopper",
|
||||
"body": "Få besked, når appen starter, går offline, eller du logger ud."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorisierung fehlgeschlagen: {error}",
|
||||
"missing_params": "Autorisierungscode oder State fehlt.",
|
||||
"delivery_failed": "Das Autorisierungsergebnis konnte nicht an den App-Tab übermittelt werden. Bitte schließen Sie dieses Fenster und versuchen Sie es erneut."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugins",
|
||||
"description": "Plugins, die Ihr Administrator hinzugefügt hat. Schalten Sie sie für Ihr Konto ein oder aus.",
|
||||
"description_uploads": "Plugins erweitern das Webmail um Funktionen. Schalten Sie sie für Ihr Konto ein oder aus, oder installieren Sie eigene.",
|
||||
"description_demo": "In der Demo sind keine Plugins verfügbar.",
|
||||
"install_button": "Plugin installieren",
|
||||
"install_hint": "Wählen Sie eine Plugin-ZIP-Datei.",
|
||||
"install_hint_approval": "Wählen Sie eine Plugin-ZIP-Datei. Ein Administrator muss das Plugin freigeben, bevor Sie es einschalten können.",
|
||||
"install_uploads_off": "Ihr Administrator erlaubt keine Installation von Plugins.",
|
||||
"install_managed_id": "Ihr Administrator stellt bereits ein Plugin mit diesem Namen bereit. Es kann daher nicht ersetzt werden.",
|
||||
"install_invalid": "Diese Datei ist kein installierbares Plugin: {details}",
|
||||
"toast_installed": "Plugin installiert. Schalten Sie es unten ein.",
|
||||
"toast_installed_pending": "Plugin installiert und Ihrem Administrator zur Freigabe vorgelegt.",
|
||||
"toast_enabled": "{name} ist eingeschaltet",
|
||||
"toast_disabled": "{name} ist ausgeschaltet",
|
||||
"toast_removed": "{name} wurde entfernt",
|
||||
"toast_forced": "Ihr Administrator lässt {name} eingeschaltet",
|
||||
"toast_approval_requested": "{name} wartet auf die Freigabe durch Ihren Administrator",
|
||||
"empty_title": "Noch keine Plugins",
|
||||
"empty_admin": "Ihr Administrator hat keine Plugins hinzugefügt.",
|
||||
"empty_uploads": "Installieren Sie zum Start ein Plugin aus einer ZIP-Datei.",
|
||||
"empty_demo": "Plugins brauchen ein echtes Konto, daher gibt es in der Demo keine.",
|
||||
"syncing": "Plugins werden mit dem Server abgeglichen…",
|
||||
"status_installed": "Aus",
|
||||
"status_enabled": "Wird gestartet",
|
||||
"status_running": "An",
|
||||
"status_disabled": "Aus",
|
||||
"status_error": "Problem",
|
||||
"badge_forced": "Erforderlich",
|
||||
"badge_managed": "Von Ihrem Administrator",
|
||||
"badge_yours": "Von Ihnen installiert",
|
||||
"badge_awaiting": "Wartet auf Freigabe",
|
||||
"toggle_label": "{name} ein- oder ausschalten",
|
||||
"forced_note": "Ihr Administrator schreibt dieses Plugin vor. Es kann daher nicht ausgeschaltet werden.",
|
||||
"permissions": "Was es darf",
|
||||
"permissions_managed": "Was es darf (von Ihrem Administrator freigegeben)",
|
||||
"settings": "Einstellungen",
|
||||
"remove": "Entfernen",
|
||||
"remove_title": "{name} entfernen?",
|
||||
"remove_message": "Das Plugin und alles, was es in diesem Browser gespeichert hat, wird gelöscht. Sie können es später erneut installieren.",
|
||||
"remove_confirm": "Entfernen",
|
||||
"error_user_plugins_off": "Ihr Administrator hat von Benutzern installierte Plugins ausgeschaltet. Dieses Plugin läuft daher nicht.",
|
||||
"error_approval_unavailable": "Dieses Plugin wurde installiert, bevor eine Freigabe nötig war. Entfernen Sie es und installieren Sie es erneut, um es zur Freigabe vorzulegen.",
|
||||
"error_approval_denied": "Ihr Administrator hat dieses Plugin nicht freigegeben.",
|
||||
"error_approval_pending": "Wartet darauf, dass Ihr Administrator dieses Plugin freigibt."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name} Folgendes erlauben?",
|
||||
"intro": "Das Plugin bittet um die folgenden Berechtigungen. Es erhält sie nur, wenn Sie zustimmen.",
|
||||
"high_risk_note": "Markierte Punkte geben dem Plugin Zugriff auf den Inhalt Ihrer E-Mails oder erlauben ihm, Daten anderswohin zu senden. Erlauben Sie sie nur Plugins, denen Sie vertrauen.",
|
||||
"revoke_hint": "Sie können das Plugin jederzeit in den Einstellungen ausschalten oder entfernen.",
|
||||
"deny": "Nicht erlauben",
|
||||
"allow": "Erlauben"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Es braucht keine besonderen Berechtigungen.",
|
||||
"high_risk": "Mit Vorsicht",
|
||||
"email_read": {
|
||||
"title": "Ihre E-Mails lesen",
|
||||
"body": "Absender, Empfänger, Betreff und den vollständigen Text der Nachrichten sehen, die Sie öffnen, sowie der Nachrichtenliste."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Labels und Markierungen Ihrer E-Mails ändern",
|
||||
"body": "Labels, Markierungen und andere Schlüsselwörter an Ihren Nachrichten hinzufügen oder entfernen."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "E-Mails vor dem Senden ändern",
|
||||
"body": "Empfänger, Betreff, Text und Anhänge der Nachrichten lesen und ändern, die Sie schreiben, und das Senden einer Nachricht verhindern."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Vollzugriff auf diese App",
|
||||
"body": "Läuft mit denselben Rechten wie das Webmail selbst. Es kann alle Ihre E-Mails und gespeicherten Schlüssel lesen und in Ihrem Namen handeln. Erlauben Sie das nur Plugins, denen Sie voll vertrauen."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Selbst erstellte Nachrichten senden",
|
||||
"body": "Vollständige Nachrichten, zum Beispiel signierte oder verschlüsselte, von Ihrem Konto senden."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Rohinhalt von Nachrichten lesen",
|
||||
"body": "Die Originaldaten Ihrer Nachrichten und Anhänge lesen, auch jeder Datei, die Sie vor dem Senden anhängen."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Anhänge vor dem Senden ersetzen",
|
||||
"body": "Dateien auf Ihren Mailserver hochladen und eine angehängte Datei vor dem Senden durch eine andere ersetzen."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Darstellung von Nachrichten ändern",
|
||||
"body": "Den Text geöffneter Nachrichten und der Nachrichtenliste ersetzen, zum Beispiel um entschlüsselte Inhalte anzuzeigen."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Ihren Kalender lesen",
|
||||
"body": "Ihre Kalender und deren Termine sehen."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Ihren Kalender ändern",
|
||||
"body": "Termine erstellen, ändern und löschen."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Ihre Kontakte lesen",
|
||||
"body": "Ihre Adressbücher durchsuchen und lesen."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Ihre Kontakte ändern",
|
||||
"body": "Kontakte und Adressbücher erstellen, ändern und löschen."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Ihre Dateien lesen",
|
||||
"body": "Die in Ihrem Konto gespeicherten Dateien durchsuchen und öffnen."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Ihre Dateien ändern",
|
||||
"body": "Dateien in Ihrem Konto hochladen, umbenennen, verschieben und löschen."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Ihre Absenderadressen sehen",
|
||||
"body": "Die Adressen, von denen Sie senden, und deren Signaturen sehen."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Ihre Absenderadressen ändern",
|
||||
"body": "Absenderadressen und Signaturen erstellen, ändern und löschen."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Ihre E-Mail-Filter lesen",
|
||||
"body": "Die Regeln sehen, die Ihre eingehenden E-Mails sortieren."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Ihre E-Mail-Filter ändern",
|
||||
"body": "Regeln zu Ihren serverseitigen Filtern hinzufügen. Solche Regeln können eingehende E-Mails verschieben, weiterleiten oder löschen."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Ihre Aufgaben lesen",
|
||||
"body": "Ihre Aufgabenlisten und Aufgaben sehen."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Ihre Aufgaben ändern",
|
||||
"body": "Aufgaben erstellen, ändern, erledigen und löschen."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Ihre Vorlagen lesen",
|
||||
"body": "Ihre gespeicherten Nachrichtenvorlagen sehen."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Ihre Vorlagen ändern",
|
||||
"body": "Nachrichtenvorlagen erstellen, ändern und löschen."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Ihren S/MIME-Status sehen",
|
||||
"body": "Sehen, ob Sie S/MIME-Schlüssel und -Zertifikate haben, ohne Zugriff auf die Schlüssel."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Ihre Abwesenheitsnotiz sehen",
|
||||
"body": "Sehen, ob Ihre automatische Antwort eingeschaltet ist und was sie enthält."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Ihre Abwesenheitsnotiz ändern",
|
||||
"body": "Ihre automatische Antwort ein- oder ausschalten und ihren Text und Zeitraum ändern."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Ihre Einstellungen lesen",
|
||||
"body": "Ihre Einstellungen und Label-Definitionen sehen."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Ihre Einstellungen ändern",
|
||||
"body": "Labels hinzufügen und neu anordnen und Ihre Einstellungen ändern."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Ihre Kontosicherheit sehen",
|
||||
"body": "Sehen, ob Zwei-Faktor-Anmeldung und Verschlüsselung eingeschaltet sind, ohne Zugriff auf Geheimnisse."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Erfahren, wann Sie sich anmelden",
|
||||
"body": "Benachrichtigt werden, wenn Sie sich anmelden, das Konto wechseln oder Ihre Sitzung erneuert wird."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Sie abmelden",
|
||||
"body": "Sie vom Webmail abmelden."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Ihre Konten sehen",
|
||||
"body": "Die von Ihnen hinzugefügten Konten mit ihren Adressen und Servern sehen."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Den Webmail-Server für Sie nutzen",
|
||||
"body": "Diese Server-Endpunkte mit Ihrer Anmeldung aufrufen:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Mit anderen Websites verbinden",
|
||||
"body": "Anfragen an diese Websites senden. Alles, was das Plugin lesen kann, kann dorthin gesendet werden:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Seine Einstellungen von Ihrem Administrator lesen",
|
||||
"body": "Die Einstellungen lesen, die Ihr Administrator für dieses Plugin gespeichert hat."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Verfolgen, wo Sie sich in der App befinden",
|
||||
"body": "Wissen, welche Seite geöffnet ist, und auf angeklickte Links reagieren."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Schaltflächen zur Nachrichten-Symbolleiste hinzufügen",
|
||||
"body": "Eigene Schaltflächen über einer geöffneten Nachricht anzeigen."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Oben ein Banner anzeigen",
|
||||
"body": "Einen Hinweis über die gesamte Breite oben in der App anzeigen."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Hinweise bei Nachrichten anzeigen",
|
||||
"body": "Einen Hinweis über dem Text einer geöffneten Nachricht anzeigen."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Inhalte unter Nachrichten hinzufügen",
|
||||
"body": "Eigene Inhalte unter einer geöffneten Nachricht anzeigen."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Verschlüsselungsschlüssel von Kontakten anzeigen",
|
||||
"body": "Die Verschlüsselungsschlüssel eines Kontakts anzeigen und verwalten."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Bereiche zu Nachrichtendetails hinzufügen",
|
||||
"body": "Einen eigenen Bereich neben oder unter einer geöffneten Nachricht anzeigen."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Dateien auf Ihrem Gerät speichern",
|
||||
"body": "Selbst erstellte Dateien zum Herunterladen anbieten."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Tabs zu Ihrem Posteingang hinzufügen",
|
||||
"body": "Ihren Posteingang in Tabs wie Updates oder Werbung aufteilen."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Schaltflächen zum Editor hinzufügen",
|
||||
"body": "Eigene Schaltflächen anzeigen, während Sie eine Nachricht schreiben."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Einen Bereich zum Editor hinzufügen",
|
||||
"body": "Einen eigenen Bereich neben der Nachricht anzeigen, die Sie schreiben."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Ein Feld zur Seitenleiste hinzufügen",
|
||||
"body": "Eigene Inhalte in der E-Mail-Seitenleiste anzeigen."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Eine Einstellungsseite hinzufügen",
|
||||
"body": "Eine eigene Seite in den Einstellungen anzeigen."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Zum Nachrichtenmenü hinzufügen",
|
||||
"body": "Einträge zu dem Menü hinzufügen, das sich per Rechtsklick auf eine Nachricht öffnet."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Zur Navigationsleiste hinzufügen",
|
||||
"body": "Eine eigene Schaltfläche in der Navigationsleiste anzeigen."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Tastaturkürzel hinzufügen",
|
||||
"body": "Auf selbst festgelegte Tastaturkürzel reagieren."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Schaltflächen zu Terminen hinzufügen",
|
||||
"body": "Eigene Schaltflächen anzeigen, wenn Sie einen Termin erstellen oder bearbeiten."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Eine Admin-Seite hinzufügen",
|
||||
"body": "Eine eigene Seite in den Admin-Einstellungen anzeigen."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Erfahren, wann die App startet und beendet wird",
|
||||
"body": "Benachrichtigt werden, wenn die App startet, offline geht oder Sie sich abmelden."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Authorization failed: {error}",
|
||||
"missing_params": "Missing authorization code or state.",
|
||||
"delivery_failed": "The authorization result could not be delivered to the app tab. Please close this window and try again."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugins",
|
||||
"description": "Plugins your administrator added. Turn them on or off for your account.",
|
||||
"description_uploads": "Plugins add features to the webmail. Turn them on or off for your account, or install your own.",
|
||||
"description_demo": "Plugins are not available in the demo.",
|
||||
"install_button": "Install plugin",
|
||||
"install_hint": "Choose a plugin ZIP file.",
|
||||
"install_hint_approval": "Choose a plugin ZIP file. An administrator has to approve it before you can turn it on.",
|
||||
"install_uploads_off": "Your administrator does not allow installing plugins.",
|
||||
"install_managed_id": "Your administrator already provides a plugin with this name, so it can't be replaced.",
|
||||
"install_invalid": "This file is not a plugin that can be installed: {details}",
|
||||
"toast_installed": "Plugin installed. Turn it on below.",
|
||||
"toast_installed_pending": "Plugin installed and sent to your administrator for approval.",
|
||||
"toast_enabled": "{name} is on",
|
||||
"toast_disabled": "{name} is off",
|
||||
"toast_removed": "{name} was removed",
|
||||
"toast_forced": "Your administrator keeps {name} turned on",
|
||||
"toast_approval_requested": "{name} is waiting for approval by your administrator",
|
||||
"empty_title": "No plugins yet",
|
||||
"empty_admin": "Your administrator has not added any plugins.",
|
||||
"empty_uploads": "Install a plugin from a ZIP file to get started.",
|
||||
"empty_demo": "Plugins need a real account, so the demo has none.",
|
||||
"syncing": "Checking plugins with the server…",
|
||||
"status_installed": "Off",
|
||||
"status_enabled": "Starting",
|
||||
"status_running": "On",
|
||||
"status_disabled": "Off",
|
||||
"status_error": "Problem",
|
||||
"badge_forced": "Required",
|
||||
"badge_managed": "From your administrator",
|
||||
"badge_yours": "Installed by you",
|
||||
"badge_awaiting": "Awaiting approval",
|
||||
"toggle_label": "Turn {name} on or off",
|
||||
"forced_note": "Your administrator requires this plugin, so it can't be turned off.",
|
||||
"permissions": "What it can do",
|
||||
"permissions_managed": "What it can do (approved by your administrator)",
|
||||
"settings": "Settings",
|
||||
"remove": "Remove",
|
||||
"remove_title": "Remove {name}?",
|
||||
"remove_message": "The plugin and everything it stored in this browser are deleted. You can install it again later.",
|
||||
"remove_confirm": "Remove",
|
||||
"error_user_plugins_off": "Your administrator turned off plugins installed by users, so this plugin does not run.",
|
||||
"error_approval_unavailable": "This plugin was installed before approvals were required. Remove it and install it again to send it for approval.",
|
||||
"error_approval_denied": "Your administrator did not approve this plugin.",
|
||||
"error_approval_pending": "Waiting for your administrator to approve this plugin."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Allow {name} to do this?",
|
||||
"intro": "The plugin asks for the permissions below. It only gets them if you allow it.",
|
||||
"high_risk_note": "Marked items give the plugin access to the content of your mail or let it send data elsewhere. Only allow them for plugins you trust.",
|
||||
"revoke_hint": "You can turn the plugin off or remove it in Settings at any time.",
|
||||
"deny": "Don't allow",
|
||||
"allow": "Allow"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "It needs no special permissions.",
|
||||
"high_risk": "Needs care",
|
||||
"email_read": {
|
||||
"title": "Read your email",
|
||||
"body": "See senders, recipients, subjects and the full text of messages you open and of the message list."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Change tags and flags on your email",
|
||||
"body": "Add or remove tags, flags and other keywords on your messages."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Change mail before it is sent",
|
||||
"body": "Read and change the recipients, subject, text and attachments of messages you write, and stop a message from being sent."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Full access to this app",
|
||||
"body": "Runs with the same rights as the webmail itself. It can read all your mail and stored keys and act for you. Only allow this for plugins you fully trust."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Send messages it built itself",
|
||||
"body": "Send complete messages, for example signed or encrypted ones, from your account."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Read the raw content of messages",
|
||||
"body": "Read the original data of your messages and attachments, and of every file you attach before it is sent."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Replace attachments before sending",
|
||||
"body": "Upload files to your mail server and replace a file you attached with another one before the message is sent."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Change how messages are shown",
|
||||
"body": "Replace the text of messages you open and of the message list, for example to show decrypted content."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Read your calendar",
|
||||
"body": "See your calendars and their events."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Change your calendar",
|
||||
"body": "Create, change and delete events."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Read your contacts",
|
||||
"body": "Search and read your address books."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Change your contacts",
|
||||
"body": "Create, change and delete contacts and address books."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Read your files",
|
||||
"body": "Browse and open the files stored in your account."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Change your files",
|
||||
"body": "Upload, rename, move and delete files in your account."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "See your sender addresses",
|
||||
"body": "See the addresses you send from and their signatures."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Change your sender addresses",
|
||||
"body": "Create, change and delete sender addresses and signatures."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Read your mail filters",
|
||||
"body": "See the rules that sort your incoming mail."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Change your mail filters",
|
||||
"body": "Add rules to your server-side filters. Such rules can move, forward or delete incoming mail."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Read your tasks",
|
||||
"body": "See your task lists and tasks."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Change your tasks",
|
||||
"body": "Create, change, complete and delete tasks."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Read your templates",
|
||||
"body": "See your saved message templates."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Change your templates",
|
||||
"body": "Create, change and delete message templates."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "See your S/MIME status",
|
||||
"body": "See whether you have S/MIME keys and certificates, without access to the keys."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "See your out-of-office reply",
|
||||
"body": "See whether your automatic reply is on and what it says."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Change your out-of-office reply",
|
||||
"body": "Turn your automatic reply on or off and change its text and dates."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Read your settings",
|
||||
"body": "See your preferences and tag definitions."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Change your settings",
|
||||
"body": "Add and reorder tags and change your preferences."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "See your account security",
|
||||
"body": "See whether two-factor sign-in and encryption are on, without access to secrets."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Know when you sign in",
|
||||
"body": "Be told when you sign in, switch accounts or your session is renewed."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Sign you out",
|
||||
"body": "Sign you out of the webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "See your accounts",
|
||||
"body": "See the accounts you added, with their addresses and servers."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Use the webmail server for you",
|
||||
"body": "Call these server endpoints with your login:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Connect to other websites",
|
||||
"body": "Send requests to these sites. Anything the plugin can read may be sent there:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Read its settings from your administrator",
|
||||
"body": "Read the settings your administrator saved for this plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Follow where you are in the app",
|
||||
"body": "Know which page is open and react to links you click."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Add buttons to the message toolbar",
|
||||
"body": "Show its own buttons above an open message."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Show a banner at the top",
|
||||
"body": "Show a notice across the top of the app."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Show notices on messages",
|
||||
"body": "Show a notice above the text of an open message."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Add content below messages",
|
||||
"body": "Show its own content under an open message."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Show encryption keys of contacts",
|
||||
"body": "Show and manage the encryption keys on a contact."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Add panels to message details",
|
||||
"body": "Show its own panel next to or below an open message."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Save files to your device",
|
||||
"body": "Offer files it created for download."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Add tabs to your inbox",
|
||||
"body": "Sort your inbox into tabs such as Updates or Promotions."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Add buttons to the composer",
|
||||
"body": "Show its own buttons while you write a message."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Add a panel to the composer",
|
||||
"body": "Show its own panel next to the message you write."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Add a box to the sidebar",
|
||||
"body": "Show its own content in the mail sidebar."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Add a settings page",
|
||||
"body": "Show its own page in Settings."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Add to the message menu",
|
||||
"body": "Add entries to the menu that opens when you right-click a message."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Add to the navigation bar",
|
||||
"body": "Show its own button in the navigation bar."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Add keyboard shortcuts",
|
||||
"body": "React to keyboard shortcuts it defines."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Add buttons to events",
|
||||
"body": "Show its own buttons when you create or edit an event."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Add an admin page",
|
||||
"body": "Show its own page in the admin settings."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Know when the app starts and stops",
|
||||
"body": "Be told when the app starts, goes offline or you sign out."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Error de autorización: {error}",
|
||||
"missing_params": "Falta el código de autorización o el estado.",
|
||||
"delivery_failed": "No se pudo entregar el resultado de la autorización a la pestaña de la aplicación. Cierre esta ventana e inténtelo de nuevo."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Complementos",
|
||||
"description": "Complementos que añadió tu administrador. Actívalos o desactívalos para tu cuenta.",
|
||||
"description_uploads": "Los complementos añaden funciones al webmail. Actívalos o desactívalos para tu cuenta, o instala los tuyos.",
|
||||
"description_demo": "Los complementos no están disponibles en la demo.",
|
||||
"install_button": "Instalar complemento",
|
||||
"install_hint": "Elige el archivo ZIP de un complemento.",
|
||||
"install_hint_approval": "Elige el archivo ZIP de un complemento. Un administrador tiene que aprobarlo antes de que puedas activarlo.",
|
||||
"install_uploads_off": "Tu administrador no permite instalar complementos.",
|
||||
"install_managed_id": "Tu administrador ya ofrece un complemento con este nombre, así que no se puede reemplazar.",
|
||||
"install_invalid": "Este archivo no es un complemento que se pueda instalar: {details}",
|
||||
"toast_installed": "Complemento instalado. Actívalo abajo.",
|
||||
"toast_installed_pending": "Complemento instalado y enviado a tu administrador para su aprobación.",
|
||||
"toast_enabled": "{name} está activado",
|
||||
"toast_disabled": "{name} está desactivado",
|
||||
"toast_removed": "Se eliminó {name}",
|
||||
"toast_forced": "Tu administrador mantiene {name} activado",
|
||||
"toast_approval_requested": "{name} está pendiente de la aprobación de tu administrador",
|
||||
"empty_title": "Aún no hay complementos",
|
||||
"empty_admin": "Tu administrador no ha añadido ningún complemento.",
|
||||
"empty_uploads": "Instala un complemento desde un archivo ZIP para empezar.",
|
||||
"empty_demo": "Los complementos necesitan una cuenta real, así que la demo no tiene ninguno.",
|
||||
"syncing": "Comprobando los complementos con el servidor…",
|
||||
"status_installed": "Desactivado",
|
||||
"status_enabled": "Iniciando",
|
||||
"status_running": "Activado",
|
||||
"status_disabled": "Desactivado",
|
||||
"status_error": "Problema",
|
||||
"badge_forced": "Obligatorio",
|
||||
"badge_managed": "De tu administrador",
|
||||
"badge_yours": "Instalado por ti",
|
||||
"badge_awaiting": "Pendiente de aprobación",
|
||||
"toggle_label": "Activar o desactivar {name}",
|
||||
"forced_note": "Tu administrador exige este complemento, así que no se puede desactivar.",
|
||||
"permissions": "Qué puede hacer",
|
||||
"permissions_managed": "Qué puede hacer (aprobado por tu administrador)",
|
||||
"settings": "Configuración",
|
||||
"remove": "Eliminar",
|
||||
"remove_title": "¿Eliminar {name}?",
|
||||
"remove_message": "Se eliminarán el complemento y todo lo que guardó en este navegador. Puedes volver a instalarlo más tarde.",
|
||||
"remove_confirm": "Eliminar",
|
||||
"error_user_plugins_off": "Tu administrador desactivó los complementos instalados por usuarios, así que este complemento no se ejecuta.",
|
||||
"error_approval_unavailable": "Este complemento se instaló antes de que se exigiera aprobación. Elimínalo e instálalo de nuevo para enviarlo a aprobación.",
|
||||
"error_approval_denied": "Tu administrador no aprobó este complemento.",
|
||||
"error_approval_pending": "Esperando a que tu administrador apruebe este complemento."
|
||||
},
|
||||
"consent": {
|
||||
"title": "¿Permitir que {name} haga esto?",
|
||||
"intro": "El complemento pide los permisos de abajo. Solo los obtiene si se los concedes.",
|
||||
"high_risk_note": "Los elementos marcados dan al complemento acceso al contenido de tu correo o le permiten enviar datos a otros sitios. Permítelos solo en complementos de confianza.",
|
||||
"revoke_hint": "Puedes desactivar o eliminar el complemento en Configuración en cualquier momento.",
|
||||
"deny": "No permitir",
|
||||
"allow": "Permitir"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "No necesita permisos especiales.",
|
||||
"high_risk": "Con cuidado",
|
||||
"email_read": {
|
||||
"title": "Leer tu correo",
|
||||
"body": "Ver remitentes, destinatarios, asuntos y el texto completo de los mensajes que abres y de la lista de mensajes."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Cambiar etiquetas y marcas de tu correo",
|
||||
"body": "Añadir o quitar etiquetas, marcas y otras palabras clave de tus mensajes."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Cambiar el correo antes de enviarlo",
|
||||
"body": "Leer y cambiar los destinatarios, el asunto, el texto y los adjuntos de los mensajes que escribes, e impedir que se envíe un mensaje."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Acceso total a esta aplicación",
|
||||
"body": "Se ejecuta con los mismos derechos que el propio webmail. Puede leer todo tu correo y tus claves guardadas y actuar en tu nombre. Permítelo solo en complementos en los que confíes plenamente."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Enviar mensajes que creó él mismo",
|
||||
"body": "Enviar mensajes completos, por ejemplo firmados o cifrados, desde tu cuenta."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Leer el contenido sin procesar de los mensajes",
|
||||
"body": "Leer los datos originales de tus mensajes y adjuntos, y de cada archivo que adjuntas antes de enviarlo."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Reemplazar adjuntos antes de enviar",
|
||||
"body": "Subir archivos a tu servidor de correo y reemplazar un archivo adjunto por otro antes de enviar el mensaje."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Cambiar cómo se muestran los mensajes",
|
||||
"body": "Reemplazar el texto de los mensajes que abres y de la lista de mensajes, por ejemplo para mostrar contenido descifrado."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Leer tu calendario",
|
||||
"body": "Ver tus calendarios y sus eventos."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Cambiar tu calendario",
|
||||
"body": "Crear, cambiar y eliminar eventos."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Leer tus contactos",
|
||||
"body": "Buscar y leer en tus libretas de direcciones."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Cambiar tus contactos",
|
||||
"body": "Crear, cambiar y eliminar contactos y libretas de direcciones."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Leer tus archivos",
|
||||
"body": "Explorar y abrir los archivos guardados en tu cuenta."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Cambiar tus archivos",
|
||||
"body": "Subir, renombrar, mover y eliminar archivos de tu cuenta."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Ver tus direcciones de remitente",
|
||||
"body": "Ver las direcciones desde las que envías y sus firmas."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Cambiar tus direcciones de remitente",
|
||||
"body": "Crear, cambiar y eliminar direcciones de remitente y firmas."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Leer tus filtros de correo",
|
||||
"body": "Ver las reglas que ordenan tu correo entrante."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Cambiar tus filtros de correo",
|
||||
"body": "Añadir reglas a tus filtros del servidor. Esas reglas pueden mover, reenviar o eliminar el correo entrante."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Leer tus tareas",
|
||||
"body": "Ver tus listas de tareas y tus tareas."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Cambiar tus tareas",
|
||||
"body": "Crear, cambiar, completar y eliminar tareas."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Leer tus plantillas",
|
||||
"body": "Ver tus plantillas de mensaje guardadas."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Cambiar tus plantillas",
|
||||
"body": "Crear, cambiar y eliminar plantillas de mensaje."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Ver tu estado de S/MIME",
|
||||
"body": "Ver si tienes claves y certificados S/MIME, sin acceso a las claves."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Ver tu respuesta de ausencia",
|
||||
"body": "Ver si tu respuesta automática está activada y qué dice."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Cambiar tu respuesta de ausencia",
|
||||
"body": "Activar o desactivar tu respuesta automática y cambiar su texto y sus fechas."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Leer tu configuración",
|
||||
"body": "Ver tus preferencias y las definiciones de tus etiquetas."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Cambiar tu configuración",
|
||||
"body": "Añadir y reordenar etiquetas y cambiar tus preferencias."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Ver la seguridad de tu cuenta",
|
||||
"body": "Ver si el inicio de sesión con dos factores y el cifrado están activados, sin acceso a secretos."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Saber cuándo inicias sesión",
|
||||
"body": "Recibir un aviso cuando inicias sesión, cambias de cuenta o se renueva tu sesión."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Cerrar tu sesión",
|
||||
"body": "Cerrar tu sesión en el webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Ver tus cuentas",
|
||||
"body": "Ver las cuentas que añadiste, con sus direcciones y servidores."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Usar el servidor del webmail por ti",
|
||||
"body": "Llamar a estos endpoints del servidor con tu inicio de sesión:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Conectarse a otros sitios web",
|
||||
"body": "Enviar solicitudes a estos sitios. Todo lo que el complemento pueda leer se puede enviar allí:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Leer su configuración de tu administrador",
|
||||
"body": "Leer la configuración que tu administrador guardó para este complemento."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Seguir dónde estás en la aplicación",
|
||||
"body": "Saber qué página está abierta y reaccionar a los enlaces en los que haces clic."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Añadir botones a la barra de herramientas del mensaje",
|
||||
"body": "Mostrar sus propios botones encima de un mensaje abierto."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Mostrar un banner arriba",
|
||||
"body": "Mostrar un aviso a lo ancho de la parte superior de la aplicación."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Mostrar avisos en los mensajes",
|
||||
"body": "Mostrar un aviso encima del texto de un mensaje abierto."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Añadir contenido debajo de los mensajes",
|
||||
"body": "Mostrar su propio contenido debajo de un mensaje abierto."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Mostrar las claves de cifrado de los contactos",
|
||||
"body": "Mostrar y gestionar las claves de cifrado de un contacto."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Añadir paneles a los detalles del mensaje",
|
||||
"body": "Mostrar su propio panel junto a un mensaje abierto o debajo de él."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Guardar archivos en tu dispositivo",
|
||||
"body": "Ofrecer para descargar archivos que creó."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Añadir pestañas a tu bandeja de entrada",
|
||||
"body": "Ordenar tu bandeja de entrada en pestañas como Novedades o Promociones."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Añadir botones al editor",
|
||||
"body": "Mostrar sus propios botones mientras escribes un mensaje."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Añadir un panel al editor",
|
||||
"body": "Mostrar su propio panel junto al mensaje que escribes."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Añadir un recuadro a la barra lateral",
|
||||
"body": "Mostrar su propio contenido en la barra lateral del correo."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Añadir una página de configuración",
|
||||
"body": "Mostrar su propia página en Configuración."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Añadir al menú del mensaje",
|
||||
"body": "Añadir entradas al menú que se abre al hacer clic derecho en un mensaje."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Añadir a la barra de navegación",
|
||||
"body": "Mostrar su propio botón en la barra de navegación."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Añadir atajos de teclado",
|
||||
"body": "Reaccionar a los atajos de teclado que define."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Añadir botones a los eventos",
|
||||
"body": "Mostrar sus propios botones cuando creas o editas un evento."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Añadir una página de administración",
|
||||
"body": "Mostrar su propia página en la configuración de administración."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Saber cuándo se inicia y se cierra la aplicación",
|
||||
"body": "Recibir un aviso cuando la aplicación se inicia, se queda sin conexión o cierras sesión."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "احراز هویت ناموفق بود: {error}",
|
||||
"missing_params": "کد احراز هویت یا حالت وجود ندارد.",
|
||||
"delivery_failed": "نتیجه احراز هویت به برگه برنامه ارسال نشد. لطفاً این پنجره را ببندید و دوباره تلاش کنید."
|
||||
},
|
||||
"settings": {
|
||||
"title": "افزونهها",
|
||||
"description": "افزونههایی که مدیر سیستم اضافه کرده است. آنها را برای حساب خود روشن یا خاموش کنید.",
|
||||
"description_uploads": "افزونهها قابلیتهایی به ایمیل تحت وب اضافه میکنند. آنها را برای حساب خود روشن یا خاموش کنید، یا افزونه خودتان را نصب کنید.",
|
||||
"description_demo": "افزونهها در نسخه آزمایشی در دسترس نیستند.",
|
||||
"install_button": "نصب افزونه",
|
||||
"install_hint": "یک فایل ZIP افزونه انتخاب کنید.",
|
||||
"install_hint_approval": "یک فایل ZIP افزونه انتخاب کنید. پیش از آنکه بتوانید آن را روشن کنید، مدیر سیستم باید آن را تأیید کند.",
|
||||
"install_uploads_off": "مدیر سیستم اجازه نصب افزونه را نمیدهد.",
|
||||
"install_managed_id": "مدیر سیستم از قبل افزونهای با این نام ارائه میدهد، بنابراین نمیتوان آن را جایگزین کرد.",
|
||||
"install_invalid": "این فایل افزونهای قابل نصب نیست: {details}",
|
||||
"toast_installed": "افزونه نصب شد. آن را در پایین روشن کنید.",
|
||||
"toast_installed_pending": "افزونه نصب شد و برای تأیید به مدیر سیستم ارسال شد.",
|
||||
"toast_enabled": "{name} روشن است",
|
||||
"toast_disabled": "{name} خاموش است",
|
||||
"toast_removed": "{name} حذف شد",
|
||||
"toast_forced": "مدیر سیستم {name} را روشن نگه میدارد",
|
||||
"toast_approval_requested": "{name} در انتظار تأیید مدیر سیستم است",
|
||||
"empty_title": "هنوز افزونهای وجود ندارد",
|
||||
"empty_admin": "مدیر سیستم هیچ افزونهای اضافه نکرده است.",
|
||||
"empty_uploads": "برای شروع، یک افزونه را از فایل ZIP نصب کنید.",
|
||||
"empty_demo": "افزونهها به یک حساب واقعی نیاز دارند، بنابراین نسخه آزمایشی هیچ افزونهای ندارد.",
|
||||
"syncing": "در حال بررسی افزونهها با سرور…",
|
||||
"status_installed": "خاموش",
|
||||
"status_enabled": "در حال راهاندازی",
|
||||
"status_running": "روشن",
|
||||
"status_disabled": "خاموش",
|
||||
"status_error": "مشکل",
|
||||
"badge_forced": "الزامی",
|
||||
"badge_managed": "از طرف مدیر سیستم",
|
||||
"badge_yours": "نصبشده توسط شما",
|
||||
"badge_awaiting": "در انتظار تأیید",
|
||||
"toggle_label": "روشن یا خاموش کردن {name}",
|
||||
"forced_note": "مدیر سیستم این افزونه را الزامی کرده است، بنابراین نمیتوان آن را خاموش کرد.",
|
||||
"permissions": "چه کارهایی میتواند انجام دهد",
|
||||
"permissions_managed": "چه کارهایی میتواند انجام دهد (تأییدشده توسط مدیر سیستم)",
|
||||
"settings": "تنظیمات",
|
||||
"remove": "حذف",
|
||||
"remove_title": "{name} حذف شود؟",
|
||||
"remove_message": "افزونه و هر چیزی که در این مرورگر ذخیره کرده است پاک میشود. بعداً میتوانید دوباره آن را نصب کنید.",
|
||||
"remove_confirm": "حذف",
|
||||
"error_user_plugins_off": "مدیر سیستم افزونههایی را که کاربران نصب میکنند خاموش کرده است، بنابراین این افزونه اجرا نمیشود.",
|
||||
"error_approval_unavailable": "این افزونه پیش از الزامی شدن تأیید نصب شده است. آن را حذف و دوباره نصب کنید تا برای تأیید ارسال شود.",
|
||||
"error_approval_denied": "مدیر سیستم این افزونه را تأیید نکرد.",
|
||||
"error_approval_pending": "در انتظار تأیید این افزونه توسط مدیر سیستم."
|
||||
},
|
||||
"consent": {
|
||||
"title": "به {name} اجازه این کار داده شود؟",
|
||||
"intro": "این افزونه مجوزهای زیر را درخواست میکند. فقط در صورتی آنها را دریافت میکند که شما اجازه دهید.",
|
||||
"high_risk_note": "موارد علامتدار به افزونه اجازه دسترسی به محتوای ایمیلهای شما یا ارسال داده به جای دیگر را میدهند. فقط برای افزونههایی که به آنها اعتماد دارید اجازه دهید.",
|
||||
"revoke_hint": "هر زمان میتوانید افزونه را در تنظیمات خاموش یا حذف کنید.",
|
||||
"deny": "اجازه نده",
|
||||
"allow": "اجازه بده"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "به هیچ مجوز خاصی نیاز ندارد.",
|
||||
"high_risk": "نیازمند احتیاط",
|
||||
"email_read": {
|
||||
"title": "خواندن ایمیلهای شما",
|
||||
"body": "دیدن فرستندگان، گیرندگان، موضوعها و متن کامل پیامهایی که باز میکنید و فهرست پیامها."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "تغییر برچسبها و پرچمهای ایمیلهای شما",
|
||||
"body": "افزودن یا حذف برچسبها، پرچمها و کلیدواژههای دیگر روی پیامهای شما."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "تغییر ایمیل پیش از ارسال",
|
||||
"body": "خواندن و تغییر گیرندگان، موضوع، متن و پیوستهای پیامهایی که مینویسید، و جلوگیری از ارسال یک پیام."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "دسترسی کامل به این برنامه",
|
||||
"body": "با همان دسترسیهای خود ایمیل تحت وب اجرا میشود. میتواند همه ایمیلها و کلیدهای ذخیرهشده شما را بخواند و از طرف شما عمل کند. فقط برای افزونههایی که کاملاً به آنها اعتماد دارید اجازه دهید."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "ارسال پیامهایی که خودش ساخته است",
|
||||
"body": "ارسال پیامهای کامل، مثلاً امضاشده یا رمزنگاریشده، از حساب شما."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "خواندن محتوای خام پیامها",
|
||||
"body": "خواندن دادههای اصلی پیامها و پیوستهای شما، و هر فایلی که پیش از ارسال پیوست میکنید."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "جایگزینی پیوستها پیش از ارسال",
|
||||
"body": "بارگذاری فایل در سرور ایمیل شما و جایگزینی فایلی که پیوست کردهاید با فایلی دیگر، پیش از ارسال پیام."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "تغییر نحوه نمایش پیامها",
|
||||
"body": "جایگزینی متن پیامهایی که باز میکنید و فهرست پیامها، مثلاً برای نمایش محتوای رمزگشاییشده."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "خواندن تقویم شما",
|
||||
"body": "دیدن تقویمها و رویدادهای شما."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "تغییر تقویم شما",
|
||||
"body": "ایجاد، تغییر و حذف رویدادها."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "خواندن مخاطبان شما",
|
||||
"body": "جستوجو و خواندن دفترچههای آدرس شما."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "تغییر مخاطبان شما",
|
||||
"body": "ایجاد، تغییر و حذف مخاطبان و دفترچههای آدرس."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "خواندن فایلهای شما",
|
||||
"body": "مرور و باز کردن فایلهای ذخیرهشده در حساب شما."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "تغییر فایلهای شما",
|
||||
"body": "بارگذاری، تغییر نام، جابهجایی و حذف فایلها در حساب شما."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "دیدن آدرسهای فرستنده شما",
|
||||
"body": "دیدن آدرسهایی که از آنها ایمیل میفرستید و امضاهای آنها."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "تغییر آدرسهای فرستنده شما",
|
||||
"body": "ایجاد، تغییر و حذف آدرسهای فرستنده و امضاها."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "خواندن فیلترهای ایمیل شما",
|
||||
"body": "دیدن قوانینی که ایمیلهای ورودی شما را مرتب میکنند."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "تغییر فیلترهای ایمیل شما",
|
||||
"body": "افزودن قانون به فیلترهای سمت سرور. این قوانین میتوانند ایمیلهای ورودی را جابهجا، هدایت یا حذف کنند."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "خواندن کارهای شما",
|
||||
"body": "دیدن فهرستهای کار و کارهای شما."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "تغییر کارهای شما",
|
||||
"body": "ایجاد، تغییر، تکمیل و حذف کارها."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "خواندن قالبهای شما",
|
||||
"body": "دیدن قالبهای پیام ذخیرهشده شما."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "تغییر قالبهای شما",
|
||||
"body": "ایجاد، تغییر و حذف قالبهای پیام."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "دیدن وضعیت S/MIME شما",
|
||||
"body": "دیدن اینکه آیا کلیدها و گواهیهای S/MIME دارید، بدون دسترسی به کلیدها."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "دیدن پاسخ خودکار شما",
|
||||
"body": "دیدن اینکه آیا پاسخ خودکار شما روشن است و چه متنی دارد."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "تغییر پاسخ خودکار شما",
|
||||
"body": "روشن یا خاموش کردن پاسخ خودکار و تغییر متن و تاریخهای آن."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "خواندن تنظیمات شما",
|
||||
"body": "دیدن ترجیحات و تعریف برچسبهای شما."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "تغییر تنظیمات شما",
|
||||
"body": "افزودن و مرتب کردن برچسبها و تغییر ترجیحات شما."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "دیدن امنیت حساب شما",
|
||||
"body": "دیدن اینکه آیا احراز هویت دو مرحلهای و رمزنگاری روشن هستند، بدون دسترسی به اطلاعات محرمانه."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "باخبر شدن از ورود شما",
|
||||
"body": "باخبر شدن وقتی وارد میشوید، حساب را عوض میکنید یا نشست شما تمدید میشود."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "خارج کردن شما از حساب",
|
||||
"body": "خارج کردن شما از ایمیل تحت وب."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "دیدن حسابهای شما",
|
||||
"body": "دیدن حسابهایی که اضافه کردهاید، همراه با آدرسها و سرورهای آنها."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "استفاده از سرور ایمیل تحت وب از طرف شما",
|
||||
"body": "فراخوانی این نقاط پایانی سرور با اطلاعات ورود شما:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "اتصال به وبسایتهای دیگر",
|
||||
"body": "ارسال درخواست به این سایتها. هر چیزی که افزونه بتواند بخواند ممکن است به آنجا ارسال شود:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "خواندن تنظیمات خود از مدیر سیستم",
|
||||
"body": "خواندن تنظیماتی که مدیر سیستم برای این افزونه ذخیره کرده است."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "دنبال کردن جای شما در برنامه",
|
||||
"body": "دانستن اینکه کدام صفحه باز است و واکنش به پیوندهایی که روی آنها کلیک میکنید."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "افزودن دکمه به نوار ابزار پیام",
|
||||
"body": "نمایش دکمههای خودش بالای پیام باز."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "نمایش بنر در بالا",
|
||||
"body": "نمایش یک اطلاعیه در سراسر بالای برنامه."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "نمایش اطلاعیه روی پیامها",
|
||||
"body": "نمایش یک اطلاعیه بالای متن پیام باز."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "افزودن محتوا زیر پیامها",
|
||||
"body": "نمایش محتوای خودش زیر پیام باز."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "نمایش کلیدهای رمزنگاری مخاطبان",
|
||||
"body": "نمایش و مدیریت کلیدهای رمزنگاری یک مخاطب."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "افزودن پنل به جزئیات پیام",
|
||||
"body": "نمایش پنل خودش کنار یا زیر پیام باز."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "ذخیره فایل در دستگاه شما",
|
||||
"body": "ارائه فایلهایی که خودش ساخته است برای دانلود."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "افزودن برگه به صندوق ورودی",
|
||||
"body": "مرتب کردن صندوق ورودی شما در برگههایی مانند بهروزرسانیها یا تبلیغات."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "افزودن دکمه به ویرایشگر",
|
||||
"body": "نمایش دکمههای خودش هنگام نوشتن پیام."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "افزودن پنل به ویرایشگر",
|
||||
"body": "نمایش پنل خودش کنار پیامی که مینویسید."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "افزودن کادر به نوار کناری",
|
||||
"body": "نمایش محتوای خودش در نوار کناری ایمیل."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "افزودن صفحه تنظیمات",
|
||||
"body": "نمایش صفحه خودش در تنظیمات."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "افزودن به منوی پیام",
|
||||
"body": "افزودن گزینه به منویی که با کلیک راست روی پیام باز میشود."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "افزودن به نوار ناوبری",
|
||||
"body": "نمایش دکمه خودش در نوار ناوبری."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "افزودن میانبرهای صفحه کلید",
|
||||
"body": "واکنش به میانبرهای صفحه کلیدی که خودش تعریف میکند."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "افزودن دکمه به رویدادها",
|
||||
"body": "نمایش دکمههای خودش هنگام ایجاد یا ویرایش رویداد."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "افزودن صفحه مدیریت",
|
||||
"body": "نمایش صفحه خودش در تنظیمات مدیریت."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "باخبر شدن از شروع و توقف برنامه",
|
||||
"body": "باخبر شدن وقتی برنامه شروع میشود، آفلاین میشود یا از حساب خارج میشوید."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Échec de lautorisation : {error}",
|
||||
"missing_params": "Code dautorisation ou état manquant.",
|
||||
"delivery_failed": "Le résultat de lautorisation na pas pu être transmis à longlet de lapplication. Fermez cette fenêtre et réessayez."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugins",
|
||||
"description": "Les plugins ajoutés par votre administrateur. Activez-les ou désactivez-les pour votre compte.",
|
||||
"description_uploads": "Les plugins ajoutent des fonctionnalités au webmail. Activez-les ou désactivez-les pour votre compte, ou installez les vôtres.",
|
||||
"description_demo": "Les plugins ne sont pas disponibles dans la démo.",
|
||||
"install_button": "Installer un plugin",
|
||||
"install_hint": "Choisissez le fichier ZIP d'un plugin.",
|
||||
"install_hint_approval": "Choisissez le fichier ZIP d'un plugin. Un administrateur doit l'approuver avant que vous puissiez l'activer.",
|
||||
"install_uploads_off": "Votre administrateur n'autorise pas l'installation de plugins.",
|
||||
"install_managed_id": "Votre administrateur fournit déjà un plugin portant ce nom, il ne peut donc pas être remplacé.",
|
||||
"install_invalid": "Ce fichier n'est pas un plugin installable : {details}",
|
||||
"toast_installed": "Plugin installé. Activez-le ci-dessous.",
|
||||
"toast_installed_pending": "Plugin installé et envoyé à votre administrateur pour approbation.",
|
||||
"toast_enabled": "{name} est activé",
|
||||
"toast_disabled": "{name} est désactivé",
|
||||
"toast_removed": "{name} a été supprimé",
|
||||
"toast_forced": "Votre administrateur maintient {name} activé",
|
||||
"toast_approval_requested": "{name} attend l'approbation de votre administrateur",
|
||||
"empty_title": "Aucun plugin pour l'instant",
|
||||
"empty_admin": "Votre administrateur n'a ajouté aucun plugin.",
|
||||
"empty_uploads": "Installez un plugin à partir d'un fichier ZIP pour commencer.",
|
||||
"empty_demo": "Les plugins nécessitent un vrai compte, la démo n'en a donc aucun.",
|
||||
"syncing": "Vérification des plugins auprès du serveur…",
|
||||
"status_installed": "Désactivé",
|
||||
"status_enabled": "Démarrage",
|
||||
"status_running": "Activé",
|
||||
"status_disabled": "Désactivé",
|
||||
"status_error": "Problème",
|
||||
"badge_forced": "Obligatoire",
|
||||
"badge_managed": "De votre administrateur",
|
||||
"badge_yours": "Installé par vous",
|
||||
"badge_awaiting": "En attente d'approbation",
|
||||
"toggle_label": "Activer ou désactiver {name}",
|
||||
"forced_note": "Votre administrateur impose ce plugin, il ne peut donc pas être désactivé.",
|
||||
"permissions": "Ce qu'il peut faire",
|
||||
"permissions_managed": "Ce qu'il peut faire (approuvé par votre administrateur)",
|
||||
"settings": "Paramètres",
|
||||
"remove": "Supprimer",
|
||||
"remove_title": "Supprimer {name} ?",
|
||||
"remove_message": "Le plugin et tout ce qu'il a enregistré dans ce navigateur seront supprimés. Vous pourrez le réinstaller plus tard.",
|
||||
"remove_confirm": "Supprimer",
|
||||
"error_user_plugins_off": "Votre administrateur a désactivé les plugins installés par les utilisateurs, ce plugin ne s'exécute donc pas.",
|
||||
"error_approval_unavailable": "Ce plugin a été installé avant que l'approbation soit requise. Supprimez-le et réinstallez-le pour l'envoyer en approbation.",
|
||||
"error_approval_denied": "Votre administrateur n'a pas approuvé ce plugin.",
|
||||
"error_approval_pending": "En attente de l'approbation de ce plugin par votre administrateur."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Autoriser {name} à faire ceci ?",
|
||||
"intro": "Le plugin demande les autorisations ci-dessous. Il ne les obtient que si vous les accordez.",
|
||||
"high_risk_note": "Les éléments signalés donnent au plugin accès au contenu de vos e-mails ou lui permettent d'envoyer des données ailleurs. Ne les autorisez que pour des plugins de confiance.",
|
||||
"revoke_hint": "Vous pouvez désactiver ou supprimer le plugin à tout moment dans les Paramètres.",
|
||||
"deny": "Ne pas autoriser",
|
||||
"allow": "Autoriser"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Il n'a besoin d'aucune autorisation particulière.",
|
||||
"high_risk": "Prudence",
|
||||
"email_read": {
|
||||
"title": "Lire vos e-mails",
|
||||
"body": "Voir les expéditeurs, les destinataires, les objets et le texte complet des messages que vous ouvrez et de la liste des messages."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Modifier les étiquettes et indicateurs de vos e-mails",
|
||||
"body": "Ajouter ou retirer des étiquettes, des indicateurs et d'autres mots-clés sur vos messages."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Modifier les e-mails avant leur envoi",
|
||||
"body": "Lire et modifier les destinataires, l'objet, le texte et les pièces jointes des messages que vous rédigez, et empêcher l'envoi d'un message."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Accès complet à cette application",
|
||||
"body": "S'exécute avec les mêmes droits que le webmail lui-même. Il peut lire tous vos e-mails et vos clés enregistrées, et agir en votre nom. N'autorisez ceci que pour des plugins en qui vous avez entièrement confiance."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Envoyer des messages qu'il a lui-même créés",
|
||||
"body": "Envoyer des messages complets, par exemple signés ou chiffrés, depuis votre compte."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Lire le contenu brut des messages",
|
||||
"body": "Lire les données d'origine de vos messages et pièces jointes, ainsi que de chaque fichier que vous joignez avant l'envoi."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Remplacer les pièces jointes avant l'envoi",
|
||||
"body": "Téléverser des fichiers sur votre serveur de messagerie et remplacer un fichier joint par un autre avant l'envoi du message."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Modifier l'affichage des messages",
|
||||
"body": "Remplacer le texte des messages que vous ouvrez et de la liste des messages, par exemple pour afficher un contenu déchiffré."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Lire votre calendrier",
|
||||
"body": "Voir vos calendriers et leurs événements."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Modifier votre calendrier",
|
||||
"body": "Créer, modifier et supprimer des événements."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Lire vos contacts",
|
||||
"body": "Rechercher et lire vos carnets d'adresses."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Modifier vos contacts",
|
||||
"body": "Créer, modifier et supprimer des contacts et des carnets d'adresses."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Lire vos fichiers",
|
||||
"body": "Parcourir et ouvrir les fichiers stockés dans votre compte."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Modifier vos fichiers",
|
||||
"body": "Téléverser, renommer, déplacer et supprimer des fichiers dans votre compte."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Voir vos adresses d'expéditeur",
|
||||
"body": "Voir les adresses depuis lesquelles vous envoyez et leurs signatures."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Modifier vos adresses d'expéditeur",
|
||||
"body": "Créer, modifier et supprimer des adresses d'expéditeur et des signatures."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Lire vos filtres de messagerie",
|
||||
"body": "Voir les règles qui trient vos e-mails entrants."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Modifier vos filtres de messagerie",
|
||||
"body": "Ajouter des règles à vos filtres côté serveur. Ces règles peuvent déplacer, transférer ou supprimer les e-mails entrants."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Lire vos tâches",
|
||||
"body": "Voir vos listes de tâches et vos tâches."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Modifier vos tâches",
|
||||
"body": "Créer, modifier, terminer et supprimer des tâches."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Lire vos modèles",
|
||||
"body": "Voir vos modèles de message enregistrés."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Modifier vos modèles",
|
||||
"body": "Créer, modifier et supprimer des modèles de message."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Voir votre statut S/MIME",
|
||||
"body": "Voir si vous avez des clés et certificats S/MIME, sans accès aux clés."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Voir votre réponse d'absence",
|
||||
"body": "Voir si votre réponse automatique est activée et ce qu'elle dit."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Modifier votre réponse d'absence",
|
||||
"body": "Activer ou désactiver votre réponse automatique et modifier son texte et ses dates."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Lire vos paramètres",
|
||||
"body": "Voir vos préférences et la définition de vos étiquettes."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Modifier vos paramètres",
|
||||
"body": "Ajouter et réordonner des étiquettes et modifier vos préférences."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Voir la sécurité de votre compte",
|
||||
"body": "Voir si la connexion à deux facteurs et le chiffrement sont activés, sans accès aux secrets."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Savoir quand vous vous connectez",
|
||||
"body": "Être averti lorsque vous vous connectez, changez de compte ou que votre session est renouvelée."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Vous déconnecter",
|
||||
"body": "Vous déconnecter du webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Voir vos comptes",
|
||||
"body": "Voir les comptes que vous avez ajoutés, avec leurs adresses et leurs serveurs."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Utiliser le serveur du webmail pour vous",
|
||||
"body": "Appeler ces points de terminaison du serveur avec votre connexion :"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Se connecter à d'autres sites web",
|
||||
"body": "Envoyer des requêtes à ces sites. Tout ce que le plugin peut lire peut y être envoyé :"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Lire ses paramètres définis par votre administrateur",
|
||||
"body": "Lire les paramètres que votre administrateur a enregistrés pour ce plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Suivre où vous êtes dans l'application",
|
||||
"body": "Savoir quelle page est ouverte et réagir aux liens sur lesquels vous cliquez."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Ajouter des boutons à la barre d'outils des messages",
|
||||
"body": "Afficher ses propres boutons au-dessus d'un message ouvert."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Afficher une bannière en haut",
|
||||
"body": "Afficher un avis sur toute la largeur en haut de l'application."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Afficher des avis sur les messages",
|
||||
"body": "Afficher un avis au-dessus du texte d'un message ouvert."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Ajouter du contenu sous les messages",
|
||||
"body": "Afficher son propre contenu sous un message ouvert."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Afficher les clés de chiffrement des contacts",
|
||||
"body": "Afficher et gérer les clés de chiffrement d'un contact."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Ajouter des panneaux aux détails des messages",
|
||||
"body": "Afficher son propre panneau à côté ou en dessous d'un message ouvert."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Enregistrer des fichiers sur votre appareil",
|
||||
"body": "Proposer au téléchargement des fichiers qu'il a créés."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Ajouter des onglets à votre boîte de réception",
|
||||
"body": "Répartir votre boîte de réception en onglets comme Mises à jour ou Promotions."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Ajouter des boutons à l'éditeur",
|
||||
"body": "Afficher ses propres boutons pendant que vous rédigez un message."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Ajouter un panneau à l'éditeur",
|
||||
"body": "Afficher son propre panneau à côté du message que vous rédigez."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Ajouter un encadré à la barre latérale",
|
||||
"body": "Afficher son propre contenu dans la barre latérale de la messagerie."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Ajouter une page de paramètres",
|
||||
"body": "Afficher sa propre page dans les Paramètres."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Ajouter au menu des messages",
|
||||
"body": "Ajouter des entrées au menu qui s'ouvre lorsque vous faites un clic droit sur un message."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Ajouter à la barre de navigation",
|
||||
"body": "Afficher son propre bouton dans la barre de navigation."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Ajouter des raccourcis clavier",
|
||||
"body": "Réagir aux raccourcis clavier qu'il définit."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Ajouter des boutons aux événements",
|
||||
"body": "Afficher ses propres boutons lorsque vous créez ou modifiez un événement."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Ajouter une page d'administration",
|
||||
"body": "Afficher sa propre page dans les paramètres d'administration."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Savoir quand l'application démarre et s'arrête",
|
||||
"body": "Être averti lorsque l'application démarre, passe hors ligne ou que vous vous déconnectez."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3971,6 +3971,276 @@
|
||||
"failed_detail": "האימות נכשל: {error}",
|
||||
"missing_params": "חסר קוד אימות או מצב.",
|
||||
"delivery_failed": "לא ניתן היה למסור את תוצאת האימות לכרטיסיית האפליקציה. סגרו חלון זה ונסו שוב."
|
||||
},
|
||||
"settings": {
|
||||
"title": "תוספים",
|
||||
"description": "תוספים שמנהל המערכת הוסיף. הפעילו או כבו אותם עבור החשבון שלכם.",
|
||||
"description_uploads": "תוספים מוסיפים יכולות ל-Webmail. הפעילו או כבו אותם עבור החשבון שלכם, או התקינו תוספים משלכם.",
|
||||
"description_demo": "תוספים אינם זמינים במצב הדגמה.",
|
||||
"install_button": "התקנת תוסף",
|
||||
"install_hint": "בחרו קובץ ZIP של תוסף.",
|
||||
"install_hint_approval": "בחרו קובץ ZIP של תוסף. מנהל המערכת צריך לאשר אותו לפני שתוכלו להפעיל אותו.",
|
||||
"install_uploads_off": "מנהל המערכת אינו מאפשר התקנת תוספים.",
|
||||
"install_managed_id": "מנהל המערכת כבר מספק תוסף בשם הזה, ולכן אי אפשר להחליף אותו.",
|
||||
"install_invalid": "הקובץ הזה אינו תוסף שניתן להתקין: {details}",
|
||||
"toast_installed": "התוסף הותקן. הפעילו אותו למטה.",
|
||||
"toast_installed_pending": "התוסף הותקן ונשלח לאישור מנהל המערכת.",
|
||||
"toast_enabled": "{name} פועל",
|
||||
"toast_disabled": "{name} כבוי",
|
||||
"toast_removed": "{name} הוסר",
|
||||
"toast_forced": "מנהל המערכת משאיר את {name} פועל",
|
||||
"toast_approval_requested": "{name} ממתין לאישור מנהל המערכת",
|
||||
"empty_title": "אין עדיין תוספים",
|
||||
"empty_admin": "מנהל המערכת לא הוסיף תוספים.",
|
||||
"empty_uploads": "כדי להתחיל, התקינו תוסף מקובץ ZIP.",
|
||||
"empty_demo": "תוספים דורשים חשבון אמיתי, ולכן אין תוספים במצב הדגמה.",
|
||||
"syncing": "בודק תוספים מול השרת…",
|
||||
"status_installed": "כבוי",
|
||||
"status_enabled": "בהפעלה",
|
||||
"status_running": "פועל",
|
||||
"status_disabled": "כבוי",
|
||||
"status_error": "תקלה",
|
||||
"badge_forced": "חובה",
|
||||
"badge_managed": "ממנהל המערכת",
|
||||
"badge_yours": "הותקן על ידיכם",
|
||||
"badge_awaiting": "ממתין לאישור",
|
||||
"toggle_label": "הפעלה או כיבוי של {name}",
|
||||
"forced_note": "מנהל המערכת מחייב את התוסף הזה, ולכן אי אפשר לכבות אותו.",
|
||||
"permissions": "מה הוא יכול לעשות",
|
||||
"permissions_managed": "מה הוא יכול לעשות (באישור מנהל המערכת)",
|
||||
"settings": "הגדרות",
|
||||
"remove": "הסרה",
|
||||
"remove_title": "להסיר את {name}?",
|
||||
"remove_message": "התוסף וכל מה שהוא שמר בדפדפן הזה יימחקו. אפשר להתקין אותו שוב מאוחר יותר.",
|
||||
"remove_confirm": "הסרה",
|
||||
"error_user_plugins_off": "מנהל המערכת כיבה תוספים שמשתמשים התקינו, ולכן התוסף הזה לא פועל.",
|
||||
"error_approval_unavailable": "התוסף הזה הותקן לפני שנדרש אישור. הסירו אותו והתקינו אותו מחדש כדי לשלוח אותו לאישור.",
|
||||
"error_approval_denied": "מנהל המערכת לא אישר את התוסף הזה.",
|
||||
"error_approval_pending": "ממתין לאישור התוסף הזה על ידי מנהל המערכת."
|
||||
},
|
||||
"consent": {
|
||||
"title": "לאפשר ל-{name} לעשות זאת?",
|
||||
"intro": "התוסף מבקש את ההרשאות שלהלן. הוא יקבל אותן רק אם תאפשרו זאת.",
|
||||
"high_risk_note": "פריטים מסומנים נותנים לתוסף גישה לתוכן הדואר שלכם או מאפשרים לו לשלוח נתונים למקום אחר. אפשרו אותם רק לתוספים שאתם סומכים עליהם.",
|
||||
"revoke_hint": "אפשר לכבות את התוסף או להסיר אותו בהגדרות בכל עת.",
|
||||
"deny": "לא לאפשר",
|
||||
"allow": "לאפשר"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "אינו צריך הרשאות מיוחדות.",
|
||||
"high_risk": "דורש זהירות",
|
||||
"email_read": {
|
||||
"title": "קריאת הדואר שלכם",
|
||||
"body": "צפייה בשולחים, בנמענים, בנושאים ובטקסט המלא של הודעות שאתם פותחים ושל רשימת ההודעות."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "שינוי תגים וסימונים בדואר שלכם",
|
||||
"body": "הוספה או הסרה של תגים, סימונים ומילות מפתח אחרות בהודעות שלכם."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "שינוי דואר לפני שליחתו",
|
||||
"body": "קריאה ושינוי של הנמענים, הנושא, הטקסט והקבצים המצורפים של הודעות שאתם כותבים, ומניעת שליחה של הודעה."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "גישה מלאה לאפליקציה הזו",
|
||||
"body": "פועל עם אותן הרשאות כמו ה-Webmail עצמו. הוא יכול לקרוא את כל הדואר והמפתחות השמורים שלכם ולפעול בשמכם. אפשרו זאת רק לתוספים שאתם סומכים עליהם לגמרי."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "שליחת הודעות שהוא בנה בעצמו",
|
||||
"body": "שליחת הודעות שלמות, למשל חתומות או מוצפנות, מהחשבון שלכם."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "קריאת התוכן הגולמי של הודעות",
|
||||
"body": "קריאת הנתונים המקוריים של ההודעות והקבצים המצורפים שלכם, ושל כל קובץ שאתם מצרפים לפני שליחתו."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "החלפת קבצים מצורפים לפני שליחה",
|
||||
"body": "העלאת קבצים לשרת הדואר שלכם והחלפת קובץ שצירפתם בקובץ אחר לפני שההודעה נשלחת."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "שינוי אופן הצגת ההודעות",
|
||||
"body": "החלפת הטקסט של הודעות שאתם פותחים ושל רשימת ההודעות, למשל כדי להציג תוכן מפוענח."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "קריאת היומן שלכם",
|
||||
"body": "צפייה ביומנים שלכם ובאירועים שבהם."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "שינוי היומן שלכם",
|
||||
"body": "יצירה, שינוי ומחיקה של אירועים."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "קריאת אנשי הקשר שלכם",
|
||||
"body": "חיפוש וקריאה בספרי הכתובות שלכם."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "שינוי אנשי הקשר שלכם",
|
||||
"body": "יצירה, שינוי ומחיקה של אנשי קשר וספרי כתובות."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "קריאת הקבצים שלכם",
|
||||
"body": "עיון בקבצים השמורים בחשבון שלכם ופתיחתם."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "שינוי הקבצים שלכם",
|
||||
"body": "העלאה, שינוי שם, העברה ומחיקה של קבצים בחשבון שלכם."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "צפייה בכתובות השולח שלכם",
|
||||
"body": "צפייה בכתובות שמהן אתם שולחים ובחתימות שלהן."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "שינוי כתובות השולח שלכם",
|
||||
"body": "יצירה, שינוי ומחיקה של כתובות שולח וחתימות."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "קריאת מסנני הדואר שלכם",
|
||||
"body": "צפייה בכללים שממיינים את הדואר הנכנס שלכם."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "שינוי מסנני הדואר שלכם",
|
||||
"body": "הוספת כללים למסננים בצד השרת. כללים כאלה יכולים להעביר לתיקייה, להעביר הלאה או למחוק דואר נכנס."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "קריאת המשימות שלכם",
|
||||
"body": "צפייה ברשימות המשימות ובמשימות שלכם."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "שינוי המשימות שלכם",
|
||||
"body": "יצירה, שינוי, השלמה ומחיקה של משימות."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "קריאת התבניות שלכם",
|
||||
"body": "צפייה בתבניות ההודעה השמורות שלכם."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "שינוי התבניות שלכם",
|
||||
"body": "יצירה, שינוי ומחיקה של תבניות הודעה."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "צפייה במצב S/MIME שלכם",
|
||||
"body": "בדיקה אם יש לכם מפתחות ואישורי S/MIME, ללא גישה למפתחות."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "צפייה בתשובת ההיעדרות שלכם",
|
||||
"body": "בדיקה אם התשובה האוטומטית שלכם פעילה ומה כתוב בה."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "שינוי תשובת ההיעדרות שלכם",
|
||||
"body": "הפעלה או כיבוי של התשובה האוטומטית ושינוי הטקסט והתאריכים שלה."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "קריאת ההגדרות שלכם",
|
||||
"body": "צפייה בהעדפות ובהגדרות התגים שלכם."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "שינוי ההגדרות שלכם",
|
||||
"body": "הוספה וסידור מחדש של תגים ושינוי ההעדפות שלכם."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "צפייה באבטחת החשבון שלכם",
|
||||
"body": "בדיקה אם אימות דו-שלבי והצפנה פעילים, ללא גישה לסודות."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "לדעת מתי אתם נכנסים",
|
||||
"body": "לקבל עדכון כשאתם נכנסים, מחליפים חשבון או כשההפעלה שלכם מתחדשת."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "ניתוק שלכם",
|
||||
"body": "ניתוק שלכם מה-Webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "צפייה בחשבונות שלכם",
|
||||
"body": "צפייה בחשבונות שהוספתם, עם הכתובות והשרתים שלהם."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "שימוש בשרת ה-Webmail בשמכם",
|
||||
"body": "פנייה לנקודות הקצה האלה בשרת עם פרטי ההתחברות שלכם:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "התחברות לאתרים אחרים",
|
||||
"body": "שליחת בקשות לאתרים האלה. כל מה שהתוסף יכול לקרוא עלול להישלח אליהם:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "קריאת ההגדרות שלו ממנהל המערכת",
|
||||
"body": "קריאת ההגדרות שמנהל המערכת שמר עבור התוסף הזה."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "מעקב אחר המיקום שלכם באפליקציה",
|
||||
"body": "לדעת איזה עמוד פתוח ולהגיב לקישורים שאתם לוחצים עליהם."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "הוספת כפתורים לסרגל הכלים של ההודעה",
|
||||
"body": "הצגת כפתורים משלו מעל הודעה פתוחה."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "הצגת באנר בחלק העליון",
|
||||
"body": "הצגת הודעה לרוחב החלק העליון של האפליקציה."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "הצגת הודעות על גבי הודעות דואר",
|
||||
"body": "הצגת הודעה מעל הטקסט של הודעה פתוחה."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "הוספת תוכן מתחת להודעות",
|
||||
"body": "הצגת תוכן משלו מתחת להודעה פתוחה."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "הצגת מפתחות הצפנה של אנשי קשר",
|
||||
"body": "הצגה וניהול של מפתחות ההצפנה של איש קשר."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "הוספת חלוניות לפרטי ההודעה",
|
||||
"body": "הצגת חלונית משלו לצד הודעה פתוחה או מתחתיה."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "שמירת קבצים במכשיר שלכם",
|
||||
"body": "הצעת קבצים שהוא יצר להורדה."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "הוספת לשוניות לדואר הנכנס",
|
||||
"body": "מיון הדואר הנכנס שלכם ללשוניות כמו עדכונים או קידומי מכירות."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "הוספת כפתורים לעורך",
|
||||
"body": "הצגת כפתורים משלו בזמן שאתם כותבים הודעה."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "הוספת חלונית לעורך",
|
||||
"body": "הצגת חלונית משלו לצד ההודעה שאתם כותבים."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "הוספת תיבה לסרגל הצד",
|
||||
"body": "הצגת תוכן משלו בסרגל הצד של הדואר."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "הוספת עמוד הגדרות",
|
||||
"body": "הצגת עמוד משלו בהגדרות."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "הוספה לתפריט ההודעה",
|
||||
"body": "הוספת פריטים לתפריט שנפתח בלחיצה ימנית על הודעה."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "הוספה לסרגל הניווט",
|
||||
"body": "הצגת כפתור משלו בסרגל הניווט."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "הוספת קיצורי מקשים",
|
||||
"body": "תגובה לקיצורי מקשים שהוא מגדיר."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "הוספת כפתורים לאירועים",
|
||||
"body": "הצגת כפתורים משלו כשאתם יוצרים או עורכים אירוע."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "הוספת עמוד ניהול",
|
||||
"body": "הצגת עמוד משלו בהגדרות הניהול."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "לדעת מתי האפליקציה מופעלת ונעצרת",
|
||||
"body": "לקבל עדכון כשהאפליקציה מופעלת, עוברת למצב לא מקוון או כשאתם מתנתקים."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "A hitelesítés sikertelen: {error}",
|
||||
"missing_params": "Hiányzik a hitelesítési kód vagy az állapot.",
|
||||
"delivery_failed": "A hitelesítés eredményét nem sikerült átadni az alkalmazás lapjának. Zárja be ezt az ablakot, és próbálja újra."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Bővítmények",
|
||||
"description": "A rendszergazda által hozzáadott bővítmények. A fiókodhoz be- vagy kikapcsolhatod őket.",
|
||||
"description_uploads": "A bővítmények új funkciókat adnak a webmailhez. A fiókodhoz be- vagy kikapcsolhatod őket, vagy telepíthetsz sajátot.",
|
||||
"description_demo": "A bővítmények nem érhetők el a demóban.",
|
||||
"install_button": "Bővítmény telepítése",
|
||||
"install_hint": "Válassz egy bővítményt tartalmazó ZIP-fájlt.",
|
||||
"install_hint_approval": "Válassz egy bővítményt tartalmazó ZIP-fájlt. Bekapcsolás előtt a rendszergazdának jóvá kell hagynia.",
|
||||
"install_uploads_off": "A rendszergazda nem engedélyezi bővítmények telepítését.",
|
||||
"install_managed_id": "A rendszergazda már biztosít egy ilyen nevű bővítményt, ezért nem cserélhető le.",
|
||||
"install_invalid": "Ez a fájl nem telepíthető bővítmény: {details}",
|
||||
"toast_installed": "Bővítmény telepítve. Lent kapcsolhatod be.",
|
||||
"toast_installed_pending": "Bővítmény telepítve, és jóváhagyásra elküldve a rendszergazdának.",
|
||||
"toast_enabled": "Bővítmény bekapcsolva: {name}",
|
||||
"toast_disabled": "Bővítmény kikapcsolva: {name}",
|
||||
"toast_removed": "Bővítmény eltávolítva: {name}",
|
||||
"toast_forced": "A rendszergazda bekapcsolva tartja ezt a bővítményt: {name}",
|
||||
"toast_approval_requested": "Rendszergazdai jóváhagyásra vár: {name}",
|
||||
"empty_title": "Még nincsenek bővítmények",
|
||||
"empty_admin": "A rendszergazda még nem adott hozzá bővítményt.",
|
||||
"empty_uploads": "Kezdésként telepíts egy bővítményt ZIP-fájlból.",
|
||||
"empty_demo": "A bővítményekhez valódi fiók kell, ezért a demóban nincsenek.",
|
||||
"syncing": "Bővítmények ellenőrzése a szerveren…",
|
||||
"status_installed": "Ki",
|
||||
"status_enabled": "Indítás",
|
||||
"status_running": "Be",
|
||||
"status_disabled": "Ki",
|
||||
"status_error": "Hiba",
|
||||
"badge_forced": "Kötelező",
|
||||
"badge_managed": "A rendszergazdától",
|
||||
"badge_yours": "Saját telepítés",
|
||||
"badge_awaiting": "Jóváhagyásra vár",
|
||||
"toggle_label": "Bővítmény be- vagy kikapcsolása: {name}",
|
||||
"forced_note": "A rendszergazda előírja ezt a bővítményt, ezért nem kapcsolható ki.",
|
||||
"permissions": "Mire képes",
|
||||
"permissions_managed": "Mire képes (a rendszergazda jóváhagyta)",
|
||||
"settings": "Beállítások",
|
||||
"remove": "Eltávolítás",
|
||||
"remove_title": "{name} eltávolítása?",
|
||||
"remove_message": "A bővítmény és minden, amit ebben a böngészőben tárolt, törlődik. Később újra telepítheted.",
|
||||
"remove_confirm": "Eltávolítás",
|
||||
"error_user_plugins_off": "A rendszergazda kikapcsolta a felhasználók által telepített bővítményeket, ezért ez a bővítmény nem fut.",
|
||||
"error_approval_unavailable": "Ezt a bővítményt még azelőtt telepítetted, hogy jóváhagyás kellett volna. Távolítsd el, majd telepítsd újra, hogy jóváhagyásra kerüljön.",
|
||||
"error_approval_denied": "A rendszergazda nem hagyta jóvá ezt a bővítményt.",
|
||||
"error_approval_pending": "Várakozás arra, hogy a rendszergazda jóváhagyja ezt a bővítményt."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name}: engedélyezed ezeket a műveleteket?",
|
||||
"intro": "A bővítmény az alábbi engedélyeket kéri. Csak akkor kapja meg őket, ha engedélyezed.",
|
||||
"high_risk_note": "A megjelölt elemek hozzáférést adnak a bővítménynek a leveleid tartalmához, vagy lehetővé teszik, hogy adatokat küldjön máshová. Csak megbízható bővítményeknek engedélyezd őket.",
|
||||
"revoke_hint": "A bővítményt bármikor kikapcsolhatod vagy eltávolíthatod a Beállításokban.",
|
||||
"deny": "Nem engedélyezem",
|
||||
"allow": "Engedélyezés"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Nincs szüksége különleges engedélyre.",
|
||||
"high_risk": "Óvatosan",
|
||||
"email_read": {
|
||||
"title": "Leveleid olvasása",
|
||||
"body": "Látja a megnyitott üzenetek és az üzenetlista feladóit, címzettjeit, tárgyát és teljes szövegét."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Címkék és jelölők módosítása a leveleiden",
|
||||
"body": "Címkéket, jelölőket és más kulcsszavakat ad hozzá az üzeneteidhez, vagy eltávolítja őket."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Levelek módosítása küldés előtt",
|
||||
"body": "Olvassa és módosítja az általad írt üzenetek címzettjeit, tárgyát, szövegét és mellékleteit, és megakadályozhatja egy üzenet elküldését."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Teljes hozzáférés az alkalmazáshoz",
|
||||
"body": "Ugyanazokkal a jogokkal fut, mint maga a webmail. Olvashatja az összes leveledet és tárolt kulcsodat, és a nevedben járhat el. Csak olyan bővítménynek engedélyezd, amelyben teljesen megbízol."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Saját maga által összeállított üzenetek küldése",
|
||||
"body": "Teljes üzeneteket küld a fiókodból, például aláírt vagy titkosított üzeneteket."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Üzenetek nyers tartalmának olvasása",
|
||||
"body": "Olvassa az üzeneteid és mellékleteid eredeti adatait, valamint minden fájlét, amelyet küldés előtt csatolsz."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Mellékletek cseréje küldés előtt",
|
||||
"body": "Fájlokat tölt fel a levelezőszerveredre, és az üzenet elküldése előtt egy csatolt fájlt másikra cserél."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Üzenetek megjelenítésének módosítása",
|
||||
"body": "Lecseréli a megnyitott üzenetek és az üzenetlista szövegét, például a visszafejtett tartalom megjelenítéséhez."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Naptárad olvasása",
|
||||
"body": "Látja a naptáraidat és azok eseményeit."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Naptárad módosítása",
|
||||
"body": "Eseményeket hoz létre, módosít és töröl."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Névjegyeid olvasása",
|
||||
"body": "Keres a címjegyzékeidben, és olvassa őket."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Névjegyeid módosítása",
|
||||
"body": "Névjegyeket és címjegyzékeket hoz létre, módosít és töröl."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Fájljaid olvasása",
|
||||
"body": "Böngészi és megnyitja a fiókodban tárolt fájlokat."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Fájljaid módosítása",
|
||||
"body": "Fájlokat tölt fel, nevez át, helyez át és töröl a fiókodban."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Küldő azonosságaid megtekintése",
|
||||
"body": "Látja a címeket, amelyekről küldesz, és azok aláírásait."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Küldő azonosságaid módosítása",
|
||||
"body": "Küldő azonosságokat és aláírásokat hoz létre, módosít és töröl."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Levélszűrőid olvasása",
|
||||
"body": "Látja a szabályokat, amelyek a beérkező leveleidet rendezik."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Levélszűrőid módosítása",
|
||||
"body": "Szabályokat ad a szerveroldali szűrőidhez. Az ilyen szabályok áthelyezhetik, továbbíthatják vagy törölhetik a beérkező leveleket."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Feladataid olvasása",
|
||||
"body": "Látja a feladatlistáidat és a feladataidat."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Feladataid módosítása",
|
||||
"body": "Feladatokat hoz létre, módosít, teljesít és töröl."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Sablonjaid olvasása",
|
||||
"body": "Látja a mentett üzenetsablonjaidat."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Sablonjaid módosítása",
|
||||
"body": "Üzenetsablonokat hoz létre, módosít és töröl."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "S/MIME állapotod megtekintése",
|
||||
"body": "Látja, hogy vannak-e S/MIME kulcsaid és tanúsítványaid, a kulcsokhoz való hozzáférés nélkül."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Távolléti válaszod megtekintése",
|
||||
"body": "Látja, hogy be van-e kapcsolva az automatikus válaszod, és mi a szövege."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Távolléti válaszod módosítása",
|
||||
"body": "Be- és kikapcsolja az automatikus válaszodat, és módosítja a szövegét és dátumait."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Beállításaid olvasása",
|
||||
"body": "Látja a beállításaidat és a címkék meghatározásait."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Beállításaid módosítása",
|
||||
"body": "Címkéket ad hozzá, átrendezi őket, és módosítja a beállításaidat."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Fiókod biztonságának megtekintése",
|
||||
"body": "Látja, hogy be van-e kapcsolva a kétfaktoros hitelesítés és a titkosítás, a titkos adatokhoz való hozzáférés nélkül."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Tudomást szerez a bejelentkezésedről",
|
||||
"body": "Értesül, amikor bejelentkezel, fiókot váltasz, vagy megújul a munkameneted."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Kijelentkeztetés",
|
||||
"body": "Kijelentkeztethet a webmailből."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Fiókjaid megtekintése",
|
||||
"body": "Látja a hozzáadott fiókjaidat a címükkel és szerverükkel együtt."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "A webmail szerverének használata a nevedben",
|
||||
"body": "Meghívja ezeket a szervervégpontokat a bejelentkezéseddel:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Kapcsolódás más webhelyekhez",
|
||||
"body": "Kéréseket küld ezekre a webhelyekre. Bármi, amit a bővítmény olvashat, ide is eljuthat:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "A rendszergazdától kapott beállítások olvasása",
|
||||
"body": "Olvassa a beállításokat, amelyeket a rendszergazda mentett ehhez a bővítményhez."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Követi, hol jársz az alkalmazásban",
|
||||
"body": "Tudja, melyik oldal van megnyitva, és reagál a hivatkozásokra, amelyekre kattintasz."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Gombok az üzenet eszköztárán",
|
||||
"body": "Saját gombokat jelenít meg egy megnyitott üzenet felett."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Szalag megjelenítése felül",
|
||||
"body": "Értesítést jelenít meg az alkalmazás tetején."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Értesítések az üzeneteken",
|
||||
"body": "Értesítést jelenít meg egy megnyitott üzenet szövege felett."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Tartalom az üzenetek alatt",
|
||||
"body": "Saját tartalmat jelenít meg egy megnyitott üzenet alatt."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Névjegyek titkosítási kulcsainak megjelenítése",
|
||||
"body": "Megjeleníti és kezeli egy névjegy titkosítási kulcsait."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Panelek az üzenet részleteiben",
|
||||
"body": "Saját panelt jelenít meg egy megnyitott üzenet mellett vagy alatt."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Fájlok mentése az eszközödre",
|
||||
"body": "Letöltésre kínálja az általa létrehozott fájlokat."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Lapok a Beérkező levelekben",
|
||||
"body": "Lapokra bontja a Beérkező leveleket, például Frissítések vagy Promóciók."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Gombok a szerkesztőben",
|
||||
"body": "Saját gombokat jelenít meg, miközben üzenetet írsz."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Panel a szerkesztőben",
|
||||
"body": "Saját panelt jelenít meg az általad írt üzenet mellett."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Doboz az oldalsávon",
|
||||
"body": "Saját tartalmat jelenít meg a levelezés oldalsávján."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Beállítási oldal hozzáadása",
|
||||
"body": "Saját oldalt jelenít meg a Beállításokban."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Elemek az üzenet menüjében",
|
||||
"body": "Elemeket ad ahhoz a menühöz, amely egy üzenetre jobb gombbal kattintva nyílik meg."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Gomb a navigációs sávon",
|
||||
"body": "Saját gombot jelenít meg a navigációs sávon."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Billentyűparancsok hozzáadása",
|
||||
"body": "Reagál az általa meghatározott billentyűparancsokra."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Gombok az eseményeknél",
|
||||
"body": "Saját gombokat jelenít meg, amikor eseményt hozol létre vagy szerkesztesz."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Adminisztrációs oldal hozzáadása",
|
||||
"body": "Saját oldalt jelenít meg az adminisztrációs beállításokban."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Tudomást szerez az alkalmazás indulásáról és leállásáról",
|
||||
"body": "Értesül, amikor az alkalmazás elindul, offline módba vált, vagy kijelentkezel."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorizzazione non riuscita: {error}",
|
||||
"missing_params": "Codice di autorizzazione o stato mancante.",
|
||||
"delivery_failed": "Impossibile consegnare il risultato dellautorizzazione alla scheda dellapp. Chiudi questa finestra e riprova."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugin",
|
||||
"description": "Plugin aggiunti dal tuo amministratore. Attivali o disattivali per il tuo account.",
|
||||
"description_uploads": "I plugin aggiungono funzioni alla webmail. Attivali o disattivali per il tuo account, oppure installa i tuoi.",
|
||||
"description_demo": "I plugin non sono disponibili nella demo.",
|
||||
"install_button": "Installa plugin",
|
||||
"install_hint": "Scegli il file ZIP di un plugin.",
|
||||
"install_hint_approval": "Scegli il file ZIP di un plugin. Un amministratore deve approvarlo prima che tu possa attivarlo.",
|
||||
"install_uploads_off": "Il tuo amministratore non consente di installare plugin.",
|
||||
"install_managed_id": "Il tuo amministratore fornisce già un plugin con questo nome, quindi non può essere sostituito.",
|
||||
"install_invalid": "Questo file non è un plugin installabile: {details}",
|
||||
"toast_installed": "Plugin installato. Attivalo qui sotto.",
|
||||
"toast_installed_pending": "Plugin installato e inviato al tuo amministratore per l'approvazione.",
|
||||
"toast_enabled": "{name} è attivo",
|
||||
"toast_disabled": "{name} è disattivato",
|
||||
"toast_removed": "{name} è stato rimosso",
|
||||
"toast_forced": "Il tuo amministratore mantiene attivo {name}",
|
||||
"toast_approval_requested": "{name} è in attesa dell'approvazione del tuo amministratore",
|
||||
"empty_title": "Ancora nessun plugin",
|
||||
"empty_admin": "Il tuo amministratore non ha aggiunto alcun plugin.",
|
||||
"empty_uploads": "Installa un plugin da un file ZIP per iniziare.",
|
||||
"empty_demo": "I plugin richiedono un account reale, quindi la demo non ne ha.",
|
||||
"syncing": "Verifica dei plugin con il server…",
|
||||
"status_installed": "Disattivato",
|
||||
"status_enabled": "Avvio in corso",
|
||||
"status_running": "Attivo",
|
||||
"status_disabled": "Disattivato",
|
||||
"status_error": "Problema",
|
||||
"badge_forced": "Obbligatorio",
|
||||
"badge_managed": "Dal tuo amministratore",
|
||||
"badge_yours": "Installato da te",
|
||||
"badge_awaiting": "In attesa di approvazione",
|
||||
"toggle_label": "Attiva o disattiva {name}",
|
||||
"forced_note": "Il tuo amministratore richiede questo plugin, quindi non può essere disattivato.",
|
||||
"permissions": "Cosa può fare",
|
||||
"permissions_managed": "Cosa può fare (approvato dal tuo amministratore)",
|
||||
"settings": "Impostazioni",
|
||||
"remove": "Rimuovi",
|
||||
"remove_title": "Rimuovere {name}?",
|
||||
"remove_message": "Il plugin e tutto ciò che ha salvato in questo browser verranno eliminati. Potrai installarlo di nuovo in seguito.",
|
||||
"remove_confirm": "Rimuovi",
|
||||
"error_user_plugins_off": "Il tuo amministratore ha disattivato i plugin installati dagli utenti, quindi questo plugin non viene eseguito.",
|
||||
"error_approval_unavailable": "Questo plugin è stato installato prima che fosse richiesta l'approvazione. Rimuovilo e installalo di nuovo per inviarlo in approvazione.",
|
||||
"error_approval_denied": "Il tuo amministratore non ha approvato questo plugin.",
|
||||
"error_approval_pending": "In attesa che il tuo amministratore approvi questo plugin."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Consentire a {name} di fare questo?",
|
||||
"intro": "Il plugin chiede le autorizzazioni qui sotto. Le ottiene solo se le concedi.",
|
||||
"high_risk_note": "Le voci contrassegnate danno al plugin accesso al contenuto della tua posta o gli permettono di inviare dati altrove. Consentile solo ai plugin di cui ti fidi.",
|
||||
"revoke_hint": "Puoi disattivare o rimuovere il plugin in Impostazioni in qualsiasi momento.",
|
||||
"deny": "Non consentire",
|
||||
"allow": "Consenti"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Non richiede autorizzazioni particolari.",
|
||||
"high_risk": "Con cautela",
|
||||
"email_read": {
|
||||
"title": "Leggere la tua posta",
|
||||
"body": "Vedere mittenti, destinatari, oggetti e il testo completo dei messaggi che apri e dell'elenco dei messaggi."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Modificare etichette e contrassegni della tua posta",
|
||||
"body": "Aggiungere o rimuovere etichette, contrassegni e altre parole chiave dai tuoi messaggi."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Modificare la posta prima dell'invio",
|
||||
"body": "Leggere e modificare destinatari, oggetto, testo e allegati dei messaggi che scrivi, e impedire l'invio di un messaggio."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Accesso completo a questa app",
|
||||
"body": "Funziona con gli stessi diritti della webmail stessa. Può leggere tutta la tua posta e le chiavi salvate e agire per conto tuo. Consentilo solo ai plugin di cui ti fidi completamente."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Inviare messaggi creati da sé",
|
||||
"body": "Inviare messaggi completi, ad esempio firmati o cifrati, dal tuo account."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Leggere il contenuto grezzo dei messaggi",
|
||||
"body": "Leggere i dati originali dei tuoi messaggi e allegati, e di ogni file che alleghi prima dell'invio."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Sostituire gli allegati prima dell'invio",
|
||||
"body": "Caricare file sul tuo server di posta e sostituire un file allegato con un altro prima che il messaggio venga inviato."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Modificare come vengono mostrati i messaggi",
|
||||
"body": "Sostituire il testo dei messaggi che apri e dell'elenco dei messaggi, ad esempio per mostrare contenuti decifrati."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Leggere il tuo calendario",
|
||||
"body": "Vedere i tuoi calendari e i relativi eventi."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Modificare il tuo calendario",
|
||||
"body": "Creare, modificare ed eliminare eventi."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Leggere i tuoi contatti",
|
||||
"body": "Cercare e leggere nelle tue rubriche."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Modificare i tuoi contatti",
|
||||
"body": "Creare, modificare ed eliminare contatti e rubriche."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Leggere i tuoi file",
|
||||
"body": "Sfogliare e aprire i file salvati nel tuo account."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Modificare i tuoi file",
|
||||
"body": "Caricare, rinominare, spostare ed eliminare file nel tuo account."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Vedere i tuoi indirizzi mittente",
|
||||
"body": "Vedere gli indirizzi da cui invii e le relative firme."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Modificare i tuoi indirizzi mittente",
|
||||
"body": "Creare, modificare ed eliminare indirizzi mittente e firme."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Leggere i tuoi filtri di posta",
|
||||
"body": "Vedere le regole che ordinano la posta in arrivo."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Modificare i tuoi filtri di posta",
|
||||
"body": "Aggiungere regole ai tuoi filtri sul server. Queste regole possono spostare, inoltrare o eliminare la posta in arrivo."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Leggere le tue attività",
|
||||
"body": "Vedere i tuoi elenchi di attività e le attività."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Modificare le tue attività",
|
||||
"body": "Creare, modificare, completare ed eliminare attività."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Leggere i tuoi modelli",
|
||||
"body": "Vedere i tuoi modelli di messaggio salvati."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Modificare i tuoi modelli",
|
||||
"body": "Creare, modificare ed eliminare modelli di messaggio."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Vedere il tuo stato S/MIME",
|
||||
"body": "Vedere se hai chiavi e certificati S/MIME, senza accesso alle chiavi."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Vedere la tua risposta automatica",
|
||||
"body": "Vedere se la risposta automatica è attiva e cosa dice."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Modificare la tua risposta automatica",
|
||||
"body": "Attivare o disattivare la risposta automatica e modificarne testo e date."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Leggere le tue impostazioni",
|
||||
"body": "Vedere le tue preferenze e le definizioni delle etichette."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Modificare le tue impostazioni",
|
||||
"body": "Aggiungere e riordinare etichette e modificare le tue preferenze."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Vedere la sicurezza del tuo account",
|
||||
"body": "Vedere se l'accesso a due fattori e la cifratura sono attivi, senza accesso ai segreti."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Sapere quando accedi",
|
||||
"body": "Ricevere un avviso quando accedi, cambi account o la tua sessione viene rinnovata."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Disconnetterti",
|
||||
"body": "Disconnetterti dalla webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Vedere i tuoi account",
|
||||
"body": "Vedere gli account che hai aggiunto, con i relativi indirizzi e server."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Usare il server della webmail per te",
|
||||
"body": "Chiamare questi endpoint del server con il tuo accesso:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Connettersi ad altri siti web",
|
||||
"body": "Inviare richieste a questi siti. Tutto ciò che il plugin può leggere può essere inviato lì:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Leggere le sue impostazioni dal tuo amministratore",
|
||||
"body": "Leggere le impostazioni che il tuo amministratore ha salvato per questo plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Seguire dove ti trovi nell'app",
|
||||
"body": "Sapere quale pagina è aperta e reagire ai link su cui fai clic."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Aggiungere pulsanti alla barra degli strumenti del messaggio",
|
||||
"body": "Mostrare i propri pulsanti sopra un messaggio aperto."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Mostrare un banner in alto",
|
||||
"body": "Mostrare un avviso lungo tutta la parte superiore dell'app."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Mostrare avvisi sui messaggi",
|
||||
"body": "Mostrare un avviso sopra il testo di un messaggio aperto."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Aggiungere contenuti sotto i messaggi",
|
||||
"body": "Mostrare i propri contenuti sotto un messaggio aperto."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Mostrare le chiavi di cifratura dei contatti",
|
||||
"body": "Mostrare e gestire le chiavi di cifratura di un contatto."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Aggiungere pannelli ai dettagli del messaggio",
|
||||
"body": "Mostrare un proprio pannello accanto o sotto un messaggio aperto."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Salvare file sul tuo dispositivo",
|
||||
"body": "Offrire in download i file che ha creato."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Aggiungere schede alla tua posta in arrivo",
|
||||
"body": "Suddividere la posta in arrivo in schede come Aggiornamenti o Promozioni."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Aggiungere pulsanti all'editor",
|
||||
"body": "Mostrare i propri pulsanti mentre scrivi un messaggio."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Aggiungere un pannello all'editor",
|
||||
"body": "Mostrare un proprio pannello accanto al messaggio che scrivi."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Aggiungere un riquadro alla barra laterale",
|
||||
"body": "Mostrare i propri contenuti nella barra laterale della posta."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Aggiungere una pagina di impostazioni",
|
||||
"body": "Mostrare una propria pagina in Impostazioni."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Aggiungere voci al menu del messaggio",
|
||||
"body": "Aggiungere voci al menu che si apre quando fai clic destro su un messaggio."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Aggiungere alla barra di navigazione",
|
||||
"body": "Mostrare un proprio pulsante nella barra di navigazione."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Aggiungere scorciatoie da tastiera",
|
||||
"body": "Reagire alle scorciatoie da tastiera che definisce."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Aggiungere pulsanti agli eventi",
|
||||
"body": "Mostrare i propri pulsanti quando crei o modifichi un evento."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Aggiungere una pagina di amministrazione",
|
||||
"body": "Mostrare una propria pagina nelle impostazioni di amministrazione."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Sapere quando l'app si avvia e si chiude",
|
||||
"body": "Ricevere un avviso quando l'app si avvia, va offline o ti disconnetti."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "認証に失敗しました: {error}",
|
||||
"missing_params": "認証コードまたはステートがありません。",
|
||||
"delivery_failed": "認証結果をアプリのタブに渡せませんでした。このウィンドウを閉じて、もう一度お試しください。"
|
||||
},
|
||||
"settings": {
|
||||
"title": "プラグイン",
|
||||
"description": "管理者が追加したプラグインです。アカウントごとにオンとオフを切り替えられます。",
|
||||
"description_uploads": "プラグインでウェブメールに機能を追加できます。アカウントごとにオンとオフを切り替えたり、自分でインストールしたりできます。",
|
||||
"description_demo": "デモではプラグインを利用できません。",
|
||||
"install_button": "プラグインをインストール",
|
||||
"install_hint": "プラグインの ZIP ファイルを選択してください。",
|
||||
"install_hint_approval": "プラグインの ZIP ファイルを選択してください。オンにする前に管理者の承認が必要です。",
|
||||
"install_uploads_off": "管理者がプラグインのインストールを許可していません。",
|
||||
"install_managed_id": "同じ名前のプラグインが管理者から提供されているため、置き換えられません。",
|
||||
"install_invalid": "このファイルはインストールできるプラグインではありません: {details}",
|
||||
"toast_installed": "プラグインをインストールしました。下でオンにしてください。",
|
||||
"toast_installed_pending": "プラグインをインストールし、管理者に承認を依頼しました。",
|
||||
"toast_enabled": "{name} をオンにしました",
|
||||
"toast_disabled": "{name} をオフにしました",
|
||||
"toast_removed": "{name} を削除しました",
|
||||
"toast_forced": "{name} は管理者によって常にオンになっています",
|
||||
"toast_approval_requested": "{name} は管理者の承認を待っています",
|
||||
"empty_title": "プラグインはまだありません",
|
||||
"empty_admin": "管理者はまだプラグインを追加していません。",
|
||||
"empty_uploads": "ZIP ファイルからプラグインをインストールして始めましょう。",
|
||||
"empty_demo": "プラグインには実際のアカウントが必要なため、デモにはありません。",
|
||||
"syncing": "サーバーとプラグインを確認しています…",
|
||||
"status_installed": "オフ",
|
||||
"status_enabled": "起動中",
|
||||
"status_running": "オン",
|
||||
"status_disabled": "オフ",
|
||||
"status_error": "問題あり",
|
||||
"badge_forced": "必須",
|
||||
"badge_managed": "管理者から提供",
|
||||
"badge_yours": "自分でインストール",
|
||||
"badge_awaiting": "承認待ち",
|
||||
"toggle_label": "{name} のオンとオフを切り替え",
|
||||
"forced_note": "このプラグインは管理者によって必須とされているため、オフにできません。",
|
||||
"permissions": "できること",
|
||||
"permissions_managed": "できること(管理者が承認済み)",
|
||||
"settings": "設定",
|
||||
"remove": "削除",
|
||||
"remove_title": "{name} を削除しますか?",
|
||||
"remove_message": "プラグインと、このブラウザーに保存したデータがすべて削除されます。後でもう一度インストールできます。",
|
||||
"remove_confirm": "削除",
|
||||
"error_user_plugins_off": "管理者がユーザーによるプラグインを無効にしたため、このプラグインは動作しません。",
|
||||
"error_approval_unavailable": "このプラグインは承認が必要になる前にインストールされました。承認を依頼するには、削除してもう一度インストールしてください。",
|
||||
"error_approval_denied": "管理者はこのプラグインを承認しませんでした。",
|
||||
"error_approval_pending": "管理者がこのプラグインを承認するのを待っています。"
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name} にこの操作を許可しますか?",
|
||||
"intro": "このプラグインは次の権限を求めています。許可した場合にのみ付与されます。",
|
||||
"high_risk_note": "印の付いた項目は、プラグインにメールの内容へのアクセスや外部へのデータ送信を許可します。信頼できるプラグインにのみ許可してください。",
|
||||
"revoke_hint": "プラグインはいつでも設定でオフにしたり削除したりできます。",
|
||||
"deny": "許可しない",
|
||||
"allow": "許可"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "特別な権限は必要ありません。",
|
||||
"high_risk": "注意が必要",
|
||||
"email_read": {
|
||||
"title": "メールを読む",
|
||||
"body": "開いたメッセージとメッセージ一覧の差出人、宛先、件名、本文全体を見ることができます。"
|
||||
},
|
||||
"email_write": {
|
||||
"title": "メールのタグとフラグを変更",
|
||||
"body": "メッセージにタグ、フラグ、その他のキーワードを追加したり削除したりできます。"
|
||||
},
|
||||
"email_send": {
|
||||
"title": "送信前のメールを変更",
|
||||
"body": "作成中のメッセージの宛先、件名、本文、添付ファイルを読んで変更したり、メッセージの送信を止めたりできます。"
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "このアプリへのフルアクセス",
|
||||
"body": "ウェブメール本体と同じ権限で動作します。すべてのメールと保存された鍵を読み、あなたに代わって操作できます。完全に信頼できるプラグインにのみ許可してください。"
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "自分で作成したメッセージを送信",
|
||||
"body": "署名済みや暗号化済みのメッセージなど、完成したメッセージをあなたのアカウントから送信できます。"
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "メッセージの元データを読む",
|
||||
"body": "メッセージと添付ファイルの元データ、および送信前に添付するすべてのファイルを読むことができます。"
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "送信前に添付ファイルを置き換え",
|
||||
"body": "メールサーバーにファイルをアップロードし、送信前に添付したファイルを別のファイルに置き換えることができます。"
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "メッセージの表示方法を変更",
|
||||
"body": "開いたメッセージとメッセージ一覧の本文を置き換えることができます。たとえば復号した内容を表示するためです。"
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "カレンダーを読む",
|
||||
"body": "カレンダーとその予定を見ることができます。"
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "カレンダーを変更",
|
||||
"body": "予定を作成、変更、削除できます。"
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "連絡先を読む",
|
||||
"body": "アドレス帳を検索して読むことができます。"
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "連絡先を変更",
|
||||
"body": "連絡先とアドレス帳を作成、変更、削除できます。"
|
||||
},
|
||||
"files_read": {
|
||||
"title": "ファイルを読む",
|
||||
"body": "アカウントに保存されたファイルを閲覧して開くことができます。"
|
||||
},
|
||||
"files_write": {
|
||||
"title": "ファイルを変更",
|
||||
"body": "アカウント内のファイルをアップロード、名前変更、移動、削除できます。"
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "送信者情報を見る",
|
||||
"body": "送信に使うアドレスとその署名を見ることができます。"
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "送信者情報を変更",
|
||||
"body": "送信者情報と署名を作成、変更、削除できます。"
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "メールフィルターを読む",
|
||||
"body": "受信メールを振り分けるルールを見ることができます。"
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "メールフィルターを変更",
|
||||
"body": "サーバー側のフィルターにルールを追加できます。このルールは受信メールを移動、転送、削除できます。"
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "タスクを読む",
|
||||
"body": "タスクリストとタスクを見ることができます。"
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "タスクを変更",
|
||||
"body": "タスクを作成、変更、完了、削除できます。"
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "テンプレートを読む",
|
||||
"body": "保存したメッセージのテンプレートを見ることができます。"
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "テンプレートを変更",
|
||||
"body": "メッセージのテンプレートを作成、変更、削除できます。"
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "S/MIME の状態を見る",
|
||||
"body": "S/MIME の鍵と証明書があるかどうかを見ることができます。鍵にはアクセスできません。"
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "不在時の自動返信を見る",
|
||||
"body": "自動返信がオンかどうかと、その内容を見ることができます。"
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "不在時の自動返信を変更",
|
||||
"body": "自動返信のオンとオフを切り替え、本文と期間を変更できます。"
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "設定を読む",
|
||||
"body": "環境設定とタグの定義を見ることができます。"
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "設定を変更",
|
||||
"body": "タグを追加して並べ替えたり、環境設定を変更したりできます。"
|
||||
},
|
||||
"security_read": {
|
||||
"title": "アカウントのセキュリティを見る",
|
||||
"body": "二要素認証と暗号化がオンかどうかを見ることができます。秘密情報にはアクセスできません。"
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "サインインを知る",
|
||||
"body": "サインインしたとき、アカウントを切り替えたとき、セッションが更新されたときに通知を受けます。"
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "サインアウトさせる",
|
||||
"body": "ウェブメールからサインアウトさせることができます。"
|
||||
},
|
||||
"account_read": {
|
||||
"title": "アカウントを見る",
|
||||
"body": "追加したアカウントと、そのアドレスとサーバーを見ることができます。"
|
||||
},
|
||||
"http_post": {
|
||||
"title": "あなたの代わりにウェブメールサーバーを使う",
|
||||
"body": "あなたのログイン情報で次のサーバーエンドポイントを呼び出せます:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "他のウェブサイトに接続",
|
||||
"body": "次のサイトにリクエストを送信できます。プラグインが読めるものはすべて送信される可能性があります:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "管理者が保存した設定を読む",
|
||||
"body": "管理者がこのプラグイン用に保存した設定を読むことができます。"
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "アプリ内の現在地を把握",
|
||||
"body": "どのページが開いているかを知り、クリックしたリンクに反応できます。"
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "メッセージのツールバーにボタンを追加",
|
||||
"body": "開いたメッセージの上に独自のボタンを表示します。"
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "上部にバナーを表示",
|
||||
"body": "アプリの上部にお知らせを表示します。"
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "メッセージにお知らせを表示",
|
||||
"body": "開いたメッセージの本文の上にお知らせを表示します。"
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "メッセージの下に内容を追加",
|
||||
"body": "開いたメッセージの下に独自の内容を表示します。"
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "連絡先の暗号鍵を表示",
|
||||
"body": "連絡先の暗号鍵を表示して管理します。"
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "メッセージの詳細にパネルを追加",
|
||||
"body": "開いたメッセージの横または下に独自のパネルを表示します。"
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "デバイスにファイルを保存",
|
||||
"body": "作成したファイルをダウンロードできるようにします。"
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "受信トレイにタブを追加",
|
||||
"body": "受信トレイを「更新」や「プロモーション」などのタブに分けます。"
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "作成画面にボタンを追加",
|
||||
"body": "メッセージの作成中に独自のボタンを表示します。"
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "作成画面にパネルを追加",
|
||||
"body": "作成中のメッセージの横に独自のパネルを表示します。"
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "サイドバーにボックスを追加",
|
||||
"body": "メールのサイドバーに独自の内容を表示します。"
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "設定ページを追加",
|
||||
"body": "設定に独自のページを表示します。"
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "メッセージのメニューに追加",
|
||||
"body": "メッセージを右クリックしたときに開くメニューに項目を追加します。"
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "ナビゲーションバーに追加",
|
||||
"body": "ナビゲーションバーに独自のボタンを表示します。"
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "キーボードショートカットを追加",
|
||||
"body": "独自に定義したキーボードショートカットに反応します。"
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "予定にボタンを追加",
|
||||
"body": "予定の作成時や編集時に独自のボタンを表示します。"
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "管理ページを追加",
|
||||
"body": "管理設定に独自のページを表示します。"
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "アプリの起動と終了を知る",
|
||||
"body": "アプリが起動したとき、オフラインになったとき、サインアウトしたときに通知を受けます。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "인증 실패: {error}",
|
||||
"missing_params": "인증 코드 또는 상태가 누락되었습니다.",
|
||||
"delivery_failed": "인증 결과를 앱 탭에 전달하지 못했습니다. 이 창을 닫고 다시 시도해 주세요."
|
||||
},
|
||||
"settings": {
|
||||
"title": "플러그인",
|
||||
"description": "관리자가 추가한 플러그인이에요. 내 계정에서 켜거나 끌 수 있어요.",
|
||||
"description_uploads": "플러그인으로 웹메일에 기능을 더할 수 있어요. 내 계정에서 켜거나 끄고, 직접 설치할 수도 있어요.",
|
||||
"description_demo": "데모에서는 플러그인을 사용할 수 없어요.",
|
||||
"install_button": "플러그인 설치",
|
||||
"install_hint": "플러그인 ZIP 파일을 선택하세요.",
|
||||
"install_hint_approval": "플러그인 ZIP 파일을 선택하세요. 켜기 전에 관리자의 승인이 필요해요.",
|
||||
"install_uploads_off": "관리자가 플러그인 설치를 허용하지 않아요.",
|
||||
"install_managed_id": "관리자가 같은 이름의 플러그인을 이미 제공하고 있어 바꿀 수 없어요.",
|
||||
"install_invalid": "이 파일은 설치할 수 있는 플러그인이 아니에요: {details}",
|
||||
"toast_installed": "플러그인을 설치했어요. 아래에서 켜세요.",
|
||||
"toast_installed_pending": "플러그인을 설치하고 관리자에게 승인을 요청했어요.",
|
||||
"toast_enabled": "{name} 켜짐",
|
||||
"toast_disabled": "{name} 꺼짐",
|
||||
"toast_removed": "{name}을(를) 삭제했어요",
|
||||
"toast_forced": "관리자가 {name}을(를) 항상 켜 두도록 설정했어요",
|
||||
"toast_approval_requested": "{name}이(가) 관리자의 승인을 기다리고 있어요",
|
||||
"empty_title": "아직 플러그인이 없어요",
|
||||
"empty_admin": "관리자가 추가한 플러그인이 없어요.",
|
||||
"empty_uploads": "ZIP 파일에서 플러그인을 설치해 시작해 보세요.",
|
||||
"empty_demo": "플러그인은 실제 계정이 필요해서 데모에는 없어요.",
|
||||
"syncing": "서버에서 플러그인을 확인하는 중…",
|
||||
"status_installed": "꺼짐",
|
||||
"status_enabled": "시작 중",
|
||||
"status_running": "켜짐",
|
||||
"status_disabled": "꺼짐",
|
||||
"status_error": "문제 있음",
|
||||
"badge_forced": "필수",
|
||||
"badge_managed": "관리자 제공",
|
||||
"badge_yours": "내가 설치함",
|
||||
"badge_awaiting": "승인 대기 중",
|
||||
"toggle_label": "{name} 켜기 또는 끄기",
|
||||
"forced_note": "관리자가 이 플러그인을 필수로 지정해서 끌 수 없어요.",
|
||||
"permissions": "할 수 있는 작업",
|
||||
"permissions_managed": "할 수 있는 작업 (관리자가 승인함)",
|
||||
"settings": "설정",
|
||||
"remove": "삭제",
|
||||
"remove_title": "{name}을(를) 삭제할까요?",
|
||||
"remove_message": "플러그인과 플러그인이 이 브라우저에 저장한 모든 데이터가 삭제돼요. 나중에 다시 설치할 수 있어요.",
|
||||
"remove_confirm": "삭제",
|
||||
"error_user_plugins_off": "관리자가 사용자가 설치한 플러그인을 꺼 두어서 이 플러그인은 실행되지 않아요.",
|
||||
"error_approval_unavailable": "이 플러그인은 승인이 필요해지기 전에 설치되었어요. 승인을 요청하려면 삭제한 뒤 다시 설치하세요.",
|
||||
"error_approval_denied": "관리자가 이 플러그인을 승인하지 않았어요.",
|
||||
"error_approval_pending": "관리자가 이 플러그인을 승인하기를 기다리고 있어요."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name}에 이 권한을 허용할까요?",
|
||||
"intro": "플러그인이 아래 권한을 요청해요. 허용한 경우에만 권한이 주어져요.",
|
||||
"high_risk_note": "표시된 항목은 플러그인이 메일 내용에 접근하거나 데이터를 외부로 보낼 수 있게 해요. 신뢰하는 플러그인에만 허용하세요.",
|
||||
"revoke_hint": "언제든지 설정에서 플러그인을 끄거나 삭제할 수 있어요.",
|
||||
"deny": "허용 안 함",
|
||||
"allow": "허용"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "특별한 권한이 필요하지 않아요.",
|
||||
"high_risk": "주의 필요",
|
||||
"email_read": {
|
||||
"title": "메일 읽기",
|
||||
"body": "열어 본 메시지와 메시지 목록의 보낸 사람, 받는 사람, 제목, 전체 본문을 볼 수 있어요."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "메일의 태그와 플래그 변경",
|
||||
"body": "메시지에 태그, 플래그 및 기타 키워드를 추가하거나 제거할 수 있어요."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "보내기 전에 메일 변경",
|
||||
"body": "작성 중인 메시지의 받는 사람, 제목, 본문, 첨부 파일을 읽고 바꾸거나, 메시지가 전송되지 않게 막을 수 있어요."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "이 앱에 대한 전체 접근 권한",
|
||||
"body": "웹메일과 같은 권한으로 실행돼요. 모든 메일과 저장된 키를 읽고 사용자를 대신해 작업할 수 있어요. 완전히 신뢰하는 플러그인에만 허용하세요."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "직접 만든 메시지 보내기",
|
||||
"body": "서명되거나 암호화된 메시지 같은 완성된 메시지를 내 계정에서 보낼 수 있어요."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "메시지 원본 읽기",
|
||||
"body": "메시지와 첨부 파일의 원본 데이터, 그리고 보내기 전에 첨부하는 모든 파일을 읽을 수 있어요."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "보내기 전에 첨부 파일 바꾸기",
|
||||
"body": "메일 서버에 파일을 업로드하고, 메시지를 보내기 전에 첨부한 파일을 다른 파일로 바꿀 수 있어요."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "메시지 표시 방식 변경",
|
||||
"body": "열어 본 메시지와 메시지 목록의 본문을 바꿀 수 있어요. 예를 들어 복호화된 내용을 보여 줄 때 사용해요."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "캘린더 읽기",
|
||||
"body": "캘린더와 일정을 볼 수 있어요."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "캘린더 변경",
|
||||
"body": "일정을 만들고, 바꾸고, 삭제할 수 있어요."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "연락처 읽기",
|
||||
"body": "주소록을 검색하고 읽을 수 있어요."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "연락처 변경",
|
||||
"body": "연락처와 주소록을 만들고, 바꾸고, 삭제할 수 있어요."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "파일 읽기",
|
||||
"body": "계정에 저장된 파일을 둘러보고 열 수 있어요."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "파일 변경",
|
||||
"body": "계정의 파일을 업로드하고, 이름을 바꾸고, 이동하고, 삭제할 수 있어요."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "보내는 사람 주소 보기",
|
||||
"body": "메일을 보낼 때 쓰는 주소와 서명을 볼 수 있어요."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "보내는 사람 주소 변경",
|
||||
"body": "보내는 사람 주소와 서명을 만들고, 바꾸고, 삭제할 수 있어요."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "메일 필터 읽기",
|
||||
"body": "받은 메일을 분류하는 규칙을 볼 수 있어요."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "메일 필터 변경",
|
||||
"body": "서버 측 필터에 규칙을 추가할 수 있어요. 이런 규칙은 받은 메일을 이동, 전달하거나 삭제할 수 있어요."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "할 일 읽기",
|
||||
"body": "할 일 목록과 할 일을 볼 수 있어요."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "할 일 변경",
|
||||
"body": "할 일을 만들고, 바꾸고, 완료하고, 삭제할 수 있어요."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "템플릿 읽기",
|
||||
"body": "저장된 메시지 템플릿을 볼 수 있어요."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "템플릿 변경",
|
||||
"body": "메시지 템플릿을 만들고, 바꾸고, 삭제할 수 있어요."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "S/MIME 상태 보기",
|
||||
"body": "S/MIME 키와 인증서가 있는지 볼 수 있어요. 키에는 접근할 수 없어요."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "부재중 자동 응답 보기",
|
||||
"body": "자동 응답이 켜져 있는지와 그 내용을 볼 수 있어요."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "부재중 자동 응답 변경",
|
||||
"body": "자동 응답을 켜거나 끄고, 내용과 날짜를 바꿀 수 있어요."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "설정 읽기",
|
||||
"body": "환경설정과 태그 정의를 볼 수 있어요."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "설정 변경",
|
||||
"body": "태그를 추가하고 순서를 바꾸며, 환경설정을 변경할 수 있어요."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "계정 보안 보기",
|
||||
"body": "2단계 인증과 암호화가 켜져 있는지 볼 수 있어요. 비밀 정보에는 접근할 수 없어요."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "로그인 알림 받기",
|
||||
"body": "로그인하거나, 계정을 전환하거나, 세션이 갱신될 때 알림을 받아요."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "로그아웃시키기",
|
||||
"body": "웹메일에서 로그아웃시킬 수 있어요."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "계정 보기",
|
||||
"body": "추가한 계정과 그 주소 및 서버를 볼 수 있어요."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "나 대신 웹메일 서버 사용",
|
||||
"body": "내 로그인 정보로 다음 서버 엔드포인트를 호출할 수 있어요:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "다른 웹사이트에 연결",
|
||||
"body": "다음 사이트에 요청을 보낼 수 있어요. 플러그인이 읽을 수 있는 모든 내용이 그곳으로 전송될 수 있어요:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "관리자가 저장한 설정 읽기",
|
||||
"body": "관리자가 이 플러그인용으로 저장한 설정을 읽을 수 있어요."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "앱에서 현재 위치 파악",
|
||||
"body": "어떤 페이지가 열려 있는지 알고, 클릭한 링크에 반응할 수 있어요."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "메시지 도구 모음에 버튼 추가",
|
||||
"body": "열어 본 메시지 위에 자체 버튼을 표시해요."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "상단에 배너 표시",
|
||||
"body": "앱 상단에 안내를 표시해요."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "메시지에 안내 표시",
|
||||
"body": "열어 본 메시지 본문 위에 안내를 표시해요."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "메시지 아래에 내용 추가",
|
||||
"body": "열어 본 메시지 아래에 자체 내용을 표시해요."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "연락처의 암호화 키 표시",
|
||||
"body": "연락처의 암호화 키를 표시하고 관리해요."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "메시지 세부 정보에 패널 추가",
|
||||
"body": "열어 본 메시지 옆이나 아래에 자체 패널을 표시해요."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "기기에 파일 저장",
|
||||
"body": "직접 만든 파일을 다운로드할 수 있게 제공해요."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "받은편지함에 탭 추가",
|
||||
"body": "받은편지함을 업데이트나 프로모션 같은 탭으로 나눠요."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "작성 창에 버튼 추가",
|
||||
"body": "메시지를 작성하는 동안 자체 버튼을 표시해요."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "작성 창에 패널 추가",
|
||||
"body": "작성 중인 메시지 옆에 자체 패널을 표시해요."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "사이드바에 상자 추가",
|
||||
"body": "메일 사이드바에 자체 내용을 표시해요."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "설정 페이지 추가",
|
||||
"body": "설정에 자체 페이지를 표시해요."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "메시지 메뉴에 추가",
|
||||
"body": "메시지를 마우스 오른쪽 버튼으로 클릭하면 열리는 메뉴에 항목을 추가해요."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "내비게이션 바에 추가",
|
||||
"body": "내비게이션 바에 자체 버튼을 표시해요."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "단축키 추가",
|
||||
"body": "직접 정의한 단축키에 반응해요."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "일정에 버튼 추가",
|
||||
"body": "일정을 만들거나 편집할 때 자체 버튼을 표시해요."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "관리자 페이지 추가",
|
||||
"body": "관리자 설정에 자체 페이지를 표시해요."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "앱 시작과 종료 알림 받기",
|
||||
"body": "앱이 시작되거나, 오프라인이 되거나, 로그아웃할 때 알림을 받아요."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorizācija neizdevās: {error}",
|
||||
"missing_params": "Trūkst autorizācijas kods vai stāvoklis.",
|
||||
"delivery_failed": "Autorizācijas rezultātu neizdevās nodot lietotnes cilnei. Aizveriet šo logu un mēģiniet vēlreiz."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Spraudņi",
|
||||
"description": "Spraudņi, ko pievienojis jūsu administrators. Ieslēdziet vai izslēdziet tos savam kontam.",
|
||||
"description_uploads": "Spraudņi papildina webmail ar jaunām funkcijām. Ieslēdziet vai izslēdziet tos savam kontam vai instalējiet savus.",
|
||||
"description_demo": "Demo režīmā spraudņi nav pieejami.",
|
||||
"install_button": "Instalēt spraudni",
|
||||
"install_hint": "Izvēlieties spraudņa ZIP failu.",
|
||||
"install_hint_approval": "Izvēlieties spraudņa ZIP failu. Pirms varat to ieslēgt, tas jāapstiprina administratoram.",
|
||||
"install_uploads_off": "Jūsu administrators neļauj instalēt spraudņus.",
|
||||
"install_managed_id": "Jūsu administrators jau nodrošina spraudni ar šādu nosaukumu, tāpēc to nevar aizstāt.",
|
||||
"install_invalid": "Šis fails nav instalējams spraudnis: {details}",
|
||||
"toast_installed": "Spraudnis instalēts. Ieslēdziet to zemāk.",
|
||||
"toast_installed_pending": "Spraudnis instalēts un nosūtīts jūsu administratoram apstiprināšanai.",
|
||||
"toast_enabled": "Spraudnis {name} ir ieslēgts",
|
||||
"toast_disabled": "Spraudnis {name} ir izslēgts",
|
||||
"toast_removed": "Spraudnis {name} ir noņemts",
|
||||
"toast_forced": "Jūsu administrators patur spraudni {name} ieslēgtu",
|
||||
"toast_approval_requested": "Spraudnis {name} gaida jūsu administratora apstiprinājumu",
|
||||
"empty_title": "Vēl nav spraudņu",
|
||||
"empty_admin": "Jūsu administrators nav pievienojis nevienu spraudni.",
|
||||
"empty_uploads": "Lai sāktu, instalējiet spraudni no ZIP faila.",
|
||||
"empty_demo": "Spraudņiem vajadzīgs īsts konts, tāpēc demo režīmā to nav.",
|
||||
"syncing": "Pārbauda spraudņus serverī…",
|
||||
"status_installed": "Izslēgts",
|
||||
"status_enabled": "Tiek palaists",
|
||||
"status_running": "Ieslēgts",
|
||||
"status_disabled": "Izslēgts",
|
||||
"status_error": "Problēma",
|
||||
"badge_forced": "Obligāts",
|
||||
"badge_managed": "No jūsu administratora",
|
||||
"badge_yours": "Instalējāt jūs",
|
||||
"badge_awaiting": "Gaida apstiprinājumu",
|
||||
"toggle_label": "Ieslēgt vai izslēgt spraudni {name}",
|
||||
"forced_note": "Jūsu administrators pieprasa šo spraudni, tāpēc to nevar izslēgt.",
|
||||
"permissions": "Ko tas var darīt",
|
||||
"permissions_managed": "Ko tas var darīt (apstiprinājis jūsu administrators)",
|
||||
"settings": "Iestatījumi",
|
||||
"remove": "Noņemt",
|
||||
"remove_title": "Noņemt spraudni {name}?",
|
||||
"remove_message": "Spraudnis un viss, ko tas saglabājis šajā pārlūkā, tiks dzēsts. Vēlāk to var instalēt atkal.",
|
||||
"remove_confirm": "Noņemt",
|
||||
"error_user_plugins_off": "Jūsu administrators ir izslēdzis lietotāju instalētos spraudņus, tāpēc šis spraudnis nedarbojas.",
|
||||
"error_approval_unavailable": "Šis spraudnis tika instalēts, pirms bija vajadzīgs apstiprinājums. Noņemiet to un instalējiet vēlreiz, lai nosūtītu apstiprināšanai.",
|
||||
"error_approval_denied": "Jūsu administrators neapstiprināja šo spraudni.",
|
||||
"error_approval_pending": "Gaida, kad jūsu administrators apstiprinās šo spraudni."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Atļaut spraudnim {name} to darīt?",
|
||||
"intro": "Spraudnis pieprasa tālāk norādītās atļaujas. Tas tās saņems tikai tad, ja jūs atļausiet.",
|
||||
"high_risk_note": "Atzīmētie punkti dod spraudnim piekļuvi jūsu pasta saturam vai ļauj tam sūtīt datus citur. Atļaujiet tos tikai spraudņiem, kuriem uzticaties.",
|
||||
"revoke_hint": "Spraudni jebkurā laikā varat izslēgt vai noņemt iestatījumos.",
|
||||
"deny": "Neatļaut",
|
||||
"allow": "Atļaut"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Tam nav vajadzīgas īpašas atļaujas.",
|
||||
"high_risk": "Nepieciešama piesardzība",
|
||||
"email_read": {
|
||||
"title": "Lasīt jūsu pastu",
|
||||
"body": "Redzēt sūtītājus, adresātus, tēmas un visu tekstu vēstulēm, ko atverat, un vēstulēm sarakstā."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Mainīt vēstuļu tagus un karodziņus",
|
||||
"body": "Pievienot vai noņemt tagus, karodziņus un citus atslēgvārdus jūsu vēstulēm."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Mainīt vēstules pirms nosūtīšanas",
|
||||
"body": "Lasīt un mainīt adresātus, tēmu, tekstu un pielikumus vēstulēm, ko rakstāt, un apturēt vēstules nosūtīšanu."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Pilna piekļuve lietotnei",
|
||||
"body": "Darbojas ar tādām pašām tiesībām kā pats webmail. Var lasīt visu jūsu pastu un saglabātās atslēgas un rīkoties jūsu vārdā. Atļaujiet to tikai spraudņiem, kuriem pilnībā uzticaties."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Sūtīt paša izveidotas vēstules",
|
||||
"body": "Sūtīt no jūsu konta pilnīgas vēstules, piemēram, parakstītas vai šifrētas."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Lasīt vēstuļu neapstrādātos datus",
|
||||
"body": "Lasīt jūsu vēstuļu un pielikumu sākotnējos datus, kā arī katru failu, ko pievienojat, pirms tas tiek nosūtīts."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Aizstāt pielikumus pirms nosūtīšanas",
|
||||
"body": "Augšupielādēt failus jūsu pasta serverī un aizstāt pievienoto failu ar citu, pirms vēstule tiek nosūtīta."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Mainīt vēstuļu attēlojumu",
|
||||
"body": "Aizstāt tekstu vēstulēm, ko atverat, un vēstulēm sarakstā, piemēram, lai parādītu atšifrētu saturu."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Lasīt jūsu kalendāru",
|
||||
"body": "Redzēt jūsu kalendārus un to notikumus."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Mainīt jūsu kalendāru",
|
||||
"body": "Izveidot, mainīt un dzēst notikumus."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Lasīt jūsu kontaktus",
|
||||
"body": "Meklēt un lasīt jūsu adrešu grāmatās."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Mainīt jūsu kontaktus",
|
||||
"body": "Izveidot, mainīt un dzēst kontaktus un adrešu grāmatas."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Lasīt jūsu failus",
|
||||
"body": "Pārlūkot un atvērt jūsu kontā glabātos failus."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Mainīt jūsu failus",
|
||||
"body": "Augšupielādēt, pārdēvēt, pārvietot un dzēst failus jūsu kontā."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Redzēt jūsu sūtītāja adreses",
|
||||
"body": "Redzēt adreses, no kurām sūtāt, un to parakstus."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Mainīt jūsu sūtītāja adreses",
|
||||
"body": "Izveidot, mainīt un dzēst sūtītāja adreses un parakstus."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Lasīt jūsu pasta filtrus",
|
||||
"body": "Redzēt noteikumus, kas šķiro jūsu ienākošo pastu."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Mainīt jūsu pasta filtrus",
|
||||
"body": "Pievienot noteikumus jūsu servera filtriem. Šādi noteikumi var pārvietot, pārsūtīt vai dzēst ienākošo pastu."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Lasīt jūsu uzdevumus",
|
||||
"body": "Redzēt jūsu uzdevumu sarakstus un uzdevumus."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Mainīt jūsu uzdevumus",
|
||||
"body": "Izveidot, mainīt, pabeigt un dzēst uzdevumus."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Lasīt jūsu veidnes",
|
||||
"body": "Redzēt jūsu saglabātās vēstuļu veidnes."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Mainīt jūsu veidnes",
|
||||
"body": "Izveidot, mainīt un dzēst vēstuļu veidnes."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Redzēt jūsu S/MIME statusu",
|
||||
"body": "Redzēt, vai jums ir S/MIME atslēgas un sertifikāti, bez piekļuves atslēgām."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Redzēt jūsu prombūtnes atbildi",
|
||||
"body": "Redzēt, vai automātiskā atbilde ir ieslēgta un kas tajā rakstīts."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Mainīt jūsu prombūtnes atbildi",
|
||||
"body": "Ieslēgt vai izslēgt automātisko atbildi un mainīt tās tekstu un datumus."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Lasīt jūsu iestatījumus",
|
||||
"body": "Redzēt jūsu preferences un tagu definīcijas."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Mainīt jūsu iestatījumus",
|
||||
"body": "Pievienot tagus, mainīt to secību un mainīt jūsu preferences."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Redzēt jūsu konta drošību",
|
||||
"body": "Redzēt, vai divfaktoru autentifikācija un šifrēšana ir ieslēgtas, bez piekļuves noslēpumiem."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Zināt, kad pierakstāties",
|
||||
"body": "Saņemt ziņu, kad pierakstāties, pārslēdzat kontu vai jūsu sesija tiek atjaunota."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Izrakstīt jūs",
|
||||
"body": "Izrakstīt jūs no webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Redzēt jūsu kontus",
|
||||
"body": "Redzēt jūsu pievienotos kontus ar to adresēm un serveriem."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Izmantot webmail serveri jūsu vārdā",
|
||||
"body": "Izsaukt šos servera galapunktus ar jūsu pieteikšanās datiem:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Savienoties ar citām vietnēm",
|
||||
"body": "Sūtīt pieprasījumus uz šīm vietnēm. Uz turieni var nosūtīt visu, ko spraudnis var nolasīt:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Lasīt savus iestatījumus no administratora",
|
||||
"body": "Lasīt iestatījumus, ko jūsu administrators saglabājis šim spraudnim."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Sekot, kur atrodaties lietotnē",
|
||||
"body": "Zināt, kura lapa ir atvērta, un reaģēt uz saitēm, uz kurām noklikšķināt."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Pievienot pogas vēstules rīkjoslai",
|
||||
"body": "Rādīt savas pogas virs atvērtas vēstules."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Rādīt reklāmkarogu augšā",
|
||||
"body": "Rādīt paziņojumu pāri lietotnes augšdaļai."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Rādīt paziņojumus vēstulēs",
|
||||
"body": "Rādīt paziņojumu virs atvērtas vēstules teksta."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Pievienot saturu zem vēstulēm",
|
||||
"body": "Rādīt savu saturu zem atvērtas vēstules."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Rādīt kontaktu šifrēšanas atslēgas",
|
||||
"body": "Rādīt un pārvaldīt kontakta šifrēšanas atslēgas."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Pievienot paneļus vēstules informācijai",
|
||||
"body": "Rādīt savu paneli blakus atvērtai vēstulei vai zem tās."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Saglabāt failus jūsu ierīcē",
|
||||
"body": "Piedāvāt lejupielādei paša izveidotus failus."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Pievienot cilnes iesūtnei",
|
||||
"body": "Sadalīt jūsu iesūtni cilnēs, piemēram, Jaunumi vai Akcijas."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Pievienot pogas redaktoram",
|
||||
"body": "Rādīt savas pogas, kamēr rakstāt vēstuli."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Pievienot paneli redaktoram",
|
||||
"body": "Rādīt savu paneli blakus vēstulei, ko rakstāt."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Pievienot bloku sānjoslai",
|
||||
"body": "Rādīt savu saturu pasta sānjoslā."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Pievienot iestatījumu lapu",
|
||||
"body": "Rādīt savu lapu iestatījumos."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Papildināt vēstules izvēlni",
|
||||
"body": "Pievienot ierakstus izvēlnei, kas atveras, ar peles labo pogu noklikšķinot uz vēstules."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Papildināt navigācijas joslu",
|
||||
"body": "Rādīt savu pogu navigācijas joslā."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Pievienot īsinājumtaustiņus",
|
||||
"body": "Reaģēt uz paša definētiem īsinājumtaustiņiem."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Pievienot pogas notikumiem",
|
||||
"body": "Rādīt savas pogas, kad izveidojat vai rediģējat notikumu."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Pievienot administrēšanas lapu",
|
||||
"body": "Rādīt savu lapu administratora iestatījumos."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Zināt, kad lietotne startē un apstājas",
|
||||
"body": "Saņemt ziņu, kad lietotne startē, pāriet bezsaistē vai jūs izrakstāties."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Зөвшөөрөл амжилтгүй болсон: {error}",
|
||||
"missing_params": "Зөвшөөрлийн код эсвэл төлөв байхгүй байна.",
|
||||
"delivery_failed": "Зөвшөөрлийн үр дүнг аппын таб руу дамжуулж чадсангүй. Энэ цонхыг хаагаад дахин оролдоно уу."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Залгаасууд",
|
||||
"description": "Таны администраторын нэмсэн залгаасууд. Өөрийн бүртгэлд асааж эсвэл унтрааж болно.",
|
||||
"description_uploads": "Залгаасууд webmail-д шинэ боломж нэмдэг. Өөрийн бүртгэлд асааж, унтрааж эсвэл өөрийнхөө залгаасыг суулгаж болно.",
|
||||
"description_demo": "Демо горимд залгаас ашиглах боломжгүй.",
|
||||
"install_button": "Залгаас суулгах",
|
||||
"install_hint": "Залгаасын ZIP файлыг сонгоно уу.",
|
||||
"install_hint_approval": "Залгаасын ZIP файлыг сонгоно уу. Асаахаас өмнө администратор үүнийг зөвшөөрөх ёстой.",
|
||||
"install_uploads_off": "Таны администратор залгаас суулгахыг зөвшөөрөөгүй байна.",
|
||||
"install_managed_id": "Таны администратор ийм нэртэй залгаасыг аль хэдийн олгосон тул үүнийг солих боломжгүй.",
|
||||
"install_invalid": "Энэ файл суулгаж болох залгаас биш байна: {details}",
|
||||
"toast_installed": "Залгаас суулгалаа. Доороос асаана уу.",
|
||||
"toast_installed_pending": "Залгаас суулгаж, зөвшөөрөл авахаар таны администратор руу илгээлээ.",
|
||||
"toast_enabled": "{name} залгаас асаалттай",
|
||||
"toast_disabled": "{name} залгаас унтарсан",
|
||||
"toast_removed": "{name} залгаасыг устгалаа",
|
||||
"toast_forced": "Таны администратор {name} залгаасыг асаалттай байлгахыг шаарддаг",
|
||||
"toast_approval_requested": "{name} залгаас таны администраторын зөвшөөрлийг хүлээж байна",
|
||||
"empty_title": "Одоогоор залгаас алга",
|
||||
"empty_admin": "Таны администратор ямар ч залгаас нэмээгүй байна.",
|
||||
"empty_uploads": "Эхлэхийн тулд ZIP файлаас залгаас суулгана уу.",
|
||||
"empty_demo": "Залгаасуудад жинхэнэ бүртгэл хэрэгтэй тул демо горимд байхгүй.",
|
||||
"syncing": "Залгаасуудыг сервертэй тулгаж байна…",
|
||||
"status_installed": "Унтарсан",
|
||||
"status_enabled": "Эхэлж байна",
|
||||
"status_running": "Асаалттай",
|
||||
"status_disabled": "Унтарсан",
|
||||
"status_error": "Асуудалтай",
|
||||
"badge_forced": "Заавал",
|
||||
"badge_managed": "Таны администратороос",
|
||||
"badge_yours": "Та суулгасан",
|
||||
"badge_awaiting": "Зөвшөөрөл хүлээж байна",
|
||||
"toggle_label": "{name} залгаасыг асаах эсвэл унтраах",
|
||||
"forced_note": "Таны администратор энэ залгаасыг шаарддаг тул унтраах боломжгүй.",
|
||||
"permissions": "Юу хийж чадах вэ",
|
||||
"permissions_managed": "Юу хийж чадах вэ (таны администратор зөвшөөрсөн)",
|
||||
"settings": "Тохиргоо",
|
||||
"remove": "Устгах",
|
||||
"remove_title": "{name} залгаасыг устгах уу?",
|
||||
"remove_message": "Залгаас болон түүний энэ хөтөчид хадгалсан бүх зүйл устна. Дараа нь дахин суулгаж болно.",
|
||||
"remove_confirm": "Устгах",
|
||||
"error_user_plugins_off": "Таны администратор хэрэглэгчийн суулгасан залгаасуудыг унтраасан тул энэ залгаас ажиллахгүй.",
|
||||
"error_approval_unavailable": "Энэ залгаасыг зөвшөөрөл шаарддаг болохоос өмнө суулгасан. Зөвшөөрөлд илгээхийн тулд устгаад дахин суулгана уу.",
|
||||
"error_approval_denied": "Таны администратор энэ залгаасыг зөвшөөрөөгүй.",
|
||||
"error_approval_pending": "Таны администратор энэ залгаасыг зөвшөөрөхийг хүлээж байна."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name} залгаасад үүнийг зөвшөөрөх үү?",
|
||||
"intro": "Залгаас доорх зөвшөөрлүүдийг хүсэж байна. Та зөвшөөрсөн тохиолдолд л авна.",
|
||||
"high_risk_note": "Тэмдэглэсэн зүйлс нь залгаасад таны имэйлийн агуулгыг харах эсвэл өгөгдлийг өөр газар илгээх боломж олгоно. Зөвхөн итгэдэг залгаасдаа зөвшөөрнө үү.",
|
||||
"revoke_hint": "Та хүссэн үедээ Тохиргоо хэсэгт залгаасыг унтрааж эсвэл устгаж болно.",
|
||||
"deny": "Зөвшөөрөхгүй",
|
||||
"allow": "Зөвшөөрөх"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Тусгай зөвшөөрөл шаардлагагүй.",
|
||||
"high_risk": "Болгоомжтой хандах",
|
||||
"email_read": {
|
||||
"title": "Таны имэйлийг унших",
|
||||
"body": "Таны нээсэн имэйлүүд болон имэйлийн жагсаалтын илгээгч, хүлээн авагч, гарчиг, бүрэн текстийг харах."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Имэйлийн таг болон тугийг өөрчлөх",
|
||||
"body": "Таны имэйлүүдэд таг, туг болон бусад түлхүүр үг нэмэх эсвэл хасах."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Илгээхээс өмнө имэйлийг өөрчлөх",
|
||||
"body": "Таны бичиж буй имэйлийн хүлээн авагч, гарчиг, текст, хавсралтыг унших, өөрчлөх, мөн имэйл илгээхийг зогсоох."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Аппад бүрэн хандах",
|
||||
"body": "Webmail-тэй адил эрхээр ажиллана. Таны бүх имэйл болон хадгалсан түлхүүрүүдийг уншиж, таны нэрийн өмнөөс үйлдэл хийж чадна. Зөвхөн бүрэн итгэдэг залгаасдаа үүнийг зөвшөөрнө үү."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Өөрөө бэлтгэсэн имэйл илгээх",
|
||||
"body": "Таны бүртгэлээс бүрэн бэлэн имэйл, жишээ нь гарын үсэг зурсан эсвэл шифрлэсэн имэйл илгээх."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Имэйлийн түүхий агуулгыг унших",
|
||||
"body": "Таны имэйл, хавсралтуудын эх өгөгдөл болон илгээхээс өмнө хавсаргасан файл бүрийг унших."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Илгээхээс өмнө хавсралтыг солих",
|
||||
"body": "Таны мэйл сервер рүү файл байршуулж, имэйл илгээгдэхээс өмнө хавсаргасан файлыг өөр файлаар солих."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Имэйлийг харуулах байдлыг өөрчлөх",
|
||||
"body": "Таны нээсэн имэйлүүд болон имэйлийн жагсаалтын текстийг солих, жишээ нь тайлсан агуулгыг харуулах."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Таны календарийг унших",
|
||||
"body": "Таны календарь болон тэдгээрийн үйл явдлуудыг харах."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Таны календарийг өөрчлөх",
|
||||
"body": "Үйл явдал үүсгэх, өөрчлөх, устгах."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Таны харилцагчдыг унших",
|
||||
"body": "Таны хаягийн дэвтрүүдээс хайх, унших."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Таны харилцагчдыг өөрчлөх",
|
||||
"body": "Харилцагч болон хаягийн дэвтэр үүсгэх, өөрчлөх, устгах."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Таны файлуудыг унших",
|
||||
"body": "Таны бүртгэлд хадгалсан файлуудыг үзэх, нээх."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Таны файлуудыг өөрчлөх",
|
||||
"body": "Таны бүртгэл дэх файлуудыг байршуулах, нэрийг өөрчлөх, зөөх, устгах."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Таны илгээгчийн хаягуудыг харах",
|
||||
"body": "Таны илгээдэг хаягууд болон тэдгээрийн гарын үсгийг харах."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Таны илгээгчийн хаягуудыг өөрчлөх",
|
||||
"body": "Илгээгчийн хаяг болон гарын үсэг үүсгэх, өөрчлөх, устгах."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Таны имэйл шүүлтүүрийг унших",
|
||||
"body": "Ирж буй имэйлийг ангилдаг дүрмүүдийг харах."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Таны имэйл шүүлтүүрийг өөрчлөх",
|
||||
"body": "Сервер дээрх шүүлтүүрт дүрэм нэмэх. Ийм дүрэм ирж буй имэйлийг зөөх, дамжуулах эсвэл устгах боломжтой."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Таны даалгавруудыг унших",
|
||||
"body": "Таны даалгаврын жагсаалт болон даалгавруудыг харах."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Таны даалгавруудыг өөрчлөх",
|
||||
"body": "Даалгавар үүсгэх, өөрчлөх, дуусгах, устгах."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Таны загваруудыг унших",
|
||||
"body": "Таны хадгалсан имэйлийн загваруудыг харах."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Таны загваруудыг өөрчлөх",
|
||||
"body": "Имэйлийн загвар үүсгэх, өөрчлөх, устгах."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Таны S/MIME төлөвийг харах",
|
||||
"body": "Танд S/MIME түлхүүр, гэрчилгээ байгаа эсэхийг түлхүүрт хандахгүйгээр харах."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Таны эзгүй үеийн хариуг харах",
|
||||
"body": "Автомат хариу асаалттай эсэх, юу бичсэнийг харах."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Таны эзгүй үеийн хариуг өөрчлөх",
|
||||
"body": "Автомат хариуг асаах, унтраах, текст болон огноог нь өөрчлөх."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Таны тохиргоог унших",
|
||||
"body": "Таны тохиргоо болон тагуудын тодорхойлолтыг харах."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Таны тохиргоог өөрчлөх",
|
||||
"body": "Таг нэмэх, дарааллыг нь өөрчлөх, таны тохиргоог өөрчлөх."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Бүртгэлийн аюулгүй байдлыг харах",
|
||||
"body": "Хоёр хүчин зүйлийн баталгаажуулалт болон шифрлэлт асаалттай эсэхийг нууц мэдээлэлд хандахгүйгээр харах."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Таныг нэвтрэхийг мэдэх",
|
||||
"body": "Таныг нэвтрэх, бүртгэл солих эсвэл сесс сунгагдах үед мэдэгдэл авах."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Таныг гаргах",
|
||||
"body": "Таныг webmail-ээс гаргах."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Таны бүртгэлүүдийг харах",
|
||||
"body": "Таны нэмсэн бүртгэлүүдийг хаяг, серверийн хамт харах."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Таны өмнөөс webmail серверийг ашиглах",
|
||||
"body": "Эдгээр серверийн хаяг руу таны нэвтрэх мэдээллээр хандах:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Бусад вэбсайттай холбогдох",
|
||||
"body": "Эдгээр сайт руу хүсэлт илгээх. Залгаасын уншиж чадах бүх зүйлийг тийш илгээж болзошгүй:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Администраторын тохиргоог унших",
|
||||
"body": "Таны администраторын энэ залгаасад хадгалсан тохиргоог унших."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Апп дотор хаана байгааг дагах",
|
||||
"body": "Аль хуудас нээлттэй байгааг мэдэх, таны дарсан холбоосод хариу үйлдэл үзүүлэх."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Имэйлийн хэрэгслийн мөрөнд товч нэмэх",
|
||||
"body": "Нээлттэй имэйлийн дээр өөрийн товчуудыг харуулах."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Дээд хэсэгт баннер харуулах",
|
||||
"body": "Аппын дээд хэсэгт мэдэгдэл харуулах."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Имэйл дээр мэдэгдэл харуулах",
|
||||
"body": "Нээлттэй имэйлийн текстийн дээр мэдэгдэл харуулах."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Имэйлийн доор агуулга нэмэх",
|
||||
"body": "Нээлттэй имэйлийн доор өөрийн агуулгыг харуулах."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Харилцагчийн шифрлэлтийн түлхүүрийг харуулах",
|
||||
"body": "Харилцагчийн шифрлэлтийн түлхүүрүүдийг харуулах, удирдах."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Имэйлийн дэлгэрэнгүйд самбар нэмэх",
|
||||
"body": "Нээлттэй имэйлийн хажууд эсвэл доор өөрийн самбарыг харуулах."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Файлыг таны төхөөрөмжид хадгалах",
|
||||
"body": "Өөрийн үүсгэсэн файлуудыг татаж авахыг санал болгох."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Ирсэн имэйлд таб нэмэх",
|
||||
"body": "Ирсэн имэйлийг Шинэчлэлт, Сурталчилгаа зэрэг табуудад ангилах."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Имэйл бичих цонхонд товч нэмэх",
|
||||
"body": "Таныг имэйл бичих үед өөрийн товчуудыг харуулах."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Имэйл бичих цонхонд самбар нэмэх",
|
||||
"body": "Таны бичиж буй имэйлийн хажууд өөрийн самбарыг харуулах."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Хажуугийн самбарт хэсэг нэмэх",
|
||||
"body": "Имэйлийн хажуугийн самбарт өөрийн агуулгыг харуулах."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Тохиргооны хуудас нэмэх",
|
||||
"body": "Тохиргоо хэсэгт өөрийн хуудсыг харуулах."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Имэйлийн цэсэнд нэмэх",
|
||||
"body": "Имэйл дээр баруун товшиход нээгддэг цэсэнд зүйл нэмэх."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Навигацын мөрөнд нэмэх",
|
||||
"body": "Навигацын мөрөнд өөрийн товчийг харуулах."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Товчлуурын товчлол нэмэх",
|
||||
"body": "Өөрийн тодорхойлсон товчлуурын товчлолд хариу үйлдэл үзүүлэх."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Үйл явдалд товч нэмэх",
|
||||
"body": "Таныг үйл явдал үүсгэх эсвэл засах үед өөрийн товчуудыг харуулах."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Админ хуудас нэмэх",
|
||||
"body": "Админы тохиргоонд өөрийн хуудсыг харуулах."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Апп эхлэх, зогсохыг мэдэх",
|
||||
"body": "Апп эхлэх, офлайн болох эсвэл таныг гарах үед мэдэгдэл авах."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorisering mislyktes: {error}",
|
||||
"missing_params": "Mangler autorisasjonskode eller tilstand.",
|
||||
"delivery_failed": "Autoriseringsresultatet kunne ikke leveres til app-fanen. Lukk dette vinduet og prøv igjen."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Tillegg",
|
||||
"description": "Tillegg som administratoren din har lagt til. Slå dem på eller av for kontoen din.",
|
||||
"description_uploads": "Tillegg gir webmailen flere funksjoner. Slå dem på eller av for kontoen din, eller installer dine egne.",
|
||||
"description_demo": "Tillegg er ikke tilgjengelige i demoen.",
|
||||
"install_button": "Installer tillegg",
|
||||
"install_hint": "Velg en ZIP-fil med et tillegg.",
|
||||
"install_hint_approval": "Velg en ZIP-fil med et tillegg. En administrator må godkjenne det før du kan slå det på.",
|
||||
"install_uploads_off": "Administratoren din tillater ikke at du installerer tillegg.",
|
||||
"install_managed_id": "Administratoren din tilbyr allerede et tillegg med dette navnet, så det kan ikke erstattes.",
|
||||
"install_invalid": "Denne filen er ikke et tillegg som kan installeres: {details}",
|
||||
"toast_installed": "Tillegget er installert. Slå det på nedenfor.",
|
||||
"toast_installed_pending": "Tillegget er installert og sendt til administratoren din for godkjenning.",
|
||||
"toast_enabled": "{name} er på",
|
||||
"toast_disabled": "{name} er av",
|
||||
"toast_removed": "{name} er fjernet",
|
||||
"toast_forced": "Administratoren din holder {name} slått på",
|
||||
"toast_approval_requested": "{name} venter på godkjenning fra administratoren din",
|
||||
"empty_title": "Ingen tillegg ennå",
|
||||
"empty_admin": "Administratoren din har ikke lagt til noen tillegg.",
|
||||
"empty_uploads": "Installer et tillegg fra en ZIP-fil for å komme i gang.",
|
||||
"empty_demo": "Tillegg krever en ekte konto, så demoen har ingen.",
|
||||
"syncing": "Sjekker tilleggene mot serveren…",
|
||||
"status_installed": "Av",
|
||||
"status_enabled": "Starter",
|
||||
"status_running": "På",
|
||||
"status_disabled": "Av",
|
||||
"status_error": "Problem",
|
||||
"badge_forced": "Påkrevd",
|
||||
"badge_managed": "Fra administratoren din",
|
||||
"badge_yours": "Installert av deg",
|
||||
"badge_awaiting": "Venter på godkjenning",
|
||||
"toggle_label": "Slå {name} på eller av",
|
||||
"forced_note": "Administratoren din krever dette tillegget, så det kan ikke slås av.",
|
||||
"permissions": "Hva det kan gjøre",
|
||||
"permissions_managed": "Hva det kan gjøre (godkjent av administratoren din)",
|
||||
"settings": "Innstillinger",
|
||||
"remove": "Fjern",
|
||||
"remove_title": "Vil du fjerne {name}?",
|
||||
"remove_message": "Tillegget og alt det har lagret i denne nettleseren, blir slettet. Du kan installere det på nytt senere.",
|
||||
"remove_confirm": "Fjern",
|
||||
"error_user_plugins_off": "Administratoren din har slått av tillegg som brukere har installert, så dette tillegget kjører ikke.",
|
||||
"error_approval_unavailable": "Dette tillegget ble installert før godkjenning ble påkrevd. Fjern det og installer det på nytt for å sende det til godkjenning.",
|
||||
"error_approval_denied": "Administratoren din godkjente ikke dette tillegget.",
|
||||
"error_approval_pending": "Venter på at administratoren din skal godkjenne dette tillegget."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Vil du la {name} gjøre dette?",
|
||||
"intro": "Tillegget ber om tillatelsene nedenfor. Det får dem bare hvis du tillater det.",
|
||||
"high_risk_note": "Merkede punkter gir tillegget tilgang til innholdet i e-posten din eller lar det sende data andre steder. Tillat dem bare for tillegg du stoler på.",
|
||||
"revoke_hint": "Du kan når som helst slå av eller fjerne tillegget under Innstillinger.",
|
||||
"deny": "Ikke tillat",
|
||||
"allow": "Tillat"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Det trenger ingen spesielle tillatelser.",
|
||||
"high_risk": "Krever varsomhet",
|
||||
"email_read": {
|
||||
"title": "Lese e-posten din",
|
||||
"body": "Se avsendere, mottakere, emner og hele teksten i meldingene du åpner og i meldingslisten."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Endre etiketter og flagg på e-posten din",
|
||||
"body": "Legge til eller fjerne etiketter, flagg og andre nøkkelord på meldingene dine."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Endre e-post før den sendes",
|
||||
"body": "Lese og endre mottakere, emne, tekst og vedlegg i meldingene du skriver, og stoppe en melding fra å bli sendt."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Full tilgang til denne appen",
|
||||
"body": "Kjører med de samme rettighetene som selve webmailen. Det kan lese all e-posten din og lagrede nøkler og handle på dine vegne. Tillat dette bare for tillegg du stoler fullt på."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Sende meldinger det har laget selv",
|
||||
"body": "Sende ferdige meldinger, for eksempel signerte eller krypterte, fra kontoen din."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Lese råinnholdet i meldinger",
|
||||
"body": "Lese de opprinnelige dataene i meldingene og vedleggene dine, og i hver fil du legger ved før den sendes."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Erstatte vedlegg før sending",
|
||||
"body": "Laste opp filer til e-postserveren din og erstatte et vedlegg med en annen fil før meldingen sendes."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Endre hvordan meldinger vises",
|
||||
"body": "Erstatte teksten i meldingene du åpner og i meldingslisten, for eksempel for å vise dekryptert innhold."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Lese kalenderen din",
|
||||
"body": "Se kalenderne dine og hendelsene i dem."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Endre kalenderen din",
|
||||
"body": "Opprette, endre og slette hendelser."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Lese kontaktene dine",
|
||||
"body": "Søke i og lese adressebøkene dine."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Endre kontaktene dine",
|
||||
"body": "Opprette, endre og slette kontakter og adressebøker."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Lese filene dine",
|
||||
"body": "Bla gjennom og åpne filene som er lagret på kontoen din."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Endre filene dine",
|
||||
"body": "Laste opp, gi nytt navn til, flytte og slette filer på kontoen din."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Se avsenderidentitetene dine",
|
||||
"body": "Se adressene du sender fra, og signaturene deres."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Endre avsenderidentitetene dine",
|
||||
"body": "Opprette, endre og slette avsenderidentiteter og signaturer."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Lese e-postfiltrene dine",
|
||||
"body": "Se reglene som sorterer innkommende e-post."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Endre e-postfiltrene dine",
|
||||
"body": "Legge til regler i filtrene dine på serveren. Slike regler kan flytte, videresende eller slette innkommende e-post."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Lese oppgavene dine",
|
||||
"body": "Se oppgavelistene og oppgavene dine."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Endre oppgavene dine",
|
||||
"body": "Opprette, endre, fullføre og slette oppgaver."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Lese malene dine",
|
||||
"body": "Se de lagrede meldingsmalene dine."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Endre malene dine",
|
||||
"body": "Opprette, endre og slette meldingsmaler."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Se S/MIME-statusen din",
|
||||
"body": "Se om du har S/MIME-nøkler og -sertifikater, uten tilgang til nøklene."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Se fraværssvaret ditt",
|
||||
"body": "Se om det automatiske svaret ditt er på, og hva det sier."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Endre fraværssvaret ditt",
|
||||
"body": "Slå det automatiske svaret på eller av og endre teksten og datoene."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Lese innstillingene dine",
|
||||
"body": "Se innstillingene og etikettdefinisjonene dine."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Endre innstillingene dine",
|
||||
"body": "Legge til og endre rekkefølgen på etiketter og endre innstillingene dine."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Se kontosikkerheten din",
|
||||
"body": "Se om tofaktorautentisering og kryptering er slått på, uten tilgang til hemmeligheter."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Vite når du logger på",
|
||||
"body": "Få beskjed når du logger på, bytter konto eller økten din fornyes."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Logge deg ut",
|
||||
"body": "Logge deg ut av webmailen."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Se kontoene dine",
|
||||
"body": "Se kontoene du har lagt til, med adressene og serverne deres."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Bruke webmailserveren for deg",
|
||||
"body": "Kalle disse serverendepunktene med påloggingen din:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Koble til andre nettsteder",
|
||||
"body": "Sende forespørsler til disse nettstedene. Alt tillegget kan lese, kan bli sendt dit:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Lese innstillingene sine fra administratoren din",
|
||||
"body": "Lese innstillingene administratoren din har lagret for dette tillegget."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Følge med på hvor du er i appen",
|
||||
"body": "Vite hvilken side som er åpen, og reagere på lenker du klikker på."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Legge til knapper i meldingsverktøylinjen",
|
||||
"body": "Vise egne knapper over en åpen melding."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Vise et banner øverst",
|
||||
"body": "Vise et varsel over hele toppen av appen."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Vise varsler på meldinger",
|
||||
"body": "Vise et varsel over teksten i en åpen melding."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Legge til innhold under meldinger",
|
||||
"body": "Vise eget innhold under en åpen melding."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Vise krypteringsnøklene til kontakter",
|
||||
"body": "Vise og administrere krypteringsnøklene på en kontakt."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Legge til paneler i meldingsdetaljene",
|
||||
"body": "Vise et eget panel ved siden av eller under en åpen melding."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Lagre filer på enheten din",
|
||||
"body": "Tilby filer det har laget, for nedlasting."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Legge til faner i innboksen din",
|
||||
"body": "Sortere innboksen din i faner som Oppdateringer eller Kampanjer."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Legge til knapper i meldingsvinduet",
|
||||
"body": "Vise egne knapper mens du skriver en melding."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Legge til et panel i meldingsvinduet",
|
||||
"body": "Vise et eget panel ved siden av meldingen du skriver."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Legge til en boks i sidefeltet",
|
||||
"body": "Vise eget innhold i sidefeltet for e-post."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Legge til en innstillingsside",
|
||||
"body": "Vise en egen side under Innstillinger."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Legge til i meldingsmenyen",
|
||||
"body": "Legge til valg i menyen som åpnes når du høyreklikker på en melding."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Legge til i navigasjonsfeltet",
|
||||
"body": "Vise en egen knapp i navigasjonsfeltet."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Legge til tastatursnarveier",
|
||||
"body": "Reagere på tastatursnarveier det definerer selv."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Legge til knapper på hendelser",
|
||||
"body": "Vise egne knapper når du oppretter eller redigerer en hendelse."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Legge til en administrasjonsside",
|
||||
"body": "Vise en egen side i administrasjonsinnstillingene."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Vite når appen starter og stopper",
|
||||
"body": "Få beskjed når appen starter, går frakoblet eller du logger ut."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorisatie mislukt: {error}",
|
||||
"missing_params": "Autorisatiecode of status ontbreekt.",
|
||||
"delivery_failed": "Het autorisatieresultaat kon niet worden afgeleverd bij het app-tabblad. Sluit dit venster en probeer het opnieuw."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plug-ins",
|
||||
"description": "Plug-ins die je beheerder heeft toegevoegd. Zet ze aan of uit voor je account.",
|
||||
"description_uploads": "Plug-ins voegen functies toe aan de webmail. Zet ze aan of uit voor je account, of installeer je eigen plug-ins.",
|
||||
"description_demo": "Plug-ins zijn niet beschikbaar in de demo.",
|
||||
"install_button": "Plug-in installeren",
|
||||
"install_hint": "Kies een ZIP-bestand met een plug-in.",
|
||||
"install_hint_approval": "Kies een ZIP-bestand met een plug-in. Een beheerder moet de plug-in goedkeuren voordat je hem kunt aanzetten.",
|
||||
"install_uploads_off": "Je beheerder staat het installeren van plug-ins niet toe.",
|
||||
"install_managed_id": "Je beheerder biedt al een plug-in met deze naam aan, dus die kan niet worden vervangen.",
|
||||
"install_invalid": "Dit bestand is geen plug-in die kan worden geïnstalleerd: {details}",
|
||||
"toast_installed": "Plug-in geïnstalleerd. Zet hem hieronder aan.",
|
||||
"toast_installed_pending": "Plug-in geïnstalleerd en ter goedkeuring naar je beheerder gestuurd.",
|
||||
"toast_enabled": "{name} staat aan",
|
||||
"toast_disabled": "{name} staat uit",
|
||||
"toast_removed": "{name} is verwijderd",
|
||||
"toast_forced": "Je beheerder houdt {name} aan",
|
||||
"toast_approval_requested": "{name} wacht op goedkeuring door je beheerder",
|
||||
"empty_title": "Nog geen plug-ins",
|
||||
"empty_admin": "Je beheerder heeft geen plug-ins toegevoegd.",
|
||||
"empty_uploads": "Installeer een plug-in vanuit een ZIP-bestand om te beginnen.",
|
||||
"empty_demo": "Plug-ins hebben een echt account nodig, dus de demo heeft er geen.",
|
||||
"syncing": "Plug-ins controleren bij de server…",
|
||||
"status_installed": "Uit",
|
||||
"status_enabled": "Wordt gestart",
|
||||
"status_running": "Aan",
|
||||
"status_disabled": "Uit",
|
||||
"status_error": "Probleem",
|
||||
"badge_forced": "Verplicht",
|
||||
"badge_managed": "Van je beheerder",
|
||||
"badge_yours": "Door jou geïnstalleerd",
|
||||
"badge_awaiting": "Wacht op goedkeuring",
|
||||
"toggle_label": "{name} aan- of uitzetten",
|
||||
"forced_note": "Je beheerder vereist deze plug-in, dus hij kan niet worden uitgezet.",
|
||||
"permissions": "Wat hij kan doen",
|
||||
"permissions_managed": "Wat hij kan doen (goedgekeurd door je beheerder)",
|
||||
"settings": "Instellingen",
|
||||
"remove": "Verwijderen",
|
||||
"remove_title": "{name} verwijderen?",
|
||||
"remove_message": "De plug-in en alles wat hij in deze browser heeft opgeslagen, worden verwijderd. Je kunt hem later opnieuw installeren.",
|
||||
"remove_confirm": "Verwijderen",
|
||||
"error_user_plugins_off": "Je beheerder heeft plug-ins die door gebruikers zijn geïnstalleerd uitgezet, dus deze plug-in draait niet.",
|
||||
"error_approval_unavailable": "Deze plug-in is geïnstalleerd voordat goedkeuring verplicht was. Verwijder hem en installeer hem opnieuw om hem ter goedkeuring te sturen.",
|
||||
"error_approval_denied": "Je beheerder heeft deze plug-in niet goedgekeurd.",
|
||||
"error_approval_pending": "Wacht tot je beheerder deze plug-in goedkeurt."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name} dit toestaan?",
|
||||
"intro": "De plug-in vraagt de onderstaande rechten. Hij krijgt ze alleen als je ze toestaat.",
|
||||
"high_risk_note": "Gemarkeerde items geven de plug-in toegang tot de inhoud van je e-mail of laten hem gegevens elders naartoe sturen. Sta ze alleen toe voor plug-ins die je vertrouwt.",
|
||||
"revoke_hint": "Je kunt de plug-in op elk moment uitzetten of verwijderen in Instellingen.",
|
||||
"deny": "Niet toestaan",
|
||||
"allow": "Toestaan"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Hij heeft geen speciale rechten nodig.",
|
||||
"high_risk": "Let op",
|
||||
"email_read": {
|
||||
"title": "Je e-mail lezen",
|
||||
"body": "Afzenders, ontvangers, onderwerpen en de volledige tekst zien van berichten die je opent en van de berichtenlijst."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Labels en markeringen van je e-mail wijzigen",
|
||||
"body": "Labels, markeringen en andere trefwoorden aan je berichten toevoegen of ervan verwijderen."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "E-mail wijzigen voordat die wordt verzonden",
|
||||
"body": "De ontvangers, het onderwerp, de tekst en de bijlagen lezen en wijzigen van berichten die je schrijft, en het verzenden van een bericht tegenhouden."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Volledige toegang tot deze app",
|
||||
"body": "Draait met dezelfde rechten als de webmail zelf. Hij kan al je e-mail en opgeslagen sleutels lezen en namens jou handelen. Sta dit alleen toe voor plug-ins die je volledig vertrouwt."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Zelf samengestelde berichten verzenden",
|
||||
"body": "Volledige berichten, bijvoorbeeld ondertekende of versleutelde, vanaf je account verzenden."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "De ruwe inhoud van berichten lezen",
|
||||
"body": "De oorspronkelijke gegevens van je berichten en bijlagen lezen, en van elk bestand dat je bijvoegt voordat het wordt verzonden."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Bijlagen vervangen vóór het verzenden",
|
||||
"body": "Bestanden naar je mailserver uploaden en een bijgevoegd bestand door een ander vervangen voordat het bericht wordt verzonden."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Wijzigen hoe berichten worden weergegeven",
|
||||
"body": "De tekst vervangen van berichten die je opent en van de berichtenlijst, bijvoorbeeld om ontsleutelde inhoud te tonen."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Je agenda lezen",
|
||||
"body": "Je agenda's en hun afspraken zien."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Je agenda wijzigen",
|
||||
"body": "Afspraken aanmaken, wijzigen en verwijderen."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Je contacten lezen",
|
||||
"body": "Je adresboeken doorzoeken en lezen."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Je contacten wijzigen",
|
||||
"body": "Contacten en adresboeken aanmaken, wijzigen en verwijderen."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Je bestanden lezen",
|
||||
"body": "De bestanden in je account bekijken en openen."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Je bestanden wijzigen",
|
||||
"body": "Bestanden in je account uploaden, hernoemen, verplaatsen en verwijderen."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Je afzenderadressen zien",
|
||||
"body": "De adressen waarvandaan je verzendt en hun handtekeningen zien."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Je afzenderadressen wijzigen",
|
||||
"body": "Afzenderadressen en handtekeningen aanmaken, wijzigen en verwijderen."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Je mailfilters lezen",
|
||||
"body": "De regels zien die je binnenkomende e-mail sorteren."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Je mailfilters wijzigen",
|
||||
"body": "Regels toevoegen aan je filters op de server. Zulke regels kunnen binnenkomende e-mail verplaatsen, doorsturen of verwijderen."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Je taken lezen",
|
||||
"body": "Je takenlijsten en taken zien."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Je taken wijzigen",
|
||||
"body": "Taken aanmaken, wijzigen, afronden en verwijderen."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Je sjablonen lezen",
|
||||
"body": "Je opgeslagen berichtsjablonen zien."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Je sjablonen wijzigen",
|
||||
"body": "Berichtsjablonen aanmaken, wijzigen en verwijderen."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Je S/MIME-status zien",
|
||||
"body": "Zien of je S/MIME-sleutels en -certificaten hebt, zonder toegang tot de sleutels."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Je afwezigheidsmelding zien",
|
||||
"body": "Zien of je automatisch antwoord aanstaat en wat erin staat."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Je afwezigheidsmelding wijzigen",
|
||||
"body": "Je automatisch antwoord aan- of uitzetten en de tekst en datums ervan wijzigen."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Je instellingen lezen",
|
||||
"body": "Je voorkeuren en labeldefinities zien."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Je instellingen wijzigen",
|
||||
"body": "Labels toevoegen en herschikken en je voorkeuren wijzigen."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "De beveiliging van je account zien",
|
||||
"body": "Zien of tweefactoraanmelding en versleuteling aanstaan, zonder toegang tot geheimen."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Weten wanneer je je aanmeldt",
|
||||
"body": "Een melding krijgen wanneer je je aanmeldt, van account wisselt of je sessie wordt vernieuwd."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Je afmelden",
|
||||
"body": "Je afmelden bij de webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Je accounts zien",
|
||||
"body": "De accounts zien die je hebt toegevoegd, met hun adressen en servers."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "De webmailserver voor je gebruiken",
|
||||
"body": "Deze servereindpunten aanroepen met je aanmelding:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Verbinding maken met andere websites",
|
||||
"body": "Verzoeken naar deze sites sturen. Alles wat de plug-in kan lezen, kan daarheen worden gestuurd:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Zijn instellingen van je beheerder lezen",
|
||||
"body": "De instellingen lezen die je beheerder voor deze plug-in heeft opgeslagen."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Volgen waar je bent in de app",
|
||||
"body": "Weten welke pagina open is en reageren op links waarop je klikt."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Knoppen toevoegen aan de berichtwerkbalk",
|
||||
"body": "Eigen knoppen tonen boven een geopend bericht."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Een banner bovenaan tonen",
|
||||
"body": "Een melding tonen over de hele bovenkant van de app."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Meldingen bij berichten tonen",
|
||||
"body": "Een melding tonen boven de tekst van een geopend bericht."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Inhoud onder berichten toevoegen",
|
||||
"body": "Eigen inhoud tonen onder een geopend bericht."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Versleutelingssleutels van contacten tonen",
|
||||
"body": "De versleutelingssleutels van een contact tonen en beheren."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Panelen toevoegen aan berichtdetails",
|
||||
"body": "Een eigen paneel tonen naast of onder een geopend bericht."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Bestanden op je apparaat opslaan",
|
||||
"body": "Bestanden die hij heeft gemaakt aanbieden om te downloaden."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Tabbladen toevoegen aan je Postvak IN",
|
||||
"body": "Je Postvak IN in tabbladen indelen, zoals Updates of Promoties."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Knoppen toevoegen aan de opsteller",
|
||||
"body": "Eigen knoppen tonen terwijl je een bericht schrijft."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Een paneel toevoegen aan de opsteller",
|
||||
"body": "Een eigen paneel tonen naast het bericht dat je schrijft."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Een vak toevoegen aan de zijbalk",
|
||||
"body": "Eigen inhoud tonen in de zijbalk van de mail."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Een instellingenpagina toevoegen",
|
||||
"body": "Een eigen pagina tonen in Instellingen."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Toevoegen aan het berichtmenu",
|
||||
"body": "Items toevoegen aan het menu dat opent als je met de rechtermuisknop op een bericht klikt."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Toevoegen aan de navigatiebalk",
|
||||
"body": "Een eigen knop tonen in de navigatiebalk."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Sneltoetsen toevoegen",
|
||||
"body": "Reageren op sneltoetsen die hij zelf vastlegt."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Knoppen toevoegen aan afspraken",
|
||||
"body": "Eigen knoppen tonen wanneer je een afspraak aanmaakt of bewerkt."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Een beheerpagina toevoegen",
|
||||
"body": "Een eigen pagina tonen in de beheerinstellingen."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Weten wanneer de app start en stopt",
|
||||
"body": "Een melding krijgen wanneer de app start, offline gaat of je je afmeldt."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autoryzacja nie powiodła się: {error}",
|
||||
"missing_params": "Brak kodu autoryzacji lub stanu.",
|
||||
"delivery_failed": "Nie udało się przekazać wyniku autoryzacji do karty aplikacji. Zamknij to okno i spróbuj ponownie."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Wtyczki",
|
||||
"description": "Wtyczki dodane przez administratora. Włączaj je i wyłączaj dla swojego konta.",
|
||||
"description_uploads": "Wtyczki dodają funkcje do webmaila. Włączaj je i wyłączaj dla swojego konta albo instaluj własne.",
|
||||
"description_demo": "Wtyczki nie są dostępne w wersji demo.",
|
||||
"install_button": "Zainstaluj wtyczkę",
|
||||
"install_hint": "Wybierz plik ZIP z wtyczką.",
|
||||
"install_hint_approval": "Wybierz plik ZIP z wtyczką. Zanim będzie można ją włączyć, administrator musi ją zatwierdzić.",
|
||||
"install_uploads_off": "Administrator nie pozwala na instalowanie wtyczek.",
|
||||
"install_managed_id": "Administrator udostępnia już wtyczkę o tej nazwie, więc nie można jej zastąpić.",
|
||||
"install_invalid": "Tego pliku nie można zainstalować jako wtyczki: {details}",
|
||||
"toast_installed": "Wtyczka zainstalowana. Włącz ją poniżej.",
|
||||
"toast_installed_pending": "Wtyczka zainstalowana i wysłana do zatwierdzenia przez administratora.",
|
||||
"toast_enabled": "Wtyczka {name} jest włączona",
|
||||
"toast_disabled": "Wtyczka {name} jest wyłączona",
|
||||
"toast_removed": "Usunięto wtyczkę {name}",
|
||||
"toast_forced": "Administrator utrzymuje wtyczkę {name} włączoną",
|
||||
"toast_approval_requested": "Wtyczka {name} czeka na zatwierdzenie przez administratora",
|
||||
"empty_title": "Brak wtyczek",
|
||||
"empty_admin": "Administrator nie dodał jeszcze żadnych wtyczek.",
|
||||
"empty_uploads": "Na początek zainstaluj wtyczkę z pliku ZIP.",
|
||||
"empty_demo": "Wtyczki wymagają prawdziwego konta, więc w wersji demo ich nie ma.",
|
||||
"syncing": "Sprawdzanie wtyczek na serwerze…",
|
||||
"status_installed": "Wyłączona",
|
||||
"status_enabled": "Uruchamianie",
|
||||
"status_running": "Włączona",
|
||||
"status_disabled": "Wyłączona",
|
||||
"status_error": "Problem",
|
||||
"badge_forced": "Wymagana",
|
||||
"badge_managed": "Od administratora",
|
||||
"badge_yours": "Zainstalowana przez Ciebie",
|
||||
"badge_awaiting": "Czeka na zatwierdzenie",
|
||||
"toggle_label": "Włącz lub wyłącz wtyczkę {name}",
|
||||
"forced_note": "Administrator wymaga tej wtyczki, więc nie można jej wyłączyć.",
|
||||
"permissions": "Co może robić",
|
||||
"permissions_managed": "Co może robić (zatwierdzone przez administratora)",
|
||||
"settings": "Ustawienia",
|
||||
"remove": "Usuń",
|
||||
"remove_title": "Usunąć wtyczkę {name}?",
|
||||
"remove_message": "Wtyczka i wszystko, co zapisała w tej przeglądarce, zostaną usunięte. Możesz ją później zainstalować ponownie.",
|
||||
"remove_confirm": "Usuń",
|
||||
"error_user_plugins_off": "Administrator wyłączył wtyczki instalowane przez użytkowników, więc ta wtyczka nie działa.",
|
||||
"error_approval_unavailable": "Ta wtyczka została zainstalowana, zanim wprowadzono zatwierdzanie. Usuń ją i zainstaluj ponownie, aby wysłać ją do zatwierdzenia.",
|
||||
"error_approval_denied": "Administrator nie zatwierdził tej wtyczki.",
|
||||
"error_approval_pending": "Czeka na zatwierdzenie przez administratora."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Zezwolić wtyczce {name} na te działania?",
|
||||
"intro": "Wtyczka prosi o poniższe uprawnienia. Otrzyma je tylko wtedy, gdy na to zezwolisz.",
|
||||
"high_risk_note": "Oznaczone pozycje dają wtyczce dostęp do treści Twojej poczty lub pozwalają jej wysyłać dane gdzie indziej. Zezwalaj na nie tylko zaufanym wtyczkom.",
|
||||
"revoke_hint": "W każdej chwili możesz wyłączyć lub usunąć wtyczkę w Ustawieniach.",
|
||||
"deny": "Nie zezwalaj",
|
||||
"allow": "Zezwól"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Nie potrzebuje specjalnych uprawnień.",
|
||||
"high_risk": "Wymaga ostrożności",
|
||||
"email_read": {
|
||||
"title": "Czytanie poczty",
|
||||
"body": "Widzi nadawców, odbiorców, tematy i pełną treść otwieranych wiadomości oraz listy wiadomości."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Zmiana etykiet i flag w poczcie",
|
||||
"body": "Dodaje i usuwa etykiety, flagi i inne słowa kluczowe w Twoich wiadomościach."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Zmiana poczty przed wysłaniem",
|
||||
"body": "Odczytuje i zmienia odbiorców, temat, treść i załączniki pisanych wiadomości oraz może wstrzymać wysłanie wiadomości."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Pełny dostęp do aplikacji",
|
||||
"body": "Działa z tymi samymi uprawnieniami co sam webmail. Może czytać całą Twoją pocztę i zapisane klucze oraz działać w Twoim imieniu. Zezwalaj na to tylko wtyczkom, którym w pełni ufasz."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Wysyłanie wiadomości utworzonych przez wtyczkę",
|
||||
"body": "Wysyła z Twojego konta kompletne wiadomości, na przykład podpisane lub zaszyfrowane."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Odczyt surowej treści wiadomości",
|
||||
"body": "Odczytuje oryginalne dane Twoich wiadomości i załączników oraz każdego pliku, który załączysz przed wysłaniem."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Zastępowanie załączników przed wysłaniem",
|
||||
"body": "Przesyła pliki na Twój serwer poczty i zastępuje załączony plik innym, zanim wiadomość zostanie wysłana."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Zmiana sposobu wyświetlania wiadomości",
|
||||
"body": "Zastępuje treść otwieranych wiadomości i listy wiadomości, na przykład aby pokazać odszyfrowaną zawartość."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Odczyt kalendarza",
|
||||
"body": "Widzi Twoje kalendarze i ich wydarzenia."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Zmiana kalendarza",
|
||||
"body": "Tworzy, zmienia i usuwa wydarzenia."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Odczyt kontaktów",
|
||||
"body": "Przeszukuje i odczytuje Twoje książki adresowe."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Zmiana kontaktów",
|
||||
"body": "Tworzy, zmienia i usuwa kontakty i książki adresowe."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Odczyt plików",
|
||||
"body": "Przegląda i otwiera pliki zapisane na Twoim koncie."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Zmiana plików",
|
||||
"body": "Przesyła, zmienia nazwy, przenosi i usuwa pliki na Twoim koncie."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Podgląd tożsamości nadawcy",
|
||||
"body": "Widzi adresy, z których wysyłasz wiadomości, i ich podpisy."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Zmiana tożsamości nadawcy",
|
||||
"body": "Tworzy, zmienia i usuwa tożsamości nadawcy i podpisy."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Odczyt filtrów poczty",
|
||||
"body": "Widzi reguły, które sortują Twoją przychodzącą pocztę."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Zmiana filtrów poczty",
|
||||
"body": "Dodaje reguły do filtrów na serwerze. Takie reguły mogą przenosić, przekazywać dalej lub usuwać przychodzącą pocztę."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Odczyt zadań",
|
||||
"body": "Widzi Twoje listy zadań i zadania."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Zmiana zadań",
|
||||
"body": "Tworzy, zmienia, kończy i usuwa zadania."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Odczyt szablonów",
|
||||
"body": "Widzi Twoje zapisane szablony wiadomości."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Zmiana szablonów",
|
||||
"body": "Tworzy, zmienia i usuwa szablony wiadomości."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Podgląd stanu S/MIME",
|
||||
"body": "Widzi, czy masz klucze i certyfikaty S/MIME, bez dostępu do kluczy."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Podgląd odpowiedzi o nieobecności",
|
||||
"body": "Widzi, czy automatyczna odpowiedź jest włączona i jaka jest jej treść."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Zmiana odpowiedzi o nieobecności",
|
||||
"body": "Włącza i wyłącza automatyczną odpowiedź oraz zmienia jej treść i daty."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Odczyt ustawień",
|
||||
"body": "Widzi Twoje preferencje i definicje etykiet."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Zmiana ustawień",
|
||||
"body": "Dodaje etykiety, zmienia ich kolejność i zmienia Twoje preferencje."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Podgląd zabezpieczeń konta",
|
||||
"body": "Widzi, czy uwierzytelnianie dwuskładnikowe i szyfrowanie są włączone, bez dostępu do sekretów."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Informacja o logowaniu",
|
||||
"body": "Otrzymuje informację, gdy się logujesz, przełączasz konta lub Twoja sesja zostaje odnowiona."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Wylogowywanie",
|
||||
"body": "Może wylogować Cię z webmaila."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Podgląd kont",
|
||||
"body": "Widzi dodane przez Ciebie konta wraz z ich adresami i serwerami."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Korzystanie z serwera webmaila w Twoim imieniu",
|
||||
"body": "Wywołuje te punkty końcowe serwera z Twoimi danymi logowania:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Łączenie z innymi witrynami",
|
||||
"body": "Wysyła żądania do tych witryn. Wszystko, co wtyczka może odczytać, może tam zostać wysłane:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Odczyt ustawień od administratora",
|
||||
"body": "Odczytuje ustawienia, które administrator zapisał dla tej wtyczki."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Śledzenie, gdzie jesteś w aplikacji",
|
||||
"body": "Wie, która strona jest otwarta, i reaguje na klikane linki."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Przyciski na pasku narzędzi wiadomości",
|
||||
"body": "Pokazuje własne przyciski nad otwartą wiadomością."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Baner u góry",
|
||||
"body": "Pokazuje komunikat na górze aplikacji."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Komunikaty przy wiadomościach",
|
||||
"body": "Pokazuje komunikat nad treścią otwartej wiadomości."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Treść pod wiadomościami",
|
||||
"body": "Pokazuje własną treść pod otwartą wiadomością."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Klucze szyfrowania kontaktów",
|
||||
"body": "Pokazuje klucze szyfrowania kontaktu i pozwala nimi zarządzać."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Panele w szczegółach wiadomości",
|
||||
"body": "Pokazuje własny panel obok lub pod otwartą wiadomością."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Zapisywanie plików na urządzeniu",
|
||||
"body": "Udostępnia do pobrania utworzone przez siebie pliki."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Karty w Odebranych",
|
||||
"body": "Dzieli Odebrane na karty, takie jak Aktualizacje czy Oferty."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Przyciski w edytorze wiadomości",
|
||||
"body": "Pokazuje własne przyciski podczas pisania wiadomości."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Panel w edytorze wiadomości",
|
||||
"body": "Pokazuje własny panel obok pisanej wiadomości."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Pole na pasku bocznym",
|
||||
"body": "Pokazuje własną treść na pasku bocznym poczty."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Strona ustawień",
|
||||
"body": "Pokazuje własną stronę w Ustawieniach."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Pozycje w menu wiadomości",
|
||||
"body": "Dodaje pozycje do menu otwieranego kliknięciem wiadomości prawym przyciskiem myszy."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Przycisk na pasku nawigacyjnym",
|
||||
"body": "Pokazuje własny przycisk na pasku nawigacyjnym."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Skróty klawiszowe",
|
||||
"body": "Reaguje na zdefiniowane przez siebie skróty klawiszowe."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Przyciski przy wydarzeniach",
|
||||
"body": "Pokazuje własne przyciski podczas tworzenia lub edytowania wydarzenia."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Strona administracyjna",
|
||||
"body": "Pokazuje własną stronę w ustawieniach administracyjnych."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Informacja o uruchomieniu i zamknięciu aplikacji",
|
||||
"body": "Otrzymuje informację, gdy aplikacja się uruchamia, przechodzi w tryb offline lub gdy się wylogowujesz."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Falha na autorização: {error}",
|
||||
"missing_params": "Falta o código de autorização ou o estado.",
|
||||
"delivery_failed": "Não foi possível entregar o resultado da autorização ao separador da aplicação. Feche esta janela e tente novamente."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Plugins",
|
||||
"description": "Plugins adicionados pelo seu administrador. Ative ou desative-os na sua conta.",
|
||||
"description_uploads": "Os plugins adicionam funções ao webmail. Ative ou desative-os na sua conta, ou instale os seus próprios.",
|
||||
"description_demo": "Os plugins não estão disponíveis na demo.",
|
||||
"install_button": "Instalar plugin",
|
||||
"install_hint": "Escolha um arquivo ZIP de plugin.",
|
||||
"install_hint_approval": "Escolha um arquivo ZIP de plugin. Um administrador precisa aprová-lo antes que você possa ativá-lo.",
|
||||
"install_uploads_off": "Seu administrador não permite instalar plugins.",
|
||||
"install_managed_id": "Seu administrador já fornece um plugin com este nome, por isso ele não pode ser substituído.",
|
||||
"install_invalid": "Este arquivo não é um plugin que possa ser instalado: {details}",
|
||||
"toast_installed": "Plugin instalado. Ative-o abaixo.",
|
||||
"toast_installed_pending": "Plugin instalado e enviado ao seu administrador para aprovação.",
|
||||
"toast_enabled": "{name} está ativado",
|
||||
"toast_disabled": "{name} está desativado",
|
||||
"toast_removed": "{name} foi removido",
|
||||
"toast_forced": "Seu administrador mantém {name} ativado",
|
||||
"toast_approval_requested": "{name} está aguardando a aprovação do seu administrador",
|
||||
"empty_title": "Nenhum plugin ainda",
|
||||
"empty_admin": "Seu administrador não adicionou nenhum plugin.",
|
||||
"empty_uploads": "Instale um plugin a partir de um arquivo ZIP para começar.",
|
||||
"empty_demo": "Os plugins precisam de uma conta real, por isso a demo não tem nenhum.",
|
||||
"syncing": "Verificando plugins com o servidor…",
|
||||
"status_installed": "Desativado",
|
||||
"status_enabled": "Iniciando",
|
||||
"status_running": "Ativado",
|
||||
"status_disabled": "Desativado",
|
||||
"status_error": "Problema",
|
||||
"badge_forced": "Obrigatório",
|
||||
"badge_managed": "Do seu administrador",
|
||||
"badge_yours": "Instalado por você",
|
||||
"badge_awaiting": "Aguardando aprovação",
|
||||
"toggle_label": "Ativar ou desativar {name}",
|
||||
"forced_note": "Seu administrador exige este plugin, por isso ele não pode ser desativado.",
|
||||
"permissions": "O que ele pode fazer",
|
||||
"permissions_managed": "O que ele pode fazer (aprovado pelo seu administrador)",
|
||||
"settings": "Configurações",
|
||||
"remove": "Remover",
|
||||
"remove_title": "Remover {name}?",
|
||||
"remove_message": "O plugin e tudo o que ele armazenou neste navegador serão excluídos. Você pode instalá-lo novamente depois.",
|
||||
"remove_confirm": "Remover",
|
||||
"error_user_plugins_off": "Seu administrador desativou os plugins instalados por usuários, por isso este plugin não é executado.",
|
||||
"error_approval_unavailable": "Este plugin foi instalado antes de as aprovações serem exigidas. Remova-o e instale-o novamente para enviá-lo para aprovação.",
|
||||
"error_approval_denied": "Seu administrador não aprovou este plugin.",
|
||||
"error_approval_pending": "Aguardando o seu administrador aprovar este plugin."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Permitir que {name} faça isto?",
|
||||
"intro": "O plugin pede as permissões abaixo. Ele só as recebe se você permitir.",
|
||||
"high_risk_note": "Os itens marcados dão ao plugin acesso ao conteúdo dos seus e-mails ou permitem que ele envie dados para outro lugar. Só os permita para plugins em que você confia.",
|
||||
"revoke_hint": "Você pode desativar ou remover o plugin em Configurações a qualquer momento.",
|
||||
"deny": "Não permitir",
|
||||
"allow": "Permitir"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Não precisa de permissões especiais.",
|
||||
"high_risk": "Requer atenção",
|
||||
"email_read": {
|
||||
"title": "Ler seus e-mails",
|
||||
"body": "Ver remetentes, destinatários, assuntos e o texto completo das mensagens que você abre e da lista de mensagens."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Alterar etiquetas e marcações dos seus e-mails",
|
||||
"body": "Adicionar ou remover etiquetas, marcações e outras palavras-chave nas suas mensagens."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Alterar e-mails antes do envio",
|
||||
"body": "Ler e alterar os destinatários, o assunto, o texto e os anexos das mensagens que você escreve, e impedir o envio de uma mensagem."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Acesso total a este aplicativo",
|
||||
"body": "É executado com os mesmos direitos do próprio webmail. Pode ler todos os seus e-mails e chaves armazenadas e agir em seu nome. Só permita isto para plugins em que você confia totalmente."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Enviar mensagens criadas por ele mesmo",
|
||||
"body": "Enviar mensagens completas, por exemplo assinadas ou criptografadas, a partir da sua conta."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Ler o conteúdo bruto das mensagens",
|
||||
"body": "Ler os dados originais das suas mensagens e anexos, e de cada arquivo que você anexa antes do envio."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Substituir anexos antes do envio",
|
||||
"body": "Enviar arquivos para o seu servidor de e-mail e substituir um arquivo anexado por outro antes de a mensagem ser enviada."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Alterar como as mensagens são exibidas",
|
||||
"body": "Substituir o texto das mensagens que você abre e da lista de mensagens, por exemplo para mostrar conteúdo descriptografado."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Ler seu calendário",
|
||||
"body": "Ver seus calendários e os eventos deles."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Alterar seu calendário",
|
||||
"body": "Criar, alterar e excluir eventos."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Ler seus contatos",
|
||||
"body": "Pesquisar e ler seus catálogos de endereços."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Alterar seus contatos",
|
||||
"body": "Criar, alterar e excluir contatos e catálogos de endereços."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Ler seus arquivos",
|
||||
"body": "Navegar e abrir os arquivos armazenados na sua conta."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Alterar seus arquivos",
|
||||
"body": "Enviar, renomear, mover e excluir arquivos na sua conta."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Ver suas identidades de envio",
|
||||
"body": "Ver os endereços dos quais você envia e as assinaturas deles."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Alterar suas identidades de envio",
|
||||
"body": "Criar, alterar e excluir identidades de envio e assinaturas."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Ler seus filtros de e-mail",
|
||||
"body": "Ver as regras que organizam seus e-mails recebidos."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Alterar seus filtros de e-mail",
|
||||
"body": "Adicionar regras aos filtros do servidor. Essas regras podem mover, encaminhar ou excluir e-mails recebidos."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Ler suas tarefas",
|
||||
"body": "Ver suas listas de tarefas e tarefas."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Alterar suas tarefas",
|
||||
"body": "Criar, alterar, concluir e excluir tarefas."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Ler seus modelos",
|
||||
"body": "Ver seus modelos de mensagem salvos."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Alterar seus modelos",
|
||||
"body": "Criar, alterar e excluir modelos de mensagem."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Ver seu status S/MIME",
|
||||
"body": "Ver se você tem chaves e certificados S/MIME, sem acesso às chaves."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Ver sua resposta automática",
|
||||
"body": "Ver se sua resposta automática está ativada e o que ela diz."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Alterar sua resposta automática",
|
||||
"body": "Ativar ou desativar sua resposta automática e alterar o texto e as datas."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Ler suas configurações",
|
||||
"body": "Ver suas preferências e definições de etiquetas."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Alterar suas configurações",
|
||||
"body": "Adicionar e reordenar etiquetas e alterar suas preferências."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Ver a segurança da sua conta",
|
||||
"body": "Ver se a autenticação de dois fatores e a criptografia estão ativadas, sem acesso a segredos."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Saber quando você entra",
|
||||
"body": "Ser avisado quando você entra, troca de conta ou sua sessão é renovada."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Encerrar sua sessão",
|
||||
"body": "Encerrar sua sessão no webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Ver suas contas",
|
||||
"body": "Ver as contas que você adicionou, com os endereços e servidores delas."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Usar o servidor do webmail por você",
|
||||
"body": "Chamar estes endpoints do servidor com o seu login:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Conectar-se a outros sites",
|
||||
"body": "Enviar solicitações a estes sites. Tudo o que o plugin pode ler pode ser enviado para lá:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Ler as configurações do seu administrador",
|
||||
"body": "Ler as configurações que seu administrador salvou para este plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Acompanhar onde você está no aplicativo",
|
||||
"body": "Saber qual página está aberta e reagir aos links em que você clica."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Adicionar botões à barra de ferramentas da mensagem",
|
||||
"body": "Mostrar os próprios botões acima de uma mensagem aberta."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Mostrar um banner no topo",
|
||||
"body": "Mostrar um aviso no topo do aplicativo."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Mostrar avisos nas mensagens",
|
||||
"body": "Mostrar um aviso acima do texto de uma mensagem aberta."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Adicionar conteúdo abaixo das mensagens",
|
||||
"body": "Mostrar o próprio conteúdo abaixo de uma mensagem aberta."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Mostrar chaves de criptografia dos contatos",
|
||||
"body": "Mostrar e gerenciar as chaves de criptografia de um contato."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Adicionar painéis aos detalhes da mensagem",
|
||||
"body": "Mostrar o próprio painel ao lado ou abaixo de uma mensagem aberta."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Salvar arquivos no seu dispositivo",
|
||||
"body": "Oferecer para download arquivos que ele criou."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Adicionar abas à sua caixa de entrada",
|
||||
"body": "Organizar sua caixa de entrada em abas como Atualizações ou Promoções."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Adicionar botões ao editor",
|
||||
"body": "Mostrar os próprios botões enquanto você escreve uma mensagem."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Adicionar um painel ao editor",
|
||||
"body": "Mostrar o próprio painel ao lado da mensagem que você escreve."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Adicionar uma caixa à barra lateral",
|
||||
"body": "Mostrar o próprio conteúdo na barra lateral do e-mail."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Adicionar uma página de configurações",
|
||||
"body": "Mostrar a própria página em Configurações."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Adicionar itens ao menu da mensagem",
|
||||
"body": "Adicionar itens ao menu que abre quando você clica com o botão direito em uma mensagem."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Adicionar à barra de navegação",
|
||||
"body": "Mostrar o próprio botão na barra de navegação."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Adicionar atalhos de teclado",
|
||||
"body": "Reagir aos atalhos de teclado que ele define."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Adicionar botões aos eventos",
|
||||
"body": "Mostrar os próprios botões quando você cria ou edita um evento."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Adicionar uma página de administração",
|
||||
"body": "Mostrar a própria página nas configurações de administração."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Saber quando o aplicativo inicia e para",
|
||||
"body": "Ser avisado quando o aplicativo inicia, fica offline ou você sai."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorizarea a eșuat: {error}",
|
||||
"missing_params": "Lipsește codul de autorizare sau starea.",
|
||||
"delivery_failed": "Rezultatul autorizării nu a putut fi transmis filei aplicației. Închideți această fereastră și încercați din nou."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Pluginuri",
|
||||
"description": "Pluginuri adăugate de administrator. Activați-le sau dezactivați-le pentru contul dvs.",
|
||||
"description_uploads": "Pluginurile adaugă funcții în webmail. Activați-le sau dezactivați-le pentru contul dvs. sau instalați-vă propriile pluginuri.",
|
||||
"description_demo": "Pluginurile nu sunt disponibile în demo.",
|
||||
"install_button": "Instalați un plugin",
|
||||
"install_hint": "Alegeți un fișier ZIP cu un plugin.",
|
||||
"install_hint_approval": "Alegeți un fișier ZIP cu un plugin. Un administrator trebuie să-l aprobe înainte să-l puteți activa.",
|
||||
"install_uploads_off": "Administratorul dvs. nu permite instalarea pluginurilor.",
|
||||
"install_managed_id": "Administratorul dvs. oferă deja un plugin cu acest nume, așa că nu poate fi înlocuit.",
|
||||
"install_invalid": "Acest fișier nu este un plugin care poate fi instalat: {details}",
|
||||
"toast_installed": "Pluginul a fost instalat. Activați-l mai jos.",
|
||||
"toast_installed_pending": "Pluginul a fost instalat și trimis administratorului spre aprobare.",
|
||||
"toast_enabled": "{name} este activat",
|
||||
"toast_disabled": "{name} este dezactivat",
|
||||
"toast_removed": "{name} a fost eliminat",
|
||||
"toast_forced": "Administratorul dvs. menține {name} activat",
|
||||
"toast_approval_requested": "{name} așteaptă aprobarea administratorului",
|
||||
"empty_title": "Niciun plugin încă",
|
||||
"empty_admin": "Administratorul dvs. nu a adăugat niciun plugin.",
|
||||
"empty_uploads": "Pentru a începe, instalați un plugin dintr-un fișier ZIP.",
|
||||
"empty_demo": "Pluginurile au nevoie de un cont real, așa că demo-ul nu are niciunul.",
|
||||
"syncing": "Se verifică pluginurile cu serverul…",
|
||||
"status_installed": "Dezactivat",
|
||||
"status_enabled": "Se pornește",
|
||||
"status_running": "Activat",
|
||||
"status_disabled": "Dezactivat",
|
||||
"status_error": "Problemă",
|
||||
"badge_forced": "Obligatoriu",
|
||||
"badge_managed": "De la administrator",
|
||||
"badge_yours": "Instalat de dvs.",
|
||||
"badge_awaiting": "Așteaptă aprobarea",
|
||||
"toggle_label": "Activați sau dezactivați {name}",
|
||||
"forced_note": "Administratorul dvs. impune acest plugin, așa că nu poate fi dezactivat.",
|
||||
"permissions": "Ce poate face",
|
||||
"permissions_managed": "Ce poate face (aprobat de administrator)",
|
||||
"settings": "Setări",
|
||||
"remove": "Eliminați",
|
||||
"remove_title": "Eliminați {name}?",
|
||||
"remove_message": "Pluginul și tot ce a stocat în acest browser vor fi șterse. Îl puteți instala din nou mai târziu.",
|
||||
"remove_confirm": "Eliminați",
|
||||
"error_user_plugins_off": "Administratorul dvs. a dezactivat pluginurile instalate de utilizatori, așa că acest plugin nu rulează.",
|
||||
"error_approval_unavailable": "Acest plugin a fost instalat înainte ca aprobările să fie obligatorii. Eliminați-l și instalați-l din nou pentru a-l trimite spre aprobare.",
|
||||
"error_approval_denied": "Administratorul dvs. nu a aprobat acest plugin.",
|
||||
"error_approval_pending": "Se așteaptă ca administratorul să aprobe acest plugin."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Permiteți ca {name} să facă acest lucru?",
|
||||
"intro": "Pluginul cere permisiunile de mai jos. Le primește doar dacă le permiteți.",
|
||||
"high_risk_note": "Elementele marcate oferă pluginului acces la conținutul e-mailurilor dvs. sau îi permit să trimită date în altă parte. Permiteți-le doar pluginurilor în care aveți încredere.",
|
||||
"revoke_hint": "Puteți dezactiva sau elimina pluginul oricând din Setări.",
|
||||
"deny": "Nu permiteți",
|
||||
"allow": "Permiteți"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Nu are nevoie de permisiuni speciale.",
|
||||
"high_risk": "Necesită atenție",
|
||||
"email_read": {
|
||||
"title": "Citirea e-mailurilor",
|
||||
"body": "Vede expeditorii, destinatarii, subiectele și textul complet al mesajelor pe care le deschideți și al listei de mesaje."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Modificarea etichetelor și marcajelor e-mailurilor",
|
||||
"body": "Adaugă sau elimină etichete, marcaje și alte cuvinte cheie din mesajele dvs."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Modificarea e-mailurilor înainte de trimitere",
|
||||
"body": "Citește și modifică destinatarii, subiectul, textul și atașamentele mesajelor pe care le scrieți și poate opri trimiterea unui mesaj."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Acces complet la această aplicație",
|
||||
"body": "Rulează cu aceleași drepturi ca webmailul însuși. Poate citi toate e-mailurile și cheile stocate și poate acționa în numele dvs. Permiteți acest lucru doar pluginurilor în care aveți încredere deplină."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Trimiterea mesajelor create de el însuși",
|
||||
"body": "Trimite mesaje complete, de exemplu semnate sau criptate, din contul dvs."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Citirea conținutului brut al mesajelor",
|
||||
"body": "Citește datele originale ale mesajelor și atașamentelor dvs. și ale fiecărui fișier pe care îl atașați înainte de trimitere."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Înlocuirea atașamentelor înainte de trimitere",
|
||||
"body": "Încarcă fișiere pe serverul dvs. de e-mail și înlocuiește un fișier atașat cu altul înainte ca mesajul să fie trimis."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Modificarea modului în care sunt afișate mesajele",
|
||||
"body": "Înlocuiește textul mesajelor pe care le deschideți și al listei de mesaje, de exemplu pentru a afișa conținut decriptat."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Citirea calendarului",
|
||||
"body": "Vede calendarele dvs. și evenimentele lor."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Modificarea calendarului",
|
||||
"body": "Creează, modifică și șterge evenimente."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Citirea contactelor",
|
||||
"body": "Caută în agendele dvs. și le citește."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Modificarea contactelor",
|
||||
"body": "Creează, modifică și șterge contacte și agende."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Citirea fișierelor",
|
||||
"body": "Răsfoiește și deschide fișierele stocate în contul dvs."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Modificarea fișierelor",
|
||||
"body": "Încarcă, redenumește, mută și șterge fișiere din contul dvs."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Vizualizarea identităților de expediere",
|
||||
"body": "Vede adresele de pe care trimiteți și semnăturile lor."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Modificarea identităților de expediere",
|
||||
"body": "Creează, modifică și șterge identități de expediere și semnături."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Citirea filtrelor de e-mail",
|
||||
"body": "Vede regulile care sortează e-mailurile primite."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Modificarea filtrelor de e-mail",
|
||||
"body": "Adaugă reguli în filtrele de pe server. Aceste reguli pot muta, redirecționa sau șterge e-mailurile primite."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Citirea sarcinilor",
|
||||
"body": "Vede listele de sarcini și sarcinile dvs."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Modificarea sarcinilor",
|
||||
"body": "Creează, modifică, finalizează și șterge sarcini."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Citirea șabloanelor",
|
||||
"body": "Vede șabloanele de mesaje salvate."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Modificarea șabloanelor",
|
||||
"body": "Creează, modifică și șterge șabloane de mesaje."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Vizualizarea stării S/MIME",
|
||||
"body": "Vede dacă aveți chei și certificate S/MIME, fără acces la chei."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Vizualizarea răspunsului automat",
|
||||
"body": "Vede dacă răspunsul automat este activat și ce conține."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Modificarea răspunsului automat",
|
||||
"body": "Activează sau dezactivează răspunsul automat și îi modifică textul și datele."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Citirea setărilor",
|
||||
"body": "Vede preferințele dvs. și definițiile etichetelor."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Modificarea setărilor",
|
||||
"body": "Adaugă și reordonează etichete și modifică preferințele dvs."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Vizualizarea securității contului",
|
||||
"body": "Vede dacă autentificarea în doi pași și criptarea sunt activate, fără acces la secrete."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Aflarea momentului autentificării",
|
||||
"body": "Este anunțat când vă autentificați, schimbați contul sau sesiunea este reînnoită."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Deconectarea dvs.",
|
||||
"body": "Vă deconectează din webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Vizualizarea conturilor",
|
||||
"body": "Vede conturile pe care le-ați adăugat, cu adresele și serverele lor."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Folosirea serverului webmail în numele dvs.",
|
||||
"body": "Apelează aceste endpointuri ale serverului cu datele dvs. de autentificare:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Conectarea la alte site-uri",
|
||||
"body": "Trimite cereri către aceste site-uri. Orice poate citi pluginul poate fi trimis acolo:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Citirea setărilor de la administrator",
|
||||
"body": "Citește setările pe care administratorul le-a salvat pentru acest plugin."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Urmărirea locului în care vă aflați în aplicație",
|
||||
"body": "Știe ce pagină este deschisă și reacționează la linkurile pe care faceți clic."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Adăugarea de butoane în bara de instrumente a mesajului",
|
||||
"body": "Afișează butoane proprii deasupra unui mesaj deschis."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Afișarea unui banner în partea de sus",
|
||||
"body": "Afișează o notificare în partea de sus a aplicației."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Afișarea de notificări pe mesaje",
|
||||
"body": "Afișează o notificare deasupra textului unui mesaj deschis."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Adăugarea de conținut sub mesaje",
|
||||
"body": "Afișează conținut propriu sub un mesaj deschis."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Afișarea cheilor de criptare ale contactelor",
|
||||
"body": "Afișează și gestionează cheile de criptare ale unui contact."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Adăugarea de panouri la detaliile mesajului",
|
||||
"body": "Afișează un panou propriu lângă sau sub un mesaj deschis."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Salvarea fișierelor pe dispozitiv",
|
||||
"body": "Oferă spre descărcare fișierele create de el."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Adăugarea de file în Primite",
|
||||
"body": "Sortează mesajele primite în file precum Actualizări sau Promoții."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Adăugarea de butoane în fereastra de redactare",
|
||||
"body": "Afișează butoane proprii în timp ce scrieți un mesaj."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Adăugarea unui panou în fereastra de redactare",
|
||||
"body": "Afișează un panou propriu lângă mesajul pe care îl scrieți."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Adăugarea unei casete în bara laterală",
|
||||
"body": "Afișează conținut propriu în bara laterală a e-mailului."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Adăugarea unei pagini de setări",
|
||||
"body": "Afișează o pagină proprie în Setări."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Adăugarea de opțiuni în meniul mesajului",
|
||||
"body": "Adaugă opțiuni în meniul care se deschide când faceți clic dreapta pe un mesaj."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Adăugarea în bara de navigare",
|
||||
"body": "Afișează un buton propriu în bara de navigare."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Adăugarea de comenzi rapide de la tastatură",
|
||||
"body": "Reacționează la comenzile rapide de la tastatură pe care le definește."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Adăugarea de butoane la evenimente",
|
||||
"body": "Afișează butoane proprii când creați sau editați un eveniment."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Adăugarea unei pagini de administrare",
|
||||
"body": "Afișează o pagină proprie în setările de administrare."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Aflarea momentului pornirii și opririi aplicației",
|
||||
"body": "Este anunțat când aplicația pornește, trece offline sau vă deconectați."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Ошибка авторизации: {error}",
|
||||
"missing_params": "Отсутствует код авторизации или состояние.",
|
||||
"delivery_failed": "Не удалось передать результат авторизации на вкладку приложения. Закройте это окно и попробуйте снова."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Плагины",
|
||||
"description": "Плагины, добавленные администратором. Включайте и выключайте их для своего аккаунта.",
|
||||
"description_uploads": "Плагины добавляют в webmail новые функции. Включайте и выключайте их для своего аккаунта или устанавливайте свои.",
|
||||
"description_demo": "В демо-режиме плагины недоступны.",
|
||||
"install_button": "Установить плагин",
|
||||
"install_hint": "Выберите ZIP-файл плагина.",
|
||||
"install_hint_approval": "Выберите ZIP-файл плагина. Прежде чем вы сможете его включить, его должен одобрить администратор.",
|
||||
"install_uploads_off": "Администратор не разрешает устанавливать плагины.",
|
||||
"install_managed_id": "Администратор уже предоставляет плагин с таким именем, поэтому его нельзя заменить.",
|
||||
"install_invalid": "Этот файл не является плагином, который можно установить: {details}",
|
||||
"toast_installed": "Плагин установлен. Включите его ниже.",
|
||||
"toast_installed_pending": "Плагин установлен и отправлен администратору на одобрение.",
|
||||
"toast_enabled": "Плагин {name} включён",
|
||||
"toast_disabled": "Плагин {name} выключен",
|
||||
"toast_removed": "Плагин {name} удалён",
|
||||
"toast_forced": "Администратор требует, чтобы плагин {name} оставался включённым",
|
||||
"toast_approval_requested": "Плагин {name} ожидает одобрения администратором",
|
||||
"empty_title": "Плагинов пока нет",
|
||||
"empty_admin": "Администратор не добавил ни одного плагина.",
|
||||
"empty_uploads": "Чтобы начать, установите плагин из ZIP-файла.",
|
||||
"empty_demo": "Плагинам нужен настоящий аккаунт, поэтому в демо-режиме их нет.",
|
||||
"syncing": "Проверка плагинов на сервере…",
|
||||
"status_installed": "Выключен",
|
||||
"status_enabled": "Запускается",
|
||||
"status_running": "Включён",
|
||||
"status_disabled": "Выключен",
|
||||
"status_error": "Ошибка",
|
||||
"badge_forced": "Обязательный",
|
||||
"badge_managed": "От администратора",
|
||||
"badge_yours": "Установлен вами",
|
||||
"badge_awaiting": "Ожидает одобрения",
|
||||
"toggle_label": "Включить или выключить плагин {name}",
|
||||
"forced_note": "Администратор требует этот плагин, поэтому его нельзя выключить.",
|
||||
"permissions": "Что он может делать",
|
||||
"permissions_managed": "Что он может делать (одобрено администратором)",
|
||||
"settings": "Настройки",
|
||||
"remove": "Удалить",
|
||||
"remove_title": "Удалить плагин {name}?",
|
||||
"remove_message": "Плагин и все данные, которые он сохранил в этом браузере, будут удалены. Позже его можно установить снова.",
|
||||
"remove_confirm": "Удалить",
|
||||
"error_user_plugins_off": "Администратор отключил плагины, установленные пользователями, поэтому этот плагин не работает.",
|
||||
"error_approval_unavailable": "Этот плагин был установлен до того, как появилось одобрение. Удалите и установите его снова, чтобы отправить на одобрение.",
|
||||
"error_approval_denied": "Администратор не одобрил этот плагин.",
|
||||
"error_approval_pending": "Ожидается одобрение этого плагина администратором."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Разрешить плагину {name} это?",
|
||||
"intro": "Плагин запрашивает разрешения, перечисленные ниже. Он получит их, только если вы разрешите.",
|
||||
"high_risk_note": "Отмеченные пункты дают плагину доступ к содержимому вашей почты или позволяют ему передавать данные на сторону. Разрешайте их только плагинам, которым доверяете.",
|
||||
"revoke_hint": "Вы в любой момент можете выключить или удалить плагин в настройках.",
|
||||
"deny": "Не разрешать",
|
||||
"allow": "Разрешить"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Ему не нужны особые разрешения.",
|
||||
"high_risk": "Требует осторожности",
|
||||
"email_read": {
|
||||
"title": "Читать вашу почту",
|
||||
"body": "Видеть отправителей, получателей, темы и полный текст открытых писем и писем в списке сообщений."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Менять теги и флажки писем",
|
||||
"body": "Добавлять и удалять теги, флажки и другие ключевые слова у ваших писем."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Менять письма перед отправкой",
|
||||
"body": "Читать и менять получателей, тему, текст и вложения писем, которые вы пишете, а также останавливать отправку письма."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Полный доступ к приложению",
|
||||
"body": "Работает с теми же правами, что и сам webmail. Может читать всю вашу почту и сохранённые ключи и действовать от вашего имени. Разрешайте это только плагинам, которым полностью доверяете."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Отправлять собственные письма",
|
||||
"body": "Отправлять с вашего аккаунта готовые письма, например подписанные или зашифрованные."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Читать исходные данные писем",
|
||||
"body": "Читать исходные данные ваших писем и вложений, а также каждого файла, который вы прикрепляете, до отправки."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Заменять вложения перед отправкой",
|
||||
"body": "Загружать файлы на ваш почтовый сервер и заменять прикреплённый файл другим до отправки письма."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Менять отображение писем",
|
||||
"body": "Заменять текст открытых писем и писем в списке сообщений, например чтобы показать расшифрованное содержимое."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Читать ваш календарь",
|
||||
"body": "Видеть ваши календари и их события."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Менять ваш календарь",
|
||||
"body": "Создавать, менять и удалять события."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Читать ваши контакты",
|
||||
"body": "Искать в ваших адресных книгах и читать их."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Менять ваши контакты",
|
||||
"body": "Создавать, менять и удалять контакты и адресные книги."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Читать ваши файлы",
|
||||
"body": "Просматривать и открывать файлы, хранящиеся в вашем аккаунте."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Менять ваши файлы",
|
||||
"body": "Загружать, переименовывать, перемещать и удалять файлы в вашем аккаунте."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Видеть ваши адреса отправителя",
|
||||
"body": "Видеть адреса, с которых вы отправляете письма, и их подписи."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Менять ваши адреса отправителя",
|
||||
"body": "Создавать, менять и удалять адреса отправителя и подписи."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Читать ваши фильтры почты",
|
||||
"body": "Видеть правила, которые сортируют входящую почту."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Менять ваши фильтры почты",
|
||||
"body": "Добавлять правила в фильтры на сервере. Такие правила могут перемещать, пересылать или удалять входящую почту."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Читать ваши задачи",
|
||||
"body": "Видеть ваши списки задач и задачи."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Менять ваши задачи",
|
||||
"body": "Создавать, менять, завершать и удалять задачи."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Читать ваши шаблоны",
|
||||
"body": "Видеть сохранённые шаблоны писем."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Менять ваши шаблоны",
|
||||
"body": "Создавать, менять и удалять шаблоны писем."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Видеть ваш статус S/MIME",
|
||||
"body": "Видеть, есть ли у вас ключи и сертификаты S/MIME, без доступа к самим ключам."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Видеть ваш автоответ",
|
||||
"body": "Видеть, включён ли автоответ и что в нём написано."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Менять ваш автоответ",
|
||||
"body": "Включать и выключать автоответ, менять его текст и даты."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Читать ваши настройки",
|
||||
"body": "Видеть ваши параметры и определения тегов."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Менять ваши настройки",
|
||||
"body": "Добавлять теги, менять их порядок и менять ваши параметры."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Видеть безопасность аккаунта",
|
||||
"body": "Видеть, включены ли двухфакторная аутентификация и шифрование, без доступа к секретам."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Узнавать о вашем входе",
|
||||
"body": "Получать уведомления, когда вы входите, переключаете аккаунт или ваш сеанс продлевается."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Выполнять выход",
|
||||
"body": "Выполнять ваш выход из webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Видеть ваши аккаунты",
|
||||
"body": "Видеть добавленные вами аккаунты, их адреса и серверы."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Обращаться к серверу webmail от вашего имени",
|
||||
"body": "Вызывать эти адреса сервера с вашими учётными данными:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Подключаться к другим сайтам",
|
||||
"body": "Отправлять запросы на эти сайты. Туда может быть отправлено всё, что плагин может прочитать:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Читать свои настройки от администратора",
|
||||
"body": "Читать настройки, которые администратор сохранил для этого плагина."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Следить за тем, где вы в приложении",
|
||||
"body": "Знать, какая страница открыта, и реагировать на ссылки, по которым вы нажимаете."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Добавлять кнопки на панель инструментов письма",
|
||||
"body": "Показывать свои кнопки над открытым письмом."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Показывать баннер сверху",
|
||||
"body": "Показывать уведомление в верхней части приложения."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Показывать уведомления в письмах",
|
||||
"body": "Показывать уведомление над текстом открытого письма."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Добавлять содержимое под письмами",
|
||||
"body": "Показывать своё содержимое под открытым письмом."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Показывать ключи шифрования контактов",
|
||||
"body": "Показывать ключи шифрования контакта и управлять ими."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Добавлять панели к письму",
|
||||
"body": "Показывать свою панель рядом с открытым письмом или под ним."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Сохранять файлы на ваше устройство",
|
||||
"body": "Предлагать для скачивания созданные им файлы."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Добавлять вкладки во «Входящие»",
|
||||
"body": "Распределять входящие письма по вкладкам, например «Обновления» или «Промоакции»."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Добавлять кнопки в редактор",
|
||||
"body": "Показывать свои кнопки, пока вы пишете письмо."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Добавлять панель в редактор",
|
||||
"body": "Показывать свою панель рядом с письмом, которое вы пишете."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Добавлять блок на боковую панель",
|
||||
"body": "Показывать своё содержимое на боковой панели почты."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Добавлять страницу настроек",
|
||||
"body": "Показывать свою страницу в настройках."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Добавлять пункты в меню письма",
|
||||
"body": "Добавлять пункты в меню, которое открывается по правому щелчку на письме."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Добавлять кнопку на панель навигации",
|
||||
"body": "Показывать свою кнопку на панели навигации."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Добавлять сочетания клавиш",
|
||||
"body": "Реагировать на заданные им сочетания клавиш."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Добавлять кнопки к событиям",
|
||||
"body": "Показывать свои кнопки, когда вы создаёте или редактируете событие."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Добавлять страницу администрирования",
|
||||
"body": "Показывать свою страницу в настройках администратора."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Узнавать о запуске и остановке приложения",
|
||||
"body": "Получать уведомления, когда приложение запускается, теряет связь или вы выходите."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Autorizácia zlyhala: {error}",
|
||||
"missing_params": "Chýba autorizačný kód alebo stav.",
|
||||
"delivery_failed": "Výsledok autorizácie sa nepodarilo odovzdať karte aplikácie. Zavrite toto okno a skúste to znova."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Doplnky",
|
||||
"description": "Doplnky pridané vaším správcom. Pre svoj účet ich môžete zapnúť alebo vypnúť.",
|
||||
"description_uploads": "Doplnky pridávajú do webmailu ďalšie funkcie. Pre svoj účet ich môžete zapnúť alebo vypnúť, prípadne nainštalovať vlastné.",
|
||||
"description_demo": "Doplnky nie sú v ukážkovej verzii k dispozícii.",
|
||||
"install_button": "Nainštalovať doplnok",
|
||||
"install_hint": "Vyberte súbor ZIP s doplnkom.",
|
||||
"install_hint_approval": "Vyberte súbor ZIP s doplnkom. Skôr než ho budete môcť zapnúť, musí ho schváliť správca.",
|
||||
"install_uploads_off": "Váš správca nepovoľuje inštaláciu doplnkov.",
|
||||
"install_managed_id": "Váš správca už poskytuje doplnok s týmto názvom, preto ho nemožno nahradiť.",
|
||||
"install_invalid": "Tento súbor nie je doplnok, ktorý možno nainštalovať: {details}",
|
||||
"toast_installed": "Doplnok je nainštalovaný. Zapnite ho nižšie.",
|
||||
"toast_installed_pending": "Doplnok je nainštalovaný a odoslaný správcovi na schválenie.",
|
||||
"toast_enabled": "Doplnok {name} je zapnutý",
|
||||
"toast_disabled": "Doplnok {name} je vypnutý",
|
||||
"toast_removed": "Doplnok {name} bol odstránený",
|
||||
"toast_forced": "Váš správca ponecháva doplnok {name} zapnutý",
|
||||
"toast_approval_requested": "Doplnok {name} čaká na schválenie správcom",
|
||||
"empty_title": "Zatiaľ žiadne doplnky",
|
||||
"empty_admin": "Váš správca zatiaľ nepridal žiadne doplnky.",
|
||||
"empty_uploads": "Začnite inštaláciou doplnku zo súboru ZIP.",
|
||||
"empty_demo": "Doplnky vyžadujú skutočný účet, preto ich ukážková verzia nemá.",
|
||||
"syncing": "Kontrola doplnkov na serveri…",
|
||||
"status_installed": "Vypnuté",
|
||||
"status_enabled": "Spúšťa sa",
|
||||
"status_running": "Zapnuté",
|
||||
"status_disabled": "Vypnuté",
|
||||
"status_error": "Problém",
|
||||
"badge_forced": "Povinný",
|
||||
"badge_managed": "Od správcu",
|
||||
"badge_yours": "Nainštalované vami",
|
||||
"badge_awaiting": "Čaká na schválenie",
|
||||
"toggle_label": "Zapnúť alebo vypnúť doplnok {name}",
|
||||
"forced_note": "Váš správca tento doplnok vyžaduje, preto ho nemožno vypnúť.",
|
||||
"permissions": "Čo môže robiť",
|
||||
"permissions_managed": "Čo môže robiť (schválené správcom)",
|
||||
"settings": "Nastavenia",
|
||||
"remove": "Odstrániť",
|
||||
"remove_title": "Odstrániť doplnok {name}?",
|
||||
"remove_message": "Doplnok aj všetko, čo uložil v tomto prehliadači, sa vymaže. Neskôr ho môžete nainštalovať znova.",
|
||||
"remove_confirm": "Odstrániť",
|
||||
"error_user_plugins_off": "Váš správca vypol doplnky inštalované používateľmi, preto tento doplnok nebeží.",
|
||||
"error_approval_unavailable": "Tento doplnok bol nainštalovaný skôr, než sa vyžadovalo schválenie. Odstráňte ho a nainštalujte znova, aby sa odoslal na schválenie.",
|
||||
"error_approval_denied": "Váš správca tento doplnok neschválil.",
|
||||
"error_approval_pending": "Čaká sa, kým správca tento doplnok schváli."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Povoliť doplnku {name} tieto akcie?",
|
||||
"intro": "Doplnok žiada o nižšie uvedené oprávnenia. Dostane ich, len ak ich povolíte.",
|
||||
"high_risk_note": "Označené položky dávajú doplnku prístup k obsahu vašej pošty alebo mu umožňujú posielať údaje inam. Povoľte ich len doplnkom, ktorým dôverujete.",
|
||||
"revoke_hint": "Doplnok môžete kedykoľvek vypnúť alebo odstrániť v Nastaveniach.",
|
||||
"deny": "Nepovoliť",
|
||||
"allow": "Povoliť"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Nepotrebuje žiadne zvláštne oprávnenia.",
|
||||
"high_risk": "Vyžaduje opatrnosť",
|
||||
"email_read": {
|
||||
"title": "Čítať vašu poštu",
|
||||
"body": "Vidí odosielateľov, príjemcov, predmety a celý text správ, ktoré otvoríte, aj zoznamu správ."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Meniť štítky a príznaky pošty",
|
||||
"body": "Pridáva alebo odstraňuje štítky, príznaky a ďalšie kľúčové slová pri vašich správach."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Meniť poštu pred odoslaním",
|
||||
"body": "Číta a mení príjemcov, predmet, text a prílohy správ, ktoré píšete, a môže zastaviť odoslanie správy."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Úplný prístup k tejto aplikácii",
|
||||
"body": "Beží s rovnakými právami ako samotný webmail. Môže čítať všetku vašu poštu a uložené kľúče a konať vo vašom mene. Povoľte to len doplnkom, ktorým úplne dôverujete."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Odosielať správy, ktoré sám vytvoril",
|
||||
"body": "Odosiela z vášho účtu kompletné správy, napríklad podpísané alebo šifrované."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Čítať nespracovaný obsah správ",
|
||||
"body": "Číta pôvodné údaje vašich správ a príloh aj každého súboru, ktorý priložíte pred odoslaním."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Nahrádzať prílohy pred odoslaním",
|
||||
"body": "Nahráva súbory na váš poštový server a pred odoslaním správy nahradí priložený súbor iným."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Meniť zobrazenie správ",
|
||||
"body": "Nahrádza text správ, ktoré otvoríte, aj zoznamu správ, napríklad aby zobrazil dešifrovaný obsah."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Čítať váš kalendár",
|
||||
"body": "Vidí vaše kalendáre a ich udalosti."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Meniť váš kalendár",
|
||||
"body": "Vytvára, mení a odstraňuje udalosti."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Čítať vaše kontakty",
|
||||
"body": "Prehľadáva a číta vaše adresáre."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Meniť vaše kontakty",
|
||||
"body": "Vytvára, mení a odstraňuje kontakty a adresáre."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Čítať vaše súbory",
|
||||
"body": "Prechádza a otvára súbory uložené vo vašom účte."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Meniť vaše súbory",
|
||||
"body": "Nahráva, premenúva, presúva a odstraňuje súbory vo vašom účte."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Vidieť vaše identity odosielateľa",
|
||||
"body": "Vidí adresy, z ktorých odosielate, a ich podpisy."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Meniť vaše identity odosielateľa",
|
||||
"body": "Vytvára, mení a odstraňuje identity odosielateľa a podpisy."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Čítať vaše filtre pošty",
|
||||
"body": "Vidí pravidlá, ktoré triedia vašu prichádzajúcu poštu."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Meniť vaše filtre pošty",
|
||||
"body": "Pridáva pravidlá do filtrov na serveri. Takéto pravidlá môžu prichádzajúcu poštu presúvať, preposielať alebo odstraňovať."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Čítať vaše úlohy",
|
||||
"body": "Vidí vaše zoznamy úloh a úlohy."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Meniť vaše úlohy",
|
||||
"body": "Vytvára, mení, dokončuje a odstraňuje úlohy."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Čítať vaše šablóny",
|
||||
"body": "Vidí vaše uložené šablóny správ."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Meniť vaše šablóny",
|
||||
"body": "Vytvára, mení a odstraňuje šablóny správ."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Vidieť stav S/MIME",
|
||||
"body": "Vidí, či máte kľúče a certifikáty S/MIME, bez prístupu ku kľúčom."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Vidieť automatickú odpoveď v neprítomnosti",
|
||||
"body": "Vidí, či je automatická odpoveď zapnutá a čo obsahuje."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Meniť automatickú odpoveď v neprítomnosti",
|
||||
"body": "Zapína a vypína automatickú odpoveď a mení jej text a dátumy."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Čítať vaše nastavenia",
|
||||
"body": "Vidí vaše predvoľby a definície štítkov."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Meniť vaše nastavenia",
|
||||
"body": "Pridáva štítky, mení ich poradie a mení vaše predvoľby."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Vidieť zabezpečenie účtu",
|
||||
"body": "Vidí, či je zapnuté dvojfaktorové overenie a šifrovanie, bez prístupu k tajným údajom."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Vedieť, kedy sa prihlásite",
|
||||
"body": "Dostáva správu, keď sa prihlásite, prepnete účet alebo sa obnoví vaša relácia."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Odhlásiť vás",
|
||||
"body": "Môže vás odhlásiť z webmailu."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Vidieť vaše účty",
|
||||
"body": "Vidí účty, ktoré ste pridali, vrátane ich adries a serverov."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Používať server webmailu vo vašom mene",
|
||||
"body": "Volá tieto koncové body servera s vaším prihlásením:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Pripájať sa k iným webom",
|
||||
"body": "Odosiela požiadavky na tieto weby. Čokoľvek, čo doplnok môže čítať, tam môže byť odoslané:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Čítať nastavenia od správcu",
|
||||
"body": "Číta nastavenia, ktoré pre tento doplnok uložil váš správca."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Sledovať, kde sa v aplikácii nachádzate",
|
||||
"body": "Vie, ktorá stránka je otvorená, a reaguje na odkazy, na ktoré kliknete."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Pridávať tlačidlá na panel nástrojov správy",
|
||||
"body": "Zobrazuje vlastné tlačidlá nad otvorenou správou."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Zobrazovať banner hore",
|
||||
"body": "Zobrazuje oznámenie cez hornú časť aplikácie."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Zobrazovať oznámenia pri správach",
|
||||
"body": "Zobrazuje oznámenie nad textom otvorenej správy."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Pridávať obsah pod správy",
|
||||
"body": "Zobrazuje vlastný obsah pod otvorenou správou."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Zobrazovať šifrovacie kľúče kontaktov",
|
||||
"body": "Zobrazuje a spravuje šifrovacie kľúče pri kontakte."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Pridávať panely do podrobností správy",
|
||||
"body": "Zobrazuje vlastný panel vedľa otvorenej správy alebo pod ňou."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Ukladať súbory do zariadenia",
|
||||
"body": "Ponúka na stiahnutie súbory, ktoré vytvoril."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Pridávať karty do Doručených",
|
||||
"body": "Rozdeľuje Doručené do kariet, napríklad Aktualizácie alebo Akcie."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Pridávať tlačidlá do editora správy",
|
||||
"body": "Zobrazuje vlastné tlačidlá, keď píšete správu."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Pridávať panel do editora správy",
|
||||
"body": "Zobrazuje vlastný panel vedľa správy, ktorú píšete."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Pridávať pole do postranného panela",
|
||||
"body": "Zobrazuje vlastný obsah v postrannom paneli pošty."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Pridávať stránku nastavení",
|
||||
"body": "Zobrazuje vlastnú stránku v Nastaveniach."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Pridávať položky do ponuky správy",
|
||||
"body": "Pridáva položky do ponuky, ktorá sa otvorí po kliknutí pravým tlačidlom na správu."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Pridávať tlačidlo na navigačnú lištu",
|
||||
"body": "Zobrazuje vlastné tlačidlo na navigačnej lište."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Pridávať klávesové skratky",
|
||||
"body": "Reaguje na klávesové skratky, ktoré sám definuje."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Pridávať tlačidlá k udalostiam",
|
||||
"body": "Zobrazuje vlastné tlačidlá, keď vytvárate alebo upravujete udalosť."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Pridávať stránku administrácie",
|
||||
"body": "Zobrazuje vlastnú stránku v nastaveniach administrácie."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Vedieť, kedy sa aplikácia spúšťa a ukončuje",
|
||||
"body": "Dostáva správu, keď sa aplikácia spustí, prejde do režimu offline alebo keď sa odhlásite."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Yetkilendirme başarısız oldu: {error}",
|
||||
"missing_params": "Yetkilendirme kodu veya durum eksik.",
|
||||
"delivery_failed": "Yetkilendirme sonucu uygulama sekmesine iletilemedi. Lütfen bu pencereyi kapatıp tekrar deneyin."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Eklentiler",
|
||||
"description": "Yöneticinizin eklediği eklentiler. Hesabınız için açıp kapatabilirsiniz.",
|
||||
"description_uploads": "Eklentiler webmail'e yeni özellikler katar. Hesabınız için açıp kapatabilir veya kendi eklentilerinizi yükleyebilirsiniz.",
|
||||
"description_demo": "Eklentiler demoda kullanılamaz.",
|
||||
"install_button": "Eklenti yükle",
|
||||
"install_hint": "Bir eklenti ZIP dosyası seçin.",
|
||||
"install_hint_approval": "Bir eklenti ZIP dosyası seçin. Açabilmeniz için önce bir yöneticinin onaylaması gerekir.",
|
||||
"install_uploads_off": "Yöneticiniz eklenti yüklemeye izin vermiyor.",
|
||||
"install_managed_id": "Yöneticiniz bu adda bir eklentiyi zaten sağlıyor, bu yüzden değiştirilemez.",
|
||||
"install_invalid": "Bu dosya yüklenebilir bir eklenti değil: {details}",
|
||||
"toast_installed": "Eklenti yüklendi. Aşağıdan açabilirsiniz.",
|
||||
"toast_installed_pending": "Eklenti yüklendi ve onay için yöneticinize gönderildi.",
|
||||
"toast_enabled": "{name} eklentisi açıldı",
|
||||
"toast_disabled": "{name} eklentisi kapatıldı",
|
||||
"toast_removed": "{name} eklentisi kaldırıldı",
|
||||
"toast_forced": "Yöneticiniz {name} eklentisini açık tutuyor",
|
||||
"toast_approval_requested": "{name} eklentisi yöneticinizin onayını bekliyor",
|
||||
"empty_title": "Henüz eklenti yok",
|
||||
"empty_admin": "Yöneticiniz henüz eklenti eklemedi.",
|
||||
"empty_uploads": "Başlamak için bir ZIP dosyasından eklenti yükleyin.",
|
||||
"empty_demo": "Eklentiler gerçek bir hesap gerektirir, bu yüzden demoda eklenti yok.",
|
||||
"syncing": "Eklentiler sunucuyla denetleniyor…",
|
||||
"status_installed": "Kapalı",
|
||||
"status_enabled": "Başlatılıyor",
|
||||
"status_running": "Açık",
|
||||
"status_disabled": "Kapalı",
|
||||
"status_error": "Sorun var",
|
||||
"badge_forced": "Zorunlu",
|
||||
"badge_managed": "Yöneticinizden",
|
||||
"badge_yours": "Sizin yüklediğiniz",
|
||||
"badge_awaiting": "Onay bekliyor",
|
||||
"toggle_label": "{name} eklentisini aç veya kapat",
|
||||
"forced_note": "Yöneticiniz bu eklentiyi zorunlu tuttuğu için kapatılamaz.",
|
||||
"permissions": "Neler yapabilir",
|
||||
"permissions_managed": "Neler yapabilir (yöneticiniz onayladı)",
|
||||
"settings": "Ayarlar",
|
||||
"remove": "Kaldır",
|
||||
"remove_title": "{name} eklentisi kaldırılsın mı?",
|
||||
"remove_message": "Eklenti ve bu tarayıcıda kaydettiği her şey silinir. Daha sonra yeniden yükleyebilirsiniz.",
|
||||
"remove_confirm": "Kaldır",
|
||||
"error_user_plugins_off": "Yöneticiniz kullanıcıların yüklediği eklentileri kapattı, bu yüzden bu eklenti çalışmıyor.",
|
||||
"error_approval_unavailable": "Bu eklenti, onay zorunlu olmadan önce yüklendi. Onaya göndermek için kaldırıp yeniden yükleyin.",
|
||||
"error_approval_denied": "Yöneticiniz bu eklentiyi onaylamadı.",
|
||||
"error_approval_pending": "Bu eklentinin yöneticiniz tarafından onaylanması bekleniyor."
|
||||
},
|
||||
"consent": {
|
||||
"title": "{name} eklentisine bu izin verilsin mi?",
|
||||
"intro": "Eklenti aşağıdaki izinleri istiyor. Bu izinleri yalnızca siz izin verirseniz alır.",
|
||||
"high_risk_note": "İşaretli öğeler eklentiye e-postalarınızın içeriğine erişim verir veya verileri başka yerlere göndermesine izin verir. Bunlara yalnızca güvendiğiniz eklentiler için izin verin.",
|
||||
"revoke_hint": "Eklentiyi istediğiniz zaman Ayarlar'dan kapatabilir veya kaldırabilirsiniz.",
|
||||
"deny": "İzin verme",
|
||||
"allow": "İzin ver"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Özel bir izne ihtiyacı yok.",
|
||||
"high_risk": "Dikkat gerektirir",
|
||||
"email_read": {
|
||||
"title": "E-postalarınızı okuma",
|
||||
"body": "Açtığınız iletilerin ve ileti listesindekilerin gönderenlerini, alıcılarını, konularını ve tam metnini görme."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "E-postalarınızdaki etiketleri ve bayrakları değiştirme",
|
||||
"body": "İletilerinize etiket, bayrak ve diğer anahtar sözcükleri ekleme veya kaldırma."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Gönderilmeden önce iletileri değiştirme",
|
||||
"body": "Yazdığınız iletilerin alıcılarını, konusunu, metnini ve eklerini okuma ve değiştirme, bir iletinin gönderilmesini durdurma."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Bu uygulamaya tam erişim",
|
||||
"body": "Webmail'in kendisiyle aynı haklarla çalışır. Tüm e-postalarınızı ve kayıtlı anahtarlarınızı okuyabilir, sizin adınıza işlem yapabilir. Buna yalnızca tamamen güvendiğiniz eklentiler için izin verin."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Kendi oluşturduğu iletileri gönderme",
|
||||
"body": "Hesabınızdan imzalı veya şifreli iletiler gibi eksiksiz iletiler gönderme."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "İletilerin ham içeriğini okuma",
|
||||
"body": "İletilerinizin ve eklerinizin özgün verilerini ve eklediğiniz her dosyayı gönderilmeden önce okuma."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Göndermeden önce ekleri değiştirme",
|
||||
"body": "Posta sunucunuza dosya yükleme ve ileti gönderilmeden önce eklediğiniz bir dosyayı başkasıyla değiştirme."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "İletilerin gösterilme biçimini değiştirme",
|
||||
"body": "Açtığınız iletilerin ve ileti listesindekilerin metnini değiştirme, örneğin şifresi çözülmüş içeriği göstermek için."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Takviminizi okuma",
|
||||
"body": "Takvimlerinizi ve etkinliklerini görme."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Takviminizi değiştirme",
|
||||
"body": "Etkinlik oluşturma, değiştirme ve silme."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Kişilerinizi okuma",
|
||||
"body": "Adres defterlerinizde arama yapma ve onları okuma."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Kişilerinizi değiştirme",
|
||||
"body": "Kişi ve adres defteri oluşturma, değiştirme ve silme."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Dosyalarınızı okuma",
|
||||
"body": "Hesabınızda saklanan dosyalara göz atma ve onları açma."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Dosyalarınızı değiştirme",
|
||||
"body": "Hesabınızdaki dosyaları yükleme, yeniden adlandırma, taşıma ve silme."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Gönderen adreslerinizi görme",
|
||||
"body": "Gönderim yaptığınız adresleri ve imzalarını görme."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Gönderen adreslerinizi değiştirme",
|
||||
"body": "Gönderen adresi ve imza oluşturma, değiştirme ve silme."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Posta filtrelerinizi okuma",
|
||||
"body": "Gelen postalarınızı sıralayan kuralları görme."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Posta filtrelerinizi değiştirme",
|
||||
"body": "Sunucudaki filtrelerinize kural ekleme. Bu kurallar gelen postaları taşıyabilir, iletebilir veya silebilir."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Görevlerinizi okuma",
|
||||
"body": "Görev listelerinizi ve görevlerinizi görme."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Görevlerinizi değiştirme",
|
||||
"body": "Görev oluşturma, değiştirme, tamamlama ve silme."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Şablonlarınızı okuma",
|
||||
"body": "Kayıtlı ileti şablonlarınızı görme."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Şablonlarınızı değiştirme",
|
||||
"body": "İleti şablonu oluşturma, değiştirme ve silme."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "S/MIME durumunuzu görme",
|
||||
"body": "Anahtarlara erişmeden S/MIME anahtarlarınızın ve sertifikalarınızın olup olmadığını görme."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Ofis dışı yanıtınızı görme",
|
||||
"body": "Otomatik yanıtınızın açık olup olmadığını ve ne yazdığını görme."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Ofis dışı yanıtınızı değiştirme",
|
||||
"body": "Otomatik yanıtınızı açıp kapatma, metnini ve tarihlerini değiştirme."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Ayarlarınızı okuma",
|
||||
"body": "Tercihlerinizi ve etiket tanımlarınızı görme."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Ayarlarınızı değiştirme",
|
||||
"body": "Etiket ekleme, sıralarını değiştirme ve tercihlerinizi değiştirme."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Hesap güvenliğinizi görme",
|
||||
"body": "Gizli bilgilere erişmeden iki faktörlü kimlik doğrulamanın ve şifrelemenin açık olup olmadığını görme."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Giriş yaptığınızı bilme",
|
||||
"body": "Giriş yaptığınızda, hesap değiştirdiğinizde veya oturumunuz yenilendiğinde haber alma."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Oturumunuzu kapatma",
|
||||
"body": "Webmail'den çıkış yapmanızı sağlama."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Hesaplarınızı görme",
|
||||
"body": "Eklediğiniz hesapları adresleri ve sunucularıyla birlikte görme."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Sizin adınıza webmail sunucusunu kullanma",
|
||||
"body": "Şu sunucu uç noktalarını oturum bilgilerinizle çağırma:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Başka web sitelerine bağlanma",
|
||||
"body": "Şu sitelere istek gönderme. Eklentinin okuyabildiği her şey oraya gönderilebilir:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Yöneticinizin ayarlarını okuma",
|
||||
"body": "Yöneticinizin bu eklenti için kaydettiği ayarları okuma."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Uygulamada nerede olduğunuzu izleme",
|
||||
"body": "Hangi sayfanın açık olduğunu bilme ve tıkladığınız bağlantılara tepki verme."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "İleti araç çubuğuna düğme ekleme",
|
||||
"body": "Açık bir iletinin üstünde kendi düğmelerini gösterme."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Üstte bir başlık bandı gösterme",
|
||||
"body": "Uygulamanın üst kısmında bir bildirim gösterme."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "İletilerde bildirim gösterme",
|
||||
"body": "Açık bir iletinin metninin üstünde bildirim gösterme."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "İletilerin altına içerik ekleme",
|
||||
"body": "Açık bir iletinin altında kendi içeriğini gösterme."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Kişilerin şifreleme anahtarlarını gösterme",
|
||||
"body": "Bir kişinin şifreleme anahtarlarını gösterme ve yönetme."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "İleti ayrıntılarına panel ekleme",
|
||||
"body": "Açık bir iletinin yanında veya altında kendi panelini gösterme."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Dosyaları cihazınıza kaydetme",
|
||||
"body": "Oluşturduğu dosyaları indirmeniz için sunma."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Gelen Kutusu'na sekme ekleme",
|
||||
"body": "Gelen kutunuzu Güncellemeler veya Promosyonlar gibi sekmelere ayırma."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "İleti düzenleyiciye düğme ekleme",
|
||||
"body": "Siz ileti yazarken kendi düğmelerini gösterme."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "İleti düzenleyiciye panel ekleme",
|
||||
"body": "Yazdığınız iletinin yanında kendi panelini gösterme."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Kenar çubuğuna kutu ekleme",
|
||||
"body": "Posta kenar çubuğunda kendi içeriğini gösterme."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Ayarlar sayfası ekleme",
|
||||
"body": "Ayarlar'da kendi sayfasını gösterme."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "İleti menüsüne öğe ekleme",
|
||||
"body": "Bir iletiye sağ tıkladığınızda açılan menüye öğe ekleme."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Gezinme çubuğuna öğe ekleme",
|
||||
"body": "Gezinme çubuğunda kendi düğmesini gösterme."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Klavye kısayolları ekleme",
|
||||
"body": "Tanımladığı klavye kısayollarına tepki verme."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Etkinliklere düğme ekleme",
|
||||
"body": "Bir etkinlik oluştururken veya düzenlerken kendi düğmelerini gösterme."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Yönetim sayfası ekleme",
|
||||
"body": "Yönetim ayarlarında kendi sayfasını gösterme."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Uygulamanın başladığını ve durduğunu bilme",
|
||||
"body": "Uygulama başladığında, çevrimdışı olduğunda veya çıkış yaptığınızda haber alma."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "Не вдалося виконати авторизацію: {error}",
|
||||
"missing_params": "Відсутній код авторизації або стан.",
|
||||
"delivery_failed": "Не вдалося передати результат авторизації на вкладку програми. Закрийте це вікно та спробуйте ще раз."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Плагіни",
|
||||
"description": "Плагіни, які додав ваш адміністратор. Вмикайте й вимикайте їх для свого облікового запису.",
|
||||
"description_uploads": "Плагіни додають у webmail нові функції. Вмикайте й вимикайте їх для свого облікового запису або встановлюйте власні.",
|
||||
"description_demo": "У демо-режимі плагіни недоступні.",
|
||||
"install_button": "Встановити плагін",
|
||||
"install_hint": "Виберіть ZIP-файл плагіна.",
|
||||
"install_hint_approval": "Виберіть ZIP-файл плагіна. Перш ніж ви зможете його ввімкнути, його має схвалити адміністратор.",
|
||||
"install_uploads_off": "Ваш адміністратор не дозволяє встановлювати плагіни.",
|
||||
"install_managed_id": "Ваш адміністратор уже надає плагін із такою назвою, тому його не можна замінити.",
|
||||
"install_invalid": "Цей файл не є плагіном, який можна встановити: {details}",
|
||||
"toast_installed": "Плагін встановлено. Увімкніть його нижче.",
|
||||
"toast_installed_pending": "Плагін встановлено й надіслано вашому адміністратору на схвалення.",
|
||||
"toast_enabled": "Плагін {name} увімкнено",
|
||||
"toast_disabled": "Плагін {name} вимкнено",
|
||||
"toast_removed": "Плагін {name} видалено",
|
||||
"toast_forced": "Ваш адміністратор вимагає, щоб плагін {name} залишався ввімкненим",
|
||||
"toast_approval_requested": "Плагін {name} чекає на схвалення вашим адміністратором",
|
||||
"empty_title": "Плагінів поки немає",
|
||||
"empty_admin": "Ваш адміністратор не додав жодного плагіна.",
|
||||
"empty_uploads": "Щоб почати, встановіть плагін із ZIP-файлу.",
|
||||
"empty_demo": "Плагінам потрібен справжній обліковий запис, тому в демо-режимі їх немає.",
|
||||
"syncing": "Перевірка плагінів на сервері…",
|
||||
"status_installed": "Вимкнено",
|
||||
"status_enabled": "Запускається",
|
||||
"status_running": "Увімкнено",
|
||||
"status_disabled": "Вимкнено",
|
||||
"status_error": "Помилка",
|
||||
"badge_forced": "Обов'язковий",
|
||||
"badge_managed": "Від вашого адміністратора",
|
||||
"badge_yours": "Встановлено вами",
|
||||
"badge_awaiting": "Чекає на схвалення",
|
||||
"toggle_label": "Увімкнути або вимкнути плагін {name}",
|
||||
"forced_note": "Ваш адміністратор вимагає цей плагін, тому його не можна вимкнути.",
|
||||
"permissions": "Що він може робити",
|
||||
"permissions_managed": "Що він може робити (схвалено вашим адміністратором)",
|
||||
"settings": "Налаштування",
|
||||
"remove": "Видалити",
|
||||
"remove_title": "Видалити плагін {name}?",
|
||||
"remove_message": "Плагін і все, що він зберіг у цьому браузері, буде видалено. Пізніше його можна встановити знову.",
|
||||
"remove_confirm": "Видалити",
|
||||
"error_user_plugins_off": "Ваш адміністратор вимкнув плагіни, встановлені користувачами, тому цей плагін не працює.",
|
||||
"error_approval_unavailable": "Цей плагін встановлено ще до того, як з'явилося схвалення. Видаліть і встановіть його знову, щоб надіслати на схвалення.",
|
||||
"error_approval_denied": "Ваш адміністратор не схвалив цей плагін.",
|
||||
"error_approval_pending": "Очікується, що ваш адміністратор схвалить цей плагін."
|
||||
},
|
||||
"consent": {
|
||||
"title": "Дозволити плагіну {name} це?",
|
||||
"intro": "Плагін запитує дозволи, наведені нижче. Він отримає їх, лише якщо ви дозволите.",
|
||||
"high_risk_note": "Позначені пункти дають плагіну доступ до вмісту вашої пошти або дозволяють йому передавати дані деінде. Дозволяйте їх лише плагінам, яким довіряєте.",
|
||||
"revoke_hint": "Ви будь-коли можете вимкнути або видалити плагін у налаштуваннях.",
|
||||
"deny": "Не дозволяти",
|
||||
"allow": "Дозволити"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "Йому не потрібні особливі дозволи.",
|
||||
"high_risk": "Потребує обережності",
|
||||
"email_read": {
|
||||
"title": "Читати вашу пошту",
|
||||
"body": "Бачити відправників, одержувачів, теми й повний текст відкритих листів і листів у списку повідомлень."
|
||||
},
|
||||
"email_write": {
|
||||
"title": "Змінювати теги й позначки листів",
|
||||
"body": "Додавати й прибирати теги, позначки та інші ключові слова у ваших листах."
|
||||
},
|
||||
"email_send": {
|
||||
"title": "Змінювати листи перед надсиланням",
|
||||
"body": "Читати й змінювати одержувачів, тему, текст і вкладення листів, які ви пишете, а також зупиняти надсилання листа."
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "Повний доступ до програми",
|
||||
"body": "Працює з тими самими правами, що й сам webmail. Може читати всю вашу пошту та збережені ключі й діяти від вашого імені. Дозволяйте це лише плагінам, яким повністю довіряєте."
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "Надсилати власні листи",
|
||||
"body": "Надсилати з вашого облікового запису готові листи, наприклад підписані або зашифровані."
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "Читати вихідні дані листів",
|
||||
"body": "Читати вихідні дані ваших листів і вкладень, а також кожного файлу, який ви прикріплюєте, до надсилання."
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "Замінювати вкладення перед надсиланням",
|
||||
"body": "Завантажувати файли на ваш поштовий сервер і замінювати прикріплений файл іншим до надсилання листа."
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "Змінювати показ листів",
|
||||
"body": "Замінювати текст відкритих листів і листів у списку повідомлень, наприклад щоб показати розшифрований вміст."
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "Читати ваш календар",
|
||||
"body": "Бачити ваші календарі та їхні події."
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "Змінювати ваш календар",
|
||||
"body": "Створювати, змінювати й видаляти події."
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "Читати ваші контакти",
|
||||
"body": "Шукати у ваших адресних книгах і читати їх."
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "Змінювати ваші контакти",
|
||||
"body": "Створювати, змінювати й видаляти контакти та адресні книги."
|
||||
},
|
||||
"files_read": {
|
||||
"title": "Читати ваші файли",
|
||||
"body": "Переглядати й відкривати файли, що зберігаються у вашому обліковому записі."
|
||||
},
|
||||
"files_write": {
|
||||
"title": "Змінювати ваші файли",
|
||||
"body": "Завантажувати, перейменовувати, переміщувати й видаляти файли у вашому обліковому записі."
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "Бачити ваші адреси відправника",
|
||||
"body": "Бачити адреси, з яких ви надсилаєте листи, та їхні підписи."
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "Змінювати ваші адреси відправника",
|
||||
"body": "Створювати, змінювати й видаляти адреси відправника та підписи."
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "Читати ваші фільтри пошти",
|
||||
"body": "Бачити правила, які сортують вхідну пошту."
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "Змінювати ваші фільтри пошти",
|
||||
"body": "Додавати правила до фільтрів на сервері. Такі правила можуть переміщувати, пересилати або видаляти вхідну пошту."
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "Читати ваші завдання",
|
||||
"body": "Бачити ваші списки завдань і завдання."
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "Змінювати ваші завдання",
|
||||
"body": "Створювати, змінювати, завершувати й видаляти завдання."
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "Читати ваші шаблони",
|
||||
"body": "Бачити збережені шаблони листів."
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "Змінювати ваші шаблони",
|
||||
"body": "Створювати, змінювати й видаляти шаблони листів."
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "Бачити ваш стан S/MIME",
|
||||
"body": "Бачити, чи маєте ви ключі та сертифікати S/MIME, без доступу до самих ключів."
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "Бачити вашу автовідповідь",
|
||||
"body": "Бачити, чи ввімкнено автовідповідь і що в ній написано."
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "Змінювати вашу автовідповідь",
|
||||
"body": "Вмикати й вимикати автовідповідь, змінювати її текст і дати."
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "Читати ваші налаштування",
|
||||
"body": "Бачити ваші параметри та визначення тегів."
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "Змінювати ваші налаштування",
|
||||
"body": "Додавати теги, змінювати їхній порядок і змінювати ваші параметри."
|
||||
},
|
||||
"security_read": {
|
||||
"title": "Бачити безпеку облікового запису",
|
||||
"body": "Бачити, чи ввімкнено двофакторну автентифікацію та шифрування, без доступу до секретів."
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "Знати, коли ви входите",
|
||||
"body": "Отримувати сповіщення, коли ви входите, перемикаєте обліковий запис або ваш сеанс подовжується."
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "Виконувати вихід",
|
||||
"body": "Виконувати ваш вихід із webmail."
|
||||
},
|
||||
"account_read": {
|
||||
"title": "Бачити ваші облікові записи",
|
||||
"body": "Бачити додані вами облікові записи, їхні адреси та сервери."
|
||||
},
|
||||
"http_post": {
|
||||
"title": "Звертатися до сервера webmail від вашого імені",
|
||||
"body": "Викликати ці адреси сервера з вашими обліковими даними:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "Підключатися до інших сайтів",
|
||||
"body": "Надсилати запити на ці сайти. Туди може потрапити все, що плагін може прочитати:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "Читати свої налаштування від адміністратора",
|
||||
"body": "Читати налаштування, які ваш адміністратор зберіг для цього плагіна."
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "Стежити, де ви в програмі",
|
||||
"body": "Знати, яку сторінку відкрито, і реагувати на посилання, які ви натискаєте."
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "Додавати кнопки на панель інструментів листа",
|
||||
"body": "Показувати власні кнопки над відкритим листом."
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "Показувати банер угорі",
|
||||
"body": "Показувати сповіщення у верхній частині програми."
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "Показувати сповіщення в листах",
|
||||
"body": "Показувати сповіщення над текстом відкритого листа."
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "Додавати вміст під листами",
|
||||
"body": "Показувати власний вміст під відкритим листом."
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "Показувати ключі шифрування контактів",
|
||||
"body": "Показувати ключі шифрування контакту й керувати ними."
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "Додавати панелі до листа",
|
||||
"body": "Показувати власну панель поруч із відкритим листом або під ним."
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "Зберігати файли на ваш пристрій",
|
||||
"body": "Пропонувати для завантаження створені ним файли."
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "Додавати вкладки у «Вхідні»",
|
||||
"body": "Розподіляти вхідні листи за вкладками, наприклад «Оновлення» або «Акції»."
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "Додавати кнопки в редактор листа",
|
||||
"body": "Показувати власні кнопки, поки ви пишете лист."
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "Додавати панель у редактор листа",
|
||||
"body": "Показувати власну панель поруч із листом, який ви пишете."
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "Додавати блок на бічну панель",
|
||||
"body": "Показувати власний вміст на бічній панелі пошти."
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "Додавати сторінку налаштувань",
|
||||
"body": "Показувати власну сторінку в налаштуваннях."
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "Додавати пункти в меню листа",
|
||||
"body": "Додавати пункти в меню, яке відкривається, коли ви клацаєте лист правою кнопкою."
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "Додавати кнопку на панель навігації",
|
||||
"body": "Показувати власну кнопку на панелі навігації."
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "Додавати сполучення клавіш",
|
||||
"body": "Реагувати на сполучення клавіш, які він визначає."
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "Додавати кнопки до подій",
|
||||
"body": "Показувати власні кнопки, коли ви створюєте або редагуєте подію."
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "Додавати сторінку адміністрування",
|
||||
"body": "Показувати власну сторінку в налаштуваннях адміністратора."
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "Знати, коли програма запускається й зупиняється",
|
||||
"body": "Отримувати сповіщення, коли програма запускається, втрачає зв'язок або ви виходите."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "授權失敗:{error}",
|
||||
"missing_params": "缺少授權碼或狀態。",
|
||||
"delivery_failed": "無法將授權結果傳遞至應用程式分頁。請關閉此視窗並再試一次。"
|
||||
},
|
||||
"settings": {
|
||||
"title": "外掛程式",
|
||||
"description": "由管理員新增的外掛程式。您可以為自己的帳號開啟或關閉。",
|
||||
"description_uploads": "外掛程式可為網頁郵件新增功能。您可以為自己的帳號開啟或關閉,也可以自行安裝。",
|
||||
"description_demo": "示範模式無法使用外掛程式。",
|
||||
"install_button": "安裝外掛程式",
|
||||
"install_hint": "請選擇外掛程式 ZIP 檔案。",
|
||||
"install_hint_approval": "請選擇外掛程式 ZIP 檔案。需經管理員核准後才能開啟。",
|
||||
"install_uploads_off": "管理員不允許安裝外掛程式。",
|
||||
"install_managed_id": "管理員已提供同名的外掛程式,因此無法取代。",
|
||||
"install_invalid": "此檔案不是可安裝的外掛程式:{details}",
|
||||
"toast_installed": "外掛程式已安裝。請在下方開啟。",
|
||||
"toast_installed_pending": "外掛程式已安裝,並已送交管理員核准。",
|
||||
"toast_enabled": "{name} 已開啟",
|
||||
"toast_disabled": "{name} 已關閉",
|
||||
"toast_removed": "{name} 已移除",
|
||||
"toast_forced": "管理員要求 {name} 保持開啟",
|
||||
"toast_approval_requested": "{name} 正在等待管理員核准",
|
||||
"empty_title": "尚無外掛程式",
|
||||
"empty_admin": "管理員尚未新增任何外掛程式。",
|
||||
"empty_uploads": "從 ZIP 檔案安裝外掛程式即可開始使用。",
|
||||
"empty_demo": "外掛程式需要真實帳號,因此示範模式中沒有外掛程式。",
|
||||
"syncing": "正在與伺服器核對外掛程式…",
|
||||
"status_installed": "已關閉",
|
||||
"status_enabled": "啟動中",
|
||||
"status_running": "已開啟",
|
||||
"status_disabled": "已關閉",
|
||||
"status_error": "發生問題",
|
||||
"badge_forced": "必要",
|
||||
"badge_managed": "由管理員提供",
|
||||
"badge_yours": "由您安裝",
|
||||
"badge_awaiting": "等待核准",
|
||||
"toggle_label": "開啟或關閉 {name}",
|
||||
"forced_note": "管理員要求使用此外掛程式,因此無法關閉。",
|
||||
"permissions": "可執行的動作",
|
||||
"permissions_managed": "可執行的動作(已由管理員核准)",
|
||||
"settings": "設定",
|
||||
"remove": "移除",
|
||||
"remove_title": "要移除 {name} 嗎?",
|
||||
"remove_message": "外掛程式及其儲存在此瀏覽器中的所有內容都會被刪除。您之後可以再次安裝。",
|
||||
"remove_confirm": "移除",
|
||||
"error_user_plugins_off": "管理員已關閉使用者安裝的外掛程式,因此此外掛程式不會執行。",
|
||||
"error_approval_unavailable": "此外掛程式是在需要核准之前安裝的。請移除後重新安裝,以送交核准。",
|
||||
"error_approval_denied": "管理員未核准此外掛程式。",
|
||||
"error_approval_pending": "正在等待管理員核准此外掛程式。"
|
||||
},
|
||||
"consent": {
|
||||
"title": "要允許 {name} 執行這些動作嗎?",
|
||||
"intro": "此外掛程式要求下列權限。只有在您允許後才會取得。",
|
||||
"high_risk_note": "標示的項目會讓外掛程式存取您的郵件內容,或將資料傳送到其他地方。請只對您信任的外掛程式允許。",
|
||||
"revoke_hint": "您隨時可以在設定中關閉或移除此外掛程式。",
|
||||
"deny": "不允許",
|
||||
"allow": "允許"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "不需要特殊權限。",
|
||||
"high_risk": "需留意",
|
||||
"email_read": {
|
||||
"title": "讀取您的郵件",
|
||||
"body": "查看您開啟的郵件和郵件清單中的寄件者、收件者、主旨和完整內文。"
|
||||
},
|
||||
"email_write": {
|
||||
"title": "變更郵件的標籤和旗標",
|
||||
"body": "為您的郵件新增或移除標籤、旗標和其他關鍵字。"
|
||||
},
|
||||
"email_send": {
|
||||
"title": "在傳送前變更郵件",
|
||||
"body": "讀取並變更您撰寫的郵件的收件者、主旨、內文和附件,並可阻止郵件傳送。"
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "完整存取此應用程式",
|
||||
"body": "以與網頁郵件本身相同的權限執行。它可以讀取您所有的郵件和已儲存的金鑰,並代表您執行動作。請只對您完全信任的外掛程式允許。"
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "傳送它自行建立的郵件",
|
||||
"body": "從您的帳號傳送完整的郵件,例如已簽署或已加密的郵件。"
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "讀取郵件的原始內容",
|
||||
"body": "讀取您的郵件和附件的原始資料,以及傳送前您附加的每個檔案。"
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "在傳送前取代附件",
|
||||
"body": "將檔案上傳到您的郵件伺服器,並在郵件傳送前以另一個檔案取代您附加的檔案。"
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "變更郵件的顯示方式",
|
||||
"body": "取代您開啟的郵件和郵件清單中的內文,例如用來顯示解密後的內容。"
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "讀取您的行事曆",
|
||||
"body": "查看您的行事曆及其中的活動。"
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "變更您的行事曆",
|
||||
"body": "建立、變更和刪除活動。"
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "讀取您的聯絡人",
|
||||
"body": "搜尋和讀取您的通訊錄。"
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "變更您的聯絡人",
|
||||
"body": "建立、變更和刪除聯絡人及通訊錄。"
|
||||
},
|
||||
"files_read": {
|
||||
"title": "讀取您的檔案",
|
||||
"body": "瀏覽和開啟您帳號中儲存的檔案。"
|
||||
},
|
||||
"files_write": {
|
||||
"title": "變更您的檔案",
|
||||
"body": "上傳、重新命名、移動和刪除您帳號中的檔案。"
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "查看您的寄件身分",
|
||||
"body": "查看您用來傳送郵件的地址及其簽名檔。"
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "變更您的寄件身分",
|
||||
"body": "建立、變更和刪除寄件身分及簽名檔。"
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "讀取您的郵件篩選規則",
|
||||
"body": "查看用來整理收到郵件的規則。"
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "變更您的郵件篩選規則",
|
||||
"body": "在伺服器端篩選規則中新增規則。這些規則可以移動、轉寄或刪除收到的郵件。"
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "讀取您的任務",
|
||||
"body": "查看您的任務清單和任務。"
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "變更您的任務",
|
||||
"body": "建立、變更、完成和刪除任務。"
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "讀取您的範本",
|
||||
"body": "查看您儲存的郵件範本。"
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "變更您的範本",
|
||||
"body": "建立、變更和刪除郵件範本。"
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "查看您的 S/MIME 狀態",
|
||||
"body": "查看您是否有 S/MIME 金鑰和憑證,但無法存取金鑰。"
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "查看您的外出自動回覆",
|
||||
"body": "查看自動回覆是否已開啟及其內容。"
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "變更您的外出自動回覆",
|
||||
"body": "開啟或關閉自動回覆,並變更其內容和日期。"
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "讀取您的設定",
|
||||
"body": "查看您的偏好設定和標籤定義。"
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "變更您的設定",
|
||||
"body": "新增標籤、調整標籤順序,並變更您的偏好設定。"
|
||||
},
|
||||
"security_read": {
|
||||
"title": "查看您的帳號安全性",
|
||||
"body": "查看雙因素驗證和加密是否已開啟,但無法存取機密資訊。"
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "得知您何時登入",
|
||||
"body": "在您登入、切換帳號或工作階段更新時收到通知。"
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "將您登出",
|
||||
"body": "將您從網頁郵件登出。"
|
||||
},
|
||||
"account_read": {
|
||||
"title": "查看您的帳號",
|
||||
"body": "查看您新增的帳號及其地址和伺服器。"
|
||||
},
|
||||
"http_post": {
|
||||
"title": "代表您使用網頁郵件伺服器",
|
||||
"body": "使用您的登入資訊呼叫下列伺服器端點:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "連線到其他網站",
|
||||
"body": "向下列網站傳送要求。外掛程式能讀取的任何內容都可能被傳送到這些網站:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "讀取管理員為其儲存的設定",
|
||||
"body": "讀取管理員為此外掛程式儲存的設定。"
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "追蹤您在應用程式中的位置",
|
||||
"body": "得知目前開啟的頁面,並對您點選的連結做出回應。"
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "在郵件工具列新增按鈕",
|
||||
"body": "在開啟的郵件上方顯示它自己的按鈕。"
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "在頂端顯示橫幅",
|
||||
"body": "在應用程式頂端顯示一則通知。"
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "在郵件上顯示通知",
|
||||
"body": "在開啟的郵件內文上方顯示一則通知。"
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "在郵件下方新增內容",
|
||||
"body": "在開啟的郵件下方顯示它自己的內容。"
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "顯示聯絡人的加密金鑰",
|
||||
"body": "顯示並管理聯絡人的加密金鑰。"
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "在郵件詳細資料新增面板",
|
||||
"body": "在開啟的郵件旁邊或下方顯示它自己的面板。"
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "將檔案儲存到您的裝置",
|
||||
"body": "提供它建立的檔案供下載。"
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "為收件匣新增分頁",
|
||||
"body": "將收件匣分成「最新快訊」或「促銷內容」等分頁。"
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "在撰寫視窗新增按鈕",
|
||||
"body": "在您撰寫郵件時顯示它自己的按鈕。"
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "在撰寫視窗新增面板",
|
||||
"body": "在您撰寫的郵件旁邊顯示它自己的面板。"
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "在側邊欄新增方塊",
|
||||
"body": "在郵件側邊欄顯示它自己的內容。"
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "新增設定頁面",
|
||||
"body": "在設定中顯示它自己的頁面。"
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "新增到郵件選單",
|
||||
"body": "在您按右鍵點選郵件時開啟的選單中新增項目。"
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "新增到導覽列",
|
||||
"body": "在導覽列顯示它自己的按鈕。"
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "新增鍵盤快速鍵",
|
||||
"body": "回應它定義的鍵盤快速鍵。"
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "為活動新增按鈕",
|
||||
"body": "在您建立或編輯活動時顯示它自己的按鈕。"
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "新增管理頁面",
|
||||
"body": "在管理設定中顯示它自己的頁面。"
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "得知應用程式何時啟動和停止",
|
||||
"body": "在應用程式啟動、離線或您登出時收到通知。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
@@ -3970,6 +3970,276 @@
|
||||
"failed_detail": "授权失败:{error}",
|
||||
"missing_params": "缺少授权码或状态。",
|
||||
"delivery_failed": "无法将授权结果传递到应用标签页。请关闭此窗口并重试。"
|
||||
},
|
||||
"settings": {
|
||||
"title": "插件",
|
||||
"description": "由管理员添加的插件。可以为您的账户开启或关闭。",
|
||||
"description_uploads": "插件可为网页邮箱添加功能。可以为您的账户开启或关闭,也可以自行安装。",
|
||||
"description_demo": "演示模式中无法使用插件。",
|
||||
"install_button": "安装插件",
|
||||
"install_hint": "请选择插件 ZIP 文件。",
|
||||
"install_hint_approval": "请选择插件 ZIP 文件。需要管理员批准后才能开启。",
|
||||
"install_uploads_off": "管理员不允许安装插件。",
|
||||
"install_managed_id": "管理员已提供同名插件,因此无法替换。",
|
||||
"install_invalid": "此文件不是可安装的插件:{details}",
|
||||
"toast_installed": "插件已安装。请在下方开启。",
|
||||
"toast_installed_pending": "插件已安装,并已提交给管理员审批。",
|
||||
"toast_enabled": "{name} 已开启",
|
||||
"toast_disabled": "{name} 已关闭",
|
||||
"toast_removed": "{name} 已移除",
|
||||
"toast_forced": "管理员要求 {name} 保持开启",
|
||||
"toast_approval_requested": "{name} 正在等待管理员批准",
|
||||
"empty_title": "暂无插件",
|
||||
"empty_admin": "管理员尚未添加任何插件。",
|
||||
"empty_uploads": "从 ZIP 文件安装插件即可开始使用。",
|
||||
"empty_demo": "插件需要真实账户,因此演示模式中没有插件。",
|
||||
"syncing": "正在与服务器核对插件…",
|
||||
"status_installed": "已关闭",
|
||||
"status_enabled": "正在启动",
|
||||
"status_running": "已开启",
|
||||
"status_disabled": "已关闭",
|
||||
"status_error": "出现问题",
|
||||
"badge_forced": "必需",
|
||||
"badge_managed": "由管理员提供",
|
||||
"badge_yours": "由您安装",
|
||||
"badge_awaiting": "等待批准",
|
||||
"toggle_label": "开启或关闭 {name}",
|
||||
"forced_note": "管理员要求使用此插件,因此无法关闭。",
|
||||
"permissions": "可执行的操作",
|
||||
"permissions_managed": "可执行的操作(已由管理员批准)",
|
||||
"settings": "设置",
|
||||
"remove": "移除",
|
||||
"remove_title": "移除 {name}?",
|
||||
"remove_message": "插件及其在此浏览器中存储的所有内容都将被删除。您以后可以重新安装。",
|
||||
"remove_confirm": "移除",
|
||||
"error_user_plugins_off": "管理员已关闭用户安装的插件,因此此插件不会运行。",
|
||||
"error_approval_unavailable": "此插件是在需要审批之前安装的。请移除后重新安装,以提交审批。",
|
||||
"error_approval_denied": "管理员未批准此插件。",
|
||||
"error_approval_pending": "正在等待管理员批准此插件。"
|
||||
},
|
||||
"consent": {
|
||||
"title": "允许 {name} 执行这些操作?",
|
||||
"intro": "此插件请求以下权限。只有在您允许后才会获得。",
|
||||
"high_risk_note": "带标记的项目会让插件访问您的邮件内容,或将数据发送到其他地方。请只对您信任的插件允许。",
|
||||
"revoke_hint": "您可以随时在设置中关闭或移除此插件。",
|
||||
"deny": "不允许",
|
||||
"allow": "允许"
|
||||
},
|
||||
"permissions": {
|
||||
"none": "不需要特殊权限。",
|
||||
"high_risk": "需谨慎",
|
||||
"email_read": {
|
||||
"title": "读取您的邮件",
|
||||
"body": "查看您打开的邮件和邮件列表中的发件人、收件人、主题和完整正文。"
|
||||
},
|
||||
"email_write": {
|
||||
"title": "更改邮件的标签和旗标",
|
||||
"body": "为您的邮件添加或移除标签、旗标和其他关键词。"
|
||||
},
|
||||
"email_send": {
|
||||
"title": "在发送前更改邮件",
|
||||
"body": "读取并更改您撰写的邮件的收件人、主题、正文和附件,并可阻止邮件发送。"
|
||||
},
|
||||
"crypto_full": {
|
||||
"title": "完全访问此应用",
|
||||
"body": "以与网页邮箱本身相同的权限运行。它可以读取您的所有邮件和已存储的密钥,并代表您执行操作。请只对您完全信任的插件允许。"
|
||||
},
|
||||
"email_raw_send": {
|
||||
"title": "发送它自行构建的邮件",
|
||||
"body": "从您的账户发送完整的邮件,例如已签名或已加密的邮件。"
|
||||
},
|
||||
"email_blob_read": {
|
||||
"title": "读取邮件的原始内容",
|
||||
"body": "读取您的邮件和附件的原始数据,以及发送前您附加的每个文件。"
|
||||
},
|
||||
"email_blob_write": {
|
||||
"title": "在发送前替换附件",
|
||||
"body": "将文件上传到您的邮件服务器,并在邮件发送前用另一个文件替换您附加的文件。"
|
||||
},
|
||||
"email_render_takeover": {
|
||||
"title": "更改邮件的显示方式",
|
||||
"body": "替换您打开的邮件和邮件列表中的正文,例如用于显示解密后的内容。"
|
||||
},
|
||||
"calendar_read": {
|
||||
"title": "读取您的日历",
|
||||
"body": "查看您的日历及其中的活动。"
|
||||
},
|
||||
"calendar_write": {
|
||||
"title": "更改您的日历",
|
||||
"body": "创建、更改和删除活动。"
|
||||
},
|
||||
"contacts_read": {
|
||||
"title": "读取您的联系人",
|
||||
"body": "搜索和读取您的通讯录。"
|
||||
},
|
||||
"contacts_write": {
|
||||
"title": "更改您的联系人",
|
||||
"body": "创建、更改和删除联系人及通讯录。"
|
||||
},
|
||||
"files_read": {
|
||||
"title": "读取您的文件",
|
||||
"body": "浏览和打开您账户中存储的文件。"
|
||||
},
|
||||
"files_write": {
|
||||
"title": "更改您的文件",
|
||||
"body": "上传、重命名、移动和删除您账户中的文件。"
|
||||
},
|
||||
"identity_read": {
|
||||
"title": "查看您的发件身份",
|
||||
"body": "查看您用于发送邮件的地址及其签名。"
|
||||
},
|
||||
"identity_write": {
|
||||
"title": "更改您的发件身份",
|
||||
"body": "创建、更改和删除发件身份及签名。"
|
||||
},
|
||||
"filters_read": {
|
||||
"title": "读取您的邮件过滤器",
|
||||
"body": "查看用于整理收到邮件的规则。"
|
||||
},
|
||||
"filters_write": {
|
||||
"title": "更改您的邮件过滤器",
|
||||
"body": "向服务器端过滤器添加规则。这些规则可以移动、转发或删除收到的邮件。"
|
||||
},
|
||||
"tasks_read": {
|
||||
"title": "读取您的任务",
|
||||
"body": "查看您的任务列表和任务。"
|
||||
},
|
||||
"tasks_write": {
|
||||
"title": "更改您的任务",
|
||||
"body": "创建、更改、完成和删除任务。"
|
||||
},
|
||||
"templates_read": {
|
||||
"title": "读取您的模板",
|
||||
"body": "查看您保存的邮件模板。"
|
||||
},
|
||||
"templates_write": {
|
||||
"title": "更改您的模板",
|
||||
"body": "创建、更改和删除邮件模板。"
|
||||
},
|
||||
"smime_read": {
|
||||
"title": "查看您的 S/MIME 状态",
|
||||
"body": "查看您是否拥有 S/MIME 密钥和证书,但无法访问密钥。"
|
||||
},
|
||||
"vacation_read": {
|
||||
"title": "查看您的外出自动回复",
|
||||
"body": "查看自动回复是否已开启及其内容。"
|
||||
},
|
||||
"vacation_write": {
|
||||
"title": "更改您的外出自动回复",
|
||||
"body": "开启或关闭自动回复,并更改其内容和日期。"
|
||||
},
|
||||
"settings_read": {
|
||||
"title": "读取您的设置",
|
||||
"body": "查看您的偏好设置和标签定义。"
|
||||
},
|
||||
"settings_write": {
|
||||
"title": "更改您的设置",
|
||||
"body": "添加标签、调整标签顺序,并更改您的偏好设置。"
|
||||
},
|
||||
"security_read": {
|
||||
"title": "查看您的账户安全",
|
||||
"body": "查看双因素身份验证和加密是否已开启,但无法访问机密信息。"
|
||||
},
|
||||
"auth_observe": {
|
||||
"title": "得知您何时登录",
|
||||
"body": "在您登录、切换账户或会话续期时收到通知。"
|
||||
},
|
||||
"auth_emit": {
|
||||
"title": "让您退出登录",
|
||||
"body": "让您退出网页邮箱。"
|
||||
},
|
||||
"account_read": {
|
||||
"title": "查看您的账户",
|
||||
"body": "查看您添加的账户及其地址和服务器。"
|
||||
},
|
||||
"http_post": {
|
||||
"title": "代表您使用网页邮箱服务器",
|
||||
"body": "使用您的登录信息调用以下服务器端点:"
|
||||
},
|
||||
"http_fetch": {
|
||||
"title": "连接其他网站",
|
||||
"body": "向以下网站发送请求。插件能读取的任何内容都可能被发送到这些网站:"
|
||||
},
|
||||
"admin_config": {
|
||||
"title": "读取管理员为其保存的设置",
|
||||
"body": "读取管理员为此插件保存的设置。"
|
||||
},
|
||||
"ui_observe": {
|
||||
"title": "跟踪您在应用中的位置",
|
||||
"body": "了解当前打开的页面,并对您点击的链接做出响应。"
|
||||
},
|
||||
"ui_toolbar": {
|
||||
"title": "在邮件工具栏中添加按钮",
|
||||
"body": "在打开的邮件上方显示它自己的按钮。"
|
||||
},
|
||||
"ui_app_top_banner": {
|
||||
"title": "在顶部显示横幅",
|
||||
"body": "在应用顶部显示一条通知。"
|
||||
},
|
||||
"ui_email_banner": {
|
||||
"title": "在邮件上显示通知",
|
||||
"body": "在打开的邮件正文上方显示一条通知。"
|
||||
},
|
||||
"ui_email_footer": {
|
||||
"title": "在邮件下方添加内容",
|
||||
"body": "在打开的邮件下方显示它自己的内容。"
|
||||
},
|
||||
"ui_contact_cryptokeys": {
|
||||
"title": "显示联系人的加密密钥",
|
||||
"body": "显示并管理联系人的加密密钥。"
|
||||
},
|
||||
"ui_email_details": {
|
||||
"title": "在邮件详情中添加面板",
|
||||
"body": "在打开的邮件旁边或下方显示它自己的面板。"
|
||||
},
|
||||
"ui_download_file": {
|
||||
"title": "将文件保存到您的设备",
|
||||
"body": "提供它创建的文件供下载。"
|
||||
},
|
||||
"ui_message_list_tabs": {
|
||||
"title": "为收件箱添加标签页",
|
||||
"body": "将收件箱分为“动态”或“推广”等标签页。"
|
||||
},
|
||||
"ui_composer_toolbar": {
|
||||
"title": "在撰写窗口中添加按钮",
|
||||
"body": "在您撰写邮件时显示它自己的按钮。"
|
||||
},
|
||||
"ui_composer_sidebar": {
|
||||
"title": "在撰写窗口中添加面板",
|
||||
"body": "在您撰写的邮件旁边显示它自己的面板。"
|
||||
},
|
||||
"ui_sidebar_widget": {
|
||||
"title": "在侧边栏中添加方框",
|
||||
"body": "在邮件侧边栏中显示它自己的内容。"
|
||||
},
|
||||
"ui_settings_section": {
|
||||
"title": "添加设置页面",
|
||||
"body": "在设置中显示它自己的页面。"
|
||||
},
|
||||
"ui_context_menu": {
|
||||
"title": "添加到邮件菜单",
|
||||
"body": "在右键点击邮件时打开的菜单中添加条目。"
|
||||
},
|
||||
"ui_navigation_rail": {
|
||||
"title": "添加到导航栏",
|
||||
"body": "在导航栏中显示它自己的按钮。"
|
||||
},
|
||||
"ui_keyboard": {
|
||||
"title": "添加键盘快捷键",
|
||||
"body": "响应它定义的键盘快捷键。"
|
||||
},
|
||||
"ui_calendar_action": {
|
||||
"title": "为活动添加按钮",
|
||||
"body": "在您创建或编辑活动时显示它自己的按钮。"
|
||||
},
|
||||
"ui_admin_page": {
|
||||
"title": "添加管理页面",
|
||||
"body": "在管理设置中显示它自己的页面。"
|
||||
},
|
||||
"app_lifecycle": {
|
||||
"title": "得知应用何时启动和停止",
|
||||
"body": "在应用启动、离线或您退出登录时收到通知。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global_search": {
|
||||
|
||||
+108
-54
@@ -11,6 +11,8 @@ import { useLocaleStore } from '@/stores/locale-store';
|
||||
import { getEffectiveLocale } from '@/i18n/detect-locale';
|
||||
import { removeAllPluginHooks } from '@/lib/plugin-hooks';
|
||||
import { requestConsent } from '@/lib/plugin-sandbox/consent';
|
||||
import { packageHash, type ValidatedPluginManifest } from '@/lib/extension-package';
|
||||
import JSZip from 'jszip';
|
||||
import { sha256Hex } from '@/lib/plugin-sandbox/bundle-integrity';
|
||||
import { downloadManagedBundle } from '@/lib/plugin-sandbox/bundle-fetch';
|
||||
import { usePolicyStore } from '@/stores/policy-store';
|
||||
@@ -25,12 +27,24 @@ let localeSubscribed = false;
|
||||
|
||||
// ─── Store Interface ─────────────────────────────────────────
|
||||
|
||||
/**
|
||||
* `reason` names why an install was refused so the settings page can say so
|
||||
* in the user's language; `error` carries the validator's details.
|
||||
*/
|
||||
export interface InstallResult {
|
||||
success: boolean;
|
||||
reason?: 'invalid' | 'uploads-disabled' | 'managed-id';
|
||||
error?: string;
|
||||
warnings?: string[];
|
||||
approvalStatus?: InstalledPlugin['approvalStatus'];
|
||||
}
|
||||
|
||||
interface PluginStoreState {
|
||||
plugins: InstalledPlugin[];
|
||||
initialized: boolean;
|
||||
|
||||
// Management
|
||||
installPlugin: (file: File) => Promise<{ success: boolean; error?: string; warnings?: string[] }>;
|
||||
installPlugin: (file: File) => Promise<InstallResult>;
|
||||
uninstallPlugin: (id: string) => void;
|
||||
enablePlugin: (id: string) => Promise<void>;
|
||||
disablePlugin: (id: string) => void;
|
||||
@@ -52,9 +66,13 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
initialized: false,
|
||||
|
||||
installPlugin: async (file: File) => {
|
||||
const policy = usePolicyStore.getState();
|
||||
if (!policy.isFeatureEnabled('pluginsUploadEnabled')) {
|
||||
return { success: false, reason: 'uploads-disabled' };
|
||||
}
|
||||
const result = await extractPlugin(file);
|
||||
if (!result.valid || !result.manifest) {
|
||||
return { success: false, error: result.errors.join('; '), warnings: result.warnings };
|
||||
return { success: false, reason: 'invalid', error: result.errors.join('; '), warnings: result.warnings };
|
||||
}
|
||||
|
||||
const { manifest, code } = result;
|
||||
@@ -62,6 +80,12 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
|
||||
// Check for duplicate
|
||||
const existing = plugins.find(p => p.id === manifest.id);
|
||||
// An admin-deployed plugin owns its id. A user package under the same
|
||||
// id would inherit its "managed" trust (no consent, maybe the
|
||||
// privileged tier) the next time the record is marked managed.
|
||||
if (existing?.managed || getServerManagedPluginIds().has(manifest.id)) {
|
||||
return { success: false, reason: 'managed-id' };
|
||||
}
|
||||
if (existing) {
|
||||
// Update: deactivate old, replace
|
||||
deactivatePlugin(manifest.id);
|
||||
@@ -70,6 +94,7 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
// Compute bundleHash so the admin-approval gate can pin to this
|
||||
// specific bundle (server-side state keys on (id, hash) pairs).
|
||||
const bundleHash = await sha256Hex(code).catch(() => undefined);
|
||||
const approvalHash = await packageHash(manifest as ValidatedPluginManifest, code);
|
||||
|
||||
const plugin: InstalledPlugin = {
|
||||
id: manifest.id,
|
||||
@@ -90,6 +115,8 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
settingsSchema: manifest.settingsSchema,
|
||||
...(manifest.locales ? { locales: manifest.locales } : {}),
|
||||
...(bundleHash ? { bundleHash } : {}),
|
||||
packageManifest: manifest as unknown as Record<string, unknown>,
|
||||
approvalHash,
|
||||
...(manifest.httpOrigins && manifest.httpOrigins.length > 0
|
||||
? { httpOrigins: manifest.httpOrigins }
|
||||
: {}),
|
||||
@@ -101,13 +128,17 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
// Save code to IndexedDB
|
||||
await pluginStorage.saveCode(manifest.id, code);
|
||||
|
||||
if (policy.isFeatureEnabled('requirePluginApproval')) {
|
||||
plugin.approvalStatus = await submitApprovalRequest(plugin, code);
|
||||
}
|
||||
|
||||
if (existing) {
|
||||
set({ plugins: plugins.map(p => p.id === manifest.id ? plugin : p) });
|
||||
} else {
|
||||
set({ plugins: [...plugins, plugin] });
|
||||
}
|
||||
|
||||
return { success: true, warnings: result.warnings };
|
||||
return { success: true, warnings: result.warnings, approvalStatus: plugin.approvalStatus };
|
||||
},
|
||||
|
||||
uninstallPlugin: (id: string) => {
|
||||
@@ -144,35 +175,9 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
const plugin = plugins.find(p => p.id === id);
|
||||
if (!plugin) return;
|
||||
|
||||
// Admin approval gate. Managed (admin-pushed) plugins are pre-
|
||||
// approved. For user-installed plugins the server-side state is
|
||||
// authoritative: the client-only `isPluginApproved` flag is kept as
|
||||
// a fast-path hint but the server result wins.
|
||||
const requireApproval = usePolicyStore.getState().isFeatureEnabled('requirePluginApproval');
|
||||
const policyApproved = plugin.adminApproved || plugin.managed || usePolicyStore.getState().isPluginApproved(id);
|
||||
if (requireApproval && !policyApproved && plugin.bundleHash) {
|
||||
const status = await checkServerApproval(plugin.id, plugin.bundleHash).catch(() => null);
|
||||
if (status?.status === 'approved') {
|
||||
// Approval available; proceed.
|
||||
} else if (status?.status === 'denied') {
|
||||
set(state => ({
|
||||
plugins: state.plugins.map(p =>
|
||||
p.id === id ? { ...p, status: 'error' as PluginStatus, error: 'Plugin denied by administrator' } : p
|
||||
),
|
||||
}));
|
||||
return;
|
||||
} else {
|
||||
// 'pending' or 'not-requested' - submit a request and refuse to enable.
|
||||
await submitApprovalRequest(plugin).catch(() => { /* best effort */ });
|
||||
set(state => ({
|
||||
plugins: state.plugins.map(p =>
|
||||
p.id === id ? { ...p, status: 'error' as PluginStatus, error: 'Awaiting administrator approval' } : p
|
||||
),
|
||||
}));
|
||||
return;
|
||||
}
|
||||
} else if (requireApproval && !policyApproved) {
|
||||
// No bundleHash means we can't pin the approval - refuse.
|
||||
// Admin approval gate for plugins the user installed. The server
|
||||
// holds the decision, pinned to the package hash (code + manifest).
|
||||
if (!plugin.managed && !(await userPluginMayRun(plugin, get, set, { request: true }))) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -185,7 +190,10 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
.filter((p): p is Permission => !!p)
|
||||
.filter((p) => !implicit.has(p) && !granted.has(p));
|
||||
if (missing.length > 0 && !plugin.managed) {
|
||||
const accepted = await requestConsent(plugin.id, plugin.name, missing as Permission[]);
|
||||
const accepted = await requestConsent(plugin.id, plugin.name, missing as Permission[], {
|
||||
httpOrigins: plugin.httpOrigins,
|
||||
apiPostPaths: plugin.apiPostPaths,
|
||||
});
|
||||
if (!accepted) return;
|
||||
// Persist the grants so future enables don't re-prompt.
|
||||
const allGranted = [...new Set<string>([...granted, ...missing])];
|
||||
@@ -297,7 +305,11 @@ export const usePluginStore = create<PluginStoreState>()(
|
||||
// hung/slow plugin block every subsequent one; loadSandboxedPlugin
|
||||
// catches its own errors so allSettled is just for tidy completion.
|
||||
const enabledPlugins = get().plugins.filter(p => p.enabled && p.status !== 'error');
|
||||
await Promise.allSettled(enabledPlugins.map(plugin => loadPlugin(plugin)));
|
||||
// A plugin the user installed is checked again on every start: the
|
||||
// admin may have revoked its approval or turned user plugins off.
|
||||
const allowed = await Promise.all(enabledPlugins.map(p =>
|
||||
p.managed ? true : userPluginMayRun(p, get, set, { request: false })));
|
||||
await Promise.allSettled(enabledPlugins.filter((_, i) => allowed[i]).map(plugin => loadPlugin(plugin)));
|
||||
|
||||
set({ initialized: true });
|
||||
})();
|
||||
@@ -582,27 +594,69 @@ async function checkServerApproval(pluginId: string, bundleHash: string): Promis
|
||||
}
|
||||
}
|
||||
|
||||
async function submitApprovalRequest(plugin: InstalledPlugin): Promise<void> {
|
||||
if (!plugin.bundleHash) return;
|
||||
/**
|
||||
* Send the package to the server for an admin to review. The server reads
|
||||
* the manifest and code from the ZIP and pins the request to the hash it
|
||||
* computes itself. Returns the resulting status, or undefined when the
|
||||
* server could not be reached.
|
||||
*/
|
||||
async function submitApprovalRequest(
|
||||
plugin: InstalledPlugin,
|
||||
code?: string,
|
||||
): Promise<InstalledPlugin['approvalStatus']> {
|
||||
if (!plugin.packageManifest) return undefined;
|
||||
try {
|
||||
await apiFetch('/api/plugin-approval-status', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
pluginId: plugin.id,
|
||||
bundleHash: plugin.bundleHash,
|
||||
manifest: {
|
||||
name: plugin.name,
|
||||
version: plugin.version,
|
||||
author: plugin.author,
|
||||
description: plugin.description,
|
||||
permissions: plugin.permissions,
|
||||
httpOrigins: plugin.httpOrigins,
|
||||
apiPostPaths: plugin.apiPostPaths,
|
||||
},
|
||||
}),
|
||||
});
|
||||
const source = code ?? await pluginStorage.getCode(plugin.id);
|
||||
if (!source) return undefined;
|
||||
const zip = new JSZip();
|
||||
zip.file('manifest.json', JSON.stringify(plugin.packageManifest));
|
||||
zip.file(String(plugin.packageManifest.entrypoint ?? plugin.entrypoint), source);
|
||||
const form = new FormData();
|
||||
form.append('file', await zip.generateAsync({ type: 'blob' }), `${plugin.id}.zip`);
|
||||
const res = await apiFetch('/api/plugin-approval-status', { method: 'POST', body: form });
|
||||
if (!res.ok) return undefined;
|
||||
const data = await res.json() as { status?: InstalledPlugin['approvalStatus'] };
|
||||
return data.status;
|
||||
} catch {
|
||||
/* best effort */
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a plugin the user installed may run now: user plugins must be
|
||||
* allowed by policy, and when approval is required the server must have
|
||||
* approved this exact package. Records the outcome on the plugin so the
|
||||
* settings page can explain it. With `request`, an unknown package is sent
|
||||
* for review.
|
||||
*/
|
||||
async function userPluginMayRun(
|
||||
plugin: InstalledPlugin,
|
||||
get: () => PluginStoreState,
|
||||
set: (partial: Partial<PluginStoreState> | ((state: PluginStoreState) => Partial<PluginStoreState>)) => void,
|
||||
opts: { request: boolean },
|
||||
): Promise<boolean> {
|
||||
const policy = usePolicyStore.getState();
|
||||
const mark = (patch: Partial<InstalledPlugin>) => set(state => ({
|
||||
plugins: state.plugins.map(p => (p.id === plugin.id ? { ...p, ...patch } : p)),
|
||||
}));
|
||||
if (!policy.isFeatureEnabled('pluginsUploadEnabled')) {
|
||||
mark({ status: 'error', error: 'user-plugins-off' });
|
||||
return false;
|
||||
}
|
||||
if (!policy.isFeatureEnabled('requirePluginApproval')) return true;
|
||||
if (!plugin.approvalHash) {
|
||||
mark({ status: 'error', error: 'approval-unavailable' });
|
||||
return false;
|
||||
}
|
||||
let status = (await checkServerApproval(plugin.id, plugin.approvalHash))?.status;
|
||||
if (opts.request && (status === 'not-requested' || status === undefined)) {
|
||||
status = await submitApprovalRequest(plugin) ?? status;
|
||||
}
|
||||
if (status === 'approved') {
|
||||
mark({ approvalStatus: 'approved' });
|
||||
return true;
|
||||
}
|
||||
mark({ approvalStatus: status, status: 'error', error: status === 'denied' ? 'approval-denied' : 'approval-pending' });
|
||||
void get;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ interface PolicyState {
|
||||
getForcedThemeId: (availableThemeIds?: string[]) => string | null;
|
||||
isThemeDisabled: (themeId: string, isBuiltIn: boolean) => boolean;
|
||||
isPluginForceEnabled: (pluginId: string) => boolean;
|
||||
isPluginApproved: (pluginId: string) => boolean;
|
||||
isThemeForceEnabled: (themeId: string) => boolean;
|
||||
}
|
||||
|
||||
@@ -116,10 +115,6 @@ export const usePolicyStore = create<PolicyState>()((set, get) => ({
|
||||
return (get().policy.forceEnabledPlugins || []).includes(pluginId);
|
||||
},
|
||||
|
||||
isPluginApproved: (pluginId) => {
|
||||
return (get().policy.approvedPlugins || []).includes(pluginId);
|
||||
},
|
||||
|
||||
isThemeForceEnabled: (themeId) => {
|
||||
return (get().policy.forceEnabledThemes || []).includes(themeId);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user