Files
hermes-agent/web/src/i18n/af.ts
Austin Pickett 6d14a24b79 feat(dashboard): nous-blue theme, bulk sessions, schedule picker (#37383)
* feat(dashboard): nous-blue theme, bulk sessions, schedule picker

Batch of related dashboard improvements gathered on
austin/fix/dashboard-changes:

* Nous Blue theme — faithful port of the LENS_5I overlay system onto
  the existing DashboardTheme. Lifts the foreground inversion layer to
  z-index 200 to fix the long-standing hover / loading visual artifact,
  adds an explicit swatchColors slot so the theme picker shows the
  post-inversion preview, and migrates the legacy "lens-5i" theme key
  from localStorage / API to "nous-blue" on first read.
* Theme-aware series colors: new --series-input-token /
  --series-output-token CSS vars consumed by Analytics + Models
  charts; ToolCall + ModelInfoCard switched to semantic
  --color-success for diff lines and the Tools capability badge.
* Analytics + Models headers: consolidate period selector + refresh
  next to the page title and drop the redundant period badge.
* Bulk session management — "Delete empty (N)" button + per-row
  checkboxes with shift-click range select and a bulk-delete action
  bar. Backed by SessionDB.delete_sessions() /
  delete_empty_sessions() plus POST /api/sessions/bulk-delete and
  DELETE /api/sessions/empty (registered before the templated
  /api/sessions/{session_id} family so they don't get shadowed).
  Hard cap of 500 IDs per bulk request. Full pytest coverage.
* Cron page — human-readable schedule picker (every-interval / daily
  / weekly / monthly / once / custom) replaces the raw cron
  expression input; the job list now renders "Weekly on Mon, Wed,
  Fri at 14:30" instead of "30 14 * * 1,3,5". English-only ordinals
  for monthly schedules so non-English locales don't get incorrect
  suffixes.
* example-dashboard plugin moved from plugins/ to tests/fixtures/ so
  stock installs no longer ship the demo. Tests install it
  dynamically via a pytest fixture that also reorders the FastAPI
  routes.
* i18n: 40+ new keys for the bulk-select UI and schedule
  picker/describer translated across all 16 locales.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(dashboard): dedupe memory provider picker

The memory provider <Select> lived on both /system and /plugins,
writing the same config.yaml field through two different endpoints
with no cross-page refresh. Remove the picker from /system in favor
of a read-only status row + link to /plugins, where it pairs with
the context-engine picker under "Plugin providers".

/system retains the destructive admin controls (file sizes, Reset
MEMORY.md / USER.md / all). The api.setMemoryProvider client and
PUT /api/memory/provider backend endpoint are left in place for
CLI / script callers.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(dashboard): address Copilot review on PR #37383

- Backdrop layer-stack comment claimed LENS_5I-style themes override
  --component-backdrop-bg-blend-mode to multiply, but our only
  LENS_5I-style theme (nous-blue) keeps the default difference.
  Reword to describe what the code actually does and present the
  var as a forward-looking extension hook.
- /api/sessions/bulk-delete docstring promised the response would
  echo back the list of deleted IDs, but the implementation only
  returns {ok, deleted}. Tighten the docstring to match the wire
  format; the client already knows what it asked to delete, so the
  IDs aren't needed.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(dashboard): address copilot review on cron describe + bulk-select checkbox

- schedule.ts: restrict `describeCronExpression` to strictly 5-field cron
  expressions. The backend `parse_schedule` also accepts the 6-field
  `min hour dom month dow year` form, and humanising those by
  destructuring only the first five fields would silently drop the year
  (e.g. ``0 9 * * * 2099`` rendered as "Daily at 09:00"). 6+ field
  expressions now fall through to the raw-string fallback so the user
  sees what's actually scheduled.

- SessionsPage.tsx (SessionRow): wire the bulk-select Checkbox's
  ``onClick`` directly instead of attaching it to a parent ``<span>``
  with a no-op ``onCheckedChange``. Radix forwards onClick to the
  underlying ``<button role=checkbox>``, so the same handler now drives
  both mouse clicks (preserving shift-key state for range select) and
  keyboard activation (Space on the focused checkbox, which the browser
  synthesises as a click on the <button>). Improves a11y / keyboard UX
  without changing the controlled-selection model.

- SessionsPage.tsx: also extend ``SessionRowProps`` with the new
  ``onRename`` / ``onExport`` props introduced on main so the row's
  destructured prop types resolve after the merge.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-02 12:37:40 -04:00

754 lines
28 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Translations } from "./types";
export const af: Translations = {
common: {
save: "Stoor",
saving: "Besig om te stoor...",
cancel: "Kanselleer",
close: "Maak toe",
confirm: "Bevestig",
delete: "Skrap",
refresh: "Herlaai",
retry: "Probeer weer",
search: "Soek...",
loading: "Besig om te laai...",
create: "Skep",
creating: "Besig om te skep...",
set: "Stel",
replace: "Vervang",
clear: "Vee uit",
live: "Lewendig",
off: "Af",
enabled: "geaktiveer",
disabled: "gedeaktiveer",
active: "aktief",
inactive: "onaktief",
unknown: "onbekend",
untitled: "Sonder titel",
none: "Geen",
form: "Vorm",
noResults: "Geen resultate",
of: "van",
page: "Bladsy",
msgs: "boodskappe",
tools: "gereedskap",
match: "passing",
other: "Ander",
configured: "gekonfigureer",
removed: "verwyder",
failedToToggle: "Kon nie wissel nie",
failedToRemove: "Kon nie verwyder nie",
failedToReveal: "Kon nie openbaar nie",
collapse: "Vou in",
expand: "Vou uit",
general: "Algemeen",
messaging: "Boodskappe",
pluginLoadFailed:
"Kon nie hierdie inprop se skrip laai nie. Kontroleer die Netwerk-oortjie (dashboard-plugins/…) en die bediener se inprop-pad.",
pluginNotRegistered:
"Die inprop se skrip het nie register() geroep nie, of die skrip het 'n fout gegee. Maak die blaaier-konsole oop vir besonderhede.",
},
app: {
brand: "Hermes Agent",
brandShort: "HA",
closeNavigation: "Maak navigasie toe",
closeModelTools: "Maak model en gereedskap toe",
footer: {
org: "Nous Research",
},
activeSessionsLabel: "Aktiewe Sessies:",
gatewayStatusLabel: "Gateway-status:",
gatewayStrip: {
failed: "Begin het misluk",
off: "Af",
running: "Loop",
starting: "Begin",
stopped: "Gestop",
},
nav: {
analytics: "Analise",
chat: "Klets",
config: "Konfigurasie",
cron: "Cron",
documentation: "Dokumentasie",
keys: "Sleutels",
logs: "Logs",
models: "Modelle",
profiles: "profiele : multi-agente",
plugins: "Inproppe",
sessions: "Sessies",
skills: "Vaardighede",
},
modelToolsSheetSubtitle: "& gereedskap",
modelToolsSheetTitle: "Model",
navigation: "Navigasie",
openDocumentation: "Maak dokumentasie in 'n nuwe oortjie oop",
openNavigation: "Maak navigasie oop",
pluginNavSection: "Inproppe",
sessionsActiveCount: "{count} aktief",
statusOverview: "Statusoorsig",
system: "Stelsel",
webUi: "Web UI",
},
status: {
actionFailed: "Aksie het misluk",
actionFinished: "Voltooi",
actions: "Aksies",
agent: "Agent",
activeSessions: "Aktiewe Sessies",
connected: "Gekoppel",
connectedPlatforms: "Gekoppelde Platforms",
disconnected: "Ontkoppel",
error: "Fout",
failed: "Misluk",
gateway: "Gateway",
gatewayFailedToStart: "Gateway kon nie begin nie",
lastUpdate: "Laaste opdatering",
noneRunning: "Geen",
notRunning: "Loop nie",
pid: "PID",
platformDisconnected: "ontkoppel",
platformError: "fout",
recentSessions: "Onlangse Sessies",
restartGateway: "Herbegin Gateway",
restartingGateway: "Besig om gateway te herbegin…",
running: "Loop",
runningRemote: "Loop (afgeleë)",
startFailed: "Begin het misluk",
starting: "Begin",
startedInBackground: "Begin in agtergrond — kyk logs vir vordering",
stopped: "Gestop",
updateHermes: "Werk Hermes op",
updatingHermes: "Besig om Hermes op te werk…",
waitingForOutput: "Wag vir uitset…",
},
sessions: {
title: "Sessies",
history: "Geskiedenis",
overview: "Oorsig",
searchPlaceholder: "Soek boodskap-inhoud...",
noSessions: "Nog geen sessies nie",
noMatch: "Geen sessies stem ooreen met jou soektog nie",
startConversation: "Begin 'n gesprek om dit hier te sien",
noMessages: "Geen boodskappe",
untitledSession: "Sessie sonder titel",
deleteSession: "Skrap sessie",
confirmDeleteTitle: "Skrap sessie?",
confirmDeleteMessage:
"Dit verwyder die gesprek en al sy boodskappe permanent. Dit kan nie ongedaan gemaak word nie.",
sessionDeleted: "Sessie geskrap",
failedToDelete: "Kon nie sessie skrap nie",
deleteEmpty: "Skrap leë",
deleteEmptyConfirmTitle: "Skrap leë sessies?",
deleteEmptyConfirmMessage:
"Dit verwyder permanent {count} sessies wat geen boodskappe het nie. Aktiewe en geargiveerde sessies word oorgeslaan. Dit kan nie ongedaan gemaak word nie.",
emptySessionsDeleted: "{count} leë sessies geskrap",
failedToDeleteEmpty: "Kon nie leë sessies skrap nie",
selectSession: "Kies sessie",
selectAllOnPage: "Kies alles op hierdie bladsy",
clearSelection: "Maak keuse skoon",
selectedCount: "{count} gekies",
deleteSelected: "Skrap {count}",
deleteSelectedConfirmTitle: "Skrap {count} sessies?",
deleteSelectedConfirmMessage:
"Dit verwyder {count} gekose sessies en al hul boodskappe permanent. Dit kan nie ongedaan gemaak word nie.",
selectedSessionsDeleted: "{count} sessies geskrap",
failedToDeleteSelected: "Kon nie gekose sessies skrap nie",
resumeInChat: "Hervat in Klets",
previousPage: "Vorige bladsy",
nextPage: "Volgende bladsy",
roles: {
user: "Gebruiker",
assistant: "Assistent",
system: "Stelsel",
tool: "Gereedskap",
},
},
analytics: {
period: "Tydperk:",
totalTokens: "Totale Tokens",
totalSessions: "Totale Sessies",
apiCalls: "API-oproepe",
dailyTokenUsage: "Daaglikse Tokengebruik",
dailyBreakdown: "Daaglikse Uiteensetting",
perModelBreakdown: "Per-Model Uiteensetting",
topSkills: "Top Vaardighede",
skill: "Vaardigheid",
loads: "Agent Gelaai",
edits: "Agent Bestuur",
lastUsed: "Laas Gebruik",
input: "Inset",
output: "Uitset",
total: "Totaal",
noUsageData: "Geen gebruiksdata vir hierdie tydperk nie",
startSession: "Begin 'n sessie om analise hier te sien",
date: "Datum",
model: "Model",
tokens: "Tokens",
perDayAvg: "/dag gem.",
acrossModels: "oor {count} modelle",
inOut: "{input} in / {output} uit",
},
models: {
modelsUsed: "Modelle Gebruik",
estimatedCost: "Geskatte Koste",
tokens: "tokens",
sessions: "sessies",
avgPerSession: "gem./sessie",
apiCalls: "API-oproepe",
toolCalls: "gereedskap-oproepe",
noModelsData: "Geen modelgebruiksdata vir hierdie tydperk nie",
startSession: "Begin 'n sessie om modeldata hier te sien",
},
logs: {
title: "Logs",
autoRefresh: "Outo-herlaai",
file: "Lêer",
level: "Vlak",
component: "Komponent",
lines: "Reëls",
noLogLines: "Geen logreëls gevind nie",
},
cron: {
confirmDeleteMessage:
"Dit verwyder die taak van die skedule. Dit kan nie ongedaan gemaak word nie.",
confirmDeleteTitle: "Skrap geskeduleerde taak?",
newJob: "Nuwe Cron-taak",
nameOptional: "Naam (opsioneel)",
namePlaceholder: "bv. Daaglikse opsomming",
prompt: "Opdrag",
promptPlaceholder: "Wat moet die agent met elke uitvoering doen?",
schedule: "Skedule (cron-uitdrukking)",
schedulePlaceholder: "0 9 * * *",
scheduleMode: "Skedule",
scheduleModes: {
interval: "Herhalende interval",
daily: "Daagliks",
weekly: "Weekliks",
monthly: "Maandeliks",
once: "Een keer",
custom: "Pasgemaak (cron-uitdrukking)",
intervalEvery: "Elke",
intervalUnit: "Eenheid",
unitMinutes: "minute",
unitHours: "ure",
unitDays: "dae",
timeOfDay: "Tyd van die dag",
weekdays: "Dae van die week",
weekdaysShort: ["Son", "Maa", "Din", "Woe", "Don", "Vry", "Sat"],
dayOfMonth: "Dag van die maand",
onceAt: "Hardloop op",
customLabel: "Cron-uitdrukking",
customPlaceholder: "0 9 * * *",
customHint:
"Cron-uitdrukking met vyf velde (minuut, uur, dag, maand, weekdag).",
preview: "Word gestuur as",
previewEmpty: "(onvolledig)",
},
scheduleDescribe: {
none: "—",
everyMinutes: "Elke {n} min",
everyHours: "Elke {n} u",
everyDays: "Elke {n} d",
dailyAt: "Daagliks om {time}",
weeklyAt: "Weekliks op {days} om {time}",
monthlyAt: "Maandeliks op die {day} om {time}",
onceAt: "Een keer op {time}",
},
deliverTo: "Lewer aan",
scheduledJobs: "Geskeduleerde Take",
noJobs: "Geen cron-take gekonfigureer nie. Skep een hierbo.",
last: "Laaste",
next: "Volgende",
pause: "Pouse",
resume: "Hervat",
triggerNow: "Voer nou uit",
delivery: {
local: "Plaaslik",
telegram: "Telegram",
discord: "Discord",
slack: "Slack",
email: "Email",
},
},
profiles: {
newProfile: "Nuwe Profiel",
name: "Naam",
namePlaceholder: "bv. coder, writer, ens.",
nameRequired: "Naam word vereis",
nameRule:
"Slegs kleinletters, syfers, _ en -; moet met 'n letter of syfer begin; tot 64 karakters.",
invalidName: "Ongeldige profielnaam",
cloneFromDefault: "Kloon konfigurasie vanaf verstekprofiel",
allProfiles: "Profiele",
noProfiles: "Geen profiele gevind nie.",
defaultBadge: "verstek",
hasEnv: "env",
model: "Model",
skills: "Vaardighede",
rename: "Hernoem",
editSoul: "Wysig SOUL.md",
soulSection: "SOUL.md (persoonlikheid / stelselopdrag)",
soulPlaceholder: "# Hoe hierdie agent moet optree…",
saveSoul: "Stoor SOUL",
soulSaved: "SOUL.md gestoor",
openInTerminal: "Kopieer CLI-opdrag",
commandCopied: "Na knipbord gekopieer",
copyFailed: "Kon nie kopieer nie",
confirmDeleteTitle: "Skrap profiel?",
confirmDeleteMessage:
"Dit skrap profiel '{name}' permanent — konfigurasie, sleutels, geheue, sessies, vaardighede, cron-take. Kan nie ongedaan gemaak word nie.",
created: "Geskep",
deleted: "Geskrap",
renamed: "Hernoem",
},
pluginsPage: {
contextEngineLabel: "Konteks-enjin",
dashboardSlots: "Dashboard-gleuwe",
disableRuntime: "Deaktiveer",
enableAfterInstall: "Aktiveer ná installasie",
enableRuntime: "Aktiveer",
forceReinstall: "Forseer herinstallasie (skrap eers bestaande gids)",
headline:
"Ontdek, installeer, aktiveer en werk Hermes-inproppe op (`hermes plugins` ekwivalent).",
identifierLabel: "Git-URL of owner/repo",
inactive: "onaktief",
installBtn: "Installeer",
installHeading: "Installeer vanaf GitHub / Git-URL",
installHint: "Gebruik owner/repo-kortvorm of 'n volledige https:// of git@ kloon-URL.",
memoryProviderLabel: "Geheueverskaffer",
missingEnvWarn: "Stel hierdie in Sleutels voordat die inprop kan loop:",
noDashboardTab: "Geen dashboard-oortjie",
openTab: "Maak oop",
orphanHeading: "Slegs-dashboard-uitbreidings (geen ooreenstemmende agent plugin.yaml nie)",
pluginListHeading: "Geïnstalleerde inproppe",
providerDefaults: "ingebou / verstek",
providersHeading: "Looptyd-verskafferinproppe",
providersHint:
"Skryf memory.provider (leeg = ingebou) en context.engine na config.yaml. Tree volgende sessie in werking.",
refreshDashboard: "Herskandeer dashboard-uitbreidings",
removeConfirm: "Verwyder hierdie inprop uit ~/.hermes/plugins/?",
removeHint: "Slegs gebruiker-geïnstalleerde inproppe onder ~/.hermes/plugins kan verwyder word.",
rescanHeading: "SPA-inprop-register",
rescanHint: "Herskandeer ná die byvoeg van lêers op skyf sodat die dashboard-sybalk nuwe manifeste optel.",
runtimeHeading: "Gateway-looptyd (YAML-inproppe)",
saveProviders: "Stoor verskaffer-instellings",
savedProviders: "Verskaffer-instellings gestoor.",
sourceBadge: "Bron",
authRequired: "Verifikasie vereis",
authRequiredHint: "Voer hierdie opdrag uit om te verifieer:",
updateGit: "Git pull",
versionBadge: "Weergawe",
showInSidebar: "Wys in sybalk",
hideFromSidebar: "Versteek van sybalk",
},
skills: {
title: "Vaardighede",
searchPlaceholder: "Soek vaardighede en gereedskapstelle...",
enabledOf: "{enabled}/{total} geaktiveer",
all: "Alles",
categories: "Kategorieë",
filters: "Filters",
noSkills: "Geen vaardighede gevind nie. Vaardighede word gelaai uit ~/.hermes/skills/",
noSkillsMatch: "Geen vaardighede stem ooreen met jou soektog of filter nie.",
skillCount: "{count} vaardighe{s}id",
resultCount: "{count} resulta{s}at",
noDescription: "Geen beskrywing beskikbaar nie.",
toolsets: "Gereedskapstelle",
toolsetLabel: "{name} gereedskapstel",
noToolsetsMatch: "Geen gereedskapstelle stem ooreen met die soektog nie.",
setupNeeded: "Opstelling nodig",
disabledForCli: "Gedeaktiveer vir CLI",
more: "+{count} meer",
},
config: {
configPath: "~/.hermes/config.yaml",
filters: "Filters",
sections: "Afdelings",
exportConfig: "Voer konfigurasie uit as JSON",
importConfig: "Voer konfigurasie in vanaf JSON",
resetDefaults: "Stel terug na verstek",
resetScopeTooltip: "Stel {scope} terug na verstek",
confirmResetScope: "Stel alle {scope}-instellings terug na hul verstek? Dit werk slegs die vorm op — veranderinge word nie na config.yaml geskryf voordat jy Stoor druk nie.",
resetScopeToast: "{scope} teruggestel na verstek — kontroleer en Stoor om te behou",
rawYaml: "Rou YAML-konfigurasie",
searchResults: "Soekresultate",
fields: "veld{s}",
noFieldsMatch: 'Geen velde stem ooreen met "{query}" nie',
configSaved: "Konfigurasie gestoor",
yamlConfigSaved: "YAML-konfigurasie gestoor",
failedToSave: "Kon nie stoor nie",
failedToSaveYaml: "Kon nie YAML stoor nie",
failedToLoadRaw: "Kon nie rou konfigurasie laai nie",
configImported: "Konfigurasie ingevoer — kontroleer en stoor",
invalidJson: "Ongeldige JSON-lêer",
categories: {
general: "Algemeen",
agent: "Agent",
terminal: "Terminaal",
display: "Vertoon",
delegation: "Delegasie",
memory: "Geheue",
compression: "Kompressie",
security: "Sekuriteit",
browser: "Blaaier",
voice: "Stem",
tts: "Teks-na-Spraak",
stt: "Spraak-na-Teks",
logging: "Aantekening",
discord: "Discord",
auxiliary: "Hulpmiddels",
},
},
env: {
changesNote: "Veranderinge word onmiddellik na skyf gestoor. Aktiewe sessies tel nuwe sleutels outomaties op.",
confirmClearMessage:
"Die gestoorde waarde vir hierdie veranderlike sal uit jou .env-lêer verwyder word. Dit kan nie vanaf die UI ongedaan gemaak word nie.",
confirmClearTitle: "Vee hierdie sleutel uit?",
description: "Bestuur API-sleutels en geheime gestoor in",
hideAdvanced: "Versteek Gevorderd",
showAdvanced: "Wys Gevorderd",
showLess: "Wys minder",
showMore: "Wys meer",
llmProviders: "LLM-verskaffers",
providersConfigured: "{configured} van {total} verskaffers gekonfigureer",
getKey: "Kry sleutel",
notConfigured: "{count} nie gekonfigureer nie",
notSet: "Nie gestel nie",
keysCount: "{count} sleutel{s}",
enterValue: "Voer waarde in...",
replaceCurrentValue: "Vervang huidige waarde ({preview})",
showValue: "Wys werklike waarde",
hideValue: "Versteek waarde",
},
oauth: {
title: "Verskaffer-aanmeldings (OAuth)",
providerLogins: "Verskaffer-aanmeldings (OAuth)",
description: "{connected} van {total} OAuth-verskaffers gekoppel. Aanmeldvloei loop tans via die CLI; klik Kopieer opdrag en plak in 'n terminaal om op te stel.",
connected: "Gekoppel",
expired: "Verval",
notConnected: "Nie gekoppel nie. Voer {command} uit in 'n terminaal.",
runInTerminal: "in 'n terminaal.",
noProviders: "Geen OAuth-bekwame verskaffers opgespoor nie.",
login: "Meld aan",
disconnect: "Ontkoppel",
managedExternally: "Ekstern bestuur",
copied: "Gekopieer ✓",
cli: "Kopieer",
copyCliCommand: "Kopieer CLI-opdrag (vir ekstern / terugval)",
connect: "Koppel",
sessionExpires: "Sessie verval oor {time}",
initiatingLogin: "Aanmeldvloei word begin…",
exchangingCode: "Kode word vir tokens omgeruil…",
connectedClosing: "Gekoppel! Besig om toe te maak…",
loginFailed: "Aanmelding het misluk.",
sessionExpired: "Sessie het verval. Klik Probeer weer om 'n nuwe aanmelding te begin.",
reOpenAuth: "Heropen verifikasiebladsy",
reOpenVerification: "Heropen verifikasiebladsy",
submitCode: "Dien kode in",
pasteCode: "Plak magtigingskode (met #state agtervoegsel is in die haak)",
waitingAuth: "Wag vir jou om in die blaaier te magtig…",
enterCodePrompt: "'n Nuwe oortjie het oopgegaan. Voer hierdie kode in indien gevra:",
pkceStep1: "'n Nuwe oortjie het na claude.ai oopgegaan. Meld aan en klik Magtig.",
pkceStep2: "Kopieer die magtigingskode wat ná magtiging vertoon word.",
pkceStep3: "Plak dit hieronder en dien in.",
flowLabels: {
pkce: "Blaaier-aanmelding (PKCE)",
device_code: "Toestel-kode",
external: "Eksterne CLI",
},
expiresIn: "verval oor {time}",
},
language: {
switchTo: "Verander taal",
},
theme: {
title: "Tema",
switchTheme: "Wissel tema",
},
achievements: {
hero: {
kicker: "Agentic Gamerscore",
title: "Hermes Achievements",
subtitle:
"Versamelbare Hermes-kentekens wat verdien word uit werklike sessiegeskiedenis. Bekende, onvoltooide prestasies word as Ontdek vertoon; Geheime prestasies bly verborge totdat die eerste ooreenstemmende gedrag verskyn.",
scan_subtitle:
"Hermes-sessiegeskiedenis word geskandeer. Die eerste skandering kan 510 sekondes neem op groot geskiedenisse.",
},
actions: {
rescan: "Herskandeer",
},
stats: {
unlocked: "Ontsluit",
unlocked_hint: "verdiende kentekens",
discovered: "Ontdek",
discovered_hint: "bekend, nog nie verdien nie",
secrets: "Geheime",
secrets_hint: "verborge tot eerste sein",
highest_tier: "Hoogste vlak",
highest_tier_hint: "Copper → Silver → Gold → Diamond → Olympian",
latest: "Jongste",
latest_hint_empty: "gebruik Hermes meer",
none_yet: "Nog geen",
},
state: {
unlocked: "Ontsluit",
discovered: "Ontdek",
secret: "Geheim",
},
tier: {
target: "Teiken {tier}",
hidden: "Verborge",
complete: "Voltooi",
objective: "Doelwit",
},
progress: {
hidden: "verborge",
},
scan: {
building_headline: "Prestasieprofiel word gebou…",
building_detail:
"Sessies, gereedskaproepe, modelmetadata en ontsluitstatus word gelees.",
starting_headline: "Prestasieskandering begin…",
progress_detail:
"{scanned} van {total} sessies geskandeer · {pct}%. Kentekens ontsluit soos meer geskiedenis instroom.",
idle_detail:
"Sessies, gereedskaproepe, modelmetadata en ontsluitstatus word gelees. Kentekens verskyn hier soos hulle ontsluit.",
},
guide: {
tiers_header: "Vlakke",
secret_header: "Geheime prestasies",
secret_body:
"Geheime hou hul presiese sneller verborge. Sodra Hermes 'n verwante sein sien, word die kaart Ontdek en wys sy vereiste.",
scan_status_header: "Skanderingstatus",
scan_status_body:
"Hermes skandeer plaaslike geskiedenis een keer, daarna verskyn kaarte outomaties. Niks is vasgevang as dit 'n paar sekondes neem nie.",
what_scanned_header: "Wat geskandeer word",
what_scanned_body:
"Sessies, gereedskaproepe, modelmetadata, foute, prestasies en plaaslike ontsluitstatus.",
},
card: {
share_title: "Deel hierdie prestasie",
share_label: "Deel {name}",
share_text: "Deel",
how_to_reveal: "Hoe om te onthul",
what_counts: "Wat tel",
evidence_label: "Bewys",
evidence_session_fallback: "sessie",
no_evidence: "Nog geen bewys nie",
},
latest: {
header: "Onlangse ontsluitings",
},
empty: {
no_secrets_header: "Geen verborge geheime in hierdie skandering oor nie.",
no_secrets_body:
"Wenk: geheime begin gewoonlik by ongewone mislukkings of magsgebruikerspatrone — poortbotsings, toestemmingsmure, ontbrekende env-veranderlikes, YAML-foute, Docker-botsings, terugrol/kontrolepunt-gebruik, kasterugslae of klein regstellings na baie rooi teks.",
},
filters: {
all_categories: "Alles",
visibility_all: "alles",
visibility_unlocked: "ontsluit",
visibility_discovered: "ontdek",
visibility_secret: "geheim",
},
share: {
dialog_label: "Deel prestasie",
header: "Deel: {name}",
close: "Maak toe",
rendering: "Lewer tans…",
card_alt: "{name} deelkaart",
error_generic: "Iets het verkeerd geloop.",
x_title: "Maak X oop met 'n vooraf-ingevulde plasing",
x_button: "Deel op X",
copy_title: "Kopieer die beeld om in jou plasing te plak",
copy_button: "Kopieer beeld",
copied: "Gekopieer ✓",
download_button: "Laai PNG af",
hint:
"Deel op X maak 'n vooraf-ingevulde plasing in 'n nuwe oortjie oop. Klik eers op Kopieer beeld as jy die 1200×630-kenteken aangeheg wil hê — X laat jou dit direk in die tweet-skrywer plak. Laai PNG af stoor die lêer om enige plek te gebruik.",
clipboard_unsupported:
"Beeldkopiëring na knipbord word nie in hierdie blaaier ondersteun nie — gebruik eerder Aflaai.",
tweet_text: "Just unlocked {tier_part}\"{name}\" in Hermes Agent ☤",
},
},
kanban: {
loading: "Kanban-bord word gelaai…",
loadFailed: "Kon nie Kanban-bord laai nie: ",
loadFailedHint:
"Die agterkant skep kanban.db outomaties met die eerste lees. Indien hierdie probleem aanhou, raadpleeg die paneellogboeke.",
board: "Bord",
newBoard: "+ Nuwe bord",
newBoardTitle: "Nuwe bord",
newBoardDescription:
"Borde laat u toe om onverwante werkstrome te skei — een per projek, repositorium of domein. Werkers op een bord sien nooit 'n ander bord se take nie.",
slug: "Slug",
slugHint: "— kleinletters, koppeltekens, bv. atm10-server",
displayName: "Vertoonnaam",
displayNameHint: "(opsioneel)",
description: "Beskrywing",
descriptionHint: "(opsioneel)",
icon: "Ikoon",
iconHint: "(enkele karakter of emoji)",
switchAfterCreate: "Skakel oor na hierdie bord nadat dit geskep is",
cancel: "Kanselleer",
creating: "Word geskep…",
createBoard: "Skep bord",
search: "Soek",
filterCards: "Filter kaarte…",
tenant: "Huurder",
allTenants: "Alle huurders",
assignee: "Toegewysde",
allProfiles: "Alle profiele",
showArchived: "Wys gearchiveerde",
lanesByProfile: "Bane per profiel",
nudgeDispatcher: "Por versender aan",
refresh: "Verfris",
selected: "gekies",
complete: "Voltooi",
archive: "Argiveer",
apply: "Pas toe",
clear: "Maak skoon",
createTask: "Skep taak in hierdie kolom",
noTasks: "— geen take —",
unassigned: "nie toegewys nie",
untitled: "(sonder titel)",
loadingDetail: "Word gelaai…",
addComment: "Voeg 'n opmerking by… (Enter om in te dien)",
comment: "Opmerking",
status: "Status",
workspace: "Werkruimte",
skills: "Vaardighede",
createdBy: "Geskep deur",
result: "Resultaat",
comments: "Opmerkings",
events: "Gebeurtenisse",
runHistory: "Uitvoergeskiedenis",
workerLog: "Werker-log",
loadingLog: "Log word gelaai…",
noWorkerLog:
"— nog geen werker-log nie (taak is nog nie ontketen nie of die log is geroteer) —",
noDescription: "— geen beskrywing —",
noComments: "— geen opmerkings —",
edit: "redigeer",
save: "Stoor",
dependencies: "Afhanklikhede",
parents: "Ouers:",
children: "Kinders:",
none: "geen",
addParent: "— voeg ouer by —",
addChild: "— voeg kind by —",
removeDependency: "Verwyder afhanklikheid",
block: "Blokkeer",
unblock: "Deblokkeer",
notifyHomeChannels: "Stel tuiskanale in kennis",
diagnostics: "Diagnostiek",
hide: "Versteek",
show: "Wys",
attention: "Aandag",
tasksNeedAttention: "take benodig aandag",
taskNeedsAttention: "1 taak benodig aandag",
diagnostic: "diagnose",
open: "Maak oop",
close: "Sluit (Esc)",
reassignTo: "Hertoeken aan:",
copied: "Gekopieer",
copyCommand: "Kopieer opdrag na knipbord",
reclaim: "Heroor",
reassign: "Hertoeken",
renderingError: "Kanban-oortjie het 'n weergawefout teëgekom",
reloadView: "Herlaai aansig",
wsAuthFailed:
"WebSocket-verifikasie het misluk — herlaai die bladsy om die sessietoken te verfris.",
markDone: "Merk {n} take as klaar?",
markArchived: "Argiveer {n} take?",
warning: "Waarskuwing",
phantomIds: "Spook-ID's:",
active: "aktief",
ended: "geëindig",
noProfile: "(geen profiel)",
showAllAttempts: "Wys alle pogings",
sendingUpdates: "Stuur opdaterings na",
sendNotifications: "Stuur completed / blocked / gave_up kennisgewings na",
archiveBoardConfirm:
"Argiveer bord '{name}'? Dit sal na boards/_archived/ geskuif word sodat u dit later kan herstel. Take op hierdie bord sal nie meer in die UI verskyn nie.",
archiveBoardTitle: "Argiveer hierdie bord",
boardSwitcherHint: "Borde laat u toe om onverwante werkstrome te skei",
taskCreatedWarning: "Taak geskep, maar: ",
moveFailed: "Skuif het misluk: ",
bulkFailed: "Grootmaat: ",
completionBlockedHallucination: "⚠ Voltooiing geblokkeer — spook-kaart-ID's",
suspectedHallucinatedReferences: "⚠ Teks het na spook-kaart-ID's verwys",
pickProfileFirst: "Kies eers 'n profiel.",
unblockedMessage: "{id} gedeblokkeer. Taak is gereed vir die volgende tik.",
unblockFailed: "Deblokkering het misluk: ",
reclaimedMessage: "{id} heroor. Taak is terug op gereed.",
reclaimFailed: "Heroornaming het misluk: ",
reassignedMessage: "{id} hertoegeken aan {profile}.",
reassignFailed: "Hertoekenning het misluk: ",
selectForBulk: "Kies vir grootmaataksies",
clickToEdit: "Klik om te redigeer",
clickToEditAssignee: "Klik om toegewysde te redigeer",
emptyAssignee: "(leeg = ontbind toekenning)",
columnLabels: {
triage: "Triage",
todo: "Te doen",
scheduled: "Geskeduleerd",
ready: "Gereed",
running: "Aan die gang",
blocked: "Geblokkeer",
done: "Klaar",
archived: "Gearchiveer",
},
columnHelp: {
triage: "Rou idees — 'n spesifiseerder sal die spesifikasie uitwerk",
todo: "Wag op afhanklikhede of nie toegewys nie",
scheduled: "Wag op 'n bekende tydvertraging of geskeduleerde opvolg",
ready: "Afhanklikhede is bevredig; wys 'n profiel toe om te versend",
running: "Deur 'n werker geëis — in vlug",
blocked: "Werker het mensinvoer aangevra",
done: "Voltooi",
archived: "Gearchiveer",
},
confirmDone:
"Merk hierdie taak as klaar? Die werker se eis word vrygestel en afhanklike kinders word gereed.",
confirmArchive:
"Argiveer hierdie taak? Dit verdwyn uit die verstek-bordaansig.",
confirmBlocked:
"Merk hierdie taak as geblokkeer? Die werker se eis word vrygestel.",
completionSummary:
"Voltooiingsopsomming vir {label}. Dit word as die taak se result gestoor.",
completionSummaryRequired:
"'n Voltooiingsopsomming is verpligtend voordat 'n taak as klaar gemerk word.",
triagePlaceholder: "Rowwe idee — KI sal dit spesifiseer…",
taskTitlePlaceholder: "Nuwe taaktitel…",
specifier: "spesifiseerder",
assigneePlaceholder: "toegewysde",
priority: "Prioriteit",
skillsPlaceholder:
"vaardighede (opsioneel, kommageskei): translation, github-code-review",
noParent: "— geen ouer —",
workspacePathDir: "werkruimtepad (verpligtend, bv. ~/projects/my-app)",
workspacePathOptional:
"werkruimtepad (opsioneel, afgelei van toegewysde indien leeg)",
logTruncated: "(toon laaste 100 KB — volledige log by ",
logAt: ")",
},
};