Compare commits
37
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22f39a4507 | ||
|
|
bf60fe6157 | ||
|
|
8d4063e921 | ||
|
|
ea6c098057 | ||
|
|
f7cbdb2e7a | ||
|
|
379623614a | ||
|
|
662385c6da | ||
|
|
0fb4d1e964 | ||
|
|
898815eaca | ||
|
|
6ac5ee45dd | ||
|
|
f500261697 | ||
|
|
7a67a2c1c3 | ||
|
|
9245fc5b1e | ||
|
|
9ed64bea88 | ||
|
|
21d0320765 | ||
|
|
2a5c6a5c18 | ||
|
|
e5c8594901 | ||
|
|
d844786e14 | ||
|
|
1b75580da2 | ||
|
|
c0faed2c2a | ||
|
|
bb5a26c343 | ||
|
|
be088ed78d | ||
|
|
20b6475f18 | ||
|
|
31feb4114a | ||
|
|
2280df1ea9 | ||
|
|
083039b27e | ||
|
|
d525b18f6d | ||
|
|
f5ba09ef77 | ||
|
|
3b77fb85fd | ||
|
|
b05cd178e6 | ||
|
|
f2437b6904 | ||
|
|
ba16067529 | ||
|
|
b10149fd54 | ||
|
|
3ffee1224f | ||
|
|
4b2c97df4e | ||
|
|
60a4647a43 | ||
|
|
5cb0b2f3ea |
@@ -0,0 +1,68 @@
|
|||||||
|
# Prune old image versions from GHCR.
|
||||||
|
#
|
||||||
|
# Releases are kept forever -- they carry no assets and their generated notes
|
||||||
|
# are this project's only changelog, so deleting one destroys history that
|
||||||
|
# cannot be reconstructed for nothing saved. Images are the opposite: a
|
||||||
|
# multi-arch build a week, and the by-digest push in publish.yml leaves two
|
||||||
|
# untagged per-architecture manifests behind each time on top of the tagged
|
||||||
|
# index. Those accumulate and nobody wants fifty of them.
|
||||||
|
#
|
||||||
|
# THE FOOTGUN: the obvious tool for this -- delete-package-versions with
|
||||||
|
# `delete-only-untagged-versions` -- will happily delete the per-architecture
|
||||||
|
# manifests that a multi-arch tag points *at*, because they are untagged by
|
||||||
|
# design. Nothing appears to break: the tag still exists, and pulls simply
|
||||||
|
# start failing for one architecture. This action understands manifest lists
|
||||||
|
# and will not orphan a retained index, and `validate` re-checks every
|
||||||
|
# multi-arch manifest against the registry afterwards.
|
||||||
|
#
|
||||||
|
# Separate from publish.yml, and dispatchable on its own, so `dry_run` can show
|
||||||
|
# exactly what would be deleted without rebuilding and re-pushing an image to
|
||||||
|
# find out.
|
||||||
|
name: Prune images
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
description: "List what would be deleted, delete nothing"
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prune:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
steps:
|
||||||
|
# Pinned to a commit rather than a moving major tag. This action is
|
||||||
|
# handed `packages: write` and its whole job is deletion, so a tag
|
||||||
|
# repointed at something else -- by a compromise or a mistake upstream --
|
||||||
|
# is a bad day. v1.2.2.
|
||||||
|
- uses: dataaxiom/ghcr-cleanup-action@d52806a0dc70b430571a37da1fde39733ffd640f
|
||||||
|
with:
|
||||||
|
owner: Coffey-Labs
|
||||||
|
package: ihasmail
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# Ten weekly releases is roughly a quarter of history, which is more
|
||||||
|
# than enough to roll back to and far less than the year's worth that
|
||||||
|
# would otherwise pile up. Older *releases* stay either way; this
|
||||||
|
# only removes the images.
|
||||||
|
keep-n-tagged: 10
|
||||||
|
# Belt and braces on top of the action's own manifest awareness:
|
||||||
|
# `latest` is never a candidate for deletion under any counting.
|
||||||
|
exclude-tags: latest
|
||||||
|
delete-untagged: true
|
||||||
|
# Sweeps the wreckage of a half-failed run: an index whose platform
|
||||||
|
# images did not all land, and referrers whose parent is gone.
|
||||||
|
delete-partial-images: true
|
||||||
|
delete-orphaned-images: true
|
||||||
|
# Checks every remaining multi-architecture manifest still resolves
|
||||||
|
# in the registry. This is the step that would catch the footgun
|
||||||
|
# above rather than leaving a reader to discover it on `docker pull`.
|
||||||
|
validate: true
|
||||||
|
dry-run: ${{ inputs.dry_run }}
|
||||||
@@ -26,6 +26,23 @@ name: Publish image
|
|||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
# Callable, so release.yml can build the release it just cut. This is not a
|
||||||
|
# stylistic choice: a release created with GITHUB_TOKEN does **not** raise a
|
||||||
|
# `release` event -- GitHub refuses to let a token trigger another workflow,
|
||||||
|
# to stop a workflow looping on its own output. A scheduled job that cut a
|
||||||
|
# release and expected this file to notice would silently never publish. The
|
||||||
|
# alternatives are a personal access token kept as a secret, or calling the
|
||||||
|
# workflow directly. This is the one that needs no credential.
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
ref:
|
||||||
|
description: "Tag, branch or SHA to build"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
tag_latest:
|
||||||
|
description: "Also move :latest to this build"
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
# Same reasoning as ci.yml's dispatch trigger: a run GitHub queues and then
|
# Same reasoning as ci.yml's dispatch trigger: a run GitHub queues and then
|
||||||
# orphans can be neither rerun nor cancelled, and this workflow otherwise
|
# orphans can be neither rerun nor cancelled, and this workflow otherwise
|
||||||
# only fires on a release -- which is not something to cut twice because a
|
# only fires on a release -- which is not something to cut twice because a
|
||||||
@@ -175,3 +192,11 @@ jobs:
|
|||||||
docker buildx imagetools create "${tags[@]}" "${refs[@]}"
|
docker buildx imagetools create "${tags[@]}" "${refs[@]}"
|
||||||
- name: Show what landed
|
- name: Show what landed
|
||||||
run: docker buildx imagetools inspect "${IMAGE}:${{ needs.version.outputs.docker_tag }}"
|
run: docker buildx imagetools inspect "${IMAGE}:${{ needs.version.outputs.docker_tag }}"
|
||||||
|
|
||||||
|
# Runs only after a successful publish, because that is the only moment the
|
||||||
|
# package grows. See cleanup.yml for why this is not the obvious one-liner.
|
||||||
|
prune:
|
||||||
|
needs: publish
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
uses: ./.github/workflows/cleanup.yml
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
# Cut a release once a week, but only if there is something in it.
|
||||||
|
#
|
||||||
|
# Releases had drifted 184 commits behind main, which made `:latest` describe
|
||||||
|
# a build nobody was running -- the demo, prod and anyone building from source
|
||||||
|
# were all ahead of it. Publishing on release is the right trigger only if
|
||||||
|
# releases actually happen, so this is the part that makes that true without
|
||||||
|
# anyone having to remember.
|
||||||
|
#
|
||||||
|
# It does nothing on a quiet week. A release with no commits in it is worse
|
||||||
|
# than no release: it moves `:latest` to an identical build, spends a version
|
||||||
|
# number, and mails everybody watching the repository about nothing.
|
||||||
|
name: Weekly release
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# Mondays, 09:00 UTC. GitHub runs scheduled jobs on a best-effort basis and
|
||||||
|
# can delay a run by a good while when the queue is busy, so do not read
|
||||||
|
# the exact minute as a promise. Note also that GitHub disables scheduled
|
||||||
|
# workflows in a repository with no activity for 60 days -- not a concern
|
||||||
|
# while this one is being worked on weekly, but it is why a silent stop is
|
||||||
|
# worth checking for before assuming the file is broken.
|
||||||
|
- cron: "0 9 * * 1"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
description: "Work out what would be released, then stop"
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
# One at a time. Two overlapping runs would race to create the same tag, and
|
||||||
|
# the loser fails noisily for a reason that has nothing to do with the code.
|
||||||
|
concurrency:
|
||||||
|
group: weekly-release
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
outputs:
|
||||||
|
should_release: ${{ steps.decide.outputs.should_release }}
|
||||||
|
tag: ${{ steps.decide.outputs.tag }}
|
||||||
|
title: ${{ steps.decide.outputs.title }}
|
||||||
|
sha: ${{ steps.decide.outputs.sha }}
|
||||||
|
previous: ${{ steps.decide.outputs.previous }}
|
||||||
|
count: ${{ steps.decide.outputs.count }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 22
|
||||||
|
- id: decide
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# The newest published release, or empty on a repository that has
|
||||||
|
# never had one -- in which case everything counts as new. Drafts are
|
||||||
|
# excluded: an unpublished draft is not a release anybody has, so
|
||||||
|
# counting from it would hide commits that have never shipped.
|
||||||
|
previous="$(gh release list --limit 1 --exclude-drafts --json tagName --jq '.[0].tagName // ""')"
|
||||||
|
# A tag named by a release is normally present after a full checkout,
|
||||||
|
# but a release can outlive its tag. Falling back to the whole
|
||||||
|
# history is the safe direction to be wrong in: it over-counts, which
|
||||||
|
# cuts a release that was due anyway, where under-counting would skip
|
||||||
|
# one that was.
|
||||||
|
if [ -n "$previous" ] && git rev-parse -q --verify "refs/tags/${previous}" >/dev/null; then
|
||||||
|
count="$(git rev-list --count "${previous}..HEAD")"
|
||||||
|
else
|
||||||
|
count="$(git rev-list --count HEAD)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
version="$(node scripts/version.mjs)"
|
||||||
|
# A Docker tag may not contain '+', and neither should the git tag,
|
||||||
|
# so the two always agree about what to call a build.
|
||||||
|
tag="v${version/+/-}"
|
||||||
|
title="v${version%%+*}"
|
||||||
|
sha="$(git rev-parse HEAD)"
|
||||||
|
|
||||||
|
should_release=true
|
||||||
|
reason=""
|
||||||
|
if [ "$count" -eq 0 ]; then
|
||||||
|
should_release=false
|
||||||
|
reason="no commits since ${previous}"
|
||||||
|
elif git rev-parse -q --verify "refs/tags/${tag}" >/dev/null; then
|
||||||
|
# Same commit, different week: the version is derived from the
|
||||||
|
# commit, so nothing new means the tag already exists.
|
||||||
|
should_release=false
|
||||||
|
reason="tag ${tag} already exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "should_release=$should_release"
|
||||||
|
echo "tag=$tag"
|
||||||
|
echo "title=$title"
|
||||||
|
echo "sha=$sha"
|
||||||
|
echo "previous=$previous"
|
||||||
|
echo "count=$count"
|
||||||
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Written to the run summary so a skipped week reads as a decision
|
||||||
|
# rather than as a workflow that quietly did nothing.
|
||||||
|
{
|
||||||
|
echo "### Weekly release"
|
||||||
|
echo
|
||||||
|
if [ "$should_release" = "true" ]; then
|
||||||
|
echo "Releasing **${tag}** — ${count} commit(s) since ${previous:-the beginning}."
|
||||||
|
else
|
||||||
|
echo "Nothing to release: ${reason}."
|
||||||
|
fi
|
||||||
|
} >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
|
||||||
|
cut:
|
||||||
|
needs: check
|
||||||
|
if: needs.check.outputs.should_release == 'true' && !inputs.dry_run
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
fetch-depth: 0
|
||||||
|
- env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
args=(--target "${{ needs.check.outputs.sha }}"
|
||||||
|
--title "${{ needs.check.outputs.title }}"
|
||||||
|
--generate-notes)
|
||||||
|
# Bound the notes to what is actually new. Without a start tag the
|
||||||
|
# generator reaches back to whatever it decides is previous, which on
|
||||||
|
# a repository with older tag shapes is not always the last release.
|
||||||
|
if [ -n "${{ needs.check.outputs.previous }}" ]; then
|
||||||
|
args+=(--notes-start-tag "${{ needs.check.outputs.previous }}")
|
||||||
|
fi
|
||||||
|
gh release create "${{ needs.check.outputs.tag }}" "${args[@]}"
|
||||||
|
|
||||||
|
# Called rather than left to the `release` trigger on purpose: see the note
|
||||||
|
# at the top of publish.yml. A release created with GITHUB_TOKEN raises no
|
||||||
|
# event, so without this the tag would exist and no image would follow it.
|
||||||
|
publish:
|
||||||
|
needs: [check, cut]
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
uses: ./.github/workflows/publish.yml
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.check.outputs.sha }}
|
||||||
|
tag_latest: true
|
||||||
+11
-1
@@ -23,10 +23,20 @@ export interface PaletteMeta {
|
|||||||
name: string;
|
name: string;
|
||||||
/** Shown in Settings and in NOTICE; who to credit and under what. */
|
/** Shown in Settings and in NOTICE; who to credit and under what. */
|
||||||
credit?: string;
|
credit?: string;
|
||||||
|
/**
|
||||||
|
* Whether the name is a word rather than a name.
|
||||||
|
*
|
||||||
|
* Five of these six are proper names -- ihasmail, Dracula, Gruvbox, Rosé
|
||||||
|
* Pine, Tokyo Night -- and are rendered translate="no" so a page translator
|
||||||
|
* leaves them alone. "Classic" is not a name, it is an adjective describing
|
||||||
|
* the theme, and a German reader should see "Klassisch". Reported by a
|
||||||
|
* native speaker reviewing the German catalogue (#247).
|
||||||
|
*/
|
||||||
|
translatable?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PALETTES: PaletteMeta[] = [
|
export const PALETTES: PaletteMeta[] = [
|
||||||
{ id: "default", name: "Classic" },
|
{ id: "default", name: "Classic", translatable: true },
|
||||||
{ id: "ihasmail", name: "ihasmail" },
|
{ id: "ihasmail", name: "ihasmail" },
|
||||||
{ id: "dracula", name: "Dracula", credit: "Dracula Theme (MIT) — dark: Dracula, light: Alucard" },
|
{ id: "dracula", name: "Dracula", credit: "Dracula Theme (MIT) — dark: Dracula, light: Alucard" },
|
||||||
{ id: "gruvbox", name: "Gruvbox", credit: "gruvbox by morhetz (MIT)" },
|
{ id: "gruvbox", name: "Gruvbox", credit: "gruvbox by morhetz (MIT)" },
|
||||||
|
|||||||
+15
-8
@@ -13,6 +13,7 @@
|
|||||||
*/
|
*/
|
||||||
import { addDays, startOfDay } from "./dates";
|
import { addDays, startOfDay } from "./dates";
|
||||||
import { formatFullDateTime } from "./datetime";
|
import { formatFullDateTime } from "./datetime";
|
||||||
|
import { plural, t } from "@/lib/i18n";
|
||||||
|
|
||||||
export const SUBMISSION_CAP = "urn:ietf:params:jmap:submission";
|
export const SUBMISSION_CAP = "urn:ietf:params:jmap:submission";
|
||||||
|
|
||||||
@@ -96,21 +97,27 @@ export function schedulePresets(now: Date, maxMs: number): SchedulePreset[] {
|
|||||||
* surfaces as a failed send rather than anything the user can act on.
|
* surfaces as a failed send rather than anything the user can act on.
|
||||||
*/
|
*/
|
||||||
export function scheduleError(at: Date, now: Date, maxMs: number): string | null {
|
export function scheduleError(at: Date, now: Date, maxMs: number): string | null {
|
||||||
const t = at.getTime();
|
const ms = at.getTime();
|
||||||
if (Number.isNaN(t)) return "Pick a date and time.";
|
if (Number.isNaN(ms)) return t("Pick a date and time.");
|
||||||
if (t < now.getTime() + MIN_LEAD_MS) return "Pick a time at least a minute from now.";
|
if (ms < now.getTime() + MIN_LEAD_MS) return t("Pick a time at least a minute from now.");
|
||||||
if (maxMs > 0 && t > now.getTime() + maxMs) {
|
if (maxMs > 0 && ms > now.getTime() + maxMs) {
|
||||||
return `This server will not hold a message longer than ${describeSpan(maxMs)}.`;
|
return t("This server will not hold a message longer than {span}.", { span: describeSpan(maxMs) });
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** "30 days", "7 days", "12 hours" -- for explaining the server's own limit. */
|
/**
|
||||||
|
* "30 days", "7 days", "12 hours" -- for explaining the server's own limit.
|
||||||
|
*
|
||||||
|
* plural() rather than `day${n === 1 ? "" : "s"}`: that suffix trick is English
|
||||||
|
* grammar written into the code, and it produces "2 Tage" only by accident of
|
||||||
|
* the two languages agreeing. Russian needs three forms and Japanese one.
|
||||||
|
*/
|
||||||
export function describeSpan(ms: number): string {
|
export function describeSpan(ms: number): string {
|
||||||
const days = Math.floor(ms / 86_400_000);
|
const days = Math.floor(ms / 86_400_000);
|
||||||
if (days >= 1) return `${days} day${days === 1 ? "" : "s"}`;
|
if (days >= 1) return plural(days, { one: "{n} day", other: "{n} days" });
|
||||||
const hours = Math.max(1, Math.floor(ms / 3_600_000));
|
const hours = Math.max(1, Math.floor(ms / 3_600_000));
|
||||||
return `${hours} hour${hours === 1 ? "" : "s"}`;
|
return plural(hours, { one: "{n} hour", other: "{n} hours" });
|
||||||
}
|
}
|
||||||
|
|
||||||
/** How a scheduled time reads in menus, banners and toasts. */
|
/** How a scheduled time reads in menus, banners and toasts. */
|
||||||
|
|||||||
@@ -1078,8 +1078,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Entwurf gespeichert",
|
"Draft saved": "Entwurf gespeichert",
|
||||||
"Emptying folder…": "Ordner wird geleert…",
|
"Emptying folder…": "Ordner wird geleert…",
|
||||||
"Nothing unread here": "Hier ist nichts ungelesen",
|
"Nothing unread here": "Hier ist nichts ungelesen",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Keyboard bindings register their group and description in English at
|
||||||
|
// the call site (views/Shortcuts.tsx and friends); ShortcutsSettings now
|
||||||
|
// translates them at render, so they need entries here.
|
||||||
|
"Actions": "Aktionen",
|
||||||
|
"Agenda view": "Agendaansicht",
|
||||||
|
"Archive and next": "Archivieren und weiter",
|
||||||
|
"Compose new message": "Neue Nachricht verfassen",
|
||||||
|
"Conversation": "Konversation",
|
||||||
|
"Day view": "Tagesansicht",
|
||||||
|
"Go to Calendar": "Zum Kalender",
|
||||||
|
"Go to Contacts": "Zu den Kontakten",
|
||||||
|
"Go to Drafts": "Zu den Entwürfen",
|
||||||
|
"Go to Files": "Zu den Dateien",
|
||||||
|
"Go to Inbox": "Zum Posteingang",
|
||||||
|
"Go to Sent": "Zu Gesendet",
|
||||||
|
"Go to Settings": "Zu den Einstellungen",
|
||||||
|
"Go to Starred": "Zu Markiert",
|
||||||
|
"Month view": "Monatsansicht",
|
||||||
|
"Navigation": "Navigation",
|
||||||
|
"Next conversation": "Nächste Konversation",
|
||||||
|
"Next period": "Nächster Zeitraum",
|
||||||
|
"Previous conversation": "Vorherige Konversation",
|
||||||
|
"Previous period": "Vorheriger Zeitraum",
|
||||||
|
"Send message": "Nachricht senden",
|
||||||
|
"Show keyboard shortcuts": "Tastenkürzel anzeigen",
|
||||||
|
"Week view": "Wochenansicht",
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing this file (#247).
|
||||||
|
" and {count} more": " und {count} weitere",
|
||||||
|
"10 people or more": "10 Personen oder mehr",
|
||||||
|
"20 people or more": "20 Personen oder mehr",
|
||||||
|
"5 people or more": "5 Personen oder mehr",
|
||||||
|
"50 people or more": "50 Personen oder mehr",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Ein Hinweis auf jeder Nachricht, deren Absender nicht zu einer Ihrer eigenen Domains gehört.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Ein eigener Kalender, abgeleitet aus den Geburtstagen, die bereits auf Ihren Kontaktkarten stehen. Es wird nirgendwo etwas geschrieben — die Daten bleiben auf den Karten, und ein Termin verschwindet, wenn der Kontakt gelöscht oder der Geburtstag entfernt wird. Er lässt sich in der Seitenleiste des Kalenders ausblenden, ohne ihn hier abzuschalten.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Ein unter einer URL veröffentlichter Kalender — ein Fahrplan, ein Dienstplan, eine Feiertagsliste. Er ist schreibgeschützt, wird beim Öffnen des Kalenders aktualisiert und nie gespeichert: Die Termine werden abgerufen und nur so lange behalten, wie dieser Tab geöffnet ist.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Ein Link, dessen Text eine Domain nennt und dessen Ziel eine andere ist, wird immer markiert, auch wenn das Ziel vertrauenswürdig ist — vertrauenswürdig zu sein ist nicht dasselbe, wie der Ort zu sein, den der Text genannt hat.",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Aus einer Nachricht hinzugefügt und hier entfernbar — bisher ließ sich das nur rückgängig machen, indem Sie eine weitere Nachricht desselben Absenders suchten.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Hier hinzugefügt oder über den Dialog beim Öffnen eines Links. Eine Domain schließt ihre Subdomains mit ein.",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Alle drei sind zu Beginn ausgeschaltet. Ein Client, der zuerst unterbricht, ist einer, den man sich abgewöhnt zu lesen, und eine ungelesen weggeklickte Warnung kostet dieselbe Aufmerksamkeit und bringt nichts.",
|
||||||
|
"All {n} in {folder} are selected.": "Alle {n} in {folder} sind ausgewählt.",
|
||||||
|
"All {n} on this page are selected.": "Alle {n} auf dieser Seite sind ausgewählt.",
|
||||||
|
"Also count these domains as inside": "Diese Domains ebenfalls als intern werten",
|
||||||
|
"Always": "Immer",
|
||||||
|
"Always showing images from": "Bilder immer anzeigen von",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Ein vom Server des Absenders geladenes Bild verrät ihm, dass die Nachricht geöffnet wurde, wann und ungefähr von wo. Freigegebene Bilder werden vom Server von ihasmail abgerufen und nicht vom Browser, sodass der Absender nichts davon erfährt.",
|
||||||
|
"Applies to": "Gilt für",
|
||||||
|
"Archive by month": "Nach Monat archivieren",
|
||||||
|
"Archive by year": "Nach Jahr archivieren",
|
||||||
|
"Archive failed: {error}": "Archivieren fehlgeschlagen: {error}",
|
||||||
|
"Archive to {folder}": "Archivieren nach {folder}",
|
||||||
|
"Ask before opening a link in a message": "Vor dem Öffnen eines Links in einer Nachricht fragen",
|
||||||
|
"Ask before sending outside": "Vor dem Senden nach außen fragen",
|
||||||
|
"Ask before sending to a large group": "Vor dem Senden an eine große Gruppe fragen",
|
||||||
|
"Back to the event": "Zurück zum Termin",
|
||||||
|
"Before it happens": "Bevor es passiert",
|
||||||
|
"Birthdays": "Geburtstage",
|
||||||
|
"By sender": "Nach Absender",
|
||||||
|
"By subject": "Nach Betreff",
|
||||||
|
"Choose…": "Auswählen…",
|
||||||
|
"Classic": "Klassisch",
|
||||||
|
"Click to move the event": "Klicken, um den Termin zu verschieben",
|
||||||
|
"Close without saving?": "Ohne Speichern schließen?",
|
||||||
|
"Compose as new": "Als neue Nachricht verfassen",
|
||||||
|
"Conversation moved to {folder}": "Konversation verschoben nach {folder}",
|
||||||
|
"Could not be read": "Konnte nicht gelesen werden",
|
||||||
|
"Could not import this file: {error}": "Diese Datei konnte nicht importiert werden: {error}",
|
||||||
|
"Could not load this file.": "Diese Datei konnte nicht geladen werden.",
|
||||||
|
"Could not read this calendar: {reason}": "Dieser Kalender konnte nicht gelesen werden: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "winmail.dat konnte nicht gelesen werden. Das Original ist unten weiterhin angehängt.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Zählt Personen statt Kopfzeilen: eine Adresse in An und neun in Cc ergeben eine Nachricht an zehn. Erfasst ein Allen-Antworten auf einen langen Thread.",
|
||||||
|
"Date received": "Empfangsdatum",
|
||||||
|
"Date sent": "Sendedatum",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine und Tokyo Night sind das Werk ihrer eigenen Projekte und werden unter der MIT-Lizenz verwendet; die Abstufungen zwischen ihren veröffentlichten Farben sind davon abgeleitet, und jede einzelne wird auf Kontrast geprüft. Die Akzentfarbe unten gilt weiterhin über jeder von ihnen.",
|
||||||
|
"Earlier": "Früher",
|
||||||
|
"Every folder": "Jeder Ordner",
|
||||||
|
"Everyone addressed will receive this.": "Alle Adressierten erhalten dies.",
|
||||||
|
"File contents": "Dateiinhalt",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Wird beim Einfügen der Vorlage ausgefüllt, sodass Sie das Ergebnis vor dem Senden bearbeiten können. Ein Platzhalter, der noch nicht aufgelöst werden kann — der Name eines Empfängers auf einer Nachricht, die Sie noch nicht adressiert haben — bleibt im Text so stehen, wie er geschrieben wurde, statt zu einer Lücke zu werden.",
|
||||||
|
"Forward as attachment": "Als Anhang weiterleiten",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "Aus den Geburtstagen Ihrer Kontakte. Es wird nichts gespeichert.",
|
||||||
|
"Import iCAL file…": "iCAL-Datei importieren…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Label sind IMAP-Keywords, die auf Ihren Nachrichten gespeichert werden, sodass jeder andere Client sie sieht. Namen, Farben und Verschachtelung gehören ihasmail selbst und folgen Ihrem Konto. Die Verschachtelung dient nur der Anzeige — sie schreibt im Postfach nichts um.",
|
||||||
|
"Largest first": "Größte zuerst",
|
||||||
|
"Later": "Später",
|
||||||
|
"Light or dark": "Hell oder dunkel",
|
||||||
|
"Mark messages from outside": "Nachrichten von außerhalb kennzeichnen",
|
||||||
|
"Marked as spam": "Als Spam markiert",
|
||||||
|
"Message order": "Reihenfolge der Nachrichten",
|
||||||
|
"More ways to send this": "Weitere Möglichkeiten zum Senden",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Nennt die externen Empfänger und fragt nach, statt abzulehnen.",
|
||||||
|
"Nested under": "Untergeordnet unter",
|
||||||
|
"Never": "Nie",
|
||||||
|
"Never ask": "Nie fragen",
|
||||||
|
"Newest first": "Neueste zuerst",
|
||||||
|
"No availability information for {who}": "Keine Verfügbarkeitsinformationen für {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Keine Dateien enthalten — es enthält nur die formatierte Kopie der Nachricht.",
|
||||||
|
"No verdict recorded": "Kein Ergebnis vermerkt",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Niemand hier hat Frei/Gebucht auf diesem Server, daher kann keine dieser Zeilen sagen, ob jemand frei ist.",
|
||||||
|
"Nothing (top level)": "Nichts (oberste Ebene)",
|
||||||
|
"Now, on your clock": "Jetzt, nach Ihrer Uhr",
|
||||||
|
"Oldest first": "Älteste zuerst",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Es wird nur der Anfang angezeigt — laden Sie die Datei herunter, um den Rest zu sehen.",
|
||||||
|
"Only when it has unread mail": "Nur wenn ungelesene Nachrichten vorhanden sind",
|
||||||
|
"Open a link to {domain}?": "Link zu {domain} öffnen?",
|
||||||
|
"Open it": "Öffnen",
|
||||||
|
"Open links to these domains without asking": "Links zu diesen Domains ohne Nachfrage öffnen",
|
||||||
|
"Open, and stop asking about {domain}": "Öffnen und nicht mehr zu {domain} nachfragen",
|
||||||
|
"Opening…": "Wird geöffnet…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Vom Server über den gesamten Ordner sortiert, nicht nur über die bisher geladenen Nachrichten. Bei Gleichstand gilt immer Neueste zuerst, damit sich die Reihenfolge zwischen zwei Blicken in denselben Ordner nie ändert.",
|
||||||
|
"Placeholders": "Platzhalter",
|
||||||
|
"Privacy & safety": "Datenschutz & Sicherheit",
|
||||||
|
"Read receipts": "Lesebestätigungen",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Lesen, Senden und wie Datum und Uhrzeit angezeigt werden. Was einen Absender erreicht, steht unter Datenschutz & Sicherheit.",
|
||||||
|
"Remote content": "Externe Inhalte",
|
||||||
|
"Remove subscription": "Abonnement entfernen",
|
||||||
|
"Remove {domain}": "{domain} entfernen",
|
||||||
|
"Rendered": "Dargestellt",
|
||||||
|
"Save changes": "Änderungen speichern",
|
||||||
|
"Save filters": "Filter speichern",
|
||||||
|
"Save your changes?": "Änderungen speichern?",
|
||||||
|
"Saved": "Gespeichert",
|
||||||
|
"Select all {n} in {folder}": "Alle {n} in {folder} auswählen",
|
||||||
|
"Send outside your organisation?": "Nach außerhalb Ihrer Organisation senden?",
|
||||||
|
"Send to {count} people?": "An {count} Personen senden?",
|
||||||
|
"Show birthdays from your contacts": "Geburtstage aus Ihren Kontakten anzeigen",
|
||||||
|
"Show in the sidebar": "In der Seitenleiste anzeigen",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Jemand anderes hat diese Datei gespeichert, während sie geöffnet war. Kopieren Sie Ihre Änderungen, schließen Sie die Datei und beginnen Sie erneut.",
|
||||||
|
"Sort by, in order": "Sortieren nach, in dieser Reihenfolge",
|
||||||
|
"Source": "Quelltext",
|
||||||
|
"Spam filter": "Spamfilter",
|
||||||
|
"Starred": "Markiert",
|
||||||
|
"Starred first": "Markierte zuerst",
|
||||||
|
"Stay here": "Hier bleiben",
|
||||||
|
"Stop trusting {address}": "{address} nicht mehr vertrauen",
|
||||||
|
"Subscribe to a calendar": "Kalender abonnieren",
|
||||||
|
"Subscribed calendar": "Abonnierter Kalender",
|
||||||
|
"Subscribed calendars": "Abonnierte Kalender",
|
||||||
|
"Subscribed to {url}": "{url} abonniert",
|
||||||
|
"That file is no longer there.": "Diese Datei ist nicht mehr vorhanden.",
|
||||||
|
"That identity's address": "Die Adresse dieser Identität",
|
||||||
|
"The Inbox only": "Nur der Posteingang",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "Die Nachricht wird in diesem Browser gehalten und wurde noch nicht übermittelt, das Zurückholen kostet also nichts.",
|
||||||
|
"The name on the identity you are sending as": "Der Name der Identität, unter der Sie senden",
|
||||||
|
"The subject already on the message": "Der Betreff, der bereits auf der Nachricht steht",
|
||||||
|
"Their address": "Ihre Adresse",
|
||||||
|
"Their first name alone": "Nur ihr Vorname",
|
||||||
|
"Then nothing": "Dann nichts",
|
||||||
|
"There is no preview for this kind of file.": "Für diese Art von Datei gibt es keine Vorschau.",
|
||||||
|
"There is nothing in it to export": "Es enthält nichts, was exportiert werden könnte",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Diese Datei ist kein UTF-8-Text, ein Bearbeiten hier würde sie beschädigen — laden Sie sie stattdessen herunter.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Diese Datei ist zu groß, um hier angezeigt zu werden ({size}) — laden Sie sie herunter, um sie zu lesen.",
|
||||||
|
"This goes to {recipients}{rest}.": "Dies geht an {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Dieser Link führt nicht dorthin, wohin er zu führen vorgibt",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Diese Nachricht verpackt ihre Anhänge in eine winmail.dat, die die meisten Clients nicht öffnen können.",
|
||||||
|
"Throw away your changes?": "Änderungen verwerfen?",
|
||||||
|
"Today, in your date format": "Heute, in Ihrem Datumsformat",
|
||||||
|
"Unread first": "Ungelesene zuerst",
|
||||||
|
"Unsaved changes": "Nicht gespeicherte Änderungen",
|
||||||
|
"View as": "Anzeigen als",
|
||||||
|
"Warnings": "Warnungen",
|
||||||
|
"What is it called?": "Wie soll es heißen?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Was einen Absender erreicht und was vorher nachfragt.",
|
||||||
|
"What you changed here will be lost.": "Was Sie hier geändert haben, geht verloren.",
|
||||||
|
"Who the message is addressed to": "An wen die Nachricht adressiert ist",
|
||||||
|
"Working out what is selected…": "Auswahl wird ermittelt…",
|
||||||
|
"You": "Sie",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Ihr Sieve-Skript enthält Änderungen, die nicht gespeichert wurden.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "Ihre Filterregeln enthalten Änderungen, die nicht gespeichert wurden.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Die Domains Ihrer eigenen Identitäten gelten immer als intern und müssen nicht aufgeführt werden. Eine Domain hier schließt ihre Subdomains mit ein.",
|
||||||
|
"Your own:": "Ihre eigenen:",
|
||||||
|
"dark mode": "dunklen Modus",
|
||||||
|
"file": "Datei",
|
||||||
|
"light mode": "hellen Modus",
|
||||||
|
"scored {score} against a threshold of {threshold}": "erreichte {score} bei einem Schwellenwert von {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "erreichte {score}, ohne angegebenen Schwellenwert",
|
||||||
|
"this view": "diese Ansicht",
|
||||||
|
"{count} conversations moved to {folder}": "{count} Konversationen verschoben nach {folder}",
|
||||||
|
"{count} folders": "{count} Ordner",
|
||||||
|
"{name}’s birthday": "Geburtstag von {name}",
|
||||||
|
"{name}’s birthday ({age})": "Geburtstag von {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Für diese Nachricht wurde bereits eine Lesebestätigung gesendet.",
|
||||||
|
"Add star": "Markierung hinzufügen",
|
||||||
|
"Could not attach": "Anhängen nicht möglich",
|
||||||
|
"Delete forever?": "Endgültig löschen?",
|
||||||
|
"Delete?": "Löschen?",
|
||||||
|
"No recipients": "Keine Empfänger",
|
||||||
|
"No sending identity available": "Keine Absenderidentität verfügbar",
|
||||||
|
"Pick a date and time.": "Wählen Sie Datum und Uhrzeit.",
|
||||||
|
"Pick a time at least a minute from now.": "Wählen Sie eine Zeit mindestens eine Minute in der Zukunft.",
|
||||||
|
"Remove star": "Markierung entfernen",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Angefordert, an {address}. Wird nie automatisch gesendet.",
|
||||||
|
"The sender did not request a read receipt.": "Der Absender hat keine Lesebestätigung angefordert.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Dies ist Massen- oder Listenpost; eine Lesebestätigung würde nur bestätigen, dass die Adresse aktiv ist.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Diese Nachricht wurde nicht empfangen, es gibt also nichts zu melden.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Diese Nachricht wurde automatisch versendet, daher wird keine Lesebestätigung angeboten.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Dieser Server hält eine Nachricht nicht länger als {span} zurück.",
|
||||||
|
"Upload failed": "Hochladen fehlgeschlagen",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "{n} Nachricht in den Papierkorb verschieben?", other: "{n} Nachrichten in den Papierkorb verschieben?" },
|
||||||
|
"{n} days": { one: "{n} Tag", other: "{n} Tage" },
|
||||||
|
"{n} hours": { one: "{n} Stunde", other: "{n} Stunden" },
|
||||||
"Updated {n} contacts, nothing new": { one: "{n} Kontakt aktualisiert, nichts Neues", other: "{n} Kontakte aktualisiert, nichts Neues" },
|
"Updated {n} contacts, nothing new": { one: "{n} Kontakt aktualisiert, nichts Neues", other: "{n} Kontakte aktualisiert, nichts Neues" },
|
||||||
"{n} updated": { one: "{n} aktualisiert", other: "{n} aktualisiert" },
|
"{n} updated": { one: "{n} aktualisiert", other: "{n} aktualisiert" },
|
||||||
"Updated {n} contacts you already had": { one: "Vorhandenen Kontakt aktualisiert", other: "{n} vorhandene Kontakte aktualisiert" },
|
"Updated {n} contacts you already had": { one: "Vorhandenen Kontakt aktualisiert", other: "{n} vorhandene Kontakte aktualisiert" },
|
||||||
|
|||||||
@@ -1051,8 +1051,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Borrador guardado",
|
"Draft saved": "Borrador guardado",
|
||||||
"Emptying folder…": "Vaciando la carpeta…",
|
"Emptying folder…": "Vaciando la carpeta…",
|
||||||
"Nothing unread here": "Aquí no hay nada sin leer",
|
"Nothing unread here": "Aquí no hay nada sin leer",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " y {count} más",
|
||||||
|
"10 people or more": "10 personas o más",
|
||||||
|
"20 people or more": "20 personas o más",
|
||||||
|
"5 people or more": "5 personas o más",
|
||||||
|
"50 people or more": "50 personas o más",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Un aviso en cualquier mensaje cuyo remitente no esté en uno de sus propios dominios.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Un calendario propio, derivado de los cumpleaños que ya figuran en sus fichas de contacto. No se escribe nada en ninguna parte: las fechas siguen en las fichas, y un evento desaparece cuando lo hace el contacto o cuando se borra el cumpleaños. Puede ocultarse desde la barra lateral del calendario sin desactivarlo aquí.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Un calendario publicado en una URL: un horario, un cuadrante, una lista de festivos. Es de solo lectura, se actualiza al abrir el calendario y nunca se almacena: los eventos se descargan y se conservan solo mientras esta pestaña esté abierta.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Un enlace cuyo texto nombra un dominio y cuyo destino es otro se señala siempre, incluso si el destino es de confianza: ser de confianza no es lo mismo que ser el lugar que anunciaba el texto.",
|
||||||
|
"Actions": "Acciones",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Añadido desde un mensaje y eliminable aquí: antes la única forma de deshacerlo era buscar otro mensaje del mismo remitente.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Añadido aquí o desde el diálogo al abrir un enlace. Un dominio incluye también sus subdominios.",
|
||||||
|
"Agenda view": "Vista de agenda",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Los tres empiezan desactivados. Un cliente que empieza interrumpiendo es un cliente que se aprende a descartar sin leer, y un aviso descartado sin leer cuesta la misma atención y no aporta nada.",
|
||||||
|
"All {n} in {folder} are selected.": "Los {n} de {folder} están seleccionados.",
|
||||||
|
"All {n} on this page are selected.": "Los {n} de esta página están seleccionados.",
|
||||||
|
"Also count these domains as inside": "Contar también estos dominios como internos",
|
||||||
|
"Always": "Siempre",
|
||||||
|
"Always showing images from": "Mostrando siempre las imágenes de",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Una imagen cargada desde el servidor del remitente le indica que el mensaje se abrió, cuándo y desde dónde aproximadamente. Las imágenes aprobadas las descarga el propio servidor de ihasmail y no el navegador, de modo que el remitente no se entera de nada de eso.",
|
||||||
|
"Applies to": "Se aplica a",
|
||||||
|
"Archive and next": "Archivar y siguiente",
|
||||||
|
"Archive by month": "Archivar por mes",
|
||||||
|
"Archive by year": "Archivar por año",
|
||||||
|
"Archive failed: {error}": "Error al archivar: {error}",
|
||||||
|
"Archive to {folder}": "Archivar en {folder}",
|
||||||
|
"Ask before opening a link in a message": "Preguntar antes de abrir un enlace de un mensaje",
|
||||||
|
"Ask before sending outside": "Preguntar antes de enviar al exterior",
|
||||||
|
"Ask before sending to a large group": "Preguntar antes de enviar a un grupo grande",
|
||||||
|
"Back to the event": "Volver al evento",
|
||||||
|
"Before it happens": "Antes de que ocurra",
|
||||||
|
"Birthdays": "Cumpleaños",
|
||||||
|
"By sender": "Por remitente",
|
||||||
|
"By subject": "Por asunto",
|
||||||
|
"Choose…": "Elegir…",
|
||||||
|
"Classic": "Clásico",
|
||||||
|
"Click to move the event": "Haga clic para mover el evento",
|
||||||
|
"Close without saving?": "¿Cerrar sin guardar?",
|
||||||
|
"Compose as new": "Redactar como nuevo",
|
||||||
|
"Compose new message": "Redactar un mensaje nuevo",
|
||||||
|
"Conversation": "Conversación",
|
||||||
|
"Conversation moved to {folder}": "Conversación movida a {folder}",
|
||||||
|
"Could not be read": "No se pudo leer",
|
||||||
|
"Could not import this file: {error}": "No se pudo importar este archivo: {error}",
|
||||||
|
"Could not load this file.": "No se pudo cargar este archivo.",
|
||||||
|
"Could not read this calendar: {reason}": "No se pudo leer este calendario: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "No se pudo leer winmail.dat. El original sigue adjunto más abajo.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Cuenta personas y no cabeceras, así que una dirección en Para y nueve en Cc son un mensaje a diez. Detecta un responder a todos sobre un hilo largo.",
|
||||||
|
"Date received": "Fecha de recepción",
|
||||||
|
"Date sent": "Fecha de envío",
|
||||||
|
"Day view": "Vista de día",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine y Tokyo Night son obra de sus propios proyectos y se usan bajo la licencia MIT; los tonos intermedios entre sus colores publicados son derivados, y todos se comprueban en cuanto a contraste. El color de acento de abajo sigue aplicándose sobre cualquiera de ellos.",
|
||||||
|
"Earlier": "Antes",
|
||||||
|
"Every folder": "Todas las carpetas",
|
||||||
|
"Everyone addressed will receive this.": "Todos los destinatarios lo recibirán.",
|
||||||
|
"File contents": "Contenido del archivo",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Se rellena al insertar la plantilla, de modo que puede editar el resultado antes de enviarlo. Uno que aún no puede resolverse —el nombre de un destinatario en un mensaje que todavía no ha dirigido— se deja en el cuerpo tal como está escrito, en lugar de convertirse en un hueco.",
|
||||||
|
"Forward as attachment": "Reenviar como adjunto",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "A partir de los cumpleaños de sus contactos. No se almacena nada.",
|
||||||
|
"Go to Calendar": "Ir al Calendario",
|
||||||
|
"Go to Contacts": "Ir a Contactos",
|
||||||
|
"Go to Drafts": "Ir a Borradores",
|
||||||
|
"Go to Files": "Ir a Archivos",
|
||||||
|
"Go to Inbox": "Ir a la Bandeja de entrada",
|
||||||
|
"Go to Sent": "Ir a Enviados",
|
||||||
|
"Go to Settings": "Ir a Configuración",
|
||||||
|
"Go to Starred": "Ir a Destacados",
|
||||||
|
"Import iCAL file…": "Importar archivo iCAL…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Las etiquetas son palabras clave IMAP guardadas en sus mensajes, así que cualquier otro cliente las ve. Los nombres, los colores y el anidamiento son propios de ihasmail y acompañan a su cuenta. El anidamiento es solo de presentación: no reescribe nada en el buzón.",
|
||||||
|
"Largest first": "Los más grandes primero",
|
||||||
|
"Later": "Después",
|
||||||
|
"Light or dark": "Claro u oscuro",
|
||||||
|
"Mark messages from outside": "Marcar los mensajes del exterior",
|
||||||
|
"Marked as spam": "Marcado como spam",
|
||||||
|
"Message order": "Orden de los mensajes",
|
||||||
|
"Month view": "Vista de mes",
|
||||||
|
"More ways to send this": "Más formas de enviarlo",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Nombra a los destinatarios externos y pregunta, en lugar de negarse.",
|
||||||
|
"Navigation": "Navegación",
|
||||||
|
"Nested under": "Anidada bajo",
|
||||||
|
"Never": "Nunca",
|
||||||
|
"Never ask": "No preguntar nunca",
|
||||||
|
"Newest first": "Los más recientes primero",
|
||||||
|
"Next conversation": "Conversación siguiente",
|
||||||
|
"Next period": "Periodo siguiente",
|
||||||
|
"No availability information for {who}": "No hay información de disponibilidad de {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "No contiene archivos: solo lleva la copia con formato del mensaje.",
|
||||||
|
"No verdict recorded": "No se ha registrado ningún veredicto",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Nadie de aquí tiene libre/ocupado en este servidor, así que ninguna de estas filas puede decir si alguien está libre.",
|
||||||
|
"Nothing (top level)": "Nada (nivel superior)",
|
||||||
|
"Now, on your clock": "Ahora, según su reloj",
|
||||||
|
"Oldest first": "Los más antiguos primero",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Solo se muestra el principio: descargue el archivo para ver el resto.",
|
||||||
|
"Only when it has unread mail": "Solo cuando tenga correo sin leer",
|
||||||
|
"Open a link to {domain}?": "¿Abrir un enlace a {domain}?",
|
||||||
|
"Open it": "Abrirlo",
|
||||||
|
"Open links to these domains without asking": "Abrir los enlaces a estos dominios sin preguntar",
|
||||||
|
"Open, and stop asking about {domain}": "Abrir y dejar de preguntar por {domain}",
|
||||||
|
"Opening…": "Abriendo…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Ordenado por el servidor sobre toda la carpeta, no solo sobre los mensajes cargados hasta ahora. Los empates se resuelven siempre por los más recientes primero, de modo que el orden nunca cambia entre dos visitas a la misma carpeta.",
|
||||||
|
"Placeholders": "Marcadores de posición",
|
||||||
|
"Previous conversation": "Conversación anterior",
|
||||||
|
"Previous period": "Periodo anterior",
|
||||||
|
"Privacy & safety": "Privacidad y seguridad",
|
||||||
|
"Read receipts": "Confirmaciones de lectura",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Lectura, envío y cómo se muestran las fechas y las horas. Lo que llega a un remitente está en Privacidad y seguridad.",
|
||||||
|
"Remote content": "Contenido remoto",
|
||||||
|
"Remove subscription": "Eliminar la suscripción",
|
||||||
|
"Remove {domain}": "Eliminar {domain}",
|
||||||
|
"Rendered": "Representado",
|
||||||
|
"Save changes": "Guardar los cambios",
|
||||||
|
"Save filters": "Guardar los filtros",
|
||||||
|
"Save your changes?": "¿Guardar los cambios?",
|
||||||
|
"Saved": "Guardado",
|
||||||
|
"Select all {n} in {folder}": "Seleccionar los {n} de {folder}",
|
||||||
|
"Send message": "Enviar el mensaje",
|
||||||
|
"Send outside your organisation?": "¿Enviar fuera de su organización?",
|
||||||
|
"Send to {count} people?": "¿Enviar a {count} personas?",
|
||||||
|
"Show birthdays from your contacts": "Mostrar los cumpleaños de sus contactos",
|
||||||
|
"Show in the sidebar": "Mostrar en la barra lateral",
|
||||||
|
"Show keyboard shortcuts": "Mostrar los atajos de teclado",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Otra persona guardó este archivo mientras estaba abierto. Copie sus cambios, ciérrelo y vuelva a empezar.",
|
||||||
|
"Sort by, in order": "Ordenar por, en este orden",
|
||||||
|
"Source": "Código fuente",
|
||||||
|
"Spam filter": "Filtro de spam",
|
||||||
|
"Starred": "Destacados",
|
||||||
|
"Starred first": "Los destacados primero",
|
||||||
|
"Stay here": "Quedarse aquí",
|
||||||
|
"Stop trusting {address}": "Dejar de confiar en {address}",
|
||||||
|
"Subscribe to a calendar": "Suscribirse a un calendario",
|
||||||
|
"Subscribed calendar": "Calendario suscrito",
|
||||||
|
"Subscribed calendars": "Calendarios suscritos",
|
||||||
|
"Subscribed to {url}": "Suscrito a {url}",
|
||||||
|
"That file is no longer there.": "Ese archivo ya no está.",
|
||||||
|
"That identity's address": "La dirección de esa identidad",
|
||||||
|
"The Inbox only": "Solo la Bandeja de entrada",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "El mensaje se retiene en este navegador y todavía no se ha enviado, así que recuperarlo no cuesta nada.",
|
||||||
|
"The name on the identity you are sending as": "El nombre de la identidad con la que envía",
|
||||||
|
"The subject already on the message": "El asunto que ya tiene el mensaje",
|
||||||
|
"Their address": "Su dirección",
|
||||||
|
"Their first name alone": "Solo su nombre de pila",
|
||||||
|
"Then nothing": "Después nada",
|
||||||
|
"There is no preview for this kind of file.": "No hay vista previa para este tipo de archivo.",
|
||||||
|
"There is nothing in it to export": "No contiene nada que exportar",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Este archivo no es texto UTF-8, así que editarlo aquí lo dañaría: descárguelo en su lugar.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Este archivo es demasiado grande para mostrarlo aquí ({size}): descárguelo para leerlo.",
|
||||||
|
"This goes to {recipients}{rest}.": "Esto va a {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Este enlace no lleva a donde dice",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Este mensaje empaqueta sus adjuntos en un winmail.dat, que la mayoría de los clientes no pueden abrir.",
|
||||||
|
"Throw away your changes?": "¿Descartar los cambios?",
|
||||||
|
"Today, in your date format": "Hoy, en su formato de fecha",
|
||||||
|
"Unread first": "Los no leídos primero",
|
||||||
|
"Unsaved changes": "Cambios sin guardar",
|
||||||
|
"View as": "Ver como",
|
||||||
|
"Warnings": "Avisos",
|
||||||
|
"Week view": "Vista de semana",
|
||||||
|
"What is it called?": "¿Cómo se llama?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Qué llega a un remitente y qué pregunta antes de que ocurra.",
|
||||||
|
"What you changed here will be lost.": "Lo que ha cambiado aquí se perderá.",
|
||||||
|
"Who the message is addressed to": "A quién va dirigido el mensaje",
|
||||||
|
"Working out what is selected…": "Calculando la selección…",
|
||||||
|
"You": "Usted",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Su script de Sieve tiene cambios sin guardar.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "Sus reglas de filtrado tienen cambios sin guardar.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Los dominios de sus propias identidades son siempre internos y no hace falta indicarlos. Un dominio aquí incluye también sus subdominios.",
|
||||||
|
"Your own:": "Los suyos:",
|
||||||
|
"dark mode": "el modo oscuro",
|
||||||
|
"file": "archivo",
|
||||||
|
"light mode": "el modo claro",
|
||||||
|
"scored {score} against a threshold of {threshold}": "obtuvo {score} frente a un umbral de {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "obtuvo {score}, sin umbral indicado",
|
||||||
|
"this view": "esta vista",
|
||||||
|
"{count} conversations moved to {folder}": "{count} conversaciones movidas a {folder}",
|
||||||
|
"{count} folders": "{count} carpetas",
|
||||||
|
"{name}’s birthday": "Cumpleaños de {name}",
|
||||||
|
"{name}’s birthday ({age})": "Cumpleaños de {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Ya se envió una confirmación de lectura para este mensaje.",
|
||||||
|
"Add star": "Destacar",
|
||||||
|
"Could not attach": "No se pudo adjuntar",
|
||||||
|
"Delete forever?": "¿Eliminar definitivamente?",
|
||||||
|
"Delete?": "¿Eliminar?",
|
||||||
|
"No recipients": "Sin destinatarios",
|
||||||
|
"No sending identity available": "No hay ninguna identidad de envío disponible",
|
||||||
|
"Pick a date and time.": "Elija una fecha y una hora.",
|
||||||
|
"Pick a time at least a minute from now.": "Elija una hora al menos un minuto posterior a ahora.",
|
||||||
|
"Remove star": "Quitar de destacados",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Solicitada, a {address}. Nunca se envía automáticamente.",
|
||||||
|
"The sender did not request a read receipt.": "El remitente no solicitó confirmación de lectura.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Es correo masivo o de lista; una confirmación de lectura solo confirmaría que la dirección está activa.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Este mensaje no se ha recibido, así que no hay nada que informar.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Este mensaje se envió automáticamente, así que no se ofrece confirmación de lectura.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Este servidor no retiene un mensaje más de {span}.",
|
||||||
|
"Upload failed": "Error al subir",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "¿Mover {n} mensaje a la Papelera?", other: "¿Mover {n} mensajes a la Papelera?" },
|
||||||
|
"{n} days": { one: "{n} día", other: "{n} días" },
|
||||||
|
"{n} hours": { one: "{n} hora", other: "{n} horas" },
|
||||||
"Updated {n} contacts, nothing new": { one: "{n} contacto actualizado, nada nuevo", other: "{n} contactos actualizados, nada nuevo" },
|
"Updated {n} contacts, nothing new": { one: "{n} contacto actualizado, nada nuevo", other: "{n} contactos actualizados, nada nuevo" },
|
||||||
"{n} updated": { one: "{n} actualizado", other: "{n} actualizados" },
|
"{n} updated": { one: "{n} actualizado", other: "{n} actualizados" },
|
||||||
"Updated {n} contacts you already had": { one: "Se actualizó el contacto que ya tenías", other: "Se actualizaron {n} contactos que ya tenías" },
|
"Updated {n} contacts you already had": { one: "Se actualizó el contacto que ya tenías", other: "Se actualizaron {n} contactos que ya tenías" },
|
||||||
|
|||||||
@@ -1056,8 +1056,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Brouillon enregistré",
|
"Draft saved": "Brouillon enregistré",
|
||||||
"Emptying folder…": "Vidage du dossier…",
|
"Emptying folder…": "Vidage du dossier…",
|
||||||
"Nothing unread here": "Rien de non lu ici",
|
"Nothing unread here": "Rien de non lu ici",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " et {count} de plus",
|
||||||
|
"10 people or more": "10 personnes ou plus",
|
||||||
|
"20 people or more": "20 personnes ou plus",
|
||||||
|
"5 people or more": "5 personnes ou plus",
|
||||||
|
"50 people or more": "50 personnes ou plus",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Une bannière sur tout message dont l'expéditeur n'appartient pas à l'un de vos propres domaines.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Un calendrier à part, dérivé des anniversaires déjà présents sur vos fiches de contact. Rien n'est écrit nulle part : les dates restent sur les fiches, et un événement disparaît lorsque le contact disparaît ou que l'anniversaire est effacé. Il peut être masqué depuis la barre latérale du calendrier sans être désactivé ici.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Un calendrier publié à une URL : un horaire, un planning, une liste de jours fériés. Il est en lecture seule, actualisé à l'ouverture du calendrier et jamais stocké : les événements sont récupérés et conservés uniquement tant que cet onglet reste ouvert.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Un lien dont le texte nomme un domaine et dont la destination en est un autre est toujours signalé, même si la destination est approuvée : être approuvé n'est pas la même chose qu'être l'endroit annoncé par le texte.",
|
||||||
|
"Actions": "Actions",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Ajouté depuis un message et supprimable ici : auparavant, le seul moyen d'annuler était de retrouver un autre message du même expéditeur.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Ajouté ici, ou depuis la boîte de dialogue à l'ouverture d'un lien. Un domaine couvre aussi ses sous-domaines.",
|
||||||
|
"Agenda view": "Vue agenda",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Les trois sont désactivés au départ. Un client qui commence par interrompre est un client dont on apprend à écarter les messages sans les lire, et un avertissement écarté sans lecture coûte la même attention et n'apporte rien.",
|
||||||
|
"All {n} in {folder} are selected.": "Les {n} de {folder} sont sélectionnés.",
|
||||||
|
"All {n} on this page are selected.": "Les {n} de cette page sont sélectionnés.",
|
||||||
|
"Also count these domains as inside": "Considérer aussi ces domaines comme internes",
|
||||||
|
"Always": "Toujours",
|
||||||
|
"Always showing images from": "Images toujours affichées depuis",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Une image chargée depuis le serveur de l'expéditeur lui indique que le message a été ouvert, quand et approximativement d'où. Les images approuvées sont récupérées par le serveur d'ihasmail et non par le navigateur, de sorte que l'expéditeur n'apprend rien de tout cela.",
|
||||||
|
"Applies to": "S'applique à",
|
||||||
|
"Archive and next": "Archiver et suivant",
|
||||||
|
"Archive by month": "Archiver par mois",
|
||||||
|
"Archive by year": "Archiver par année",
|
||||||
|
"Archive failed: {error}": "Échec de l'archivage : {error}",
|
||||||
|
"Archive to {folder}": "Archiver vers {folder}",
|
||||||
|
"Ask before opening a link in a message": "Demander avant d'ouvrir un lien dans un message",
|
||||||
|
"Ask before sending outside": "Demander avant d'envoyer à l'extérieur",
|
||||||
|
"Ask before sending to a large group": "Demander avant d'envoyer à un grand groupe",
|
||||||
|
"Back to the event": "Retour à l'événement",
|
||||||
|
"Before it happens": "Avant que cela arrive",
|
||||||
|
"Birthdays": "Anniversaires",
|
||||||
|
"By sender": "Par expéditeur",
|
||||||
|
"By subject": "Par objet",
|
||||||
|
"Choose…": "Choisir…",
|
||||||
|
"Classic": "Classique",
|
||||||
|
"Click to move the event": "Cliquez pour déplacer l'événement",
|
||||||
|
"Close without saving?": "Fermer sans enregistrer ?",
|
||||||
|
"Compose as new": "Rédiger comme nouveau message",
|
||||||
|
"Compose new message": "Rédiger un nouveau message",
|
||||||
|
"Conversation": "Conversation",
|
||||||
|
"Conversation moved to {folder}": "Conversation déplacée vers {folder}",
|
||||||
|
"Could not be read": "Impossible à lire",
|
||||||
|
"Could not import this file: {error}": "Impossible d'importer ce fichier : {error}",
|
||||||
|
"Could not load this file.": "Impossible de charger ce fichier.",
|
||||||
|
"Could not read this calendar: {reason}": "Impossible de lire ce calendrier : {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "Impossible de lire winmail.dat. L'original reste joint ci-dessous.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Compte les personnes et non les en-têtes : une adresse dans À et neuf dans Cc font un message à dix. Détecte une réponse à tous sur un long fil.",
|
||||||
|
"Date received": "Date de réception",
|
||||||
|
"Date sent": "Date d'envoi",
|
||||||
|
"Day view": "Vue jour",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine et Tokyo Night sont l'œuvre de leurs propres projets et sont utilisés sous licence MIT ; les nuances entre leurs couleurs publiées en sont dérivées, et chacune est vérifiée pour le contraste. La couleur d'accent ci-dessous s'applique toujours par-dessus n'importe laquelle d'entre elles.",
|
||||||
|
"Earlier": "Plus tôt",
|
||||||
|
"Every folder": "Tous les dossiers",
|
||||||
|
"Everyone addressed will receive this.": "Tous les destinataires le recevront.",
|
||||||
|
"File contents": "Contenu du fichier",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Rempli à l'insertion du modèle, de sorte que vous pouvez modifier le résultat avant l'envoi. Un champ qui ne peut pas encore être résolu — le nom d'un destinataire sur un message que vous n'avez pas encore adressé — reste dans le corps tel qu'il est écrit, plutôt que de devenir un blanc.",
|
||||||
|
"Forward as attachment": "Transférer en pièce jointe",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "À partir des anniversaires de vos contacts. Rien n'est stocké.",
|
||||||
|
"Go to Calendar": "Aller au Calendrier",
|
||||||
|
"Go to Contacts": "Aller aux Contacts",
|
||||||
|
"Go to Drafts": "Aller aux Brouillons",
|
||||||
|
"Go to Files": "Aller aux Fichiers",
|
||||||
|
"Go to Inbox": "Aller à la Boîte de réception",
|
||||||
|
"Go to Sent": "Aller aux Envoyés",
|
||||||
|
"Go to Settings": "Aller aux Paramètres",
|
||||||
|
"Go to Starred": "Aller aux messages suivis",
|
||||||
|
"Import iCAL file…": "Importer un fichier iCAL…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Les libellés sont des mots-clés IMAP stockés sur vos messages, donc tous les autres clients les voient. Les noms, les couleurs et l'imbrication appartiennent à ihasmail et suivent votre compte. L'imbrication est purement visuelle : elle ne réécrit rien dans la boîte aux lettres.",
|
||||||
|
"Largest first": "Les plus volumineux d'abord",
|
||||||
|
"Later": "Plus tard",
|
||||||
|
"Light or dark": "Clair ou sombre",
|
||||||
|
"Mark messages from outside": "Signaler les messages venus de l'extérieur",
|
||||||
|
"Marked as spam": "Marqué comme spam",
|
||||||
|
"Message order": "Ordre des messages",
|
||||||
|
"Month view": "Vue mois",
|
||||||
|
"More ways to send this": "Autres façons de l'envoyer",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Nomme les destinataires externes et demande, au lieu de refuser.",
|
||||||
|
"Navigation": "Navigation",
|
||||||
|
"Nested under": "Imbriqué sous",
|
||||||
|
"Never": "Jamais",
|
||||||
|
"Never ask": "Ne jamais demander",
|
||||||
|
"Newest first": "Les plus récents d'abord",
|
||||||
|
"Next conversation": "Conversation suivante",
|
||||||
|
"Next period": "Période suivante",
|
||||||
|
"No availability information for {who}": "Aucune information de disponibilité pour {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Aucun fichier à l'intérieur : il ne contient que la copie mise en forme du message.",
|
||||||
|
"No verdict recorded": "Aucun verdict enregistré",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Personne ici n'a de disponibilité sur ce serveur, donc aucune de ces lignes ne peut dire si quelqu'un est libre.",
|
||||||
|
"Nothing (top level)": "Rien (niveau supérieur)",
|
||||||
|
"Now, on your clock": "Maintenant, à votre horloge",
|
||||||
|
"Oldest first": "Les plus anciens d'abord",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Seul le début est affiché : téléchargez le fichier pour le reste.",
|
||||||
|
"Only when it has unread mail": "Uniquement en cas de courrier non lu",
|
||||||
|
"Open a link to {domain}?": "Ouvrir un lien vers {domain} ?",
|
||||||
|
"Open it": "L'ouvrir",
|
||||||
|
"Open links to these domains without asking": "Ouvrir les liens vers ces domaines sans demander",
|
||||||
|
"Open, and stop asking about {domain}": "Ouvrir et ne plus demander pour {domain}",
|
||||||
|
"Opening…": "Ouverture…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Trié par le serveur sur l'ensemble du dossier, et pas seulement sur les messages déjà chargés. Les égalités sont toujours départagées par les plus récents d'abord, de sorte que l'ordre ne change jamais entre deux consultations du même dossier.",
|
||||||
|
"Placeholders": "Champs de substitution",
|
||||||
|
"Previous conversation": "Conversation précédente",
|
||||||
|
"Previous period": "Période précédente",
|
||||||
|
"Privacy & safety": "Confidentialité et sécurité",
|
||||||
|
"Read receipts": "Accusés de lecture",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Lecture, envoi et affichage des dates et des heures. Ce qui parvient à un expéditeur se trouve dans Confidentialité et sécurité.",
|
||||||
|
"Remote content": "Contenu distant",
|
||||||
|
"Remove subscription": "Supprimer l'abonnement",
|
||||||
|
"Remove {domain}": "Supprimer {domain}",
|
||||||
|
"Rendered": "Rendu",
|
||||||
|
"Save changes": "Enregistrer les modifications",
|
||||||
|
"Save filters": "Enregistrer les filtres",
|
||||||
|
"Save your changes?": "Enregistrer vos modifications ?",
|
||||||
|
"Saved": "Enregistré",
|
||||||
|
"Select all {n} in {folder}": "Sélectionner les {n} de {folder}",
|
||||||
|
"Send message": "Envoyer le message",
|
||||||
|
"Send outside your organisation?": "Envoyer en dehors de votre organisation ?",
|
||||||
|
"Send to {count} people?": "Envoyer à {count} personnes ?",
|
||||||
|
"Show birthdays from your contacts": "Afficher les anniversaires de vos contacts",
|
||||||
|
"Show in the sidebar": "Afficher dans la barre latérale",
|
||||||
|
"Show keyboard shortcuts": "Afficher les raccourcis clavier",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Quelqu'un d'autre a enregistré ce fichier pendant qu'il était ouvert. Copiez vos modifications, fermez-le et recommencez.",
|
||||||
|
"Sort by, in order": "Trier par, dans cet ordre",
|
||||||
|
"Source": "Source",
|
||||||
|
"Spam filter": "Filtre antispam",
|
||||||
|
"Starred": "Suivis",
|
||||||
|
"Starred first": "Les suivis d'abord",
|
||||||
|
"Stay here": "Rester ici",
|
||||||
|
"Stop trusting {address}": "Ne plus faire confiance à {address}",
|
||||||
|
"Subscribe to a calendar": "S'abonner à un calendrier",
|
||||||
|
"Subscribed calendar": "Calendrier abonné",
|
||||||
|
"Subscribed calendars": "Calendriers abonnés",
|
||||||
|
"Subscribed to {url}": "Abonné à {url}",
|
||||||
|
"That file is no longer there.": "Ce fichier n'est plus là.",
|
||||||
|
"That identity's address": "L'adresse de cette identité",
|
||||||
|
"The Inbox only": "La Boîte de réception uniquement",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "Le message est conservé dans ce navigateur et n'a pas encore été soumis, donc le reprendre ne coûte rien.",
|
||||||
|
"The name on the identity you are sending as": "Le nom de l'identité avec laquelle vous envoyez",
|
||||||
|
"The subject already on the message": "L'objet déjà présent sur le message",
|
||||||
|
"Their address": "Leur adresse",
|
||||||
|
"Their first name alone": "Leur prénom seul",
|
||||||
|
"Then nothing": "Puis rien",
|
||||||
|
"There is no preview for this kind of file.": "Il n'y a pas d'aperçu pour ce type de fichier.",
|
||||||
|
"There is nothing in it to export": "Il ne contient rien à exporter",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Ce fichier n'est pas du texte UTF-8 ; le modifier ici l'endommagerait : téléchargez-le plutôt.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Ce fichier est trop volumineux pour être affiché ici ({size}) : téléchargez-le pour le lire.",
|
||||||
|
"This goes to {recipients}{rest}.": "Ceci part vers {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Ce lien ne mène pas où il le prétend",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Ce message regroupe ses pièces jointes dans un winmail.dat, que la plupart des clients ne peuvent pas ouvrir.",
|
||||||
|
"Throw away your changes?": "Abandonner vos modifications ?",
|
||||||
|
"Today, in your date format": "Aujourd'hui, dans votre format de date",
|
||||||
|
"Unread first": "Les non lus d'abord",
|
||||||
|
"Unsaved changes": "Modifications non enregistrées",
|
||||||
|
"View as": "Afficher comme",
|
||||||
|
"Warnings": "Avertissements",
|
||||||
|
"Week view": "Vue semaine",
|
||||||
|
"What is it called?": "Comment cela s'appelle-t-il ?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Ce qui parvient à un expéditeur, et ce qui demande avant que cela arrive.",
|
||||||
|
"What you changed here will be lost.": "Ce que vous avez modifié ici sera perdu.",
|
||||||
|
"Who the message is addressed to": "À qui le message est adressé",
|
||||||
|
"Working out what is selected…": "Détermination de la sélection…",
|
||||||
|
"You": "Vous",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Votre script Sieve comporte des modifications non enregistrées.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "Vos règles de filtrage comportent des modifications non enregistrées.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Les domaines de vos propres identités sont toujours internes et n'ont pas besoin d'être listés. Un domaine indiqué ici couvre aussi ses sous-domaines.",
|
||||||
|
"Your own:": "Les vôtres :",
|
||||||
|
"dark mode": "le mode sombre",
|
||||||
|
"file": "fichier",
|
||||||
|
"light mode": "le mode clair",
|
||||||
|
"scored {score} against a threshold of {threshold}": "a obtenu {score} pour un seuil de {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "a obtenu {score}, sans seuil indiqué",
|
||||||
|
"this view": "cette vue",
|
||||||
|
"{count} conversations moved to {folder}": "{count} conversations déplacées vers {folder}",
|
||||||
|
"{count} folders": "{count} dossiers",
|
||||||
|
"{name}’s birthday": "Anniversaire de {name}",
|
||||||
|
"{name}’s birthday ({age})": "Anniversaire de {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Un accusé de lecture a déjà été envoyé pour ce message.",
|
||||||
|
"Add star": "Marquer comme suivi",
|
||||||
|
"Could not attach": "Impossible de joindre",
|
||||||
|
"Delete forever?": "Supprimer définitivement ?",
|
||||||
|
"Delete?": "Supprimer ?",
|
||||||
|
"No recipients": "Aucun destinataire",
|
||||||
|
"No sending identity available": "Aucune identité d'envoi disponible",
|
||||||
|
"Pick a date and time.": "Choisissez une date et une heure.",
|
||||||
|
"Pick a time at least a minute from now.": "Choisissez une heure au moins une minute après maintenant.",
|
||||||
|
"Remove star": "Ne plus suivre",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Demandé, à {address}. Jamais envoyé automatiquement.",
|
||||||
|
"The sender did not request a read receipt.": "L'expéditeur n'a pas demandé d'accusé de lecture.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Il s'agit d'un envoi en nombre ou de liste ; un accusé de lecture confirmerait seulement que l'adresse est active.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Ce message n'a pas été reçu, il n'y a donc rien à signaler.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Ce message a été envoyé automatiquement, aucun accusé de lecture n'est donc proposé.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Ce serveur ne retient pas un message plus de {span}.",
|
||||||
|
"Upload failed": "Échec de l'envoi",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "Déplacer {n} message vers la Corbeille ?", other: "Déplacer {n} messages vers la Corbeille ?" },
|
||||||
|
"{n} days": { one: "{n} jour", other: "{n} jours" },
|
||||||
|
"{n} hours": { one: "{n} heure", other: "{n} heures" },
|
||||||
"Updated {n} contacts, nothing new": { one: "{n} contact mis à jour, rien de nouveau", other: "{n} contacts mis à jour, rien de nouveau" },
|
"Updated {n} contacts, nothing new": { one: "{n} contact mis à jour, rien de nouveau", other: "{n} contacts mis à jour, rien de nouveau" },
|
||||||
"{n} updated": { one: "{n} mis à jour", other: "{n} mis à jour" },
|
"{n} updated": { one: "{n} mis à jour", other: "{n} mis à jour" },
|
||||||
"Updated {n} contacts you already had": { one: "Contact déjà présent mis à jour", other: "{n} contacts déjà présents mis à jour" },
|
"Updated {n} contacts you already had": { one: "Contact déjà présent mis à jour", other: "{n} contacts déjà présents mis à jour" },
|
||||||
|
|||||||
@@ -1059,8 +1059,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "下書きを保存しました",
|
"Draft saved": "下書きを保存しました",
|
||||||
"Emptying folder…": "フォルダーを空にしています…",
|
"Emptying folder…": "フォルダーを空にしています…",
|
||||||
"Nothing unread here": "ここに未読はありません",
|
"Nothing unread here": "ここに未読はありません",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " ほか{count}件",
|
||||||
|
"10 people or more": "10人以上",
|
||||||
|
"20 people or more": "20人以上",
|
||||||
|
"5 people or more": "5人以上",
|
||||||
|
"50 people or more": "50人以上",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "差出人が自分のドメインに属していないメールにバナーを表示します。",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "連絡先カードにすでにある誕生日から作られる専用のカレンダーです。どこにも書き込みは行われません。日付は連絡先カードに残り、連絡先が削除されるか誕生日が消されると予定も消えます。ここでオフにしなくても、カレンダーのサイドバーから非表示にできます。",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "URL で公開されているカレンダーです。時刻表、当番表、祝日一覧などが該当します。読み取り専用で、カレンダーを開いたときに更新され、保存されることはありません。予定は取得されるだけで、このタブが開いている間だけ保持されます。",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "表示されているドメインと実際のリンク先が異なる場合は、リンク先が信頼済みであっても必ず警告します。信頼済みであることと、テキストが示した場所であることは別だからです。",
|
||||||
|
"Actions": "操作",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "メールから追加されたもので、ここから削除できます。以前は同じ差出人の別のメールを探すしか取り消す方法がありませんでした。",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "ここで追加するか、リンクを開くときのダイアログから追加します。ドメインはそのサブドメインも含みます。",
|
||||||
|
"Agenda view": "予定リスト表示",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "3つとも初期状態ではオフです。最初から割り込んでくるクライアントは、読まずにクリックして閉じる習慣を身につけさせるだけです。読まれずに閉じられた警告は同じだけの注意を奪い、何も得られません。",
|
||||||
|
"All {n} in {folder} are selected.": "{folder} 内の {n} 件すべてを選択しました。",
|
||||||
|
"All {n} on this page are selected.": "このページの {n} 件すべてを選択しました。",
|
||||||
|
"Also count these domains as inside": "次のドメインも社内として扱う",
|
||||||
|
"Always": "常に",
|
||||||
|
"Always showing images from": "常に画像を表示する差出人",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "差出人のサーバーから読み込まれた画像は、メールが開かれたこと、その時刻、おおよその場所を差出人に伝えます。許可した画像はブラウザーではなく ihasmail のサーバーが取得するため、差出人にはそのいずれも伝わりません。",
|
||||||
|
"Applies to": "適用先",
|
||||||
|
"Archive and next": "アーカイブして次へ",
|
||||||
|
"Archive by month": "月ごとにアーカイブ",
|
||||||
|
"Archive by year": "年ごとにアーカイブ",
|
||||||
|
"Archive failed: {error}": "アーカイブに失敗しました: {error}",
|
||||||
|
"Archive to {folder}": "{folder} にアーカイブ",
|
||||||
|
"Ask before opening a link in a message": "メール内のリンクを開く前に確認する",
|
||||||
|
"Ask before sending outside": "社外に送信する前に確認する",
|
||||||
|
"Ask before sending to a large group": "大人数に送信する前に確認する",
|
||||||
|
"Back to the event": "予定に戻る",
|
||||||
|
"Before it happens": "実行される前に",
|
||||||
|
"Birthdays": "誕生日",
|
||||||
|
"By sender": "差出人順",
|
||||||
|
"By subject": "件名順",
|
||||||
|
"Choose…": "選択…",
|
||||||
|
"Classic": "クラシック",
|
||||||
|
"Click to move the event": "クリックすると予定を移動します",
|
||||||
|
"Close without saving?": "保存せずに閉じますか?",
|
||||||
|
"Compose as new": "新規メールとして作成",
|
||||||
|
"Compose new message": "新規メールを作成",
|
||||||
|
"Conversation": "スレッド",
|
||||||
|
"Conversation moved to {folder}": "スレッドを {folder} に移動しました",
|
||||||
|
"Could not be read": "読み取れませんでした",
|
||||||
|
"Could not import this file: {error}": "このファイルをインポートできませんでした: {error}",
|
||||||
|
"Could not load this file.": "このファイルを読み込めませんでした。",
|
||||||
|
"Could not read this calendar: {reason}": "このカレンダーを読み取れませんでした: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "winmail.dat を読み取れませんでした。元のファイルは下に添付されたままです。",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "ヘッダーではなく人数を数えます。To に1件、Cc に9件なら10人宛のメールです。長いスレッドへの全員返信を捉えます。",
|
||||||
|
"Date received": "受信日時",
|
||||||
|
"Date sent": "送信日時",
|
||||||
|
"Day view": "日表示",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula、Gruvbox、Rosé Pine、Tokyo Night はそれぞれのプロジェクトの成果物で、MIT ライセンスのもとで利用しています。公開された色の中間の階調は派生させたもので、いずれもコントラストを確認しています。下のアクセントカラーはどの配色の上にも適用されます。",
|
||||||
|
"Earlier": "これより前",
|
||||||
|
"Every folder": "すべてのフォルダー",
|
||||||
|
"Everyone addressed will receive this.": "宛先の全員がこれを受け取ります。",
|
||||||
|
"File contents": "ファイルの内容",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "テンプレートを挿入したときに差し込まれるため、送信前に結果を編集できます。まだ確定できないもの(宛先を入力していないメールでの受信者名など)は空欄にはならず、書かれたまま本文に残ります。",
|
||||||
|
"Forward as attachment": "添付ファイルとして転送",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "連絡先の誕生日から作られます。保存は行われません。",
|
||||||
|
"Go to Calendar": "カレンダーへ移動",
|
||||||
|
"Go to Contacts": "連絡先へ移動",
|
||||||
|
"Go to Drafts": "下書きへ移動",
|
||||||
|
"Go to Files": "ファイルへ移動",
|
||||||
|
"Go to Inbox": "受信トレイへ移動",
|
||||||
|
"Go to Sent": "送信済みへ移動",
|
||||||
|
"Go to Settings": "設定へ移動",
|
||||||
|
"Go to Starred": "スター付きへ移動",
|
||||||
|
"Import iCAL file…": "iCAL ファイルをインポート…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "ラベルはメールに保存される IMAP キーワードなので、ほかのクライアントからも見えます。名前、色、入れ子は ihasmail 独自のもので、アカウントに従います。入れ子は表示上のものにすぎず、メールボックスの中身は書き換えません。",
|
||||||
|
"Largest first": "サイズの大きい順",
|
||||||
|
"Later": "これより後",
|
||||||
|
"Light or dark": "ライトまたはダーク",
|
||||||
|
"Mark messages from outside": "社外からのメールに印を付ける",
|
||||||
|
"Marked as spam": "迷惑メールとして判定",
|
||||||
|
"Message order": "メールの並び順",
|
||||||
|
"Month view": "月表示",
|
||||||
|
"More ways to send this": "ほかの送信方法",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "拒否するのではなく、社外の宛先を示して確認します。",
|
||||||
|
"Navigation": "移動",
|
||||||
|
"Nested under": "親フォルダー",
|
||||||
|
"Never": "しない",
|
||||||
|
"Never ask": "確認しない",
|
||||||
|
"Newest first": "新しい順",
|
||||||
|
"Next conversation": "次のスレッド",
|
||||||
|
"Next period": "次の期間",
|
||||||
|
"No availability information for {who}": "{who} の空き情報がありません",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "中にファイルはありません。書式付きのメール本文のみが入っています。",
|
||||||
|
"No verdict recorded": "判定は記録されていません",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "このサーバーでは誰も空き情報を公開していないため、どの行についても空いているかどうかは判断できません。",
|
||||||
|
"Nothing (top level)": "なし(最上位)",
|
||||||
|
"Now, on your clock": "現在時刻(お使いの時計)",
|
||||||
|
"Oldest first": "古い順",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "先頭部分のみ表示しています。続きはファイルをダウンロードしてください。",
|
||||||
|
"Only when it has unread mail": "未読メールがあるときのみ",
|
||||||
|
"Open a link to {domain}?": "{domain} へのリンクを開きますか?",
|
||||||
|
"Open it": "開く",
|
||||||
|
"Open links to these domains without asking": "次のドメインへのリンクは確認せずに開く",
|
||||||
|
"Open, and stop asking about {domain}": "開いて、{domain} については今後確認しない",
|
||||||
|
"Opening…": "開いています…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "読み込み済みのメールだけでなく、フォルダー全体をサーバー側で並べ替えます。同順位のときは常に新しい順になるため、同じフォルダーを二度開いても並び順が入れ替わることはありません。",
|
||||||
|
"Placeholders": "差し込み項目",
|
||||||
|
"Previous conversation": "前のスレッド",
|
||||||
|
"Previous period": "前の期間",
|
||||||
|
"Privacy & safety": "プライバシーと安全",
|
||||||
|
"Read receipts": "開封確認",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "閲覧、送信、日付と時刻の表示に関する設定です。差出人に伝わる情報については「プライバシーと安全」にあります。",
|
||||||
|
"Remote content": "外部コンテンツ",
|
||||||
|
"Remove subscription": "購読を解除",
|
||||||
|
"Remove {domain}": "{domain} を削除",
|
||||||
|
"Rendered": "表示",
|
||||||
|
"Save changes": "変更を保存",
|
||||||
|
"Save filters": "フィルターを保存",
|
||||||
|
"Save your changes?": "変更を保存しますか?",
|
||||||
|
"Saved": "保存しました",
|
||||||
|
"Select all {n} in {folder}": "{folder} 内の {n} 件すべてを選択",
|
||||||
|
"Send message": "メールを送信",
|
||||||
|
"Send outside your organisation?": "組織の外に送信しますか?",
|
||||||
|
"Send to {count} people?": "{count} 人に送信しますか?",
|
||||||
|
"Show birthdays from your contacts": "連絡先の誕生日を表示する",
|
||||||
|
"Show in the sidebar": "サイドバーに表示する",
|
||||||
|
"Show keyboard shortcuts": "キーボードショートカットを表示",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "開いている間に別の人がこのファイルを保存しました。変更内容をコピーし、いったん閉じてからやり直してください。",
|
||||||
|
"Sort by, in order": "並べ替えの優先順位",
|
||||||
|
"Source": "ソース",
|
||||||
|
"Spam filter": "迷惑メールフィルター",
|
||||||
|
"Starred": "スター付き",
|
||||||
|
"Starred first": "スター付きを先頭に",
|
||||||
|
"Stay here": "ここに留まる",
|
||||||
|
"Stop trusting {address}": "{address} を信頼しない",
|
||||||
|
"Subscribe to a calendar": "カレンダーを購読",
|
||||||
|
"Subscribed calendar": "購読中のカレンダー",
|
||||||
|
"Subscribed calendars": "購読中のカレンダー",
|
||||||
|
"Subscribed to {url}": "{url} を購読しました",
|
||||||
|
"That file is no longer there.": "そのファイルはもうありません。",
|
||||||
|
"That identity's address": "その差出人のメールアドレス",
|
||||||
|
"The Inbox only": "受信トレイのみ",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "メールはこのブラウザー内に保持されており、まだ送信されていません。取り消しても何も失われません。",
|
||||||
|
"The name on the identity you are sending as": "送信に使う差出人の名前",
|
||||||
|
"The subject already on the message": "メールにすでに入力されている件名",
|
||||||
|
"Their address": "相手のメールアドレス",
|
||||||
|
"Their first name alone": "相手の名のみ",
|
||||||
|
"Then nothing": "その後は何もしない",
|
||||||
|
"There is no preview for this kind of file.": "この種類のファイルにプレビューはありません。",
|
||||||
|
"There is nothing in it to export": "エクスポートする内容がありません",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "このファイルは UTF-8 のテキストではないため、ここで編集すると壊れてしまいます。ダウンロードしてください。",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "このファイルはここに表示するには大きすぎます({size})。読むにはダウンロードしてください。",
|
||||||
|
"This goes to {recipients}{rest}.": "これは {recipients}{rest} に送信されます。",
|
||||||
|
"This link does not go where it says": "このリンクは表示どおりの場所には移動しません",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "このメールは添付ファイルを winmail.dat にまとめており、ほとんどのクライアントでは開けません。",
|
||||||
|
"Throw away your changes?": "変更を破棄しますか?",
|
||||||
|
"Today, in your date format": "今日(お使いの日付形式)",
|
||||||
|
"Unread first": "未読を先頭に",
|
||||||
|
"Unsaved changes": "保存されていない変更",
|
||||||
|
"View as": "表示形式",
|
||||||
|
"Warnings": "警告",
|
||||||
|
"Week view": "週表示",
|
||||||
|
"What is it called?": "名前は何にしますか?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "差出人に何が伝わるか、そしてその前に何を確認するか。",
|
||||||
|
"What you changed here will be lost.": "ここでの変更は失われます。",
|
||||||
|
"Who the message is addressed to": "メールの宛先",
|
||||||
|
"Working out what is selected…": "選択範囲を確認しています…",
|
||||||
|
"You": "自分",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Sieve スクリプトに保存されていない変更があります。",
|
||||||
|
"Your filter rules have changes that have not been saved.": "フィルタールールに保存されていない変更があります。",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "自分の差出人のドメインは常に社内として扱われるため、記載する必要はありません。ここに書いたドメインはサブドメインも含みます。",
|
||||||
|
"Your own:": "自分のもの:",
|
||||||
|
"dark mode": "ダークモード",
|
||||||
|
"file": "ファイル",
|
||||||
|
"light mode": "ライトモード",
|
||||||
|
"scored {score} against a threshold of {threshold}": "スコア {score}(しきい値 {threshold})",
|
||||||
|
"scored {score}, with no threshold stated": "スコア {score}(しきい値の記載なし)",
|
||||||
|
"this view": "この表示",
|
||||||
|
"{count} conversations moved to {folder}": "{count} 件のスレッドを {folder} に移動しました",
|
||||||
|
"{count} folders": "{count} 個のフォルダー",
|
||||||
|
"{name}’s birthday": "{name} の誕生日",
|
||||||
|
"{name}’s birthday ({age})": "{name} の誕生日({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "このメールには開封確認をすでに送信しています。",
|
||||||
|
"Add star": "スターを付ける",
|
||||||
|
"Could not attach": "添付できませんでした",
|
||||||
|
"Delete forever?": "完全に削除しますか?",
|
||||||
|
"Delete?": "削除しますか?",
|
||||||
|
"No recipients": "宛先がありません",
|
||||||
|
"No sending identity available": "利用できる差出人がありません",
|
||||||
|
"Pick a date and time.": "日付と時刻を選んでください。",
|
||||||
|
"Pick a time at least a minute from now.": "現在から1分以上あとの時刻を選んでください。",
|
||||||
|
"Remove star": "スターを外す",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "{address} 宛に要求されています。自動送信されることはありません。",
|
||||||
|
"The sender did not request a read receipt.": "差出人は開封確認を要求していません。",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "これは一括配信またはメーリングリストのメールです。開封確認を返しても、アドレスが有効であることを伝えるだけです。",
|
||||||
|
"This message has not been received, so there is nothing to report.": "このメールは受信したものではないため、報告する内容がありません。",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "このメールは自動送信されたため、開封確認は行いません。",
|
||||||
|
"This server will not hold a message longer than {span}.": "このサーバーはメールを {span} を超えて保留しません。",
|
||||||
|
"Upload failed": "アップロードに失敗しました",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { other: "{n} 通のメールをゴミ箱に移動しますか?" },
|
||||||
|
"{n} days": { other: "{n} 日" },
|
||||||
|
"{n} hours": { other: "{n} 時間" },
|
||||||
"Updated {n} contacts, nothing new": { other: "{n} 件の連絡先を更新しました。新規はありません" },
|
"Updated {n} contacts, nothing new": { other: "{n} 件の連絡先を更新しました。新規はありません" },
|
||||||
"{n} updated": { other: "{n} 件を更新" },
|
"{n} updated": { other: "{n} 件を更新" },
|
||||||
"Updated {n} contacts you already had": { other: "すでにある連絡先 {n} 件を更新しました" },
|
"Updated {n} contacts you already had": { other: "すでにある連絡先 {n} 件を更新しました" },
|
||||||
|
|||||||
@@ -1047,8 +1047,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Concept opgeslagen",
|
"Draft saved": "Concept opgeslagen",
|
||||||
"Emptying folder…": "Map wordt geleegd…",
|
"Emptying folder…": "Map wordt geleegd…",
|
||||||
"Nothing unread here": "Hier is niets ongelezen",
|
"Nothing unread here": "Hier is niets ongelezen",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " en nog {count}",
|
||||||
|
"10 people or more": "10 personen of meer",
|
||||||
|
"20 people or more": "20 personen of meer",
|
||||||
|
"5 people or more": "5 personen of meer",
|
||||||
|
"50 people or more": "50 personen of meer",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Een melding op elk bericht waarvan de afzender niet op een van uw eigen domeinen zit.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Een eigen agenda, afgeleid van de verjaardagen die al op uw contactkaarten staan. Er wordt nergens iets weggeschreven: de datums blijven op de kaarten, en een gebeurtenis verdwijnt zodra het contact verdwijnt of de verjaardag wordt gewist. U kunt hem verbergen in de zijbalk van de agenda zonder hem hier uit te schakelen.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Een agenda die op een URL is gepubliceerd: een rooster, een dienstlijst, een lijst met feestdagen. Hij is alleen-lezen, wordt vernieuwd wanneer u de agenda opent en wordt nooit opgeslagen: de gebeurtenissen worden opgehaald en alleen bewaard zolang dit tabblad open is.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Een link waarvan de tekst het ene domein noemt en de bestemming een ander is, wordt altijd gemarkeerd, ook als de bestemming vertrouwd is: vertrouwd zijn is niet hetzelfde als de plek zijn die de tekst noemde.",
|
||||||
|
"Actions": "Acties",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Toegevoegd vanuit een bericht en hier te verwijderen: voorheen kon dit alleen ongedaan worden gemaakt door een ander bericht van dezelfde afzender op te zoeken.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Hier toegevoegd, of vanuit het venster bij het openen van een link. Een domein omvat ook de subdomeinen.",
|
||||||
|
"Agenda view": "Agendaweergave",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Alle drie staan aanvankelijk uit. Een client die begint met onderbreken is er een die mensen leren weg te klikken, en een waarschuwing die ongelezen wordt weggeklikt kost dezelfde aandacht en levert niets op.",
|
||||||
|
"All {n} in {folder} are selected.": "Alle {n} in {folder} zijn geselecteerd.",
|
||||||
|
"All {n} on this page are selected.": "Alle {n} op deze pagina zijn geselecteerd.",
|
||||||
|
"Also count these domains as inside": "Deze domeinen ook als intern beschouwen",
|
||||||
|
"Always": "Altijd",
|
||||||
|
"Always showing images from": "Afbeeldingen altijd tonen van",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Een afbeelding die van de server van de afzender wordt geladen, vertelt die afzender dat het bericht is geopend, wanneer en ongeveer waarvandaan. Goedgekeurde afbeeldingen worden opgehaald door de server van ihasmail zelf en niet door de browser, dus de afzender komt daar niets van te weten.",
|
||||||
|
"Applies to": "Geldt voor",
|
||||||
|
"Archive and next": "Archiveren en volgende",
|
||||||
|
"Archive by month": "Archiveren per maand",
|
||||||
|
"Archive by year": "Archiveren per jaar",
|
||||||
|
"Archive failed: {error}": "Archiveren mislukt: {error}",
|
||||||
|
"Archive to {folder}": "Archiveren naar {folder}",
|
||||||
|
"Ask before opening a link in a message": "Vragen voordat een link in een bericht wordt geopend",
|
||||||
|
"Ask before sending outside": "Vragen voordat er naar buiten wordt verzonden",
|
||||||
|
"Ask before sending to a large group": "Vragen voordat er naar een grote groep wordt verzonden",
|
||||||
|
"Back to the event": "Terug naar de gebeurtenis",
|
||||||
|
"Before it happens": "Voordat het gebeurt",
|
||||||
|
"Birthdays": "Verjaardagen",
|
||||||
|
"By sender": "Op afzender",
|
||||||
|
"By subject": "Op onderwerp",
|
||||||
|
"Choose…": "Kiezen…",
|
||||||
|
"Classic": "Klassiek",
|
||||||
|
"Click to move the event": "Klik om de gebeurtenis te verplaatsen",
|
||||||
|
"Close without saving?": "Sluiten zonder opslaan?",
|
||||||
|
"Compose as new": "Als nieuw bericht opstellen",
|
||||||
|
"Compose new message": "Nieuw bericht opstellen",
|
||||||
|
"Conversation": "Gesprek",
|
||||||
|
"Conversation moved to {folder}": "Gesprek verplaatst naar {folder}",
|
||||||
|
"Could not be read": "Kon niet worden gelezen",
|
||||||
|
"Could not import this file: {error}": "Kon dit bestand niet importeren: {error}",
|
||||||
|
"Could not load this file.": "Kon dit bestand niet laden.",
|
||||||
|
"Could not read this calendar: {reason}": "Kon deze agenda niet lezen: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "Kon winmail.dat niet lezen. Het origineel zit hieronder nog als bijlage.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Telt personen in plaats van kopregels, dus één adres in Aan en negen in Cc is een bericht aan tien. Vangt een allen-beantwoorden op een lang gesprek af.",
|
||||||
|
"Date received": "Ontvangstdatum",
|
||||||
|
"Date sent": "Verzenddatum",
|
||||||
|
"Day view": "Dagweergave",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine en Tokyo Night zijn het werk van hun eigen projecten en worden gebruikt onder de MIT-licentie; de tinten tussen hun gepubliceerde kleuren zijn daarvan afgeleid, en elk daarvan wordt op contrast gecontroleerd. De accentkleur hieronder geldt nog steeds over elk ervan.",
|
||||||
|
"Earlier": "Eerder",
|
||||||
|
"Every folder": "Elke map",
|
||||||
|
"Everyone addressed will receive this.": "Iedereen die is geadresseerd ontvangt dit.",
|
||||||
|
"File contents": "Bestandsinhoud",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Wordt ingevuld wanneer de sjabloon wordt ingevoegd, zodat u het resultaat vóór verzending kunt bewerken. Een veld dat nog niet kan worden ingevuld — de naam van een ontvanger op een bericht dat u nog niet hebt geadresseerd — blijft in de tekst staan zoals het geschreven is, in plaats van een leegte te worden.",
|
||||||
|
"Forward as attachment": "Doorsturen als bijlage",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "Uit de verjaardagen van uw contacten. Er wordt niets opgeslagen.",
|
||||||
|
"Go to Calendar": "Ga naar Agenda",
|
||||||
|
"Go to Contacts": "Ga naar Contacten",
|
||||||
|
"Go to Drafts": "Ga naar Concepten",
|
||||||
|
"Go to Files": "Ga naar Bestanden",
|
||||||
|
"Go to Inbox": "Ga naar Postvak IN",
|
||||||
|
"Go to Sent": "Ga naar Verzonden",
|
||||||
|
"Go to Settings": "Ga naar Instellingen",
|
||||||
|
"Go to Starred": "Ga naar Met ster",
|
||||||
|
"Import iCAL file…": "iCAL-bestand importeren…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Labels zijn IMAP-trefwoorden die op uw berichten worden opgeslagen, dus elke andere client ziet ze. Namen, kleuren en nesting zijn van ihasmail zelf en volgen uw account. Nesting is alleen weergave: er wordt niets in het postvak herschreven.",
|
||||||
|
"Largest first": "Grootste eerst",
|
||||||
|
"Later": "Later",
|
||||||
|
"Light or dark": "Licht of donker",
|
||||||
|
"Mark messages from outside": "Berichten van buiten markeren",
|
||||||
|
"Marked as spam": "Als spam gemarkeerd",
|
||||||
|
"Message order": "Volgorde van berichten",
|
||||||
|
"Month view": "Maandweergave",
|
||||||
|
"More ways to send this": "Meer manieren om dit te versturen",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Noemt de externe ontvangers en vraagt het, in plaats van te weigeren.",
|
||||||
|
"Navigation": "Navigatie",
|
||||||
|
"Nested under": "Genest onder",
|
||||||
|
"Never": "Nooit",
|
||||||
|
"Never ask": "Nooit vragen",
|
||||||
|
"Newest first": "Nieuwste eerst",
|
||||||
|
"Next conversation": "Volgend gesprek",
|
||||||
|
"Next period": "Volgende periode",
|
||||||
|
"No availability information for {who}": "Geen beschikbaarheidsinformatie voor {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Geen bestanden erin: het bevat alleen de opgemaakte kopie van het bericht.",
|
||||||
|
"No verdict recorded": "Geen oordeel vastgelegd",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Niemand hier heeft vrij/bezet op deze server, dus geen van deze regels kan zeggen of iemand vrij is.",
|
||||||
|
"Nothing (top level)": "Niets (hoogste niveau)",
|
||||||
|
"Now, on your clock": "Nu, volgens uw klok",
|
||||||
|
"Oldest first": "Oudste eerst",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Alleen het begin wordt getoond: download het bestand voor de rest.",
|
||||||
|
"Only when it has unread mail": "Alleen bij ongelezen berichten",
|
||||||
|
"Open a link to {domain}?": "Een link naar {domain} openen?",
|
||||||
|
"Open it": "Openen",
|
||||||
|
"Open links to these domains without asking": "Links naar deze domeinen openen zonder te vragen",
|
||||||
|
"Open, and stop asking about {domain}": "Openen en niet meer vragen over {domain}",
|
||||||
|
"Opening…": "Bezig met openen…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Gesorteerd door de server over de hele map, niet alleen over de tot nu toe geladen berichten. Bij gelijke waarden geldt altijd nieuwste eerst, zodat de volgorde nooit verschuift tussen twee blikken op dezelfde map.",
|
||||||
|
"Placeholders": "Tijdelijke aanduidingen",
|
||||||
|
"Previous conversation": "Vorig gesprek",
|
||||||
|
"Previous period": "Vorige periode",
|
||||||
|
"Privacy & safety": "Privacy en veiligheid",
|
||||||
|
"Read receipts": "Leesbevestigingen",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Lezen, verzenden en hoe datums en tijden worden getoond. Wat een afzender bereikt staat onder Privacy en veiligheid.",
|
||||||
|
"Remote content": "Externe inhoud",
|
||||||
|
"Remove subscription": "Abonnement verwijderen",
|
||||||
|
"Remove {domain}": "{domain} verwijderen",
|
||||||
|
"Rendered": "Weergegeven",
|
||||||
|
"Save changes": "Wijzigingen opslaan",
|
||||||
|
"Save filters": "Filters opslaan",
|
||||||
|
"Save your changes?": "Uw wijzigingen opslaan?",
|
||||||
|
"Saved": "Opgeslagen",
|
||||||
|
"Select all {n} in {folder}": "Alle {n} in {folder} selecteren",
|
||||||
|
"Send message": "Bericht verzenden",
|
||||||
|
"Send outside your organisation?": "Buiten uw organisatie verzenden?",
|
||||||
|
"Send to {count} people?": "Naar {count} personen verzenden?",
|
||||||
|
"Show birthdays from your contacts": "Verjaardagen van uw contacten tonen",
|
||||||
|
"Show in the sidebar": "In de zijbalk tonen",
|
||||||
|
"Show keyboard shortcuts": "Sneltoetsen tonen",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Iemand anders heeft dit bestand opgeslagen terwijl het open stond. Kopieer uw wijzigingen, sluit het en begin opnieuw.",
|
||||||
|
"Sort by, in order": "Sorteren op, in deze volgorde",
|
||||||
|
"Source": "Bron",
|
||||||
|
"Spam filter": "Spamfilter",
|
||||||
|
"Starred": "Met ster",
|
||||||
|
"Starred first": "Met ster eerst",
|
||||||
|
"Stay here": "Hier blijven",
|
||||||
|
"Stop trusting {address}": "{address} niet meer vertrouwen",
|
||||||
|
"Subscribe to a calendar": "Op een agenda abonneren",
|
||||||
|
"Subscribed calendar": "Geabonneerde agenda",
|
||||||
|
"Subscribed calendars": "Geabonneerde agenda's",
|
||||||
|
"Subscribed to {url}": "Geabonneerd op {url}",
|
||||||
|
"That file is no longer there.": "Dat bestand is er niet meer.",
|
||||||
|
"That identity's address": "Het adres van die identiteit",
|
||||||
|
"The Inbox only": "Alleen Postvak IN",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "Het bericht wordt in deze browser vastgehouden en is nog niet ingediend, dus terughalen kost niets.",
|
||||||
|
"The name on the identity you are sending as": "De naam op de identiteit waarmee u verzendt",
|
||||||
|
"The subject already on the message": "Het onderwerp dat al op het bericht staat",
|
||||||
|
"Their address": "Hun adres",
|
||||||
|
"Their first name alone": "Alleen hun voornaam",
|
||||||
|
"Then nothing": "Daarna niets",
|
||||||
|
"There is no preview for this kind of file.": "Voor dit soort bestand is er geen voorbeeld.",
|
||||||
|
"There is nothing in it to export": "Er zit niets in om te exporteren",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Dit bestand is geen UTF-8-tekst, dus het hier bewerken zou het beschadigen: download het in plaats daarvan.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Dit bestand is te groot om hier te tonen ({size}): download het om het te lezen.",
|
||||||
|
"This goes to {recipients}{rest}.": "Dit gaat naar {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Deze link gaat niet waarheen hij zegt",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Dit bericht verpakt zijn bijlagen in een winmail.dat, die de meeste clients niet kunnen openen.",
|
||||||
|
"Throw away your changes?": "Uw wijzigingen weggooien?",
|
||||||
|
"Today, in your date format": "Vandaag, in uw datumnotatie",
|
||||||
|
"Unread first": "Ongelezen eerst",
|
||||||
|
"Unsaved changes": "Niet-opgeslagen wijzigingen",
|
||||||
|
"View as": "Weergeven als",
|
||||||
|
"Warnings": "Waarschuwingen",
|
||||||
|
"Week view": "Weekweergave",
|
||||||
|
"What is it called?": "Hoe heet het?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Wat een afzender bereikt, en wat het vraagt voordat het gebeurt.",
|
||||||
|
"What you changed here will be lost.": "Wat u hier hebt gewijzigd gaat verloren.",
|
||||||
|
"Who the message is addressed to": "Aan wie het bericht is geadresseerd",
|
||||||
|
"Working out what is selected…": "Bezig met bepalen wat er geselecteerd is…",
|
||||||
|
"You": "U",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Uw Sieve-script bevat wijzigingen die niet zijn opgeslagen.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "Uw filterregels bevatten wijzigingen die niet zijn opgeslagen.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "De domeinen van uw eigen identiteiten zijn altijd intern en hoeven niet te worden vermeld. Een domein hier omvat ook de subdomeinen.",
|
||||||
|
"Your own:": "Uw eigen:",
|
||||||
|
"dark mode": "de donkere modus",
|
||||||
|
"file": "bestand",
|
||||||
|
"light mode": "de lichte modus",
|
||||||
|
"scored {score} against a threshold of {threshold}": "scoorde {score} bij een drempel van {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "scoorde {score}, zonder vermelde drempel",
|
||||||
|
"this view": "deze weergave",
|
||||||
|
"{count} conversations moved to {folder}": "{count} gesprekken verplaatst naar {folder}",
|
||||||
|
"{count} folders": "{count} mappen",
|
||||||
|
"{name}’s birthday": "Verjaardag van {name}",
|
||||||
|
"{name}’s birthday ({age})": "Verjaardag van {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Voor dit bericht is al een leesbevestiging verzonden.",
|
||||||
|
"Add star": "Ster toevoegen",
|
||||||
|
"Could not attach": "Kon niet bijvoegen",
|
||||||
|
"Delete forever?": "Definitief verwijderen?",
|
||||||
|
"Delete?": "Verwijderen?",
|
||||||
|
"No recipients": "Geen ontvangers",
|
||||||
|
"No sending identity available": "Geen verzendidentiteit beschikbaar",
|
||||||
|
"Pick a date and time.": "Kies een datum en tijd.",
|
||||||
|
"Pick a time at least a minute from now.": "Kies een tijd van minstens een minuut vanaf nu.",
|
||||||
|
"Remove star": "Ster verwijderen",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Gevraagd, aan {address}. Wordt nooit automatisch verzonden.",
|
||||||
|
"The sender did not request a read receipt.": "De afzender heeft geen leesbevestiging gevraagd.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Dit is bulk- of lijstpost; een leesbevestiging bevestigt daarvoor alleen dat het adres actief is.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Dit bericht is niet ontvangen, dus er valt niets te melden.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Dit bericht is automatisch verzonden, dus er wordt geen leesbevestiging aangeboden.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Deze server houdt een bericht niet langer dan {span} vast.",
|
||||||
|
"Upload failed": "Uploaden mislukt",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "{n} bericht naar de Prullenbak verplaatsen?", other: "{n} berichten naar de Prullenbak verplaatsen?" },
|
||||||
|
"{n} days": { one: "{n} dag", other: "{n} dagen" },
|
||||||
|
"{n} hours": { one: "{n} uur", other: "{n} uur" },
|
||||||
"Updated {n} contacts, nothing new": { one: "{n} contact bijgewerkt, niets nieuws", other: "{n} contacten bijgewerkt, niets nieuws" },
|
"Updated {n} contacts, nothing new": { one: "{n} contact bijgewerkt, niets nieuws", other: "{n} contacten bijgewerkt, niets nieuws" },
|
||||||
"{n} updated": { one: "{n} bijgewerkt", other: "{n} bijgewerkt" },
|
"{n} updated": { one: "{n} bijgewerkt", other: "{n} bijgewerkt" },
|
||||||
"Updated {n} contacts you already had": { one: "Bestaand contact bijgewerkt", other: "{n} bestaande contacten bijgewerkt" },
|
"Updated {n} contacts you already had": { one: "Bestaand contact bijgewerkt", other: "{n} bestaande contacten bijgewerkt" },
|
||||||
|
|||||||
@@ -1054,8 +1054,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Rascunho salvo",
|
"Draft saved": "Rascunho salvo",
|
||||||
"Emptying folder…": "Esvaziando a pasta…",
|
"Emptying folder…": "Esvaziando a pasta…",
|
||||||
"Nothing unread here": "Não há nada não lido aqui",
|
"Nothing unread here": "Não há nada não lido aqui",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " e mais {count}",
|
||||||
|
"10 people or more": "10 pessoas ou mais",
|
||||||
|
"20 people or more": "20 pessoas ou mais",
|
||||||
|
"5 people or more": "5 pessoas ou mais",
|
||||||
|
"50 people or more": "50 pessoas ou mais",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Um aviso em qualquer mensagem cujo remetente não esteja em um dos seus próprios domínios.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Uma agenda própria, derivada dos aniversários que já estão nos seus cartões de contato. Nada é gravado em lugar nenhum: as datas continuam nos cartões, e um evento desaparece quando o contato desaparece ou o aniversário é apagado. Ela pode ser ocultada na barra lateral da agenda sem ser desativada aqui.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Uma agenda publicada em uma URL: um horário, uma escala, uma lista de feriados. É somente leitura, atualizada quando você abre a agenda e nunca armazenada: os eventos são buscados e mantidos apenas enquanto esta aba estiver aberta.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Um link cujo texto nomeia um domínio e cujo destino é outro é sempre sinalizado, mesmo quando o destino é confiável: ser confiável não é o mesmo que ser o lugar que o texto anunciava.",
|
||||||
|
"Actions": "Ações",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Adicionado a partir de uma mensagem e removível aqui: antes, a única forma de desfazer era encontrar outra mensagem do mesmo remetente.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Adicionado aqui ou pela caixa de diálogo ao abrir um link. Um domínio também abrange os seus subdomínios.",
|
||||||
|
"Agenda view": "Visualização de agenda",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Os três começam desligados. Um cliente que começa interrompendo é um cliente que as pessoas aprendem a dispensar sem ler, e um aviso dispensado sem leitura custa a mesma atenção e não traz nada.",
|
||||||
|
"All {n} in {folder} are selected.": "Todas as {n} em {folder} estão selecionadas.",
|
||||||
|
"All {n} on this page are selected.": "Todas as {n} desta página estão selecionadas.",
|
||||||
|
"Also count these domains as inside": "Contar também estes domínios como internos",
|
||||||
|
"Always": "Sempre",
|
||||||
|
"Always showing images from": "Sempre exibindo imagens de",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Uma imagem carregada do servidor do remetente informa a ele que a mensagem foi aberta, quando e aproximadamente de onde. As imagens aprovadas são buscadas pelo próprio servidor do ihasmail, e não pelo navegador, de modo que o remetente não fica sabendo de nada disso.",
|
||||||
|
"Applies to": "Aplica-se a",
|
||||||
|
"Archive and next": "Arquivar e próxima",
|
||||||
|
"Archive by month": "Arquivar por mês",
|
||||||
|
"Archive by year": "Arquivar por ano",
|
||||||
|
"Archive failed: {error}": "Falha ao arquivar: {error}",
|
||||||
|
"Archive to {folder}": "Arquivar em {folder}",
|
||||||
|
"Ask before opening a link in a message": "Perguntar antes de abrir um link em uma mensagem",
|
||||||
|
"Ask before sending outside": "Perguntar antes de enviar para fora",
|
||||||
|
"Ask before sending to a large group": "Perguntar antes de enviar para um grupo grande",
|
||||||
|
"Back to the event": "Voltar ao evento",
|
||||||
|
"Before it happens": "Antes que aconteça",
|
||||||
|
"Birthdays": "Aniversários",
|
||||||
|
"By sender": "Por remetente",
|
||||||
|
"By subject": "Por assunto",
|
||||||
|
"Choose…": "Escolher…",
|
||||||
|
"Classic": "Clássico",
|
||||||
|
"Click to move the event": "Clique para mover o evento",
|
||||||
|
"Close without saving?": "Fechar sem salvar?",
|
||||||
|
"Compose as new": "Escrever como nova mensagem",
|
||||||
|
"Compose new message": "Escrever nova mensagem",
|
||||||
|
"Conversation": "Conversa",
|
||||||
|
"Conversation moved to {folder}": "Conversa movida para {folder}",
|
||||||
|
"Could not be read": "Não foi possível ler",
|
||||||
|
"Could not import this file: {error}": "Não foi possível importar este arquivo: {error}",
|
||||||
|
"Could not load this file.": "Não foi possível carregar este arquivo.",
|
||||||
|
"Could not read this calendar: {reason}": "Não foi possível ler esta agenda: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "Não foi possível ler o winmail.dat. O original continua anexado abaixo.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Conta pessoas em vez de cabeçalhos, então um endereço em Para e nove em Cc é uma mensagem para dez. Detecta um responder a todos em uma conversa longa.",
|
||||||
|
"Date received": "Data de recebimento",
|
||||||
|
"Date sent": "Data de envio",
|
||||||
|
"Day view": "Visualização de dia",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine e Tokyo Night são obra dos seus próprios projetos e são usados sob a licença MIT; os tons entre as cores publicadas por eles são derivados, e cada um deles é verificado quanto ao contraste. A cor de destaque abaixo continua se aplicando sobre qualquer um deles.",
|
||||||
|
"Earlier": "Antes",
|
||||||
|
"Every folder": "Todas as pastas",
|
||||||
|
"Everyone addressed will receive this.": "Todos os destinatários receberão isto.",
|
||||||
|
"File contents": "Conteúdo do arquivo",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Preenchido quando o modelo é inserido, para que você possa editar o resultado antes de enviar. Um campo que ainda não pode ser resolvido — o nome de um destinatário em uma mensagem que você ainda não endereçou — permanece no corpo como foi escrito, em vez de virar um espaço em branco.",
|
||||||
|
"Forward as attachment": "Encaminhar como anexo",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "A partir dos aniversários dos seus contatos. Nada é armazenado.",
|
||||||
|
"Go to Calendar": "Ir para a Agenda",
|
||||||
|
"Go to Contacts": "Ir para Contatos",
|
||||||
|
"Go to Drafts": "Ir para Rascunhos",
|
||||||
|
"Go to Files": "Ir para Arquivos",
|
||||||
|
"Go to Inbox": "Ir para a Caixa de entrada",
|
||||||
|
"Go to Sent": "Ir para Enviados",
|
||||||
|
"Go to Settings": "Ir para Configurações",
|
||||||
|
"Go to Starred": "Ir para Favoritos",
|
||||||
|
"Import iCAL file…": "Importar arquivo iCAL…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Os marcadores são palavras-chave IMAP armazenadas nas suas mensagens, então todos os outros clientes os veem. Os nomes, as cores e o aninhamento são do próprio ihasmail e acompanham a sua conta. O aninhamento é apenas de exibição: não reescreve nada na caixa postal.",
|
||||||
|
"Largest first": "Maiores primeiro",
|
||||||
|
"Later": "Depois",
|
||||||
|
"Light or dark": "Claro ou escuro",
|
||||||
|
"Mark messages from outside": "Marcar mensagens vindas de fora",
|
||||||
|
"Marked as spam": "Marcada como spam",
|
||||||
|
"Message order": "Ordem das mensagens",
|
||||||
|
"Month view": "Visualização de mês",
|
||||||
|
"More ways to send this": "Outras formas de enviar isto",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Nomeia os destinatários externos e pergunta, em vez de recusar.",
|
||||||
|
"Navigation": "Navegação",
|
||||||
|
"Nested under": "Aninhado em",
|
||||||
|
"Never": "Nunca",
|
||||||
|
"Never ask": "Nunca perguntar",
|
||||||
|
"Newest first": "Mais recentes primeiro",
|
||||||
|
"Next conversation": "Próxima conversa",
|
||||||
|
"Next period": "Próximo período",
|
||||||
|
"No availability information for {who}": "Sem informações de disponibilidade de {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Nenhum arquivo dentro: ele traz apenas a cópia formatada da mensagem.",
|
||||||
|
"No verdict recorded": "Nenhum veredito registrado",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Ninguém aqui tem livre/ocupado neste servidor, então nenhuma destas linhas pode dizer se alguém está livre.",
|
||||||
|
"Nothing (top level)": "Nada (nível superior)",
|
||||||
|
"Now, on your clock": "Agora, pelo seu relógio",
|
||||||
|
"Oldest first": "Mais antigas primeiro",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Só o começo é exibido: baixe o arquivo para ver o resto.",
|
||||||
|
"Only when it has unread mail": "Somente quando houver mensagens não lidas",
|
||||||
|
"Open a link to {domain}?": "Abrir um link para {domain}?",
|
||||||
|
"Open it": "Abrir",
|
||||||
|
"Open links to these domains without asking": "Abrir links para estes domínios sem perguntar",
|
||||||
|
"Open, and stop asking about {domain}": "Abrir e parar de perguntar sobre {domain}",
|
||||||
|
"Opening…": "Abrindo…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Ordenado pelo servidor sobre a pasta inteira, e não apenas sobre as mensagens carregadas até agora. Empates sempre recaem em mais recentes primeiro, de modo que a ordem nunca muda entre duas visitas à mesma pasta.",
|
||||||
|
"Placeholders": "Marcadores de posição",
|
||||||
|
"Previous conversation": "Conversa anterior",
|
||||||
|
"Previous period": "Período anterior",
|
||||||
|
"Privacy & safety": "Privacidade e segurança",
|
||||||
|
"Read receipts": "Confirmações de leitura",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Leitura, envio e como as datas e horas são exibidas. O que chega a um remetente fica em Privacidade e segurança.",
|
||||||
|
"Remote content": "Conteúdo remoto",
|
||||||
|
"Remove subscription": "Remover a assinatura",
|
||||||
|
"Remove {domain}": "Remover {domain}",
|
||||||
|
"Rendered": "Renderizado",
|
||||||
|
"Save changes": "Salvar alterações",
|
||||||
|
"Save filters": "Salvar filtros",
|
||||||
|
"Save your changes?": "Salvar suas alterações?",
|
||||||
|
"Saved": "Salvo",
|
||||||
|
"Select all {n} in {folder}": "Selecionar todas as {n} em {folder}",
|
||||||
|
"Send message": "Enviar mensagem",
|
||||||
|
"Send outside your organisation?": "Enviar para fora da sua organização?",
|
||||||
|
"Send to {count} people?": "Enviar para {count} pessoas?",
|
||||||
|
"Show birthdays from your contacts": "Exibir aniversários dos seus contatos",
|
||||||
|
"Show in the sidebar": "Exibir na barra lateral",
|
||||||
|
"Show keyboard shortcuts": "Exibir atalhos de teclado",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Outra pessoa salvou este arquivo enquanto ele estava aberto. Copie as suas alterações, feche-o e comece de novo.",
|
||||||
|
"Sort by, in order": "Ordenar por, nesta ordem",
|
||||||
|
"Source": "Código-fonte",
|
||||||
|
"Spam filter": "Filtro de spam",
|
||||||
|
"Starred": "Favoritas",
|
||||||
|
"Starred first": "Favoritas primeiro",
|
||||||
|
"Stay here": "Ficar aqui",
|
||||||
|
"Stop trusting {address}": "Deixar de confiar em {address}",
|
||||||
|
"Subscribe to a calendar": "Assinar uma agenda",
|
||||||
|
"Subscribed calendar": "Agenda assinada",
|
||||||
|
"Subscribed calendars": "Agendas assinadas",
|
||||||
|
"Subscribed to {url}": "Assinado {url}",
|
||||||
|
"That file is no longer there.": "Esse arquivo não está mais lá.",
|
||||||
|
"That identity's address": "O endereço dessa identidade",
|
||||||
|
"The Inbox only": "Somente a Caixa de entrada",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "A mensagem fica retida neste navegador e ainda não foi enviada, então recuperá-la não custa nada.",
|
||||||
|
"The name on the identity you are sending as": "O nome da identidade com a qual você está enviando",
|
||||||
|
"The subject already on the message": "O assunto que já está na mensagem",
|
||||||
|
"Their address": "O endereço dele",
|
||||||
|
"Their first name alone": "Apenas o primeiro nome dele",
|
||||||
|
"Then nothing": "Depois nada",
|
||||||
|
"There is no preview for this kind of file.": "Não há visualização para este tipo de arquivo.",
|
||||||
|
"There is nothing in it to export": "Não há nada nela para exportar",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Este arquivo não é texto UTF-8, então editá-lo aqui iria corrompê-lo: baixe-o em vez disso.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Este arquivo é grande demais para ser exibido aqui ({size}): baixe-o para lê-lo.",
|
||||||
|
"This goes to {recipients}{rest}.": "Isto vai para {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Este link não leva para onde diz",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Esta mensagem empacota os anexos em um winmail.dat, que a maioria dos clientes não consegue abrir.",
|
||||||
|
"Throw away your changes?": "Descartar suas alterações?",
|
||||||
|
"Today, in your date format": "Hoje, no seu formato de data",
|
||||||
|
"Unread first": "Não lidas primeiro",
|
||||||
|
"Unsaved changes": "Alterações não salvas",
|
||||||
|
"View as": "Exibir como",
|
||||||
|
"Warnings": "Avisos",
|
||||||
|
"Week view": "Visualização de semana",
|
||||||
|
"What is it called?": "Como se chama?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "O que chega a um remetente e o que pergunta antes que aconteça.",
|
||||||
|
"What you changed here will be lost.": "O que você alterou aqui será perdido.",
|
||||||
|
"Who the message is addressed to": "Para quem a mensagem está endereçada",
|
||||||
|
"Working out what is selected…": "Calculando a seleção…",
|
||||||
|
"You": "Você",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "Seu script Sieve tem alterações que não foram salvas.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "Suas regras de filtro têm alterações que não foram salvas.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Os domínios das suas próprias identidades são sempre internos e não precisam ser listados. Um domínio aqui também abrange os seus subdomínios.",
|
||||||
|
"Your own:": "Os seus:",
|
||||||
|
"dark mode": "o modo escuro",
|
||||||
|
"file": "arquivo",
|
||||||
|
"light mode": "o modo claro",
|
||||||
|
"scored {score} against a threshold of {threshold}": "pontuou {score} para um limite de {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "pontuou {score}, sem limite informado",
|
||||||
|
"this view": "esta visualização",
|
||||||
|
"{count} conversations moved to {folder}": "{count} conversas movidas para {folder}",
|
||||||
|
"{count} folders": "{count} pastas",
|
||||||
|
"{name}’s birthday": "Aniversário de {name}",
|
||||||
|
"{name}’s birthday ({age})": "Aniversário de {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Já foi enviada uma confirmação de leitura para esta mensagem.",
|
||||||
|
"Add star": "Favoritar",
|
||||||
|
"Could not attach": "Não foi possível anexar",
|
||||||
|
"Delete forever?": "Excluir definitivamente?",
|
||||||
|
"Delete?": "Excluir?",
|
||||||
|
"No recipients": "Sem destinatários",
|
||||||
|
"No sending identity available": "Nenhuma identidade de envio disponível",
|
||||||
|
"Pick a date and time.": "Escolha uma data e uma hora.",
|
||||||
|
"Pick a time at least a minute from now.": "Escolha um horário pelo menos um minuto à frente.",
|
||||||
|
"Remove star": "Remover dos favoritos",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Solicitada, para {address}. Nunca é enviada automaticamente.",
|
||||||
|
"The sender did not request a read receipt.": "O remetente não solicitou confirmação de leitura.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Isto é correio em massa ou de lista; uma confirmação de leitura apenas confirmaria que o endereço está ativo.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Esta mensagem não foi recebida, então não há nada a informar.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Esta mensagem foi enviada automaticamente, então não há confirmação de leitura a oferecer.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Este servidor não retém uma mensagem por mais de {span}.",
|
||||||
|
"Upload failed": "Falha no envio",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "Mover {n} mensagem para a Lixeira?", other: "Mover {n} mensagens para a Lixeira?" },
|
||||||
|
"{n} days": { one: "{n} dia", other: "{n} dias" },
|
||||||
|
"{n} hours": { one: "{n} hora", other: "{n} horas" },
|
||||||
"Updated {n} contacts, nothing new": { one: "{n} contato atualizado, nada novo", other: "{n} contatos atualizados, nada novo" },
|
"Updated {n} contacts, nothing new": { one: "{n} contato atualizado, nada novo", other: "{n} contatos atualizados, nada novo" },
|
||||||
"{n} updated": { one: "{n} atualizado", other: "{n} atualizados" },
|
"{n} updated": { one: "{n} atualizado", other: "{n} atualizados" },
|
||||||
"Updated {n} contacts you already had": { one: "Contato que você já tinha atualizado", other: "{n} contatos que você já tinha atualizados" },
|
"Updated {n} contacts you already had": { one: "Contato que você já tinha atualizado", other: "{n} contatos que você já tinha atualizados" },
|
||||||
|
|||||||
@@ -1053,8 +1053,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Черновик сохранён",
|
"Draft saved": "Черновик сохранён",
|
||||||
"Emptying folder…": "Папка очищается…",
|
"Emptying folder…": "Папка очищается…",
|
||||||
"Nothing unread here": "Здесь нет непрочитанного",
|
"Nothing unread here": "Здесь нет непрочитанного",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " и ещё {count}",
|
||||||
|
"10 people or more": "10 человек или больше",
|
||||||
|
"20 people or more": "20 человек или больше",
|
||||||
|
"5 people or more": "5 человек или больше",
|
||||||
|
"50 people or more": "50 человек или больше",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Плашка на каждом письме, отправитель которого не принадлежит одному из ваших доменов.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Отдельный календарь, построенный по дням рождения, которые уже есть в карточках контактов. Никуда ничего не записывается: даты остаются в карточках, а событие исчезает вместе с контактом или после удаления даты рождения. Его можно скрыть на боковой панели календаря, не отключая здесь.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Календарь, опубликованный по адресу: расписание, график дежурств, список праздников. Он доступен только для чтения, обновляется при открытии календаря и нигде не сохраняется: события загружаются и хранятся только пока открыта эта вкладка.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Ссылка, в тексте которой указан один домен, а ведёт она на другой, отмечается всегда, даже если домен назначения доверенный: быть доверенным и быть тем местом, которое обещал текст, — разные вещи.",
|
||||||
|
"Actions": "Действия",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Добавлено из письма и удаляется здесь: раньше отменить это можно было, только найдя другое письмо того же отправителя.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Добавляется здесь или в диалоге при открытии ссылки. Домен включает и свои поддомены.",
|
||||||
|
"Agenda view": "Список дел",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Все три изначально выключены. Клиент, который начинает с того, что прерывает вас, приучает закрывать предупреждения не читая, а закрытое не глядя предупреждение отнимает столько же внимания и не даёт ничего.",
|
||||||
|
"All {n} in {folder} are selected.": "Выбраны все {n} в папке {folder}.",
|
||||||
|
"All {n} on this page are selected.": "Выбраны все {n} на этой странице.",
|
||||||
|
"Also count these domains as inside": "Считать внутренними также эти домены",
|
||||||
|
"Always": "Всегда",
|
||||||
|
"Always showing images from": "Всегда показывать изображения от",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Изображение, загруженное с сервера отправителя, сообщает ему, что письмо открыли, когда и примерно откуда. Разрешённые изображения загружает сервер ihasmail, а не браузер, поэтому отправитель не узнаёт ничего из этого.",
|
||||||
|
"Applies to": "Применяется к",
|
||||||
|
"Archive and next": "Архивировать и далее",
|
||||||
|
"Archive by month": "Архивировать по месяцам",
|
||||||
|
"Archive by year": "Архивировать по годам",
|
||||||
|
"Archive failed: {error}": "Не удалось архивировать: {error}",
|
||||||
|
"Archive to {folder}": "Архивировать в {folder}",
|
||||||
|
"Ask before opening a link in a message": "Спрашивать перед открытием ссылки в письме",
|
||||||
|
"Ask before sending outside": "Спрашивать перед отправкой наружу",
|
||||||
|
"Ask before sending to a large group": "Спрашивать перед отправкой большой группе",
|
||||||
|
"Back to the event": "Назад к событию",
|
||||||
|
"Before it happens": "Прежде чем это произойдёт",
|
||||||
|
"Birthdays": "Дни рождения",
|
||||||
|
"By sender": "По отправителю",
|
||||||
|
"By subject": "По теме",
|
||||||
|
"Choose…": "Выбрать…",
|
||||||
|
"Classic": "Классическая",
|
||||||
|
"Click to move the event": "Нажмите, чтобы переместить событие",
|
||||||
|
"Close without saving?": "Закрыть без сохранения?",
|
||||||
|
"Compose as new": "Написать как новое письмо",
|
||||||
|
"Compose new message": "Написать новое письмо",
|
||||||
|
"Conversation": "Цепочка",
|
||||||
|
"Conversation moved to {folder}": "Цепочка перемещена в {folder}",
|
||||||
|
"Could not be read": "Не удалось прочитать",
|
||||||
|
"Could not import this file: {error}": "Не удалось импортировать этот файл: {error}",
|
||||||
|
"Could not load this file.": "Не удалось загрузить этот файл.",
|
||||||
|
"Could not read this calendar: {reason}": "Не удалось прочитать этот календарь: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "Не удалось прочитать winmail.dat. Оригинал по-прежнему приложен ниже.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Считает людей, а не заголовки: один адрес в «Кому» и девять в «Копия» — это письмо десятерым. Ловит ответ всем в длинной цепочке.",
|
||||||
|
"Date received": "Дата получения",
|
||||||
|
"Date sent": "Дата отправки",
|
||||||
|
"Day view": "День",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine и Tokyo Night созданы своими проектами и используются по лицензии MIT; оттенки между опубликованными цветами выведены из них, и каждый проверен на контраст. Акцентный цвет ниже по-прежнему применяется поверх любой из тем.",
|
||||||
|
"Earlier": "Раньше",
|
||||||
|
"Every folder": "Все папки",
|
||||||
|
"Everyone addressed will receive this.": "Это получат все указанные адресаты.",
|
||||||
|
"File contents": "Содержимое файла",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Подставляется при вставке шаблона, так что результат можно отредактировать перед отправкой. То, что пока определить нельзя, — например, имя получателя в письме, у которого ещё нет адресата, — остаётся в тексте как написано, а не превращается в пустоту.",
|
||||||
|
"Forward as attachment": "Переслать вложением",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "По дням рождения из ваших контактов. Ничего не сохраняется.",
|
||||||
|
"Go to Calendar": "Перейти к календарю",
|
||||||
|
"Go to Contacts": "Перейти к контактам",
|
||||||
|
"Go to Drafts": "Перейти к черновикам",
|
||||||
|
"Go to Files": "Перейти к файлам",
|
||||||
|
"Go to Inbox": "Перейти во «Входящие»",
|
||||||
|
"Go to Sent": "Перейти в «Отправленные»",
|
||||||
|
"Go to Settings": "Перейти к настройкам",
|
||||||
|
"Go to Starred": "Перейти к отмеченным",
|
||||||
|
"Import iCAL file…": "Импортировать файл iCAL…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Ярлыки — это ключевые слова IMAP, которые хранятся на письмах, поэтому их видит любой другой клиент. Названия, цвета и вложенность принадлежат самому ihasmail и следуют за вашей учётной записью. Вложенность влияет только на отображение и ничего не переписывает в почтовом ящике.",
|
||||||
|
"Largest first": "Сначала большие",
|
||||||
|
"Later": "Позже",
|
||||||
|
"Light or dark": "Светлая или тёмная",
|
||||||
|
"Mark messages from outside": "Отмечать письма извне",
|
||||||
|
"Marked as spam": "Помечено как спам",
|
||||||
|
"Message order": "Порядок писем",
|
||||||
|
"Month view": "Месяц",
|
||||||
|
"More ways to send this": "Другие способы отправки",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Называет внешних получателей и спрашивает, а не отказывает.",
|
||||||
|
"Navigation": "Навигация",
|
||||||
|
"Nested under": "Вложено в",
|
||||||
|
"Never": "Никогда",
|
||||||
|
"Never ask": "Никогда не спрашивать",
|
||||||
|
"Newest first": "Сначала новые",
|
||||||
|
"Next conversation": "Следующая цепочка",
|
||||||
|
"Next period": "Следующий период",
|
||||||
|
"No availability information for {who}": "Нет сведений о занятости для {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Внутри нет файлов — только форматированная копия письма.",
|
||||||
|
"No verdict recorded": "Решение не записано",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Ни у кого здесь нет сведений о занятости на этом сервере, поэтому ни одна из строк не может сказать, свободен ли кто-либо.",
|
||||||
|
"Nothing (top level)": "Ничего (верхний уровень)",
|
||||||
|
"Now, on your clock": "Сейчас, по вашим часам",
|
||||||
|
"Oldest first": "Сначала старые",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Показано только начало — скачайте файл, чтобы увидеть остальное.",
|
||||||
|
"Only when it has unread mail": "Только при непрочитанных письмах",
|
||||||
|
"Open a link to {domain}?": "Открыть ссылку на {domain}?",
|
||||||
|
"Open it": "Открыть",
|
||||||
|
"Open links to these domains without asking": "Открывать ссылки на эти домены без вопросов",
|
||||||
|
"Open, and stop asking about {domain}": "Открыть и больше не спрашивать про {domain}",
|
||||||
|
"Opening…": "Открытие…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Сортирует сервер по всей папке, а не только по уже загруженным письмам. При равенстве всегда используется порядок «сначала новые», поэтому между двумя открытиями одной папки порядок не меняется.",
|
||||||
|
"Placeholders": "Подстановки",
|
||||||
|
"Previous conversation": "Предыдущая цепочка",
|
||||||
|
"Previous period": "Предыдущий период",
|
||||||
|
"Privacy & safety": "Конфиденциальность и безопасность",
|
||||||
|
"Read receipts": "Уведомления о прочтении",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Чтение, отправка и то, как показываются даты и время. То, что доходит до отправителя, — в разделе «Конфиденциальность и безопасность».",
|
||||||
|
"Remote content": "Внешнее содержимое",
|
||||||
|
"Remove subscription": "Удалить подписку",
|
||||||
|
"Remove {domain}": "Удалить {domain}",
|
||||||
|
"Rendered": "С оформлением",
|
||||||
|
"Save changes": "Сохранить изменения",
|
||||||
|
"Save filters": "Сохранить фильтры",
|
||||||
|
"Save your changes?": "Сохранить изменения?",
|
||||||
|
"Saved": "Сохранено",
|
||||||
|
"Select all {n} in {folder}": "Выбрать все {n} в папке {folder}",
|
||||||
|
"Send message": "Отправить письмо",
|
||||||
|
"Send outside your organisation?": "Отправить за пределы организации?",
|
||||||
|
"Send to {count} people?": "Отправить {count} получателям?",
|
||||||
|
"Show birthdays from your contacts": "Показывать дни рождения из контактов",
|
||||||
|
"Show in the sidebar": "Показывать на боковой панели",
|
||||||
|
"Show keyboard shortcuts": "Показать сочетания клавиш",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Кто-то другой сохранил этот файл, пока он был открыт. Скопируйте свои изменения, закройте файл и начните заново.",
|
||||||
|
"Sort by, in order": "Сортировать по, в этом порядке",
|
||||||
|
"Source": "Исходный текст",
|
||||||
|
"Spam filter": "Спам-фильтр",
|
||||||
|
"Starred": "Отмеченные",
|
||||||
|
"Starred first": "Сначала отмеченные",
|
||||||
|
"Stay here": "Остаться здесь",
|
||||||
|
"Stop trusting {address}": "Больше не доверять {address}",
|
||||||
|
"Subscribe to a calendar": "Подписаться на календарь",
|
||||||
|
"Subscribed calendar": "Календарь по подписке",
|
||||||
|
"Subscribed calendars": "Календари по подписке",
|
||||||
|
"Subscribed to {url}": "Оформлена подписка на {url}",
|
||||||
|
"That file is no longer there.": "Этого файла больше нет.",
|
||||||
|
"That identity's address": "Адрес этого профиля отправителя",
|
||||||
|
"The Inbox only": "Только «Входящие»",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "Письмо удерживается в этом браузере и ещё не отправлено, поэтому вернуть его ничего не стоит.",
|
||||||
|
"The name on the identity you are sending as": "Имя профиля отправителя, от которого вы пишете",
|
||||||
|
"The subject already on the message": "Тема, которая уже указана в письме",
|
||||||
|
"Their address": "Их адрес",
|
||||||
|
"Their first name alone": "Только их имя",
|
||||||
|
"Then nothing": "Затем ничего",
|
||||||
|
"There is no preview for this kind of file.": "Для файлов такого типа предпросмотра нет.",
|
||||||
|
"There is nothing in it to export": "В нём нечего экспортировать",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Это не текст в UTF-8, поэтому правка здесь его испортит — лучше скачайте файл.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Файл слишком велик, чтобы показать его здесь ({size}) — скачайте его, чтобы прочитать.",
|
||||||
|
"This goes to {recipients}{rest}.": "Это уйдёт {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Эта ссылка ведёт не туда, куда обещает",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Это письмо упаковывает вложения в winmail.dat, который большинство клиентов открыть не могут.",
|
||||||
|
"Throw away your changes?": "Отбросить изменения?",
|
||||||
|
"Today, in your date format": "Сегодня, в вашем формате даты",
|
||||||
|
"Unread first": "Сначала непрочитанные",
|
||||||
|
"Unsaved changes": "Несохранённые изменения",
|
||||||
|
"View as": "Показывать как",
|
||||||
|
"Warnings": "Предупреждения",
|
||||||
|
"Week view": "Неделя",
|
||||||
|
"What is it called?": "Как это назвать?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Что доходит до отправителя и что спрашивает, прежде чем это произойдёт.",
|
||||||
|
"What you changed here will be lost.": "Изменения, сделанные здесь, будут потеряны.",
|
||||||
|
"Who the message is addressed to": "Кому адресовано письмо",
|
||||||
|
"Working out what is selected…": "Определяем, что выбрано…",
|
||||||
|
"You": "Вы",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "В вашем скрипте Sieve есть несохранённые изменения.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "В ваших правилах фильтрации есть несохранённые изменения.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Домены ваших собственных профилей отправителя всегда считаются внутренними, их указывать не нужно. Домен, указанный здесь, включает и свои поддомены.",
|
||||||
|
"Your own:": "Ваши:",
|
||||||
|
"dark mode": "тёмную тему",
|
||||||
|
"file": "файл",
|
||||||
|
"light mode": "светлую тему",
|
||||||
|
"scored {score} against a threshold of {threshold}": "оценка {score} при пороге {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "оценка {score}, порог не указан",
|
||||||
|
"this view": "этот раздел",
|
||||||
|
"{count} conversations moved to {folder}": "Цепочек перемещено в {folder}: {count}",
|
||||||
|
"{count} folders": "Папок: {count}",
|
||||||
|
"{name}’s birthday": "День рождения: {name}",
|
||||||
|
"{name}’s birthday ({age})": "День рождения: {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Уведомление о прочтении для этого письма уже отправлено.",
|
||||||
|
"Add star": "Отметить",
|
||||||
|
"Could not attach": "Не удалось вложить",
|
||||||
|
"Delete forever?": "Удалить навсегда?",
|
||||||
|
"Delete?": "Удалить?",
|
||||||
|
"No recipients": "Нет получателей",
|
||||||
|
"No sending identity available": "Нет доступного профиля отправителя",
|
||||||
|
"Pick a date and time.": "Выберите дату и время.",
|
||||||
|
"Pick a time at least a minute from now.": "Выберите время не меньше чем через минуту.",
|
||||||
|
"Remove star": "Снять отметку",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Запрошено, на {address}. Никогда не отправляется автоматически.",
|
||||||
|
"The sender did not request a read receipt.": "Отправитель не запрашивал уведомление о прочтении.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Это массовая или списочная рассылка; уведомление о прочтении лишь подтвердит, что адрес действующий.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Это письмо не было получено, поэтому сообщать не о чем.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Это письмо отправлено автоматически, поэтому уведомление о прочтении не предлагается.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Этот сервер не удерживает письмо дольше чем {span}.",
|
||||||
|
"Upload failed": "Не удалось загрузить",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "Переместить {n} письмо в корзину?", few: "Переместить {n} письма в корзину?", many: "Переместить {n} писем в корзину?", other: "Переместить {n} письма в корзину?" },
|
||||||
|
"{n} days": { one: "{n} день", few: "{n} дня", many: "{n} дней", other: "{n} дня" },
|
||||||
|
"{n} hours": { one: "{n} час", few: "{n} часа", many: "{n} часов", other: "{n} часа" },
|
||||||
"Updated {n} contacts, nothing new": { one: "Обновлён {n} контакт, новых нет", few: "Обновлено {n} контакта, новых нет", many: "Обновлено {n} контактов, новых нет", other: "Обновлено {n} контакта, новых нет" },
|
"Updated {n} contacts, nothing new": { one: "Обновлён {n} контакт, новых нет", few: "Обновлено {n} контакта, новых нет", many: "Обновлено {n} контактов, новых нет", other: "Обновлено {n} контакта, новых нет" },
|
||||||
"{n} updated": { one: "{n} обновлён", few: "{n} обновлено", many: "{n} обновлено", other: "{n} обновлено" },
|
"{n} updated": { one: "{n} обновлён", few: "{n} обновлено", many: "{n} обновлено", other: "{n} обновлено" },
|
||||||
"Updated {n} contacts you already had": { one: "Обновлён контакт, который уже был", few: "Обновлено {n} контакта, которые уже были", many: "Обновлено {n} контактов, которые уже были", other: "Обновлено {n} контакта, которые уже были" },
|
"Updated {n} contacts you already had": { one: "Обновлён контакт, который уже был", few: "Обновлено {n} контакта, которые уже были", many: "Обновлено {n} контактов, которые уже были", other: "Обновлено {n} контакта, которые уже были" },
|
||||||
|
|||||||
@@ -1047,8 +1047,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "Чернетку збережено",
|
"Draft saved": "Чернетку збережено",
|
||||||
"Emptying folder…": "Тека очищується…",
|
"Emptying folder…": "Тека очищується…",
|
||||||
"Nothing unread here": "Тут немає непрочитаного",
|
"Nothing unread here": "Тут немає непрочитаного",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " і ще {count}",
|
||||||
|
"10 people or more": "10 осіб або більше",
|
||||||
|
"20 people or more": "20 осіб або більше",
|
||||||
|
"5 people or more": "5 осіб або більше",
|
||||||
|
"50 people or more": "50 осіб або більше",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "Позначка на кожному листі, відправник якого не належить до жодного з ваших доменів.",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "Окремий календар, побудований за днями народження, які вже є в картках контактів. Нікуди нічого не записується: дати лишаються в картках, а подія зникає разом із контактом або після видалення дати народження. Його можна сховати на бічній панелі календаря, не вимикаючи тут.",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "Календар, опублікований за адресою: розклад, графік чергувань, список свят. Він доступний лише для читання, оновлюється при відкритті календаря і ніде не зберігається: події завантажуються і тримаються лише поки відкрита ця вкладка.",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "Посилання, у тексті якого вказано один домен, а веде воно на інший, позначається завжди, навіть якщо домен призначення довірений: бути довіреним і бути тим місцем, яке обіцяв текст, — різні речі.",
|
||||||
|
"Actions": "Дії",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "Додано з листа і видаляється тут: раніше скасувати це можна було, лише знайшовши інший лист того самого відправника.",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "Додається тут або у вікні під час відкриття посилання. Домен охоплює і свої піддомени.",
|
||||||
|
"Agenda view": "Список подій",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "Усі три спершу вимкнені. Клієнт, який починає з того, що перериває вас, привчає закривати попередження не читаючи, а закрите не глядячи попередження забирає стільки ж уваги й не дає нічого.",
|
||||||
|
"All {n} in {folder} are selected.": "Вибрано всі {n} у теці {folder}.",
|
||||||
|
"All {n} on this page are selected.": "Вибрано всі {n} на цій сторінці.",
|
||||||
|
"Also count these domains as inside": "Вважати внутрішніми також ці домени",
|
||||||
|
"Always": "Завжди",
|
||||||
|
"Always showing images from": "Завжди показувати зображення від",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "Зображення, завантажене із сервера відправника, повідомляє йому, що лист відкрили, коли і приблизно звідки. Дозволені зображення завантажує сервер ihasmail, а не браузер, тому відправник не дізнається нічого з цього.",
|
||||||
|
"Applies to": "Застосовується до",
|
||||||
|
"Archive and next": "Архівувати й далі",
|
||||||
|
"Archive by month": "Архівувати за місяцями",
|
||||||
|
"Archive by year": "Архівувати за роками",
|
||||||
|
"Archive failed: {error}": "Не вдалося архівувати: {error}",
|
||||||
|
"Archive to {folder}": "Архівувати до {folder}",
|
||||||
|
"Ask before opening a link in a message": "Питати перед відкриттям посилання в листі",
|
||||||
|
"Ask before sending outside": "Питати перед надсиланням назовні",
|
||||||
|
"Ask before sending to a large group": "Питати перед надсиланням великій групі",
|
||||||
|
"Back to the event": "Назад до події",
|
||||||
|
"Before it happens": "Перш ніж це станеться",
|
||||||
|
"Birthdays": "Дні народження",
|
||||||
|
"By sender": "За відправником",
|
||||||
|
"By subject": "За темою",
|
||||||
|
"Choose…": "Вибрати…",
|
||||||
|
"Classic": "Класична",
|
||||||
|
"Click to move the event": "Натисніть, щоб перемістити подію",
|
||||||
|
"Close without saving?": "Закрити без збереження?",
|
||||||
|
"Compose as new": "Написати як новий лист",
|
||||||
|
"Compose new message": "Написати новий лист",
|
||||||
|
"Conversation": "Листування",
|
||||||
|
"Conversation moved to {folder}": "Листування переміщено до {folder}",
|
||||||
|
"Could not be read": "Не вдалося прочитати",
|
||||||
|
"Could not import this file: {error}": "Не вдалося імпортувати цей файл: {error}",
|
||||||
|
"Could not load this file.": "Не вдалося завантажити цей файл.",
|
||||||
|
"Could not read this calendar: {reason}": "Не вдалося прочитати цей календар: {reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "Не вдалося прочитати winmail.dat. Оригінал і далі вкладено нижче.",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "Рахує людей, а не заголовки: одна адреса в «Кому» і дев’ять у «Копія» — це лист десятьом. Ловить відповідь усім у довгому листуванні.",
|
||||||
|
"Date received": "Дата отримання",
|
||||||
|
"Date sent": "Дата надсилання",
|
||||||
|
"Day view": "День",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula, Gruvbox, Rosé Pine і Tokyo Night створені власними проєктами й використовуються за ліцензією MIT; відтінки між опублікованими кольорами виведені з них, і кожен перевірено на контраст. Акцентний колір нижче й далі застосовується поверх будь-якої з тем.",
|
||||||
|
"Earlier": "Раніше",
|
||||||
|
"Every folder": "Усі теки",
|
||||||
|
"Everyone addressed will receive this.": "Це отримають усі зазначені адресати.",
|
||||||
|
"File contents": "Вміст файлу",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "Підставляється під час вставляння шаблону, тож результат можна відредагувати перед надсиланням. Те, що поки визначити не можна, — наприклад, ім’я одержувача в листі, який ще не має адресата, — лишається в тексті як написано, а не перетворюється на порожнечу.",
|
||||||
|
"Forward as attachment": "Переслати вкладенням",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "За днями народження з ваших контактів. Нічого не зберігається.",
|
||||||
|
"Go to Calendar": "Перейти до календаря",
|
||||||
|
"Go to Contacts": "Перейти до контактів",
|
||||||
|
"Go to Drafts": "Перейти до чернеток",
|
||||||
|
"Go to Files": "Перейти до файлів",
|
||||||
|
"Go to Inbox": "Перейти до «Вхідних»",
|
||||||
|
"Go to Sent": "Перейти до «Надісланих»",
|
||||||
|
"Go to Settings": "Перейти до налаштувань",
|
||||||
|
"Go to Starred": "Перейти до позначених",
|
||||||
|
"Import iCAL file…": "Імпортувати файл iCAL…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "Мітки — це ключові слова IMAP, які зберігаються на листах, тому їх бачить будь-який інший клієнт. Назви, кольори та вкладеність належать самому ihasmail і йдуть за вашим обліковим записом. Вкладеність впливає лише на відображення й нічого не переписує в поштовій скриньці.",
|
||||||
|
"Largest first": "Спочатку великі",
|
||||||
|
"Later": "Пізніше",
|
||||||
|
"Light or dark": "Світла або темна",
|
||||||
|
"Mark messages from outside": "Позначати листи ззовні",
|
||||||
|
"Marked as spam": "Позначено як спам",
|
||||||
|
"Message order": "Порядок листів",
|
||||||
|
"Month view": "Місяць",
|
||||||
|
"More ways to send this": "Інші способи надіслати це",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "Називає зовнішніх одержувачів і питає, а не відмовляє.",
|
||||||
|
"Navigation": "Навігація",
|
||||||
|
"Nested under": "Вкладено до",
|
||||||
|
"Never": "Ніколи",
|
||||||
|
"Never ask": "Ніколи не питати",
|
||||||
|
"Newest first": "Спочатку нові",
|
||||||
|
"Next conversation": "Наступне листування",
|
||||||
|
"Next period": "Наступний період",
|
||||||
|
"No availability information for {who}": "Немає відомостей про зайнятість для {who}",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "Усередині немає файлів — лише форматована копія листа.",
|
||||||
|
"No verdict recorded": "Рішення не записано",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "Ні в кого тут немає відомостей про зайнятість на цьому сервері, тож жоден із рядків не може сказати, чи хтось вільний.",
|
||||||
|
"Nothing (top level)": "Нічого (верхній рівень)",
|
||||||
|
"Now, on your clock": "Зараз, за вашим годинником",
|
||||||
|
"Oldest first": "Спочатку старі",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "Показано лише початок — завантажте файл, щоб побачити решту.",
|
||||||
|
"Only when it has unread mail": "Лише за наявності непрочитаних листів",
|
||||||
|
"Open a link to {domain}?": "Відкрити посилання на {domain}?",
|
||||||
|
"Open it": "Відкрити",
|
||||||
|
"Open links to these domains without asking": "Відкривати посилання на ці домени без питань",
|
||||||
|
"Open, and stop asking about {domain}": "Відкрити й більше не питати про {domain}",
|
||||||
|
"Opening…": "Відкривання…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "Сортує сервер за всією текою, а не лише за вже завантаженими листами. За однакових значень завжди діє порядок «спочатку нові», тож між двома відкриттями тієї самої теки порядок не змінюється.",
|
||||||
|
"Placeholders": "Підстановки",
|
||||||
|
"Previous conversation": "Попереднє листування",
|
||||||
|
"Previous period": "Попередній період",
|
||||||
|
"Privacy & safety": "Приватність і безпека",
|
||||||
|
"Read receipts": "Сповіщення про прочитання",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "Читання, надсилання й те, як показуються дати та час. Те, що доходить до відправника, — у розділі «Приватність і безпека».",
|
||||||
|
"Remote content": "Зовнішній вміст",
|
||||||
|
"Remove subscription": "Видалити підписку",
|
||||||
|
"Remove {domain}": "Видалити {domain}",
|
||||||
|
"Rendered": "З оформленням",
|
||||||
|
"Save changes": "Зберегти зміни",
|
||||||
|
"Save filters": "Зберегти фільтри",
|
||||||
|
"Save your changes?": "Зберегти зміни?",
|
||||||
|
"Saved": "Збережено",
|
||||||
|
"Select all {n} in {folder}": "Вибрати всі {n} у теці {folder}",
|
||||||
|
"Send message": "Надіслати лист",
|
||||||
|
"Send outside your organisation?": "Надіслати за межі організації?",
|
||||||
|
"Send to {count} people?": "Надіслати {count} одержувачам?",
|
||||||
|
"Show birthdays from your contacts": "Показувати дні народження з контактів",
|
||||||
|
"Show in the sidebar": "Показувати на бічній панелі",
|
||||||
|
"Show keyboard shortcuts": "Показати клавіатурні скорочення",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "Хтось інший зберіг цей файл, поки він був відкритий. Скопіюйте свої зміни, закрийте файл і почніть спочатку.",
|
||||||
|
"Sort by, in order": "Сортувати за, у цьому порядку",
|
||||||
|
"Source": "Вихідний текст",
|
||||||
|
"Spam filter": "Спам-фільтр",
|
||||||
|
"Starred": "Позначені",
|
||||||
|
"Starred first": "Спочатку позначені",
|
||||||
|
"Stay here": "Лишитися тут",
|
||||||
|
"Stop trusting {address}": "Більше не довіряти {address}",
|
||||||
|
"Subscribe to a calendar": "Підписатися на календар",
|
||||||
|
"Subscribed calendar": "Календар за підпискою",
|
||||||
|
"Subscribed calendars": "Календарі за підпискою",
|
||||||
|
"Subscribed to {url}": "Оформлено підписку на {url}",
|
||||||
|
"That file is no longer there.": "Цього файлу більше немає.",
|
||||||
|
"That identity's address": "Адреса цього профілю відправника",
|
||||||
|
"The Inbox only": "Лише «Вхідні»",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "Лист утримується в цьому браузері й ще не надісланий, тож повернути його нічого не коштує.",
|
||||||
|
"The name on the identity you are sending as": "Ім’я профілю відправника, від якого ви пишете",
|
||||||
|
"The subject already on the message": "Тема, яка вже вказана в листі",
|
||||||
|
"Their address": "Їхня адреса",
|
||||||
|
"Their first name alone": "Лише їхнє ім’я",
|
||||||
|
"Then nothing": "Потім нічого",
|
||||||
|
"There is no preview for this kind of file.": "Для файлів такого типу перегляду немає.",
|
||||||
|
"There is nothing in it to export": "У ньому немає чого експортувати",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "Це не текст у UTF-8, тож редагування тут його зіпсує — краще завантажте файл.",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "Файл завеликий, щоб показати його тут ({size}) — завантажте, щоб прочитати.",
|
||||||
|
"This goes to {recipients}{rest}.": "Це піде до {recipients}{rest}.",
|
||||||
|
"This link does not go where it says": "Це посилання веде не туди, куди обіцяє",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "Цей лист запаковує вкладення у winmail.dat, який більшість клієнтів не можуть відкрити.",
|
||||||
|
"Throw away your changes?": "Відкинути зміни?",
|
||||||
|
"Today, in your date format": "Сьогодні, у вашому форматі дати",
|
||||||
|
"Unread first": "Спочатку непрочитані",
|
||||||
|
"Unsaved changes": "Незбережені зміни",
|
||||||
|
"View as": "Показувати як",
|
||||||
|
"Warnings": "Попередження",
|
||||||
|
"Week view": "Тиждень",
|
||||||
|
"What is it called?": "Як це назвати?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "Що доходить до відправника і що питає, перш ніж це станеться.",
|
||||||
|
"What you changed here will be lost.": "Зміни, зроблені тут, буде втрачено.",
|
||||||
|
"Who the message is addressed to": "Кому адресовано лист",
|
||||||
|
"Working out what is selected…": "Визначаємо, що вибрано…",
|
||||||
|
"You": "Ви",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "У вашому скрипті Sieve є незбережені зміни.",
|
||||||
|
"Your filter rules have changes that have not been saved.": "У ваших правилах фільтрації є незбережені зміни.",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "Домени ваших власних профілів відправника завжди вважаються внутрішніми, їх зазначати не потрібно. Домен, указаний тут, охоплює і свої піддомени.",
|
||||||
|
"Your own:": "Ваші:",
|
||||||
|
"dark mode": "темну тему",
|
||||||
|
"file": "файл",
|
||||||
|
"light mode": "світлу тему",
|
||||||
|
"scored {score} against a threshold of {threshold}": "оцінка {score} за порога {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "оцінка {score}, поріг не вказано",
|
||||||
|
"this view": "цей розділ",
|
||||||
|
"{count} conversations moved to {folder}": "Листувань переміщено до {folder}: {count}",
|
||||||
|
"{count} folders": "Тек: {count}",
|
||||||
|
"{name}’s birthday": "День народження: {name}",
|
||||||
|
"{name}’s birthday ({age})": "День народження: {name} ({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "Сповіщення про прочитання для цього листа вже надіслано.",
|
||||||
|
"Add star": "Позначити",
|
||||||
|
"Could not attach": "Не вдалося вкласти",
|
||||||
|
"Delete forever?": "Видалити назавжди?",
|
||||||
|
"Delete?": "Видалити?",
|
||||||
|
"No recipients": "Немає одержувачів",
|
||||||
|
"No sending identity available": "Немає доступного профілю відправника",
|
||||||
|
"Pick a date and time.": "Виберіть дату й час.",
|
||||||
|
"Pick a time at least a minute from now.": "Виберіть час не менш ніж через хвилину.",
|
||||||
|
"Remove star": "Зняти позначку",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "Запитано, на {address}. Ніколи не надсилається автоматично.",
|
||||||
|
"The sender did not request a read receipt.": "Відправник не запитував сповіщення про прочитання.",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "Це масова або списочна розсилка; сповіщення про прочитання лише підтвердить, що адреса діюча.",
|
||||||
|
"This message has not been received, so there is nothing to report.": "Цей лист не було отримано, тож немає про що повідомляти.",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "Цей лист надіслано автоматично, тому сповіщення про прочитання не пропонується.",
|
||||||
|
"This server will not hold a message longer than {span}.": "Цей сервер не утримує лист довше ніж {span}.",
|
||||||
|
"Upload failed": "Не вдалося завантажити",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { one: "Перемістити {n} лист до кошика?", few: "Перемістити {n} листи до кошика?", many: "Перемістити {n} листів до кошика?", other: "Перемістити {n} листа до кошика?" },
|
||||||
|
"{n} days": { one: "{n} день", few: "{n} дні", many: "{n} днів", other: "{n} дня" },
|
||||||
|
"{n} hours": { one: "{n} година", few: "{n} години", many: "{n} годин", other: "{n} години" },
|
||||||
"Updated {n} contacts, nothing new": { one: "Оновлено {n} контакт, нових немає", few: "Оновлено {n} контакти, нових немає", many: "Оновлено {n} контактів, нових немає", other: "Оновлено {n} контакти, нових немає" },
|
"Updated {n} contacts, nothing new": { one: "Оновлено {n} контакт, нових немає", few: "Оновлено {n} контакти, нових немає", many: "Оновлено {n} контактів, нових немає", other: "Оновлено {n} контакти, нових немає" },
|
||||||
"{n} updated": { one: "{n} оновлено", few: "{n} оновлено", many: "{n} оновлено", other: "{n} оновлено" },
|
"{n} updated": { one: "{n} оновлено", few: "{n} оновлено", many: "{n} оновлено", other: "{n} оновлено" },
|
||||||
"Updated {n} contacts you already had": { one: "Оновлено контакт, який уже був", few: "Оновлено {n} контакти, які вже були", many: "Оновлено {n} контактів, які вже були", other: "Оновлено {n} контакти, які вже були" },
|
"Updated {n} contacts you already had": { one: "Оновлено контакт, який уже був", few: "Оновлено {n} контакти, які вже були", many: "Оновлено {n} контактів, які вже були", other: "Оновлено {n} контакти, які вже були" },
|
||||||
|
|||||||
@@ -1058,8 +1058,216 @@ export const catalog: Catalog = {
|
|||||||
"Draft saved": "草稿已保存",
|
"Draft saved": "草稿已保存",
|
||||||
"Emptying folder…": "正在清空文件夹…",
|
"Emptying folder…": "正在清空文件夹…",
|
||||||
"Nothing unread here": "这里没有未读邮件",
|
"Nothing unread here": "这里没有未读邮件",
|
||||||
|
// ── Added after the first translation pass ──────────────────────────
|
||||||
|
// Features that shipped after the catalogues were written, so these
|
||||||
|
// strings had no entry here and fell back to English. Reported by a
|
||||||
|
// native speaker reviewing the German catalogue (#247); every language
|
||||||
|
// had the same gap. The keyboard bindings among them register their
|
||||||
|
// group and description in English at the call site and are translated
|
||||||
|
// at render.
|
||||||
|
" and {count} more": " 等另外 {count} 项",
|
||||||
|
"10 people or more": "10 人或更多",
|
||||||
|
"20 people or more": "20 人或更多",
|
||||||
|
"5 people or more": "5 人或更多",
|
||||||
|
"50 people or more": "50 人或更多",
|
||||||
|
"A banner on any message whose sender is not on one of your own domains.": "对发件人不属于您自有域名的邮件显示提示条。",
|
||||||
|
"A calendar of its own, derived from the birthdays already on your contact cards. Nothing is written anywhere — the dates stay on the cards, and an event disappears when the contact does or the birthday is cleared. It can be hidden from the calendar’s own sidebar without turning it off here.": "一个独立的日历,由联系人卡片上已有的生日生成。不会向任何地方写入数据:日期仍保存在卡片上,联系人被删除或生日被清空时,对应事件也随之消失。可以在日历的侧边栏中隐藏它,而不必在此关闭。",
|
||||||
|
"A calendar published at a URL — a timetable, a rota, a public holiday list. It is read-only, refreshed when you open the calendar, and never stored: the events are fetched and kept only for as long as this tab is open.": "以网址发布的日历:课程表、值班表、公共假日列表等。它是只读的,在您打开日历时刷新,且从不保存:事件只是被取回,并仅在此标签页打开期间保留。",
|
||||||
|
"A link whose text names one domain and whose destination is another is always flagged, even where the destination is trusted — being trusted is not the same as being the place the text claimed.": "如果链接文字写的是一个域名而实际目标是另一个,总会被标记出来,即使目标域名是受信任的:受信任与「就是文字所声称的那个地方」并不是一回事。",
|
||||||
|
"Actions": "操作",
|
||||||
|
"Added from a message, and removable here — previously the only way to undo one was to find another message from the same sender.": "从邮件中添加,可在此移除:以前要撤销只能再找一封同一发件人的邮件。",
|
||||||
|
"Added here, or from the dialog when a link is opened. A domain also covers its subdomains.": "在此添加,或在打开链接时的对话框中添加。域名同时涵盖其子域名。",
|
||||||
|
"Agenda view": "日程视图",
|
||||||
|
"All three start switched off. A client that begins by interrupting is one people learn to click through, and a warning clicked through without reading costs the same attention and buys nothing.": "三项默认均为关闭。一上来就打断您的客户端,只会让人养成不看就点掉的习惯,而未读就点掉的警告同样消耗注意力,却毫无收获。",
|
||||||
|
"All {n} in {folder} are selected.": "已选中 {folder} 中的全部 {n} 项。",
|
||||||
|
"All {n} on this page are selected.": "已选中本页的全部 {n} 项。",
|
||||||
|
"Also count these domains as inside": "也将这些域名视为内部",
|
||||||
|
"Always": "始终",
|
||||||
|
"Always showing images from": "始终显示以下发件人的图片",
|
||||||
|
"An image loaded from a sender's server tells them the message was opened, when, and from roughly where. Approved images are fetched by ihasmail's own server rather than the browser, so the sender learns none of those.": "从发件人服务器加载的图片会告诉对方邮件已被打开、打开时间以及大致位置。已允许的图片由 ihasmail 自己的服务器抓取,而非浏览器,因此发件人无从得知这些信息。",
|
||||||
|
"Applies to": "适用于",
|
||||||
|
"Archive and next": "归档并转到下一封",
|
||||||
|
"Archive by month": "按月归档",
|
||||||
|
"Archive by year": "按年归档",
|
||||||
|
"Archive failed: {error}": "归档失败:{error}",
|
||||||
|
"Archive to {folder}": "归档到 {folder}",
|
||||||
|
"Ask before opening a link in a message": "打开邮件中的链接前询问",
|
||||||
|
"Ask before sending outside": "向外部发送前询问",
|
||||||
|
"Ask before sending to a large group": "向多人群发前询问",
|
||||||
|
"Back to the event": "返回事件",
|
||||||
|
"Before it happens": "在其发生之前",
|
||||||
|
"Birthdays": "生日",
|
||||||
|
"By sender": "按发件人",
|
||||||
|
"By subject": "按主题",
|
||||||
|
"Choose…": "选择…",
|
||||||
|
"Classic": "经典",
|
||||||
|
"Click to move the event": "点击以移动事件",
|
||||||
|
"Close without saving?": "不保存就关闭吗?",
|
||||||
|
"Compose as new": "作为新邮件撰写",
|
||||||
|
"Compose new message": "撰写新邮件",
|
||||||
|
"Conversation": "会话",
|
||||||
|
"Conversation moved to {folder}": "会话已移动到 {folder}",
|
||||||
|
"Could not be read": "无法读取",
|
||||||
|
"Could not import this file: {error}": "无法导入此文件:{error}",
|
||||||
|
"Could not load this file.": "无法加载此文件。",
|
||||||
|
"Could not read this calendar: {reason}": "无法读取此日历:{reason}",
|
||||||
|
"Could not read winmail.dat. The original is still attached below.": "无法读取 winmail.dat。原文件仍作为附件保留在下方。",
|
||||||
|
"Counts people rather than headers, so one address in To and nine in Cc is a message to ten. Catches a reply-all onto a long thread.": "统计的是人数而非邮件头,因此收件人一个、抄送九个就是发给十个人的邮件。可以拦住对长会话的全部回复。",
|
||||||
|
"Date received": "接收日期",
|
||||||
|
"Date sent": "发送日期",
|
||||||
|
"Day view": "日视图",
|
||||||
|
"Dracula, Gruvbox, Rosé Pine and Tokyo Night are the work of their own projects and are used under the MIT licence; the shades between their published colours are derived, and every one of them is checked for contrast. The accent colour below still applies over any of them.": "Dracula、Gruvbox、Rosé Pine 和 Tokyo Night 均由各自的项目创作,依 MIT 许可证使用;其公布配色之间的过渡色为衍生所得,且每一种都经过对比度检查。下方的强调色仍会应用于其中任意一种之上。",
|
||||||
|
"Earlier": "更早",
|
||||||
|
"Every folder": "所有文件夹",
|
||||||
|
"Everyone addressed will receive this.": "所有收件人都会收到此邮件。",
|
||||||
|
"File contents": "文件内容",
|
||||||
|
"Filled in when the template is inserted, so you can edit the result before sending. One that cannot be answered yet — a recipient's name on a message you have not addressed — is left in the body as written, rather than becoming a blank.": "在插入模板时填入,因此您可以在发送前修改结果。暂时无法确定的内容(例如尚未填写收件人的邮件中的收件人姓名)会按原样保留在正文中,而不会变成空白。",
|
||||||
|
"Forward as attachment": "作为附件转发",
|
||||||
|
"From the birthdays on your contacts. Nothing is stored.": "来自您联系人中的生日。不会保存任何数据。",
|
||||||
|
"Go to Calendar": "转到日历",
|
||||||
|
"Go to Contacts": "转到联系人",
|
||||||
|
"Go to Drafts": "转到草稿",
|
||||||
|
"Go to Files": "转到文件",
|
||||||
|
"Go to Inbox": "转到收件箱",
|
||||||
|
"Go to Sent": "转到已发送",
|
||||||
|
"Go to Settings": "转到设置",
|
||||||
|
"Go to Starred": "转到已标星",
|
||||||
|
"Import iCAL file…": "导入 iCAL 文件…",
|
||||||
|
"Labels are IMAP keywords stored on your messages, so every other client sees them. Names, colours and nesting are ihasmail’s own and follow your account. Nesting is display only — it rewrites nothing in the mailbox.": "标签是保存在邮件上的 IMAP 关键字,因此其他客户端也能看到。名称、颜色和层级是 ihasmail 自有的,随您的账户一同保存。层级仅影响显示,不会改写邮箱中的任何内容。",
|
||||||
|
"Largest first": "从大到小",
|
||||||
|
"Later": "更晚",
|
||||||
|
"Light or dark": "浅色或深色",
|
||||||
|
"Mark messages from outside": "标记来自外部的邮件",
|
||||||
|
"Marked as spam": "已标记为垃圾邮件",
|
||||||
|
"Message order": "邮件排序",
|
||||||
|
"Month view": "月视图",
|
||||||
|
"More ways to send this": "其他发送方式",
|
||||||
|
"Names the outside recipients and asks, rather than refusing.": "列出外部收件人并询问,而不是直接拒绝。",
|
||||||
|
"Navigation": "导航",
|
||||||
|
"Nested under": "归入",
|
||||||
|
"Never": "从不",
|
||||||
|
"Never ask": "从不询问",
|
||||||
|
"Newest first": "最新在前",
|
||||||
|
"Next conversation": "下一个会话",
|
||||||
|
"Next period": "下一时段",
|
||||||
|
"No availability information for {who}": "没有 {who} 的空闲信息",
|
||||||
|
"No files inside — it carries only the formatted copy of the message.": "其中没有文件,只包含邮件的带格式副本。",
|
||||||
|
"No verdict recorded": "未记录判定结果",
|
||||||
|
"Nobody here has free/busy on this server, so none of these rows can say whether anyone is free.": "此服务器上没有任何人公开空闲/忙碌信息,因此这些行都无法判断谁有空。",
|
||||||
|
"Nothing (top level)": "无(顶层)",
|
||||||
|
"Now, on your clock": "现在,按您的时钟",
|
||||||
|
"Oldest first": "最早在前",
|
||||||
|
"Only the beginning is shown — download the file for the rest.": "仅显示开头部分,其余内容请下载文件查看。",
|
||||||
|
"Only when it has unread mail": "仅在有未读邮件时",
|
||||||
|
"Open a link to {domain}?": "打开指向 {domain} 的链接吗?",
|
||||||
|
"Open it": "打开",
|
||||||
|
"Open links to these domains without asking": "打开指向这些域名的链接时不再询问",
|
||||||
|
"Open, and stop asking about {domain}": "打开,并且不再询问 {domain}",
|
||||||
|
"Opening…": "正在打开…",
|
||||||
|
"Ordered by the server over the whole folder, not just the messages loaded so far. Ties always fall back to newest first, so the order never shuffles between two looks at the same folder.": "由服务器对整个文件夹排序,而不仅是已加载的邮件。排序相同时一律按最新在前,因此两次查看同一文件夹时顺序不会变化。",
|
||||||
|
"Placeholders": "占位符",
|
||||||
|
"Previous conversation": "上一个会话",
|
||||||
|
"Previous period": "上一时段",
|
||||||
|
"Privacy & safety": "隐私与安全",
|
||||||
|
"Read receipts": "已读回执",
|
||||||
|
"Reading, sending, and how dates and times are shown. What reaches a sender lives in Privacy & safety.": "阅读、发送,以及日期和时间的显示方式。发件人能获知哪些信息,请见「隐私与安全」。",
|
||||||
|
"Remote content": "远程内容",
|
||||||
|
"Remove subscription": "移除订阅",
|
||||||
|
"Remove {domain}": "移除 {domain}",
|
||||||
|
"Rendered": "渲染后",
|
||||||
|
"Save changes": "保存更改",
|
||||||
|
"Save filters": "保存筛选规则",
|
||||||
|
"Save your changes?": "保存您的更改吗?",
|
||||||
|
"Saved": "已保存",
|
||||||
|
"Select all {n} in {folder}": "选中 {folder} 中的全部 {n} 项",
|
||||||
|
"Send message": "发送邮件",
|
||||||
|
"Send outside your organisation?": "发送到组织外部吗?",
|
||||||
|
"Send to {count} people?": "发送给 {count} 个人吗?",
|
||||||
|
"Show birthdays from your contacts": "显示联系人的生日",
|
||||||
|
"Show in the sidebar": "在侧边栏中显示",
|
||||||
|
"Show keyboard shortcuts": "显示键盘快捷键",
|
||||||
|
"Somebody else saved this file while it was open. Copy your changes, close it, and start again.": "在此文件打开期间,其他人保存了它。请复制您的更改,关闭后重新开始。",
|
||||||
|
"Sort by, in order": "排序依据,按此顺序",
|
||||||
|
"Source": "源代码",
|
||||||
|
"Spam filter": "垃圾邮件过滤",
|
||||||
|
"Starred": "已标星",
|
||||||
|
"Starred first": "已标星在前",
|
||||||
|
"Stay here": "留在此处",
|
||||||
|
"Stop trusting {address}": "不再信任 {address}",
|
||||||
|
"Subscribe to a calendar": "订阅日历",
|
||||||
|
"Subscribed calendar": "已订阅的日历",
|
||||||
|
"Subscribed calendars": "已订阅的日历",
|
||||||
|
"Subscribed to {url}": "已订阅 {url}",
|
||||||
|
"That file is no longer there.": "该文件已不存在。",
|
||||||
|
"That identity's address": "该发件身份的地址",
|
||||||
|
"The Inbox only": "仅收件箱",
|
||||||
|
"The message is held in this browser and has not been submitted yet, so taking it back costs nothing.": "邮件保存在此浏览器中,尚未提交,因此撤回不会有任何代价。",
|
||||||
|
"The name on the identity you are sending as": "您所用发件身份上的姓名",
|
||||||
|
"The subject already on the message": "邮件上已有的主题",
|
||||||
|
"Their address": "对方的地址",
|
||||||
|
"Their first name alone": "仅对方的名",
|
||||||
|
"Then nothing": "之后不做任何操作",
|
||||||
|
"There is no preview for this kind of file.": "此类文件没有预览。",
|
||||||
|
"There is nothing in it to export": "其中没有可导出的内容",
|
||||||
|
"This file is not UTF-8 text, so editing it here would corrupt it — download it instead.": "此文件不是 UTF-8 文本,在此编辑会损坏它,请改为下载。",
|
||||||
|
"This file is too big to show here ({size}) — download it to read it.": "此文件太大,无法在此显示({size}),请下载后阅读。",
|
||||||
|
"This goes to {recipients}{rest}.": "此邮件将发送给 {recipients}{rest}。",
|
||||||
|
"This link does not go where it says": "此链接指向的位置与其显示的不符",
|
||||||
|
"This message packs its attachments into a winmail.dat, which most clients cannot open.": "此邮件把附件打包进了 winmail.dat,大多数客户端无法打开。",
|
||||||
|
"Throw away your changes?": "放弃您的更改吗?",
|
||||||
|
"Today, in your date format": "今天,按您的日期格式",
|
||||||
|
"Unread first": "未读在前",
|
||||||
|
"Unsaved changes": "未保存的更改",
|
||||||
|
"View as": "查看方式",
|
||||||
|
"Warnings": "警告",
|
||||||
|
"Week view": "周视图",
|
||||||
|
"What is it called?": "取什么名字?",
|
||||||
|
"What reaches a sender, and what asks before it happens.": "发件人能获知什么,以及在此之前会询问什么。",
|
||||||
|
"What you changed here will be lost.": "您在此处所做的更改将会丢失。",
|
||||||
|
"Who the message is addressed to": "邮件的收件人",
|
||||||
|
"Working out what is selected…": "正在确定所选内容…",
|
||||||
|
"You": "您",
|
||||||
|
"Your Sieve script has changes that have not been saved.": "您的 Sieve 脚本有尚未保存的更改。",
|
||||||
|
"Your filter rules have changes that have not been saved.": "您的筛选规则有尚未保存的更改。",
|
||||||
|
"Your own identity domains are always inside and do not need listing. A domain here also covers its subdomains.": "您自己发件身份的域名始终视为内部,无需在此列出。此处填写的域名同时涵盖其子域名。",
|
||||||
|
"Your own:": "您自己的:",
|
||||||
|
"dark mode": "深色模式",
|
||||||
|
"file": "文件",
|
||||||
|
"light mode": "浅色模式",
|
||||||
|
"scored {score} against a threshold of {threshold}": "评分 {score},阈值为 {threshold}",
|
||||||
|
"scored {score}, with no threshold stated": "评分 {score},未说明阈值",
|
||||||
|
"this view": "此视图",
|
||||||
|
"{count} conversations moved to {folder}": "已将 {count} 个会话移动到 {folder}",
|
||||||
|
"{count} folders": "{count} 个文件夹",
|
||||||
|
"{name}’s birthday": "{name} 的生日",
|
||||||
|
"{name}’s birthday ({age})": "{name} 的生日({age})",
|
||||||
|
// ── Third pass ──────────────────────────────────────────────────────
|
||||||
|
// Sentences that lib/ and store/ were building in English, and the two
|
||||||
|
// swipe labels that reach t() through a variable and so were invisible
|
||||||
|
// to a scan for t("literal"). See #259.
|
||||||
|
"A read receipt was already sent for this message.": "已为此邮件发送过已读回执。",
|
||||||
|
"Add star": "添加星标",
|
||||||
|
"Could not attach": "无法添加附件",
|
||||||
|
"Delete forever?": "要永久删除吗?",
|
||||||
|
"Delete?": "要删除吗?",
|
||||||
|
"No recipients": "没有收件人",
|
||||||
|
"No sending identity available": "没有可用的发件身份",
|
||||||
|
"Pick a date and time.": "请选择日期和时间。",
|
||||||
|
"Pick a time at least a minute from now.": "请选择至少一分钟之后的时间。",
|
||||||
|
"Remove star": "取消星标",
|
||||||
|
"Requested, to {address}. Never sent automatically.": "已请求,发送至 {address}。绝不会自动发送。",
|
||||||
|
"The sender did not request a read receipt.": "发件人未请求已读回执。",
|
||||||
|
"This is bulk or list mail; read receipts for it only confirm the address is live.": "这是群发邮件或邮件列表;对其回复已读回执只会确认该地址仍在使用。",
|
||||||
|
"This message has not been received, so there is nothing to report.": "此邮件并非收到的邮件,因此无需回报。",
|
||||||
|
"This message was sent automatically, so no read receipt is offered.": "此邮件为自动发送,因此不提供已读回执。",
|
||||||
|
"This server will not hold a message longer than {span}.": "此服务器保留邮件的时间不会超过 {span}。",
|
||||||
|
"Upload failed": "上传失败",
|
||||||
},
|
},
|
||||||
plurals: {
|
plurals: {
|
||||||
|
// ── Third pass ─────────────────────────────────────────────────────
|
||||||
|
"Move {n} messages to Trash?": { other: "要将 {n} 封邮件移到已删除邮件吗?" },
|
||||||
|
"{n} days": { other: "{n} 天" },
|
||||||
|
"{n} hours": { other: "{n} 小时" },
|
||||||
"Updated {n} contacts, nothing new": { other: "已更新 {n} 个联系人,无新增" },
|
"Updated {n} contacts, nothing new": { other: "已更新 {n} 个联系人,无新增" },
|
||||||
"{n} updated": { other: "已更新 {n} 个" },
|
"{n} updated": { other: "已更新 {n} 个" },
|
||||||
"Updated {n} contacts you already had": { other: "已更新您已有的 {n} 个联系人" },
|
"Updated {n} contacts you already had": { other: "已更新您已有的 {n} 个联系人" },
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ export const useCompose = create<ComposeState>((set, get) => ({
|
|||||||
onProgress: (loaded, total) => patchAtt(key, a.id, { progress: Math.round((loaded / total) * 100) }, set),
|
onProgress: (loaded, total) => patchAtt(key, a.id, { progress: Math.round((loaded / total) * 100) }, set),
|
||||||
})
|
})
|
||||||
.then((res) => patchAtt(key, a.id, { blobId: res.blobId, progress: 100, type: res.type || a.type, size: res.size }, set))
|
.then((res) => patchAtt(key, a.id, { blobId: res.blobId, progress: 100, type: res.type || a.type, size: res.size }, set))
|
||||||
.catch((err) => patchAtt(key, a.id, { error: (err as Error).message || "Upload failed" }, set));
|
.catch((err) => patchAtt(key, a.id, { error: (err as Error).message || translate("Upload failed") }, set));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -524,7 +524,7 @@ export const useCompose = create<ComposeState>((set, get) => ({
|
|||||||
const up = await client.upload(accountId, blob, { type: a.type });
|
const up = await client.upload(accountId, blob, { type: a.type });
|
||||||
patchAtt(key, a.id, { blobId: up.blobId, progress: 100, size: up.size || a.size }, set);
|
patchAtt(key, a.id, { blobId: up.blobId, progress: 100, size: up.size || a.size }, set);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
patchAtt(key, a.id, { error: (err as Error).message || "Could not attach" }, set);
|
patchAtt(key, a.id, { error: (err as Error).message || translate("Could not attach") }, set);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -568,7 +568,7 @@ export const useCompose = create<ComposeState>((set, get) => ({
|
|||||||
toast.success(scheduling ? translate("Send scheduled for {when}", { when: formatScheduleTime(new Date(d.sendAt!)) }) : translate("Message sent"));
|
toast.success(scheduling ? translate("Send scheduled for {when}", { when: formatScheduleTime(new Date(d.sendAt!)) }) : translate("Message sent"));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.error(translate("Send failed: {error}", { error: (err as Error).message }), {
|
toast.error(translate("Send failed: {error}", { error: (err as Error).message }), {
|
||||||
action: { label: "Open draft", onClick: () => set((s) => ({ drafts: [...s.drafts, { ...d, sending: false, error: (err as Error).message }], activeKey: d.key })) },
|
action: { label: translate("Open draft"), onClick: () => set((s) => ({ drafts: [...s.drafts, { ...d, sending: false, error: (err as Error).message }], activeKey: d.key })) },
|
||||||
duration: 15000,
|
duration: 15000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -580,7 +580,7 @@ export const useCompose = create<ComposeState>((set, get) => ({
|
|||||||
await doSend();
|
await doSend();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const toastId = toast.show("Sending…", { duration: delay * 1000, progress: true, action: { label: "Undo", onClick: () => get().undoSend(key) } });
|
const toastId = toast.show(translate("Sending…"), { duration: delay * 1000, progress: true, action: { label: translate("Undo"), onClick: () => get().undoSend(key) } });
|
||||||
const timer = window.setTimeout(() => void doSend(), delay * 1000);
|
const timer = window.setTimeout(() => void doSend(), delay * 1000);
|
||||||
set((s) => ({ pendingSends: { ...s.pendingSends, [key]: { timer, toastId, draft: d } } }));
|
set((s) => ({ pendingSends: { ...s.pendingSends, [key]: { timer, toastId, draft: d } } }));
|
||||||
},
|
},
|
||||||
@@ -689,7 +689,7 @@ export async function buildEmailObject(d: Draft, opts: { forSend: boolean; mailb
|
|||||||
const mail = useMail.getState();
|
const mail = useMail.getState();
|
||||||
const accountId = mail.accountId!;
|
const accountId = mail.accountId!;
|
||||||
const ident = mail.identities.find((i) => i.id === d.identityId) ?? mail.identities[0];
|
const ident = mail.identities.find((i) => i.id === d.identityId) ?? mail.identities[0];
|
||||||
if (!ident) throw new Error("No sending identity available");
|
if (!ident) throw new Error(translate("No sending identity available"));
|
||||||
const from: EmailAddress = { name: ident.name || null, email: ident.email };
|
const from: EmailAddress = { name: ident.name || null, email: ident.email };
|
||||||
|
|
||||||
let html = d.format === "html" ? d.html : "";
|
let html = d.format === "html" ? d.html : "";
|
||||||
@@ -869,15 +869,15 @@ async function sendInternal(d: Draft, _get: () => ComposeState): Promise<void> {
|
|||||||
const mail = useMail.getState();
|
const mail = useMail.getState();
|
||||||
const accountId = mail.accountId!;
|
const accountId = mail.accountId!;
|
||||||
const ident = mail.identities.find((i) => i.id === d.identityId) ?? mail.identities[0];
|
const ident = mail.identities.find((i) => i.id === d.identityId) ?? mail.identities[0];
|
||||||
if (!ident) throw new Error("No sending identity available");
|
if (!ident) throw new Error(translate("No sending identity available"));
|
||||||
if (d.attachments.some((a) => !a.blobId && !a.error)) throw new Error("Attachments are still uploading");
|
if (d.attachments.some((a) => !a.blobId && !a.error)) throw new Error(translate("Attachments are still uploading"));
|
||||||
const scheduled = d.sendAt !== null && d.sendAt > Date.now();
|
const scheduled = d.sendAt !== null && d.sendAt > Date.now();
|
||||||
const scheduledId = scheduled ? await ensureScheduledMailbox() : null;
|
const scheduledId = scheduled ? await ensureScheduledMailbox() : null;
|
||||||
const email = await buildEmailObject(d, { forSend: true, mailboxId: scheduledId });
|
const email = await buildEmailObject(d, { forSend: true, mailboxId: scheduledId });
|
||||||
const sentId = mail.roleId("sent");
|
const sentId = mail.roleId("sent");
|
||||||
const draftsId = mail.roleId("drafts");
|
const draftsId = mail.roleId("drafts");
|
||||||
const rcpts = uniqueAddresses([...d.to, ...d.cc, ...d.bcc]).map((a) => ({ email: a.email }));
|
const rcpts = uniqueAddresses([...d.to, ...d.cc, ...d.bcc]).map((a) => ({ email: a.email }));
|
||||||
if (!rcpts.length) throw new Error("No recipients");
|
if (!rcpts.length) throw new Error(translate("No recipients"));
|
||||||
const sub = buildSubmission({
|
const sub = buildSubmission({
|
||||||
identityId: ident.id,
|
identityId: ident.id,
|
||||||
fromEmail: ident.email,
|
fromEmail: ident.email,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export function ScheduleMenuItems({ maxMs, onPick, onCustom }: { maxMs: number;
|
|||||||
<MenuSep />
|
<MenuSep />
|
||||||
<MenuTitle>{t("Schedule send")}</MenuTitle>
|
<MenuTitle>{t("Schedule send")}</MenuTitle>
|
||||||
{presets.map((p) => (
|
{presets.map((p) => (
|
||||||
<MenuItem key={p.id} icon={<Clock size={16} />} label={p.label} kbd={formatScheduleTime(p.at)} onClick={() => onPick(p.at)} />
|
<MenuItem key={p.id} icon={<Clock size={16} />} label={t(p.label)} kbd={formatScheduleTime(p.at)} onClick={() => onPick(p.at)} />
|
||||||
))}
|
))}
|
||||||
<MenuItem icon={<Clock size={16} />} label={t("Pick date and time…")} onClick={onCustom} />
|
<MenuItem icon={<Clock size={16} />} label={t("Pick date and time…")} onClick={onCustom} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ export function ContactsSidebar() {
|
|||||||
title={t("New address book")}
|
title={t("New address book")}
|
||||||
aria-label={t("New address book")}
|
aria-label={t("New address book")}
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
const name = await promptDialog({ title: "New address book", placeholder: "Name" });
|
const name = await promptDialog({ title: t("New address book"), placeholder: t("Name") });
|
||||||
if (!name?.trim()) return;
|
if (!name?.trim()) return;
|
||||||
try {
|
try {
|
||||||
await contacts.createBook(name.trim());
|
await contacts.createBook(name.trim());
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ export function FilesTree() {
|
|||||||
label={t("Rename")}
|
label={t("Rename")}
|
||||||
disabled={!menuNode.myRights?.mayRename}
|
disabled={!menuNode.myRights?.mayRename}
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
const name = await promptDialog({ title: "Rename", defaultValue: menuNode.name });
|
const name = await promptDialog({ title: t("Rename"), defaultValue: menuNode.name });
|
||||||
if (!name?.trim() || name === menuNode.name) return;
|
if (!name?.trim() || name === menuNode.name) return;
|
||||||
try {
|
try {
|
||||||
await useFiles.getState().rename(menuNode.id, name.trim());
|
await useFiles.getState().rename(menuNode.id, name.trim());
|
||||||
|
|||||||
@@ -228,7 +228,16 @@ export function MailView({ mailboxId, threadId, search }: { mailboxId?: string;
|
|||||||
const trashId = mail.roleId("trash");
|
const trashId = mail.roleId("trash");
|
||||||
const permanent = t.every((id) => trashId && mail.emails[id]?.mailboxIds[trashId]);
|
const permanent = t.every((id) => trashId && mail.emails[id]?.mailboxIds[trashId]);
|
||||||
if (permanent || settings.confirmDelete) {
|
if (permanent || settings.confirmDelete) {
|
||||||
const ok = await confirmDialog({ title: permanent ? "Delete forever?" : "Delete?", message: permanent ? `${t.length} message(s) will be permanently deleted.` : `Move ${t.length} message(s) to Trash?`, confirmLabel: "Delete", danger: permanent });
|
// "message(s)" was doing the work a plural form should: every
|
||||||
|
// language that inflects got a parenthesis instead of agreement.
|
||||||
|
const ok = await confirmDialog({
|
||||||
|
title: permanent ? translate("Delete forever?") : translate("Delete?"),
|
||||||
|
message: permanent
|
||||||
|
? plural(t.length, { one: "{n} message will be permanently deleted.", other: "{n} messages will be permanently deleted." })
|
||||||
|
: plural(t.length, { one: "Move {n} message to Trash?", other: "Move {n} messages to Trash?" }),
|
||||||
|
confirmLabel: translate("Delete"),
|
||||||
|
danger: permanent,
|
||||||
|
});
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
}
|
}
|
||||||
await mail.trash(t);
|
await mail.trash(t);
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ export const MessageView = memo(function MessageView({ email: e, expanded, wasUn
|
|||||||
{e["header:List-Id:asText"] && <><dt>{translate("List")}</dt><dd>{e["header:List-Id:asText"]}</dd></>}
|
{e["header:List-Id:asText"] && <><dt>{translate("List")}</dt><dd>{e["header:List-Id:asText"]}</dd></>}
|
||||||
<dt>{translate("Size")}</dt><dd>{formatSize(e.size)}</dd>
|
<dt>{translate("Size")}</dt><dd>{formatSize(e.size)}</dd>
|
||||||
{spam && <><dt>{translate("Spam filter")}</dt><dd><SpamSummary report={spam} /></dd></>}
|
{spam && <><dt>{translate("Spam filter")}</dt><dd><SpamSummary report={spam} /></dd></>}
|
||||||
{receiptRequested && <><dt>{translate("Receipt")}</dt><dd>{receipt.offer ? `Requested, to ${receipt.to!.email}. Never sent automatically.` : refusalText(receipt.refusal!)}</dd></>}
|
{receiptRequested && <><dt>{translate("Receipt")}</dt><dd>{receipt.offer ? translate("Requested, to {address}. Never sent automatically.", { address: receipt.to!.email }) : translate(refusalText(receipt.refusal!))}</dd></>}
|
||||||
</dl>
|
</dl>
|
||||||
)}
|
)}
|
||||||
{receipt.offer && settings.readReceiptPolicy !== "never" && receiptDone !== "dismissed" && (
|
{receipt.offer && settings.readReceiptPolicy !== "never" && receiptDone !== "dismissed" && (
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ export function AppearanceSettings() {
|
|||||||
return (
|
return (
|
||||||
<button key={p.id} className={`theme-card ${s.palette === p.id ? "active" : ""}`} onClick={() => update({ palette: p.id })}>
|
<button key={p.id} className={`theme-card ${s.palette === p.id ? "active" : ""}`} onClick={() => update({ palette: p.id })}>
|
||||||
<div className="preview" style={{ background: PALETTE_PREVIEW[p.id][shown] || PALETTE_PREVIEW[p.id].dark }} />
|
<div className="preview" style={{ background: PALETTE_PREVIEW[p.id][shown] || PALETTE_PREVIEW[p.id].dark }} />
|
||||||
<span className="notranslate" translate="no">{p.name}</span>
|
{p.translatable
|
||||||
|
? <span>{translate(p.name)}</span>
|
||||||
|
: <span className="notranslate" translate="no">{p.name}</span>}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export function CalendarSettings() {
|
|||||||
<div style={{ marginTop: 8 }}><ColorSwatches value={c.color} onChange={(col) => update({ eventCategories: s.eventCategories.map((x, j) => (j === i ? { ...x, color: col } : x)) })} /></div>
|
<div style={{ marginTop: 8 }}><ColorSwatches value={c.color} onChange={(col) => update({ eventCategories: s.eventCategories.map((x, j) => (j === i ? { ...x, color: col } : x)) })} /></div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
<button className="btn mb-16" onClick={async () => { const n = await promptDialog({ title: "New category", placeholder: "Name" }); if (n?.trim() && !s.eventCategories.some((c) => c.name.toLowerCase() === n.trim().toLowerCase())) update({ eventCategories: [...s.eventCategories, { name: n.trim(), color: CALENDAR_COLORS[s.eventCategories.length % CALENDAR_COLORS.length]! }] }); }}><Plus size={16} /> {t("New category")}</button>
|
<button className="btn mb-16" onClick={async () => { const n = await promptDialog({ title: t("New category"), placeholder: t("Name") }); if (n?.trim() && !s.eventCategories.some((c) => c.name.toLowerCase() === n.trim().toLowerCase())) update({ eventCategories: [...s.eventCategories, { name: n.trim(), color: CALENDAR_COLORS[s.eventCategories.length % CALENDAR_COLORS.length]! }] }); }}><Plus size={16} /> {t("New category")}</button>
|
||||||
|
|
||||||
<h2>{t("Subscribed calendars")}</h2>
|
<h2>{t("Subscribed calendars")}</h2>
|
||||||
<p className="hint" style={{ marginTop: -8 }}>
|
<p className="hint" style={{ marginTop: -8 }}>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export function RuleDialog({ rule, onClose, onSave, applyMailbox, applyByDefault
|
|||||||
else if (v === "address") setTest(i, { type: "address", header: "from", part: "domain", op: "is", value: "" });
|
else if (v === "address") setTest(i, { type: "address", header: "from", part: "domain", op: "is", value: "" });
|
||||||
else setTest(i, { type: "header", header: v === "__custom__" ? "" : v, op: "contains", value: "" });
|
else setTest(i, { type: "header", header: v === "__custom__" ? "" : v, op: "contains", value: "" });
|
||||||
}}>
|
}}>
|
||||||
{HEADER_CHOICES.map((h) => <option key={h.value} value={h.value}>{h.label}</option>)}
|
{HEADER_CHOICES.map((h) => <option key={h.value} value={h.value}>{translate(h.label)}</option>)}
|
||||||
<option value="address">{translate("Sender domain")}</option>
|
<option value="address">{translate("Sender domain")}</option>
|
||||||
<option value="size">{translate("Message size")}</option>
|
<option value="size">{translate("Message size")}</option>
|
||||||
<option value="body">{translate("Body text")}</option>
|
<option value="body">{translate("Body text")}</option>
|
||||||
@@ -75,7 +75,7 @@ export function RuleDialog({ rule, onClose, onSave, applyMailbox, applyByDefault
|
|||||||
<select className="select" value={t.op} onChange={(e) => setTest(i, { ...t, op: e.target.value as "contains" | "notcontains" })}><option value="contains">{translate("contains")}</option><option value="notcontains">{translate("does not contain")}</option></select>
|
<select className="select" value={t.op} onChange={(e) => setTest(i, { ...t, op: e.target.value as "contains" | "notcontains" })}><option value="contains">{translate("contains")}</option><option value="notcontains">{translate("does not contain")}</option></select>
|
||||||
) : t.type === "true" ? <span /> : (
|
) : t.type === "true" ? <span /> : (
|
||||||
<select className="select" value={t.op} onChange={(e) => setTest(i, { ...t, op: e.target.value as SieveTest extends { op: infer O } ? O : never })}>
|
<select className="select" value={t.op} onChange={(e) => setTest(i, { ...t, op: e.target.value as SieveTest extends { op: infer O } ? O : never })}>
|
||||||
{HEADER_OPS.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}
|
{HEADER_OPS.map((o) => <option key={o.value} value={o.value}>{translate(o.label)}</option>)}
|
||||||
</select>
|
</select>
|
||||||
)}
|
)}
|
||||||
{t.type === "size" ? (
|
{t.type === "size" ? (
|
||||||
|
|||||||
@@ -21,9 +21,15 @@ export function ShortcutsSettings() {
|
|||||||
<div className="shortcut-grid">
|
<div className="shortcut-grid">
|
||||||
{groups.map(([group, items]) => (
|
{groups.map(([group, items]) => (
|
||||||
<div key={group}>
|
<div key={group}>
|
||||||
<h3>{group}</h3>
|
{/* Group names and descriptions are registered in English at the
|
||||||
|
call sites -- see views/Shortcuts.tsx -- because the binding
|
||||||
|
table is data, not markup, and the English is the catalogue
|
||||||
|
key. Translating at render keeps the registration simple and
|
||||||
|
means a binding added anywhere is translatable without the
|
||||||
|
registrar knowing about i18n. */}
|
||||||
|
<h3>{t(group)}</h3>
|
||||||
{items.map((b) => (
|
{items.map((b) => (
|
||||||
<div key={b.keys} className="shortcut-row"><span>{b.description}</span><Kbd keys={b.keys} /></div>
|
<div key={b.keys} className="shortcut-row"><span>{t(b.description)}</span><Kbd keys={b.keys} /></div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user