* fix(plugins): unknown column

* fix(mcp): reuse MCP sessions instead of creating one per tool call

The /mcp CORS layer never set exposedHeaders, so Access-Control-Expose-Headers
was absent and browser-context MCP clients (Claude Desktop connectors,
Claude.ai, MCP Inspector) could not read Mcp-Session-Id off the initialize
response. Unable to echo it back, every request looked like a fresh initialize:
one McpServer and one session per tool call, until the per-user cap returned a
429 and the integration died until the container was restarted.

The idle sweep was not at fault — it expires on lastActivity with a 1h default,
so sessions born seconds apart are nowhere near expiry, hence 'cleaned 0'.

- expose Mcp-Session-Id, MCP-Protocol-Version and WWW-Authenticate
- evict a user's least-recently-active session at the cap rather than
  refusing the request, so a client that cannot persist its session id (or a
  proxy that strips the header) can never wedge the server
- close the McpServer/transport orphaned by every session-less non-initialize
  POST, which was leaked: never mapped, never swept, never closed
- return the cap error as JSON-RPC so clients surface the real reason
- warn on session-less POSTs to make a header-stripping proxy diagnosable

* chore(deps): declare @modelcontextprotocol/sdk ^1.29.0

Matches the version already resolved in the lockfile; no dependency-tree change.

* docs(mcp): add the reverse proxy specs for MCP

* fix(plugins): stop the row ⋯ menu being clipped by the sidebar

The menu was an in-flow `absolute` div, and its ancestor (PageSidebar) is
`overflow-hidden` — which clips absolutely-positioned descendants regardless
of z-index. With enough plugins installed a row sits low enough that its menu
runs past the sidebar's bottom edge and gets chopped, taking Delete with it,
so the plugin could no longer be uninstalled from the UI.

Portal the menu to <body> and position it `fixed` against the ⋯ button,
flipping upward when the bottom is tight and re-anchoring on scroll/resize.
A fixed child of <body> has no overflow ancestor, so nothing can clip it.

Closes #1523

* feat(plugins): surface author-signature status and add a scoped re-trust override

TREK has always verified an author's Ed25519 signature and TOFU-pinned the key on
first install, but none of it was ever shown: a successfully-installed UNSIGNED
plugin looked identical to a signed one, and a signature-refused update left the
plugin quietly pinned at its old version with the reason dying in a toast.

Give the four refusal conditions machine-readable codes (SIGNATURE_MISSING /
_INCOMPLETE / _KEY_CHANGED / _INVALID), persist a refusal on the plugin row so the
admin list keeps showing it, and badge Signed/Unsigned in the list and in Discover.

Only SIGNATURE_KEY_CHANGED is overridable — an author can legitimately rotate a key;
a signature that does not verify means the bytes are not what the author signed, and
there is no story where waving that through is right. The override re-pins and
updates in ONE call (POST :id/retrust): a re-pin that waited for a follow-up /update
would leave the plugin pinned to a key no install had ever been verified against if
that second call never came. The artifact must still verify under the new key, so a
re-trust moves the pin from one verified key to another.

assertRetrustable re-derives the condition server-side, so the UI hiding the button
is a convenience, not the control, and it echoes back the full key the admin was
shown so a re-key since the dialog rendered is refused. The rotation is written to
the admin audit log with both fingerprints — after an incident, "which key did we
move from, and to what?" is the question a single key cannot answer.

* fix(plugins): let a plugin's frame reach the hosts an admin added for it

The frame's connect-src was built from the manifest's http:outbound grants alone, but
the child's egress guard is the UNION of those and the hosts an admin added after
install for an operatorEgress plugin (a self-hosted Gotify, an ntfy — hosts the author
cannot know in advance). So such a plugin WITH A UI could call the operator's host from
its server and was CSP-blocked in its own iframe.

Match the frame to the child. The admin consented to these hosts at install and the
child already reaches them, so this widens no trust boundary that isn't already crossed.
Both sources stay validated on the way in, and the interpolation filter is unchanged.

* fix(plugins): report a rejected events.emit on the plugin's own log stream

The host can reject an emit (an undeclared event name, a rate limit). The rejection must
not escape — a detached rejection crashes the child and terminally disables the plugin
over one bad emit — but swallowing it silently left an author with no way to discover
that `emits` was missing from their manifest. Surface it as a warning instead.

* feat(plugin-sdk): expose the raw request body for webhook signature checks

A webhook author must run their HMAC over the exact bytes the sender signed. `body` is
the PARSED value, and re-serializing it will not reproduce those bytes — key order,
whitespace and unicode escaping all differ — so the signature never matches. Document
`rawBodyBase64`, which the host already sets on auth:false routes.

* fix(plugin-sdk): refuse to overwrite a released artifact, and keep the packed zip

A released artifact is IMMUTABLE: the registry pins its sha256, so overwriting the bytes
of a release already in the registry breaks the checksum for everyone who installed that
version — they can no longer install or update it. The old code blanket-caught every
`gh release create` failure (auth, network, a bad repo) and turned it into a --clobber
upload. Probe for the release explicitly and refuse unless --force.

Also stop deleting plugin.zip on the way out. It is the exact bytes the release and the
entry's sha256 pin were computed from; a re-pack on another machine or SDK version can
differ (CRLF, walk order), so anyone re-running `entry`/`sign` afterwards must hash THAT
file, not a rebuild.

* fix(plugin-sdk): don't fail submit when the fork already has an upstream remote

`gh repo clone` of a fork may already have wired `upstream`, in which case a bare
`remote add` exits non-zero and took the whole submit down. Set it either way.

* fix(plugin-sdk): make the dev server behave like the host

Three ways `dev` lied to an author about how their plugin would run in production:

- ctx.db: one try/catch wrapped both the node:sqlite probe AND opening the database, so
  an mkdir/permission failure silently degraded to the in-memory stub — which swallows
  every write while reporting success. A db:own plugin "worked" in dev and persisted
  nothing. Probe separately: fail loudly on a real error, degrade only on old Node, and
  say plainly that the stub discards writes.
- notificationChannel: the host fires it with no acting user and hands the recipient's
  decrypted settings in as a separate `config` argument — send(msg, config, ctx) /
  test(config, ctx). Firing it like an ordinary hook passed `ctx` where `config` belongs,
  so a channel plugin read its settings off ctx and was broken in production.
- /preview pinned tripId 42 while the scaffold seeds trip 1, so the widget's first
  trek:invoke hit assertMember(42) and 500'd. Preview against a trip that exists.

* fix(plugin-sdk): reject unknown flags, wire up create's new flags, and add --help

`parse()` accepts any --x, so a flag a command does not read was silently dropped:
`create --template notification-channel` cheerfully scaffolded a blank plugin. Silently
ignoring an author's explicit instruction is worse than refusing it, so unknown flags are
now an error, and create actually forwards --template/--egress/--required-addons.

A bare --permissions used to split the string "true" into a permission literally named
`true`; listFlag() now treats a valueless flag as absent.

Since an unknown flag is now fatal, `--help` has to exist: it is intercepted before the
flag check and prints usage on stdout with exit 0.

* chore(plugins): drop three unused eslint-disable directives

The no-console rule is not enabled for these files, so the directives were dead and
eslint reports them as unused.

* fix(plugin-sdk): bring preflight back in step with the registry's gates

preflight exists to tell an author what TREK-Plugins' CI will say before they open the
PR. The registry now verifies author signatures, and preflight didn't — so it drifted
into the one failure mode it must never have: a false green. An author trusts a green.

- Verify the signature against the artifact bytes. preflight already downloads them for
  the sha256 check, so this costs one call. Without it, signing with the wrong key (or
  re-packing after signing) sails through and is caught at review.
- Check the signature SHAPE (checkSignatureShape): a key with no signed version, a
  signature with no key, a malformed key or signature. TREK refuses to install a
  half-signed entry, so such an entry is dead on arrival.
- Default apiVersion to 1 before comparing. It is OPTIONAL in the manifest — install/
  manifest.ts and `entry` both default it — so a manifest that legally omits it was
  failing preflight with "manifest apiVersion undefined != entry 1" while the registry
  passed it. A false RED, which teaches authors to ignore the tool.
- Check requiredAddons/pluginDependencies parity, and operatorEgress without an
  http:outbound grant.

The verifier is a port of the host's install/verify-signature.ts (the registry has its
own port); sign.ts's verifyArtifact only understands the bare key/signature pair the SDK
itself emits and cannot judge a minisign key. A test pins all three to the same verdicts.

* feat(plugins): enforce compatibility range

* chore: bump sdk version

* test(e2e): repair the trip-creation specs

create-trip and trip-planner have been failing for a while — long enough for
three separate UI changes to drift past them, which nothing caught because CI
runs vitest only and never invokes Playwright.

Each failure was masking the next:

- The release-notice modal greets a freshly seeded user and its backdrop
  swallowed the click on .add-trip-card. Added a shared dismissSystemNotices()
  helper (the X only shows on the notice's last page, so it has to page through
  first).
- .modal-backdrop no longer exists — the class was namespaced to
  .trek-modal-backdrop so content blockers stop hiding it.
- input[type=text].first() is no longer the Title field: the cover-image search
  inputs now sit above it, so the specs were typing the trip name into the photo
  search box and creating an untitled trip that never matched getByText(title).

* fix(planner): gate drag & drop on pointer type, not viewport width (#1432)

The 3.2.1 fix disabled drag on "mobile", but nothing in the client has ever
detected touch — "mobile" was inferred from viewport width, at four independent
breakpoints. A tablet is a coarse-pointer device at a *desktop* width, so an
iPad (820-1366px) fell on the wrong side of all four, which is why iPhone was
fixed and iPad was not:

- useTripPlanner's isMobile (<768px) is what disarmed `draggable`, so on iPad
  rows stayed draggable and a scroll swipe became an HTML5 drag.
- TripPlannerPage hardcoded isMobile={false} on the desktop PlacesSidebar, so
  its drop handlers and the drop-to-import overlay could never be disabled —
  that overlay is the reported symptom.
- The arrow-button reorder fallback was revealed only below 767px, leaving iPad
  with no drag *and* no fallback.
- touchDragPolyfill loaded drag-drop-touch at >=1024px, synthesising drags from
  touchmove — on a landscape iPad that re-armed the very gesture hijack 3.2.1
  removed.

Adds useIsTouch() ((pointer: coarse)) as a signal separate from isMobile: layout
stays width-driven, so the iPad keeps the desktop two-pane planner, while every
drag affordance is gated on isMobile || isTouch. The reorder arrows now show on
coarse pointers, and the polyfill loads only on hybrid laptops
((pointer: fine) and (any-pointer: coarse)), which also removes the #1440
phantom-dblclick map zoom on tablets.

Guarded by unit tests plus an e2e spec on real WebKit in an iPad Pro 11 context
— the engine matters, since every browser on iPadOS is WebKit underneath, which
is why the reporter hit this in all three they tried.

* test(planner): guard the day-plan reorder arrows against phantom clicks

The hover rule that reveals the reorder arrows had been dead since the
TypeScript migration: it targeted `.place-row:hover .reorder-btns`, and neither
class exists — the component renders `.reorder-buttons` inside an unclassed row.
The buttons sat at opacity:0 on desktop with nothing to reveal them.

That was not merely invisible. opacity:0 still hit-tests, so every itinerary row
and day note carried an invisible, fully clickable target that silently
reordered the trip:

  opacity: "0", visibility: "visible", pointerEvents: "auto"
  elementFromPoint(centre) -> BUTTON, inside .reorder-buttons

The repair — pointer-events: none while hidden, plus a working
.dp-row:hover/:focus-within reveal (focus-within so the buttons are also
reachable by keyboard, which the file's JS-hover pattern cannot do) — lives in
index.css and DayPlanSidebar.tsx. Both files also carry the #1432 drag gating,
so they went with that commit rather than being split mid-file; this commit is
the regression guard for them.

E2E rather than unit, because jsdom does not evaluate :hover. Against the old
CSS it fails on exactly the right assertion: "hidden arrows must not swallow
clicks" — expected false, received true.

* fix(pdf): keep the header gap on day-header overflow pages (#1531)

The repeated <thead> day header (#1471) carried no gap before the first
card on overflow pages: the 12px sat in .day-body's block-start padding,
which a fragmented box only paints on its first fragment. Move it to the
thead cell so it repeats with the header; the day's first page renders
pixel-identically.

* fix(budget): keep "no one paid yet" when editing an expense (#1533)

The ExpenseModal payer initializer fell back to the current user whenever the
edited item had no payer, so reopening an expense saved with "no one paid yet"
silently reselected "You" — and re-saving then recorded the current user as the
payer, corrupting the balances. An absent payer on an existing expense is a
deliberate value, so only a brand-new expense defaults to me.
This commit is contained in:
jubnl
2026-07-13 12:40:00 +02:00
committed by GitHub
parent e60fbe7dd6
commit ebc98f0a3f
114 changed files with 5148 additions and 425 deletions
+38 -3
View File
@@ -205,14 +205,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'عرض سجل الأخطاء',
'admin.plugins.errorLog': 'سجل الأخطاء',
'admin.plugins.allowedHosts': 'المضيفون المسموح بهم',
'admin.plugins.allowedHosts.hint': 'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). أضف المضيفين الذين يمكنها الوصول إليهم — ولن تصل إلى غيرهم.',
'admin.plugins.allowedHosts.hint':
'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). أضف المضيفين الذين يمكنها الوصول إليهم — ولن تصل إلى غيرهم.',
'admin.plugins.allowedHosts.none': 'لم تتم إضافة أي مضيف بعد.',
'admin.plugins.allowedHosts.unsupported': 'لا تستخدم هذه الإضافة مضيفين يحددهم المشغّل. مضيفوها المسموح بهم ثابتون في ملف التعريف.',
'admin.plugins.allowedHosts.unsupported':
'لا تستخدم هذه الإضافة مضيفين يحددهم المشغّل. مضيفوها المسموح بهم ثابتون في ملف التعريف.',
'admin.plugins.allowedHosts.restartNote': 'الحفظ يعيد تشغيل الإضافة لتأخذ القائمة الجديدة.',
'admin.plugins.allowedHosts.add': 'إضافة مضيف مسموح به',
'admin.plugins.allowedHosts.count': '{n} مضيف مسموح به',
'admin.plugins.operatorEgressPill': '+ مضيفون تضيفهم',
'admin.plugins.operatorEgressHint': 'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). بعد التثبيت أضف المضيفين من ⋯ ← المضيفون المسموح بهم. ولن تصل إلى غيرهم.',
'admin.plugins.operatorEgressHint':
'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). بعد التثبيت أضف المضيفين من ⋯ ← المضيفون المسموح بهم. ولن تصل إلى غيرهم.',
'admin.plugins.noErrors': 'لا توجد أخطاء مسجّلة.',
'admin.plugins.uninstalled': 'تمت إزالة الإضافة',
'admin.plugins.uninstallTitle': 'إزالة الإضافة؟',
@@ -364,6 +367,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'ماذا تعني "تمت مراجعتها"',
'admin.plugins.security.reviewedBody':
'الإضافة التي تمت مراجعتها فُحصت يدويًا بحثًا عن البرمجيات الخبيثة بواسطة أحد القائمين على TREK في كل إصدار — جرى فحصها بحثًا عن شيفرة ضارة، لا لمعرفة ما إذا كانت تعمل جيدًا. وهي ليست وعدًا بأن الإضافة غير ضارة.',
'admin.plugins.security.signedTitle': 'ماذا تعني "موقّعة"',
'admin.plugins.security.signedBody':
'المجموع الاختباري الذي يتحقق منه TREK عند كل تثبيت يثبت أن الملفات هي بالضبط ما يضمنه السجل. أما التوقيع فيثبت شيئًا مختلفًا: أنها جاءت من المؤلف، موقّعة بمفتاح لا يملكه سواه. الإضافة الموقّعة تجمع الاثنين معًا. وغير الموقّعة ليست غير آمنة — إنها ببساطة تحمل ضمانًا واحدًا أقل، ومعظم الإضافات في السجل غير موقّعة اليوم.',
'admin.plugins.signed': 'موقّعة',
'admin.plugins.signedHint': 'جرى التحقق منها مقابل مفتاح توقيع المؤلف عند تثبيتها',
'admin.plugins.unsigned': 'غير موقّعة',
'admin.plugins.unsignedHint':
'الملفات تطابق ما يضمنه السجل، لكن لا شيء يربطها بالمؤلف. ضمان واحد أقل — وليست غير آمنة.',
'admin.plugins.updateBlocked': 'تم حظر التحديث — {reason}',
'admin.plugins.reviewBlock': 'مراجعة',
'admin.plugins.retrusted': 'تم الوثوق بمفتاح التوقيع الجديد — وتم تحديث الإضافة',
'admin.plugins.sig.title': 'تعذّر التحقق من توقيع {name}',
'admin.plugins.sig.keyChangedBody':
'مفتاح توقيع المؤلف ليس المفتاح الذي ثُبّتت به هذه الإضافة. المؤلفون يبدّلون مفاتيحهم أحيانًا — لكن مهاجمًا استولى على الإضافة سيبدو تمامًا هكذا.',
'admin.plugins.sig.invalidBody':
'الملفات لا تطابق توقيع المؤلف. إنها ليست ما وقّعه المؤلف — فإما أنها تلفت، وإما أنه جرى العبث بها. لا يمكن تجاوز ذلك.',
'admin.plugins.sig.missingBody':
'كانت هذه الإضافة موقّعة عند تثبيتها، لكن الإصدار الجديد لا يحمل أي توقيع. لن يقبل TREK هذا التراجع بصمت. لا يمكن تجاوز ذلك.',
'admin.plugins.sig.incompleteBody':
'مدخل السجل موقّع نصف توقيع: يعلن عن مفتاح للمؤلف لكن الإصدار لا يحمل توقيعًا (أو العكس). هذا خطأ من جانب الإضافة. لا يمكن تجاوز ذلك.',
'admin.plugins.sig.pinnedKey': 'المفتاح الذي ثُبّتت به',
'admin.plugins.sig.newKey': 'المفتاح الذي تقدّمه الآن',
'admin.plugins.sig.confirmOutOfBand':
'لا يستطيع TREK التمييز بين تبديل مشروع للمفتاح وبين استيلاء على الإضافة — يبدو الأمران متطابقين من هنا. تحقّق من المفتاح الجديد مع المؤلف عبر قناة تثق بها أصلًا قبل قبوله. وحين تفعل، يتم تحديث الإضافة ويُحفظ المفتاح الجديد.',
'admin.plugins.sig.retrustConfirm': 'الوثوق بالمفتاح الجديد والتحديث',
'admin.plugins.sig.cancel': 'عدم الوثوق به',
'admin.plugins.sig.consentUnsigned':
'لا شيء يربط هذا الإصدار بمؤلفه — الملفات تطابق السجل، لكنها لا تحمل توقيع المؤلف.',
'admin.plugins.security.trustTitle': 'الخلاصة',
'admin.plugins.security.trustBody':
'تثبيت إضافة يشبه تثبيت أي تطبيق من جهة خارجية: لا تُضِف سوى شيفرة من مطورين تثق بهم، وعند الشك، افحصها بنفسك أولًا. لا يتحمل TREK أي مسؤولية عن إضافات الجهات الخارجية.',
@@ -423,6 +454,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'تنزيل',
'admin.plugins.dep.update': 'تحديث',
'admin.plugins.dep.resolveHint': 'ينزّل أحدث إصدار متوافق، بما في ذلك تبعياته الخاصة.',
'admin.plugins.dep.trekIncompatible': 'يتطلب TREK {range} — يعمل هذا الخادم بالإصدار {host}',
'admin.plugins.dep.trekUnknown': 'لا يحدد إصدارات TREK المدعومة',
'admin.plugins.installCompatible': 'تثبيت {version}',
'admin.plugins.incompatible': 'غير متوافق',
'admin.plugins.accessTitle': 'ما الذي يمكنها الوصول إليه',
'admin.plugins.connectsTitle': 'يتصل بـ',
'admin.plugins.detailsTitle': 'التفاصيل',
+38 -3
View File
@@ -185,14 +185,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Ver registro de erros',
'admin.plugins.errorLog': 'Registro de erros',
'admin.plugins.allowedHosts': 'Hosts permitidos',
'admin.plugins.allowedHosts.hint': 'Este plugin fala com um serviço que só você pode nomear (um servidor auto-hospedado). Adicione os hosts que ele pode alcançar — nenhum outro.',
'admin.plugins.allowedHosts.hint':
'Este plugin fala com um serviço que só você pode nomear (um servidor auto-hospedado). Adicione os hosts que ele pode alcançar — nenhum outro.',
'admin.plugins.allowedHosts.none': 'Nenhum host adicionado ainda.',
'admin.plugins.allowedHosts.unsupported': 'Este plugin não usa hosts fornecidos pelo operador. Seus hosts permitidos são fixos no manifesto.',
'admin.plugins.allowedHosts.unsupported':
'Este plugin não usa hosts fornecidos pelo operador. Seus hosts permitidos são fixos no manifesto.',
'admin.plugins.allowedHosts.restartNote': 'Salvar reinicia o plugin para que ele use a nova lista.',
'admin.plugins.allowedHosts.add': 'Adicionar host permitido',
'admin.plugins.allowedHosts.count': '{n} host(s) permitido(s)',
'admin.plugins.operatorEgressPill': '+ hosts que você adicionar',
'admin.plugins.operatorEgressHint': 'Este plugin fala com um serviço que só você pode nomear (um servidor auto-hospedado). Após instalar, adicione os hosts que ele pode alcançar em ⋯ → Hosts permitidos. Nenhum outro.',
'admin.plugins.operatorEgressHint':
'Este plugin fala com um serviço que só você pode nomear (um servidor auto-hospedado). Após instalar, adicione os hosts que ele pode alcançar em ⋯ → Hosts permitidos. Nenhum outro.',
'admin.plugins.noErrors': 'Nenhum erro registrado.',
'admin.plugins.uninstalled': 'Plugin desinstalado',
'admin.plugins.uninstallTitle': 'Desinstalar plugin?',
@@ -352,6 +355,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'O que significa "Revisado"',
'admin.plugins.security.reviewedBody':
'Um plugin revisado foi verificado manualmente em busca de malware por um mantenedor do TREK em cada versão — checado quanto a código malicioso, não quanto a funcionar bem. Não é uma promessa de que o plugin seja inofensivo.',
'admin.plugins.security.signedTitle': 'O que significa "Assinado"',
'admin.plugins.security.signedBody':
'A soma de verificação que o TREK confere em toda instalação prova que os arquivos são exatamente aqueles pelos quais o registro responde. Uma assinatura prova algo diferente: que eles vieram do autor, assinados com uma chave que só ele possui. Um plugin assinado tem as duas coisas. Um plugin sem assinatura não é inseguro — ele apenas carrega uma garantia a menos, e hoje a maioria dos plugins do registro não é assinada.',
'admin.plugins.signed': 'Assinado',
'admin.plugins.signedHint': 'Verificado contra a chave de assinatura do autor no momento da instalação',
'admin.plugins.unsigned': 'Sem assinatura',
'admin.plugins.unsignedHint':
'Os arquivos correspondem àquilo pelo qual o registro responde, mas nada os liga ao autor. Uma garantia a menos — não é inseguro.',
'admin.plugins.updateBlocked': 'Atualização bloqueada — {reason}',
'admin.plugins.reviewBlock': 'Revisar',
'admin.plugins.retrusted': 'Nova chave de assinatura confiada — o plugin foi atualizado',
'admin.plugins.sig.title': 'Não foi possível verificar a assinatura de {name}',
'admin.plugins.sig.keyChangedBody':
'A chave de assinatura do autor não é aquela com a qual este plugin foi instalado. Autores realmente trocam de chave — mas um invasor que tivesse assumido o plugin se pareceria exatamente com isto.',
'admin.plugins.sig.invalidBody':
'Os arquivos não correspondem à assinatura do autor. Eles não são o que o autor assinou — ou foram corrompidos, ou foram adulterados. Isso não pode ser ignorado.',
'admin.plugins.sig.missingBody':
'Este plugin estava assinado quando você o instalou, mas a nova versão não traz assinatura alguma. O TREK não vai aceitar essa perda em silêncio. Isso não pode ser ignorado.',
'admin.plugins.sig.incompleteBody':
'A entrada no registro está assinada pela metade: ela declara uma chave do autor, mas a versão não traz assinatura (ou o contrário). Isso é um erro do lado do plugin. Isso não pode ser ignorado.',
'admin.plugins.sig.pinnedKey': 'Chave com que foi instalado',
'admin.plugins.sig.newKey': 'Chave que ele está oferecendo agora',
'admin.plugins.sig.confirmOutOfBand':
'O TREK não consegue distinguir uma troca legítima de chave de um sequestro do plugin — daqui, as duas coisas são idênticas. Confirme a nova chave com o autor por um canal em que você já confia antes de aceitá-la. Assim que aceitar, o plugin é atualizado e a nova chave passa a ser lembrada.',
'admin.plugins.sig.retrustConfirm': 'Confiar na nova chave e atualizar',
'admin.plugins.sig.cancel': 'Não confiar',
'admin.plugins.sig.consentUnsigned':
'Nada liga esta versão ao seu autor — os arquivos correspondem ao registro, mas não trazem assinatura do autor.',
'admin.plugins.security.trustTitle': 'Em resumo',
'admin.plugins.security.trustBody':
'Instalar um plugin é como instalar qualquer app de terceiros: adicione apenas código de autores em quem você confia e, em caso de dúvida, inspecione-o você mesmo antes. O TREK não assume nenhuma responsabilidade por plugins de terceiros.',
@@ -411,6 +442,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Baixar',
'admin.plugins.dep.update': 'Atualizar',
'admin.plugins.dep.resolveHint': 'Baixa a versão compatível mais recente, incluindo suas próprias dependências.',
'admin.plugins.dep.trekIncompatible': 'Requer TREK {range} — este servidor executa {host}',
'admin.plugins.dep.trekUnknown': 'Não informa quais versões do TREK são compatíveis',
'admin.plugins.installCompatible': 'Instalar {version}',
'admin.plugins.incompatible': 'Incompatível',
'admin.plugins.accessTitle': 'O que ele pode acessar',
'admin.plugins.connectsTitle': 'Conecta-se a',
'admin.plugins.detailsTitle': 'Detalhes',
+2 -1
View File
@@ -296,7 +296,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Configurar',
'settings.notificationPreferences.testSuccess': 'Notificação de teste enviada.',
'settings.notificationPreferences.testFailed': 'Falha no teste.',
'settings.notificationPreferences.pluginConfigured': 'Configurado. Gerencie suas credenciais na página de configurações do plugin.',
'settings.notificationPreferences.pluginConfigured':
'Configurado. Gerencie suas credenciais na página de configurações do plugin.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -186,14 +186,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Zobrazit protokol chyb',
'admin.plugins.errorLog': 'Protokol chyb',
'admin.plugins.allowedHosts': 'Povolení hostitelé',
'admin.plugins.allowedHosts.hint': 'Tento plugin komunikuje se službou, kterou umíš pojmenovat jen ty (self-hosted server). Přidej hostitele, na které smí — na jiné se nedostane.',
'admin.plugins.allowedHosts.hint':
'Tento plugin komunikuje se službou, kterou umíš pojmenovat jen ty (self-hosted server). Přidej hostitele, na které smí — na jiné se nedostane.',
'admin.plugins.allowedHosts.none': 'Zatím nebyli přidáni žádní hostitelé.',
'admin.plugins.allowedHosts.unsupported': 'Tento plugin nepoužívá hostitele zadané provozovatelem. Povolení hostitelé jsou pevně dáni v manifestu.',
'admin.plugins.allowedHosts.unsupported':
'Tento plugin nepoužívá hostitele zadané provozovatelem. Povolení hostitelé jsou pevně dáni v manifestu.',
'admin.plugins.allowedHosts.restartNote': 'Uložení restartuje plugin, aby načetl nový seznam.',
'admin.plugins.allowedHosts.add': 'Přidat povoleného hostitele',
'admin.plugins.allowedHosts.count': '{n} povolených hostitelů',
'admin.plugins.operatorEgressPill': '+ hostitelé, které přidáš',
'admin.plugins.operatorEgressHint': 'Tento plugin komunikuje se službou, kterou umíš pojmenovat jen ty (self-hosted server). Po instalaci přidej hostitele v ⋯ → Povolení hostitelé. Na jiné se nedostane.',
'admin.plugins.operatorEgressHint':
'Tento plugin komunikuje se službou, kterou umíš pojmenovat jen ty (self-hosted server). Po instalaci přidej hostitele v ⋯ → Povolení hostitelé. Na jiné se nedostane.',
'admin.plugins.noErrors': 'Žádné zaznamenané chyby.',
'admin.plugins.uninstalled': 'Plugin odinstalován',
'admin.plugins.uninstallTitle': 'Odinstalovat plugin?',
@@ -350,6 +353,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Co znamená „Zkontrolováno“',
'admin.plugins.security.reviewedBody':
'Zkontrolovaný plugin ručně prověřil správce TREK na škodlivý kód u každé verze — kontroloval nepřátelský kód, nikoli to, zda dobře funguje. Není to slib, že je plugin neškodný.',
'admin.plugins.security.signedTitle': 'Co znamená „Podepsáno“',
'admin.plugins.security.signedBody':
'Kontrolní součet, který TREK ověřuje při každé instalaci, dokazuje, že soubory jsou přesně tím, za co se registr zaručuje. Podpis dokazuje něco jiného: že pocházejí od autora a jsou podepsané klíčem, který drží jen on. Podepsaný plugin má obojí. Nepodepsaný není nebezpečný — nese jen o jednu záruku méně a většina pluginů v registru dnes podepsaná není.',
'admin.plugins.signed': 'Podepsáno',
'admin.plugins.signedHint': 'Při instalaci ověřeno proti podpisovému klíči autora',
'admin.plugins.unsigned': 'Nepodepsáno',
'admin.plugins.unsignedHint':
'Soubory odpovídají tomu, za co se registr zaručuje, ale nic je nespojuje s autorem. O jednu záruku méně — nikoli nebezpečné.',
'admin.plugins.updateBlocked': 'Aktualizace zablokována — {reason}',
'admin.plugins.reviewBlock': 'Zkontrolovat',
'admin.plugins.retrusted': 'Nový podpisový klíč je důvěryhodný — plugin je aktualizován',
'admin.plugins.sig.title': 'Podpis pluginu {name} se nepodařilo ověřit',
'admin.plugins.sig.keyChangedBody':
'Podpisový klíč autora není ten, se kterým byl tento plugin nainstalován. Autoři klíče skutečně mění — ale útočník, který plugin převzal, by vypadal přesně takhle.',
'admin.plugins.sig.invalidBody':
'Soubory neodpovídají podpisu autora. Nejsou tím, co autor podepsal — buď se poškodily, nebo do nich někdo zasáhl. Toto nelze obejít.',
'admin.plugins.sig.missingBody':
'Tento plugin byl při instalaci podepsaný, ale nová verze žádný podpis nepřináší. TREK takové zhoršení tiše nepřijme. Toto nelze obejít.',
'admin.plugins.sig.incompleteBody':
'Záznam v registru je podepsaný jen napůl: uvádí klíč autora, ale verze nenese žádný podpis (nebo naopak). To je chyba na straně pluginu. Toto nelze obejít.',
'admin.plugins.sig.pinnedKey': 'Klíč, se kterým byl nainstalován',
'admin.plugins.sig.newKey': 'Klíč, který nabízí nyní',
'admin.plugins.sig.confirmOutOfBand':
'TREK nedokáže odlišit legitimní výměnu klíče od převzetí pluginu — odsud vypadají obě stejně. Než nový klíč přijmete, ověřte si ho u autora kanálem, kterému už důvěřujete. Jakmile to uděláte, plugin se aktualizuje a nový klíč si TREK zapamatuje.',
'admin.plugins.sig.retrustConfirm': 'Důvěřovat novému klíči a aktualizovat',
'admin.plugins.sig.cancel': 'Nedůvěřovat',
'admin.plugins.sig.consentUnsigned':
'Tuto verzi nic nespojuje s jejím autorem — soubory odpovídají registru, ale nenesou podpis autora.',
'admin.plugins.security.trustTitle': 'Závěrem',
'admin.plugins.security.trustBody':
'Instalace pluginu je jako instalace jakékoli aplikace třetí strany: přidávejte pouze kód od autorů, kterým důvěřujete, a v případě pochybností si jej nejprve sami prohlédněte. TREK nenese žádnou odpovědnost za pluginy třetích stran.',
@@ -409,6 +440,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Stáhnout',
'admin.plugins.dep.update': 'Aktualizovat',
'admin.plugins.dep.resolveHint': 'Stáhne nejnovější kompatibilní verzi včetně jejích vlastních závislostí.',
'admin.plugins.dep.trekIncompatible': 'Vyžaduje TREK {range} — tento server běží na {host}',
'admin.plugins.dep.trekUnknown': 'Neuvádí, které verze TREK podporuje',
'admin.plugins.installCompatible': 'Nainstalovat {version}',
'admin.plugins.incompatible': 'Nekompatibilní',
'admin.plugins.accessTitle': 'K čemu má přístup',
'admin.plugins.connectsTitle': 'Připojuje se k',
'admin.plugins.detailsTitle': 'Podrobnosti',
+40 -4
View File
@@ -188,14 +188,18 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Fehlerprotokoll ansehen',
'admin.plugins.errorLog': 'Fehlerprotokoll',
'admin.plugins.allowedHosts': 'Erlaubte Hosts',
'admin.plugins.allowedHosts.hint': 'Dieses Plugin spricht mit einem Dienst, den nur du benennen kannst (ein selbst gehosteter Server). Füge die Hosts hinzu, die es erreichen darf — andere erreicht es nicht.',
'admin.plugins.allowedHosts.hint':
'Dieses Plugin spricht mit einem Dienst, den nur du benennen kannst (ein selbst gehosteter Server). Füge die Hosts hinzu, die es erreichen darf — andere erreicht es nicht.',
'admin.plugins.allowedHosts.none': 'Noch keine Hosts hinzugefügt.',
'admin.plugins.allowedHosts.unsupported': 'Dieses Plugin nutzt keine vom Betreiber angegebenen Hosts. Seine erlaubten Hosts stehen fest im Manifest.',
'admin.plugins.allowedHosts.restartNote': 'Beim Speichern wird das Plugin neu gestartet, damit es die neue Liste übernimmt.',
'admin.plugins.allowedHosts.unsupported':
'Dieses Plugin nutzt keine vom Betreiber angegebenen Hosts. Seine erlaubten Hosts stehen fest im Manifest.',
'admin.plugins.allowedHosts.restartNote':
'Beim Speichern wird das Plugin neu gestartet, damit es die neue Liste übernimmt.',
'admin.plugins.allowedHosts.add': 'Erlaubten Host hinzufügen',
'admin.plugins.allowedHosts.count': '{n} erlaubte Hosts',
'admin.plugins.operatorEgressPill': '+ von dir ergänzte Hosts',
'admin.plugins.operatorEgressHint': 'Dieses Plugin spricht mit einem Dienst, den nur du benennen kannst (ein selbst gehosteter Server). Füge nach der Installation unter ⋯ → Erlaubte Hosts die erreichbaren Hosts hinzu. Andere erreicht es nicht.',
'admin.plugins.operatorEgressHint':
'Dieses Plugin spricht mit einem Dienst, den nur du benennen kannst (ein selbst gehosteter Server). Füge nach der Installation unter ⋯ → Erlaubte Hosts die erreichbaren Hosts hinzu. Andere erreicht es nicht.',
'admin.plugins.noErrors': 'Keine Fehler protokolliert.',
'admin.plugins.uninstalled': 'Plugin deinstalliert',
'admin.plugins.uninstallTitle': 'Plugin deinstallieren?',
@@ -359,6 +363,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Was „Geprüft" bedeutet',
'admin.plugins.security.reviewedBody':
'Ein geprüftes Plugin wurde bei jeder Version von einem TREK-Maintainer manuell auf Schadsoftware gescannt — geprüft auf feindlichen Code, nicht darauf, ob es gut funktioniert. Es ist kein Versprechen, dass das Plugin harmlos ist.',
'admin.plugins.security.signedTitle': 'Was „Signiert" bedeutet',
'admin.plugins.security.signedBody':
'Die Prüfsumme, die TREK bei jeder Installation prüft, belegt, dass die Dateien genau das sind, wofür die Registry einsteht. Eine Signatur belegt etwas anderes: dass sie vom Autor stammen, signiert mit einem Schlüssel, den nur er besitzt. Ein signiertes Plugin hat beides. Ein unsigniertes ist nicht unsicher — es trägt schlicht eine Garantie weniger, und die meisten Plugins in der Registry sind heute unsigniert.',
'admin.plugins.signed': 'Signiert',
'admin.plugins.signedHint': 'Bei der Installation gegen den Signaturschlüssel des Autors geprüft',
'admin.plugins.unsigned': 'Unsigniert',
'admin.plugins.unsignedHint':
'Die Dateien entsprechen dem, wofür die Registry einsteht, aber nichts verbindet sie mit dem Autor. Eine Garantie weniger — nicht unsicher.',
'admin.plugins.updateBlocked': 'Update blockiert — {reason}',
'admin.plugins.reviewBlock': 'Ansehen',
'admin.plugins.retrusted': 'Neuem Signaturschlüssel vertraut — das Plugin ist aktualisiert',
'admin.plugins.sig.title': 'Die Signatur von {name} konnte nicht geprüft werden',
'admin.plugins.sig.keyChangedBody':
'Der Signaturschlüssel des Autors ist nicht der, mit dem dieses Plugin installiert wurde. Autoren wechseln ihre Schlüssel durchaus — aber ein Angreifer, der das Plugin übernommen hat, sähe von hier aus genau so aus.',
'admin.plugins.sig.invalidBody':
'Die Dateien passen nicht zur Signatur des Autors. Sie sind nicht das, was der Autor signiert hat — entweder wurden sie beschädigt oder manipuliert. Das lässt sich nicht übergehen.',
'admin.plugins.sig.missingBody':
'Dieses Plugin war signiert, als du es installiert hast, aber die neue Version bringt keine Signatur mit. TREK akzeptiert diesen Rückschritt nicht stillschweigend. Das lässt sich nicht übergehen.',
'admin.plugins.sig.incompleteBody':
'Der Registry-Eintrag ist nur halb signiert: Er nennt einen Autorenschlüssel, die Version trägt aber keine Signatur (oder umgekehrt). Das ist ein Fehler auf Seiten des Plugins. Das lässt sich nicht übergehen.',
'admin.plugins.sig.pinnedKey': 'Schlüssel, mit dem es installiert wurde',
'admin.plugins.sig.newKey': 'Schlüssel, den es jetzt anbietet',
'admin.plugins.sig.confirmOutOfBand':
'TREK kann einen legitimen Schlüsselwechsel nicht von einer Übernahme unterscheiden — von hier aus sehen beide gleich aus. Bestätige den neuen Schlüssel beim Autor über einen Kanal, dem du bereits vertraust, bevor du ihn annimmst. Sobald du das tust, wird das Plugin aktualisiert und der neue Schlüssel gemerkt.',
'admin.plugins.sig.retrustConfirm': 'Neuem Schlüssel vertrauen & aktualisieren',
'admin.plugins.sig.cancel': 'Nicht vertrauen',
'admin.plugins.sig.consentUnsigned':
'Nichts verbindet diese Version mit ihrem Autor — die Dateien entsprechen der Registry, tragen aber keine Autorensignatur.',
'admin.plugins.security.trustTitle': 'Das Fazit',
'admin.plugins.security.trustBody':
'Ein Plugin zu installieren ist wie jede fremde App zu installieren: Füge nur Code von Autoren hinzu, denen du vertraust, und prüfe ihn im Zweifel zuerst selbst. TREK übernimmt keine Verantwortung für Plugins von Drittanbietern.',
@@ -418,6 +450,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Herunterladen',
'admin.plugins.dep.update': 'Aktualisieren',
'admin.plugins.dep.resolveHint': 'Lädt die neueste kompatible Version samt eigener Abhängigkeiten herunter.',
'admin.plugins.dep.trekIncompatible': 'Benötigt TREK {range} — auf diesem Server läuft {host}',
'admin.plugins.dep.trekUnknown': 'Gibt nicht an, welche TREK-Versionen unterstützt werden',
'admin.plugins.installCompatible': '{version} installieren',
'admin.plugins.incompatible': 'Nicht kompatibel',
'admin.plugins.accessTitle': 'Worauf es zugreift',
'admin.plugins.connectsTitle': 'Verbindet sich mit',
'admin.plugins.detailsTitle': 'Details',
+2 -1
View File
@@ -298,7 +298,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Einrichten',
'settings.notificationPreferences.testSuccess': 'Testbenachrichtigung gesendet.',
'settings.notificationPreferences.testFailed': 'Test fehlgeschlagen.',
'settings.notificationPreferences.pluginConfigured': 'Eingerichtet. Zugangsdaten auf der Einstellungsseite des Plugins verwalten.',
'settings.notificationPreferences.pluginConfigured':
'Eingerichtet. Zugangsdaten auf der Einstellungsseite des Plugins verwalten.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -239,14 +239,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.allowedHosts': 'Allowed hosts',
'admin.plugins.allowedHosts.hint': 'This plugin talks to a service only you can name (a self-hosted server). Add the hosts it may reach — it can reach no others.',
'admin.plugins.allowedHosts.hint':
'This plugin talks to a service only you can name (a self-hosted server). Add the hosts it may reach — it can reach no others.',
'admin.plugins.allowedHosts.none': 'No hosts added yet.',
'admin.plugins.allowedHosts.unsupported': 'This plugin does not use operator-supplied hosts. Its allowed hosts are fixed in its manifest.',
'admin.plugins.allowedHosts.unsupported':
'This plugin does not use operator-supplied hosts. Its allowed hosts are fixed in its manifest.',
'admin.plugins.allowedHosts.restartNote': 'Saving restarts the plugin so it picks up the new list.',
'admin.plugins.allowedHosts.add': 'Add allowed host',
'admin.plugins.allowedHosts.count': '{n} allowed host(s)',
'admin.plugins.operatorEgressPill': '+ hosts you add',
'admin.plugins.operatorEgressHint': 'This plugin talks to a service only you can name (a self-hosted server). After installing, add the hosts it may reach under ⋯ → Allowed hosts. It can reach no others.',
'admin.plugins.operatorEgressHint':
'This plugin talks to a service only you can name (a self-hosted server). After installing, add the hosts it may reach under ⋯ → Allowed hosts. It can reach no others.',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
@@ -394,6 +397,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'What "Reviewed" means',
'admin.plugins.security.reviewedBody':
'A reviewed plugin was manually scanned for malware by a TREK maintainer on each version — checked for hostile code, not for whether it works well. It is not a promise that the plugin is harmless.',
'admin.plugins.security.signedTitle': 'What "Signed" means',
'admin.plugins.security.signedBody':
'The checksum TREK verifies on every install proves the files are exactly what the registry vouches for. A signature proves something different: that they came from the author, signed with a key only they hold. A signed plugin has both. An unsigned one is not unsafe — it simply carries one guarantee fewer, and most plugins in the registry are unsigned today.',
'admin.plugins.signed': 'Signed',
'admin.plugins.signedHint': "Verified against the author's signing key when it was installed",
'admin.plugins.unsigned': 'Unsigned',
'admin.plugins.unsignedHint':
'The files match what the registry vouches for, but nothing ties them to the author. One guarantee fewer — not unsafe.',
'admin.plugins.updateBlocked': 'Update blocked — {reason}',
'admin.plugins.reviewBlock': 'Review',
'admin.plugins.retrusted': 'New signing key trusted — the plugin is updated',
'admin.plugins.sig.title': "{name}'s signature could not be verified",
'admin.plugins.sig.keyChangedBody':
"The author's signing key is not the one this plugin was installed with. Authors do rotate keys — but an attacker who took over the plugin would look exactly like this.",
'admin.plugins.sig.invalidBody':
"The files do not match the author's signature. They are not what the author signed — either they were corrupted, or they were tampered with. This cannot be overridden.",
'admin.plugins.sig.missingBody':
'This plugin was signed when you installed it, but the new version ships no signature. TREK will not quietly accept the downgrade. This cannot be overridden.',
'admin.plugins.sig.incompleteBody':
'The registry entry is half-signed: it declares an author key but the version carries no signature (or the reverse). That is a mistake on the plugin side. This cannot be overridden.',
'admin.plugins.sig.pinnedKey': 'Key it was installed with',
'admin.plugins.sig.newKey': 'Key it is offering now',
'admin.plugins.sig.confirmOutOfBand':
'TREK cannot tell a legitimate key rotation apart from a takeover — both look identical from here. Confirm the new key with the author through a channel you already trust before you accept it. Once you do, the plugin is updated and the new key is remembered.',
'admin.plugins.sig.retrustConfirm': 'Trust the new key & update',
'admin.plugins.sig.cancel': 'Do not trust it',
'admin.plugins.sig.consentUnsigned':
'Nothing ties this version to its author — the files match the registry, but they carry no author signature.',
'admin.plugins.security.trustTitle': 'The bottom line',
'admin.plugins.security.trustBody':
'Installing a plugin is like installing any third-party app: only add code from authors you trust, and when in doubt, inspect it yourself first. TREK takes no responsibility for third-party plugins.',
@@ -453,6 +484,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Download',
'admin.plugins.dep.update': 'Update',
'admin.plugins.dep.resolveHint': 'Downloads the latest compatible version, including its own dependencies.',
'admin.plugins.dep.trekIncompatible': 'Needs TREK {range} — this server runs {host}',
'admin.plugins.dep.trekUnknown': 'Does not say which TREK versions it supports',
'admin.plugins.installCompatible': 'Install {version}',
'admin.plugins.incompatible': 'Incompatible',
'admin.plugins.accessTitle': 'What it can access',
'admin.plugins.connectsTitle': 'Connects to',
'admin.plugins.detailsTitle': 'Details',
+38 -3
View File
@@ -187,14 +187,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Ver registro de errores',
'admin.plugins.errorLog': 'Registro de errores',
'admin.plugins.allowedHosts': 'Hosts permitidos',
'admin.plugins.allowedHosts.hint': 'Este plugin se comunica con un servicio que solo tú puedes nombrar (un servidor autoalojado). Añade los hosts a los que puede acceder — no accederá a ningún otro.',
'admin.plugins.allowedHosts.hint':
'Este plugin se comunica con un servicio que solo tú puedes nombrar (un servidor autoalojado). Añade los hosts a los que puede acceder — no accederá a ningún otro.',
'admin.plugins.allowedHosts.none': 'Aún no se han añadido hosts.',
'admin.plugins.allowedHosts.unsupported': 'Este plugin no usa hosts proporcionados por el operador. Sus hosts permitidos están fijados en su manifiesto.',
'admin.plugins.allowedHosts.unsupported':
'Este plugin no usa hosts proporcionados por el operador. Sus hosts permitidos están fijados en su manifiesto.',
'admin.plugins.allowedHosts.restartNote': 'Al guardar se reinicia el plugin para que tome la nueva lista.',
'admin.plugins.allowedHosts.add': 'Añadir host permitido',
'admin.plugins.allowedHosts.count': '{n} host(s) permitido(s)',
'admin.plugins.operatorEgressPill': '+ hosts que añadas',
'admin.plugins.operatorEgressHint': 'Este plugin se comunica con un servicio que solo tú puedes nombrar (un servidor autoalojado). Tras instalarlo, añade los hosts a los que puede acceder en ⋯ → Hosts permitidos. No accederá a ningún otro.',
'admin.plugins.operatorEgressHint':
'Este plugin se comunica con un servicio que solo tú puedes nombrar (un servidor autoalojado). Tras instalarlo, añade los hosts a los que puede acceder en ⋯ → Hosts permitidos. No accederá a ningún otro.',
'admin.plugins.noErrors': 'No hay errores registrados.',
'admin.plugins.uninstalled': 'Plugin desinstalado',
'admin.plugins.uninstallTitle': '¿Desinstalar el plugin?',
@@ -361,6 +364,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Qué significa "Revisado"',
'admin.plugins.security.reviewedBody':
'Un plugin revisado fue analizado manualmente en busca de malware por un responsable de TREK en cada versión — se comprobó que no tuviera código malicioso, no si funciona bien. No es una promesa de que el plugin sea inofensivo.',
'admin.plugins.security.signedTitle': 'Qué significa "Firmado"',
'admin.plugins.security.signedBody':
'La suma de comprobación que TREK verifica en cada instalación demuestra que los archivos son exactamente los que el registro avala. Una firma demuestra otra cosa: que provienen del autor, firmados con una clave que solo él posee. Un plugin firmado tiene ambas cosas. Uno sin firmar no es inseguro — simplemente lleva una garantía menos, y hoy la mayoría de los plugins del registro no están firmados.',
'admin.plugins.signed': 'Firmado',
'admin.plugins.signedHint': 'Verificado con la clave de firma del autor en el momento de la instalación',
'admin.plugins.unsigned': 'Sin firmar',
'admin.plugins.unsignedHint':
'Los archivos coinciden con lo que el registro avala, pero nada los vincula con el autor. Una garantía menos — no es inseguro.',
'admin.plugins.updateBlocked': 'Actualización bloqueada — {reason}',
'admin.plugins.reviewBlock': 'Revisar',
'admin.plugins.retrusted': 'Nueva clave de firma aceptada — el plugin está actualizado',
'admin.plugins.sig.title': 'No se pudo verificar la firma de {name}',
'admin.plugins.sig.keyChangedBody':
'La clave de firma del autor no es la misma con la que se instaló este plugin. Los autores sí rotan sus claves — pero un atacante que se hubiera apoderado del plugin se vería exactamente así.',
'admin.plugins.sig.invalidBody':
'Los archivos no coinciden con la firma del autor. No son lo que el autor firmó — o se corrompieron, o fueron manipulados. Esto no se puede omitir.',
'admin.plugins.sig.missingBody':
'Este plugin estaba firmado cuando lo instalaste, pero la nueva versión no incluye ninguna firma. TREK no aceptará esa degradación en silencio. Esto no se puede omitir.',
'admin.plugins.sig.incompleteBody':
'La entrada del registro está firmada a medias: declara una clave de autor pero la versión no lleva firma (o al revés). Es un error del lado del plugin. Esto no se puede omitir.',
'admin.plugins.sig.pinnedKey': 'Clave con la que se instaló',
'admin.plugins.sig.newKey': 'Clave que ofrece ahora',
'admin.plugins.sig.confirmOutOfBand':
'TREK no puede distinguir una rotación de clave legítima de un secuestro — desde aquí ambas se ven idénticas. Confirma la nueva clave con el autor por un canal en el que ya confíes antes de aceptarla. Cuando lo hagas, el plugin se actualizará y la nueva clave quedará registrada.',
'admin.plugins.sig.retrustConfirm': 'Confiar en la nueva clave y actualizar',
'admin.plugins.sig.cancel': 'No confiar',
'admin.plugins.sig.consentUnsigned':
'Nada vincula esta versión con su autor — los archivos coinciden con el registro, pero no llevan ninguna firma del autor.',
'admin.plugins.security.trustTitle': 'En resumen',
'admin.plugins.security.trustBody':
'Instalar un plugin es como instalar cualquier aplicación de terceros: añade únicamente código de autores en los que confíes y, en caso de duda, inspecciónalo tú mismo primero. TREK no asume ninguna responsabilidad por los plugins de terceros.',
@@ -420,6 +451,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Descargar',
'admin.plugins.dep.update': 'Actualizar',
'admin.plugins.dep.resolveHint': 'Descarga la última versión compatible, incluidas sus propias dependencias.',
'admin.plugins.dep.trekIncompatible': 'Necesita TREK {range} — este servidor ejecuta {host}',
'admin.plugins.dep.trekUnknown': 'No indica qué versiones de TREK admite',
'admin.plugins.installCompatible': 'Instalar {version}',
'admin.plugins.incompatible': 'Incompatible',
'admin.plugins.accessTitle': 'A qué puede acceder',
'admin.plugins.connectsTitle': 'Se conecta a',
'admin.plugins.detailsTitle': 'Detalles',
+2 -1
View File
@@ -298,7 +298,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Configurar',
'settings.notificationPreferences.testSuccess': 'Notificación de prueba enviada.',
'settings.notificationPreferences.testFailed': 'La prueba falló.',
'settings.notificationPreferences.pluginConfigured': 'Configurado. Gestiona tus credenciales en la página de ajustes del plugin.',
'settings.notificationPreferences.pluginConfigured':
'Configurado. Gestiona tus credenciales en la página de ajustes del plugin.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+40 -4
View File
@@ -189,14 +189,18 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': "Voir le journal d'erreurs",
'admin.plugins.errorLog': "Journal d'erreurs",
'admin.plugins.allowedHosts': 'Hôtes autorisés',
'admin.plugins.allowedHosts.hint': 'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Ajoutez les hôtes qu’il peut joindre — il ne joindra aucun autre.',
'admin.plugins.allowedHosts.hint':
'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Ajoutez les hôtes qu’il peut joindre — il ne joindra aucun autre.',
'admin.plugins.allowedHosts.none': 'Aucun hôte ajouté pour l’instant.',
'admin.plugins.allowedHosts.unsupported': 'Ce plugin n’utilise pas d’hôtes fournis par l’opérateur. Ses hôtes autorisés sont fixés dans son manifeste.',
'admin.plugins.allowedHosts.restartNote': 'L’enregistrement redémarre le plugin pour qu’il prenne en compte la nouvelle liste.',
'admin.plugins.allowedHosts.unsupported':
'Ce plugin n’utilise pas d’hôtes fournis par l’opérateur. Ses hôtes autorisés sont fixés dans son manifeste.',
'admin.plugins.allowedHosts.restartNote':
'L’enregistrement redémarre le plugin pour qu’il prenne en compte la nouvelle liste.',
'admin.plugins.allowedHosts.add': 'Ajouter un hôte autorisé',
'admin.plugins.allowedHosts.count': '{n} hôte(s) autorisé(s)',
'admin.plugins.operatorEgressPill': '+ hôtes que vous ajoutez',
'admin.plugins.operatorEgressHint': 'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Après installation, ajoutez les hôtes qu’il peut joindre via ⋯ → Hôtes autorisés. Il ne joindra aucun autre.',
'admin.plugins.operatorEgressHint':
'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Après installation, ajoutez les hôtes qu’il peut joindre via ⋯ → Hôtes autorisés. Il ne joindra aucun autre.',
'admin.plugins.noErrors': 'Aucune erreur enregistrée.',
'admin.plugins.uninstalled': 'Plugin désinstallé',
'admin.plugins.uninstallTitle': 'Désinstaller le plugin ?',
@@ -362,6 +366,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Ce que signifie « Vérifié »',
'admin.plugins.security.reviewedBody':
"Un plugin vérifié a été analysé manuellement à la recherche de logiciels malveillants par un mainteneur de TREK à chaque version — contrôlé pour du code hostile, non pour son bon fonctionnement. Ce n'est pas une promesse que le plugin est inoffensif.",
'admin.plugins.security.signedTitle': 'Ce que signifie « Signé »',
'admin.plugins.security.signedBody':
"La somme de contrôle que TREK vérifie à chaque installation prouve que les fichiers sont exactement ceux dont le registre se porte garant. Une signature prouve autre chose : qu'ils proviennent de l'auteur, signés avec une clé que lui seul détient. Un plugin signé possède les deux. Un plugin non signé n'est pas dangereux — il porte simplement une garantie de moins, et la plupart des plugins du registre ne sont pas signés aujourd'hui.",
'admin.plugins.signed': 'Signé',
'admin.plugins.signedHint': "Vérifié avec la clé de signature de l'auteur au moment de l'installation",
'admin.plugins.unsigned': 'Non signé',
'admin.plugins.unsignedHint':
"Les fichiers correspondent à ce dont le registre se porte garant, mais rien ne les relie à l'auteur. Une garantie de moins — pas un danger.",
'admin.plugins.updateBlocked': 'Mise à jour bloquée — {reason}',
'admin.plugins.reviewBlock': 'Examiner',
'admin.plugins.retrusted': 'Nouvelle clé de signature approuvée — le plugin est mis à jour',
'admin.plugins.sig.title': "La signature de {name} n'a pas pu être vérifiée",
'admin.plugins.sig.keyChangedBody':
"La clé de signature de l'auteur n'est pas celle avec laquelle ce plugin a été installé. Les auteurs changent bel et bien de clé — mais un attaquant ayant pris le contrôle du plugin ressemblerait exactement à ceci.",
'admin.plugins.sig.invalidBody':
"Les fichiers ne correspondent pas à la signature de l'auteur. Ce n'est pas ce que l'auteur a signé — soit ils ont été corrompus, soit ils ont été altérés. Impossible de passer outre.",
'admin.plugins.sig.missingBody':
"Ce plugin était signé lorsque vous l'avez installé, mais la nouvelle version ne fournit aucune signature. TREK n'acceptera pas ce recul en silence. Impossible de passer outre.",
'admin.plugins.sig.incompleteBody':
"L'entrée du registre est à moitié signée : elle déclare une clé d'auteur mais la version ne porte aucune signature (ou l'inverse). C'est une erreur du côté du plugin. Impossible de passer outre.",
'admin.plugins.sig.pinnedKey': "Clé utilisée lors de l'installation",
'admin.plugins.sig.newKey': "Clé proposée aujourd'hui",
'admin.plugins.sig.confirmOutOfBand':
"TREK ne peut pas distinguer un changement de clé légitime d'une prise de contrôle — vus d'ici, les deux sont identiques. Confirmez la nouvelle clé auprès de l'auteur via un canal auquel vous faites déjà confiance avant de l'accepter. Une fois que c'est fait, le plugin est mis à jour et la nouvelle clé est mémorisée.",
'admin.plugins.sig.retrustConfirm': 'Faire confiance à la nouvelle clé et mettre à jour',
'admin.plugins.sig.cancel': 'Ne pas lui faire confiance',
'admin.plugins.sig.consentUnsigned':
"Rien ne relie cette version à son auteur — les fichiers correspondent au registre, mais ne portent aucune signature d'auteur.",
'admin.plugins.security.trustTitle': 'En résumé',
'admin.plugins.security.trustBody':
"Installer un plugin revient à installer n'importe quelle application tierce : n'ajoutez que du code provenant d'auteurs de confiance et, en cas de doute, inspectez-le vous-même au préalable. TREK décline toute responsabilité concernant les plugins tiers.",
@@ -421,6 +453,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Télécharger',
'admin.plugins.dep.update': 'Mettre à jour',
'admin.plugins.dep.resolveHint': 'Télécharge la dernière version compatible, y compris ses propres dépendances.',
'admin.plugins.dep.trekIncompatible': 'Nécessite TREK {range} — ce serveur exécute {host}',
'admin.plugins.dep.trekUnknown': 'N’indique pas quelles versions de TREK sont prises en charge',
'admin.plugins.installCompatible': 'Installer {version}',
'admin.plugins.incompatible': 'Incompatible',
'admin.plugins.accessTitle': 'Ce à quoi il peut accéder',
'admin.plugins.connectsTitle': 'Se connecte à',
'admin.plugins.detailsTitle': 'Détails',
+2 -1
View File
@@ -301,7 +301,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Configurer',
'settings.notificationPreferences.testSuccess': 'Notification de test envoyée.',
'settings.notificationPreferences.testFailed': 'Échec du test.',
'settings.notificationPreferences.pluginConfigured': 'Configuré. Gérez vos identifiants sur la page de réglages du plugin.',
'settings.notificationPreferences.pluginConfigured':
'Configuré. Gérez vos identifiants sur la page de réglages du plugin.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -234,14 +234,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Προβολή αρχείου σφαλμάτων',
'admin.plugins.errorLog': 'Αρχείο σφαλμάτων',
'admin.plugins.allowedHosts': 'Επιτρεπόμενοι κόμβοι',
'admin.plugins.allowedHosts.hint': 'Αυτό το πρόσθετο επικοινωνεί με μια υπηρεσία που μόνο εσείς μπορείτε να ονομάσετε (αυτο-φιλοξενούμενος διακομιστής). Προσθέστε τους κόμβους που μπορεί να προσεγγίσει — κανέναν άλλον.',
'admin.plugins.allowedHosts.hint':
'Αυτό το πρόσθετο επικοινωνεί με μια υπηρεσία που μόνο εσείς μπορείτε να ονομάσετε (αυτο-φιλοξενούμενος διακομιστής). Προσθέστε τους κόμβους που μπορεί να προσεγγίσει — κανέναν άλλον.',
'admin.plugins.allowedHosts.none': 'Δεν έχουν προστεθεί κόμβοι ακόμη.',
'admin.plugins.allowedHosts.unsupported': 'Αυτό το πρόσθετο δεν χρησιμοποιεί κόμβους που ορίζει ο διαχειριστής. Οι επιτρεπόμενοι κόμβοι του είναι σταθεροί στο manifest.',
'admin.plugins.allowedHosts.unsupported':
'Αυτό το πρόσθετο δεν χρησιμοποιεί κόμβους που ορίζει ο διαχειριστής. Οι επιτρεπόμενοι κόμβοι του είναι σταθεροί στο manifest.',
'admin.plugins.allowedHosts.restartNote': 'Η αποθήκευση επανεκκινεί το πρόσθετο ώστε να λάβει τη νέα λίστα.',
'admin.plugins.allowedHosts.add': 'Προσθήκη επιτρεπόμενου κόμβου',
'admin.plugins.allowedHosts.count': '{n} επιτρεπόμενοι κόμβοι',
'admin.plugins.operatorEgressPill': '+ κόμβοι που προσθέτετε',
'admin.plugins.operatorEgressHint': 'Αυτό το πρόσθετο επικοινωνεί με μια υπηρεσία που μόνο εσείς μπορείτε να ονομάσετε (αυτο-φιλοξενούμενος διακομιστής). Μετά την εγκατάσταση προσθέστε τους κόμβους στο ⋯ → Επιτρεπόμενοι κόμβοι. Κανέναν άλλον.',
'admin.plugins.operatorEgressHint':
'Αυτό το πρόσθετο επικοινωνεί με μια υπηρεσία που μόνο εσείς μπορείτε να ονομάσετε (αυτο-φιλοξενούμενος διακομιστής). Μετά την εγκατάσταση προσθέστε τους κόμβους στο ⋯ → Επιτρεπόμενοι κόμβοι. Κανέναν άλλον.',
'admin.plugins.noErrors': 'Δεν έχουν καταγραφεί σφάλματα.',
'admin.plugins.uninstalled': 'Το plugin απεγκαταστάθηκε',
'admin.plugins.uninstallTitle': 'Απεγκατάσταση plugin;',
@@ -412,6 +415,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Τι σημαίνει το "Ελεγμένο"',
'admin.plugins.security.reviewedBody':
'Ένα ελεγμένο plugin σαρώθηκε χειροκίνητα για κακόβουλο λογισμικό από έναν συντηρητή του TREK σε κάθε έκδοση — ελέγχθηκε για εχθρικό κώδικα, όχι για το αν λειτουργεί καλά. Δεν αποτελεί υπόσχεση ότι το plugin είναι ακίνδυνο.',
'admin.plugins.security.signedTitle': 'Τι σημαίνει το "Υπογεγραμμένο"',
'admin.plugins.security.signedBody':
'Το checksum που επαληθεύει το TREK σε κάθε εγκατάσταση αποδεικνύει ότι τα αρχεία είναι ακριβώς αυτά για τα οποία εγγυάται το μητρώο. Μια υπογραφή αποδεικνύει κάτι διαφορετικό: ότι προέρχονται από τον δημιουργό, υπογεγραμμένα με ένα κλειδί που κατέχει μόνο εκείνος. Ένα υπογεγραμμένο plugin έχει και τα δύο. Ένα ανυπόγραφο δεν είναι επικίνδυνο — απλώς φέρει μία εγγύηση λιγότερη, και τα περισσότερα plugins στο μητρώο είναι σήμερα ανυπόγραφα.',
'admin.plugins.signed': 'Υπογεγραμμένο',
'admin.plugins.signedHint': 'Επαληθεύτηκε με το κλειδί υπογραφής του δημιουργού κατά την εγκατάσταση',
'admin.plugins.unsigned': 'Ανυπόγραφο',
'admin.plugins.unsignedHint':
'Τα αρχεία ταιριάζουν με αυτά για τα οποία εγγυάται το μητρώο, αλλά τίποτα δεν τα συνδέει με τον δημιουργό. Μία εγγύηση λιγότερη — όχι επικίνδυνο.',
'admin.plugins.updateBlocked': 'Η ενημέρωση μπλοκαρίστηκε — {reason}',
'admin.plugins.reviewBlock': 'Έλεγχος',
'admin.plugins.retrusted': 'Το νέο κλειδί υπογραφής έγινε αποδεκτό — το plugin ενημερώθηκε',
'admin.plugins.sig.title': 'Η υπογραφή του {name} δεν μπόρεσε να επαληθευτεί',
'admin.plugins.sig.keyChangedBody':
'Το κλειδί υπογραφής του δημιουργού δεν είναι αυτό με το οποίο εγκαταστάθηκε αυτό το plugin. Οι δημιουργοί όντως αλλάζουν κλειδιά — αλλά ένας επιτιθέμενος που θα είχε καταλάβει το plugin θα έμοιαζε ακριβώς έτσι.',
'admin.plugins.sig.invalidBody':
'Τα αρχεία δεν ταιριάζουν με την υπογραφή του δημιουργού. Δεν είναι αυτά που υπέγραψε ο δημιουργός — είτε αλλοιώθηκαν, είτε παραποιήθηκαν. Αυτό δεν μπορεί να παρακαμφθεί.',
'admin.plugins.sig.missingBody':
'Αυτό το plugin ήταν υπογεγραμμένο όταν το εγκαταστήσατε, αλλά η νέα έκδοση δεν περιλαμβάνει καμία υπογραφή. Το TREK δεν θα δεχτεί σιωπηλά αυτή την υποβάθμιση. Αυτό δεν μπορεί να παρακαμφθεί.',
'admin.plugins.sig.incompleteBody':
'Η καταχώριση στο μητρώο είναι μισοϋπογεγραμμένη: δηλώνει κλειδί δημιουργού αλλά η έκδοση δεν φέρει υπογραφή (ή το αντίστροφο). Αυτό είναι σφάλμα από την πλευρά του plugin. Αυτό δεν μπορεί να παρακαμφθεί.',
'admin.plugins.sig.pinnedKey': 'Κλειδί με το οποίο εγκαταστάθηκε',
'admin.plugins.sig.newKey': 'Κλειδί που προσφέρει τώρα',
'admin.plugins.sig.confirmOutOfBand':
'Το TREK δεν μπορεί να ξεχωρίσει μια νόμιμη αλλαγή κλειδιού από μια κατάληψη — από εδώ φαίνονται πανομοιότυπες. Επιβεβαιώστε το νέο κλειδί με τον δημιουργό μέσω ενός καναλιού που ήδη εμπιστεύεστε, προτού το αποδεχτείτε. Μόλις το κάνετε, το plugin ενημερώνεται και το νέο κλειδί απομνημονεύεται.',
'admin.plugins.sig.retrustConfirm': 'Εμπιστοσύνη στο νέο κλειδί & ενημέρωση',
'admin.plugins.sig.cancel': 'Να μην γίνει αποδεκτό',
'admin.plugins.sig.consentUnsigned':
'Τίποτα δεν συνδέει αυτή την έκδοση με τον δημιουργό της — τα αρχεία ταιριάζουν με το μητρώο, αλλά δεν φέρουν υπογραφή δημιουργού.',
'admin.plugins.security.trustTitle': 'Το συμπέρασμα',
'admin.plugins.security.trustBody':
'Η εγκατάσταση ενός plugin είναι σαν την εγκατάσταση οποιασδήποτε εφαρμογής τρίτου: προσθέστε κώδικα μόνο από δημιουργούς που εμπιστεύεστε, και σε περίπτωση αμφιβολίας, ελέγξτε τον πρώτα μόνοι σας. Το TREK δεν αναλαμβάνει καμία ευθύνη για plugins τρίτων.',
@@ -471,6 +502,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Λήψη',
'admin.plugins.dep.update': 'Ενημέρωση',
'admin.plugins.dep.resolveHint': 'Λαμβάνει την πιο πρόσφατη συμβατή έκδοση, μαζί με τις δικές της εξαρτήσεις.',
'admin.plugins.dep.trekIncompatible': 'Απαιτεί TREK {range} — αυτός ο διακομιστής εκτελεί {host}',
'admin.plugins.dep.trekUnknown': 'Δεν δηλώνει ποιες εκδόσεις TREK υποστηρίζει',
'admin.plugins.installCompatible': 'Εγκατάσταση {version}',
'admin.plugins.incompatible': 'Μη συμβατό',
'admin.plugins.accessTitle': 'Σε τι έχει πρόσβαση',
'admin.plugins.connectsTitle': 'Συνδέεται σε',
'admin.plugins.detailsTitle': 'Λεπτομέρειες',
+2 -1
View File
@@ -104,7 +104,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Ρύθμιση',
'settings.notificationPreferences.testSuccess': 'Στάλθηκε δοκιμαστική ειδοποίηση.',
'settings.notificationPreferences.testFailed': 'Η δοκιμή απέτυχε.',
'settings.notificationPreferences.pluginConfigured': 'Ρυθμίστηκε. Διαχειριστείτε τα διαπιστευτήρια στη σελίδα ρυθμίσεων του πρόσθετου.',
'settings.notificationPreferences.pluginConfigured':
'Ρυθμίστηκε. Διαχειριστείτε τα διαπιστευτήρια στη σελίδα ρυθμίσεων του πρόσθετου.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.noChannels':
'Δεν έχουν διαμορφωθεί κανάλια ειδοποιήσεων. Ζητήστε από έναν διαχειριστή να ρυθμίσει ειδοποιήσεις email ή webhook.',
+38 -3
View File
@@ -188,14 +188,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Hibanapló megtekintése',
'admin.plugins.errorLog': 'Hibanapló',
'admin.plugins.allowedHosts': 'Engedélyezett hosztok',
'admin.plugins.allowedHosts.hint': 'Ez a bővítmény olyan szolgáltatással kommunikál, amelyet csak te tudsz megnevezni (saját üzemeltetésű kiszolgáló). Add meg a hosztokat, amelyeket elérhet — másokat nem.',
'admin.plugins.allowedHosts.hint':
'Ez a bővítmény olyan szolgáltatással kommunikál, amelyet csak te tudsz megnevezni (saját üzemeltetésű kiszolgáló). Add meg a hosztokat, amelyeket elérhet — másokat nem.',
'admin.plugins.allowedHosts.none': 'Még nincs hozzáadott hoszt.',
'admin.plugins.allowedHosts.unsupported': 'Ez a bővítmény nem használ üzemeltető által megadott hosztokat. Az engedélyezett hosztjai a manifestben rögzítettek.',
'admin.plugins.allowedHosts.unsupported':
'Ez a bővítmény nem használ üzemeltető által megadott hosztokat. Az engedélyezett hosztjai a manifestben rögzítettek.',
'admin.plugins.allowedHosts.restartNote': 'A mentés újraindítja a bővítményt, hogy átvegye az új listát.',
'admin.plugins.allowedHosts.add': 'Engedélyezett hoszt hozzáadása',
'admin.plugins.allowedHosts.count': '{n} engedélyezett hoszt',
'admin.plugins.operatorEgressPill': '+ általad hozzáadott hosztok',
'admin.plugins.operatorEgressHint': 'Ez a bővítmény olyan szolgáltatással kommunikál, amelyet csak te tudsz megnevezni (saját üzemeltetésű kiszolgáló). Telepítés után add meg a hosztokat a ⋯ → Engedélyezett hosztok alatt. Másokat nem ér el.',
'admin.plugins.operatorEgressHint':
'Ez a bővítmény olyan szolgáltatással kommunikál, amelyet csak te tudsz megnevezni (saját üzemeltetésű kiszolgáló). Telepítés után add meg a hosztokat a ⋯ → Engedélyezett hosztok alatt. Másokat nem ér el.',
'admin.plugins.noErrors': 'Nincsenek naplózott hibák.',
'admin.plugins.uninstalled': 'Plugin eltávolítva',
'admin.plugins.uninstallTitle': 'Plugin eltávolítása?',
@@ -364,6 +367,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Mit jelent az „Ellenőrizve"',
'admin.plugins.security.reviewedBody':
'Egy ellenőrzött plugint egy TREK karbantartó minden verziónál kézzel átvizsgált kártevők után — ellenséges kód szempontjából ellenőrizte, nem pedig azt, hogy jól működik-e. Ez nem ígéret arra, hogy a plugin ártalmatlan.',
'admin.plugins.security.signedTitle': 'Mit jelent az „Aláírva"',
'admin.plugins.security.signedBody':
'Az ellenőrzőösszeg, amelyet a TREK minden telepítéskor ellenőriz, azt bizonyítja, hogy a fájlok pontosan azok, amelyekért a jegyzék jótáll. Az aláírás mást bizonyít: azt, hogy a szerzőtől származnak, olyan kulccsal aláírva, amelyet csak ő birtokol. Egy aláírt plugin mindkettővel rendelkezik. Az aláírás nélküli nem veszélyes — egyszerűen eggyel kevesebb garanciát hordoz, és a jegyzékben ma a legtöbb plugin aláírás nélküli.',
'admin.plugins.signed': 'Aláírva',
'admin.plugins.signedHint': 'Telepítéskor ellenőrizve a szerző aláírókulcsával',
'admin.plugins.unsigned': 'Aláírás nélkül',
'admin.plugins.unsignedHint':
'A fájlok megegyeznek azzal, amiért a jegyzék jótáll, de semmi sem köti őket a szerzőhöz. Eggyel kevesebb garancia — nem veszélyes.',
'admin.plugins.updateBlocked': 'Frissítés blokkolva — {reason}',
'admin.plugins.reviewBlock': 'Áttekintés',
'admin.plugins.retrusted': 'Az új aláírókulcs elfogadva — a plugin frissült',
'admin.plugins.sig.title': 'A(z) {name} aláírását nem sikerült ellenőrizni',
'admin.plugins.sig.keyChangedBody':
'A szerző aláírókulcsa nem az, amellyel ezt a plugint telepítetted. A szerzők valóban cserélnek kulcsot — de egy támadó, aki átvette a plugint, pontosan így nézne ki.',
'admin.plugins.sig.invalidBody':
'A fájlok nem egyeznek a szerző aláírásával. Nem azok, amiket a szerző aláírt — vagy megsérültek, vagy módosították őket. Ez nem hagyható figyelmen kívül.',
'admin.plugins.sig.missingBody':
'Ez a plugin alá volt írva, amikor telepítetted, de az új verzió nem tartalmaz aláírást. A TREK nem fogadja el csendben ezt a visszalépést. Ez nem hagyható figyelmen kívül.',
'admin.plugins.sig.incompleteBody':
'A jegyzékbeli bejegyzés félig aláírt: szerzői kulcsot deklarál, de a verzió nem hordoz aláírást (vagy fordítva). Ez a plugin oldalán elkövetett hiba. Ez nem hagyható figyelmen kívül.',
'admin.plugins.sig.pinnedKey': 'A telepítéskor használt kulcs',
'admin.plugins.sig.newKey': 'A most kínált kulcs',
'admin.plugins.sig.confirmOutOfBand':
'A TREK nem tudja megkülönböztetni a jogos kulcscserét az átvételtől — innen nézve a kettő azonos. Erősítsd meg az új kulcsot a szerzőnél egy olyan csatornán, amelyben már megbízol, mielőtt elfogadod. Amint ezt megteszed, a plugin frissül, és a TREK megjegyzi az új kulcsot.',
'admin.plugins.sig.retrustConfirm': 'Új kulcs megbízhatónak jelölése és frissítés',
'admin.plugins.sig.cancel': 'Ne bízz meg benne',
'admin.plugins.sig.consentUnsigned':
'Semmi sem köti ezt a verziót a szerzőjéhez — a fájlok megegyeznek a jegyzékkel, de nem hordoznak szerzői aláírást.',
'admin.plugins.security.trustTitle': 'A lényeg',
'admin.plugins.security.trustBody':
'Egy plugin telepítése olyan, mint bármely harmadik féltől származó alkalmazás telepítése: csak megbízható szerzőktől adj hozzá kódot, és kétség esetén előbb magad vizsgáld meg. A TREK semmilyen felelősséget nem vállal a harmadik féltől származó pluginokért.',
@@ -423,6 +454,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Letöltés',
'admin.plugins.dep.update': 'Frissítés',
'admin.plugins.dep.resolveHint': 'Letölti a legújabb kompatibilis verziót a saját függőségeivel együtt.',
'admin.plugins.dep.trekIncompatible': 'TREK {range} szükséges — ez a kiszolgáló {host} verziót futtat',
'admin.plugins.dep.trekUnknown': 'Nem adja meg, mely TREK-verziókat támogatja',
'admin.plugins.installCompatible': '{version} telepítése',
'admin.plugins.incompatible': 'Nem kompatibilis',
'admin.plugins.accessTitle': 'Mihez fér hozzá',
'admin.plugins.connectsTitle': 'Kapcsolódik ehhez',
'admin.plugins.detailsTitle': 'Részletek',
+2 -1
View File
@@ -297,7 +297,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Beállítás',
'settings.notificationPreferences.testSuccess': 'Teszt értesítés elküldve.',
'settings.notificationPreferences.testFailed': 'A teszt sikertelen.',
'settings.notificationPreferences.pluginConfigured': 'Beállítva. A hitelesítő adatok a bővítmény beállításainál kezelhetők.',
'settings.notificationPreferences.pluginConfigured':
'Beállítva. A hitelesítő adatok a bővítmény beállításainál kezelhetők.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -230,14 +230,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Lihat log error',
'admin.plugins.errorLog': 'Log error',
'admin.plugins.allowedHosts': 'Host yang diizinkan',
'admin.plugins.allowedHosts.hint': 'Plugin ini berbicara dengan layanan yang hanya Anda yang tahu namanya (server swakelola). Tambahkan host yang boleh dijangkau — selain itu tidak bisa.',
'admin.plugins.allowedHosts.hint':
'Plugin ini berbicara dengan layanan yang hanya Anda yang tahu namanya (server swakelola). Tambahkan host yang boleh dijangkau — selain itu tidak bisa.',
'admin.plugins.allowedHosts.none': 'Belum ada host yang ditambahkan.',
'admin.plugins.allowedHosts.unsupported': 'Plugin ini tidak memakai host dari operator. Host yang diizinkan sudah tetap di manifesnya.',
'admin.plugins.allowedHosts.unsupported':
'Plugin ini tidak memakai host dari operator. Host yang diizinkan sudah tetap di manifesnya.',
'admin.plugins.allowedHosts.restartNote': 'Menyimpan akan memulai ulang plugin agar memakai daftar baru.',
'admin.plugins.allowedHosts.add': 'Tambah host yang diizinkan',
'admin.plugins.allowedHosts.count': '{n} host diizinkan',
'admin.plugins.operatorEgressPill': '+ host yang Anda tambahkan',
'admin.plugins.operatorEgressHint': 'Plugin ini berbicara dengan layanan yang hanya Anda yang tahu namanya (server swakelola). Setelah dipasang, tambahkan host di ⋯ → Host yang diizinkan. Selain itu tidak bisa.',
'admin.plugins.operatorEgressHint':
'Plugin ini berbicara dengan layanan yang hanya Anda yang tahu namanya (server swakelola). Setelah dipasang, tambahkan host di ⋯ → Host yang diizinkan. Selain itu tidak bisa.',
'admin.plugins.noErrors': 'Tidak ada error yang tercatat.',
'admin.plugins.uninstalled': 'Plugin dihapus',
'admin.plugins.uninstallTitle': 'Hapus plugin?',
@@ -406,6 +409,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Apa arti "Ditinjau"',
'admin.plugins.security.reviewedBody':
'Plugin yang ditinjau telah dipindai secara manual dari malware oleh seorang maintainer TREK pada setiap versi — diperiksa untuk kode berbahaya, bukan untuk apakah plugin berfungsi dengan baik. Ini bukan janji bahwa plugin tidak berbahaya.',
'admin.plugins.security.signedTitle': 'Apa arti "Ditandatangani"',
'admin.plugins.security.signedBody':
'Checksum yang diverifikasi TREK pada setiap pemasangan membuktikan bahwa file-nya persis seperti yang dijamin registri. Tanda tangan membuktikan hal yang berbeda: bahwa file itu datang dari pembuatnya, ditandatangani dengan kunci yang hanya dia miliki. Plugin yang ditandatangani punya keduanya. Plugin tanpa tanda tangan bukan berarti tidak aman — ia hanya membawa satu jaminan lebih sedikit, dan sebagian besar plugin di registri saat ini memang belum ditandatangani.',
'admin.plugins.signed': 'Ditandatangani',
'admin.plugins.signedHint': 'Diverifikasi dengan kunci tanda tangan pembuatnya saat dipasang',
'admin.plugins.unsigned': 'Tanpa tanda tangan',
'admin.plugins.unsignedHint':
'File-nya cocok dengan yang dijamin registri, tetapi tidak ada yang mengaitkannya dengan pembuatnya. Satu jaminan lebih sedikit — bukan berarti tidak aman.',
'admin.plugins.updateBlocked': 'Pembaruan diblokir — {reason}',
'admin.plugins.reviewBlock': 'Tinjau',
'admin.plugins.retrusted': 'Kunci tanda tangan baru dipercaya — plugin diperbarui',
'admin.plugins.sig.title': 'Tanda tangan {name} tidak dapat diverifikasi',
'admin.plugins.sig.keyChangedBody':
'Kunci tanda tangan pembuatnya bukan kunci yang dipakai saat plugin ini dipasang. Pembuat memang kadang mengganti kunci — tetapi penyerang yang mengambil alih plugin ini akan terlihat persis seperti ini.',
'admin.plugins.sig.invalidBody':
'File-nya tidak cocok dengan tanda tangan pembuatnya. File itu bukan yang ditandatangani pembuatnya — entah rusak, entah diutak-atik. Ini tidak bisa dilewati.',
'admin.plugins.sig.missingBody':
'Plugin ini ditandatangani saat kamu memasangnya, tetapi versi barunya tidak menyertakan tanda tangan. TREK tidak akan diam-diam menerima kemunduran itu. Ini tidak bisa dilewati.',
'admin.plugins.sig.incompleteBody':
'Entri registrinya setengah ditandatangani: ia mendeklarasikan kunci pembuat tetapi versinya tidak membawa tanda tangan (atau sebaliknya). Itu kesalahan di sisi plugin. Ini tidak bisa dilewati.',
'admin.plugins.sig.pinnedKey': 'Kunci saat dipasang',
'admin.plugins.sig.newKey': 'Kunci yang ditawarkan sekarang',
'admin.plugins.sig.confirmOutOfBand':
'TREK tidak bisa membedakan pergantian kunci yang sah dari pengambilalihan — dari sini keduanya terlihat sama persis. Pastikan dulu kunci baru itu ke pembuatnya lewat saluran yang sudah kamu percaya sebelum kamu menerimanya. Setelah kamu menerimanya, plugin diperbarui dan kunci barunya diingat.',
'admin.plugins.sig.retrustConfirm': 'Percayai kunci baru & perbarui',
'admin.plugins.sig.cancel': 'Jangan percayai',
'admin.plugins.sig.consentUnsigned':
'Tidak ada yang mengaitkan versi ini dengan pembuatnya — file-nya cocok dengan registri, tetapi tidak membawa tanda tangan pembuat.',
'admin.plugins.security.trustTitle': 'Intinya',
'admin.plugins.security.trustBody':
'Memasang plugin sama seperti memasang aplikasi pihak ketiga mana pun: hanya tambahkan kode dari pembuat yang kamu percaya, dan jika ragu, periksa sendiri terlebih dahulu. TREK tidak bertanggung jawab atas plugin pihak ketiga.',
@@ -465,6 +496,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Unduh',
'admin.plugins.dep.update': 'Perbarui',
'admin.plugins.dep.resolveHint': 'Mengunduh versi kompatibel terbaru, termasuk dependensinya sendiri.',
'admin.plugins.dep.trekIncompatible': 'Membutuhkan TREK {range} — server ini menjalankan {host}',
'admin.plugins.dep.trekUnknown': 'Tidak menyatakan versi TREK mana yang didukung',
'admin.plugins.installCompatible': 'Instal {version}',
'admin.plugins.incompatible': 'Tidak kompatibel',
'admin.plugins.accessTitle': 'Yang bisa diaksesnya',
'admin.plugins.connectsTitle': 'Terhubung ke',
'admin.plugins.detailsTitle': 'Detail',
+38 -3
View File
@@ -187,14 +187,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Visualizza log errori',
'admin.plugins.errorLog': 'Log errori',
'admin.plugins.allowedHosts': 'Host consentiti',
'admin.plugins.allowedHosts.hint': 'Questo plugin comunica con un servizio che solo tu puoi indicare (un server self-hosted). Aggiungi gli host che può raggiungere — non ne raggiungerà altri.',
'admin.plugins.allowedHosts.hint':
'Questo plugin comunica con un servizio che solo tu puoi indicare (un server self-hosted). Aggiungi gli host che può raggiungere — non ne raggiungerà altri.',
'admin.plugins.allowedHosts.none': 'Nessun host aggiunto.',
'admin.plugins.allowedHosts.unsupported': 'Questo plugin non usa host forniti dall’operatore. I suoi host consentiti sono fissati nel manifest.',
'admin.plugins.allowedHosts.unsupported':
'Questo plugin non usa host forniti dall’operatore. I suoi host consentiti sono fissati nel manifest.',
'admin.plugins.allowedHosts.restartNote': 'Il salvataggio riavvia il plugin perché prenda la nuova lista.',
'admin.plugins.allowedHosts.add': 'Aggiungi host consentito',
'admin.plugins.allowedHosts.count': '{n} host consentiti',
'admin.plugins.operatorEgressPill': '+ host aggiunti da te',
'admin.plugins.operatorEgressHint': 'Questo plugin comunica con un servizio che solo tu puoi indicare (un server self-hosted). Dopo l’installazione, aggiungi gli host che può raggiungere in ⋯ → Host consentiti. Non ne raggiungerà altri.',
'admin.plugins.operatorEgressHint':
'Questo plugin comunica con un servizio che solo tu puoi indicare (un server self-hosted). Dopo l’installazione, aggiungi gli host che può raggiungere in ⋯ → Host consentiti. Non ne raggiungerà altri.',
'admin.plugins.noErrors': 'Nessun errore registrato.',
'admin.plugins.uninstalled': 'Plugin disinstallato',
'admin.plugins.uninstallTitle': 'Disinstallare il plugin?',
@@ -359,6 +362,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Cosa significa "Verificato"',
'admin.plugins.security.reviewedBody':
'Un plugin verificato è stato esaminato manualmente alla ricerca di malware da un manutentore di TREK a ogni versione — controllato per individuare codice ostile, non per valutare se funziona bene. Non è una promessa che il plugin sia innocuo.',
'admin.plugins.security.signedTitle': 'Cosa significa "Firmato"',
'admin.plugins.security.signedBody':
"Il checksum che TREK verifica a ogni installazione dimostra che i file sono esattamente quelli garantiti dal registro. Una firma dimostra un'altra cosa: che provengono dall'autore, firmati con una chiave che solo lui possiede. Un plugin firmato ha entrambe le cose. Uno non firmato non è insicuro — porta semplicemente una garanzia in meno, e oggi la maggior parte dei plugin nel registro non è firmata.",
'admin.plugins.signed': 'Firmato',
'admin.plugins.signedHint': "Verificato con la chiave di firma dell'autore al momento dell'installazione",
'admin.plugins.unsigned': 'Non firmato',
'admin.plugins.unsignedHint':
"I file corrispondono a quanto garantito dal registro, ma nulla li collega all'autore. Una garanzia in meno — non è insicuro.",
'admin.plugins.updateBlocked': 'Aggiornamento bloccato — {reason}',
'admin.plugins.reviewBlock': 'Esamina',
'admin.plugins.retrusted': 'Nuova chiave di firma considerata attendibile — il plugin è aggiornato',
'admin.plugins.sig.title': 'Impossibile verificare la firma di {name}',
'admin.plugins.sig.keyChangedBody':
"La chiave di firma dell'autore non è quella con cui questo plugin è stato installato. Gli autori a volte cambiano chiave — ma un aggressore che avesse preso il controllo del plugin apparirebbe esattamente così.",
'admin.plugins.sig.invalidBody':
"I file non corrispondono alla firma dell'autore. Non sono ciò che l'autore ha firmato — o si sono corrotti, o sono stati manomessi. Non è possibile forzare questo blocco.",
'admin.plugins.sig.missingBody':
"Questo plugin era firmato quando l'hai installato, ma la nuova versione non include alcuna firma. TREK non accetterà in silenzio questo passo indietro. Non è possibile forzare questo blocco.",
'admin.plugins.sig.incompleteBody':
"La voce del registro è firmata a metà: dichiara una chiave dell'autore ma la versione non porta alcuna firma (o viceversa). È un errore lato plugin. Non è possibile forzare questo blocco.",
'admin.plugins.sig.pinnedKey': 'Chiave con cui è stato installato',
'admin.plugins.sig.newKey': 'Chiave che propone ora',
'admin.plugins.sig.confirmOutOfBand':
"TREK non può distinguere una legittima rotazione della chiave da un'appropriazione — da qui appaiono identiche. Prima di accettarla, conferma la nuova chiave con l'autore attraverso un canale di cui ti fidi già. Una volta fatto, il plugin viene aggiornato e la nuova chiave viene memorizzata.",
'admin.plugins.sig.retrustConfirm': 'Fidati della nuova chiave e aggiorna',
'admin.plugins.sig.cancel': 'Non fidarti',
'admin.plugins.sig.consentUnsigned':
"Nulla collega questa versione al suo autore — i file corrispondono al registro, ma non portano alcuna firma dell'autore.",
'admin.plugins.security.trustTitle': 'In conclusione',
'admin.plugins.security.trustBody':
'Installare un plugin è come installare una qualsiasi app di terze parti: aggiungi solo codice di autori di cui ti fidi e, in caso di dubbio, ispezionalo personalmente prima. TREK non si assume alcuna responsabilità per i plugin di terze parti.',
@@ -418,6 +449,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Scarica',
'admin.plugins.dep.update': 'Aggiorna',
'admin.plugins.dep.resolveHint': 'Scarica la versione compatibile più recente, incluse le sue dipendenze.',
'admin.plugins.dep.trekIncompatible': 'Richiede TREK {range} — questo server esegue {host}',
'admin.plugins.dep.trekUnknown': 'Non indica quali versioni di TREK supporta',
'admin.plugins.installCompatible': 'Installa {version}',
'admin.plugins.incompatible': 'Non compatibile',
'admin.plugins.accessTitle': 'A cosa può accedere',
'admin.plugins.connectsTitle': 'Si connette a',
'admin.plugins.detailsTitle': 'Dettagli',
+2 -1
View File
@@ -296,7 +296,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Configura',
'settings.notificationPreferences.testSuccess': 'Notifica di prova inviata.',
'settings.notificationPreferences.testFailed': 'Test non riuscito.',
'settings.notificationPreferences.pluginConfigured': 'Configurato. Gestisci le credenziali nelle impostazioni del plugin.',
'settings.notificationPreferences.pluginConfigured':
'Configurato. Gestisci le credenziali nelle impostazioni del plugin.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -219,14 +219,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'エラーログを表示',
'admin.plugins.errorLog': 'エラーログ',
'admin.plugins.allowedHosts': '許可するホスト',
'admin.plugins.allowedHosts.hint': 'このプラグインは、あなたしか指定できないサービス(セルフホストのサーバー)と通信します。到達を許可するホストを追加してください。それ以外には到達できません。',
'admin.plugins.allowedHosts.hint':
'このプラグインは、あなたしか指定できないサービス(セルフホストのサーバー)と通信します。到達を許可するホストを追加してください。それ以外には到達できません。',
'admin.plugins.allowedHosts.none': 'ホストはまだ追加されていません。',
'admin.plugins.allowedHosts.unsupported': 'このプラグインは運用者指定のホストを使いません。許可ホストはマニフェストで固定されています。',
'admin.plugins.allowedHosts.unsupported':
'このプラグインは運用者指定のホストを使いません。許可ホストはマニフェストで固定されています。',
'admin.plugins.allowedHosts.restartNote': '保存するとプラグインが再起動し、新しい一覧が反映されます。',
'admin.plugins.allowedHosts.add': '許可ホストを追加',
'admin.plugins.allowedHosts.count': '許可ホスト {n} 件',
'admin.plugins.operatorEgressPill': '+ 追加するホスト',
'admin.plugins.operatorEgressHint': 'このプラグインは、あなたしか指定できないサービス(セルフホストのサーバー)と通信します。インストール後、⋯ → 許可するホスト から追加してください。それ以外には到達できません。',
'admin.plugins.operatorEgressHint':
'このプラグインは、あなたしか指定できないサービス(セルフホストのサーバー)と通信します。インストール後、⋯ → 許可するホスト から追加してください。それ以外には到達できません。',
'admin.plugins.noErrors': '記録されたエラーはありません。',
'admin.plugins.uninstalled': 'プラグインをアンインストールしました',
'admin.plugins.uninstallTitle': 'プラグインをアンインストールしますか?',
@@ -372,6 +375,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '「レビュー済み」の意味',
'admin.plugins.security.reviewedBody':
'レビュー済みのプラグインは、TREKのメンテナーが各バージョンで手動でマルウェアの有無を確認したものです — 悪意のあるコードの有無を確認したものであり、正しく動作するかどうかを確認したものではありません。プラグインが無害であることを約束するものではありません。',
'admin.plugins.security.signedTitle': '「署名済み」の意味',
'admin.plugins.security.signedBody':
'TREKがインストールのたびに検証するチェックサムは、ファイルがレジストリの保証するものとまったく同一であることを証明します。署名が証明するのは別のことです。そのファイルが作者本人から届いたこと、そして作者だけが持つ鍵で署名されていることです。署名済みのプラグインはその両方を備えています。署名がないプラグインが危険というわけではありません — 保証がひとつ少ないだけであり、現時点ではレジストリのプラグインの多くは署名されていません。',
'admin.plugins.signed': '署名済み',
'admin.plugins.signedHint': 'インストール時に作者の署名鍵で検証済み',
'admin.plugins.unsigned': '署名なし',
'admin.plugins.unsignedHint':
'ファイルはレジストリが保証するものと一致しますが、作者と結びつけるものはありません。保証がひとつ少ないだけで、危険というわけではありません。',
'admin.plugins.updateBlocked': 'アップデートをブロックしました — {reason}',
'admin.plugins.reviewBlock': '確認する',
'admin.plugins.retrusted': '新しい署名鍵を信頼しました — プラグインを更新しました',
'admin.plugins.sig.title': '{name}の署名を検証できませんでした',
'admin.plugins.sig.keyChangedBody':
'作者の署名鍵が、このプラグインをインストールしたときの鍵と異なります。作者が鍵を更新することは実際にあります — ただし、プラグインを乗っ取った攻撃者も、ここからはまったく同じように見えます。',
'admin.plugins.sig.invalidBody':
'ファイルが作者の署名と一致しません。作者が署名したものではなく、破損したか、改ざんされたかのどちらかです。これを上書きすることはできません。',
'admin.plugins.sig.missingBody':
'このプラグインはインストール時には署名されていましたが、新しいバージョンには署名がありません。TREKはこの後退を黙って受け入れることはしません。これを上書きすることはできません。',
'admin.plugins.sig.incompleteBody':
'レジストリの登録内容が中途半端です。作者の鍵は宣言されているのに、このバージョンには署名がありません(またはその逆です)。これはプラグイン側の不備です。これを上書きすることはできません。',
'admin.plugins.sig.pinnedKey': 'インストール時の鍵',
'admin.plugins.sig.newKey': '現在提示されている鍵',
'admin.plugins.sig.confirmOutOfBand':
'TREKには、正当な鍵の更新と乗っ取りを見分けることはできません — ここからは両者はまったく同じに見えます。受け入れる前に、すでに信頼している経路で作者に新しい鍵を確認してください。受け入れると、プラグインが更新され、新しい鍵が記憶されます。',
'admin.plugins.sig.retrustConfirm': '新しい鍵を信頼して更新',
'admin.plugins.sig.cancel': '信頼しない',
'admin.plugins.sig.consentUnsigned':
'このバージョンと作者を結びつけるものはありません — ファイルはレジストリと一致しますが、作者の署名は付いていません。',
'admin.plugins.security.trustTitle': '結論',
'admin.plugins.security.trustBody':
'プラグインのインストールは、サードパーティ製アプリのインストールと同じです。信頼できる作者のコードのみを追加し、少しでも疑わしい場合は、まずご自身で内容を確認してください。TREKはサードパーティ製プラグインについて一切の責任を負いません。',
@@ -431,6 +462,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'ダウンロード',
'admin.plugins.dep.update': '更新',
'admin.plugins.dep.resolveHint': '独自の依存関係を含め、最新の互換バージョンをダウンロードします。',
'admin.plugins.dep.trekIncompatible': 'TREK {range} が必要です — このサーバーは {host} です',
'admin.plugins.dep.trekUnknown': '対応する TREK バージョンが宣言されていません',
'admin.plugins.installCompatible': '{version} をインストール',
'admin.plugins.incompatible': '非対応',
'admin.plugins.accessTitle': 'アクセスできるもの',
'admin.plugins.connectsTitle': '接続先',
'admin.plugins.detailsTitle': '詳細',
+38 -3
View File
@@ -224,14 +224,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': '오류 로그 보기',
'admin.plugins.errorLog': '오류 로그',
'admin.plugins.allowedHosts': '허용된 호스트',
'admin.plugins.allowedHosts.hint': '이 플러그인은 관리자만 알 수 있는 서비스(자체 호스팅 서버)와 통신합니다. 접근을 허용할 호스트를 추가하세요 — 그 외에는 접근할 수 없습니다.',
'admin.plugins.allowedHosts.hint':
'이 플러그인은 관리자만 알 수 있는 서비스(자체 호스팅 서버)와 통신합니다. 접근을 허용할 호스트를 추가하세요 — 그 외에는 접근할 수 없습니다.',
'admin.plugins.allowedHosts.none': '아직 추가된 호스트가 없습니다.',
'admin.plugins.allowedHosts.unsupported': '이 플러그인은 운영자가 지정하는 호스트를 사용하지 않습니다. 허용 호스트는 매니페스트에 고정되어 있습니다.',
'admin.plugins.allowedHosts.unsupported':
'이 플러그인은 운영자가 지정하는 호스트를 사용하지 않습니다. 허용 호스트는 매니페스트에 고정되어 있습니다.',
'admin.plugins.allowedHosts.restartNote': '저장하면 플러그인이 재시작되어 새 목록을 적용합니다.',
'admin.plugins.allowedHosts.add': '허용 호스트 추가',
'admin.plugins.allowedHosts.count': '허용 호스트 {n}개',
'admin.plugins.operatorEgressPill': '+ 직접 추가하는 호스트',
'admin.plugins.operatorEgressHint': '이 플러그인은 관리자만 알 수 있는 서비스(자체 호스팅 서버)와 통신합니다. 설치 후 ⋯ → 허용된 호스트에서 추가하세요. 그 외에는 접근할 수 없습니다.',
'admin.plugins.operatorEgressHint':
'이 플러그인은 관리자만 알 수 있는 서비스(자체 호스팅 서버)와 통신합니다. 설치 후 ⋯ → 허용된 호스트에서 추가하세요. 그 외에는 접근할 수 없습니다.',
'admin.plugins.noErrors': '기록된 오류가 없습니다.',
'admin.plugins.uninstalled': '플러그인이 제거되었습니다',
'admin.plugins.uninstallTitle': '플러그인을 제거할까요?',
@@ -373,6 +376,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '"검토됨"의 의미',
'admin.plugins.security.reviewedBody':
'검토된 플러그인은 각 버전마다 TREK 관리자가 악성코드를 수동으로 검사한 것입니다 — 정상 작동 여부가 아니라 악의적인 코드가 있는지 확인한 것입니다. 플러그인이 무해하다는 약속은 아닙니다.',
'admin.plugins.security.signedTitle': '"서명됨"의 의미',
'admin.plugins.security.signedBody':
'TREK이 설치할 때마다 검증하는 체크섬은 파일이 레지스트리가 보증하는 것과 정확히 일치함을 증명합니다. 서명은 다른 것을 증명합니다. 그 파일이 작성자에게서 왔으며, 작성자만 가진 키로 서명되었다는 사실입니다. 서명된 플러그인은 두 가지를 모두 갖추고 있습니다. 서명되지 않았다고 해서 안전하지 않다는 뜻은 아닙니다 — 보장이 하나 적을 뿐이며, 현재 레지스트리의 플러그인 대부분은 서명되어 있지 않습니다.',
'admin.plugins.signed': '서명됨',
'admin.plugins.signedHint': '설치 당시 작성자의 서명 키로 검증되었습니다',
'admin.plugins.unsigned': '서명 없음',
'admin.plugins.unsignedHint':
'파일은 레지스트리가 보증하는 것과 일치하지만, 작성자와 연결해 주는 것은 없습니다. 보장이 하나 적을 뿐, 안전하지 않다는 뜻은 아닙니다.',
'admin.plugins.updateBlocked': '업데이트가 차단되었습니다 — {reason}',
'admin.plugins.reviewBlock': '확인',
'admin.plugins.retrusted': '새 서명 키를 신뢰했습니다 — 플러그인이 업데이트되었습니다',
'admin.plugins.sig.title': '{name}의 서명을 검증할 수 없습니다',
'admin.plugins.sig.keyChangedBody':
'작성자의 서명 키가 이 플러그인을 설치할 때 사용된 키와 다릅니다. 작성자가 키를 교체하는 일은 실제로 있습니다 — 하지만 플러그인을 탈취한 공격자도 여기서는 이와 똑같아 보입니다.',
'admin.plugins.sig.invalidBody':
'파일이 작성자의 서명과 일치하지 않습니다. 작성자가 서명한 파일이 아니며, 손상되었거나 변조된 것입니다. 이 경우는 무시하고 진행할 수 없습니다.',
'admin.plugins.sig.missingBody':
'설치할 때 이 플러그인에는 서명이 있었지만, 새 버전에는 서명이 없습니다. TREK은 이런 후퇴를 조용히 받아들이지 않습니다. 이 경우는 무시하고 진행할 수 없습니다.',
'admin.plugins.sig.incompleteBody':
'레지스트리 항목이 반만 서명되어 있습니다. 작성자 키는 선언되어 있지만 해당 버전에는 서명이 없습니다(또는 그 반대입니다). 이는 플러그인 쪽의 실수입니다. 이 경우는 무시하고 진행할 수 없습니다.',
'admin.plugins.sig.pinnedKey': '설치할 때 사용된 키',
'admin.plugins.sig.newKey': '지금 제시하는 키',
'admin.plugins.sig.confirmOutOfBand':
'TREK은 정당한 키 교체와 탈취를 구분할 수 없습니다 — 여기서는 둘이 똑같아 보입니다. 받아들이기 전에 이미 신뢰하는 경로를 통해 작성자에게 새 키를 확인하세요. 받아들이면 플러그인이 업데이트되고 새 키가 기억됩니다.',
'admin.plugins.sig.retrustConfirm': '새 키를 신뢰하고 업데이트',
'admin.plugins.sig.cancel': '신뢰하지 않기',
'admin.plugins.sig.consentUnsigned':
'이 버전과 작성자를 연결해 주는 것이 없습니다 — 파일은 레지스트리와 일치하지만 작성자 서명이 없습니다.',
'admin.plugins.security.trustTitle': '핵심 요약',
'admin.plugins.security.trustBody':
'플러그인을 설치하는 것은 다른 서드파티 앱을 설치하는 것과 같습니다: 신뢰할 수 있는 작성자의 코드만 추가하고, 의심스러우면 먼저 직접 확인하세요. TREK은 서드파티 플러그인에 대해 어떠한 책임도 지지 않습니다.',
@@ -432,6 +463,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': '다운로드',
'admin.plugins.dep.update': '업데이트',
'admin.plugins.dep.resolveHint': '자체 종속성을 포함하여 호환되는 최신 버전을 다운로드합니다.',
'admin.plugins.dep.trekIncompatible': 'TREK {range}이(가) 필요합니다 — 이 서버는 {host}입니다',
'admin.plugins.dep.trekUnknown': '지원하는 TREK 버전을 명시하지 않았습니다',
'admin.plugins.installCompatible': '{version} 설치',
'admin.plugins.incompatible': '호환되지 않음',
'admin.plugins.accessTitle': '접근할 수 있는 항목',
'admin.plugins.connectsTitle': '연결 대상',
'admin.plugins.detailsTitle': '상세 정보',
+38 -3
View File
@@ -188,14 +188,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Foutenlog bekijken',
'admin.plugins.errorLog': 'Foutenlog',
'admin.plugins.allowedHosts': 'Toegestane hosts',
'admin.plugins.allowedHosts.hint': 'Deze plug-in praat met een dienst die alleen jij kunt benoemen (een zelf-gehoste server). Voeg de hosts toe die hij mag bereiken — andere bereikt hij niet.',
'admin.plugins.allowedHosts.hint':
'Deze plug-in praat met een dienst die alleen jij kunt benoemen (een zelf-gehoste server). Voeg de hosts toe die hij mag bereiken — andere bereikt hij niet.',
'admin.plugins.allowedHosts.none': 'Nog geen hosts toegevoegd.',
'admin.plugins.allowedHosts.unsupported': 'Deze plug-in gebruikt geen door de beheerder opgegeven hosts. De toegestane hosts staan vast in het manifest.',
'admin.plugins.allowedHosts.unsupported':
'Deze plug-in gebruikt geen door de beheerder opgegeven hosts. De toegestane hosts staan vast in het manifest.',
'admin.plugins.allowedHosts.restartNote': 'Opslaan herstart de plug-in zodat de nieuwe lijst wordt opgepakt.',
'admin.plugins.allowedHosts.add': 'Toegestane host toevoegen',
'admin.plugins.allowedHosts.count': '{n} toegestane host(s)',
'admin.plugins.operatorEgressPill': '+ hosts die jij toevoegt',
'admin.plugins.operatorEgressHint': 'Deze plug-in praat met een dienst die alleen jij kunt benoemen (een zelf-gehoste server). Voeg na installatie de bereikbare hosts toe via ⋯ → Toegestane hosts. Andere bereikt hij niet.',
'admin.plugins.operatorEgressHint':
'Deze plug-in praat met een dienst die alleen jij kunt benoemen (een zelf-gehoste server). Voeg na installatie de bereikbare hosts toe via ⋯ → Toegestane hosts. Andere bereikt hij niet.',
'admin.plugins.noErrors': 'Geen fouten geregistreerd.',
'admin.plugins.uninstalled': 'Plugin verwijderd',
'admin.plugins.uninstallTitle': 'Plugin verwijderen?',
@@ -359,6 +362,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Wat "Beoordeeld" betekent',
'admin.plugins.security.reviewedBody':
'Een beoordeelde plugin is bij elke versie handmatig door een TREK-beheerder op malware gecontroleerd — gecontroleerd op kwaadaardige code, niet op de vraag of hij goed werkt. Het is geen belofte dat de plugin ongevaarlijk is.',
'admin.plugins.security.signedTitle': 'Wat "Ondertekend" betekent',
'admin.plugins.security.signedBody':
'De controlesom die TREK bij elke installatie verifieert, bewijst dat de bestanden precies zijn waarvoor de registry instaat. Een handtekening bewijst iets anders: dat ze van de auteur komen, ondertekend met een sleutel die alleen hij heeft. Een ondertekende plugin heeft beide. Een niet-ondertekende plugin is niet onveilig — hij draagt simpelweg één garantie minder, en de meeste plugins in de registry zijn vandaag niet ondertekend.',
'admin.plugins.signed': 'Ondertekend',
'admin.plugins.signedHint': 'Bij de installatie geverifieerd tegen de ondertekeningssleutel van de auteur',
'admin.plugins.unsigned': 'Niet ondertekend',
'admin.plugins.unsignedHint':
'De bestanden komen overeen met waarvoor de registry instaat, maar niets koppelt ze aan de auteur. Eén garantie minder — niet onveilig.',
'admin.plugins.updateBlocked': 'Update geblokkeerd — {reason}',
'admin.plugins.reviewBlock': 'Bekijken',
'admin.plugins.retrusted': 'Nieuwe ondertekeningssleutel vertrouwd — de plugin is bijgewerkt',
'admin.plugins.sig.title': 'De handtekening van {name} kon niet worden geverifieerd',
'admin.plugins.sig.keyChangedBody':
'De ondertekeningssleutel van de auteur is niet die waarmee deze plugin is geïnstalleerd. Auteurs wisselen weleens van sleutel — maar een aanvaller die de plugin heeft overgenomen, zou er precies zo uitzien.',
'admin.plugins.sig.invalidBody':
'De bestanden komen niet overeen met de handtekening van de auteur. Ze zijn niet wat de auteur heeft ondertekend — ze zijn beschadigd geraakt, of er is mee geknoeid. Dit kan niet worden genegeerd.',
'admin.plugins.sig.missingBody':
'Deze plugin was ondertekend toen je hem installeerde, maar de nieuwe versie levert geen handtekening mee. TREK aanvaardt die stap terug niet stilzwijgend. Dit kan niet worden genegeerd.',
'admin.plugins.sig.incompleteBody':
'Het registry-item is half ondertekend: het vermeldt een auteurssleutel, maar de versie draagt geen handtekening (of andersom). Dat is een fout aan de kant van de plugin. Dit kan niet worden genegeerd.',
'admin.plugins.sig.pinnedKey': 'Sleutel waarmee hij is geïnstalleerd',
'admin.plugins.sig.newKey': 'Sleutel die hij nu aanbiedt',
'admin.plugins.sig.confirmOutOfBand':
'TREK kan een legitieme sleutelwissel niet onderscheiden van een overname — van hieruit zien ze er identiek uit. Bevestig de nieuwe sleutel bij de auteur via een kanaal dat je al vertrouwt voordat je hem accepteert. Zodra je dat doet, wordt de plugin bijgewerkt en wordt de nieuwe sleutel onthouden.',
'admin.plugins.sig.retrustConfirm': 'Nieuwe sleutel vertrouwen en bijwerken',
'admin.plugins.sig.cancel': 'Niet vertrouwen',
'admin.plugins.sig.consentUnsigned':
'Niets koppelt deze versie aan de auteur — de bestanden komen overeen met de registry, maar dragen geen handtekening van de auteur.',
'admin.plugins.security.trustTitle': 'De conclusie',
'admin.plugins.security.trustBody':
'Een plugin installeren is als het installeren van elke andere app van derden: voeg alleen code toe van auteurs die je vertrouwt en controleer deze bij twijfel eerst zelf. TREK aanvaardt geen enkele verantwoordelijkheid voor plugins van derden.',
@@ -418,6 +449,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Downloaden',
'admin.plugins.dep.update': 'Bijwerken',
'admin.plugins.dep.resolveHint': 'Downloadt de nieuwste compatibele versie, inclusief de eigen afhankelijkheden.',
'admin.plugins.dep.trekIncompatible': 'Vereist TREK {range} — deze server draait {host}',
'admin.plugins.dep.trekUnknown': 'Geeft niet aan welke TREK-versies worden ondersteund',
'admin.plugins.installCompatible': '{version} installeren',
'admin.plugins.incompatible': 'Niet compatibel',
'admin.plugins.accessTitle': 'Waartoe hij toegang heeft',
'admin.plugins.connectsTitle': 'Maakt verbinding met',
'admin.plugins.detailsTitle': 'Details',
+2 -1
View File
@@ -297,7 +297,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Instellen',
'settings.notificationPreferences.testSuccess': 'Testmelding verstuurd.',
'settings.notificationPreferences.testFailed': 'Test mislukt.',
'settings.notificationPreferences.pluginConfigured': 'Ingesteld. Beheer je gegevens op de instellingenpagina van de plug-in.',
'settings.notificationPreferences.pluginConfigured':
'Ingesteld. Beheer je gegevens op de instellingenpagina van de plug-in.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -181,14 +181,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Pokaż dziennik błędów',
'admin.plugins.errorLog': 'Dziennik błędów',
'admin.plugins.allowedHosts': 'Dozwolone hosty',
'admin.plugins.allowedHosts.hint': 'Ta wtyczka łączy się z usługą, którą tylko Ty możesz wskazać (serwer self-hosted). Dodaj hosty, do których może sięgać — do innych nie sięgnie.',
'admin.plugins.allowedHosts.hint':
'Ta wtyczka łączy się z usługą, którą tylko Ty możesz wskazać (serwer self-hosted). Dodaj hosty, do których może sięgać — do innych nie sięgnie.',
'admin.plugins.allowedHosts.none': 'Nie dodano jeszcze żadnych hostów.',
'admin.plugins.allowedHosts.unsupported': 'Ta wtyczka nie używa hostów podanych przez operatora. Jej dozwolone hosty są zapisane w manifeście.',
'admin.plugins.allowedHosts.unsupported':
'Ta wtyczka nie używa hostów podanych przez operatora. Jej dozwolone hosty są zapisane w manifeście.',
'admin.plugins.allowedHosts.restartNote': 'Zapis restartuje wtyczkę, aby pobrała nową listę.',
'admin.plugins.allowedHosts.add': 'Dodaj dozwolony host',
'admin.plugins.allowedHosts.count': '{n} dozwolonych hostów',
'admin.plugins.operatorEgressPill': '+ hosty, które dodasz',
'admin.plugins.operatorEgressHint': 'Ta wtyczka łączy się z usługą, którą tylko Ty możesz wskazać (serwer self-hosted). Po instalacji dodaj hosty w ⋯ → Dozwolone hosty. Do innych nie sięgnie.',
'admin.plugins.operatorEgressHint':
'Ta wtyczka łączy się z usługą, którą tylko Ty możesz wskazać (serwer self-hosted). Po instalacji dodaj hosty w ⋯ → Dozwolone hosty. Do innych nie sięgnie.',
'admin.plugins.noErrors': 'Brak zarejestrowanych błędów.',
'admin.plugins.uninstalled': 'Wtyczka została odinstalowana',
'admin.plugins.uninstallTitle': 'Odinstalować wtyczkę?',
@@ -356,6 +359,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Co oznacza „Zweryfikowana”',
'admin.plugins.security.reviewedBody':
'Zweryfikowana wtyczka została ręcznie przeskanowana pod kątem złośliwego oprogramowania przez opiekuna TREK w każdej wersji — sprawdzona pod kątem wrogiego kodu, a nie tego, czy działa dobrze. To nie jest obietnica, że wtyczka jest nieszkodliwa.',
'admin.plugins.security.signedTitle': 'Co oznacza „Podpisana”',
'admin.plugins.security.signedBody':
'Suma kontrolna, którą TREK weryfikuje przy każdej instalacji, dowodzi, że pliki są dokładnie tym, za co ręczy rejestr. Podpis dowodzi czegoś innego: że pochodzą od autora i zostały podpisane kluczem, który ma tylko on. Podpisana wtyczka ma jedno i drugie. Wtyczka bez podpisu nie jest niebezpieczna — po prostu niesie o jedną gwarancję mniej, a większość wtyczek w rejestrze jest dziś niepodpisana.',
'admin.plugins.signed': 'Podpisana',
'admin.plugins.signedHint': 'Zweryfikowana kluczem podpisującym autora w chwili instalacji',
'admin.plugins.unsigned': 'Niepodpisana',
'admin.plugins.unsignedHint':
'Pliki zgadzają się z tym, za co ręczy rejestr, ale nic nie wiąże ich z autorem. O jedną gwarancję mniej — nie oznacza to, że jest niebezpieczna.',
'admin.plugins.updateBlocked': 'Aktualizacja zablokowana — {reason}',
'admin.plugins.reviewBlock': 'Sprawdź',
'admin.plugins.retrusted': 'Nowy klucz podpisujący uznany za zaufany — wtyczka została zaktualizowana',
'admin.plugins.sig.title': 'Nie udało się zweryfikować podpisu wtyczki {name}',
'admin.plugins.sig.keyChangedBody':
'Klucz podpisujący autora nie jest tym, którym podpisano wtyczkę w chwili instalacji. Autorzy rzeczywiście wymieniają klucze — ale atakujący, który przejął wtyczkę, wyglądałby dokładnie tak samo.',
'admin.plugins.sig.invalidBody':
'Pliki nie zgadzają się z podpisem autora. Nie są tym, co autor podpisał — albo uległy uszkodzeniu, albo zostały zmodyfikowane. Tego nie można pominąć.',
'admin.plugins.sig.missingBody':
'Ta wtyczka była podpisana, gdy ją instalowałeś, ale nowa wersja nie zawiera żadnego podpisu. TREK nie przyjmie po cichu takiego kroku wstecz. Tego nie można pominąć.',
'admin.plugins.sig.incompleteBody':
'Wpis w rejestrze jest podpisany połowicznie: deklaruje klucz autora, ale wersja nie ma podpisu (albo odwrotnie). To błąd po stronie wtyczki. Tego nie można pominąć.',
'admin.plugins.sig.pinnedKey': 'Klucz, którym podpisano ją przy instalacji',
'admin.plugins.sig.newKey': 'Klucz, który proponuje teraz',
'admin.plugins.sig.confirmOutOfBand':
'TREK nie odróżni prawidłowej wymiany klucza od przejęcia wtyczki — stąd wyglądają identycznie. Zanim zaakceptujesz nowy klucz, potwierdź go u autora kanałem, któremu już ufasz. Gdy to zrobisz, wtyczka zostanie zaktualizowana, a nowy klucz zapamiętany.',
'admin.plugins.sig.retrustConfirm': 'Zaufaj nowemu kluczowi i zaktualizuj',
'admin.plugins.sig.cancel': 'Nie ufaj mu',
'admin.plugins.sig.consentUnsigned':
'Nic nie wiąże tej wersji z jej autorem — pliki zgadzają się z rejestrem, ale nie niosą podpisu autora.',
'admin.plugins.security.trustTitle': 'Podsumowanie',
'admin.plugins.security.trustBody':
'Instalacja wtyczki jest jak instalacja dowolnej aplikacji innych firm: dodawaj tylko kod od autorów, którym ufasz, a w razie wątpliwości najpierw samodzielnie go sprawdź. TREK nie ponosi żadnej odpowiedzialności za wtyczki innych firm.',
@@ -415,6 +446,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Pobierz',
'admin.plugins.dep.update': 'Aktualizuj',
'admin.plugins.dep.resolveHint': 'Pobiera najnowszą zgodną wersję wraz z jej zależnościami.',
'admin.plugins.dep.trekIncompatible': 'Wymaga TREK {range} — ten serwer działa na {host}',
'admin.plugins.dep.trekUnknown': 'Nie określa, które wersje TREK obsługuje',
'admin.plugins.installCompatible': 'Zainstaluj {version}',
'admin.plugins.incompatible': 'Niezgodny',
'admin.plugins.accessTitle': 'Do czego ma dostęp',
'admin.plugins.connectsTitle': 'Łączy się z',
'admin.plugins.detailsTitle': 'Szczegóły',
+2 -1
View File
@@ -291,7 +291,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Skonfiguruj',
'settings.notificationPreferences.testSuccess': 'Wysłano powiadomienie testowe.',
'settings.notificationPreferences.testFailed': 'Test nie powiódł się.',
'settings.notificationPreferences.pluginConfigured': 'Skonfigurowano. Dane logowania zmienisz na stronie ustawień wtyczki.',
'settings.notificationPreferences.pluginConfigured':
'Skonfigurowano. Dane logowania zmienisz na stronie ustawień wtyczki.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
+38 -3
View File
@@ -188,14 +188,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Показать журнал ошибок',
'admin.plugins.errorLog': 'Журнал ошибок',
'admin.plugins.allowedHosts': 'Разрешённые хосты',
'admin.plugins.allowedHosts.hint': 'Этот плагин обращается к сервису, который можете указать только вы (self-hosted сервер). Добавьте хосты, к которым он может обращаться — к другим он не сможет.',
'admin.plugins.allowedHosts.hint':
'Этот плагин обращается к сервису, который можете указать только вы (self-hosted сервер). Добавьте хосты, к которым он может обращаться — к другим он не сможет.',
'admin.plugins.allowedHosts.none': 'Хосты пока не добавлены.',
'admin.plugins.allowedHosts.unsupported': 'Этот плагин не использует хосты, задаваемые оператором. Его разрешённые хосты зафиксированы в манифесте.',
'admin.plugins.allowedHosts.unsupported':
'Этот плагин не использует хосты, задаваемые оператором. Его разрешённые хосты зафиксированы в манифесте.',
'admin.plugins.allowedHosts.restartNote': 'Сохранение перезапускает плагин, чтобы он подхватил новый список.',
'admin.plugins.allowedHosts.add': 'Добавить разрешённый хост',
'admin.plugins.allowedHosts.count': 'Разрешённых хостов: {n}',
'admin.plugins.operatorEgressPill': '+ добавленные вами хосты',
'admin.plugins.operatorEgressHint': 'Этот плагин обращается к сервису, который можете указать только вы (self-hosted сервер). После установки добавьте хосты в ⋯ → Разрешённые хосты. К другим он не сможет обратиться.',
'admin.plugins.operatorEgressHint':
'Этот плагин обращается к сервису, который можете указать только вы (self-hosted сервер). После установки добавьте хосты в ⋯ → Разрешённые хосты. К другим он не сможет обратиться.',
'admin.plugins.noErrors': 'Ошибок не зафиксировано.',
'admin.plugins.uninstalled': 'Плагин удалён',
'admin.plugins.uninstallTitle': 'Удалить плагин?',
@@ -360,6 +363,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Что означает «Проверен»',
'admin.plugins.security.reviewedBody':
'Проверенный плагин был вручную просканирован на вредоносный код сопровождающим TREK в каждой версии — проверен на вредоносный код, а не на то, насколько хорошо он работает. Это не обещание того, что плагин безвреден.',
'admin.plugins.security.signedTitle': 'Что означает «Подписан»',
'admin.plugins.security.signedBody':
'Контрольная сумма, которую TREK проверяет при каждой установке, доказывает, что файлы — ровно те, за которые ручается реестр. Подпись доказывает другое: что они пришли от автора и подписаны ключом, который есть только у него. У подписанного плагина есть и то, и другое. Неподписанный плагин не является небезопасным — просто у него одной гарантией меньше, и большинство плагинов в реестре сегодня не подписаны.',
'admin.plugins.signed': 'Подписан',
'admin.plugins.signedHint': 'При установке проверен по ключу подписи автора',
'admin.plugins.unsigned': 'Без подписи',
'admin.plugins.unsignedHint':
'Файлы совпадают с тем, за что ручается реестр, но ничто не связывает их с автором. Одной гарантией меньше — это не значит, что он небезопасен.',
'admin.plugins.updateBlocked': 'Обновление заблокировано — {reason}',
'admin.plugins.reviewBlock': 'Разобраться',
'admin.plugins.retrusted': 'Новый ключ подписи принят — плагин обновлён',
'admin.plugins.sig.title': 'Не удалось проверить подпись плагина «{name}»',
'admin.plugins.sig.keyChangedBody':
'Ключ подписи автора — не тот, с которым этот плагин был установлен. Авторы действительно меняют ключи, но злоумышленник, захвативший плагин, выглядел бы ровно так же.',
'admin.plugins.sig.invalidBody':
'Файлы не соответствуют подписи автора. Это не то, что автор подписал: они либо повреждены, либо изменены. Это нельзя обойти.',
'admin.plugins.sig.missingBody':
'Этот плагин был подписан, когда вы его устанавливали, но новая версия поставляется без подписи. TREK не примет такой откат молча. Это нельзя обойти.',
'admin.plugins.sig.incompleteBody':
'Запись в реестре подписана наполовину: в ней объявлен ключ автора, но у версии нет подписи (или наоборот). Это ошибка на стороне плагина. Это нельзя обойти.',
'admin.plugins.sig.pinnedKey': 'Ключ, с которым он был установлен',
'admin.plugins.sig.newKey': 'Ключ, который он предлагает сейчас',
'admin.plugins.sig.confirmOutOfBand':
'TREK не может отличить законную смену ключа от захвата — отсюда они выглядят одинаково. Прежде чем принять новый ключ, подтвердите его у автора по каналу, которому вы уже доверяете. После этого плагин будет обновлён, а новый ключ — запомнен.',
'admin.plugins.sig.retrustConfirm': 'Доверять новому ключу и обновить',
'admin.plugins.sig.cancel': 'Не доверять',
'admin.plugins.sig.consentUnsigned':
'Ничто не связывает эту версию с её автором — файлы совпадают с реестром, но не несут подписи автора.',
'admin.plugins.security.trustTitle': 'Итог',
'admin.plugins.security.trustBody':
'Установка плагина похожа на установку любого стороннего приложения: добавляйте только код от авторов, которым доверяете, а при сомнениях сначала проверьте его самостоятельно. TREK не несёт ответственности за сторонние плагины.',
@@ -419,6 +450,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Загрузить',
'admin.plugins.dep.update': 'Обновить',
'admin.plugins.dep.resolveHint': 'Загружает последнюю совместимую версию вместе с её зависимостями.',
'admin.plugins.dep.trekIncompatible': 'Требуется TREK {range} — на этом сервере {host}',
'admin.plugins.dep.trekUnknown': 'Не указано, какие версии TREK поддерживаются',
'admin.plugins.installCompatible': 'Установить {version}',
'admin.plugins.incompatible': 'Несовместимо',
'admin.plugins.accessTitle': 'К чему есть доступ',
'admin.plugins.connectsTitle': 'Подключается к',
'admin.plugins.detailsTitle': 'Подробности',
+38 -3
View File
@@ -244,14 +244,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Visa felloggen',
'admin.plugins.errorLog': 'Fellogg',
'admin.plugins.allowedHosts': 'Tillåtna värdar',
'admin.plugins.allowedHosts.hint': 'Detta plugin pratar med en tjänst som bara du kan namnge (en självhostad server). Lägg till de värdar det får nå — inga andra.',
'admin.plugins.allowedHosts.hint':
'Detta plugin pratar med en tjänst som bara du kan namnge (en självhostad server). Lägg till de värdar det får nå — inga andra.',
'admin.plugins.allowedHosts.none': 'Inga värdar tillagda ännu.',
'admin.plugins.allowedHosts.unsupported': 'Detta plugin använder inte operatörsangivna värdar. Dess tillåtna värdar är låsta i manifestet.',
'admin.plugins.allowedHosts.unsupported':
'Detta plugin använder inte operatörsangivna värdar. Dess tillåtna värdar är låsta i manifestet.',
'admin.plugins.allowedHosts.restartNote': 'Att spara startar om pluginet så att den nya listan används.',
'admin.plugins.allowedHosts.add': 'Lägg till tillåten värd',
'admin.plugins.allowedHosts.count': '{n} tillåtna värdar',
'admin.plugins.operatorEgressPill': '+ värdar du lägger till',
'admin.plugins.operatorEgressHint': 'Detta plugin pratar med en tjänst som bara du kan namnge (en självhostad server). Lägg efter installation till värdarna under ⋯ → Tillåtna värdar. Inga andra nås.',
'admin.plugins.operatorEgressHint':
'Detta plugin pratar med en tjänst som bara du kan namnge (en självhostad server). Lägg efter installation till värdarna under ⋯ → Tillåtna värdar. Inga andra nås.',
'admin.plugins.noErrors': 'Inga fel loggade.',
'admin.plugins.uninstalled': 'Pluginet har avinstallerats',
'admin.plugins.uninstallTitle': 'Avinstallera pluginet?',
@@ -414,6 +417,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Vad ”Granskad” betyder',
'admin.plugins.security.reviewedBody':
'Ett granskat plugin har manuellt skannats efter skadlig kod av en TREK-underhållare i varje version — kontrollerat för fientlig kod, inte för om det fungerar bra. Det är inget löfte om att pluginet är ofarligt.',
'admin.plugins.security.signedTitle': 'Vad ”Signerad” betyder',
'admin.plugins.security.signedBody':
'Kontrollsumman som TREK verifierar vid varje installation bevisar att filerna är exakt det som registret går i god för. En signatur bevisar något annat: att de kommer från upphovspersonen, signerade med en nyckel som bara hen har. Ett signerat plugin har båda delarna. Ett osignerat är inte osäkert — det bär helt enkelt en garanti mindre, och de flesta plugins i registret är osignerade i dag.',
'admin.plugins.signed': 'Signerad',
'admin.plugins.signedHint': 'Verifierad mot upphovspersonens signeringsnyckel när den installerades',
'admin.plugins.unsigned': 'Osignerad',
'admin.plugins.unsignedHint':
'Filerna stämmer med det registret går i god för, men ingenting knyter dem till upphovspersonen. En garanti mindre — inte osäkert.',
'admin.plugins.updateBlocked': 'Uppdateringen blockerad — {reason}',
'admin.plugins.reviewBlock': 'Granska',
'admin.plugins.retrusted': 'Ny signeringsnyckel betrodd — pluginet är uppdaterat',
'admin.plugins.sig.title': 'Signaturen för {name} kunde inte verifieras',
'admin.plugins.sig.keyChangedBody':
'Upphovspersonens signeringsnyckel är inte den som pluginet installerades med. Upphovspersoner byter faktiskt nycklar — men en angripare som tagit över pluginet skulle se ut precis så här.',
'admin.plugins.sig.invalidBody':
'Filerna stämmer inte med upphovspersonens signatur. De är inte det som upphovspersonen signerade — antingen har de skadats eller så har någon manipulerat dem. Detta går inte att förbigå.',
'admin.plugins.sig.missingBody':
'Det här pluginet var signerat när du installerade det, men den nya versionen levereras utan signatur. TREK accepterar inte den försämringen i tysthet. Detta går inte att förbigå.',
'admin.plugins.sig.incompleteBody':
'Registerposten är halvsignerad: den anger en upphovspersonsnyckel men versionen bär ingen signatur (eller tvärtom). Det är ett misstag på pluginets sida. Detta går inte att förbigå.',
'admin.plugins.sig.pinnedKey': 'Nyckeln det installerades med',
'admin.plugins.sig.newKey': 'Nyckeln det erbjuder nu',
'admin.plugins.sig.confirmOutOfBand':
'TREK kan inte skilja ett legitimt nyckelbyte från en kapning — härifrån ser de identiska ut. Bekräfta den nya nyckeln med upphovspersonen via en kanal du redan litar på innan du accepterar den. När du gör det uppdateras pluginet och den nya nyckeln sparas.',
'admin.plugins.sig.retrustConfirm': 'Lita på den nya nyckeln och uppdatera',
'admin.plugins.sig.cancel': 'Lita inte på den',
'admin.plugins.sig.consentUnsigned':
'Ingenting knyter den här versionen till sin upphovsperson — filerna stämmer med registret, men de bär ingen signatur från upphovspersonen.',
'admin.plugins.security.trustTitle': 'Sammanfattningsvis',
'admin.plugins.security.trustBody':
'Att installera ett plugin är som att installera vilken tredjepartsapp som helst: lägg bara till kod från upphovspersoner du litar på, och granska det själv först om du är osäker. TREK tar inget ansvar för tredjepartsplugins.',
@@ -473,6 +504,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Ladda ner',
'admin.plugins.dep.update': 'Uppdatera',
'admin.plugins.dep.resolveHint': 'Laddar ner den senaste kompatibla versionen, inklusive dess egna beroenden.',
'admin.plugins.dep.trekIncompatible': 'Kräver TREK {range} — den här servern kör {host}',
'admin.plugins.dep.trekUnknown': 'Anger inte vilka TREK-versioner som stöds',
'admin.plugins.installCompatible': 'Installera {version}',
'admin.plugins.incompatible': 'Inkompatibel',
'admin.plugins.accessTitle': 'Vad det har åtkomst till',
'admin.plugins.connectsTitle': 'Ansluter till',
'admin.plugins.detailsTitle': 'Detaljer',
+2 -1
View File
@@ -102,7 +102,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Konfigurera',
'settings.notificationPreferences.testSuccess': 'Testavisering skickad.',
'settings.notificationPreferences.testFailed': 'Testet misslyckades.',
'settings.notificationPreferences.pluginConfigured': 'Konfigurerat. Hantera dina uppgifter på pluginets inställningssida.',
'settings.notificationPreferences.pluginConfigured':
'Konfigurerat. Hantera dina uppgifter på pluginets inställningssida.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.noChannels':
'Inga meddelandekanaler har konfigurerats. Be en administratör att ställa in e-post- eller webhook-meddelanden.',
+38 -3
View File
@@ -232,14 +232,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Hata günlüğünü görüntüle',
'admin.plugins.errorLog': 'Hata günlüğü',
'admin.plugins.allowedHosts': 'İzin verilen ana bilgisayarlar',
'admin.plugins.allowedHosts.hint': 'Bu eklenti yalnızca sizin adlandırabileceğiniz bir hizmete bağlanır (kendi barındırdığınız sunucu). Erişebileceği ana bilgisayarları ekleyin — başkasına erişemez.',
'admin.plugins.allowedHosts.hint':
'Bu eklenti yalnızca sizin adlandırabileceğiniz bir hizmete bağlanır (kendi barındırdığınız sunucu). Erişebileceği ana bilgisayarları ekleyin — başkasına erişemez.',
'admin.plugins.allowedHosts.none': 'Henüz ana bilgisayar eklenmedi.',
'admin.plugins.allowedHosts.unsupported': 'Bu eklenti operatör tarafından verilen ana bilgisayarları kullanmaz. İzin verilenler manifestinde sabittir.',
'admin.plugins.allowedHosts.unsupported':
'Bu eklenti operatör tarafından verilen ana bilgisayarları kullanmaz. İzin verilenler manifestinde sabittir.',
'admin.plugins.allowedHosts.restartNote': 'Kaydetmek, yeni listeyi alması için eklentiyi yeniden başlatır.',
'admin.plugins.allowedHosts.add': 'İzin verilen ana bilgisayar ekle',
'admin.plugins.allowedHosts.count': '{n} izin verilen ana bilgisayar',
'admin.plugins.operatorEgressPill': '+ eklediğiniz ana bilgisayarlar',
'admin.plugins.operatorEgressHint': 'Bu eklenti yalnızca sizin adlandırabileceğiniz bir hizmete bağlanır (kendi barındırdığınız sunucu). Kurulumdan sonra ⋯ → İzin verilen ana bilgisayarlar altından ekleyin. Başkasına erişemez.',
'admin.plugins.operatorEgressHint':
'Bu eklenti yalnızca sizin adlandırabileceğiniz bir hizmete bağlanır (kendi barındırdığınız sunucu). Kurulumdan sonra ⋯ → İzin verilen ana bilgisayarlar altından ekleyin. Başkasına erişemez.',
'admin.plugins.noErrors': 'Kayıtlı hata yok.',
'admin.plugins.uninstalled': 'Eklenti kaldırıldı',
'admin.plugins.uninstallTitle': 'Eklenti kaldırılsın mı?',
@@ -403,6 +406,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '„İncelendi" ne anlama gelir',
'admin.plugins.security.reviewedBody':
'İncelenmiş bir eklenti, her sürümde bir TREK sorumlusu tarafından kötü amaçlı yazılıma karşı elle taranmıştır — düşmanca koda karşı kontrol edilmiştir, iyi çalışıp çalışmadığına göre değil. Bu, eklentinin zararsız olduğunun bir garantisi değildir.',
'admin.plugins.security.signedTitle': '„İmzalı" ne anlama gelir',
'admin.plugins.security.signedBody':
"TREK'in her kurulumda doğruladığı sağlama toplamı, dosyaların tam olarak dizinin kefil olduğu dosyalar olduğunu kanıtlar. Bir imza ise başka bir şeyi kanıtlar: dosyaların yazardan geldiğini ve yalnızca onun elindeki bir anahtarla imzalandığını. İmzalı bir eklentide her ikisi de vardır. İmzasız olan güvensiz değildir — yalnızca bir güvence eksiği taşır ve bugün dizindeki eklentilerin çoğu imzasızdır.",
'admin.plugins.signed': 'İmzalı',
'admin.plugins.signedHint': 'Kurulduğunda yazarın imzalama anahtarıyla doğrulandı',
'admin.plugins.unsigned': 'İmzasız',
'admin.plugins.unsignedHint':
'Dosyalar dizinin kefil olduğu dosyalarla eşleşiyor, ancak hiçbir şey onları yazara bağlamıyor. Bir güvence eksik — güvensiz değil.',
'admin.plugins.updateBlocked': 'Güncelleme engellendi — {reason}',
'admin.plugins.reviewBlock': 'İncele',
'admin.plugins.retrusted': 'Yeni imzalama anahtarına güvenildi — eklenti güncellendi',
'admin.plugins.sig.title': '{name} eklentisinin imzası doğrulanamadı',
'admin.plugins.sig.keyChangedBody':
'Yazarın imzalama anahtarı, bu eklentinin kurulduğu anahtar değil. Yazarlar anahtarlarını gerçekten değiştirir — ama eklentiyi ele geçiren bir saldırgan da tam olarak böyle görünürdü.',
'admin.plugins.sig.invalidBody':
'Dosyalar yazarın imzasıyla eşleşmiyor. Yazarın imzaladığı dosyalar bunlar değil — ya bozulmuşlar ya da kurcalanmışlar. Bu durum geçersiz kılınamaz.',
'admin.plugins.sig.missingBody':
'Bu eklenti siz kurduğunuzda imzalıydı, ancak yeni sürüm hiçbir imza içermiyor. TREK bu geriye gidişi sessizce kabul etmez. Bu durum geçersiz kılınamaz.',
'admin.plugins.sig.incompleteBody':
'Dizin kaydı yarım imzalı: bir yazar anahtarı bildiriyor ama sürüm imza taşımıyor (ya da tersi). Bu, eklenti tarafındaki bir hatadır. Bu durum geçersiz kılınamaz.',
'admin.plugins.sig.pinnedKey': 'Kurulduğu anahtar',
'admin.plugins.sig.newKey': 'Şimdi sunduğu anahtar',
'admin.plugins.sig.confirmOutOfBand':
'TREK, meşru bir anahtar değişimini bir ele geçirmeden ayırt edemez — buradan bakıldığında ikisi birebir aynı görünür. Kabul etmeden önce yeni anahtarı, zaten güvendiğiniz bir kanaldan yazara doğrulatın. Doğruladığınızda eklenti güncellenir ve yeni anahtar hatırlanır.',
'admin.plugins.sig.retrustConfirm': 'Yeni anahtara güven ve güncelle',
'admin.plugins.sig.cancel': 'Güvenme',
'admin.plugins.sig.consentUnsigned':
'Bu sürümü yazarına bağlayan hiçbir şey yok — dosyalar dizinle eşleşiyor, ama yazar imzası taşımıyorlar.',
'admin.plugins.security.trustTitle': 'Özetle',
'admin.plugins.security.trustBody':
'Bir eklenti yüklemek, herhangi bir üçüncü taraf uygulamasını yüklemek gibidir: yalnızca güvendiğiniz geliştiricilerin kodunu ekleyin ve şüpheye düştüğünüzde önce kendiniz inceleyin. TREK, üçüncü taraf eklentiler için hiçbir sorumluluk kabul etmez.',
@@ -462,6 +493,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'İndir',
'admin.plugins.dep.update': 'Güncelle',
'admin.plugins.dep.resolveHint': 'Kendi bağımlılıkları dahil, en son uyumlu sürümü indirir.',
'admin.plugins.dep.trekIncompatible': 'TREK {range} gerektiriyor — bu sunucu {host} çalıştırıyor',
'admin.plugins.dep.trekUnknown': 'Hangi TREK sürümlerini desteklediğini belirtmiyor',
'admin.plugins.installCompatible': '{version} sürümünü yükle',
'admin.plugins.incompatible': 'Uyumsuz',
'admin.plugins.accessTitle': 'Neye erişebilir',
'admin.plugins.connectsTitle': 'Şuraya bağlanır',
'admin.plugins.detailsTitle': 'Detaylar',
+2 -1
View File
@@ -97,7 +97,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Yapılandır',
'settings.notificationPreferences.testSuccess': 'Test bildirimi gönderildi.',
'settings.notificationPreferences.testFailed': 'Test başarısız.',
'settings.notificationPreferences.pluginConfigured': 'Yapılandırıldı. Kimlik bilgilerini eklentinin ayarlar sayfasından yönetin.',
'settings.notificationPreferences.pluginConfigured':
'Yapılandırıldı. Kimlik bilgilerini eklentinin ayarlar sayfasından yönetin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.noChannels':
'Bildirim kanalı yapılandırılmadı. Yöneticiden e-posta veya webhook kurmasını isteyin.',
+38 -3
View File
@@ -188,14 +188,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Переглянути журнал помилок',
'admin.plugins.errorLog': 'Журнал помилок',
'admin.plugins.allowedHosts': 'Дозволені хости',
'admin.plugins.allowedHosts.hint': 'Цей плагін звертається до сервісу, який можете вказати лише ви (self-hosted сервер). Додайте хости, до яких він може звертатися — до інших він не зможе.',
'admin.plugins.allowedHosts.hint':
'Цей плагін звертається до сервісу, який можете вказати лише ви (self-hosted сервер). Додайте хости, до яких він може звертатися — до інших він не зможе.',
'admin.plugins.allowedHosts.none': 'Хости ще не додано.',
'admin.plugins.allowedHosts.unsupported': 'Цей плагін не використовує хости, задані оператором. Його дозволені хости зафіксовані в маніфесті.',
'admin.plugins.allowedHosts.unsupported':
'Цей плагін не використовує хости, задані оператором. Його дозволені хости зафіксовані в маніфесті.',
'admin.plugins.allowedHosts.restartNote': 'Збереження перезапускає плагін, щоб він підхопив новий список.',
'admin.plugins.allowedHosts.add': 'Додати дозволений хост',
'admin.plugins.allowedHosts.count': 'Дозволених хостів: {n}',
'admin.plugins.operatorEgressPill': '+ додані вами хости',
'admin.plugins.operatorEgressHint': 'Цей плагін звертається до сервісу, який можете вказати лише ви (self-hosted сервер). Після встановлення додайте хости в ⋯ → Дозволені хости. До інших він не зможе звертатися.',
'admin.plugins.operatorEgressHint':
'Цей плагін звертається до сервісу, який можете вказати лише ви (self-hosted сервер). Після встановлення додайте хости в ⋯ → Дозволені хости. До інших він не зможе звертатися.',
'admin.plugins.noErrors': 'Помилок не зафіксовано.',
'admin.plugins.uninstalled': 'Плагін видалено',
'admin.plugins.uninstallTitle': 'Видалити плагін?',
@@ -357,6 +360,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': 'Що означає «Перевірено»',
'admin.plugins.security.reviewedBody':
'Перевірений плагін вручну сканував супроводжувач TREK на наявність шкідливого коду в кожній версії — перевіряли на ворожий код, а не на те, чи добре він працює. Це не обіцянка, що плагін безпечний.',
'admin.plugins.security.signedTitle': 'Що означає «Підписано»',
'admin.plugins.security.signedBody':
'Контрольна сума, яку TREK перевіряє під час кожного встановлення, доводить, що файли — це саме те, за що ручається реєстр. Підпис доводить інше: що вони походять від автора й підписані ключем, який є лише в нього. Підписаний плагін має і те, і те. Плагін без підпису не є небезпечним — він просто дає на одну гарантію менше, і сьогодні більшість плагінів у реєстрі не підписані.',
'admin.plugins.signed': 'Підписано',
'admin.plugins.signedHint': 'Під час встановлення перевірено за ключем підпису автора',
'admin.plugins.unsigned': 'Без підпису',
'admin.plugins.unsignedHint':
"Файли збігаються з тим, за що ручається реєстр, але ніщо не пов'язує їх з автором. На одну гарантію менше — але це не небезпечно.",
'admin.plugins.updateBlocked': 'Оновлення заблоковано — {reason}',
'admin.plugins.reviewBlock': 'Переглянути',
'admin.plugins.retrusted': 'Новому ключу підпису надано довіру — плагін оновлено',
'admin.plugins.sig.title': 'Не вдалося перевірити підпис плагіна «{name}»',
'admin.plugins.sig.keyChangedBody':
'Ключ підпису автора не той, з яким цей плагін було встановлено. Автори справді змінюють ключі — але зловмисник, який захопив плагін, виглядав би точнісінько так само.',
'admin.plugins.sig.invalidBody':
'Файли не відповідають підпису автора. Це не те, що підписав автор — їх або пошкоджено, або підмінено. Це не можна обійти.',
'admin.plugins.sig.missingBody':
'Цей плагін був підписаний, коли ви його встановлювали, але нова версія не має підпису. TREK не прийме таке пониження мовчки. Це не можна обійти.',
'admin.plugins.sig.incompleteBody':
'Запис у реєстрі підписаний наполовину: він оголошує ключ автора, але версія не має підпису (або навпаки). Це помилка на боці плагіна. Це не можна обійти.',
'admin.plugins.sig.pinnedKey': 'Ключ, з яким його встановлено',
'admin.plugins.sig.newKey': 'Ключ, який він пропонує зараз',
'admin.plugins.sig.confirmOutOfBand':
'TREK не може відрізнити законну зміну ключа від захоплення — звідси вони виглядають однаково. Перш ніж прийняти новий ключ, підтвердьте його в автора через канал, якому ви вже довіряєте. Щойно ви це зробите, плагін буде оновлено, а новий ключ — збережено.',
'admin.plugins.sig.retrustConfirm': 'Довіряти новому ключу й оновити',
'admin.plugins.sig.cancel': 'Не довіряти',
'admin.plugins.sig.consentUnsigned':
"Ніщо не пов'язує цю версію з її автором — файли збігаються з реєстром, але не мають підпису автора.",
'admin.plugins.security.trustTitle': 'Підсумок',
'admin.plugins.security.trustBody':
'Встановлення плагіна — це те саме, що встановлення будь-якого стороннього застосунку: додавайте лише код від авторів, яким довіряєте, а в разі сумнівів спершу перевірте його самостійно. TREK не несе відповідальності за сторонні плагіни.',
@@ -416,6 +447,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Завантажити',
'admin.plugins.dep.update': 'Оновити',
'admin.plugins.dep.resolveHint': 'Завантажує останню сумісну версію разом з її залежностями.',
'admin.plugins.dep.trekIncompatible': 'Потрібен TREK {range} — на цьому сервері {host}',
'admin.plugins.dep.trekUnknown': 'Не вказано, які версії TREK підтримуються',
'admin.plugins.installCompatible': 'Встановити {version}',
'admin.plugins.incompatible': 'Несумісно',
'admin.plugins.accessTitle': 'До чого має доступ',
'admin.plugins.connectsTitle': 'Підключається до',
'admin.plugins.detailsTitle': 'Деталі',
+38 -3
View File
@@ -243,14 +243,17 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': 'Xem nhật ký lỗi',
'admin.plugins.errorLog': 'Nhật ký lỗi',
'admin.plugins.allowedHosts': 'Máy chủ được phép',
'admin.plugins.allowedHosts.hint': 'Plugin này kết nối tới một dịch vụ mà chỉ bạn mới biết tên (máy chủ tự lưu trữ). Hãy thêm các máy chủ mà nó được phép truy cập — ngoài ra không có gì khác.',
'admin.plugins.allowedHosts.hint':
'Plugin này kết nối tới một dịch vụ mà chỉ bạn mới biết tên (máy chủ tự lưu trữ). Hãy thêm các máy chủ mà nó được phép truy cập — ngoài ra không có gì khác.',
'admin.plugins.allowedHosts.none': 'Chưa thêm máy chủ nào.',
'admin.plugins.allowedHosts.unsupported': 'Plugin này không dùng máy chủ do người vận hành cung cấp. Danh sách được cố định trong manifest.',
'admin.plugins.allowedHosts.unsupported':
'Plugin này không dùng máy chủ do người vận hành cung cấp. Danh sách được cố định trong manifest.',
'admin.plugins.allowedHosts.restartNote': 'Lưu sẽ khởi động lại plugin để nó dùng danh sách mới.',
'admin.plugins.allowedHosts.add': 'Thêm máy chủ được phép',
'admin.plugins.allowedHosts.count': '{n} máy chủ được phép',
'admin.plugins.operatorEgressPill': '+ máy chủ bạn thêm',
'admin.plugins.operatorEgressHint': 'Plugin này kết nối tới một dịch vụ mà chỉ bạn mới biết tên (máy chủ tự lưu trữ). Sau khi cài, hãy thêm máy chủ tại ⋯ → Máy chủ được phép. Ngoài ra không có gì khác.',
'admin.plugins.operatorEgressHint':
'Plugin này kết nối tới một dịch vụ mà chỉ bạn mới biết tên (máy chủ tự lưu trữ). Sau khi cài, hãy thêm máy chủ tại ⋯ → Máy chủ được phép. Ngoài ra không có gì khác.',
'admin.plugins.noErrors': 'Chưa ghi nhận lỗi nào.',
'admin.plugins.uninstalled': 'Đã gỡ cài đặt plugin',
'admin.plugins.uninstallTitle': 'Gỡ cài đặt plugin?',
@@ -356,6 +359,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '"Đã kiểm duyệt" nghĩa là gì',
'admin.plugins.security.reviewedBody':
'Một plugin đã kiểm duyệt đã được người bảo trì TREK quét thủ công để tìm mã độc trên mỗi phiên bản — được kiểm tra về mã độc hại, chứ không phải về việc nó có hoạt động tốt hay không. Đây không phải là lời hứa rằng plugin vô hại.',
'admin.plugins.security.signedTitle': '"Đã ký" nghĩa là gì',
'admin.plugins.security.signedBody':
'Giá trị kiểm tra (checksum) mà TREK xác minh ở mỗi lần cài đặt chứng minh rằng các tệp đúng là những gì kho đăng ký bảo chứng. Chữ ký chứng minh một điều khác: rằng chúng đến từ tác giả, được ký bằng một khóa chỉ mình họ nắm giữ. Một plugin đã ký có cả hai. Một plugin chưa ký không phải là không an toàn — nó chỉ mang ít hơn một bảo đảm, và hiện nay phần lớn plugin trong kho đăng ký đều chưa ký.',
'admin.plugins.signed': 'Đã ký',
'admin.plugins.signedHint': 'Đã được xác minh với khóa ký của tác giả khi cài đặt',
'admin.plugins.unsigned': 'Chưa ký',
'admin.plugins.unsignedHint':
'Các tệp khớp với những gì kho đăng ký bảo chứng, nhưng không có gì gắn chúng với tác giả. Ít hơn một bảo đảm — không phải là không an toàn.',
'admin.plugins.updateBlocked': 'Cập nhật bị chặn — {reason}',
'admin.plugins.reviewBlock': 'Xem lại',
'admin.plugins.retrusted': 'Đã tin cậy khóa ký mới — plugin đã được cập nhật',
'admin.plugins.sig.title': 'Không thể xác minh chữ ký của "{name}"',
'admin.plugins.sig.keyChangedBody':
'Khóa ký của tác giả không phải là khóa mà plugin này đã được cài đặt cùng. Các tác giả đôi khi có xoay vòng khóa — nhưng một kẻ tấn công đã chiếm quyền plugin cũng sẽ trông y hệt như vậy.',
'admin.plugins.sig.invalidBody':
'Các tệp không khớp với chữ ký của tác giả. Chúng không phải là những gì tác giả đã ký — hoặc chúng bị hỏng, hoặc chúng đã bị can thiệp. Không thể bỏ qua điều này.',
'admin.plugins.sig.missingBody':
'Plugin này đã được ký khi bạn cài đặt, nhưng phiên bản mới không kèm chữ ký nào. TREK sẽ không lặng lẽ chấp nhận bước lùi đó. Không thể bỏ qua điều này.',
'admin.plugins.sig.incompleteBody':
'Mục trong kho đăng ký chỉ được ký một nửa: nó khai báo khóa của tác giả nhưng phiên bản lại không có chữ ký (hoặc ngược lại). Đó là một sai sót từ phía plugin. Không thể bỏ qua điều này.',
'admin.plugins.sig.pinnedKey': 'Khóa đã dùng khi cài đặt',
'admin.plugins.sig.newKey': 'Khóa nó đang đưa ra hiện giờ',
'admin.plugins.sig.confirmOutOfBand':
'TREK không thể phân biệt một lần xoay khóa hợp lệ với một vụ chiếm quyền — nhìn từ đây, cả hai giống hệt nhau. Hãy xác nhận khóa mới với tác giả qua một kênh mà bạn đã tin tưởng trước khi chấp nhận nó. Khi bạn chấp nhận, plugin sẽ được cập nhật và khóa mới sẽ được ghi nhớ.',
'admin.plugins.sig.retrustConfirm': 'Tin cậy khóa mới & cập nhật',
'admin.plugins.sig.cancel': 'Không tin cậy',
'admin.plugins.sig.consentUnsigned':
'Không có gì gắn phiên bản này với tác giả của nó — các tệp khớp với kho đăng ký, nhưng chúng không mang chữ ký của tác giả.',
'admin.plugins.security.trustTitle': 'Điểm mấu chốt',
'admin.plugins.security.trustBody':
'Cài đặt một plugin cũng giống như cài đặt bất kỳ ứng dụng bên thứ ba nào: chỉ cài đặt mã từ những tác giả bạn tin tưởng, và khi còn nghi ngờ, hãy tự kiểm tra nó trước. TREK không chịu trách nhiệm về các plugin của bên thứ ba.',
@@ -415,6 +446,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': 'Tải xuống',
'admin.plugins.dep.update': 'Cập nhật',
'admin.plugins.dep.resolveHint': 'Tải phiên bản tương thích mới nhất, bao gồm cả các phần phụ thuộc của nó.',
'admin.plugins.dep.trekIncompatible': 'Cần TREK {range} — máy chủ này đang chạy {host}',
'admin.plugins.dep.trekUnknown': 'Không nêu rõ hỗ trợ những phiên bản TREK nào',
'admin.plugins.installCompatible': 'Cài đặt {version}',
'admin.plugins.incompatible': 'Không tương thích',
'admin.plugins.accessTitle': 'Những gì có thể truy cập',
'admin.plugins.connectsTitle': 'Kết nối tới',
'admin.plugins.detailsTitle': 'Chi tiết',
+2 -1
View File
@@ -103,7 +103,8 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.configure': 'Cấu hình',
'settings.notificationPreferences.testSuccess': 'Đã gửi thông báo thử.',
'settings.notificationPreferences.testFailed': 'Thử nghiệm thất bại.',
'settings.notificationPreferences.pluginConfigured': 'Đã cấu hình. Quản lý thông tin đăng nhập ở trang cài đặt của plugin.',
'settings.notificationPreferences.pluginConfigured':
'Đã cấu hình. Quản lý thông tin đăng nhập ở trang cài đặt của plugin.',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.notificationPreferences.noChannels':
'Không có kênh thông báo nào được cấu hình. Yêu cầu quản trị viên thiết lập thông báo qua email hoặc webhook.',
+35 -2
View File
@@ -221,14 +221,16 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': '檢視錯誤日誌',
'admin.plugins.errorLog': '錯誤日誌',
'admin.plugins.allowedHosts': '允許的主機',
'admin.plugins.allowedHosts.hint': '此外掛會連線到只有你才知道位址的服務(自架伺服器)。請新增它可以存取的主機 —— 其他主機一律無法存取。',
'admin.plugins.allowedHosts.hint':
'此外掛會連線到只有你才知道位址的服務(自架伺服器)。請新增它可以存取的主機 —— 其他主機一律無法存取。',
'admin.plugins.allowedHosts.none': '尚未新增主機。',
'admin.plugins.allowedHosts.unsupported': '此外掛不使用營運者提供的主機。其允許的主機已在資訊清單中固定。',
'admin.plugins.allowedHosts.restartNote': '儲存會重新啟動外掛,以便套用新的清單。',
'admin.plugins.allowedHosts.add': '新增允許的主機',
'admin.plugins.allowedHosts.count': '{n} 個允許的主機',
'admin.plugins.operatorEgressPill': '+ 你新增的主機',
'admin.plugins.operatorEgressHint': '此外掛會連線到只有你才知道位址的服務(自架伺服器)。安裝後請在 ⋯ → 允許的主機 中新增。其他主機一律無法存取。',
'admin.plugins.operatorEgressHint':
'此外掛會連線到只有你才知道位址的服務(自架伺服器)。安裝後請在 ⋯ → 允許的主機 中新增。其他主機一律無法存取。',
'admin.plugins.noErrors': '沒有錯誤記錄。',
'admin.plugins.uninstalled': '外掛已解除安裝',
'admin.plugins.uninstallTitle': '解除安裝外掛?',
@@ -358,6 +360,33 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '「已審核」的含義',
'admin.plugins.security.reviewedBody':
'已審核的外掛,代表 TREK 維護者曾針對每個版本手動掃描惡意程式碼——檢查是否含有有害程式碼,而非它是否運作良好。這並不保證外掛無害。',
'admin.plugins.security.signedTitle': '「已簽署」的含義',
'admin.plugins.security.signedBody':
'TREK 在每次安裝時驗證的總和檢查碼,證明這些檔案正是外掛庫所擔保的檔案。簽章證明的則是另一回事:它們出自作者之手,並以只有作者持有的金鑰簽署。已簽署的外掛兩者兼備。未簽署並不代表不安全——它只是少了一層保證,而目前外掛庫中的多數外掛都尚未簽署。',
'admin.plugins.signed': '已簽署',
'admin.plugins.signedHint': '安裝時已以作者的簽署金鑰驗證',
'admin.plugins.unsigned': '未簽署',
'admin.plugins.unsignedHint':
'檔案與外掛庫所擔保的內容相符,但沒有任何東西能將它們與作者連結起來。少了一層保證——但並非不安全。',
'admin.plugins.updateBlocked': '更新已阻擋——{reason}',
'admin.plugins.reviewBlock': '查看',
'admin.plugins.retrusted': '已信任新的簽署金鑰——外掛已更新',
'admin.plugins.sig.title': '無法驗證「{name}」的簽章',
'admin.plugins.sig.keyChangedBody':
'作者的簽署金鑰並非安裝此外掛時所用的那把。作者確實會輪替金鑰——但接管了該外掛的攻擊者,看起來也會與此一模一樣。',
'admin.plugins.sig.invalidBody':
'這些檔案與作者的簽章不符。它們並非作者所簽署的內容——不是已損毀,就是遭到竄改。此項無法略過。',
'admin.plugins.sig.missingBody':
'你安裝此外掛時它是有簽章的,但新版本並未附上任何簽章。TREK 不會默默接受這種倒退。此項無法略過。',
'admin.plugins.sig.incompleteBody':
'外掛庫中的項目只簽了一半:它宣告了作者金鑰,但該版本沒有簽章(或反之)。這是外掛一方的疏失。此項無法略過。',
'admin.plugins.sig.pinnedKey': '安裝時使用的金鑰',
'admin.plugins.sig.newKey': '它現在提供的金鑰',
'admin.plugins.sig.confirmOutOfBand':
'TREK 無法分辨正當的金鑰輪替與一次接管——從這裡看,兩者毫無二致。在接受之前,請透過你原本就信任的管道向作者確認這把新金鑰。一旦你接受,外掛就會更新,新金鑰也會被記住。',
'admin.plugins.sig.retrustConfirm': '信任新金鑰並更新',
'admin.plugins.sig.cancel': '不信任',
'admin.plugins.sig.consentUnsigned': '沒有任何東西能將這個版本與它的作者連結起來——檔案與外掛庫相符,但不帶作者簽章。',
'admin.plugins.security.trustTitle': '結論',
'admin.plugins.security.trustBody':
'安裝外掛就像安裝任何第三方應用程式:只加入你信任的作者所提供的程式碼,如有疑慮,請先自行檢查。TREK 對第三方外掛概不承擔任何責任。',
@@ -417,6 +446,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': '下載',
'admin.plugins.dep.update': '更新',
'admin.plugins.dep.resolveHint': '下載最新的相容版本,包含其自身的相依項目。',
'admin.plugins.dep.trekIncompatible': '需要 TREK {range}——此伺服器執行的是 {host}',
'admin.plugins.dep.trekUnknown': '未宣告支援的 TREK 版本',
'admin.plugins.installCompatible': '安裝 {version}',
'admin.plugins.incompatible': '不相容',
'admin.plugins.accessTitle': '可存取的內容',
'admin.plugins.connectsTitle': '連線至',
'admin.plugins.detailsTitle': '詳細資訊',
+36 -2
View File
@@ -181,14 +181,16 @@ const admin: TranslationStrings = {
'admin.plugins.viewErrors': '查看错误日志',
'admin.plugins.errorLog': '错误日志',
'admin.plugins.allowedHosts': '允许的主机',
'admin.plugins.allowedHosts.hint': '此插件会连接一个只有你才知道地址的服务(自托管服务器)。请添加它可以访问的主机 —— 其他主机一概无法访问。',
'admin.plugins.allowedHosts.hint':
'此插件会连接一个只有你才知道地址的服务(自托管服务器)。请添加它可以访问的主机 —— 其他主机一概无法访问。',
'admin.plugins.allowedHosts.none': '尚未添加主机。',
'admin.plugins.allowedHosts.unsupported': '此插件不使用运营者提供的主机。其允许的主机已在清单中固定。',
'admin.plugins.allowedHosts.restartNote': '保存会重启插件,以便应用新的列表。',
'admin.plugins.allowedHosts.add': '添加允许的主机',
'admin.plugins.allowedHosts.count': '{n} 个允许的主机',
'admin.plugins.operatorEgressPill': '+ 你添加的主机',
'admin.plugins.operatorEgressHint': '此插件会连接一个只有你才知道地址的服务(自托管服务器)。安装后请在 ⋯ → 允许的主机 中添加。其他主机一概无法访问。',
'admin.plugins.operatorEgressHint':
'此插件会连接一个只有你才知道地址的服务(自托管服务器)。安装后请在 ⋯ → 允许的主机 中添加。其他主机一概无法访问。',
'admin.plugins.noErrors': '暂无错误记录。',
'admin.plugins.uninstalled': '插件已卸载',
'admin.plugins.uninstallTitle': '卸载插件?',
@@ -318,6 +320,34 @@ const admin: TranslationStrings = {
'admin.plugins.security.reviewedTitle': '“已审核”的含义',
'admin.plugins.security.reviewedBody':
'已审核的插件,其每个版本都经过 TREK 维护者的人工恶意软件扫描 —— 检查的是有无恶意代码,而非它是否运行良好。这并不保证插件无害。',
'admin.plugins.security.signedTitle': '“已签名”的含义',
'admin.plugins.security.signedBody':
'TREK 在每次安装时校验的校验和,证明这些文件正是插件库所担保的那些文件。签名证明的则是另一回事:它们出自作者本人,并以只有作者持有的密钥签署。已签名的插件两者兼备。未签名并不意味着不安全 —— 它只是少了一重保证,而目前插件库中的大多数插件都未签名。',
'admin.plugins.signed': '已签名',
'admin.plugins.signedHint': '安装时已用作者的签名密钥验证过',
'admin.plugins.unsigned': '未签名',
'admin.plugins.unsignedHint':
'文件与插件库所担保的内容一致,但没有任何东西能把它们与作者关联起来。少了一重保证 —— 但并非不安全。',
'admin.plugins.updateBlocked': '更新已阻止 —— {reason}',
'admin.plugins.reviewBlock': '查看',
'admin.plugins.retrusted': '已信任新的签名密钥 —— 插件已更新',
'admin.plugins.sig.title': '无法验证“{name}”的签名',
'admin.plugins.sig.keyChangedBody':
'作者的签名密钥不是安装此插件时所用的那把。作者确实会轮换密钥 —— 但接管了该插件的攻击者,看上去也会与此一模一样。',
'admin.plugins.sig.invalidBody':
'这些文件与作者的签名不符。它们不是作者签署的内容 —— 要么已损坏,要么被篡改。此项无法忽略。',
'admin.plugins.sig.missingBody':
'你安装此插件时它是有签名的,但新版本未附带任何签名。TREK 不会悄然接受这种降级。此项无法忽略。',
'admin.plugins.sig.incompleteBody':
'插件库中的条目只签了一半:它声明了作者密钥,但该版本没有签名(或反之)。这是插件一方的疏漏。此项无法忽略。',
'admin.plugins.sig.pinnedKey': '安装时使用的密钥',
'admin.plugins.sig.newKey': '它现在提供的密钥',
'admin.plugins.sig.confirmOutOfBand':
'TREK 无法区分正当的密钥轮换与一次接管 —— 从这里看,两者别无二致。在接受之前,请通过你原本就信任的渠道向作者核实这把新密钥。核实并接受后,插件将被更新,新密钥也会被记住。',
'admin.plugins.sig.retrustConfirm': '信任新密钥并更新',
'admin.plugins.sig.cancel': '不信任',
'admin.plugins.sig.consentUnsigned':
'没有任何东西能把这个版本与它的作者关联起来 —— 文件与插件库一致,但不带作者签名。',
'admin.plugins.security.trustTitle': '归根结底',
'admin.plugins.security.trustBody':
'安装插件就如同安装任何第三方应用:只添加来自你信任的作者的代码,如有疑虑,请先自行检查。TREK 对第三方插件不承担任何责任。',
@@ -377,6 +407,10 @@ const admin: TranslationStrings = {
'admin.plugins.dep.download': '下载',
'admin.plugins.dep.update': '更新',
'admin.plugins.dep.resolveHint': '下载最新的兼容版本,包括其自身的依赖项。',
'admin.plugins.dep.trekIncompatible': '需要 TREK {range}——此服务器运行的是 {host}',
'admin.plugins.dep.trekUnknown': '未声明支持的 TREK 版本',
'admin.plugins.installCompatible': '安装 {version}',
'admin.plugins.incompatible': '不兼容',
'admin.plugins.accessTitle': '可访问的内容',
'admin.plugins.connectsTitle': '连接到',
'admin.plugins.detailsTitle': '详情',