mirror of
https://github.com/karatektus/pl_mail.git
synced 2026-10-25 01:54:10 +00:00
One order across the built-in tabs and the reader's own, and a set of built-ins switched off, both beside the other sorting choices on the user (CategorySorting). The order replaces the categories' own position column, which never shipped: the strip is one list, so its order is too. Primary is always first and cannot be switched off — it is where the rest falls back to. A switched-off category takes no mail. Whatever would have gone there — by the header rules, Google's label or the assistant — is in Primary, and the message panel says it would have been that category. The answer is mapped rather than the next rule consulted: "Forums is off" does not make a mailing list Promotions for its List-Unsubscribe. Until the re-sort a switch queues has run, and for a conversation somebody pinned there, Primary lists and counts the switched-off category's conversations too, so nothing is in no tab at all. InboxTabs is where order and on/off are applied, so the strip, the drop targets and every key that resolves agree. A restore rewrites the order's own-tab keys to the categories' new ids. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4402 lines
217 KiB
YAML
4402 lines
217 KiB
YAML
account:
|
||
add_title: Add account
|
||
added: Account added successfully
|
||
colour_set: Account colour changed
|
||
disabled: Account disabled
|
||
enabled: Account enabled
|
||
form:
|
||
email: Email address
|
||
encryption: Encryption
|
||
imap:
|
||
heading: Incoming — IMAP
|
||
host: Host
|
||
password: Password
|
||
port: Port
|
||
preset:
|
||
label: Provider
|
||
placeholder: Choose a provider…
|
||
smtp:
|
||
heading: Outgoing — SMTP
|
||
host: Host
|
||
password: Sending password
|
||
same: Use the same password for sending
|
||
separate: Use a different password for sending
|
||
username: Username
|
||
oauth:
|
||
calendar_declined: The account is connected, but calendar access was not granted — so its calendars will not sync. Reconnect it and tick calendar access on Google's consent screen.
|
||
google: Continue with Google
|
||
info: Sign in with your provider — no password stored.
|
||
microsoft: Continue with Microsoft
|
||
primary_set: Primary account changed
|
||
removed: Account removed
|
||
tabs:
|
||
imap: IMAP / SMTP
|
||
oauth: OAuth
|
||
test:
|
||
button: Test connection
|
||
hint:
|
||
expects_ssl: 'Port %port% normally expects implicit SSL/TLS.'
|
||
expects_starttls: 'Port %port% normally expects STARTTLS, not implicit SSL/TLS.'
|
||
no_encryption: 'Encryption is set to None — most providers require SSL/TLS or STARTTLS.'
|
||
imap: IMAP
|
||
request_failed: 'The test could not run (%status%).'
|
||
result:
|
||
auth: 'The server refused the username or password.'
|
||
failed: 'The connection did not work. Check the host, port and encryption.'
|
||
host_invalid: 'Enter a host name or IP address only — no slashes, question marks or @.'
|
||
imap_ok: 'Connected — %count% folders visible.'
|
||
missing_fields: 'Enter at least an email address and an IMAP host first.'
|
||
missing_password: 'No password to test with. Enter one above — on the edit form a blank field keeps the stored password, which the test can only use once the account is saved.'
|
||
smtp_none: 'No SMTP host configured — sending is disabled for this account.'
|
||
smtp_ok: 'Connected and signed in.'
|
||
timeout: 'The server did not answer in time. Check the host and port, and whether a firewall is in the way.'
|
||
tls: 'The secure connection failed — the certificate was not accepted, or the encryption setting does not match the port.'
|
||
unreachable: 'The server could not be reached. Check the host name and port.'
|
||
smtp: SMTP
|
||
updated: Account updated
|
||
|
||
admin:
|
||
accounts:
|
||
account: 'Account'
|
||
heading: 'Accounts'
|
||
last_activity: 'Last activity'
|
||
messages: 'Messages'
|
||
threads: 'Threads'
|
||
address:
|
||
field:
|
||
public_url: Public address
|
||
public_url_help: >-
|
||
Where people reach plMail from outside, with http:// or https:// in
|
||
front and no path. Gmail and Outlook send push notifications back to
|
||
it, so for those it has to be reachable from the internet over https.
|
||
follow_up: >-
|
||
Things registered elsewhere do not follow by themselves: the redirect
|
||
addresses in the Google and Microsoft consoles, a Gmail Pub/Sub push
|
||
endpoint, and the server address in mail and calendar apps. Browser
|
||
notifications have to be switched on again on each device.
|
||
heading: Public address
|
||
in_use: In use now
|
||
intro: >-
|
||
The address plMail builds its own links from: where browsers connect for
|
||
live updates, and where Google and Microsoft are told to call back.
|
||
Change it when the install moves to another domain, port or proxy, or
|
||
after restoring a backup taken on a different machine.
|
||
none: none
|
||
on_file: Saved
|
||
pending: >-
|
||
The saved address is not the one in use. A change takes effect when the
|
||
containers start again. If the two still differ after a restart,
|
||
APP_PUBLIC_URL is set in the compose file, and that setting wins over
|
||
this one.
|
||
restart_help: >-
|
||
Restarting plMail here is enough for live updates. Restart the whole
|
||
stack as well, so the workers register push at the new address.
|
||
save: Save address
|
||
saved: 'Saved — it takes effect at the next restart.'
|
||
ago: '%age% ago'
|
||
ai:
|
||
backfill:
|
||
chip:
|
||
complete: 'Done'
|
||
failed: 'Stopped'
|
||
idle: 'Not running'
|
||
paused: 'Paused'
|
||
running: 'Running'
|
||
stalled: 'Not moving'
|
||
eta: 'About %duration%, at that rate'
|
||
eta_label: 'Left'
|
||
eta_settling: 'Too early to estimate'
|
||
failed_body: 'The model host answered nothing several times in a row, so the pass stopped. Nothing was lost: resume carries on from where it got to.'
|
||
failures: '%count% messages the model could not answer for. The next pass picks them up.'
|
||
failures_label: 'Skipped'
|
||
finished_label: 'Finished'
|
||
heading: 'Search index'
|
||
intro: 'Search by meaning only sees mail that has been indexed. This walks every mailbox once; after that, new mail is indexed shortly after someone searches, and once a night as a backstop.'
|
||
last_activity_label: 'Last checked in'
|
||
model_label: 'Indexed with'
|
||
no_mail: 'There is no mail to index yet.'
|
||
outcome:
|
||
already_running: 'A pass is already running.'
|
||
no_mailboxes: 'There are no mailboxes to walk.'
|
||
not_running: 'Nothing is running.'
|
||
nothing_to_resume: 'There is nothing left to pick up.'
|
||
resumes_itself: 'It is already coming back by itself.'
|
||
search_off: 'Search by meaning is off, so there is nothing to index.'
|
||
pause: 'Pause'
|
||
paused:
|
||
feature_off: 'Stopped because search by meaning was switched off.'
|
||
host_unreachable: 'Waiting for the model host to answer again. It retries by itself.'
|
||
interactive: 'Standing aside while the writing help is in use. It carries on by itself a moment after.'
|
||
operator: 'Paused. It picks up where it stopped.'
|
||
progress: '%embedded% of %eligible% messages indexed'
|
||
rate: '%rate% messages a second, over the last five minutes'
|
||
rate_label: 'Rate'
|
||
resume: 'Resume'
|
||
search_off: 'Search by meaning is off, so there is nothing to index. Switch it on above first.'
|
||
stalled_body: 'Nothing has moved for a while — the worker that was doing it is probably gone. Resume picks it up where it stopped.'
|
||
start: 'Start'
|
||
started_label: 'Started'
|
||
tuning: '%batch% messages a batch, %delay% s between batches, and it stands aside for %cooldown% s after anyone uses the writing help.'
|
||
duration:
|
||
hours: '%count% h'
|
||
minutes: '%count% min'
|
||
seconds: '%count% s'
|
||
embedding_preset:
|
||
heading: 'Measured presets — one click sets the model, its instruction and its threshold together:'
|
||
all-minilm: 'Small and fast: 45 MB and 384 dimensions, for a machine that cannot spare the memory. English-first, so expect it to be the weakest of these on German mail. Needs no instruction.'
|
||
nomic-embed-text: 'What plMail recommended before, kept for installations already on it. Half-supported honestly: it wants its documents labelled as well as its queries, which plMail does not do, and measured the query instruction alone changes nothing.'
|
||
qwen3-embedding_0_6b: 'The default, and the one to pick unless you have a reason. Multilingual, which matters more than any benchmark for a mailbox that is not all in one language, and the only one here that reached perfect precision in testing. 639 MB.'
|
||
field:
|
||
base_url: 'Model host'
|
||
base_url_help: 'For Ollama, the address of the container on your network, including the port. For an OpenAI-compatible endpoint, the API root including its version, such as https://api.example.com/v1.'
|
||
categorisation: 'Sort mail into tabs'
|
||
categorisation_help: 'Runs on every message that arrives. Only ever a tie-breaker — the ordinary rules decide first.'
|
||
chat_keep_alive: 'Keep the writing model loaded for'
|
||
chat_keep_alive_help: '5m, 30m, 4h, or a plain number of seconds. -1 keeps it loaded for good, 0 unloads it after every request. Longer means the first reply comes back sooner; the host keeps the memory reserved for the whole time either way. Leave empty to use whatever the host itself is set to.'
|
||
chat_model: 'Writing model'
|
||
chat_model_help: 'Used for replies, summaries and sorting. Something instruction-tuned.'
|
||
embedding_keep_alive: 'Keep the search model loaded for'
|
||
embedding_keep_alive_help: 'Same format as above. This model is small and asked for constantly, so -1 — loaded for good — usually costs little and saves a wait on every search; it is worth setting if the host has the memory to spare. Leave empty to use whatever the host itself is set to.'
|
||
embedding_base_url: 'Search host'
|
||
embedding_model: 'Search model'
|
||
embedding_own: 'Search uses a different model host'
|
||
embedding_own_help: 'For running the search model somewhere other than the writing model: a hosted model for writing and a small one at home for search, or the reverse. Every message is sent to the search host once to be indexed. If the search model has the same name there, the existing index is kept.'
|
||
embedding_provider: 'Search host provider'
|
||
embedding_model_help: 'Turns mail into vectors so search can find meaning rather than words.'
|
||
hold: 'Wait for the assistant before showing new mail in a tab'
|
||
hold_help: 'For people who let the assistant sort their mail. New mail is kept out of the inbox tabs for the moment the assistant needs, so it appears once, in the right tab, instead of appearing in one and moving to another. Mail brought in by a first import is never held.'
|
||
hold_max_seconds: 'Wait at most (seconds)'
|
||
hold_max_seconds_help: 'Past this, the mail is shown where the ordinary rules put it, whatever the assistant is doing — and moved if the assistant answers later. Between 2 and 300.'
|
||
search_query_instruction: 'Query instruction'
|
||
search_query_instruction_help: 'Put in front of the search text before it is embedded. Most models need one and answer badly without it; leave it empty for models that do not. Only searches are affected, so changing it never means indexing your mail again.'
|
||
semantic_min_similarity: 'Minimum similarity'
|
||
semantic_min_similarity_help: 'How close a match has to be, from 0 to 1. Every model answers on its own scale, so this belongs with the model above: too high finds nothing, too low returns the whole mailbox.'
|
||
enabled: 'Use a language model'
|
||
headers: 'Extra headers'
|
||
headers_clear: 'Remove the stored headers'
|
||
headers_help: 'One per line, written Name: value. Sent with every request to the model host, for a proxy or gateway that asks for more than a token. Stored encrypted and never shown again.'
|
||
headers_help_set: 'On file: %names%. Leave empty to keep them. Anything typed here replaces all of them; the stored values are never shown.'
|
||
provider: 'Provider'
|
||
provider_help: 'Which API the model host speaks. Ollama is the one plMail knows most about: it can keep a model loaded and load one ahead of time. OpenAI-compatible covers nearly everything else, on your own network or hosted.'
|
||
enabled_help: 'Off by default. Everything below is ignored while this is off.'
|
||
search: 'Search by meaning'
|
||
search_help: 'Adds results that match what you meant. The ordinary search is unchanged.'
|
||
summary: 'Thread summaries'
|
||
summary_help: 'Uses the writing model. A cold request takes about a minute and holds the GPU for all of it.'
|
||
token: 'Token'
|
||
token_help: 'Only if you have put the host behind something that asks for one. Sent as a bearer token with every request.'
|
||
token_help_set: 'A token is on file. Leave blank to keep it. Changing the address above without typing one drops it.'
|
||
writing_help: 'Help me write'
|
||
writing_help_help: 'Offers drafts and rewrites in the composer, when you ask for them.'
|
||
heading: 'Language model'
|
||
headers:
|
||
summary: 'Extra headers for a proxy or gateway'
|
||
hold:
|
||
details: 'See each message'
|
||
measured: 'Last 7 days: %count% messages held, typically for %median% s (95% within %p95% s). %timeout% were shown without an answer because the wait ran out.'
|
||
no_data: 'No mail has been held in the last 7 days, so there is no delay to report yet.'
|
||
intro: 'plMail can use a language model, on a machine you run yourself or at an endpoint you choose. Mail is sent to the address you enter here and nowhere else, nothing is switched on until you say so, and the mail client works exactly as it does now while this is off.'
|
||
perf:
|
||
by_model: 'Per model'
|
||
chip:
|
||
cold: 'Nothing loaded'
|
||
off: 'Off'
|
||
answering: 'Answering'
|
||
split: 'Partly on the CPU'
|
||
unreachable: 'No answer'
|
||
warm: 'Loaded'
|
||
feature:
|
||
thread_summary: 'Summaries'
|
||
categorise: 'Sorting mail'
|
||
mail_index: 'Indexing mail'
|
||
search_query: 'Search'
|
||
writing_help: 'Writing help'
|
||
heading: 'Model host'
|
||
latest: 'Last call: %feature% on %model%'
|
||
model:
|
||
chat: 'Writing model'
|
||
embedding: 'Search model'
|
||
missing: 'not on this host'
|
||
missing_body: 'A model named here is not installed on the host. Pull it there, or name one that is — until then every request for it fails.'
|
||
none: 'not set'
|
||
resident: 'in memory'
|
||
no_history: 'Nothing has asked a model for anything in this window. The numbers appear once something has.'
|
||
no_host: 'No model host is set yet. Add its address above.'
|
||
off_body: 'AI is off, so nothing is being asked of a model. Nothing here is a fault.'
|
||
resident:
|
||
cold_cost: 'Last time that took about %duration%.'
|
||
full: '%size% resident, fully on the GPU.'
|
||
heading: 'In memory now'
|
||
none: 'No model is loaded. The next request loads one.'
|
||
split: '%vram% of %size% on the GPU — %percent% %. The other %cpu% is on the CPU.'
|
||
split_body: 'Everything this model does is several times slower while it is split. Free some GPU memory, or use a smaller model, and load it again.'
|
||
unloading: 'Unloading now.'
|
||
unloads_in: 'Unloads in %duration% unless something asks for it.'
|
||
retrying: 'Checking again every few seconds.'
|
||
table:
|
||
calls: 'Calls'
|
||
cold: 'Cold loads'
|
||
errors: 'Errors'
|
||
feature: 'Workload'
|
||
gen: 'Tokens/s (p50 / p95)'
|
||
hint: 'p50 is the middle call and p95 the slow one: half were faster than p50, one in twenty slower than p95. A cold load is a request that had to wait for the model to be read off disk.'
|
||
load: 'Load'
|
||
throughput:
|
||
heading: 'What the calls have cost'
|
||
tokens_per_second: '%rate% tokens a second'
|
||
unreachable_body: 'Nothing answered at %host%. plMail carries on without it; the features that need a model simply do nothing.'
|
||
version: 'Ollama %version%'
|
||
window:
|
||
day: '24 hours'
|
||
hour: 'Hour'
|
||
week: '7 days'
|
||
provider:
|
||
ollama: 'Ollama'
|
||
openai: 'OpenAI-compatible'
|
||
probe:
|
||
host:
|
||
search: 'Search host'
|
||
writing: 'Model host'
|
||
missing_model: 'That host answered, but it is not holding: %models%. Pull them on the host first.'
|
||
no_host: 'Type an address first.'
|
||
no_model_list: 'Something answered at that address, but it has no model list (HTTP %status%). Check that the address ends in the API version, usually /v1. Some servers have no list and still work; save and try a draft to find out.'
|
||
not_an_api: 'Something answered at that address, but not with JSON. That is usually a login page or a proxy, not the API.'
|
||
refused: 'That host answered and refused the request (HTTP %status%). Check the token.'
|
||
ok: 'That host answered, and is holding %count% models.'
|
||
models: 'Show the %count% models it is holding'
|
||
status: 'That host answered with HTTP %status%.'
|
||
unreachable: 'Nothing answered at that address. (%error%)'
|
||
prompt:
|
||
categorise:
|
||
hint: 'Runs on arriving mail that no rule recognised. It must ask for ONE WORD out of primary, social, promotions, updates, forums — plMail matches the answer against exactly those five, and anything else silently leaves the mail where the ordinary rules put it.'
|
||
label: 'Sort mail into tabs'
|
||
formal:
|
||
hint: 'Used when someone asks for the same message in a more formal tone.'
|
||
label: 'Make it more formal'
|
||
language:
|
||
hint: 'Added to the end of every prompt above except sorting. It is what makes a German mail get a German reply — without it the model follows the English these instructions are written in, and proofreading a German draft translates it. You can reword it; you cannot remove it. Empty the box and the shipped wording comes back.'
|
||
label: 'Always answer in the language of the mail'
|
||
proofread:
|
||
hint: 'Used when someone asks for spelling and grammar to be fixed and nothing else. Keep "change nothing else" in it — without that the model rewrites sentences that were already right.'
|
||
label: 'Proofread'
|
||
reply:
|
||
hint: 'Used by "Help me write" when someone asks for a first draft.'
|
||
label: 'Draft a reply'
|
||
shorten:
|
||
hint: 'Used when someone asks for the same message in fewer words.'
|
||
label: 'Shorten'
|
||
summary:
|
||
hint: 'Used by the summary button in the reading pane. Changing this marks every summary already written as out of date — nothing is deleted, they are rewritten the next time somebody asks.'
|
||
label: 'Summarise a conversation'
|
||
prompts:
|
||
changed: '%count% changed'
|
||
heading: 'System prompts'
|
||
intro: 'These are the instructions plMail gives the model. Leave a box empty to use the wording plMail ships — that way a later update can still improve it. What you type replaces the shipped wording completely.'
|
||
reset: 'Back to the shipped wording'
|
||
save: 'Save prompts'
|
||
saved: 'Saved. New summaries use these; summaries already written are now out of date.'
|
||
show_shipped: 'Show the shipped wording'
|
||
untouched: 'As shipped'
|
||
save: 'Save'
|
||
saved: 'Saved.'
|
||
status:
|
||
incomplete: 'Needs a host'
|
||
off: 'Off'
|
||
on: 'On'
|
||
paused: 'Paused'
|
||
test: 'Test'
|
||
warmup:
|
||
button: 'Warm up now'
|
||
failed: 'No answer. Try again.'
|
||
loaded_ms: 'Model loaded in %count% ms — it was already in memory.'
|
||
loaded_seconds: 'Model loaded in %count% s.'
|
||
loading: 'Loading the model…'
|
||
model_missing: 'That host has no model called “%model%”. Pull it there, or name one that is on it. (%error%)'
|
||
no_host: 'Set a model host first, and save.'
|
||
no_model: 'Name a writing model first, and save.'
|
||
not_ollama: 'Only an Ollama host can be asked to load a model ahead of time.'
|
||
status: 'The host refused with HTTP %status%. (%error%)'
|
||
timeout: 'The host was still loading after four minutes and plMail stopped waiting. It may well finish; the model is very likely too big for the memory it has.'
|
||
unexpected: 'Something went wrong before the host could answer. (%error%)'
|
||
unreachable: 'Nothing answered at that address. (%error%)'
|
||
client_errors:
|
||
browser: 'Browser'
|
||
clear: 'Clear'
|
||
clear_confirm: 'Delete every browser error? They come back on their own if they are still happening.'
|
||
count: '{0}nothing reported|{1}1 fault|]1,Inf[ %count% faults'
|
||
empty: 'No browser errors.'
|
||
empty_hint: 'Uncaught errors from plMail''s own scripts land here, grouped by fault. Errors from browser extensions are filtered out — most of what a browser reports is not this application.'
|
||
first_seen: 'First seen'
|
||
heading: 'Browser errors'
|
||
kind:
|
||
csp: 'Blocked'
|
||
error: 'Error'
|
||
unhandledrejection: 'Rejection'
|
||
occurrences: '{1}on 1 page load|]1,Inf[ on %count% page loads'
|
||
page: 'Last page'
|
||
config_backup:
|
||
change:
|
||
absent: 'nothing set here yet'
|
||
differs: 'replaces a different value'
|
||
unchanged: 'already identical'
|
||
disposition:
|
||
applied: 'Written, and in force now.'
|
||
applied-on-restart: 'takes effect on next restart'
|
||
external: >-
|
||
plMail is a client of the system this belongs to, not its owner. The
|
||
database role was created with the password Postgres already holds, and
|
||
only an initdb reads a new one — so changing it here alone gives you an
|
||
installation that cannot connect to its own database. Change it in Postgres
|
||
first, then here.
|
||
kept-deliberately: >-
|
||
Kept as it is here, on purpose. The credentials out of this backup were
|
||
re-encrypted with this installation's key as they were written, so putting
|
||
the backup's key in place would make them — and everything else already
|
||
stored — unreadable at the next start. The line below is only for the case
|
||
where you are also restoring the old database, whose rows are encrypted
|
||
with it; then it has to go in before anything is stored.
|
||
not-writable: >-
|
||
This process could not write that path. Read-only secrets volume, wrong
|
||
uid, or a service that was never given the volume. The value is in the
|
||
backup you just uploaded — put it there yourself.
|
||
shadowed-by-compose: >-
|
||
Written, but something in the process environment sets this name too, and
|
||
the entrypoint lets an explicitly configured value win over the generated
|
||
one. Remove or update it in your compose file — or in the `.env` beside it
|
||
— and restart; the restored value is already waiting underneath.
|
||
error:
|
||
malformed-document: >-
|
||
The password opened that file, but what is inside is not a configuration
|
||
backup this plMail can read. Nothing has been changed.
|
||
not-a-backup: >-
|
||
That is not a plMail configuration backup. Nothing has been changed.
|
||
unsupported-version: >-
|
||
That backup was written by a newer plMail than this one, in a format this
|
||
version cannot read. Upgrade first, then import it.
|
||
collision: >-
|
||
That file describes somebody this installation already holds part of — an app
|
||
password, a share link or a booking page whose token is still registered here,
|
||
usually left behind by an account that was removed. Nothing has been changed.
|
||
Remove those leftovers, or import onto an installation that does not have them.
|
||
wrong-password: >-
|
||
That password does not open this file — or the file has been altered since
|
||
it was written. Nothing has been changed.
|
||
export:
|
||
error:
|
||
mismatch: 'The two passwords did not match, so nothing was exported.'
|
||
too_short: 'That password is too short, so nothing was exported.'
|
||
heading: 'Export configuration'
|
||
intro: >-
|
||
Every setting and credential this installation runs on, in one
|
||
password-encrypted file: the environment values, the files in the secrets
|
||
volume, the provider and Firebase credentials from the database, and the
|
||
people — each with their password, their second factor, their mailboxes
|
||
and everything else they configured. No mail, no calendar entries and no
|
||
contacts; those are what `app:backup` is for.
|
||
generate: 'Generate one'
|
||
generated_copied: 'Copied to your clipboard — store it somewhere that outlives this machine.'
|
||
generated_shown: 'Your browser would not share its clipboard, so the password is shown above — store it now.'
|
||
password: 'Password'
|
||
password_help: >-
|
||
At least %length% characters. It is never stored anywhere, and there is no
|
||
way to open the file without it.
|
||
password_repeat: 'Repeat password'
|
||
submit: 'Download backup'
|
||
warning: >-
|
||
The file that comes out is every secret this installation has, protected by
|
||
nothing but the password you type here. Keep it the way you would keep the
|
||
encryption key itself.
|
||
import:
|
||
error:
|
||
no_file: 'No file arrived, or it was far larger than a configuration backup can be.'
|
||
no_password: 'Enter the password this backup was sealed with.'
|
||
file: 'Backup file'
|
||
heading: 'Import configuration'
|
||
intro: >-
|
||
Upload a backup and enter its password. Nothing is written until you have
|
||
seen what it would do and confirmed it.
|
||
password: 'Password'
|
||
submit: 'Review this backup'
|
||
review:
|
||
already_matching: '%count% more already match this environment, so there is nothing to do about them.'
|
||
apply: 'Apply this backup'
|
||
applied: 'What was written'
|
||
confirm_password: 'Password, once more'
|
||
exported_at: 'Exported'
|
||
from: 'From'
|
||
heading: 'Review this backup'
|
||
instructed: 'These are yours to do'
|
||
instructed_lead: >-
|
||
Everything else is in place. These few cannot be finished from here, and
|
||
each one says why — saying otherwise would be a lie an operator only
|
||
discovers on the day it matters.
|
||
kept_users: 'Already here — kept as they are'
|
||
kept_users_lead: >-
|
||
This installation already has these people, matched by email address.
|
||
Nothing about them was touched: not their password, not their second
|
||
factor, not their mailboxes or anything else they had set up. A backup is
|
||
a photograph of a moment that has passed, and writing it over a live
|
||
account is how somebody is locked out of their own mail without a word
|
||
anywhere.
|
||
old_key_summary: 'Also restoring the old database? You will need its old encryption key.'
|
||
restart: >-
|
||
Most of this is read when the stack starts, so plMail writes it into the
|
||
generated secrets and it takes effect on the next restart. That is one
|
||
restart for the whole list, not one per value.
|
||
restart_applied: >-
|
||
Written. The values read at container start are in place but not yet in
|
||
force — restart the stack once and this installation comes up as the one
|
||
the backup was made from.
|
||
unknown_instance: 'not recorded'
|
||
written: 'plMail writes these'
|
||
written_applied: 'Written'
|
||
written_none: 'There is nothing in this backup for plMail to write.'
|
||
section:
|
||
database: 'Database'
|
||
env: 'Environment variables'
|
||
files: 'Files in the secrets volume'
|
||
users: 'People and everything they set up'
|
||
db:
|
||
active:
|
||
empty: 'No active queries right now.'
|
||
heading: 'Live activity'
|
||
cache_hit: 'Cache hit'
|
||
col:
|
||
calls: 'Calls'
|
||
hit: 'Cache'
|
||
max: 'Max ms'
|
||
mean: 'Mean ms'
|
||
query: 'Query'
|
||
rows: 'Rows'
|
||
total: 'Total'
|
||
connections: 'Connections'
|
||
deadlocks: 'Deadlocks'
|
||
extension_missing: 'pg_stat_statements is not enabled — slow-query aggregation is unavailable. Enable it once:'
|
||
extension_enable: "Enable it now"
|
||
extension_enable_hint: "Statistics start from the moment the extension is created, so earlier queries will not appear."
|
||
extension_enable_failed: "Could not enable the extension - the database role is not allowed to create it."
|
||
heavy_total:
|
||
heading: 'Heaviest queries (by total time)'
|
||
hint: 'Cumulative time across all calls — where the DB spends its time overall.'
|
||
reset: 'Reset stats'
|
||
reset_confirm: 'Reset all collected query statistics?'
|
||
rollback_ratio: 'Rollback ratio'
|
||
slow_mean:
|
||
empty: 'No statements above the threshold yet.'
|
||
heading: 'Slowest queries (by mean time)'
|
||
hint: 'Statements averaging ≥ 5ms, current database.'
|
||
demo_stats:
|
||
active: 'Open now: %count%'
|
||
col:
|
||
period: 'Period'
|
||
sessions: 'Sessions started'
|
||
visitors: 'Different visitors'
|
||
heading: 'Demo visitors'
|
||
intro: 'How many demo sessions this instance has handed out. A session is one mailbox created by following /demo; somebody coming back after theirs expired starts another.'
|
||
privacy: 'No address is stored. Each session keeps a keyed hash of the visitor''s network (the address with its last part cut off), so that somebody coming back counts once; people sharing a network count as one. The hash is deleted after %days% days, which is why the total has no visitor count.'
|
||
window:
|
||
day: 'Last 24 hours'
|
||
hour: 'Last hour'
|
||
month: 'Last 30 days'
|
||
total: 'All time'
|
||
week: 'Last 7 days'
|
||
failed:
|
||
delete: 'Delete'
|
||
delete_confirm: 'Permanently drop this failed message?'
|
||
empty: 'Failure transport is empty. 🎉'
|
||
heading: 'Failed messages'
|
||
purge: 'Purge all'
|
||
purge_confirm: 'Permanently drop every failed message? They cannot be retried afterwards.'
|
||
retry: 'Retry'
|
||
retry_all: 'Retry all'
|
||
retry_all_confirm: 'Re-dispatch every failed message?'
|
||
insight_reports:
|
||
clear_handled:
|
||
button: 'Delete handled reports'
|
||
confirm: 'Delete %count% report(s) already marked handled? The copies of the mails go with them.'
|
||
heading: 'Clear the handled pile'
|
||
lead: '%count% report(s) are marked handled. Deleting them leaves anything still waiting alone.'
|
||
copy: 'Copy selected'
|
||
copy_hint: 'The selected reports as text lines, for pasting into a prompt or an issue.'
|
||
delete: 'Delete this report'
|
||
delete_confirm: 'Delete this report? The copy of the mail it carries goes with it.'
|
||
download: 'Save as text'
|
||
download_hint: 'The same lines, as a text file.'
|
||
empty: 'Nothing has been reported.'
|
||
empty_hint: 'This fills up when somebody tells plMail it got a mail wrong — one that should have produced an insight and did not, or one they found in the wrong tab.'
|
||
export:
|
||
intro: 'One JSON file holding the selected reports in full: every verdict, the headers each decision was made on, and the message text where there is any. That is what a rule or a new extractor gets written from. Select nothing and you get everything.'
|
||
not_handled: 'Downloading changes nothing here — a report counts as handled when you say so.'
|
||
submit: 'Export selected'
|
||
warning: 'This file contains other people''s mail. Keep it where you would keep the mailbox itself.'
|
||
filter: 'Show'
|
||
filter_handled: 'Handled'
|
||
filter_pending: 'Waiting'
|
||
handled: 'Handled'
|
||
handled_at: 'Marked handled %when%'
|
||
heading: 'Reported mail'
|
||
kind:
|
||
category: 'Wrong tab'
|
||
insight: 'No insight'
|
||
mark_handled: 'Mark handled'
|
||
no_body: 'This report carries no message text.'
|
||
no_sender: 'no sender recorded'
|
||
no_subject: '(no subject)'
|
||
pending: '{0}Nothing waiting|{1}1 waiting|]1,Inf[ %count% waiting'
|
||
pending_badge: 'Waiting'
|
||
problem:
|
||
no_insight: 'No insight'
|
||
received_at: 'Mail arrived %when%'
|
||
reported_by: 'Reported by %who%'
|
||
reporter_gone: 'a deleted account'
|
||
select_all: 'Select everything shown'
|
||
selected: '%count% selected'
|
||
verdict:
|
||
body: 'Text the model saw'
|
||
body_none: 'none — HTML only'
|
||
body_text: 'yes'
|
||
gmail: 'Gmail said'
|
||
headers: 'Bulk headers'
|
||
model: 'The model said'
|
||
none: 'none'
|
||
not_asked: 'not asked'
|
||
rules: 'The rules said'
|
||
integrations:
|
||
base_url_per_user: 'Each user enters their own server address.'
|
||
base_url_pinned: 'pinned for all users'
|
||
clear_secret: 'Remove the stored client secret'
|
||
configure: 'Configure'
|
||
connected_users: '%count% connected'
|
||
copy_redirect_uri: 'Copy redirect URI'
|
||
inherit_toggle: 'Use these credentials for file storage too'
|
||
inherit_toggle_help: 'One Google project also covers Drive and Photos; one Microsoft app also covers OneDrive. Leave this on and there is nothing more to set up for them.'
|
||
field:
|
||
base_url: 'Server address'
|
||
base_url_help_saas: 'Leave empty. This service has one fixed address.'
|
||
base_url_help_selfhosted: 'Optional. Set this to pin every user to one server; leave it empty to let each user enter their own.'
|
||
client_id: 'Client ID'
|
||
client_secret: 'Client secret'
|
||
enabled: 'Offer this service to users'
|
||
enabled_help: 'When off, nobody can connect to it and it stays hidden from the compose and save-to menus.'
|
||
pubsub_topic: 'Pub/Sub topic'
|
||
pubsub_topic_help: 'Full topic name Gmail publishes changes to. Without it, accounts stay on polling instead of push. Leave empty to fall back to GMAIL_PUBSUB_TOPIC.'
|
||
push_token: 'Push verification token'
|
||
push_token_help: 'Shared secret Google includes in every Pub/Sub push; the webhook rejects notifications without it. Leave empty to fall back to GMAIL_PUBSUB_VERIFICATION_TOKEN.'
|
||
redirect_uri: 'Redirect URI'
|
||
redirect_uri_help: 'Paste this into the provider''s console exactly as shown. It cannot be changed later without breaking existing connections.'
|
||
tenant: 'Tenant'
|
||
tenant_help: 'Leave as common for personal and work accounts, organizations for work only, or a tenant ID to restrict to yours. It must match the app registration''s supported account types.'
|
||
inherit: 'Reuse %name% credentials'
|
||
inherit_help: 'Copies the client ID and secret across, server-side — the secret is never shown. It does not grant the extra permission the service needs; add that at the provider as the setup steps describe.'
|
||
inherited: 'Credentials copied'
|
||
mail:
|
||
calendar_heading: 'Calendar sync uses this same app'
|
||
calendar_google: >-
|
||
Nothing to set up here. Enable the Google Calendar API for this
|
||
project and add the .../auth/calendar scope to the consent
|
||
screen — users then get their calendars with the same sign-in
|
||
they already use for mail. Without it, mail keeps working and
|
||
calendars simply do not appear.
|
||
calendar_microsoft: >-
|
||
Nothing to set up here. Add the Calendars.ReadWrite delegated
|
||
permission to this app registration — users then get their
|
||
calendars with the same sign-in they already use for mail.
|
||
Without it, mail keeps working and calendars simply do not
|
||
appear.
|
||
env_note: 'Leaving these empty falls back to GOOGLE_OAUTH_* / MICROSOFT_OAUTH_* in the environment, so an installation already configured that way keeps working.'
|
||
from_env: 'From environment'
|
||
google: 'Gmail sign-in'
|
||
heading: 'Mail sign-in'
|
||
intro: 'The OAuth app users sign in through when they add a mail account. Google and Microsoft file integrations can reuse the same credentials.'
|
||
microsoft: 'Microsoft mail sign-in'
|
||
saved: 'Mail sign-in saved'
|
||
intro: 'Services users can attach files from and save attachments to. Every service is listed here, including the ones plMail cannot talk to yet.'
|
||
not_set: 'Not set'
|
||
saved: 'Integration settings saved'
|
||
secret_none: 'No secret stored'
|
||
secret_stored: 'Stored'
|
||
secret_unchanged: 'Leave blank to keep the stored secret'
|
||
status:
|
||
disabled: 'Disabled'
|
||
enabled: 'Enabled'
|
||
incomplete: 'Needs credentials'
|
||
unimplemented: 'Not available yet'
|
||
tutorial:
|
||
caldav:
|
||
intro: 'CalDAV authenticates with a per-user app password against the user''s own server, so there is nothing to register here.'
|
||
not_for_cloud_mail: 'Gmail and Outlook calendars do not come in this way. They ride the mail sign-in above, and need only the calendar permission ticked on that app registration.'
|
||
security: 'Users should create an app-specific password rather than use their login password: app passwords are individually revocable and work with two-factor authentication. iCloud and Fastmail accept nothing else.'
|
||
step_app_password: 'Each user creates an app password on their own server — Nextcloud under Settings → Security, iCloud at appleid.apple.com, Fastmail under Settings → Password & Security — and pastes it into their own calendar settings.'
|
||
step_base_url: 'Optionally pin the server address, for example https://cloud.example.com, if everyone here uses the same server.'
|
||
step_enable: 'Turn on "Offer this service to users" above.'
|
||
step_url: 'The address to enter is the CalDAV one, not the web interface: Nextcloud shows it under Calendar → Settings → "Copy primary CalDAV address", and it usually ends in /remote.php/dav. A bare domain works too — plMail asks it where its calendars live.'
|
||
dropbox:
|
||
intro: 'Dropbox needs an app registered in the Dropbox developer console.'
|
||
refresh_note: 'Choose the scoped access app type and request offline access, or connections will stop working after a few hours.'
|
||
step_app: 'Create an app at dropbox.com/developers/apps with scoped access to the full Dropbox.'
|
||
step_paste: 'Copy the app key and app secret into the fields above.'
|
||
step_permissions: 'Under Permissions, enable files.metadata.read, files.content.read and files.content.write.'
|
||
step_redirect: 'Under Settings, add the redirect URI shown above to the OAuth 2 redirect URIs.'
|
||
google:
|
||
separate_from_gmail: 'These credentials are separate from the Gmail ones in your environment file. You may reuse the same Cloud project, but the consent screen must list the extra scopes.'
|
||
step_consent: 'Configure the OAuth consent screen and add the scopes listed below.'
|
||
step_credentials: 'Create an OAuth 2.0 Client ID of type Web application.'
|
||
step_paste: 'Copy the client ID and client secret into the fields above.'
|
||
step_project: 'Open console.cloud.google.com and select or create a project.'
|
||
step_redirect: 'Add the redirect URI shown above to the authorised redirect URIs.'
|
||
google_drive:
|
||
intro: 'Google Drive uses OAuth, so plMail must be registered with Google before anyone can connect.'
|
||
scopes: 'Scope needed: the full drive scope. drive.file would be narrower, but it only ever sees files plMail itself created, so a browser would show an empty Drive — and share links need write access to the file being shared. This is a restricted scope: Google requires app verification before users outside your test list can consent.'
|
||
step_api: 'Enable the Google Drive API for the project.'
|
||
google_photos:
|
||
intro: 'Google Photos uses OAuth and its own API, separate from Drive.'
|
||
scope_warning: 'Google restricted the Photos read scopes in March 2025. A newly registered app is generally granted only appcreateddata, which sees nothing but media plMail itself uploaded — browsing an existing library needs the photoslibrary.readonly scope, which Google grants case by case. Saving attachments to Photos works either way; browsing may show an empty library until that scope is approved.'
|
||
step_api: 'Enable the Photos Library API for the project.'
|
||
immich:
|
||
intro: 'Immich authenticates with a per-user API key, so there is nothing to register here.'
|
||
no_share_links: 'Immich cannot create a public link for a single photo — sharing is album-level. Photos above the attachment size limit therefore cannot be attached at all.'
|
||
step_base_url: 'Optionally pin the server address, for example https://photos.example.com.'
|
||
step_enable: 'Turn on "Offer this service to users" above.'
|
||
step_key: 'Each user generates an API key in Immich under Account Settings → API Keys and pastes it into their own integration settings.'
|
||
nextcloud:
|
||
intro: 'Nextcloud authenticates with a per-user app password, so there is nothing to register here.'
|
||
security: 'Users should create an app password, not use their login password: app passwords are individually revocable and work with two-factor authentication.'
|
||
step_base_url: 'Optionally pin the server address, for example https://cloud.example.com.'
|
||
step_enable: 'Turn on "Offer this service to users" above.'
|
||
step_user: 'Each user creates an app password in Nextcloud under Settings → Security → Devices & sessions and pastes it into their own integration settings.'
|
||
one_drive:
|
||
intro: 'OneDrive uses Microsoft Graph, the same API as Microsoft mail accounts, but needs Files permissions that the mail registration does not grant.'
|
||
step_paste: 'Copy the application (client) ID and the secret value into the fields above.'
|
||
step_permissions: 'Under API permissions, add the delegated Microsoft Graph permissions Files.ReadWrite and offline_access.'
|
||
step_redirect: 'Under Authentication, add the redirect URI shown above as a Web platform redirect.'
|
||
step_register: 'Open the Azure portal and register an application under Microsoft Entra ID → App registrations.'
|
||
step_secret: 'Under Certificates & secrets, create a client secret and copy its value immediately — it is shown only once.'
|
||
tenant_note: 'Use the common tenant for personal Microsoft accounts, or your tenant ID to restrict access to your organisation.'
|
||
paperless:
|
||
asynchronous: 'Saving an attachment hands it to the Paperless consumer, which files it a few seconds later. plMail reports the handover, not the finished document — so a test save appears in Paperless shortly after it is reported as done, and a file Paperless rejects as a duplicate never appears at all.'
|
||
intro: 'Paperless-ngx authenticates with a per-user API token, so there is nothing to register here.'
|
||
no_share_links: 'plMail does not create Paperless share links. Sharing there is a separate permissioned feature with its own expiry, and publishing a document is a bigger step than attaching one — so documents above the attachment size limit cannot be attached at all.'
|
||
step_base_url: 'Optionally pin the server address, for example https://paperless.example.com.'
|
||
step_enable: 'Turn on "Offer this service to users" above.'
|
||
step_token: 'Each user copies their API token from Paperless under My Profile → API Auth Token and pastes it into their own integration settings.'
|
||
tutorial_heading: 'Setup'
|
||
unimplemented_notice: 'plMail cannot talk to this service yet. You can register the credentials now — they will be used as soon as support ships.'
|
||
loading: 'Loading…'
|
||
maintenance:
|
||
heading: Maintenance
|
||
heartbeats_help: 'Clears rows left behind by processes that died without shutting down cleanly.'
|
||
heartbeats_prune: 'Prune stale heartbeats'
|
||
heartbeats_title: 'Stale heartbeats'
|
||
restart: 'Restart workers'
|
||
restart_app: 'Restart now'
|
||
restart_app_help: >-
|
||
Ends the process serving this page so compose recreates it. Needed after
|
||
the generated secrets are rotated: the entrypoint exports them as
|
||
environment variables and the kernel boots once in worker mode, so a
|
||
running web container never picks up a new value. About two seconds of
|
||
downtime, and this page comes back on its own.
|
||
restart_app_title: 'Restart the web container'
|
||
restart_confirm: 'Restart the workers, scheduler and IMAP supervisor? In-flight work finishes first.'
|
||
restart_help: 'Stops the workers, scheduler and IMAP supervisor so they start again fresh. Long-running processes cache database mappings for their whole lifetime, so they need this after a migration.'
|
||
restart_pending: 'Restart requested %seconds%s ago — processes finish their current work, then reappear here within a minute or two.'
|
||
restart_title: 'Restart long-running processes'
|
||
run_help: 'Queued for a worker, not run here. These are the same sweeps the scheduler runs unattended.'
|
||
run_title: 'Run a maintenance task now'
|
||
task:
|
||
mail_sync: 'Sync mail'
|
||
monitoring_prune: 'Prune monitoring data'
|
||
prune_blobs: 'Prune blobs'
|
||
push_renew: 'Renew push subscriptions'
|
||
logs:
|
||
reference: 'Reference'
|
||
all_channels: 'All channels'
|
||
capture:
|
||
from_env: 'from the environment (%level%)'
|
||
hint: 'Anything below this is never written down.'
|
||
label: 'Keep entries at'
|
||
clear: 'Clear'
|
||
clear_confirm: 'Delete the %count% log entries matching this filter?'
|
||
copied: 'Copied'
|
||
copy: 'Copy entry'
|
||
copy_failed: 'Copy blocked by the browser'
|
||
empty: 'Nothing logged at this level.'
|
||
entries: 'entries'
|
||
heading: 'Logs'
|
||
newer: 'Newer'
|
||
older: 'Older'
|
||
page: 'Page'
|
||
refresh: 'Refresh'
|
||
nav:
|
||
address: Address
|
||
ai: AI
|
||
backup: Backup
|
||
database: Database
|
||
demo_stats: 'Demo visitors'
|
||
insight_reports: Reported mail
|
||
integrations: Integrations
|
||
logs: Logs
|
||
performance: Performance
|
||
push: Push
|
||
reset: Reset
|
||
sso: 'SSO'
|
||
system: System
|
||
updates: Updates
|
||
users: Users
|
||
performance:
|
||
hold:
|
||
col:
|
||
account: 'Account'
|
||
arrived: 'Arrived'
|
||
call: 'Model call'
|
||
call_hint: 'The round trip to the model host, start to answer.'
|
||
filed: 'Filed under'
|
||
load: 'of it loading'
|
||
load_hint: 'The part of the call the host spent loading the model into memory. Near zero on a model that was already loaded.'
|
||
outcome: 'What happened'
|
||
queued: 'Queued'
|
||
queued_hint: 'From the mail being stored to the assistant being asked. Rounded to the second.'
|
||
shown_after: 'Shown after'
|
||
empty: 'No mail was held in this period.'
|
||
footnote: 'The newest %limit% held messages. Durations are missing for mail sorted before this page existed. What was in the mail is not shown here, or anywhere in this panel.'
|
||
heading: 'New mail waiting for the assistant'
|
||
lead: 'For people who sort by assistant, new mail stays out of the inbox tabs until it is sorted, for at most %ceiling% seconds. Each row is one message and where its wait went.'
|
||
lead_off: 'Holding new mail for the assistant is switched off under AI, so nothing new will appear here. What was held before is still listed.'
|
||
outcome:
|
||
answered: 'Sorted, then shown'
|
||
cold: 'Sorted, then shown — the model had to be loaded first'
|
||
moved: 'Shown first, moved when the answer came'
|
||
no_answer: 'Shown without an answer'
|
||
unusable: 'The answer could not be used; shown where the rules put it'
|
||
waiting: 'Still waiting'
|
||
stat:
|
||
held: 'Messages held'
|
||
max: 'Longest'
|
||
median: 'Typical wait'
|
||
p95: '95% within'
|
||
shown_first: 'Shown before sorted'
|
||
lag:
|
||
col:
|
||
account: 'Account'
|
||
arrives_by: 'Arrives by'
|
||
elsewhere: 'Not in the inbox'
|
||
elsewhere_hint: 'Spam and mail a filter filed elsewhere: how many, and their typical delay. Providers only announce inbox mail, so the rest waits for the schedule.'
|
||
max: 'Longest'
|
||
median: 'Typical delay'
|
||
messages: 'Inbox mail'
|
||
p95: '95% within'
|
||
footnote: 'From the time the provider accepted a message to the time plMail stored it, for mail that landed in the inbox. Mail brought in by an import, and mail sent from plMail itself, is not counted.'
|
||
heading: 'How late mail arrives'
|
||
lead: 'Seconds means the provider is telling plMail about new mail as it lands. Minutes means the account is being checked on the quarter-hourly schedule instead.'
|
||
no_accounts: 'No active accounts.'
|
||
provider:
|
||
google: 'Gmail'
|
||
imap: 'IMAP'
|
||
microsoft: 'Outlook'
|
||
push: 'push on'
|
||
slowest:
|
||
by:
|
||
idle: 'IDLE'
|
||
manual: 'Sync button'
|
||
poll: 'Schedule'
|
||
push: 'Push'
|
||
unknown: '—'
|
||
col:
|
||
accepted: 'Reached the provider'
|
||
account: 'Account'
|
||
by: 'Brought in by'
|
||
in: 'Filed in'
|
||
lag: 'Then until plMail had it'
|
||
lag_hint: 'From the provider accepting the message to plMail storing it. Highlighted when inbox mail took five minutes or more.'
|
||
underway: 'Already under way for'
|
||
underway_hint: 'From the date the message carries to the provider accepting it: a sender that queued it, or dated it early. Nothing plMail could have shortened.'
|
||
empty: 'No mail arrived in this period.'
|
||
footnote: 'Slowest first. Mail outside the inbox is never announced by the provider, so up to fifteen minutes there is the schedule working as intended. What brought a message in is recorded from this version on.'
|
||
heading: 'The slowest in this period'
|
||
in:
|
||
elsewhere: 'Elsewhere'
|
||
inbox: 'Inbox'
|
||
spam: 'Spam'
|
||
window:
|
||
day: '24 hours'
|
||
hour: '1 hour'
|
||
label: 'Period'
|
||
week: '7 days'
|
||
workers:
|
||
col:
|
||
in_hand: 'In hand'
|
||
oldest: 'Oldest waiting'
|
||
queue: 'Queue'
|
||
running_for: 'For'
|
||
waiting: 'Waiting'
|
||
worker: 'Worker'
|
||
footnote: 'A reading of this moment, not of the period above: how long a job waited is not kept once it has been handled. A worker with two queues finishes the first before it looks at the second.'
|
||
heading: 'What each worker has waiting'
|
||
lead: 'Which process is behind, and by how much. Every worker takes one job at a time.'
|
||
refresh: 'Refresh'
|
||
processes:
|
||
empty: 'No heartbeats yet — processes report here after their first beat.'
|
||
heading: 'Processes'
|
||
key: 'Instance'
|
||
last_beat: 'Last beat'
|
||
pid: 'PID'
|
||
type: 'Type'
|
||
push:
|
||
calendar_domain_verification: >-
|
||
Google will not open a watch channel unless the callback domain is
|
||
verified in the Cloud project that owns the OAuth client: verify it
|
||
in Search Console, then add it under Domain verification in the
|
||
Cloud console. Microsoft needs no equivalent step.
|
||
calendar_routes: >-
|
||
Calendar push is delivered separately, to %google% and %graph%, and
|
||
needs no Pub/Sub topic.
|
||
calendar_without_public_address: >-
|
||
Without a public HTTPS address, connected calendars simply stay on
|
||
the fifteen-minute sweep.
|
||
deliveries:
|
||
all_outcomes: 'Any outcome'
|
||
all_transports: 'Both transports'
|
||
all_users: 'All users'
|
||
attempts: 'attempts'
|
||
empty_ever: >-
|
||
Nothing has been pushed yet. Either no device has completed the
|
||
verification handshake, or neither transport is configured —
|
||
the panel above says which.
|
||
empty_filter: 'No delivery matches this filter.'
|
||
heading: 'Recent deliveries'
|
||
newer: 'Newer'
|
||
older: 'Older'
|
||
outcome:
|
||
accepted: 'Accepted'
|
||
failed: 'Failed'
|
||
skipped: 'Skipped'
|
||
subscription-destroyed: 'Device dropped'
|
||
page: 'Page'
|
||
refresh: 'Refresh'
|
||
transport:
|
||
fcm: 'Firebase'
|
||
webpush: 'Web Push'
|
||
fcm:
|
||
android_package: 'Android package'
|
||
application_id: 'Application ID'
|
||
clear_key: 'Forget the stored key'
|
||
clear_key_help: 'Removes the service-account key and switches FCM off. Devices already registered stop receiving notifications until a new key is saved.'
|
||
client_email: 'Service account'
|
||
enable_without_client: 'There is no google-services.json on file — the Android app would have nothing to initialise Firebase with. Paste one below, or leave FCM switched off.'
|
||
enable_without_key: 'There is no service-account key on file — paste one below, or leave FCM switched off.'
|
||
field:
|
||
enabled: 'Deliver notifications over FCM'
|
||
enabled_help: 'Clients see this as "fcm" in the session capability, and only offer Firebase when it is on.'
|
||
google_services: 'google-services.json'
|
||
google_services_help: 'Firebase console → Project settings → Your apps → the Android app → google-services.json. The app is one build for every installation, so it initialises Firebase from these values at runtime — they are public and are published in the JMAP session.'
|
||
service_account: 'Firebase service-account key (JSON)'
|
||
service_account_help: 'Firebase console → Project settings → Service accounts → Generate new private key. Paste the whole file. It is stored encrypted and never shown again. It must belong to the same project as the google-services.json below.'
|
||
heading: 'Firebase Cloud Messaging'
|
||
intro: 'FCM is how a native Android app receives notifications in the background. It is optional — a device running a UnifiedPush distributor needs none of this, and neither does the browser app.'
|
||
paste_none: 'Paste the whole JSON file here'
|
||
paste_unchanged: 'One is on file — leave blank to keep it'
|
||
project: 'Firebase project'
|
||
save: 'Save'
|
||
saved: 'Firebase settings saved.'
|
||
sender_id: 'Sender ID'
|
||
status:
|
||
incomplete: 'Half configured'
|
||
key_only: 'Configured, switched off'
|
||
live: 'Live'
|
||
unconfigured: 'Not configured'
|
||
webpush_note: 'Web Push needs nothing here. Its VAPID keys are environment variables, generated once by app:push:generate-vapid-keys, and they serve browsers, the installed PWA and UnifiedPush distributors alike.'
|
||
queues:
|
||
due_in: 'due in %duration%'
|
||
empty: 'No pending messages.'
|
||
filter_placeholder: 'Filter the whole queue — handler, payload, queue name'
|
||
heading: 'Messenger queues'
|
||
in_flight: 'Running now'
|
||
loading: 'Loading…'
|
||
showing: '%shown% of %total%'
|
||
none_running: 'No worker is holding a message right now.'
|
||
oldest: 'Oldest waiting'
|
||
pending: 'Pending'
|
||
queue: 'Queue'
|
||
queued_for: 'queued %duration%'
|
||
retries: 'retry %count%'
|
||
running: 'Running'
|
||
running_for: 'for %duration%'
|
||
waiting_since: 'Waiting since'
|
||
refresh_hint: 'Live panels refresh every 10s'
|
||
# Shown in a card's header while it is collapsed — short enough to read at
|
||
# a glance, specific enough to be worth expanding for.
|
||
sso:
|
||
clear_secret: 'Forget the stored client secret'
|
||
clear_secret_help: 'Empty the issuer and the client ID as well. Sign-in then falls back to the OIDC_* variables in the environment, or switches off if there are none.'
|
||
env_note: 'Leave issuer, client ID and secret all empty and sign-in falls back to OIDC_ISSUER, OIDC_CLIENT_ID and OIDC_CLIENT_SECRET in the environment, so an installation configured that way keeps working. What is saved here wins over them.'
|
||
field:
|
||
auto_create: 'Create an account for people plMail has not seen'
|
||
auto_create_help: 'On, everybody the provider lets through gets an ordinary account here, so limit who that is at the provider. Off, an administrator creates each account first, with the same address.'
|
||
button_label: 'Name on the button'
|
||
button_label_help: 'The login button reads "Sign in with …" and this name. Empty says "single sign-on".'
|
||
client_id: 'Client ID'
|
||
client_secret: 'Client secret'
|
||
issuer: 'Issuer'
|
||
issuer_help: 'The provider''s issuer URL, exactly as its discovery document states it. In Authentik it is the "OpenID Configuration Issuer" on the provider''s page.'
|
||
require_verified_email: 'Only link an address the provider has verified'
|
||
require_verified_email_help: 'A first sign-in finds its account by email address. Switch this off only where people cannot edit their own address at the provider: with it off, anybody who can is able to claim any account that has not signed in through the provider yet.'
|
||
scopes: 'Scopes'
|
||
scopes_help: 'Separated by spaces. "openid" is always added, and without "email" a first sign-in cannot find its account. Empty asks for openid, email and profile.'
|
||
heading: 'Single sign-on'
|
||
intro: 'Let people sign in through an OpenID Connect provider you already run: Authentik, Keycloak, Authelia and the like. The login page then shows a button above the password form, which stays.'
|
||
redirect_uri_help: 'Register this at the provider as the redirect URI, exactly as shown.'
|
||
save: 'Save'
|
||
saved: 'Single sign-on saved.'
|
||
status:
|
||
environment: 'On, from the environment'
|
||
'off': 'Off'
|
||
'on': 'On'
|
||
summary:
|
||
accounts: '%count% accounts'
|
||
active: '%count% active'
|
||
armed: '%active%/%total% armed'
|
||
down: '%count% down'
|
||
failed: '%count% failed'
|
||
failing: '%count% failing'
|
||
healthy: '%count% healthy'
|
||
idle: 'idle'
|
||
none: 'none'
|
||
ok: '%count% ok'
|
||
queries: '%count% queries'
|
||
queue: '%running% running · %waiting% waiting'
|
||
tables: '%count% tables'
|
||
reset:
|
||
button: 'Reset'
|
||
confirm_label: 'Type %name% to confirm'
|
||
confirm_mismatch: 'That is not %name%, so nothing was deleted. Type the instance name exactly as it is shown.'
|
||
done:
|
||
continue: 'Create the first administrator'
|
||
footnote: 'plMail is back to the state a fresh install starts in.'
|
||
heading: 'plMail has been reset'
|
||
lead: 'All %count% tables were emptied, along with the stored attachments, raw messages and uploads. There are no users left, so this session has been signed out.'
|
||
page_title: 'Reset complete'
|
||
restart_failed: 'The web container could NOT be restarted from here — run the command above yourself before using plMail.'
|
||
restart_sent: 'The web container was asked to restart and comes back on its own. Everything else in the stack still needs the command above.'
|
||
secrets_heading: 'The generated secrets were discarded'
|
||
tagline: 'Nothing left to sign in to'
|
||
workers_failed: 'The workers could not be signalled either, so they keep using the old encryption key until something restarts them.'
|
||
heading: 'Reset data'
|
||
intro: 'This permanently deletes synced data from the database. Each step deletes everything the step above it does, and more.'
|
||
monitoring_kept: 'Monitoring data is kept. Clear the aggregated logs from Logs, and stale heartbeats from Maintenance.'
|
||
postgres_password: >-
|
||
POSTGRES_PASSWORD is not rotated. Postgres was initialised with it and keeps
|
||
it in its own data directory, so regenerating it would leave plMail unable to
|
||
log in to the database it just reset. Changing that one means wiping the
|
||
database volume — docker compose down -v — which this cannot do.
|
||
restart_required: 'Restart the whole stack immediately afterwards, and before using plMail:'
|
||
self_restart: 'The web container asks itself to exit once this page has been sent, and compose brings it straight back. The workers are signalled too; the command above covers the rest of the stack.'
|
||
self_restart_unavailable: 'This process cannot restart itself here, so the command above is the only way. Nothing will happen automatically.'
|
||
stage:
|
||
accounts:
|
||
confirm: 'Delete the accounts as well? Every mailbox password and OAuth connection has to be entered again.'
|
||
deletes: 'The above, plus the accounts themselves, aliases included. Every mailbox password and OAuth connection has to be set up from scratch. Your own sign-in is untouched.'
|
||
title: 'Mail, structure, contacts and accounts'
|
||
contacts:
|
||
confirm: 'Delete every synced message, folder, label and harvested contact?'
|
||
deletes: 'The above, plus harvested contacts. They are collected again from mail as it arrives, so address autocomplete starts empty.'
|
||
title: 'Mail, structure and contacts'
|
||
full:
|
||
button: 'Erase this install'
|
||
deletes: >-
|
||
Everything, not just synced mail: every user (you included), every account
|
||
and its stored password, and the files on disk. The install goes back to
|
||
asking for its first administrator. You are signed out and cannot sign
|
||
back in.
|
||
title: 'Full reset'
|
||
full_secrets:
|
||
button: 'Erase this install and rotate secrets'
|
||
deletes: >-
|
||
Everything above, and the generated secrets. Every service is still
|
||
running with the old APP_ENCRYPTION_KEY in memory and keeps using it
|
||
until restarted, so anything saved before you restart the stack becomes
|
||
unreadable to half of it.
|
||
title: 'Full reset and new secrets'
|
||
structure:
|
||
confirm: 'Delete every synced message, thread, folder and label? The next sync rebuilds them.'
|
||
deletes: 'The above, plus the mailbox structure — folders and labels. The next sync rebuilds both.'
|
||
title: 'Mail and mailbox structure'
|
||
synced_mail:
|
||
confirm: 'Delete every synced message and thread? Accounts and folders stay, and the next sync fetches the mail again.'
|
||
deletes: 'Messages, threads, message parts and anything queued. Accounts, folders and labels stay; the sync cursors are cleared so the next sync fetches everything again.'
|
||
title: 'Synced mail'
|
||
unrecoverable:
|
||
heading: 'Cannot be undone'
|
||
lead: 'Neither of these is recoverable by resyncing: they delete the users, the stored mailbox passwords and the files on disk. Type the instance name to confirm — a click on its own is not enough.'
|
||
restarting:
|
||
back: 'Back to the admin panel'
|
||
continue: 'Continue'
|
||
heading: 'plMail is restarting'
|
||
lead: 'The web container was asked to exit and compose brings it straight back. This page reloads itself in a few seconds.'
|
||
page_title: 'Restarting'
|
||
unavailable_heading: 'Nothing was restarted'
|
||
unavailable_lead: 'This process is not the container''s main process, so it cannot end it. Run this instead:'
|
||
tables:
|
||
heading: 'Table sizes'
|
||
title: 'Admin'
|
||
tokens:
|
||
empty: 'No token refreshes recorded yet.'
|
||
heading: 'OAuth token health'
|
||
webhooks:
|
||
armed: 'Armed'
|
||
delivery:
|
||
endpoint: 'Push endpoint'
|
||
endpoint_hint: >-
|
||
The Cloud Pub/Sub push subscription must POST to exactly this
|
||
URL, token included. A mismatch is answered with 403 and shows
|
||
up below.
|
||
heading: 'Delivery path'
|
||
info_logs_off: >-
|
||
Successful deliveries are logged at info level and not stored.
|
||
Set APP_DB_LOG_LEVEL=info to see them here.
|
||
no_public_url: >-
|
||
APP_PUBLIC_URL is not an https:// address, so Pub/Sub cannot
|
||
reach this server.
|
||
no_token: >-
|
||
GMAIL_PUBSUB_VERIFICATION_TOKEN is not set. The endpoint fails
|
||
closed, so every notification is rejected with 403.
|
||
topic: 'Pub/Sub topic'
|
||
empty: 'No Gmail accounts with watch state.'
|
||
health: 'Health'
|
||
health_state:
|
||
active: 'delivering'
|
||
degraded: 'registered, not delivering'
|
||
inactive: 'off'
|
||
lapsed: 'expired'
|
||
heading: 'Gmail webhooks'
|
||
history_id: 'History ID'
|
||
last_push: 'Last push'
|
||
never: 'never'
|
||
none: 'not registered'
|
||
resource: 'Resource'
|
||
state:
|
||
account_active: 'account active'
|
||
account_inactive: 'account disabled'
|
||
push_off: 'push off'
|
||
push_on: 'push on'
|
||
watch_expiry: 'Watch expiry'
|
||
updates:
|
||
heading: 'Updates'
|
||
header: '%version% is available'
|
||
intro: 'plMail checks every hour whether the channel you follow has published a newer build, and tells the administrators once per build: a notification on each device they have registered for push, and a note at the top of this area.'
|
||
saved: 'Channel saved.'
|
||
channel:
|
||
label: 'Follow'
|
||
save: 'Save'
|
||
follows_build: ' Nobody has chosen yet, so this follows the build that is running.'
|
||
releases:
|
||
name: 'Releases'
|
||
hint: 'Every tagged release: the image tagged latest. Right for most installations.'
|
||
main:
|
||
name: 'Main'
|
||
hint: 'Every build of the main branch as soon as it is published: the image tagged main. This is what is being worked on, and the changelog does not describe it yet.'
|
||
'off':
|
||
name: 'Off'
|
||
hint: 'No checks. Nothing is sent anywhere for this.'
|
||
state:
|
||
available: 'Update available'
|
||
current: 'Up to date'
|
||
failed: 'No answer'
|
||
incomparable: 'Cannot compare'
|
||
'off': 'Off'
|
||
unknown: 'Not checked yet'
|
||
running: 'This installation'
|
||
newest:
|
||
releases: 'Newest release'
|
||
main: 'Newest main build'
|
||
built_at: 'built %when%'
|
||
not_yet: 'Not checked yet'
|
||
incomparable: 'This build has no commit stamped into it (a checkout, or an image built without the release workflow), so there is nothing to compare the channel''s newest build with.'
|
||
checked: 'Last checked'
|
||
never: 'never'
|
||
check_now: 'Check now'
|
||
error: 'The last check got no answer: %error%.'
|
||
error_kept: ' What is shown is from the last check that did.'
|
||
changes:
|
||
heading: 'What is new'
|
||
count: '{1}One change since this build|]1,Inf[%count% changes since this build'
|
||
all: 'Every change on GitHub'
|
||
changelog: 'Changelog'
|
||
how:
|
||
heading: 'Updating'
|
||
body: 'Pull the new image and recreate the containers; on a NAS, redeploy the app. plMail migrates its database when it starts, so read the changelog first for anything under "Before you upgrade".'
|
||
privacy: 'A check asks the registry for the newest %image% image and api.github.com what changed since this build. Nothing about this installation is sent beyond the requests themselves.'
|
||
push:
|
||
title: 'plMail %version% is available'
|
||
body: 'You are running %running%. Open Admin → Updates to see what changed.'
|
||
users:
|
||
add: Add user
|
||
console_note: 'Passwords and two-factor recovery are handled from the server console, not here — `app:user:password` and `app:user:2fa-disable`. An administrator who could change either from a browser would be a second way into every mailbox on this install.'
|
||
deactivate: Switch off
|
||
deactivate_confirm: 'Switch off %name%? They will not be able to sign in, and any mail client already connected stops too. Nothing of theirs is deleted, and you can switch them back on here.'
|
||
deactivated: 'Switched off'
|
||
deactivated_since: 'Switched off since %when%'
|
||
delete: Remove user
|
||
delete_confirm: 'Remove %name%? Their mail stays in the database but they can no longer sign in.'
|
||
edit: Edit user
|
||
field:
|
||
email: Email address
|
||
is_admin: Administrator
|
||
is_admin_help: 'Can reach this panel, manage users and configure providers. Cannot read anyone else''s mail.'
|
||
name_first: First name
|
||
name_last: Last name
|
||
password: Initial password
|
||
password_help: 'Set once, when the account is created. There is no way to change it from here afterwards: a forgotten password is reset from the server console with `app:user:password`.'
|
||
flash:
|
||
deactivated: 'Switched off. They cannot sign in until you switch them back on.'
|
||
demote_last_refused: 'That is the last administrator, so the checkbox was left as it was — promote somebody else first.'
|
||
demote_self_refused: 'You cannot take administrator away from yourself. Everything else on the form was saved.'
|
||
reactivated: 'Switched back on. They can sign in again.'
|
||
heading: Users
|
||
last_login: 'Last seen %when%'
|
||
never_signed_in: Never signed in
|
||
no_password_edit: 'Passwords cannot be changed from here. Setting someone else''s password would make an admin session a way into their mailbox — the same reason removing a second factor is a console command.'
|
||
none: No users yet.
|
||
reactivate: Switch back on
|
||
role:
|
||
admin: Admin
|
||
search: Search users…
|
||
two_factor_on: Two-factor authentication is on
|
||
two_factor_short: 2FA
|
||
version:
|
||
hint: The build this installation is running — the release, and the commit it was built from.
|
||
alias:
|
||
added: 'Address added.'
|
||
catch_all_added: 'Catch-all domain added.'
|
||
catch_all_duplicate: 'That domain is already a catch-all on this account.'
|
||
catch_all_invalid: "That doesn't look like a domain. Enter it like example.com."
|
||
catch_all_removed: 'Catch-all domain removed.'
|
||
catch_all_unsupported: 'Gmail and Outlook only send as addresses the provider knows, so a catch-all domain cannot be used on this account.'
|
||
deleted: 'Address removed.'
|
||
duplicate: 'That address is already on this account.'
|
||
invalid: "That doesn't look like a valid email address."
|
||
name_cleared: 'Sender name removed. This address sends under the account name again.'
|
||
name_set: 'Sender name saved.'
|
||
primary_set: 'Primary address updated.'
|
||
refreshed: 'Refreshed from provider.'
|
||
status_blocked: "The primary address can't be disabled — make another primary first."
|
||
status_set: 'Address updated.'
|
||
|
||
app:
|
||
name: Mail
|
||
|
||
attachment:
|
||
sign:
|
||
# A VISUAL signature: a picture of a name on a page. Nothing here may
|
||
# suggest it proves the document is unaltered — it is not PAdES, there
|
||
# is no certificate, and saying otherwise would be a lie about what the
|
||
# software does.
|
||
action: Sign
|
||
draw: Draw your signature, then place it on the page.
|
||
clear: Start over
|
||
cancel: Cancel
|
||
place: Place on page
|
||
hint: Drag it where it belongs, then attach it to a reply.
|
||
download: Download signed copy
|
||
reply: Reply with signed copy
|
||
protected: This PDF is protected, so it cannot be signed here. Reading it still works.
|
||
unreadable: This PDF cannot be edited here. Reading it still works.
|
||
use_saved: Use saved signature
|
||
preview:
|
||
download: Download
|
||
failed: This PDF could not be opened. You can still download it.
|
||
loading: Opening…
|
||
untitled: Attachment
|
||
zoom_in: Zoom in
|
||
zoom_out: Zoom out
|
||
calendar:
|
||
# plMail's date-and-time picker; see calendar--when.
|
||
when:
|
||
previous_month: 'Previous month'
|
||
next_month: 'Next month'
|
||
send_at: 'Send at'
|
||
group: 'Start and end'
|
||
today: 'Today'
|
||
tomorrow: 'Tomorrow'
|
||
same_day: 'Same day'
|
||
same_short: 'Same'
|
||
another_day: 'Another day'
|
||
back_to_week: 'Back to this week'
|
||
hour: 'Hour'
|
||
minute: 'Minute'
|
||
half: 'Morning or afternoon'
|
||
another_minute: 'Another minute'
|
||
quarter_hours: 'Quarter hours'
|
||
exact_minute: 'Exact minute'
|
||
minutes: '%count% min'
|
||
hours: '%count% h'
|
||
day_one: '1 day'
|
||
days: '%count% days'
|
||
length: 'Length'
|
||
default_name: Personal
|
||
alert:
|
||
mail:
|
||
subject: 'Reminder: %title%'
|
||
untitled: Untitled event
|
||
booking:
|
||
action:
|
||
delete: 'Delete the booking page "%name%"'
|
||
disable: 'Switch off the booking page "%name%"'
|
||
edit: 'Edit the booking page "%name%"'
|
||
enable: 'Switch on the booking page "%name%"'
|
||
regenerate: 'Give the booking page "%name%" a new address'
|
||
badge: Booked through your booking page
|
||
booked:
|
||
body: 'Your %name% is in the diary.'
|
||
mail: A confirmation with a calendar file is on its way to you.
|
||
title: That is booked
|
||
confirm: Confirm the booking
|
||
count: '{0}No booking pages|{1}1 booking page|]1,Inf[ %count% booking pages'
|
||
day_none: Nothing free
|
||
delete_confirm: 'Delete "%name%"? The appointments already booked through it go with it.'
|
||
disabled: 'Off'
|
||
duration: '{1} 1 minute|]1,Inf[ %count% minutes'
|
||
empty_list: No booking pages yet.
|
||
error:
|
||
no_calendar: Choose a calendar that accepts changes for bookings to land on.
|
||
taken: That time has just been taken. Please choose another.
|
||
too_many: >-
|
||
That is a lot of bookings from one place. Please wait a while
|
||
before trying again.
|
||
form:
|
||
add: New booking page
|
||
buffer_help: Quiet time left either side of anything already in the diary.
|
||
buffer_minutes: Buffer (minutes)
|
||
busy: Check these calendars for clashes
|
||
busy_help: >-
|
||
A time is only offered when nothing on these calendars overlaps
|
||
it. The calendar bookings land on is always checked, whether or
|
||
not it is ticked here.
|
||
calendar: Bookings land on
|
||
calendar_help: >-
|
||
Where the appointment is written. If that calendar syncs
|
||
somewhere, the booking goes with it.
|
||
day_end: Until
|
||
day_start: From
|
||
description: What this is about
|
||
edit: Edit booking page
|
||
horizon_days: Bookable up to (days ahead)
|
||
name: What the appointment is called
|
||
name_help: >-
|
||
Shown to whoever opens the link, and used as the title in your
|
||
calendar.
|
||
notice_minutes: Shortest notice (minutes)
|
||
slot_minutes: Appointment length (minutes)
|
||
time_zone: Your hours are in
|
||
time_zone_help: >-
|
||
The hours above are wall clock in this zone, so 09:00 stays nine
|
||
in the morning when the clocks change.
|
||
weekdays: Days you are bookable
|
||
lands_on: 'lands on %calendar%'
|
||
no_slots: There are no free times at the moment. Try again later.
|
||
no_slots_this_week: No free times this week. Try the week either side.
|
||
note: Anything else? (optional)
|
||
pick_a_time: Pick a time
|
||
toast:
|
||
created: Booking page created. Copy its address now — it is not shown again.
|
||
deleted: Booking page deleted.
|
||
disabled: Booking page switched off.
|
||
enabled: Booking page switched on.
|
||
regenerated: New address. The old one no longer works.
|
||
updated: Booking page updated.
|
||
weekday:
|
||
1: Mon
|
||
2: Tue
|
||
3: Wed
|
||
4: Thu
|
||
5: Fri
|
||
6: Sat
|
||
7: Sun
|
||
your_email: Your email
|
||
your_email_help: The confirmation and the calendar file go here.
|
||
your_name: Your name
|
||
zone: 'Times shown in %zone%'
|
||
chip:
|
||
on_calendars: 'On %calendars%'
|
||
delete_confirm: 'Delete "%name%" and every event on it? This cannot be undone.'
|
||
empty: Nothing coming up
|
||
details:
|
||
description: Description
|
||
edit: Edit
|
||
extracted_hint: plMail read this event out of that message. Nobody typed it in.
|
||
participants: Participants
|
||
provenance: From this email
|
||
recurring: Repeating event
|
||
status: Status
|
||
until: until %date%
|
||
your_answer: Your answer
|
||
error:
|
||
instance_create: >-
|
||
One occurrence cannot be added to a calendar on its own. Choose "All
|
||
events" to put this meeting on another calendar.
|
||
invalid_times: 'Those times do not work — the end has to come after the start.'
|
||
no_copies: 'Nothing was chosen, so nothing was changed. Tick at least one calendar.'
|
||
read_only: 'This event is only on calendars that do not accept changes, so it was left where it was.'
|
||
event:
|
||
alert:
|
||
action:
|
||
display: Notification
|
||
email: Email
|
||
amount:
|
||
days: '{1} 1 day|]1,Inf[ %count% days'
|
||
hours: '{1} 1 hour|]1,Inf[ %count% hours'
|
||
minutes: '{1} 1 minute|]1,Inf[ %count% minutes'
|
||
at_absolute: 'At %when%'
|
||
at_time: At the time of the event
|
||
custom: Something else, in minutes
|
||
custom_action: How the extra reminder arrives
|
||
day_1: 1 day before
|
||
hour_1: 1 hour before
|
||
legend: Reminders
|
||
minutes_10: 10 minutes before
|
||
minutes_30: 30 minutes before
|
||
minutes_5: 5 minutes before
|
||
relation:
|
||
after_end: '%amount% after the end'
|
||
after_start: '%amount% after the start'
|
||
before_end: '%amount% before the end'
|
||
before_start: '%amount% before the start'
|
||
series_note: >-
|
||
Reminders belong to the whole event, so the choice below does
|
||
not apply to them.
|
||
unreadable: Reminder set somewhere else
|
||
all_day: All day
|
||
calendar: Calendar
|
||
cancel: Cancel
|
||
copies:
|
||
help: >-
|
||
Ticked calendars get this event and every change you save to it.
|
||
Unticking one does not remove it: that calendar keeps the copy it
|
||
has now and stops receiving updates, so it will show up as its own
|
||
entry once the two no longer match.
|
||
hidden: This calendar is hidden, so the event will not show until you show it
|
||
legend: Calendars
|
||
mirrored: 'This calendar syncs with its provider, so the event reaches your other devices'
|
||
read_only: This calendar does not accept changes
|
||
same_remote: 'Already covered: this mirrors the same calendar as one ticked above'
|
||
delete: Delete
|
||
description: Description
|
||
details_heading: 'Event'
|
||
dismiss: Not an event
|
||
dismiss_confirm: >-
|
||
Remove this event and stop it coming back? Later emails about the
|
||
same booking will not put it on the calendar again.
|
||
ends: Ends
|
||
error:
|
||
end_before_start: The end has to come after the start.
|
||
summary: This event could not be saved.
|
||
title_required: Give this event a title.
|
||
extracted_note: >-
|
||
This event was found in an email. Editing it stops later messages
|
||
about the same booking from overwriting your changes.
|
||
location: Location
|
||
new: New event
|
||
new_on: New event on %date%
|
||
repeat: Repeat
|
||
repeats: Repeats
|
||
save: Save
|
||
scope:
|
||
instance: This event
|
||
instance_note: >-
|
||
"This event" changes only the occurrence you opened, so it cannot
|
||
add the meeting to a calendar it is not on yet.
|
||
legend: Apply to
|
||
series: All events
|
||
starts: Starts
|
||
title: Title
|
||
form:
|
||
add: New calendar
|
||
color: Colour
|
||
edit: Edit calendar
|
||
name: Name
|
||
time_zone: Time zone
|
||
time_zone_help: >-
|
||
The zone this calendar is read in, and the one an event that carries
|
||
no zone of its own is shown in.
|
||
grid:
|
||
all_day: All day
|
||
continues_after: Carries on into the next day
|
||
continues_before: Started the day before
|
||
keyboard_hint: >-
|
||
Hold Alt and use the arrow keys to move this event; add Shift to
|
||
change how long it lasts. Enter saves it, Escape puts it back.
|
||
pending: >-
|
||
Moved to %start% – %end%. Press Enter to save, or Escape to put it
|
||
back.
|
||
read_only: This calendar does not accept changes, so this event cannot be moved.
|
||
reverted: Left where it was.
|
||
until: until %when%
|
||
ics:
|
||
error:
|
||
no_calendar: Choose a calendar to put the events on.
|
||
no_file: >-
|
||
Choose an .ics file. If you did choose one, it may be larger
|
||
than plMail will read.
|
||
no_url: Enter the address the calendar is published at.
|
||
export:
|
||
calendar: Download "%name%" as a calendar file
|
||
calendar_title: Download as .ics
|
||
event: Download .ics
|
||
import:
|
||
calendar: Add them to
|
||
dedup_note: >-
|
||
An event already on this calendar is updated rather than added
|
||
twice, and one already on another of your calendars — from an
|
||
invitation, or from a calendar you mirror — is left where it is.
|
||
file: Calendar file
|
||
file_help: An .ics file, up to %size% MB.
|
||
intro: >-
|
||
Reads an .ics file — an export from another calendar, or an
|
||
invitation somebody sent you — onto one of your calendars.
|
||
no_calendars: >-
|
||
None of your calendars accepts new events. A mirrored calendar
|
||
is a read-only copy; make one of your own first.
|
||
submit: Import
|
||
title: Import a calendar file
|
||
subscribe:
|
||
address: Calendar address
|
||
address_help: >-
|
||
The address a calendar is published at, ending in .ics. A
|
||
webcal:// link works too — it is the same address under another
|
||
name.
|
||
connect: Subscribe to an address
|
||
intro: >-
|
||
Follow a calendar somebody publishes: public holidays, a fixture
|
||
list, or the secret address your own Google or Outlook calendar
|
||
offers. plMail re-reads it in the background and shows it beside
|
||
your own calendars.
|
||
name: Name
|
||
name_help: What to call it here. Left empty, the calendar names itself.
|
||
read_only_note: >-
|
||
A subscribed calendar is read-only — it is a copy of a published
|
||
file, so changes made here could never reach it. Anyone who has
|
||
this address can read the calendar, so treat a secret one like a
|
||
password.
|
||
submit: Subscribe
|
||
title: Subscribe to a calendar address
|
||
toast:
|
||
import_empty: >-
|
||
That file holds no events plMail can read. Check that it is a
|
||
calendar export rather than something else.
|
||
import_nothing_new: >-
|
||
Nothing to add — every event in that file is already on your
|
||
calendars.
|
||
imported: '%added% added, %updated% updated, %skipped% skipped.'
|
||
subscribed: >-
|
||
Subscribed — the calendar will fill in within a minute.
|
||
invite:
|
||
action:
|
||
accepted: Yes
|
||
declined: 'No'
|
||
needs_action: No reply
|
||
tentative: Maybe
|
||
attendees: '%count% invited'
|
||
cancelled: This meeting has been called off.
|
||
held:
|
||
applied: 'Change applied.'
|
||
apply: 'Apply the change'
|
||
hint: 'This message asks to change this event, but it was not sent by whoever the event came from (%sender%). Nothing was changed.'
|
||
not_applied: 'That change could not be applied — a newer one is already in place, or you have edited the event yourself.'
|
||
offer:
|
||
accepted: Add to calendar
|
||
declined: No thanks
|
||
hint: "Attached to this message — nothing has been added to your calendar."
|
||
status:
|
||
accepted: In your calendar
|
||
declined: Not added
|
||
organiser: Organised by %name%
|
||
organiser_tag: organiser
|
||
placed: '%title% is in your calendar: %when%.'
|
||
reply:
|
||
body: '%name% has responded %status% to this invitation.'
|
||
status:
|
||
accepted: Accepted
|
||
declined: Declined
|
||
needs_action: No reply
|
||
tentative: Maybe
|
||
toast:
|
||
added: Added to your calendar.
|
||
not_added: Left off your calendar.
|
||
not_sent: >-
|
||
Your answer was saved here, but the reply could not be sent to
|
||
the organiser.
|
||
sent: Your answer has been sent to the organiser.
|
||
kind:
|
||
call: Call
|
||
delivery: Delivery
|
||
dining: Reservation
|
||
event: Appointment
|
||
flight: Flight
|
||
lodging: Stay
|
||
meeting: Meeting
|
||
order: Order
|
||
rental: Rental
|
||
ticket: Ticket
|
||
train: Train
|
||
more_count: '%count% more'
|
||
nav:
|
||
next: Next
|
||
previous: Previous
|
||
open_day: 'Everything on %date%'
|
||
pane:
|
||
mode:
|
||
calendar: Show the calendar full width
|
||
mail: Show the mail
|
||
split: Show the calendar beside the mail
|
||
resize: Resize the calendar
|
||
proposal:
|
||
action:
|
||
add: Add to calendar
|
||
dismiss: Not an event
|
||
explain: >-
|
||
Found in this message — nothing has been added to your calendar.
|
||
toast:
|
||
added: Added to your calendar.
|
||
dismissed: >-
|
||
Dismissed — this date will not be offered again, however often
|
||
this message is read.
|
||
no_calendar: >-
|
||
There is no calendar to add this to, so nothing was saved.
|
||
untitled: (no subject)
|
||
repeat:
|
||
daily: Every day
|
||
keep: Keep the current rule
|
||
monthly: Every month
|
||
none: Does not repeat
|
||
weekly: Every week
|
||
yearly: Every year
|
||
share:
|
||
action:
|
||
delete: 'Delete the link "%name%"'
|
||
edit: 'Edit the link "%name%"'
|
||
regenerate: 'Give the link "%name%" a new address'
|
||
revoke: 'Revoke the link "%name%"'
|
||
all_day: All day
|
||
busy: Busy
|
||
busy_free_only: This link shows when the calendar is busy, and nothing else.
|
||
count: '{0}No shared links|{1}1 shared link|]1,Inf[ %count% shared links'
|
||
covers: '{0}no calendars|{1}1 calendar|]1,Inf[ %count% calendars'
|
||
day_free: Nothing on this day.
|
||
delete_confirm: 'Delete "%name%"? Anyone still holding its address loses it.'
|
||
detail:
|
||
description: Description
|
||
location: Location
|
||
participants: Who is coming
|
||
title: Titles
|
||
empty: Nothing in this window.
|
||
empty_list: No shared links yet.
|
||
footer: Shared calendar
|
||
form:
|
||
add: New shared link
|
||
calendars: Which calendars
|
||
days: days ahead
|
||
edit: Edit shared link
|
||
ends_on: Last day
|
||
name: What you call it
|
||
name_help: >-
|
||
Only you see this. It is how you find the link again to change or
|
||
revoke it.
|
||
reveals: What this link reveals
|
||
reveals_help: >-
|
||
With none of these ticked, the link shows only when the calendar
|
||
is busy. Each box adds one thing on top. An event marked private
|
||
stays a plain busy block whatever is ticked here.
|
||
rolling_days: Days ahead
|
||
starts_on: First day
|
||
token_note: >-
|
||
The address is shown once, when it is created. It is not stored,
|
||
so it cannot be shown again — if you lose it, give the link a new
|
||
one.
|
||
window: How far it reaches
|
||
heading: Shared calendar
|
||
minted:
|
||
heading: The address for this link
|
||
once: >-
|
||
Copy it now. It is not stored anywhere, so this is the only time
|
||
it can be shown.
|
||
not_shared: Not shared
|
||
outside_window: Days outside the shared window
|
||
page_title: Shared calendar
|
||
reveals: 'Reveals %details%'
|
||
reveals_busy_free: Busy/free only
|
||
revoked: Revoked
|
||
subscribe: Add to your calendar
|
||
toast:
|
||
created: Link created. Copy its address now — it is not shown again.
|
||
deleted: Link deleted.
|
||
regenerated: New address. The old one no longer works.
|
||
revoked: Link revoked.
|
||
updated: Link updated.
|
||
window:
|
||
fixed: Between two dates
|
||
rolling: A rolling window from today
|
||
window_label: '%from% – %to%'
|
||
zone: 'Times shown in %zone%'
|
||
soon:
|
||
next: 'Next'
|
||
empty: Nothing coming up
|
||
empty_hint: >-
|
||
Appointments in your calendar, and the flights, deliveries,
|
||
reservations and tickets found in your mail, appear here for the
|
||
next two weeks.
|
||
from: 'From %subject%'
|
||
open: What is happening soon
|
||
title: Happening soon
|
||
untitled: (no subject)
|
||
title: Calendar
|
||
status:
|
||
cancelled: Cancelled
|
||
confirmed: Confirmed
|
||
tentative: Tentative
|
||
toast:
|
||
created: Calendar created
|
||
default_set: New events will land here
|
||
deleted: Calendar deleted
|
||
disconnected: Server disconnected
|
||
disconnected_kept: >-
|
||
Server disconnected — %count% event(s) that came from mail rather
|
||
than from a calendar were moved to your default calendar.
|
||
event_saved: Event saved
|
||
hidden: Calendar hidden
|
||
saved_on_hidden: >-
|
||
Event saved on %calendars%, which is hidden — show that calendar to
|
||
see it.
|
||
shown: Calendar shown
|
||
subscriptions_saved: Subscriptions saved
|
||
subscriptions_saved_kept: >-
|
||
Subscriptions saved — %count% event(s) that came from mail rather
|
||
than from the calendar were moved to your default calendar.
|
||
subscriptions_unchanged: Nothing changed
|
||
sync_queued: Syncing now — this calendar will update in a moment.
|
||
updated: Calendar updated
|
||
today: Today
|
||
toolbar:
|
||
range: '%start% – %end%'
|
||
range_day: '%day%'
|
||
upcoming:
|
||
imminent: Starting within the hour
|
||
later: Coming up today
|
||
soon: Coming up in a few hours
|
||
view:
|
||
agenda: Agenda
|
||
day: Day
|
||
monday_week: Week
|
||
month: Month
|
||
week: '7 days'
|
||
|
||
clipboard:
|
||
copied: Copied
|
||
copy_failed: Copy failed
|
||
|
||
compose:
|
||
# Shown in the dock when clicking Compose does not produce a window —
|
||
# a 5xx, an expired session, a dead connection. Turbo's own answer to all
|
||
# three is four words of untranslated English in the corner.
|
||
ai:
|
||
accept: 'Insert'
|
||
disabled: 'The writing help is switched off.'
|
||
discard: 'Discard'
|
||
disclaimer: 'Written by a model. Read it before you send it.'
|
||
error:
|
||
not_pulled: 'The model host does not have that model. An administrator has to pull it first.'
|
||
refused: 'The model host refused the request.'
|
||
timeout: 'The model host took too long to answer.'
|
||
failed: 'The request could not be sent.'
|
||
label: 'Help me write'
|
||
no_answer: 'The model host gave no answer.'
|
||
preview: 'Suggested text, not yet in your message'
|
||
prompt:
|
||
# The disclosure in the assistant's panel that opens the writer's
|
||
# own standing instruction for editing. Deliberately not "system
|
||
# prompt" on the button: the box holds the writer's note, not the
|
||
# application's instructions, and naming it after the whole prompt
|
||
# would promise reach it does not have.
|
||
toggle: 'Instructions'
|
||
title: 'Change the instructions for the next attempt'
|
||
label: 'How you want to be written for'
|
||
placeholder: 'e.g. Keep it to three sentences and never open with "I hope this finds you well".'
|
||
retry: 'Try again with this'
|
||
# Says the two things somebody will otherwise find out the hard way:
|
||
# this attempt only, and Settings is where it sticks.
|
||
hint: 'This composer only. Settings → AI is where a lasting one is saved.'
|
||
rate: '%count% tokens · %rate% a second'
|
||
regenerate: 'Try again'
|
||
slow_hint: 'The first request after a while takes about fifteen seconds while the model loads.'
|
||
state:
|
||
done: 'Finished. Nothing has gone into your message yet.'
|
||
sent: 'Sent to the model…'
|
||
stopped: 'Stopped. Keep what arrived, or throw it away.'
|
||
stop: 'Stop'
|
||
task:
|
||
formal: 'Make it more formal'
|
||
proofread: 'Fix spelling and grammar'
|
||
reply: 'Draft a reply'
|
||
shorten: 'Make it shorter'
|
||
timing: 'Model load %load%s · %count% tokens in %seconds%s · %total%s in total'
|
||
working: 'Writing…'
|
||
open_failed:
|
||
dismiss: Dismiss
|
||
failed: The compose window could not be opened. Please try again.
|
||
offline: The compose window could not be opened — you appear to be offline.
|
||
signed_out: Your session has expired. Reload the page and sign in again.
|
||
no_account:
|
||
body: Add a mailbox first, and you can write from it right away.
|
||
cta: Add a mail account
|
||
heading: No mail account yet
|
||
font_family:
|
||
label: Typeface
|
||
monospace: Monospace
|
||
sans: Sans serif
|
||
serif: Serif
|
||
font_size:
|
||
huge: Huge
|
||
label: Text size
|
||
large: Large
|
||
normal: Normal
|
||
small: Small
|
||
align:
|
||
center: Align center
|
||
left: Align left
|
||
right: Align right
|
||
confirm:
|
||
no_body: This message has no text.
|
||
no_subject: This message has no subject.
|
||
send_anyway: Send it anyway?
|
||
plain_text: Switching to plain text removes all formatting from this message. Continue?
|
||
open_variables: 'A template placeholder has not been filled in.'
|
||
# Every label inside the emoji picker. The component ships its own English
|
||
# strings and takes a replacement object; this is that object, so the
|
||
# picker is as translated as the window around it.
|
||
emoji:
|
||
activities: Activities
|
||
animals_nature: Animals and nature
|
||
categories: Categories
|
||
custom: Custom
|
||
favorites: Frequently used
|
||
flags: Flags
|
||
food_drink: Food and drink
|
||
loading: "Loading…"
|
||
network_error: The emoji could not be loaded.
|
||
objects: Objects
|
||
people_body: People and body
|
||
region: Emoji picker
|
||
search: Search
|
||
search_description: When results appear, press up or down to select one and enter to choose it.
|
||
search_results: Search results
|
||
skin_tone: "Choose a skin tone (currently {skinTone})"
|
||
skin_tone_description: When expanded, press up or down to select one and enter to choose it.
|
||
skin_tones: Skin tones
|
||
smileys_emotion: Smileys and emoticons
|
||
symbols: Symbols
|
||
tone_dark: Dark
|
||
tone_default: Default
|
||
tone_light: Light
|
||
tone_medium: Medium
|
||
tone_medium_dark: Medium-dark
|
||
tone_medium_light: Medium-light
|
||
travel_places: Travel and places
|
||
unsupported: This browser cannot show colour emoji.
|
||
list:
|
||
ordered: Numbered list
|
||
unordered: Bullet list
|
||
priority:
|
||
high: High
|
||
label: Priority
|
||
low: Low
|
||
# Distinct from Normal on purpose: an untouched message says nothing
|
||
# about its urgency and carries no priority headers at all.
|
||
none: No priority
|
||
normal: Normal
|
||
quote:
|
||
hide: hide quoted text
|
||
show: show quoted text
|
||
schedule:
|
||
cancel: Cancel scheduled send
|
||
confirm: Schedule send
|
||
custom: Pick date & time
|
||
error:
|
||
past: That time has already passed.
|
||
too_far: Mail can be held for at most %days% days.
|
||
too_soon: Pick a time at least a minute from now.
|
||
unreadable: That is not a date and time.
|
||
heading: Send later
|
||
monday_morning: Monday morning
|
||
scheduled_for: Scheduled to send
|
||
timezone_hint: Times are in %zone%.
|
||
toast: Scheduled for %when%
|
||
# The toast's own action label. `cancel` is the menu's, where there is
|
||
# room to say which send is meant; in a toast beside the sentence that
|
||
# just named it, the long form pushes the message onto four lines.
|
||
toast_cancel: Cancel send
|
||
tomorrow_afternoon: Tomorrow afternoon
|
||
tomorrow_morning: Tomorrow morning
|
||
when: '%date%, %time%'
|
||
status:
|
||
pending_many: "%count% more characters to save"
|
||
pending_one: one more character to save
|
||
save_failed: Could not save the draft
|
||
saved: Draft saved
|
||
saving: "Saving…"
|
||
uploading: "Uploading…"
|
||
# Why an upload was refused. The compose window prints these as-is on its
|
||
# status line, so they are the whole of the explanation the user gets.
|
||
upload:
|
||
failed: Upload failed
|
||
images_only: Only images can be placed in the message body
|
||
over_limit: "File too large (max %limit% MB)"
|
||
post_too_large: Upload too large
|
||
too_large: File too large
|
||
add_bcc: Add Bcc recipients
|
||
add_cc: Add Cc recipients
|
||
attach: Attach files
|
||
attach_failed: Could not attach
|
||
attach_remove_failed: Could not remove attachment
|
||
attach_too_large: "%name% is over %limit% MB"
|
||
bcc: Bcc
|
||
bold: Bold
|
||
cc: Cc
|
||
click_to_cancel: click to cancel
|
||
continue_editing: Continue editing
|
||
discard: Delete draft
|
||
empty_draft: (empty draft)
|
||
encrypt: Encrypt message
|
||
# The whole of what the disabled encrypt button says for itself. It has to
|
||
# be a complete sentence: it is the only explanation anyone gets.
|
||
encrypt_unavailable: Encryption is not available yet.
|
||
expand: Expand
|
||
formatting: Formatting options
|
||
forward: Forward
|
||
from: From
|
||
image: Insert image
|
||
image_insert_failed: Could not place the image in the message
|
||
indent: Indent
|
||
insert_emoji: Insert emoji
|
||
insert_link: Insert link
|
||
invalid_address: "“%address%” is not a valid email address"
|
||
italic: Italic
|
||
# The insert-link popover, both of its faces. Nothing here is spelled in
|
||
# JavaScript: the controller reads the four strings it writes at runtime
|
||
# out of a data-…-i18n-value object Twig fills from these keys.
|
||
link:
|
||
add: Insert link
|
||
apply: Apply
|
||
cancel: Cancel
|
||
change: Change
|
||
dialog: Link
|
||
edit: Edit link
|
||
heading: Link
|
||
invalid: Enter a web address.
|
||
open: Open
|
||
remove: Remove link
|
||
text_label: Text to display
|
||
text_placeholder: The words that carry the link
|
||
unsafe: Only web, mail and telephone addresses can be linked.
|
||
url_label: Web address
|
||
url_placeholder: "example.com"
|
||
minimize: Minimize
|
||
more_fields: Show From, Cc, Bcc and subject
|
||
more_options: More options
|
||
new_message: New Message
|
||
outdent: Outdent
|
||
plain_text: Plain text mode
|
||
# The warning that used to be a browser confirm(). The question itself is
|
||
# still compose.confirm.plain_text — only the frame around it is new.
|
||
plain_warning:
|
||
cancel: Keep formatting
|
||
continue: Continue
|
||
title: Remove formatting?
|
||
pop_out: Open in compose window
|
||
send_warning:
|
||
cancel: Keep editing
|
||
continue: Send anyway
|
||
title: Send this message?
|
||
read_receipt: Request read receipt
|
||
recipient_required: Add at least one recipient before sending.
|
||
redo: Redo
|
||
reply: Reply
|
||
reply_all: Reply all
|
||
save_and_close: Save draft and close
|
||
send: Send
|
||
send_options: Send options
|
||
sending: "Sending…"
|
||
signature: Insert signature
|
||
signature_none: No signature set for this address
|
||
subject_label: Subj
|
||
subject_placeholder: Subject
|
||
text_color: Text colour
|
||
to: To
|
||
underline: Underline
|
||
undo: Undo
|
||
body_placeholder: "Write your message…"
|
||
attachment_remove: Remove attachment
|
||
# The template picker in the compose window. The templates themselves
|
||
# are written in Settings → Templates (settings.templates).
|
||
template:
|
||
all_accounts: 'All accounts'
|
||
empty: 'No templates yet. Write one in Settings, or save this message as one.'
|
||
failed: 'That template could not be loaded.'
|
||
insert: 'Insert template'
|
||
loading: 'Loading templates…'
|
||
manage: 'Manage templates'
|
||
no_match: 'No template with that name.'
|
||
nothing_to_save: 'There is no text here to save as a template.'
|
||
save_draft: 'Save this message as a template'
|
||
saved: 'Saved as template “%name%”. Rename or move it in Settings.'
|
||
search: 'Find a template'
|
||
untitled: 'Untitled template'
|
||
|
||
demo:
|
||
bar:
|
||
title: Demo
|
||
blurb: A throwaway mailbox. Nothing here is real, and nothing you send leaves the server.
|
||
next: 'Next up: %subject%'
|
||
receive: Receive mail
|
||
flash:
|
||
blocked: Connecting a real mailbox is switched off on the demo.
|
||
login:
|
||
blurb: Take a look around plMail with a mailbox of your own — no sign-up, no address needed.
|
||
start: Start the demo
|
||
disclaimer: Your demo mailbox is deleted automatically after a couple of hours.
|
||
privacy:
|
||
account: >-
|
||
Starting the demo creates a throwaway account with a randomly generated
|
||
address. You are not asked for a name, an email address or a password, and
|
||
none is stored. Anything you type into it — messages, drafts, calendar
|
||
entries — exists only in that account and is deleted with it, automatically,
|
||
about %ttl% after it was created. Mail written in the demo is never sent:
|
||
there is no connection to any mail server.
|
||
account_title: The demo account
|
||
complaint: >-
|
||
You also have the right to lodge a complaint with a data protection
|
||
supervisory authority.
|
||
controller_intro: Responsible for the processing described here:
|
||
controller_title: Controller
|
||
controller_unset: 'Not set. A privacy notice must name the controller — set these before making this instance public.'
|
||
cookie_mercure: keeps the live-update connection open while you are signed in.
|
||
cookie_session: keeps you signed in to your demo account. Deleted when you close the browser.
|
||
cookie_ui: remembers the theme and language you picked.
|
||
cookies: >-
|
||
Three cookies are set, all of them strictly necessary to operate the
|
||
service. There is no tracking, advertising or analytics cookie, and
|
||
therefore no consent banner.
|
||
cookies_title: Cookies
|
||
host: The server is operated on our behalf by %host%, acting as a processor under a data processing agreement.
|
||
host_unset: 'Not set. The company running the server is a processor and has to be named here.'
|
||
logs: >-
|
||
Like any web server, this one records each request: the IP address it came
|
||
from, the time, the page requested, the referring page and the browser's
|
||
user-agent string. This is necessary to run the service and to defend it
|
||
against attack (Art. 6(1)(f) GDPR — legitimate interest). These logs are
|
||
rotated and are not used to build a profile of anyone.
|
||
logs_title: Server log files
|
||
processing_title: What is processed, and on what basis
|
||
rights: >-
|
||
You have the right to information about the data held about you, and to its
|
||
correction, erasure or restriction, as well as the right to object to
|
||
processing and the right to data portability. Write to the address above.
|
||
rights_title: Your rights
|
||
stats: >-
|
||
To see how much the demo is used, each demo session that is started is counted.
|
||
What is stored is the time and a keyed hash of the IP address with its last part
|
||
cut off (the last octet of an IPv4 address, the last 80 bits of an IPv6 one) —
|
||
never the address itself. The hash shows only that two sessions came from the
|
||
same network, and it is deleted after %days% days (Art. 6(1)(f) GDPR —
|
||
legitimate interest in knowing how much the demo is used).
|
||
stats_title: 'Usage statistics'
|
||
third_parties: >-
|
||
No data is passed to third parties. This site loads no external fonts,
|
||
scripts, maps or analytics — its content security policy allows connections
|
||
to this server only.
|
||
third_parties_title: Third parties
|
||
title: Privacy notice
|
||
unavailable:
|
||
title: Not available in the demo
|
||
body: >-
|
||
Connecting a real mailbox is switched off here. This demo runs on a
|
||
server you do not control, and no stranger should be typing their
|
||
mail password into it. Everything else — themes, filters, the
|
||
calendar, writing mail — works as it does on your own install.
|
||
dismiss: Back to the demo
|
||
impressum:
|
||
link: Legal notice
|
||
title: Legal notice
|
||
heading: Information under § 5 TMG
|
||
operator: Operator
|
||
unset: 'Not set. This page is legally required to name a real operator — set these in the environment before making this instance public.'
|
||
contact: Contact
|
||
contact_email: 'Email:'
|
||
disclaimer_title: About this demo
|
||
disclaimer: >-
|
||
This is a demonstration of plMail. The mailboxes, senders and
|
||
messages shown are invented; none of them is real correspondence.
|
||
Mail written here never leaves the server, and demo accounts are
|
||
deleted automatically after a couple of hours.
|
||
privacy_title: Data
|
||
privacy: >-
|
||
A demo visit creates a throwaway account with no personal data in
|
||
it. Anything you type into it is deleted with the account. Server
|
||
logs record IP addresses for the usual operational reasons and are
|
||
rotated.
|
||
source_title: Source
|
||
source: 'plMail is free software, licensed AGPL-3.0:'
|
||
dnd:
|
||
# The pill the pointer carries when several conversations are dragged at
|
||
# once. %count% is substituted in the browser, so the placeholder is left
|
||
# in the translated string — see _layout/_mailbox.html.twig. Always
|
||
# plural: a single conversation drags a picture of its own row instead.
|
||
dragging: '%count% conversations'
|
||
|
||
drafts:
|
||
empty: No drafts.
|
||
heading: Drafts
|
||
|
||
errors:
|
||
page:
|
||
back: Back to your mail
|
||
not_found:
|
||
body: The page you asked for is not here. The link may be mistyped, or what it pointed at may have been moved or deleted.
|
||
heading: Nothing at this address
|
||
title: Page not found
|
||
server:
|
||
body: Something went wrong at our end, not yours. The fault has been logged; trying again in a moment usually works.
|
||
heading: Something went wrong
|
||
title: Server error
|
||
|
||
form:
|
||
file:
|
||
choose: Choose an image…
|
||
hint: PNG, JPEG, GIF or WebP
|
||
select:
|
||
no_results: No matches
|
||
cancel: Cancel
|
||
submit: Save
|
||
|
||
confirm_dialog:
|
||
# The in-app replacement for window.confirm(). Turbo's data-turbo-confirm
|
||
# calls the browser dialog by default; setConfirmMethod points it here.
|
||
heading: Are you sure?
|
||
cancel: Cancel
|
||
confirm: Continue
|
||
discarded:
|
||
actions:
|
||
purge: Delete forever
|
||
purge_confirm: 'Delete this conversation for good? It cannot be brought back, and it is removed from the mail server too.'
|
||
restore: Move to inbox
|
||
header:
|
||
search:
|
||
close: Close search
|
||
live:
|
||
status: '%count% matching conversations'
|
||
status_none: No matching mail
|
||
status_one: 1 matching conversation
|
||
title: Mail
|
||
open: Search mail
|
||
placeholder: Search mail…
|
||
recents:
|
||
clear: Clear
|
||
title: Recent searches
|
||
suggestions:
|
||
title: Suggestions
|
||
user_menu:
|
||
account_attention: '%count% things about your accounts need attention'
|
||
admin: Admin
|
||
label: User menu for %email%
|
||
profile: Profile
|
||
rerun_setup: Run setup again
|
||
unseen_logs:
|
||
danger: '%count% new errors in the log'
|
||
warn: '%count% new warnings in the log'
|
||
settings: Settings
|
||
sign_out: Sign out
|
||
signed_in_as: Signed in as
|
||
|
||
inbox:
|
||
empty: No messages in this tab.
|
||
empty_account: Nothing has arrived in this account yet.
|
||
|
||
insights:
|
||
card:
|
||
heading: Found in this conversation
|
||
kind:
|
||
flight: Flight
|
||
github-issue: Issue
|
||
github-pr: Pull request
|
||
invoice: Invoice
|
||
otp: Login code
|
||
parcel: Parcel
|
||
subscription: Subscription
|
||
ticket: Ticket
|
||
pane:
|
||
dismiss: Dismiss
|
||
dismiss_all: Hide this strip
|
||
heading: Happening soon
|
||
more: More actions
|
||
when:
|
||
today: Today
|
||
tomorrow: Tomorrow
|
||
panel:
|
||
dismiss: Dismiss
|
||
heading: On your radar
|
||
open_mail: Open mail
|
||
track: Track
|
||
undated_heading: Also spotted
|
||
report:
|
||
already_reported: You have already reported this mail.
|
||
cancel: Cancel
|
||
disclosure: "You are reporting this mail so that plMail can read an insight from it in future. The mail's content and sender are passed on to your administration."
|
||
heading: Report a missed insight
|
||
note_label: What should plMail have spotted here?
|
||
note_placeholder: "For example: this is an invoice, due on the 3rd."
|
||
submit: Report mail
|
||
success: "Thank you — your report is with your administration."
|
||
status:
|
||
announced: Announced
|
||
delivered: Delivered
|
||
in_transit: On its way
|
||
ordered: Ordered
|
||
out_for_delivery: Out for delivery
|
||
ready_for_pickup: Ready for pickup
|
||
|
||
integration:
|
||
save_failed: 'Could not save: %reason%'
|
||
saved_to: 'Saved to %name%'
|
||
destination:
|
||
album_name: 'Album name'
|
||
choose_album: 'Choose an album for %file%'
|
||
choose_folder: 'Choose a folder for %file%'
|
||
# The picker opened with no attachment in hand: a filter naming the
|
||
# folder it will save to, for mail that has not arrived yet.
|
||
choose_for_filter: 'Choose where this filter saves attachments.'
|
||
choose_here: 'Choose this folder'
|
||
choose_this: Choose
|
||
create: Create
|
||
folder_name: 'Folder name'
|
||
library: 'Library (no album)'
|
||
new_album: 'New album'
|
||
new_folder: 'New folder'
|
||
no_albums: 'No albums yet.'
|
||
no_subfolders: 'No folders here.'
|
||
save_here: 'Save here'
|
||
start_over: 'Start over'
|
||
picker:
|
||
attach: Attach
|
||
attach_from: 'Attach from %name%'
|
||
attach_from_service: 'Attach from a service'
|
||
empty: 'This folder is empty.'
|
||
link: Link
|
||
more: 'Show more'
|
||
no_results: 'Nothing found for “%query%”.'
|
||
search: Search
|
||
search_placeholder:
|
||
dropbox: 'Search Dropbox'
|
||
googleDrive: 'Search Drive'
|
||
googlePhotos: 'Search Photos'
|
||
immich: 'Describe a photo, e.g. beach at sunset'
|
||
nextcloud: 'Search Nextcloud'
|
||
oneDrive: 'Search OneDrive'
|
||
paperless: 'Search titles and scanned text'
|
||
status:
|
||
attach_failed: 'Could not attach'
|
||
attaching: 'Attaching…'
|
||
load_failed: 'Could not load more'
|
||
loading: 'Loading…'
|
||
nothing_selected: 'Nothing selected'
|
||
save_draft_first: 'Save the draft first'
|
||
skipped: 'Skipped: %files%'
|
||
timeline: 'Jump to a date'
|
||
too_big: 'Too large to attach'
|
||
|
||
jobs:
|
||
button:
|
||
failed: "Something failed"
|
||
importing: "Importing"
|
||
importing_percent: "Importing · %percent%%"
|
||
working: "Working…"
|
||
heading: Background work
|
||
import:
|
||
folder: "Now: %folder%"
|
||
heading: "Importing %account%"
|
||
newest_first: "Newest mail first"
|
||
quota: "Gmail quota: about %used% of %limit% units this minute"
|
||
quota_assumed: "Gmail quota: about %used% of %limit% units this minute (limit assumed until Google names it)"
|
||
quota_paused: "Paused by Gmail's quota · continues in %seconds% s"
|
||
quota_refused: "Gmail said no at about %used% of %limit% units a minute"
|
||
rate: "About %count% messages a minute"
|
||
remaining_hours: "About %hours% h %minutes% min left"
|
||
remaining_minutes: "About %minutes% min left"
|
||
waiting: "Waiting to continue"
|
||
started: 'Started %action% — this runs in the background.'
|
||
failure:
|
||
abandoned: 'Interrupted — this stopped part-way, and whatever it had already done was kept.'
|
||
kind:
|
||
mark_read: Marking as read
|
||
mark_unread: Marking as unread
|
||
archive: Archiving
|
||
trash: Moving to bin
|
||
restore: Restoring
|
||
snooze: Snoozing
|
||
wake: Bringing back from snooze
|
||
move_to: Moving
|
||
purge: Deleting for good
|
||
reclassify: Sorting recent mail again
|
||
state:
|
||
done: '%count% done'
|
||
failed: failed
|
||
queued: waiting
|
||
label:
|
||
all_accounts: All accounts
|
||
color:
|
||
amber: Amber
|
||
blue: Blue
|
||
gray: Gray
|
||
green: Green
|
||
orange: Orange
|
||
pink: Pink
|
||
red: Red
|
||
teal: Teal
|
||
violet: Violet
|
||
empty: No conversations with this label.
|
||
created: Label created.
|
||
delete_confirm: 'Delete the label "%name%"? It goes from every account. Messages keep their other labels and are not deleted.'
|
||
delete_confirm_children: 'Delete "%name%" and its %count% nested label(s)? They go from every account. Messages are not deleted.'
|
||
deleted: Label deleted.
|
||
error:
|
||
duplicate: A label with this name already exists here. Capitals do not make it a different name.
|
||
form:
|
||
color: Color
|
||
delete: Delete label
|
||
delete_hint: 'Deleting removes the label from every account, along with any labels nested under it. Mail carrying it keeps its other labels and is not deleted.'
|
||
edit_title: Edit label
|
||
name: Name
|
||
no_color: '— none —'
|
||
no_parent: '— top level —'
|
||
parent: Nest under
|
||
menu:
|
||
create: Create new
|
||
empty: No labels yet.
|
||
updated: Label updated.
|
||
visibility:
|
||
hidden: Label is now hidden.
|
||
shown: Label is now visible.
|
||
|
||
list:
|
||
sort:
|
||
newest: Newest first
|
||
oldest: Oldest first
|
||
|
||
login:
|
||
form:
|
||
email: Email address
|
||
forgot_password: Forgot password?
|
||
forgot_password_hint: 'Password recovery runs from the server console: bin/console app:user:2fa-disable and a fresh password set by an administrator.'
|
||
password: Password
|
||
remember_me: Keep me logged in
|
||
submit: Sign in
|
||
oidc:
|
||
button: Sign in with single sign-on
|
||
button_named: Sign in with %provider%
|
||
or: or
|
||
page_title: Sign in
|
||
register:
|
||
coming_soon: Registration coming soon.
|
||
link: Create one
|
||
prompt: Don't have an account?
|
||
tagline: Sign in to your account
|
||
|
||
message:
|
||
actions:
|
||
archive: Archive
|
||
delete: Delete this message
|
||
collapse: Collapse this message
|
||
expand: Expand this message
|
||
mark_unread: Mark as unread
|
||
more: More
|
||
print: Print
|
||
report_insight: Report a missed insight
|
||
show_original: Show original
|
||
star: Star
|
||
unstar: Remove star
|
||
attachments: Attachments
|
||
back: Back
|
||
body_frame: Message content
|
||
bounce:
|
||
failed: 'This message was not delivered.'
|
||
failed_for: 'Not delivered to %recipient%.'
|
||
reported_at: 'Reported %datetime%'
|
||
details:
|
||
categorised:
|
||
ai: 'a language model, because no rule recognised it: '
|
||
# When the model disagrees with the rules. Said rather than left to
|
||
# be noticed, because the two rows are what this panel is for and a
|
||
# difference between them is the finding.
|
||
ai_differs: 'the rules disagree'
|
||
awaiting_resort: 'Being re-filed — you changed how mail is sorted, and this one has not moved yet.'
|
||
own_filter: 'filed there by one of your filters'
|
||
gmail_overruled: 'not used — you asked plMail to sort this itself'
|
||
in_force: 'this one decides'
|
||
# Asked, and what came back was not one of the five categories. Kept
|
||
# apart from "not asked": one means the model has nothing useful to
|
||
# say about this mail, the other means nobody has asked it.
|
||
ai_no_answer: 'asked, no usable answer'
|
||
ai_not_asked: 'not asked'
|
||
correspondent: 'you have written to this sender'
|
||
default: 'nothing marked it as bulk mail'
|
||
forum: 'a mailing-list header: '
|
||
gmail: 'Gmail said so: '
|
||
# A category somebody chose by dragging the conversation onto a tab.
|
||
# Nothing below the first row can move it while this holds.
|
||
pinned: 'you moved it here'
|
||
promotion: 'a bulk-mail header: '
|
||
social: 'the sender domain '
|
||
switched_off: "it would be %category%, which you switched off"
|
||
# A conversation takes ONE category, from its newest message, so a
|
||
# reply can carry the whole thread out of the tab this message
|
||
# belongs in. Said outright, because without it the panel reads as
|
||
# simply wrong: every line agreeing on one category while the mail
|
||
# sits plainly in another.
|
||
thread_differs: 'This message on its own would be %category% — a conversation takes its category from its newest message.'
|
||
update: 'an automated-mail signal: '
|
||
category: category
|
||
# What a language model made of it — asked about every message now, and
|
||
# deciding nothing on its own.
|
||
category_ai: 'the model'
|
||
category_gmail: 'Gmail says'
|
||
# plMail's own cascade with neither Gmail nor the model in the way. On a
|
||
# Gmail mailbox this is the answer that takes over the day the provider's
|
||
# labels stop arriving, so it is worth being able to see before then.
|
||
category_rules: 'the rules'
|
||
bcc: bcc
|
||
cc: cc
|
||
copy_address: 'Copy address %address%'
|
||
copy_headers: Copy headers
|
||
report:
|
||
failed: 'Could not report'
|
||
label: 'Wrong tab? Should be'
|
||
send: Report
|
||
stale: 'Already there — reload'
|
||
sent: Reported
|
||
date: date
|
||
from: from
|
||
hide_all_headers: Hide all headers
|
||
label: Details
|
||
mailed_by: mailed-by
|
||
reply_to: reply-to
|
||
show_all_headers: Show all headers
|
||
signed_by: signed-by
|
||
subject: subject
|
||
to: "to %name%"
|
||
to_label: to
|
||
undisclosed: undisclosed recipients
|
||
draft: "Draft"
|
||
images:
|
||
always: 'Always show images from %sender%'
|
||
blocked: '{1}1 image was blocked to keep this read private|]1,Inf[ %count% images were blocked to keep this read private'
|
||
show_once: Show images
|
||
stop_trusting: Stop showing
|
||
trusted: 'Images are always shown for %sender%'
|
||
original:
|
||
copied: Copied
|
||
copy: Copy to clipboard
|
||
copy_failed: Copy failed
|
||
fields:
|
||
created_at: Created at
|
||
from: From
|
||
message_id: Message ID
|
||
subject: Subject
|
||
to: To
|
||
heading: Original message
|
||
reconstructed: 'The original bytes of this message were not kept, so this is a reconstruction from the stored headers and the text body. The MIME structure and any HTML part are missing, and it will not verify against a DKIM signature.'
|
||
quote:
|
||
hide: Hide quoted text
|
||
show: Show quoted text
|
||
read_receipt:
|
||
dismiss: 'No thanks'
|
||
mdn:
|
||
body: "Your message to %recipient% with the subject “%subject%” was displayed on %date%. This is no guarantee that it has been read or understood."
|
||
subject: 'Read: %subject%'
|
||
mismatch: 'The receipt was asked to go to %notifyTo%, which is not the address this message was sent from (%sender%).'
|
||
read_at: 'Read at %datetime%'
|
||
requested: '%sender% asked to be told when you read this message.'
|
||
send: 'Send receipt'
|
||
save_to: 'Save to'
|
||
security:
|
||
mismatch:
|
||
brand_in_name: "The name says “%claimed%”, but the message was sent from %actual%."
|
||
domain_in_name: "The name claims %claimed%, but the message was sent from %actual%."
|
||
title: "The sender's name does not match its address"
|
||
spam:
|
||
body: "This message was filed as spam. Its links and images are risky — treat anything it asks of you as a stranger's request."
|
||
title: This message is in Spam
|
||
|
||
mercure:
|
||
status:
|
||
connected: Live updates active
|
||
connecting: Reconnecting to live updates…
|
||
offline: Live updates unavailable — the inbox may be out of date
|
||
|
||
modal:
|
||
close: Close
|
||
loading: Loading…
|
||
|
||
oauth:
|
||
error:
|
||
generic: We couldn't connect that account. Please try again.
|
||
microsoft:
|
||
admin_consent_required: >-
|
||
Your organisation requires an administrator to approve plMail
|
||
before you can connect this account. Please ask your Microsoft
|
||
administrator to grant access.
|
||
app_not_found: >-
|
||
plMail isn't registered in your Microsoft organisation.
|
||
bad_credentials: >-
|
||
plMail's Microsoft credentials are invalid or expired. This is a
|
||
server configuration problem, not something you can fix.
|
||
blocked_by_policy: >-
|
||
A security policy in your organisation blocked this sign-in.
|
||
consent_declined: >-
|
||
Connection cancelled — plMail wasn't granted access.
|
||
tenant_mismatch: >-
|
||
This account type can't sign in to plMail with the current
|
||
configuration. Check the MICROSOFT_OAUTH_TENANT setting.
|
||
|
||
onboarding:
|
||
action:
|
||
back: Back
|
||
finish: Finish
|
||
next: Next
|
||
skip: Skip this step
|
||
skip_all: Skip setup
|
||
done:
|
||
body: >-
|
||
Anything you skipped is in Settings, and you can run this again from the
|
||
user menu whenever you like.
|
||
cta: Go to my mail
|
||
heading: You're all set
|
||
aside:
|
||
account:
|
||
body: >-
|
||
plMail needs the incoming (IMAP) and outgoing (SMTP) server addresses for
|
||
your provider. They are usually on your provider's help pages under
|
||
"IMAP settings".
|
||
heading: Where do I find these?
|
||
oauth: >-
|
||
For Gmail and Outlook, use the sign-in buttons under Settings → Mail
|
||
accounts instead — no server addresses needed.
|
||
admin_ai:
|
||
body: 'The address of an Ollama container on your network, or of any OpenAI-compatible endpoint, and the names of two models it offers — one for writing, one for search. Mail goes to that address and nowhere else.'
|
||
heading: 'What you need'
|
||
skip_body: 'Press Next with everything empty. plMail is a complete mail client without any of this, and you can come back to it later in Admin → AI.'
|
||
skip_heading: 'Not interested?'
|
||
admin_integrations:
|
||
body: Register plMail with the service, then paste the credentials it gives you.
|
||
heading: Setting this up
|
||
admin_mail:
|
||
google:
|
||
heading: Setting up Gmail sign-in
|
||
step1: Open console.cloud.google.com and create a project, or pick an existing one.
|
||
step2: 'Under APIs & Services → Library, enable the Gmail API.'
|
||
step3: 'Under OAuth consent screen, choose Internal if you have Workspace, otherwise External, and fill in the app name and support email.'
|
||
step4: 'Under Credentials, create an OAuth client ID of type "Web application".'
|
||
step5: Paste the redirect URI below into its "Authorised redirect URIs", then save.
|
||
step6: Copy the client ID and client secret it shows you into the fields on the left.
|
||
microsoft:
|
||
heading: Setting up Microsoft sign-in
|
||
step1: 'Open portal.azure.com and go to Microsoft Entra ID → App registrations → New registration.'
|
||
step2: 'Choose who can sign in. "Accounts in any organizational directory and personal Microsoft accounts" matches the default tenant setting of "common".'
|
||
step3: 'Set the redirect URI to Web, and paste the address below into it.'
|
||
step4: 'After registering, copy the Application (client) ID into the field on the left.'
|
||
step5: 'Under Certificates & secrets, create a new client secret and copy its Value — not its ID — straight away; it is only shown once.'
|
||
step6: 'Under API permissions, add these delegated Microsoft Graph permissions: Mail.ReadWrite, Mail.Send, MailboxSettings.ReadWrite, Calendars.ReadWrite, User.Read and offline_access. Leaving out MailboxSettings.ReadWrite or Calendars.ReadWrite still signs people in — they simply get no categories and no calendar, and a token already issued is not upgraded when you add the permission later.'
|
||
profile:
|
||
body: This is what recipients see in the From line. You can change it any time.
|
||
heading: Where this shows up
|
||
security:
|
||
body: >-
|
||
Think about what happens if someone gets your email password. They
|
||
don't just read your mail — they click "forgot password" on your
|
||
bank, your domain registrar, your cloud storage, and collect the
|
||
reset links as they arrive.
|
||
body_two: >-
|
||
A second factor is a code from your phone that changes every 30
|
||
seconds. A stolen password on its own stops being enough.
|
||
heading: Why this one matters most
|
||
account:
|
||
add: Add this account
|
||
or_manual: 'Or set it up by hand:'
|
||
sign_in_with: 'Sign in with %provider%'
|
||
add_another: Add another account
|
||
cancel: Cancel
|
||
integrations:
|
||
cancel: Cancel
|
||
connect: Connect
|
||
connected: Connected
|
||
progress: 'Step %index% of %total%'
|
||
security:
|
||
body: >-
|
||
Your mailbox is the key to every other account you have, because that
|
||
is where password resets arrive. Adding a code from your phone means a
|
||
stolen password is not enough on its own.
|
||
done_body: >-
|
||
You will be asked for a code from your app when you sign in. Keep the
|
||
recovery codes somewhere you can reach without your phone.
|
||
done_heading: Two-factor authentication is on
|
||
skip_hint: You can set this up later under Settings → Security.
|
||
switch_blocked: Nothing was switched — fix the fields below first, and what you entered will be kept.
|
||
step:
|
||
account:
|
||
lead: Connect the mailbox you actually read, and plMail starts syncing it.
|
||
title: Mail account
|
||
admin-ai:
|
||
intro: 'plMail can use a language model — one you run yourself, or an endpoint you choose — for searching by meaning, sorting mail, and help with writing. It is entirely optional, and you can leave every box below empty.'
|
||
lead: 'Optional. Leave it empty if you do not want it.'
|
||
title: 'Language model'
|
||
admin-integrations:
|
||
lead: Credentials for the services everyone here can attach files from.
|
||
title: Integration credentials
|
||
admin-mail:
|
||
lead: Sign-in credentials for Gmail and Outlook, set once for this whole install.
|
||
title: Mail providers
|
||
appearance:
|
||
lead: How plMail looks. None of this is permanent — change it whenever.
|
||
title: Appearance
|
||
integrations:
|
||
lead: Connect the services you keep files and photos in.
|
||
title: Your integrations
|
||
profile:
|
||
lead: The name that appears on the mail you send.
|
||
title: About you
|
||
security:
|
||
lead: The one account worth locking properly. This takes about a minute.
|
||
title: Protect your account
|
||
title: Set up plMail
|
||
|
||
profile:
|
||
avatar_current: Current picture
|
||
avatar_from:
|
||
not_an_image: 'That file is not a picture plMail can use. Pick a PNG, JPEG, GIF or WebP.'
|
||
too_large: 'That picture is larger than 4 MB. Pick a smaller one.'
|
||
unavailable: 'The service did not hand the picture over. Try again in a moment.'
|
||
empty: Nothing to show from this service.
|
||
heading: Or pick one from a connected service
|
||
field:
|
||
avatar: Picture
|
||
avatar_help: PNG, JPEG, GIF or WebP, up to 4 MB.
|
||
avatar_remove: Remove the current picture
|
||
name_first: First name
|
||
name_last: Last name
|
||
|
||
# The reading pane beside the message list (Settings → Reading pane turns it on).
|
||
# `handle` is what a screen reader calls the divider between the two; the
|
||
# placeholder stands where the message will be until one is opened.
|
||
reading_pane:
|
||
handle: Resize the message pane
|
||
placeholder: Select a conversation to read it here
|
||
|
||
# Said in a toast when a request fails and there is no better place to say it;
|
||
# see request_errors.js.
|
||
request_error:
|
||
copy_reference: 'Copy the reference'
|
||
server: 'That didn''t work — something went wrong on our side. Try again in a moment.'
|
||
not_found: 'That isn''t there any more. It may have been moved or deleted.'
|
||
refused: 'plMail couldn''t do that. Reload the page and try again.'
|
||
offline: 'plMail couldn''t be reached. Check your connection and try again.'
|
||
reference: 'Ref. %id%'
|
||
sync_now:
|
||
label: 'Sync now'
|
||
syncing_one: 'Syncing 1 account…'
|
||
syncing_other: 'Syncing %count% accounts…'
|
||
still_running: 'Sync is still running in the background.'
|
||
complete: 'Sync complete.'
|
||
session_expired: 'Your session has expired — reload the page to sign in again.'
|
||
search:
|
||
empty:
|
||
or_keyword: or just type a keyword.
|
||
title: Search your mail
|
||
try: Try
|
||
heading:
|
||
results: Search results for
|
||
no_results:
|
||
hint: Try different keywords or remove some filters.
|
||
title: No results for "%query%"
|
||
pill:
|
||
after: After
|
||
attachment: attachment
|
||
before: Before
|
||
cc: Cc
|
||
from: From
|
||
has: Has
|
||
in: In
|
||
is: Is
|
||
label: Label
|
||
read: read
|
||
starred: starred
|
||
subject: Subject
|
||
to: To
|
||
unread: unread
|
||
results:
|
||
count: '%count% results'
|
||
count_one: 1 result
|
||
semantic:
|
||
admin_link: 'Indexing progress'
|
||
indexing: 'Searching meaning across %embedded% of %total% messages — %percent%% complete.'
|
||
model_changed: 'The search model changed. The %count% messages indexed with the one before it are not searched by meaning until they have been indexed again.'
|
||
nothing_extra: 'Searching by meaning found nothing the words had not already.'
|
||
skipped:
|
||
bad_answer: 'The model answered with something this cannot use, so this search used words only.'
|
||
host_unreachable: 'The model host did not answer, so this search used words only.'
|
||
model_missing: 'The model host does not have the search model, so this search used words only.'
|
||
not_configured: 'Search by meaning is switched on, but no model host is set up, so this search used words only.'
|
||
query_too_short: 'Type a little more to search by meaning as well.'
|
||
search_failed: 'Searching by meaning could not be completed, so this search used words only. An administrator can find out why in the server log.'
|
||
search_too_slow: 'Searching by meaning took too long here, so this search used words only.'
|
||
timed_out: 'The model took too long, so this search used words only.'
|
||
sort:
|
||
label: Sort by
|
||
recent: Most recent
|
||
relevance: Most relevant
|
||
title: Search
|
||
title_query: 'Search: %query%'
|
||
|
||
sent:
|
||
empty: No sent messages.
|
||
heading: Sent
|
||
|
||
setup:
|
||
install:
|
||
field:
|
||
email: Email address
|
||
email_help: This is the address you'll sign in with.
|
||
locale: Language
|
||
name_first: First name
|
||
name_last: Last name
|
||
password: Password
|
||
password_repeat: Repeat password
|
||
public_url: Public address
|
||
public_url_help: >-
|
||
Where people reach plMail from outside. Gmail and Outlook send push
|
||
notifications back to it, so it has to be reachable from the internet
|
||
and should be https. You can change it later.
|
||
footnote: You'll be able to add mailboxes, and anything else, once you're in.
|
||
heading: Create your account
|
||
lead: This is the first account on this plMail, so it gets full administrator rights.
|
||
page_title: Set up plMail
|
||
restore_link: Restore a configuration backup first.
|
||
restore_prompt: Moving from another plMail?
|
||
submit: Create account and sign in
|
||
tagline: Nobody has signed up yet — let's fix that
|
||
restore:
|
||
applied_lead: >-
|
||
The configuration is in place. This backup carried no user accounts, so this
|
||
installation still has none — create the administrator account to finish. If a
|
||
restart is noted above, it can wait until after that.
|
||
applied_lead_users: >-
|
||
The configuration and its people are in place — %count% restored, %admins%
|
||
among them. Sign in with the password you already had; nothing about it has
|
||
changed.
|
||
back: 'Back to creating the administrator'
|
||
continue: 'Continue — create the administrator'
|
||
footnote: >-
|
||
A configuration backup carries settings, credentials and the people who use
|
||
them — never mail, calendar entries or contacts.
|
||
heading: 'Restore a configuration backup'
|
||
lead: >-
|
||
Bring another plMail's settings, credentials and accounts here before you
|
||
create anything. Upload the file and type its password — plMail writes the
|
||
rest into this installation itself.
|
||
nothing_to_do: 'There is nothing left for you to do here.'
|
||
page_title: 'Restore configuration'
|
||
sign_in: 'Sign in'
|
||
submit: 'Open the backup'
|
||
|
||
session:
|
||
# Shown when Turbo notices the session has ended — a logout in another tab,
|
||
# an expired cookie, a restarted worker. Turbo's own answer is to render the
|
||
# login page inside the application shell, which looks like the app has come
|
||
# apart.
|
||
expired:
|
||
heading: You have been signed out
|
||
body: Your session ended somewhere else. Sign in again to carry on.
|
||
body_writing: Your session ended somewhere else. Sign in again in a new tab, then come back — what you have written here is still on screen.
|
||
sign_in: Sign in again
|
||
sign_in_new_tab: Sign in in a new tab
|
||
reload: Reload this page
|
||
settings:
|
||
ai:
|
||
context:
|
||
heading: 'How much the assistant reads'
|
||
message: 'The message'
|
||
message_hint: 'The assistant reads the message you are replying to. This is what it has always done.'
|
||
none: 'Nothing'
|
||
none_hint: 'The assistant sees only what you have typed. Fastest, and "Draft a reply" on an empty window has nothing to work from — it will say it could not answer. Shorten, make formal and proofread are unaffected.'
|
||
subheading: 'More of the conversation makes for a better reply and a longer wait. The model runs on this machine, so what it costs is time, not much else.'
|
||
thread: 'The conversation'
|
||
thread_hint: 'The assistant reads the whole conversation, oldest first, as much of it as fits. Better replies in long threads, and a longer wait.'
|
||
feature:
|
||
admin_off: 'Not switched on for this installation'
|
||
categorise: 'Sort mail into tabs'
|
||
categorise_hint: 'Lets the model break the tie when the ordinary rules cannot place a message. Off leaves those messages where the rules put them.'
|
||
search: 'Search by meaning'
|
||
search_hint: 'Finds mail that means what you asked for, not only mail that spells it the same way. Off stops your mail being indexed as well as searched.'
|
||
summary: 'Thread summaries'
|
||
summary_hint: 'Summarise a long conversation when you ask for it. Nothing is summarised on its own.'
|
||
writing_help: 'Help me write'
|
||
writing_help_hint: 'Drafts a reply, shortens, makes formal, proofreads — in the compose window, when you ask for it.'
|
||
features:
|
||
heading: 'Assistant features'
|
||
subheading: "Which of the assistant's features you want. Your administrator decides what is available; you decide what you use."
|
||
notes:
|
||
about_me_hint: 'Your job, who you usually write to, anything a stranger would need to know to answer your mail well.'
|
||
about_me_label: 'Who you are'
|
||
about_me_placeholder: 'I run a bicycle repair shop and most of my mail is from customers booking repairs.'
|
||
heading: 'About you'
|
||
save: 'Save'
|
||
saved: 'Saved.'
|
||
subheading: 'What the assistant should know before it writes for you. Both notes are sent with every draft, and neither is used for anything else.'
|
||
system_prompt_hint: "Preferences, not instructions — the app's own rules come first, including writing in the language of the mail. Keep it short: long notes crowd the actual message out of the model's attention."
|
||
system_prompt_label: 'How you like to be written for'
|
||
system_prompt_placeholder: 'Short sentences. No exclamation marks. Sign off with just my first name.'
|
||
reads:
|
||
categorise: 'Sorting: the sender, the subject and the start of the message.'
|
||
heading: 'What the assistant is given'
|
||
search: 'Indexing: the subject, the sender and the start of each message.'
|
||
summary: 'The messages in a conversation you ask to have summarised'
|
||
writing_help: 'Writing: your subject line, what you have typed, and as much of the conversation as the setting above allows.'
|
||
seg:
|
||
off: 'Off'
|
||
on: 'On'
|
||
accounts:
|
||
colour:
|
||
change: 'Change the colour of %account%'
|
||
swatch:
|
||
'0': Orange
|
||
'1': Green
|
||
'2': Blue
|
||
'3': Violet
|
||
'4': Amber
|
||
'5': Pink
|
||
'6': Teal
|
||
'7': Olive
|
||
delete: Remove account
|
||
delete_confirm: 'Remove %account%? This permanently deletes all synced messages for this account and cannot be undone.'
|
||
disable: Disable account
|
||
edit: Edit account
|
||
empty: No accounts yet. Add one to start syncing mail.
|
||
enable: Enable account
|
||
folders:
|
||
always_synced: The inbox is always synced
|
||
button: Choose which folders to sync
|
||
empty: No folders yet. They are listed after the first sync.
|
||
intro: >-
|
||
Switch a folder off and plMail stops fetching it. Mail already
|
||
stored stays where it is, and switching the folder back on
|
||
resumes from where it stopped.
|
||
placeholder: 'A placeholder that only groups other folders — there is nothing in it to sync'
|
||
start_sync: 'Start syncing %folder%'
|
||
stop_sync: 'Stop syncing %folder%'
|
||
title: 'Folders — %account%'
|
||
heading: Mail accounts
|
||
make_primary: Make primary
|
||
make_primary_explained: 'Send new messages from %account% by default'
|
||
reconnect: Reconnect
|
||
reconnect_explained: 'Sign in to %account% again — to grant a permission you declined, or after changing your password'
|
||
move_down: 'Move %account% down the list'
|
||
move_up: 'Move %account% up the list'
|
||
order_hint: >-
|
||
Drag to arrange this list. The order is how accounts are shown and
|
||
nothing else — the account new messages are sent from is the one
|
||
marked Primary.
|
||
password_help: Leave blank to keep the current password.
|
||
primary: Primary
|
||
primary_explained: New messages are sent from this account by default.
|
||
push:
|
||
lapsed_hint: >-
|
||
The push registration expired and was not renewed, so nothing is
|
||
being delivered. Renewal runs daily on its own — if this keeps
|
||
happening, the scheduled-task worker has stopped. Mail is still
|
||
syncing on a schedule.
|
||
degraded_hint:
|
||
gmail: >-
|
||
Push is registered but nothing has arrived recently. The
|
||
Pub/Sub push subscription in Google Cloud may be missing or
|
||
pointing elsewhere. Mail is still syncing on a schedule.
|
||
microsoft: >-
|
||
The push subscription has lapsed and nothing is arriving.
|
||
Re-register it to resume instant delivery. Mail is still
|
||
syncing on a schedule.
|
||
failed:
|
||
gmail: >-
|
||
Push couldn't be enabled — Google rejected the watch
|
||
registration. Check that GMAIL_PUBSUB_TOPIC names an
|
||
existing Pub/Sub topic and that the topic grants
|
||
gmail-api-push@system.gserviceaccount.com the Pub/Sub Publisher
|
||
role. The account is still syncing on a schedule.
|
||
microsoft: >-
|
||
Push couldn't be enabled — Microsoft needs to reach this
|
||
server over HTTPS. Check your reverse proxy and
|
||
APP_PUBLIC_URL. The account is still syncing on a schedule.
|
||
health:
|
||
active: Push
|
||
degraded: Push (not delivering)
|
||
inactive: Scheduled
|
||
lapsed: Push (expired)
|
||
not_configured: >-
|
||
Push isn't available on this server — it needs a public HTTPS
|
||
address and, for Gmail, a Cloud Pub/Sub topic.
|
||
off_hint: Mail is checked on a schedule. Turn on push for instant delivery.
|
||
on_hint:
|
||
gmail: New mail arrives immediately via Gmail push notifications.
|
||
microsoft: New mail arrives immediately via Microsoft push notifications.
|
||
title: Instant delivery
|
||
reorder: Drag to reorder
|
||
status:
|
||
active: Active
|
||
disabled: Disabled
|
||
subheading: Add, edit, enable, or remove the mailboxes you sync.
|
||
type:
|
||
imap: IMAP
|
||
oauth: '%provider% (OAuth)'
|
||
aliases:
|
||
add: 'Add'
|
||
add_placeholder: 'Add another address…'
|
||
catch_all:
|
||
add: 'Set as catch-all'
|
||
hint: 'If every address at a domain reaches this mailbox, add the domain here. A reply then goes out from the address the mail was sent to, without adding each one above.'
|
||
label: 'Catch-all domains'
|
||
placeholder: 'example.com'
|
||
remove: 'Remove %domain%'
|
||
delete: 'Remove'
|
||
disable: 'Disable'
|
||
empty: 'No addresses yet.'
|
||
enable: 'Enable'
|
||
heading: 'Email addresses'
|
||
make_primary: 'Make primary'
|
||
ms_sender_hint: 'Outlook sends as your account’s primary alias regardless of the address chosen here — change it in your'
|
||
ms_sender_hint_link: 'Microsoft account settings'
|
||
name_for: 'Sender name for %alias%'
|
||
name_placeholder: 'Sender name'
|
||
name_save: 'Save name'
|
||
primary: 'Primary'
|
||
refresh: 'Refresh from provider'
|
||
subheading: 'Addresses this account sends and receives as.'
|
||
system: 'system'
|
||
clock:
|
||
heading: Clock
|
||
subheading: Whether times are written on a twelve- or twenty-four-hour clock, and where the current time is shown. Nothing is stored differently — only the digits change.
|
||
label: Clock
|
||
follow_language: 'Follow your language (%sample%)'
|
||
option:
|
||
'12': '12-hour (%sample%)'
|
||
'24': '24-hour (%sample%)'
|
||
placement:
|
||
label: 'Show the time'
|
||
option:
|
||
topbar: 'On the Happening Soon button in the topbar'
|
||
brand: 'Under the plMail name'
|
||
sidebar: 'At the bottom of the sidebar'
|
||
'off': 'Nowhere'
|
||
device_pairing:
|
||
pair_device: "Pair a device"
|
||
scan_title: "Scan this with the plMail app"
|
||
scan_hint: "The code works once and expires in two minutes. It doesn't contain your app password — the app exchanges it for a new one."
|
||
qr_alt: "Pairing code"
|
||
expires: "Expires at %time%."
|
||
open_in_app: "Open in the app"
|
||
app_passwords:
|
||
copy: Copy
|
||
copy_now: Here is your new app password
|
||
copy_now_hint: >-
|
||
Copy it now — it is not stored and cannot be shown again. If you
|
||
lose it, revoke it and generate another.
|
||
empty: No app passwords yet. Generate one to connect a mail app.
|
||
generate: Generate
|
||
heading: App passwords
|
||
last_used: 'Last used %date%'
|
||
name_placeholder: 'What is it for? e.g. iPhone — Sterna'
|
||
never_used: Never used
|
||
revoke: Revoke
|
||
revoke_confirm: 'Revoke "%name%"? Any app using it will be signed out immediately.'
|
||
setup_heading: Connecting an app
|
||
setup_hint: >-
|
||
Use your email address as the username and the app password as the
|
||
password. If the app asks for a server or JMAP URL, give it this —
|
||
not the /jmap/api address, which only accepts POST.
|
||
subheading: >-
|
||
Sign in to third-party mail apps that speak JMAP. Each app gets its
|
||
own password you can revoke on its own.
|
||
appearance:
|
||
accent:
|
||
heading: Accent colour
|
||
background:
|
||
heading: Background
|
||
solid: Solid colour
|
||
theme: Theme default
|
||
upload: Upload image
|
||
density:
|
||
comfortable: Comfortable
|
||
compact: Compact
|
||
cosy: Cosy
|
||
follow: Follow
|
||
heading: Density
|
||
subheading: How much room each row is given. Set it once for everything, or give a pane its own.
|
||
surface:
|
||
list: Message list
|
||
reading: Reading pane
|
||
sidebar: Sidebar
|
||
motion:
|
||
full: Full
|
||
heading: Motion
|
||
minimal: Minimal
|
||
none: None
|
||
reduced: If your system asks for reduced motion, plMail follows that instead — whatever is chosen here.
|
||
subheading: How much the interface moves when something appears. Minimal fades without shifting anything.
|
||
export: Export theme
|
||
glass:
|
||
heading: Glass
|
||
paneAlpha: Panel opacity
|
||
paneAlphaHint: The sidebar, top bar, main pane and calendar — the frame the app is laid out in. Nothing sits behind these but the background.
|
||
paneBlur: Blur
|
||
popoverAlpha: Window and menu opacity
|
||
popoverAlphaHint: The compose window, dialogs and menus. Each of these sits on top of a panel, so both layers show through at once. Keeping them near solid is what keeps them readable.
|
||
radius: Corner radius
|
||
scrimAlpha: Background dimming
|
||
subheading: How much of the background shows through your panels.
|
||
heading: Appearance
|
||
import: Import theme
|
||
layout:
|
||
boxed: Boxed
|
||
flat: Flat
|
||
heading: Layout
|
||
subheading: How the interface is framed. Boxed floats every panel as a card; flat puts the top bar and sidebar straight on the background and keeps only the main pane boxed.
|
||
list:
|
||
accountCorner: Account corner
|
||
accountCornerHint: The coloured triangle in a row's corner, saying which account it arrived on. Only ever drawn in a list that mixes accounts.
|
||
heading: Message list
|
||
listAvatars: Sender discs
|
||
listAvatarsHint: The coloured circle carrying the sender's initial. Switched off it becomes a plain circle rather than disappearing — it is also the row's checkbox.
|
||
tabUnreadCount: 'Unread count on inbox tabs'
|
||
tabUnreadCountHint: 'The number beside each tab''s name: how many conversations in that category hold unread mail. The tabs add up to the Inbox badge in the sidebar. The "3 new" pill is separate and stays.'
|
||
previewLines: Preview lines
|
||
previewLines0: None
|
||
previewLines1: One line
|
||
previewLines2: Two lines
|
||
subheading: What each row in the list shows.
|
||
unread:
|
||
standard: Standard
|
||
strong: Strong
|
||
subtle: Subtle
|
||
unreadEmphasis: Unread rows
|
||
logo:
|
||
colour: 'Colour'
|
||
heading: Logo
|
||
icon: 'Icon'
|
||
independent: 'Choose independently'
|
||
linked: 'Follow the theme'
|
||
motif:
|
||
airmail: 'Airmail'
|
||
at-horn: '@-Horn'
|
||
blue-horn: 'Blue Horn'
|
||
happy-mail: 'Happy Mail'
|
||
love-letter: 'Love Letter'
|
||
mailbox: 'Mailbox'
|
||
pl: 'Classic'
|
||
pl-stamp: 'pl Stamp'
|
||
snail-mail: 'Snail Mail'
|
||
wax-seal: 'Wax Seal'
|
||
original: 'Original'
|
||
style:
|
||
aurora: 'Aurora'
|
||
berry: 'Berry'
|
||
blue-tonal: 'Blue tonal'
|
||
bronze-flick: 'Bronze flick'
|
||
bronze-ink: 'Bronze & ink'
|
||
burgundy: 'Burgundy'
|
||
charcoal-amber: 'Charcoal & amber'
|
||
cobalt-coral: 'Cobalt & coral'
|
||
copper: 'Copper'
|
||
deep-violet: 'Deep violet'
|
||
ember: 'Ember'
|
||
espresso-cream: 'Espresso & cream'
|
||
forest: 'Forest'
|
||
forest-lime: 'Forest & lime'
|
||
graphite-red: 'Graphite & red'
|
||
indigo-violet: 'Indigo–violet'
|
||
ink: 'Ink'
|
||
midnight-gold: 'Midnight & gold'
|
||
navy-sky: 'Navy & sky'
|
||
ocean: 'Ocean'
|
||
petrol-copper: 'Petrol & copper'
|
||
plum-rose: 'Plum & rose'
|
||
postal: 'Postal'
|
||
product-blue: 'Product blue'
|
||
red-flick: 'Red flick'
|
||
sky-flick: 'Sky flick'
|
||
slate: 'Slate'
|
||
sunset: 'Sunset'
|
||
teal-gold: 'Teal & gold'
|
||
tricolore: 'Tricolore'
|
||
twilight: 'Twilight'
|
||
violet-flick: 'Violet flick'
|
||
subheading: 'Your icon, then its colours. The top bar and your tab icon wear them.'
|
||
main:
|
||
heading: Main pane
|
||
matchGlass: Match glass opacity
|
||
subheading: Tint and opacity for the main content area, independent of the sidebar.
|
||
tint: Background tint
|
||
preview:
|
||
body: A short message, so the reading pane has something to show. None of this is real mail — the preview never loads any.
|
||
heading: Preview
|
||
hide: Hide preview
|
||
resize: Resize the preview
|
||
compose_body: A reply, part-written, so the composer has something in it. Nothing here is sent.
|
||
compose_heading: New message
|
||
compose_send: Send
|
||
compose_subject: 'Re: Notes on the Analytical Engine'
|
||
compose_to: ada@plmail.test
|
||
field_date: Date
|
||
field_from: From
|
||
field_subject: Subject
|
||
field_to: To
|
||
reply: Reply
|
||
sender1: Ada Lovelace
|
||
sender2: Grace Hopper
|
||
sender3: Kathleen Booth
|
||
sender4: Margaret Hamilton
|
||
sender5: Barbara Liskov
|
||
sender6: Karen Spärck Jones
|
||
sender7: Radia Perlman
|
||
sender8: Frances Allen
|
||
show: Show preview
|
||
snippet: This is what a preview line looks like, and how much of one fits before the row runs out of room for it.
|
||
subheading: Your settings, on a sample list. Nothing here is loaded from your mail.
|
||
to: to you
|
||
value_from: Ada Lovelace <ada@plmail.test>
|
||
value_to: you@plmail.test
|
||
subject1: Notes on the Analytical Engine
|
||
subject2: 'Re: the compiler draft'
|
||
subject3: Assembly notes, as promised
|
||
subject4: Guidance software — the priority list
|
||
subject5: 'Re: abstraction and the type hierarchy'
|
||
subject6: Term weighting, and why it matters
|
||
subject7: Spanning tree draft for review
|
||
subject8: 'Optimising the inner loop: results'
|
||
reset: Reset to defaults
|
||
subheading: Theme, density, type and background — the whole look of the app, in one place.
|
||
seg:
|
||
custom: 'Custom'
|
||
default: 'Theme default'
|
||
hidden: 'Hidden'
|
||
shown: 'Shown'
|
||
text:
|
||
autoDerive: Auto-derive
|
||
color: Text colour
|
||
faint: Faint
|
||
heading: Text
|
||
muted: Muted
|
||
subheading: Adjust text colour for legibility against your background.
|
||
theme:
|
||
dark: Dark
|
||
dusk: Dusk
|
||
heading: Theme
|
||
more: 'More themes'
|
||
light: Light
|
||
nord: Nord
|
||
paper: Paper
|
||
solar: Solar
|
||
subheading: Colour scheme for the whole interface.
|
||
system: System
|
||
typography:
|
||
family: Typeface
|
||
font:
|
||
grotesk: Grotesque
|
||
monospace: Monospace
|
||
serif: Serif
|
||
system: System
|
||
heading: Typography
|
||
scale: Text size
|
||
scaleHint: Applies to the whole interface. The compose window keeps its own font and size — those go out with the message.
|
||
subheading: The typeface and size the interface is drawn in.
|
||
compose_defaults:
|
||
heading: 'Compose defaults'
|
||
invalid: 'That setting could not be saved.'
|
||
read_receipt:
|
||
for_alias: 'Read receipts for %alias%'
|
||
hint: 'When a sender asks to be told you have read their message.'
|
||
inherit: 'Account default (%mode%)'
|
||
label: 'Read receipts'
|
||
mode:
|
||
always: 'Always send'
|
||
ask: 'Ask each time'
|
||
never: 'Never send'
|
||
saved: 'Saved.'
|
||
subheading: 'What each of your addresses does by default when it sends and receives.'
|
||
filters:
|
||
account: Account
|
||
action:
|
||
applyLabel: Apply label
|
||
archive: Skip inbox
|
||
fileInCategory: File in category
|
||
markRead: Mark as read
|
||
markSpam: Mark as spam
|
||
removeLabel: Remove label
|
||
saveToIntegration: Save attachments to
|
||
star: Star it
|
||
trash: Move to trash
|
||
add: New filter
|
||
add_action: Add action
|
||
add_condition: Add condition
|
||
add_group: Add group
|
||
all_accounts: All accounts
|
||
count: '%count% filters'
|
||
count_capped: 'Matches %count%+ existing messages'
|
||
count_error: Not a usable filter yet
|
||
# Pluralised in the browser, which is where the number changes —
|
||
# the builder swaps %count% in without another round trip, so the
|
||
# string has to carry both shapes. See rule_builder_controller.
|
||
count_exact: 'Matches %count% existing message|Matches %count% existing messages'
|
||
delete: Delete filter "%name%"
|
||
delete_confirm: 'Delete the filter "%name%"? Mail it already sorted stays where it is.'
|
||
delete_title: Delete filter
|
||
deleted: Filter deleted.
|
||
disable: Disable filter
|
||
disabled: Off
|
||
edit: 'Edit filter "%name%"'
|
||
edit_title: Edit filter
|
||
empty: No filters yet
|
||
empty_hint: Filters sort mail as it arrives — label it, skip the inbox, star it, or send it straight to the bin.
|
||
enable: Enable filter
|
||
error:
|
||
action_required: Add at least one action, or the filter would do nothing.
|
||
name_required: Give the filter a name.
|
||
field:
|
||
after: Received after
|
||
bcc: Bcc contains
|
||
before: Received before
|
||
body: Body contains
|
||
cc: Cc contains
|
||
filename: Attachment named
|
||
from: From contains
|
||
fromAddress: 'From is exactly'
|
||
fromDomain: 'Sender''s domain is'
|
||
hasAttachment: Has an attachment
|
||
hasKeyword: Is
|
||
hasLabel: Has label
|
||
listId: Mailing list is
|
||
maxSize: Smaller than (bytes)
|
||
minSize: Larger than (bytes)
|
||
notKeyword: Is not
|
||
notLabel: Does not have label
|
||
subject: Subject contains
|
||
text: Anywhere in the message
|
||
to: To contains
|
||
folder:
|
||
choose: Choose folder
|
||
# Shown when a "save attachments to" action names no folder of its
|
||
# own. The rule then stores none, and the upload lands wherever the
|
||
# connection is configured to put things — which is also what
|
||
# choosing the top level in the picker comes back as.
|
||
default: Default folder
|
||
heading: Filters
|
||
join:
|
||
and: and
|
||
none: 'none of: %list%'
|
||
or: or
|
||
keyword:
|
||
answered: replied to
|
||
draft: a draft
|
||
flagged: starred
|
||
seen: read
|
||
category_missing: '(deleted category)'
|
||
integration_missing: '(disconnected service)'
|
||
label_missing: '(deleted label)'
|
||
move_down: Move "%name%" later
|
||
move_up: Move "%name%" earlier
|
||
name: Name
|
||
name_placeholder: e.g. Invoices from Acme
|
||
new_title: New filter
|
||
no: No
|
||
no_actions: No actions yet
|
||
no_categories: 'No categories yet — create one first.'
|
||
no_integrations: 'No services connected — set one up in Integrations first.'
|
||
of_the_following: of the following
|
||
op:
|
||
all: All
|
||
any: Any
|
||
none: None
|
||
placeholder:
|
||
date: Pick a date
|
||
number: 0
|
||
text: Type a value…
|
||
already_running: That filter is already running.
|
||
queued: Queued — applying to existing mail in the background.
|
||
remove_action: Remove action
|
||
empty_group: 'This group is empty — it matches nothing until you add a condition.'
|
||
no_conditions: 'No conditions: this rule acts on every message it is scoped to.'
|
||
remove_condition: Remove condition
|
||
remove_group: Remove group
|
||
reorder: Drag to reorder
|
||
run: Apply to existing mail
|
||
run_state:
|
||
completed: 'Applied to %count% messages'
|
||
failed: 'Run stopped partway — %count% messages were done'
|
||
queued: 'Queued…'
|
||
running: 'Applying… %count% so far'
|
||
run_confirm: 'Apply "%name%" to mail you already have? This can move and relabel a lot of messages at once.'
|
||
saved: Filter saved.
|
||
spam_rule_name: 'Spam: %sender%'
|
||
stop: Stop after this filter
|
||
stop_help: Later filters are skipped for any message this one matches.
|
||
subheading: Sort mail automatically as it arrives.
|
||
summary:
|
||
# With an account chosen the scope IS the rule, so it is the
|
||
# subject of the sentence rather than a clause on the end.
|
||
every_message: 'this is any message'
|
||
every_message_in: 'this is any message in %account%'
|
||
full: 'If %conditions% → %actions%'
|
||
in_account: '%conditions%, in %account%'
|
||
# Two rules saving to the same connection read identically without
|
||
# this, which is exactly what picking a folder was for.
|
||
into_folder: '%action% into %folder%'
|
||
no_actions: 'If %conditions% → (no actions yet)'
|
||
then: Then
|
||
when: When
|
||
yes: Yes
|
||
handwriting:
|
||
# The HANDWRITTEN signature — a picture stamped onto a PDF. Not the
|
||
# `signature` section, which is the text appended to outgoing mail. The
|
||
# two are unrelated and the wording has to keep them apart.
|
||
heading: Handwritten signature
|
||
subheading: Draw it once, and place it on a PDF without drawing it again. It is a picture of your name, not a digital certificate.
|
||
saved: Your saved signature
|
||
save: Save signature
|
||
clear: Clear
|
||
remove: Remove saved signature
|
||
health:
|
||
awaiting:
|
||
calendar_resync: >-
|
||
Sync started. Waiting to hear how it went — this card will say
|
||
what happened as soon as it does.
|
||
confirm:
|
||
destructive: >-
|
||
This throws the waiting work away for good. Nothing is retried
|
||
and it cannot be brought back. Continue?
|
||
fact:
|
||
granted_at: 'Signed in on'
|
||
last_full_resync: 'Re-listed the whole mailbox (%count%×)'
|
||
never: 'never'
|
||
never_delivered: 'nothing has ever arrived'
|
||
never_run: 'no run recorded'
|
||
not_recorded: 'not recorded'
|
||
not_registered: 'not registered'
|
||
push_expires: 'Registration expires'
|
||
push_last_delivered: 'Last notification received'
|
||
push_last_renewal: 'Renewal last ran'
|
||
flash:
|
||
calendar_resync: >-
|
||
%calendar% has been asked to sync. It is running in the
|
||
background now, and the card below will say how it went.
|
||
push_repair_failed: >-
|
||
Could not re-register instant delivery for %account%. It stays
|
||
on the scheduled check, so your mail keeps arriving. The card
|
||
below shows what is known.
|
||
push_repaired: >-
|
||
Instant delivery re-registered for %account%.
|
||
queue_discarded: 'Discarded %count% abandoned jobs.'
|
||
queue_retried: 'Put %count% abandoned jobs back on the queue.'
|
||
heading: 'Account health'
|
||
healthy:
|
||
body: >-
|
||
Your accounts are signed in, your calendars are syncing and
|
||
nothing is waiting on you. If mail ever stops arriving, Account
|
||
health comes back to the settings list and this page says why.
|
||
title: 'Everything is working'
|
||
issue:
|
||
account_reconnect:
|
||
body: >-
|
||
New mail has stopped arriving for this account, and so has
|
||
everything that depends on it — calendar syncing, filters
|
||
that run on delivery, and sending from this address. The
|
||
mail already downloaded is safe and still here. This
|
||
happens when a password is changed, two-factor
|
||
authentication is switched on, or the sign-in is revoked
|
||
from the provider's security page.
|
||
title: '%account% needs you to sign in again'
|
||
account_grant_weekly_expiry:
|
||
body: >-
|
||
Mail is still arriving. But the last sign-in on this account
|
||
lasted %days% days before Google stopped accepting it, and
|
||
this one is now about the same age — so it is likely to stop
|
||
within a day or two.
|
||
|
||
That pattern is what Google does to an OAuth app whose
|
||
consent screen is still in Testing: refresh tokens issued by
|
||
one expire after about a week, however the app asks for
|
||
them. Signing in again buys another week and fixes nothing.
|
||
The fix is in the Google Cloud console — set the consent
|
||
screen's publishing status to In production. Publishing is
|
||
not the same as verification; an unverified app still works,
|
||
it just shows a warning screen the first time.
|
||
|
||
If you have not left it in Testing, ignore this — something
|
||
else ended that sign-in early, and it may not happen again.
|
||
title: '%account% is likely to need signing in again within a day or two'
|
||
account_reconnect_weekly:
|
||
body: >-
|
||
New mail has stopped arriving for this account, and so has
|
||
everything that depends on it — calendar syncing, filters
|
||
that run on delivery, and sending from this address. The
|
||
mail already downloaded is safe and still here.
|
||
|
||
This sign-in lasted %days% days, which is what Google does
|
||
to an OAuth app whose consent screen is still in Testing:
|
||
refresh tokens issued by one expire after about a week. If
|
||
that is this installation, signing in again will get the
|
||
mail moving and the same thing will happen next week. What
|
||
stops it is in the Google Cloud console — set the consent
|
||
screen's publishing status to In production. Publishing is
|
||
not the same as verification; an unverified app still works,
|
||
it just shows a warning screen the first time.
|
||
title: '%account% needs you to sign in again — and will again in a week'
|
||
account_scope_missing:
|
||
body: >-
|
||
Some of the permissions plMail asked for when this account
|
||
was connected were not granted, so parts of it do not work
|
||
and cannot. Calendars may not sync, and changes you make
|
||
here — marking read, archiving, starring — may be applied on
|
||
this screen and refused by the provider, then undone by the
|
||
next sync. Connect the account again and allow everything
|
||
you are asked for.
|
||
title: '%account% was not given full access'
|
||
account_sync_failing:
|
||
body: >-
|
||
Several attempts in a row have failed, so new mail is not
|
||
arriving for this account and anything that depends on it —
|
||
filters that run on delivery, and the unread counts — is
|
||
standing still. The mail already here is safe and unchanged.
|
||
The sign-in is fine, so this is the mail server refusing or
|
||
unreachable: check that it is up and that nothing has
|
||
changed about the host, the port or the password.
|
||
title: '%account% keeps failing to sync'
|
||
server_alert:
|
||
body: >-
|
||
Your mail server sent this message for you, and it is
|
||
repeated here word for word: “%alert%”. plMail cannot act on
|
||
it — a mailbox that is full, a password about to expire or a
|
||
server about to move are all things only you or your
|
||
provider can settle. It stays here until the server stops
|
||
saying it.
|
||
title: '%account% — a message from your mail server'
|
||
calendar_sync_failing:
|
||
body: >-
|
||
This calendar has stopped picking up changes, so it is
|
||
showing what it knew the last time it worked. Events added
|
||
or moved elsewhere since then are not here yet, and changes
|
||
you make here are not being sent out.
|
||
title: '%calendar% has stopped syncing'
|
||
calendars_blocked:
|
||
body: >-
|
||
All of these stopped for the same reason, which is the card
|
||
above — fixing that fixes them together. They are showing
|
||
what they knew the last time they worked, and nothing on
|
||
them has been deleted.
|
||
title: '%count% calendars are not syncing: %calendars%'
|
||
integration_reconnect:
|
||
body: >-
|
||
Saving attachments to %connection% and attaching files from
|
||
it will not work until it is connected again. Your mail is
|
||
unaffected — this is only the link to that service. Nothing
|
||
stored there has been touched.
|
||
title: '%connection% needs reconnecting'
|
||
integration_scope_missing:
|
||
body: >-
|
||
This connection works, but some of the permissions plMail
|
||
asked for were not granted — so parts of it will not work
|
||
and cannot. Browsing may come back empty while saving still
|
||
succeeds, or the other way round. Connect it again and allow
|
||
everything you are asked for.
|
||
title: '%connection% was not given full access'
|
||
push_degraded:
|
||
body: >-
|
||
The registration is live and has not expired, but mail has
|
||
arrived that it never announced — so the notifications are
|
||
being lost somewhere between the provider and this install,
|
||
not failing to be asked for. For Gmail that points at the
|
||
Pub/Sub subscription in Google Cloud: check that it still
|
||
forwards your topic to this address. Your mail keeps
|
||
arriving on the scheduled check in the meantime, a few
|
||
minutes later than it should.
|
||
title: 'Instant delivery is registered but not arriving for %account%'
|
||
push_lapsed:
|
||
body: >-
|
||
The registration expired and was not renewed, so nothing is
|
||
being pushed at all. Renewal runs once a day on its own; if
|
||
the last run below was days ago, the scheduled-task worker
|
||
has stopped and that is the thing to fix, not this account.
|
||
Your mail keeps arriving on the scheduled check, a few
|
||
minutes later than it should.
|
||
title: 'Instant delivery expired for %account%'
|
||
queue_work_abandoned:
|
||
body: >-
|
||
%count% background jobs tried, failed repeatedly, and were
|
||
set aside so they would stop retrying. This is usually the
|
||
aftermath of one of the problems above rather than a
|
||
separate fault — fix that first, then put these back on the
|
||
queue.
|
||
title: '%count% background jobs were given up on'
|
||
outcome:
|
||
calendar_failed_again: >-
|
||
It failed again. What it said this time is below — the sync ran,
|
||
it just did not work.
|
||
calendar_still_waiting: >-
|
||
The sync was started, but nothing has come back yet. Try again,
|
||
or reload the page to see where it got to.
|
||
calendar_synced: 'Synced. This calendar is up to date again.'
|
||
pending:
|
||
calendar_resync: 'Starting sync…'
|
||
push_resubscribe: 'Turning it back on…'
|
||
queue_discard: 'Discarding…'
|
||
queue_retry: 'Putting them back…'
|
||
reconnect: 'Taking you to %provider%…'
|
||
reconnect_generic: 'Taking you to sign in…'
|
||
repair:
|
||
calendar_resync:
|
||
label: 'Try syncing now'
|
||
promise: >-
|
||
Asks this calendar to sync again right away, and puts it
|
||
back on the normal schedule. Nothing on it is deleted.
|
||
integration_grant:
|
||
label: 'Grant full access'
|
||
promise: >-
|
||
Takes you back to %connection% to sign in again and grant
|
||
everything plMail asks for. Nothing stored there is touched.
|
||
integration_reconnect:
|
||
label: 'Reconnect'
|
||
promise: >-
|
||
Sends you to sign in again, then restores the existing
|
||
connection. Your filters and saved destinations keep
|
||
working.
|
||
push_resubscribe:
|
||
label: 'Turn instant delivery back on'
|
||
promise: >-
|
||
Registers this account for instant delivery again. Your
|
||
mail keeps arriving either way while this is sorted out.
|
||
queue_discard:
|
||
label: 'Discard them'
|
||
promise: >-
|
||
Throws the abandoned jobs away without running them. There
|
||
is no undo, and anything they had not finished stays
|
||
unfinished.
|
||
queue_retry:
|
||
label: 'Put them back on the queue'
|
||
promise: >-
|
||
Tries the abandoned jobs once more. Safe to press — any
|
||
that fail again simply end up back here.
|
||
grant_calendar:
|
||
label: 'Grant full access'
|
||
promise: >-
|
||
Takes you back to the provider to sign in as %account% and
|
||
grant everything plMail asks for. Nothing about your mail
|
||
changes, and no mail is re-downloaded.
|
||
reconnect_early:
|
||
label: 'Sign in again now'
|
||
promise: >-
|
||
Takes you to sign in again before this one runs out, so
|
||
nothing stops in the meantime. Your mail, folders, labels,
|
||
filters, calendars and settings all stay exactly as they are.
|
||
You must sign in as %account%. This buys another week — it
|
||
does not stop it happening again, which is what publishing
|
||
the consent screen does.
|
||
reconnect:
|
||
label: 'Reconnect this account'
|
||
promise: >-
|
||
Takes you to sign in again, then puts the new sign-in onto
|
||
this same account. Your mail, folders, labels, filters,
|
||
calendars and settings all stay exactly as they are —
|
||
nothing is downloaded again and nothing is deleted. You
|
||
must sign in as %account%; if you pick a different address
|
||
it will be refused rather than swapped in.
|
||
reconnect:
|
||
done: '%account% is connected again. Mail and calendar syncing will catch up over the next few minutes.'
|
||
wrong_account: >-
|
||
That signed you in as %actual%, but this account is %expected%.
|
||
Nothing has been changed. Sign out of %actual% with that
|
||
provider, then try again — swapping the address would have
|
||
mixed a different mailbox into this one.
|
||
subheading: >-
|
||
Anything that has stopped working, what it means for your mail, and
|
||
the smallest thing that fixes it.
|
||
technical_detail: 'Technical detail'
|
||
compose_behavior:
|
||
folded: 'Folded'
|
||
forward_quote: 'Quoted text when forwarding'
|
||
forward_quote_hint: 'Open a forward with the original folded behind the pill, or laid out in full.'
|
||
send_feedback: When you press Send
|
||
send_feedback_hint: 'Close the window straight away and count the undo down in a toast, or keep the window open and let its own Send button be the cancel.'
|
||
send_optimistic: Close it
|
||
send_hold: Keep it open
|
||
heading: 'Composing'
|
||
open: 'Open'
|
||
subheading: 'How the compose window behaves for you, on every account.'
|
||
insights:
|
||
extractor:
|
||
flight: Flights
|
||
flight_hint: Flight numbers and departures from airline bookings and check-in mail.
|
||
github: GitHub
|
||
github_hint: Issues and pull requests from GitHub notification mail.
|
||
invoice: Invoices
|
||
invoice_hint: Amounts owed and due dates, read from bills and payment reminders.
|
||
otp: Login codes
|
||
otp_hint: One-time codes from sign-in and verification mail, with the expiry the mail states.
|
||
parcel: Parcels
|
||
parcel_hint: Tracking numbers and delivery progress from shipping confirmations.
|
||
subscription: Subscriptions
|
||
subscription_hint: Automatic renewals and ending trials, with the day they take effect.
|
||
ticket: Tickets
|
||
ticket_hint: Event tickets and bookings with a date attached.
|
||
heading: Insights
|
||
pane: Strip above the mail list
|
||
pane_hint: >-
|
||
Shows the next parcel, flight or ticket in a band above your
|
||
inbox. Switching it off hides that band and nothing else —
|
||
plMail still reads those facts out of your mail, and they stay
|
||
in the radar panel and on the mail itself.
|
||
seg:
|
||
'off': 'Off'
|
||
'on': 'On'
|
||
subheading: >-
|
||
Facts plMail reads out of your mail — parcels, flights, tickets,
|
||
GitHub activity — locally and by fixed rules rather than a cloud or
|
||
a model, and switching one off stops new cards from that source.
|
||
integrations:
|
||
ask_admin: 'Your administrator has not enabled this service.'
|
||
auth:
|
||
appPassword: 'app password'
|
||
oauth2: 'sign-in'
|
||
available_heading: 'Connect a service'
|
||
badge:
|
||
ask_admin: 'not enabled'
|
||
soon: 'coming soon'
|
||
checked: 'checked %date%'
|
||
connect: Connect
|
||
disabled: 'Connection paused'
|
||
disconnect: Disconnect
|
||
disconnect_confirm: 'Disconnect %name%? Files already attached to mail are unaffected.'
|
||
disconnected: 'Service disconnected'
|
||
edit: Edit
|
||
empty: 'No services connected yet.'
|
||
enabled: 'Connection resumed'
|
||
field:
|
||
base_url: 'Server address'
|
||
base_url_fixed: 'Connecting to %url%, set by your administrator.'
|
||
name: Name
|
||
name_help: 'Only shown to you, so you can tell two connections apart.'
|
||
permissions:
|
||
immich: 'asset.read — see your photos and videos|asset.download — attach the original file|asset.view — show previews in the picker|asset.upload — save attachments into Immich|album.read — list and browse your albums|albumAsset.create — file saved attachments into an album'
|
||
permissions_heading: 'Permissions this key needs'
|
||
permissions_note: 'Granting the key all permissions also works, and is simpler if you would rather not tick boxes.'
|
||
secret:
|
||
dropbox: 'Access token'
|
||
googleDrive: 'Access token'
|
||
googlePhotos: 'Access token'
|
||
immich: 'API key'
|
||
nextcloud: 'App password'
|
||
oneDrive: 'Access token'
|
||
paperless: 'API token'
|
||
secret_help:
|
||
dropbox: ''
|
||
googleDrive: ''
|
||
googlePhotos: ''
|
||
immich: 'Create one in Immich under Account Settings → API Keys.'
|
||
nextcloud: 'Create one in Nextcloud under Settings → Security → Devices & sessions. Do not use your login password.'
|
||
oneDrive: ''
|
||
paperless: 'Copy it from Paperless under My Profile → API Auth Token.'
|
||
secret_unchanged: 'Leave blank to keep the stored credential'
|
||
username: Username
|
||
heading: Integrations
|
||
not_implemented: 'plMail cannot talk to this service yet.'
|
||
oauth_no_code: 'The service did not return an authorisation code. Please try again.'
|
||
oauth_state_mismatch: 'That sign-in could not be verified. Please start again.'
|
||
not_oauth: 'This service does not use that sign-in method.'
|
||
pause: Pause
|
||
paused: paused
|
||
resume: Resume
|
||
save_tests: 'Saving checks the connection straight away.'
|
||
saved: 'Service connected'
|
||
saved_with_error: 'Saved, but the connection test failed'
|
||
subheading: 'Attach files from other services, and save attachments to them.'
|
||
test: Test
|
||
test_failed: 'Connection test failed'
|
||
test_ok: 'Connection is working'
|
||
unavailable_heading: 'Not available here'
|
||
calendar_behaviour:
|
||
button: Calendar button
|
||
button_hint: 'Which views the button in the top bar steps through. A view it leaves out is not removed: the drag handle still reaches it.'
|
||
heading: Behaviour
|
||
option_calendar: Split only
|
||
option_none: All three
|
||
option_split: Full width only
|
||
subheading: 'How the calendar button in the top bar moves between views.'
|
||
calendars:
|
||
account_hint: Where events found in mail from %address% are filed.
|
||
caldav:
|
||
connect: Connect a CalDAV server
|
||
disconnect: Disconnect "%name%"
|
||
disconnect_confirm: >-
|
||
Disconnect "%name%"? Every calendar mirrored from it is removed
|
||
here. Anything on them that came from your mail rather than from
|
||
a calendar is moved to your default calendar first.
|
||
disconnect_title: Disconnect this server
|
||
field:
|
||
address: Server address
|
||
address_help: >-
|
||
The CalDAV address your server shows you, or just its domain
|
||
— plMail asks the domain where its calendars live before
|
||
giving up.
|
||
name: Name
|
||
name_help: What to call this connection in your settings.
|
||
reuse: Use the password from one of my mail accounts
|
||
reuse_account: Which account's password
|
||
reuse_account_none: Choose an account…
|
||
reuse_help: >-
|
||
Off by default, and worth leaving off: most servers want an
|
||
app-specific password, and ticking this sends a password you
|
||
gave plMail for your mailbox to the address above.
|
||
secret: App password
|
||
secret_help: >-
|
||
Create one on your server rather than using your login
|
||
password — iCloud and Fastmail accept nothing else.
|
||
username: Username
|
||
username_help: The account name your server knows you by.
|
||
intro: >-
|
||
Any CalDAV server: Nextcloud, Radicale, Baïkal, Fastmail,
|
||
iCloud, a box in a cupboard. Gmail and Outlook calendars do not
|
||
come in this way — they arrive with the mail account.
|
||
submit: Connect and find calendars
|
||
title: Connect a CalDAV server
|
||
count: '%count% calendars'
|
||
default: Default
|
||
delete: Delete calendar "%name%"
|
||
delete_title: Delete calendar
|
||
edit: Edit calendar "%name%"
|
||
empty: No calendars yet.
|
||
from: From %name%
|
||
heading: Calendars
|
||
hide: Hide calendar
|
||
last_synced: 'Last synced %when%'
|
||
make_default: Make "%name%" the calendar new events land on
|
||
make_default_title: Make default
|
||
mirrored: Mirrored
|
||
mirrored_hint: Kept in step with %name%.
|
||
never_synced: Not synced yet
|
||
read_only: Read-only
|
||
read_only_hint: This calendar does not accept changes from here.
|
||
show: Show calendar
|
||
sources:
|
||
empty: >-
|
||
No account or connection here carries calendars yet. Gmail and
|
||
Outlook accounts do; connect a CalDAV server for anything else.
|
||
find: Find calendars on %name%
|
||
heading: Where calendars come from
|
||
why_admin: >-
|
||
Your administrator may not have added calendar permissions to
|
||
the app registration plMail signs in with. Mail keeps working
|
||
without them; calendars do not.
|
||
why_consent: >-
|
||
Google's consent screen lets you untick calendar access while
|
||
allowing mail. Reconnect the account and leave the calendar box
|
||
ticked.
|
||
why_empty: No calendars appearing?
|
||
why_none: The account may simply have no calendars on it.
|
||
subheading: >-
|
||
Name, colour and time zone, which calendars the views show, and
|
||
where a new event lands.
|
||
subscribe:
|
||
default_locked: >-
|
||
New events land here, so this one stays. Make another calendar
|
||
the default first.
|
||
empty: There are no calendars on %name%.
|
||
intro: >-
|
||
Tick the calendars on %name% to keep in step with plMail. Events
|
||
appear within a minute of ticking one.
|
||
mirrored: Already mirrored
|
||
primary: Main
|
||
save: Save subscriptions
|
||
title: Find my calendars
|
||
unsubscribe_note: >-
|
||
Unticking a calendar deletes the copy held here. Anything on it
|
||
that came from your mail rather than from the calendar is moved
|
||
to your default calendar first.
|
||
sync_now: Sync "%name%" now
|
||
sync_now_title: Sync now
|
||
labels:
|
||
count: '%count% labels'
|
||
delete: Delete label "%name%"
|
||
edit: Edit label "%name%"
|
||
empty: No labels yet — create one, or they appear after the first sync.
|
||
heading: Labels
|
||
hide: Hide label
|
||
show: Show label
|
||
subheading: Create, rename and organise your labels, and choose which appear in the sidebar.
|
||
system: System
|
||
profile:
|
||
heading: Your profile
|
||
save: Save profile
|
||
subheading: The name and picture shown on the mail you send.
|
||
language:
|
||
heading: Language
|
||
subheading: The language plMail's interface is shown in. Your mail is left as it was written.
|
||
disposal:
|
||
delete_now: Delete-now buttons
|
||
delete_now_hint: >-
|
||
Offers Delete forever on a row in Spam and the bin, and above a ticked
|
||
selection there. It removes the mail from your mail server too and
|
||
cannot be undone, so it is off until you turn it on.
|
||
heading: Disposal
|
||
'off': 'Off'
|
||
'on': 'On'
|
||
subheading: How mail is thrown away for good.
|
||
nav:
|
||
accounts: Mail accounts
|
||
ai: 'Assistant'
|
||
aliases: Aliases
|
||
app_passwords: App passwords
|
||
appearance: Appearance
|
||
calendar_behaviour: Behaviour
|
||
calendars: Calendars
|
||
disposal: Disposal
|
||
filters: Filters
|
||
general: General
|
||
group:
|
||
access: Access
|
||
calendar: Calendar
|
||
features: Features
|
||
mail: Mail
|
||
personal: Personal
|
||
health: 'Account health'
|
||
insights: Insights
|
||
integrations: Integrations
|
||
labels: Labels
|
||
notifications: Notifications
|
||
profile: Profile
|
||
read_receipts: Read receipts
|
||
reading_pane: Reading pane
|
||
security: Security
|
||
sharing: Sharing
|
||
shortcuts: Keyboard shortcuts
|
||
signature: Signatures
|
||
templates: 'Templates'
|
||
notifications:
|
||
devices:
|
||
empty: >-
|
||
No device is registered yet. Turning notifications on above
|
||
registers this browser; a phone app registers itself.
|
||
heading: 'Registered devices'
|
||
never_delivered: 'Nothing sent yet'
|
||
outcome:
|
||
accepted: 'Delivered'
|
||
failed: 'Failed'
|
||
skipped: 'Not sent'
|
||
subscription-destroyed: 'Dropped'
|
||
remove: 'Remove'
|
||
remove_confirm: >-
|
||
Remove %device%? Notifications stop being sent to it. Nothing is
|
||
uninstalled or turned off on the device itself, and if its app
|
||
still wants notifications it will register again the next time
|
||
it runs.
|
||
removed: >-
|
||
Device removed — nothing more is sent to it. It registers itself
|
||
again if its app still wants notifications.
|
||
transport:
|
||
fcm: 'Firebase'
|
||
webpush: 'Web Push'
|
||
unverified: 'Not verified'
|
||
verified: 'Verified'
|
||
heading: Notifications
|
||
ios_hint: >-
|
||
On iPhone and iPad, notifications only work once plMail is added to
|
||
the Home Screen: open it in Safari, tap Share, then "Add to Home
|
||
Screen", and enable notifications from there.
|
||
state_denied: >-
|
||
Blocked in your browser settings. Allow notifications for this site,
|
||
then try again.
|
||
state_error: Something went wrong. Try again.
|
||
state_off: 'Off — this device will not be notified.'
|
||
state_on: On — this device gets notified of new mail.
|
||
state_pending: Waiting for this device to confirm…
|
||
state_unconfigured: Push is not configured on this server.
|
||
state_unknown: Checking…
|
||
state_unsupported: >-
|
||
This browser cannot receive notifications. On iPhone and iPad, add
|
||
plMail to the Home Screen first.
|
||
state_working: Working…
|
||
subheading: >-
|
||
Get notified of new mail on this device, even when plMail is closed.
|
||
this_device: This device
|
||
toggle: Enable notifications
|
||
toggle_off: Disable notifications
|
||
unconfigured: >-
|
||
Push is not configured on this server — no VAPID keys are set.
|
||
Run "bin/console app:push:generate-vapid-keys".
|
||
password:
|
||
field:
|
||
current: Current password
|
||
new: New password
|
||
new_help: 'At least %count% characters. Nothing else is required of it — a long thing you can remember beats a short thing you cannot.'
|
||
repeat: Repeat the new password
|
||
flash:
|
||
changed: 'Password changed. Every device you ticked "keep me logged in" on will ask for it again.'
|
||
refused: 'Nothing was changed — see the message under the field.'
|
||
heading: Password
|
||
remember_me_note: 'Changing your password signs out every remembered browser except this one. That is what makes it worth doing when a device goes missing.'
|
||
subheading: 'What you sign in with. Only you can change it — not even an administrator can set it for you.'
|
||
submit: Change password
|
||
reading_pane:
|
||
heading: Reading pane
|
||
hint: 'Off shows the list and the message one at a time. Right puts the message beside the list when the window has room for both — drag the divider between them to choose how much each gets.'
|
||
label: 'Show the open message'
|
||
off: Off
|
||
right: Right
|
||
subheading: 'Where a conversation opens: in place of the list, or beside it.'
|
||
security:
|
||
codes:
|
||
copy: Copy codes
|
||
copy_now: Save your recovery codes now
|
||
copy_now_hint: >-
|
||
This is the only time they are shown. Keep them somewhere you can
|
||
reach without your phone — a password manager, or paper in a
|
||
drawer. Each one works once.
|
||
heading: Recovery codes
|
||
hint: >-
|
||
Recovery codes get you back in if you lose your phone. Generating
|
||
a new set replaces the old one, so anything you wrote down before
|
||
stops working.
|
||
regenerate: Generate new codes
|
||
remaining: '%count% unused'
|
||
confirm_with_code: Code from your app
|
||
devices:
|
||
empty: No devices are remembered. You will be asked for a code every time you sign in.
|
||
expires: 'Expires %date%'
|
||
heading: Remembered devices
|
||
hint: >-
|
||
Devices that skip the code prompt for 30 days. Revoking one takes
|
||
effect immediately — it will ask for a code on its very next page
|
||
load.
|
||
last_used: 'Last used %date% from %ip%'
|
||
revoke: Revoke
|
||
revoke_all: Revoke every remembered device
|
||
revoke_all_confirm: >-
|
||
Every remembered device will be asked for a code next time,
|
||
including this one. Continue?
|
||
revoke_confirm: 'Stop trusting %name%? It will be asked for a code next time.'
|
||
this_device: this device
|
||
disable:
|
||
confirm: >-
|
||
Your account will be protected by your password alone. Continue?
|
||
heading: Turn off two-factor authentication
|
||
hint: >-
|
||
This deletes your recovery codes and stops trusting every
|
||
remembered device.
|
||
submit: Turn off
|
||
enable: Set up two-factor authentication
|
||
enrol:
|
||
cancel: Cancel
|
||
heading: Set up two-factor authentication
|
||
manual_copy: Copy setup key
|
||
manual_toggle: Can't scan? Enter a key instead
|
||
qr_alt: QR code for setting up your authenticator app
|
||
step_app: >-
|
||
Install an authenticator app if you don't have one — Google
|
||
Authenticator, Aegis, 1Password and Bitwarden all work.
|
||
step_confirm: Enter the six-digit code your app is showing now.
|
||
step_scan: Scan this with the app.
|
||
submit: Confirm
|
||
heading: Two-factor authentication
|
||
pitch: >-
|
||
Your account is the one worth protecting most: anyone who reaches it
|
||
can reset the password on everything else you own, because your mail
|
||
is where the reset links arrive. A second factor means a stolen
|
||
password is not enough on its own.
|
||
status:
|
||
off: Two-factor authentication is off
|
||
on: Two-factor authentication is on
|
||
on_since: 'Enabled %date%'
|
||
subheading: How you prove it is you when signing in.
|
||
sharing:
|
||
heading: Sharing
|
||
subheading: >-
|
||
Links that show part of your calendar to someone without an account,
|
||
and pages that let them book an hour of it.
|
||
shortcuts:
|
||
heading: "Keyboard shortcuts"
|
||
hint: "c to compose, e to archive, j and k to move through a list. They only act while you are not typing into something, and filing mail this way can be undone like any other."
|
||
label: "Shortcuts"
|
||
'off': "Off"
|
||
'on': "On"
|
||
show: "Show the shortcuts"
|
||
subheading: "Single keys for the things you do all day."
|
||
signature:
|
||
for_alias: 'Signature for %alias%'
|
||
heading: Signatures
|
||
hint: 'Added to the bottom of every new message, above the quoted reply.'
|
||
label: Signature
|
||
overriding: 'That address has its own signature now — edit it below.'
|
||
per_address:
|
||
count: 'Addresses with a signature of their own: %number%'
|
||
disclosure: 'Use a different signature for some addresses'
|
||
inherits: 'Uses the account signature.'
|
||
override: 'Use a different one'
|
||
override_for: 'Give %alias% a signature of its own'
|
||
revert: 'Use the account signature'
|
||
revert_for: 'Go back to the account signature for %alias%'
|
||
signs_with_nothing: 'Empty, so this address signs with nothing.'
|
||
placeholder: 'No signature'
|
||
reverted: 'Back to the account signature.'
|
||
save: 'Save signature'
|
||
saved: 'Saved.'
|
||
source:
|
||
clean: 'Nothing was removed.'
|
||
embedded: 'Images stored in the signature: %count%.'
|
||
failed: 'The signature could not be rendered. Your HTML is unchanged. Try again.'
|
||
html: 'HTML'
|
||
label: '%label% as HTML'
|
||
placeholder: 'Paste or write the HTML of your signature…'
|
||
remote: 'Images that could not be stored and stay linked: %count%. They do not show here and some recipients have to allow them first.'
|
||
removed: 'Removed, because mail clients would not show it or it is not safe to send: %items%.'
|
||
rendered: 'Rendered'
|
||
toggle: 'Signature view'
|
||
subheading: 'What is added to the bottom of the messages you write.'
|
||
categories:
|
||
add: Add
|
||
created: 'Created "%name%".'
|
||
delete: Delete category
|
||
delete_confirm: 'Delete "%name%"? Mail filed there goes back to the tab it would otherwise be in. No mail is deleted.'
|
||
deleted: 'Deleted "%name%".'
|
||
empty: 'You have no tabs of your own yet.'
|
||
error:
|
||
empty: 'A category needs a name.'
|
||
reserved: 'That name belongs to one of the built-in tabs.'
|
||
taken: 'You already have a category with that name.'
|
||
too_long: 'That name is too long (40 characters at most).'
|
||
filters_link: 'Settings → Filters.'
|
||
heading: Your own tabs
|
||
hint: 'A tab shows in the inbox while it holds mail. Mail goes into it through a filter whose action is "File in category" — set one up under'
|
||
name_label: Name
|
||
placeholder: 'e.g. Shipping'
|
||
rename: Rename
|
||
renamed: 'Renamed to "%name%".'
|
||
subheading: 'Inbox tabs you name yourself, beside the five that come with plMail.'
|
||
sorting:
|
||
again:
|
||
button: Ask again
|
||
hint: The assistant answers once per message and keeps the answer. Ask again after the model, the prompt or a plMail release has changed — it costs a model call per message, so it is bounded to your newest mail.
|
||
label: Sort recent mail again
|
||
applies_to_new: Changing either of these re-files the mail you already have, in the background — a large mailbox takes a few minutes, so give the tabs a moment to settle. Conversations you moved to a tab yourself are left alone.
|
||
heading: Categories
|
||
override:
|
||
hint: A Gmail account arrives already sorted by Google. This decides whether plMail leaves that alone or answers for itself.
|
||
label: On Gmail accounts
|
||
plmail: Sort it myself
|
||
provider: Keep Google's
|
||
source:
|
||
assistant: The assistant
|
||
assistant_help: The assistant reads each message and decides what it is for. Better at mail that does not announce itself, and occasionally confidently wrong. Anything it has not reached yet falls back to the rules.
|
||
label: Sorted by
|
||
rules: Rules
|
||
rules_help: Headers only — a mailing-list header, an unsubscribe link, a known sender. Predictable and literal, and it never asks the model anything.
|
||
unavailable: Sorting by assistant needs mail sorting switched on for this installation, and for you.
|
||
subheading: Whether your inbox has tabs, which one a message lands in, and who decides.
|
||
tabs:
|
||
assistant_warning: The assistant is still reading every new message to decide which tab it belongs in — tabs you have switched off. Mail it has not answered for yet can be held back for a few seconds while it does. Choose Rules below to stop that.
|
||
hint: Primary, Social, Promotions and the rest. Off shows the inbox as one list. Mail is still filed in the background, so the tabs are right the moment you switch them back on.
|
||
label: Inbox tabs
|
||
'off': One list
|
||
'on': Tabs
|
||
timezone:
|
||
heading: Time zone
|
||
subheading: The clock times and dates are shown in. Nothing is rewritten — the same instant is simply read on your own clock.
|
||
label: Time zone
|
||
follow_default: 'Server default (%timezone%)'
|
||
current_time: 'It is currently %time% in this zone.'
|
||
title: Settings
|
||
templates:
|
||
add: 'New template'
|
||
add_folder: 'New folder'
|
||
body: 'Message'
|
||
body_placeholder: 'Write the message. Use “Insert variable” for the parts that change.'
|
||
copy_of: 'Copy of %name%'
|
||
date:
|
||
after: 'after today'
|
||
before: 'before today'
|
||
direction: 'Before or after today'
|
||
example: 'Written today, it reads:'
|
||
format: 'Format'
|
||
heading: 'Date'
|
||
offset: 'Offset'
|
||
pattern: 'Pattern'
|
||
pattern_hint: 'A pattern uses d for the day, M for the month, y for the year and E for the weekday: dd.MM.yyyy, EEEE d MMMM.'
|
||
unit: 'Unit'
|
||
delete: 'Delete'
|
||
delete_confirm: 'Delete the template “%name%”?'
|
||
deleted: 'Template deleted.'
|
||
duplicate: 'Duplicate'
|
||
duplicated: 'Template duplicated.'
|
||
editor_empty: 'Choose a template to edit it, or create a new one.'
|
||
empty: 'No templates yet. A template filed under an account is offered first when you write from it.'
|
||
error:
|
||
folder_name_required: 'Give the folder a name.'
|
||
name_required: 'Give the template a name.'
|
||
folder: 'Folder'
|
||
folder_delete_confirm: 'Delete the folder “%folder%”? Its templates move up one level and are kept.'
|
||
folder_deleted: 'Folder deleted. Its templates were kept.'
|
||
folder_heading_new: 'New folder'
|
||
folder_heading_rename: 'Rename folder'
|
||
folder_in: 'Inside'
|
||
folder_name: 'Name'
|
||
folder_saved: 'Folder saved.'
|
||
format:
|
||
custom: 'Custom pattern'
|
||
full: 'Full'
|
||
iso: 'ISO'
|
||
long: 'Long'
|
||
medium: 'Medium'
|
||
short: 'Short'
|
||
weekday: 'Weekday'
|
||
group:
|
||
date: 'Date'
|
||
recipient: 'Recipient'
|
||
sender: 'Sender'
|
||
heading: 'Templates'
|
||
insert_variable: 'Insert variable'
|
||
name: 'Name'
|
||
name_placeholder: 'Invoice reminder'
|
||
preview: 'Preview'
|
||
preview_heading: 'As it would be inserted today, for a sample recipient'
|
||
preview_no_subject: 'No subject'
|
||
preview_unavailable: 'Add a mail account to preview a template.'
|
||
# "Name <address>" exactly: it is read by the same code that reads a
|
||
# recipient chip in the compose window, so the preview fills a first
|
||
# name the way a real message would.
|
||
sample_recipient: 'Dana Whitfield <dana@example.org>'
|
||
saved: 'Template saved.'
|
||
signature:
|
||
automatic: 'Automatic — the address you are writing from'
|
||
heading: 'Signature'
|
||
hint: 'Automatic follows the From address and replaces the signature already in the message. A named signature stays, whichever address you write from.'
|
||
subheading: 'Messages you write once and insert while composing.'
|
||
subject: 'Subject'
|
||
subject_hint: 'optional, fills an empty subject line'
|
||
subject_placeholder: 'No subject'
|
||
top_level: 'No folder'
|
||
tree:
|
||
add_folder_here: 'New folder in %folder%'
|
||
add_here: 'New template in %folder%'
|
||
delete_folder: 'Delete the folder %folder%'
|
||
rename: 'Rename the folder %folder%'
|
||
unit:
|
||
d: 'days'
|
||
m: 'months'
|
||
w: 'weeks'
|
||
|
||
shortcuts:
|
||
groups:
|
||
actions: "On mail"
|
||
actions_hint: "What is selected; otherwise the open conversation; otherwise the highlighted row."
|
||
anywhere: "Anywhere"
|
||
conversation: "In a conversation"
|
||
list: "In a list"
|
||
keys:
|
||
archive: "Archive"
|
||
back: "Back to the list"
|
||
compose: "Write a new message"
|
||
delete: "Delete"
|
||
forward: "Forward"
|
||
go_archive: "Go to Archive"
|
||
go_drafts: "Go to Drafts"
|
||
go_inbox: "Go to the Inbox"
|
||
go_sent: "Go to Sent"
|
||
go_starred: "Go to Starred"
|
||
help: "Show this list"
|
||
label: "Label as"
|
||
mark_read: "Mark as read"
|
||
mark_unread: "Mark as unread"
|
||
move: "Move to"
|
||
next: "Down one conversation"
|
||
next_conversation: "Open the next conversation"
|
||
open: "Open the highlighted conversation"
|
||
previous: "Up one conversation"
|
||
previous_conversation: "Open the previous conversation"
|
||
reply: "Reply"
|
||
reply_all: "Reply to all"
|
||
search: "Search"
|
||
select: "Select the highlighted conversation"
|
||
select_all: "Select all on the page"
|
||
select_none: "Clear the selection"
|
||
select_read: "Select read"
|
||
select_starred: "Select starred"
|
||
select_unread: "Select unread"
|
||
snooze: "Snooze"
|
||
spam: "Mark as spam"
|
||
star: "Star or unstar"
|
||
undo: "Undo the last action"
|
||
or: "or"
|
||
switched_off: "Shortcuts are switched off for you. Switch them on under Settings → General."
|
||
then: "then"
|
||
title: "Keyboard shortcuts"
|
||
|
||
sidebar:
|
||
accounts:
|
||
add: Add account
|
||
heading: Accounts
|
||
none: No accounts yet
|
||
colour: 'Colour marking %account%'
|
||
colour_disabled: 'Colour marking %account%, which is switched off'
|
||
open: 'Open %account%'
|
||
toggle: 'Show or hide folders in %account%'
|
||
badge:
|
||
total: '%count% in total'
|
||
unread: '%count% unread'
|
||
compose: Compose
|
||
labels:
|
||
add: Create label
|
||
heading: Labels
|
||
none: No labels yet
|
||
new_mail_here: 'New mail in %where%'
|
||
new_mail_here_count: '%count% new in %where%'
|
||
nav:
|
||
archive: Archive
|
||
calendar: Calendar
|
||
drafts: Drafts
|
||
inbox: Inbox
|
||
more: More
|
||
sent: Sent
|
||
snoozed: Snoozed
|
||
spam: Spam
|
||
starred: Starred
|
||
trash: Trash
|
||
unread: Unread
|
||
toggle: Show or hide the sidebar
|
||
|
||
snooze:
|
||
later_today: Later today
|
||
next_week: Next week
|
||
pick_date: Pick a date and time
|
||
this_weekend: This weekend
|
||
tomorrow: Tomorrow
|
||
unsnooze: Unsnooze
|
||
|
||
snoozed:
|
||
empty: Nothing is snoozed.
|
||
|
||
starred:
|
||
empty: No starred messages.
|
||
heading: Starred
|
||
|
||
tabs:
|
||
forums: Forums
|
||
new_count: '%count% new'
|
||
primary: Primary
|
||
promotions: Promotions
|
||
social: Social
|
||
updates: Updates
|
||
|
||
thread:
|
||
no_subject: (no subject)
|
||
summary:
|
||
button: 'Summarise this conversation'
|
||
disclaimer: 'Written by a model from the messages below. Read them if it matters.'
|
||
error:
|
||
connection_lost: 'The connection to plMail was lost while the summary was being written. The model host is not involved; something between this browser and the server closed the connection.'
|
||
disabled: 'Summaries are switched off.'
|
||
generic: 'The summary could not be written.'
|
||
model_missing: 'The model host does not have the writing model. An administrator has to pull it first.'
|
||
no_answer: 'The model gave no answer.'
|
||
refused: 'The model host refused the request. If this was the whole conversation, it may be more than that machine can hold at once.'
|
||
timeout: 'The model host took too long to answer.'
|
||
unreachable: 'The model host could not be reached.'
|
||
generated: 'Summarised %when%'
|
||
heading: 'Summary'
|
||
regenerate: 'Summarise again'
|
||
partial: 'This conversation was too long to send in full, so the summary was written from part of it.'
|
||
send_full: 'Summarise the whole conversation instead — slower, and it asks more of the model host.'
|
||
stale: 'The conversation has changed since this was written.'
|
||
state:
|
||
sent: 'Sent to the model…'
|
||
stopped: 'Stopped. Nothing was saved.'
|
||
waiting: 'The first request after a while takes about a minute while the model loads and reads the conversation.'
|
||
queued: 'Queued. The whole conversation is being summarised in the background — you can close this and come back; it will be here.'
|
||
reading: 'Still reading the conversation — %elapsed% so far. After that, the summary appears word by word.'
|
||
waiting_full: 'Reading the whole conversation. This can take several minutes on a long thread, and nothing appears until it has finished reading.'
|
||
working: 'Summarising…'
|
||
stop: 'Stop'
|
||
too_short: 'One message. There is nothing to summarise.'
|
||
thread_row:
|
||
# The word in the badge, and the phrase a screen reader gets instead. The
|
||
# a list, does not say new what.
|
||
# badge has room for one word; "New" alone, read out on the fortieth row of
|
||
account: 'Received on %account%'
|
||
actions:
|
||
archive: Archive
|
||
cancel_schedule: Cancel scheduled send
|
||
delete: Delete
|
||
mark_read: Mark as read
|
||
mark_unread: Mark as unread
|
||
snooze: Snooze
|
||
answer: New reply to your message
|
||
answer_badge: Reply
|
||
has_attachment: Has attachment
|
||
me: me
|
||
meaning: 'Found by meaning, not by the words you typed'
|
||
meaning_badge: 'meaning'
|
||
message_count: "({ count })"
|
||
new: Not shown to you before
|
||
new_badge: New
|
||
no_recipient: (no recipient)
|
||
no_subject: (no subject)
|
||
scheduled: 'Scheduled %when%'
|
||
select: Select
|
||
star: Star this message
|
||
to: 'To: %recipients%'
|
||
unread: Unread
|
||
unstar: Unstar this message
|
||
|
||
toast:
|
||
# After Archive, from a row, the reading pane or the toolbar. The row is
|
||
# gone, which is also what a slip of the pointer looks like — this says
|
||
# which it was, beside an Undo.
|
||
archived: Conversation archived.
|
||
# After a conversation is dropped on a category tab. The row it names
|
||
# has just disappeared off the list, and the tab it went to may not be
|
||
# on the strip at all — the strip only shows categories holding mail —
|
||
# so this is the only thing on screen saying where it landed.
|
||
categorised: 'Moved to %category%'
|
||
dismiss: Dismiss
|
||
# After a conversation is dropped on a folder. Names the folder for the
|
||
# same reason: the row is gone from the list that was open, and a drop
|
||
# is aimed at a small target.
|
||
# After a conversation is dropped on a label rather than a folder. The row
|
||
# stays where it is — the chip beside the subject is the only other sign,
|
||
# and it is most of the way across the screen from where the pointer let go.
|
||
labelled: 'Labelled %label%'
|
||
moved: 'Moved to %folder%'
|
||
schedule_cancelled: Scheduled send cancelled.
|
||
# Shown when the cancel lost the race to the send. Deliberately blunt: the
|
||
# message has gone and nothing here can bring it back, and the previous
|
||
# behaviour — claiming it was cancelled — was worse than saying nothing.
|
||
send_too_late: Too late — that message had already been sent.
|
||
send_failed: 'That message could not be sent: %subject%'
|
||
sent: Message sent.
|
||
spam_filtered: 'Moved to Spam. Future mail from %sender% goes there too.'
|
||
undo: Undo
|
||
# The Undo was pressed twice, or after newer actions pushed it out. Said
|
||
# plainly: the button promised to put something back and has not.
|
||
undo_expired: That can no longer be undone.
|
||
undone: Undone.
|
||
# The label menu took a label off. The counterpart of `labelled`.
|
||
unlabelled: 'Removed label %label%'
|
||
|
||
toolbar:
|
||
view_select:
|
||
# The "and the other 145" offer, shown when every row on screen is
|
||
# selected and the view holds more than fits on a page.
|
||
offer: 'All %count% conversations in this view can be selected.'
|
||
offer_action: 'Select all %count%'
|
||
selected: 'All %count% conversations in this view are selected.'
|
||
clear: 'Select only this page'
|
||
actions:
|
||
archive: Archive
|
||
delete: Delete
|
||
label: Label as
|
||
mark_read: Mark as read
|
||
mark_unread: Mark as unread
|
||
more: More
|
||
move_to: Move to
|
||
purge: Delete forever
|
||
snooze: Snooze
|
||
spam: 'Mark as spam'
|
||
star: Star
|
||
# Asked before a selection in Spam is deleted for good. Two sentences rather
|
||
# than one with a number swapped in, because "1 conversations" is not English.
|
||
purge_confirm:
|
||
one: 'Delete this conversation for good? It cannot be brought back, and it is removed from the mail server too.'
|
||
many: 'Delete these %count% conversations for good? They cannot be brought back, and they are removed from the mail server too.'
|
||
filter:
|
||
show_all: Show all
|
||
unread_only: Unread only
|
||
pagination:
|
||
next: Older
|
||
of: of
|
||
prev: Newer
|
||
select:
|
||
all: All
|
||
none: None
|
||
read: Read
|
||
starred: Starred
|
||
unread: Unread
|
||
whole_view: 'All %count% in this view'
|
||
select_all: Select all conversations
|
||
select_menu: More selection options
|
||
|
||
spam:
|
||
empty: No junk mail.
|
||
heading: Spam
|
||
|
||
spam_menu:
|
||
confirm_body: 'Mail from every address at %domain% will go to Spam, including people who have never written to you.'
|
||
confirm_cancel: 'Cancel'
|
||
confirm_shared: 'This is a mail provider that many people use.'
|
||
confirm_yes: 'Filter the whole domain'
|
||
domain: 'Always move this whole domain to Spam'
|
||
filter_heading: 'And filter future mail'
|
||
heading: 'Mark as spam'
|
||
more: 'More options'
|
||
move: 'Move to Spam'
|
||
move_hint: 'Only this conversation.'
|
||
sender: 'Always move this sender to Spam'
|
||
|
||
trash:
|
||
empty: No deleted messages.
|
||
heading: Trash
|
||
|
||
two_factor:
|
||
cancel: Sign in as someone else
|
||
flash:
|
||
code_rejected: That code was not right. Check your app and try again.
|
||
codes_regenerated: New recovery codes generated. The old ones no longer work.
|
||
device_revoked: That device will be asked for a code next time.
|
||
devices_revoked: No devices are remembered any more.
|
||
disabled: Two-factor authentication is off.
|
||
enabled: Two-factor authentication is on.
|
||
form:
|
||
code: Authentication code
|
||
code_hint: >-
|
||
The six-digit code from your authenticator app, or one of your
|
||
recovery codes.
|
||
submit: Continue
|
||
submitting: Checking…
|
||
trust_device: Don't ask on this device again
|
||
trust_device_hint: For 30 days. You can revoke it any time from Settings → Security.
|
||
page_title: Two-factor authentication
|
||
recovery_hint: >-
|
||
Lost your phone? Use one of the recovery codes you saved when you set
|
||
this up.
|
||
tagline: One more step
|
||
|
||
unread:
|
||
empty: No unread mail.
|
||
heading: All unread mail
|
||
|
||
# The names of template variables, as they read on a chip in the editor and
|
||
# on a placeholder still open in a message. Top-level because both the
|
||
# settings page and the compose window use them.
|
||
templates:
|
||
variable:
|
||
date: 'Date'
|
||
recipient_email: 'Recipient''s address'
|
||
recipient_first_name: 'First name'
|
||
recipient_name: 'Full name'
|
||
sender_email: 'Your address'
|
||
sender_name: 'Your name'
|
||
signature: 'Signature'
|