diff --git a/README.md b/README.md index 0984ff5d..4f986d75 100644 --- a/README.md +++ b/README.md @@ -302,7 +302,7 @@ The repository is a Cargo + pnpm workspace: - `crates/bsk-cli` — `bsk` CLI and local daemon - `crates/bsk-protocol` — shared wire types and JSON schemas - `apps/extension` — browser extension -- `packages/ui` and [`packages/i18n`](packages/i18n/README.md) — shared extension UI support, including English, Simplified Chinese and Korean localization +- `packages/ui` and [`packages/i18n`](packages/i18n/README.md) — shared extension UI support, including English, Simplified Chinese, Traditional Chinese, Korean, Japanese, French, Italian, Spanish, German and Brazilian Portuguese localization - `packages/dsh-plugin-browserskill` — DeepSeek Harness plugin (`@wxg-prc-cpg/browser-skill-dsh-plugin`) - [`evals/browser`](evals/browser/README.md) — deterministic local pages and agent-neutral browser capability evaluation diff --git a/README.zh-CN.md b/README.zh-CN.md index a6e59a74..d27beadd 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -256,7 +256,7 @@ Agent 不直接与浏览器通信。它通过 `bsk` CLI 下发浏览器任务; - `crates/bsk-cli` — `bsk` CLI 与本地 daemon - `crates/bsk-protocol` — 共享协议类型与 JSON Schema - `apps/extension` — 浏览器扩展 -- `packages/ui` 和 [`packages/i18n`](packages/i18n/README.md) — 扩展 UI 共享支持,包含英文、简体中文和韩语本地化 +- `packages/ui` 和 [`packages/i18n`](packages/i18n/README.md) — 扩展 UI 共享支持,包含英文、简体中文、繁体中文、韩语、日语、法语、意大利语、西班牙语、德语和巴西葡萄牙语本地化 - `packages/dsh-plugin-browserskill` — DeepSeek Harness 插件(`@wxg-prc-cpg/browser-skill-dsh-plugin`) - [`evals/browser`](evals/browser/README.zh-CN.md) — 确定性本地页面与 Agent 无关的浏览器能力测试台 diff --git a/packages/i18n/README.md b/packages/i18n/README.md index 59147f79..1b47a869 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -1,9 +1,16 @@ # Extension localization -The extension ships English (`en-US`), Simplified Chinese (`zh-CN`) and Korean -(`ko-KR`) in the `common` and `extension` namespaces. These resources cover the -popup, page overlays and extension notifications; they do not translate CLI -output or extension store metadata. +The extension ships English (`en-US`), Simplified Chinese (`zh-CN`), +Traditional Chinese (`zh-TW`), Korean (`ko-KR`), Japanese (`ja-JP`), French +(`fr-FR`), Italian (`it-IT`), Spanish (`es-ES`), German (`de-DE`) and +Brazilian Portuguese (`pt-BR`) in the `common` and `extension` namespaces. +These resources cover the popup, page overlays and extension notifications; +they do not translate CLI output or extension store metadata. + +Locale resources are registered automatically: dropping a +`src/locales//{common,extension}.json` pair in place is enough for +`i18n.ts` to pick it up (see `i18n.ts`'s `import.meta.glob` scan) — no code +change is required to ship a new language. ## Language selection diff --git a/packages/i18n/src/i18n.ts b/packages/i18n/src/i18n.ts index b44baa28..a3333b3d 100644 --- a/packages/i18n/src/i18n.ts +++ b/packages/i18n/src/i18n.ts @@ -1,3 +1,4 @@ +import type { Resource, ResourceLanguage } from "i18next"; import i18n from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; @@ -7,27 +8,36 @@ import { chromeUiLanguageDetector, getLanguageDetectionOptions, } from "./chrome-storage-sync"; -import enUSCommon from "./locales/en-US/common.json"; -import enUSExtension from "./locales/en-US/extension.json"; -import koKRCommon from "./locales/ko-KR/common.json"; -import koKRExtension from "./locales/ko-KR/extension.json"; -import zhCNCommon from "./locales/zh-CN/common.json"; -import zhCNExtension from "./locales/zh-CN/extension.json"; - -const resources = { - "zh-CN": { - common: zhCNCommon, - extension: zhCNExtension, - }, - "en-US": { - common: enUSCommon, - extension: enUSExtension, - }, - "ko-KR": { - common: koKRCommon, - extension: koKRExtension, - }, -} as const; + +/** + * Every `locales//.json` is registered automatically, so + * shipping a new language means adding its resource files — no code change. + */ +const localeModules = import.meta.glob("./locales/*/*.json", { + eager: true, + import: "default", +}); + +function buildResources(): Resource { + const resources: Resource = {}; + for (const [path, messages] of Object.entries(localeModules)) { + const match = /^\.\/locales\/([^/]+)\/([^/]+)\.json$/.exec(path); + if (!match) { + continue; + } + const [, locale, namespace] = match; + const namespaces = resources[locale] ?? {}; + namespaces[namespace] = messages; + resources[locale] = namespaces; + } + return resources; +} + +// Sort the keys: multi-candidate locale resolution reads the order of +// `Object.keys(resources)`, so it must not depend on filesystem enumeration. +const resources = Object.fromEntries( + Object.entries(buildResources()).sort(([left], [right]) => left.localeCompare(right)), +); const languageDetector = new LanguageDetector(); languageDetector.addDetector(chromeUiLanguageDetector); diff --git a/packages/i18n/src/locales/de-DE/common.json b/packages/i18n/src/locales/de-DE/common.json new file mode 100644 index 00000000..d76f616f --- /dev/null +++ b/packages/i18n/src/locales/de-DE/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "Steuere deinen angemeldeten Browser von KI-Agents aus über die bsk-CLI" + } +} diff --git a/packages/i18n/src/locales/de-DE/extension.json b/packages/i18n/src/locales/de-DE/extension.json new file mode 100644 index 00000000..d60a9386 --- /dev/null +++ b/packages/i18n/src/locales/de-DE/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "Mit einem älteren Daemon verbunden (Protokoll v{{cliProtocol}}). Aktualisieren Sie CLI und Daemon, um die Automatisierungseinstellungen vollständig zu unterstützen.", + "brandCategory": "Browser-Automatisierung", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "Getrennt", + "connecting": "Verbindung wird hergestellt…", + "connected": "Verbunden", + "version_skew": "Verbunden", + "disabled": "Verbindung aus" + }, + "stateDetail": { + "disconnected": "Öffnen Sie BrowserSkill, um eine Verbindung herzustellen.", + "connecting": "Verbindung zu BrowserSkill wird hergestellt…", + "connected": "Bereit für Automatisierungsaufgaben.", + "version_skew": "Die Protokollversionen unterscheiden sich. Bitte aktualisieren." + }, + "stateBadge": { + "disconnected": "Bereitschaft", + "connecting": "Startet", + "connected": "Bereit", + "version_skew": "Update verfügbar", + "disabled": "Aus" + }, + "connectionToggleTitle": "BrowserSkill-Verbindung", + "controlHintsToggleTitle": "Steuerungshinweise", + "controlHintsToggleHint": "Zeigt die Statusanzeige und das orangefarbene Leuchten, während der Agent eine Seite steuert.", + "controlHintsInfoLabel": "Über Steuerungshinweise", + "daemonPortLabel": "Lokaler Port", + "daemonPortHint": "Verbindung zum lokalen Daemon über diesen Port. Starten Sie zuerst den Daemon und lassen Sie ihn auf diesem Port lauschen. Diese Einstellung ändert nur die Verbindungsadresse der Erweiterung, nicht die lokale CLI-Konfiguration. Das Speichern einer Änderung beendet laufende Sitzungen und stellt die Verbindung neu her, sofern sie aktiviert ist.", + "daemonPortInfoLabel": "Über den lokalen Port", + "daemonPortInvalid": "Geben Sie einen Port zwischen 1 und 65535 ein.", + "daemonPortSave": "Port speichern", + "daemonPortSaving": "Wird gespeichert…", + "daemonPortReadFailed": "Der Port konnte nicht geladen werden. Öffnen Sie dieses Popup erneut, um es noch einmal zu versuchen.", + "daemonPortWriteFailed": "Der Port konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "daemonUnreachable": "Verbindung nicht möglich. Prüfen Sie, ob der Daemon läuft und der Port übereinstimmt.", + "versionSkewWarning": "Erweiterungsprotokoll v{{extensionProtocol}}, CLI-Protokoll v{{cliProtocol}}. Die Protokollversionen unterscheiden sich — bitte aktualisieren.", + "upgradeAvailable": "Update verfügbar", + "launcher": { + "title": "Schnellaktionen" + }, + "back": "Zurück", + "runtimeTitle": "Laufzeit", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "Erweiterung v{{version}}", + "extensionVersionHint": "Version der Erweiterung", + "daemonVersionHint": "bsk-Version", + "protocolVersion": "Protokoll v{{version}}", + "extensionProtocol": "Erweiterungsprotokoll v{{version}}", + "daemonProtocol": "Daemon-Protokoll v{{version}}", + "instanceTitle": "Instanz-ID", + "instanceDescription": "Eindeutige Verbindungskennung für diesen Browser", + "copy": "Kopieren", + "copied": "Kopiert", + "copyInstanceId": "Instanz-ID kopieren", + "record": { + "sectionTitle": "Aktionsaufzeichnung", + "cardDesc": "Zeichnen Sie Ihre Aktionen als Referenz für den Agent auf", + "sectionHint": "Erstellt eine Aufzeichnungsanweisung — senden Sie sie an Ihren Agent, um die Aufzeichnung Ihrer Aktionen zu starten; der Agent kann das entstehende Trace-Paket anschließend nutzen, um ähnliche Aufgaben zu automatisieren.", + "topicLabel": "Thema (optional)", + "topicPlaceholder": "z. B. Einen Artikel veröffentlichen", + "startUrlLabel": "Start-URL (optional)", + "startUrlPlaceholder": "https://…", + "copyButton": "Aufzeichnungsanweisungen kopieren", + "copied": "Kopiert", + "hintDisconnected": "Verfügbar nach dem Verbinden", + "promptTemplate": "Verwende die `bsk`-CLI von BrowserSkill, um die Browseraktionen aufzuzeichnen, die ich gleich vorführe.\n\nSchritte:\n1. Führe aus: {{command}}\n2. Sobald du bestätigst, dass es gestartet ist, arbeite ich selbst im geöffneten Fenster.\n3. Nachdem ich auf Fertig geklickt habe, lies das geschriebene `./trace`-Paket (`trace.json` + `states/`) und fasse zusammen, was ich getan habe." + }, + "interaction": { + "title": "Automatisierungseinstellungen", + "confirmTabBorrow": "Vor dem Ausleihen von Tabs bestätigen", + "confirmTabBorrowHint": "Wenn aktiviert, wird vor dem Ausleihen eines bereits geöffneten Tabs um Erlaubnis gebeten. Wenn deaktiviert, wird direkt ausgeliehen.", + "requestHelpEnabled": "Anfragen nach menschlicher Hilfe zulassen", + "requestHelpEnabledHint": "Wenn aktiviert, kann der Agent um Ihre Hilfe bitten. Wenn deaktiviert, versucht er, die Aufgabe eigenständig abzuschließen, und meldet Schritte, die er nicht lösen kann.", + "scope": "Wird automatisch für dieses Browserprofil gespeichert. Gilt für alle Sitzungsanfragen, die die Erweiterung erreichen; Befehlszeilenoptionen können dies nicht überschreiben. Ältere CLIs oder Daemons beenden Hilfeanfragen möglicherweise lokal. Aktualisieren Sie alle drei Komponenten für volle Unterstützung.", + "readFailed": "Einstellungen konnten nicht geladen werden. Öffnen Sie die Erweiterung erneut.", + "writeFailed": "Speichern nicht möglich. Ihre Einstellungen wurden nicht geändert. Versuchen Sie es erneut.", + "confirmTabBorrowInfoLabel": "Über die Bestätigung des Tab-Ausleihens", + "requestHelpEnabledInfoLabel": "Über Anfragen nach menschlicher Hilfe" + }, + "remoteLocal": "Zu lokal wechseln", + "remotePairing": "Kopplungslink", + "remoteHint": "Fügen Sie den vollständigen Kopplungslink eines vertrauenswürdigen Servers ein. Der Port ist enthalten.", + "remoteSave": "Kopplung speichern", + "remoteError": "Kopplung nicht abgeschlossen. Prüfen Sie die Serververbindung oder versuchen Sie einen neuen Kopplungslink.", + "remoteNeedsAttention": "Erfordert Aufmerksamkeit", + "remoteUnknown": "Verbindungseinstellungen nicht verfügbar", + "remoteStorageError": "Verbindungseinstellungen konnten nicht gelesen werden. BrowserSkill versucht es erneut. Sie können auch explizit den lokalen Daemon auswählen, um dies zu beheben.", + "remoteExpires": "Autorisierung läuft ab: {{date}}", + "remoteRenewing": "Browser-Autorisierung wird erneuert…", + "remoteRenewalFailed": "Die Erneuerung konnte den Dienst nicht erreichen oder nicht erfolgreich abgeschlossen werden. BrowserSkill versucht es erneut; die aktuelle Autorisierung bleibt bis zum Ablauf nutzbar.", + "remoteRejected": "Der Server hat die Autorisierung abgelehnt. Prüfen Sie den Server oder verwenden Sie einen neuen Kopplungslink.", + "remoteExpired": "Die Autorisierung ist abgelaufen. Verwenden Sie einen neuen Kopplungslink, um sich erneut zu verbinden.", + "remoteUnconfirmed": "Die zuletzt bestätigte Autorisierung ist abgelaufen, eine Erneuerung könnte jedoch erfolgreich gewesen sein. BrowserSkill wiederholt die ausstehende Erneuerung; prüfen Sie den Server, falls dies weiterhin auftritt.", + "connectionSettings": "Verbindungseinstellungen", + "connectionMode": "Verbindungsmodus", + "connectionLocal": "Lokal", + "connectionRemote": "Remote", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "Verbindungseinstellungen werden gelesen…", + "connectionDestination": "Verbinden mit: {{address}}", + "connectionPortHint": "Leer lassen, um den Standardport {{port}} wiederherzustellen.", + "connectionSaveWarning": "Das Speichern beendet laufende Aufgaben und stellt die Verbindung neu her, wenn der Verbindungsschalter aktiviert ist.", + "connectionLocalWarning": "Der Wechsel zu lokal beendet laufende Aufgaben und entfernt die gespeicherten Remote-Anmeldedaten. Für die Rückkehr zu Remote ist ein neuer Kopplungslink erforderlich.", + "connectionCancel": "Änderungen abbrechen", + "connectionLocalError": "Wechsel zu lokal fehlgeschlagen. Bitte versuchen Sie es erneut.", + "connectionLocalSaved": "Zum lokalen Dienst gewechselt.", + "connectionPortSaved": "Port gespeichert.", + "remoteUnreachable": "Verbindung zum Remote-Dienst nicht möglich. Prüfen Sie Server, Netzwerk oder Autorisierungsstatus.", + "remoteSaving": "Kopplung läuft…", + "remoteSaved": "Kopplung erfolgreich.", + "remoteSavedDisabled": "Kopplung erfolgreich. Der Verbindungsschalter ist aus; aktivieren Sie ihn, um sich zu verbinden.", + "remoteFormatError": "Der Kopplungslink ist unvollständig oder ungültig. Kopieren Sie den vollständigen vom Server bereitgestellten Link.", + "remotePermissionsInfo": "Über Berechtigungen für Remote-Verbindungen", + "remotePermissionsHint": "Der Server kann dedizierte Aufgabenfenster steuern. Ob beim Ausleihen bestehender Tabs eine Bestätigung erforderlich ist, richtet sich nach den Automatisierungseinstellungen unten." + }, + "controlOverlay": { + "status": "Agent steuert", + "interrupt": "Unterbrechen", + "interrupting": "Wird unterbrochen…" + }, + "borrowConfirmation": { + "title": "Tab-Ausleihe erlauben?", + "titleInactive": "Agent möchte einen Tab ausleihen", + "body": "Ein KI-Agent möchte diesen Tab in seinen Arbeitsbereich verschieben. Sie können die Ausleihe ablehnen oder erlauben.", + "targetTab": "Ziel-Tab:", + "autoDeny": "Anfrage läuft in {{count}} s ab", + "deny": "Ablehnen", + "allow": "Erlauben", + "notificationTitle": "BrowserSkill: Agent möchte einen Tab ausleihen", + "notificationBody": "Genehmigen oder lehnen Sie die Ausleihe von „{{tabTitle}}“ in Ihrem Browser ab." + }, + "helpRequest": { + "title": "Agent benötigt Ihre Hilfe", + "compactStatus": "Der Agent wartet weiterhin darauf, dass Sie diesen Schritt abschließen", + "noteLabel": "Optionale Notiz an den Agent", + "notePlaceholder": "Notiz für den Agent hinzufügen (optional)", + "continue": "Erledigt, Kontrolle zurückgeben", + "cancel": "Anfrage abbrechen", + "collapse": "Einklappen", + "expand": "Ausklappen", + "dragHandle": "Zum Verschieben ziehen", + "notificationTitle": "BrowserSkill: Agent benötigt Ihre Hilfe" + }, + "recordOverlay": { + "recording": "Ihre Aktionen werden aufgezeichnet", + "finish": "Fertig" + }, + "longScreenshot": { + "title": "Screenshot der gesamten Seite", + "cardDesc": "Eine ganze Seite erfassen, in der Vorschau ansehen und speichern", + "description": "Erfassen Sie eine ganze Seite automatisch oder scrollen Sie manuell, um ein klares Langbild zu erstellen.", + "hint": "Der automatische Modus beginnt oben. Der manuelle Modus beginnt hier und funktioniert auch auf Browser- und Store-Seiten.", + "start": "Erfassung starten", + "cancel": "Abbrechen", + "cancelling": "Wird abgebrochen und Seite wird wiederhergestellt…", + "cancelled": "Erfassung abgebrochen. Ihre Scrollposition wurde wiederhergestellt.", + "preview": "Vorschau öffnen", + "download": "PNG herunterladen", + "runningHint": "Halten Sie diesen Tab ausgewählt. Sie können das Popup schließen oder pausieren, um mit der Seite zu interagieren. Öffnen Sie es hier erneut, um fortzufahren oder vorzeitig zu beenden.", + "pageProgress": "Screenshot der gesamten Seite wird erstellt…", + "zoom": "Vorschauzoom", + "fit": "An Breite anpassen", + "loading": "Vorschau wird geladen…", + "previewHint": "Lokal gespeichert. Vorschaukacheln werden bei Bedarf geladen; beim Herunterladen wird das vollständige PNG erstellt. Speichern Sie Bilder, die Sie behalten möchten.", + "imageAlt": "Screenshot der gesamten Seite von {{title}}", + "missingTitle": "Screenshot nicht verfügbar", + "missingDescription": "Diese Vorschau ist möglicherweise abgelaufen oder wurde entfernt. Kehren Sie zur Webseite zurück und erfassen Sie sie erneut über die Schnellaktionen.", + "downloadError": "Der Download konnte nicht gestartet werden. Bitte versuchen Sie es erneut.", + "phase": { + "preparing": "Erfassung wird vorbereitet", + "capturing": "Seite wird erfasst", + "saving": "PNG wird erstellt", + "complete": "Screenshot fertig", + "cancelled": "Abgebrochen", + "error": "Erfassung unvollständig", + "paused": "Pausiert" + }, + "errors": { + "unsupported": "Automatisches Scrollen ist hier nicht verfügbar. Versuchen Sie manuelles Scrollen oder den sichtbaren Bereich.", + "unavailable": "Der Browser hat diese Erfassung nicht zugelassen. Klicken Sie erneut auf die Erweiterung oder prüfen Sie die Seitenzugriffsrechte.", + "busy": "Eine andere Aufgabe verwendet diese Seite, oder eine Erfassung läuft bereits. Warten Sie, bis sie abgeschlossen ist.", + "changed": "Die Seite hat sich während der Erfassung geändert. Halten Sie Tab, Fenstergröße und Seiteninhalt stabil und versuchen Sie es erneut.", + "tooLarge": "Der Browser konnte dieses Bild nicht verarbeiten. Versuchen Sie, den Erfassungsbereich anzupassen.", + "timeout": "Bei dieser Seitenoperation ist eine Zeitüberschreitung aufgetreten. Sie können den fertigen Teil speichern.", + "captureFailed": "Der Screenshot konnte nicht abgeschlossen werden. Die Seite wurde wiederhergestellt. Bitte versuchen Sie es erneut.", + "saveFailed": "Der lokale Speicher ist voll oder nicht verfügbar. Geben Sie Speicherplatz frei und versuchen Sie es erneut.", + "interrupted": "Die Erfassung wurde unterbrochen. Sie können den fertigen Teil speichern.", + "storageFull": "Der lokale Speicher ist voll. Geben Sie Speicherplatz frei; erfasste Inhalte können weiterhin in der Vorschau angesehen und exportiert werden.", + "alignment": "Diese Frames konnten nicht zuverlässig ausgerichtet werden. Scrollen Sie etwas nach oben für mehr Überlappung und dann langsam nach unten.", + "autoUnavailable": "Automatisches Scrollen konnte nicht gestartet werden: Diese Seite erlaubt kein Scrollen durch die Erweiterung, oder das Erfassungsskript konnte keine Verbindung herstellen. Aktualisieren Sie die Seite und versuchen Sie es erneut, oder wählen Sie „Ich scrolle“ oder „Sichtbarer Bereich“." + }, + "mode": "Erfassungsmodus", + "modes": { + "auto": "Ganze Seite · Automatisch", + "manual": "Langbild · Ich scrolle", + "visible": "Sichtbarer Bereich" + }, + "manualHint": "Manueller Modus: Schließen Sie dieses Popup und scrollen Sie langsam nach unten, wobei sich der Inhalt überlappen sollte. Öffnen Sie es hier erneut und wählen Sie Fertig, um zu speichern.", + "pausedHint": "Pausiert. Sie können weiteren Inhalt laden und dann ab der erfassten Position fortsetzen.", + "pause": "Pause", + "resume": "Fortsetzen", + "finish": "Fertigstellen und behalten", + "exporting": "Wird exportiert", + "partial": "Der erfasste Teil wurde behalten.", + "useManual": "Manuelles Scrollen verwenden" + }, + "audit": { + "title": "Vorgangsprotokoll", + "cardDesc": "Über das Vorgangsprotokoll", + "enabledLabel": "Vorgangsverlauf aufzeichnen", + "loading": "Wird geladen…", + "retry": "Erneut versuchen", + "viewAll": "Alle anzeigen", + "allTasks": "Alle Aufgaben", + "untitled": "Browseraufgabe", + "operationCount": "{{count}} Vorgänge", + "errorCount": "{{count}} Fehler", + "fileCount": "{{count}} Dateien", + "dialogCount": "{{count}} Seitendialoge automatisch behandelt", + "helpOutcome": "Ergebnis der menschlichen Übergabe", + "partialLabel": "Teilweiser Verlauf", + "partialDescription": "Die Aufzeichnung begann um {{time}}. Pausierte Zeiträume wurden nicht aufgezeichnet; siehe die Zeitleiste unten.", + "inputRedacted": "Eingabeinhalt ausgeblendet", + "empty": "Noch keine Aufgaben aufgezeichnet. Künftige BrowserSkill-Vorgänge werden hier angezeigt.", + "disconnected": "Der lokale Dienst ist getrennt. Starten Sie den BrowserSkill-Dienst und versuchen Sie es erneut. Der vorhandene Verlauf bleibt auf Ihrem Computer.", + "unsupported": "Dieser lokale Dienst unterstützt kein Vorgangsprotokoll. Aktualisieren Sie bsk und versuchen Sie es erneut.", + "requestFailed": "Der Prüfverlauf konnte nicht gelesen oder gespeichert werden. Prüfen Sie den lokalen Speicher und die Verfügbarkeit der Aufgabe, oder versuchen Sie es nach Abschluss der Aufgabe erneut.", + "privacyShort": "30 Tage lokal gespeichert. Eingabeinhalt ist ausgeblendet.", + "privacyFull": "Der Verlauf bleibt auf Ihrem Computer. Abgeschlossene Aufgaben werden 30 Tage aufbewahrt. Eingabetexte, Skripte, Seitentext sowie URL-Pfade und -Parameter werden nicht gespeichert. Zielnamen erhalten eine grundlegende Schwärzung. Exporte enthalten dieselben geschwärzten Einträge.", + "resultNote": "„Vorgang abgeschlossen“ bedeutet, dass der Toolaufruf abgeschlossen wurde, nicht dass die Website ein Geschäftsergebnis bestätigt hat. Fehlende Ergebnisse werden als „Ergebnis unbekannt“ markiert.", + "technicalDetails": "Vorgangsdetails", + "timeline": "Vorgangszeitleiste", + "export": "Verlauf exportieren", + "delete": "Verlauf löschen", + "deleteConfirm": "Den lokalen Prüfverlauf dieser Aufgabe löschen? Dies kann nicht rückgängig gemacht werden.", + "cancel": "Abbrechen", + "openDirectory": "Ordner öffnen", + "loadMore": "Mehr laden", + "status": { + "running": "Läuft", + "ended": "Beendet", + "interrupted": "Unterbrochen", + "completed": "Vorgang abgeschlossen", + "error": "Vorgangsfehler", + "unknown": "Ergebnis unbekannt", + "cancelled": "Abgebrochen" + }, + "marker": { + "started": "Aufzeichnung gestartet", + "ended": "Sitzung beendet", + "paused": "Aufzeichnung pausiert · nachfolgende Vorgänge nicht aufgezeichnet", + "resumed": "Aufzeichnung fortgesetzt · vorheriger Zeitraum nicht aufgezeichnet", + "user_interrupt": "Stopp vom Benutzer angefordert", + "event": "Sitzungsereignis" + }, + "methods": { + "tabList": "Tabs auflisten", + "tabCreate": "Tab öffnen", + "tabClose": "Tab schließen", + "tabSelect": "Tab wechseln", + "tabBorrow": "Ausgeliehenen Tab anfordern", + "tabReturn": "Tab zurückgeben", + "navigate": "Seite öffnen", + "navigateBack": "Zurückgehen", + "navigateForward": "Vorwärtsgehen", + "reload": "Seite neu laden", + "click": "Klicken", + "fill": "Ausfüllen", + "press": "Taste drücken", + "select": "Option auswählen", + "hover": "Hover", + "focus": "Fokussieren", + "blur": "Fokus entfernen", + "scroll": "Scrollen", + "upload": "Dateien hochladen", + "download": "Datei herunterladen", + "read": "Seite lesen", + "screenshot": "Screenshot erfassen", + "console": "Konsole lesen", + "network": "Netzwerkinformationen lesen", + "evaluate": "Seitenskript ausführen", + "wait": "Warten", + "help": "Menschliche Hilfe anfordern", + "recordStart": "Vorgangsaufzeichnung starten", + "recordStop": "Vorgangsaufzeichnung stoppen", + "recordAwait": "Auf Aufzeichnung warten", + "resize": "Fenstergröße ändern", + "emulate": "Emulationseinstellungen ändern" + } + } +} diff --git a/packages/i18n/src/locales/es-ES/common.json b/packages/i18n/src/locales/es-ES/common.json new file mode 100644 index 00000000..209c9cb5 --- /dev/null +++ b/packages/i18n/src/locales/es-ES/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "Controla tu navegador con sesión iniciada desde agentes de IA mediante la CLI bsk" + } +} diff --git a/packages/i18n/src/locales/es-ES/extension.json b/packages/i18n/src/locales/es-ES/extension.json new file mode 100644 index 00000000..6a7a2976 --- /dev/null +++ b/packages/i18n/src/locales/es-ES/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "Conectado a un daemon anterior (protocolo v{{cliProtocol}}). Actualiza la CLI y el daemon para admitir completamente los ajustes de automatización.", + "brandCategory": "Automatización del navegador", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "Desconectado", + "connecting": "Conectando…", + "connected": "Conectado", + "version_skew": "Conectado", + "disabled": "Conexión desactivada" + }, + "stateDetail": { + "disconnected": "Abre BrowserSkill para conectarte.", + "connecting": "Conectando con BrowserSkill…", + "connected": "Listo para tareas de automatización.", + "version_skew": "Las versiones de protocolo son diferentes. Actualiza, por favor." + }, + "stateBadge": { + "disconnected": "En espera", + "connecting": "Iniciando", + "connected": "Listo", + "version_skew": "Actualizable", + "disabled": "Desactivado" + }, + "connectionToggleTitle": "Conexión de BrowserSkill", + "controlHintsToggleTitle": "Indicadores de control", + "controlHintsToggleHint": "Muestra la etiqueta de estado y el resplandor naranja mientras el agente controla una página.", + "controlHintsInfoLabel": "Acerca de los indicadores de control", + "daemonPortLabel": "Puerto local", + "daemonPortHint": "Conéctate al daemon local en este puerto. Primero inicia el daemon y haz que escuche en este puerto. Este ajuste solo cambia la dirección de conexión de la extensión, no la configuración local de la CLI. Guardar un cambio finaliza las sesiones actuales y vuelve a conectar si la conexión está activada.", + "daemonPortInfoLabel": "Acerca del puerto local", + "daemonPortInvalid": "Introduce un puerto entre 1 y 65535.", + "daemonPortSave": "Guardar puerto", + "daemonPortSaving": "Guardando…", + "daemonPortReadFailed": "No se pudo cargar el puerto. Vuelve a abrir esta ventana emergente para reintentarlo.", + "daemonPortWriteFailed": "No se pudo guardar el puerto. Inténtalo de nuevo.", + "daemonUnreachable": "No se puede conectar. Comprueba que el daemon esté en ejecución y que el puerto coincida.", + "versionSkewWarning": "Protocolo de la extensión v{{extensionProtocol}}, protocolo de la CLI v{{cliProtocol}}. Las versiones de protocolo son diferentes — actualiza, por favor.", + "upgradeAvailable": "Actualizable", + "launcher": { + "title": "Acciones rápidas" + }, + "back": "Atrás", + "runtimeTitle": "Entorno de ejecución", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "extensión v{{version}}", + "extensionVersionHint": "Versión de la extensión", + "daemonVersionHint": "Versión de bsk", + "protocolVersion": "protocolo v{{version}}", + "extensionProtocol": "protocolo de la extensión v{{version}}", + "daemonProtocol": "protocolo del daemon v{{version}}", + "instanceTitle": "ID de instancia", + "instanceDescription": "Identificador de conexión único para este navegador", + "copy": "Copiar", + "copied": "Copiado", + "copyInstanceId": "Copiar ID de instancia", + "record": { + "sectionTitle": "Grabación de acciones", + "cardDesc": "Graba tus acciones como referencia para el agente", + "sectionHint": "Genera una instrucción de grabación; envíasela a tu agente para iniciar la grabación de tus acciones. Después, el agente podrá usar el paquete de trace resultante para automatizar tareas similares.", + "topicLabel": "Tema (opcional)", + "topicPlaceholder": "p. ej., Publicar un artículo", + "startUrlLabel": "URL de inicio (opcional)", + "startUrlPlaceholder": "https://…", + "copyButton": "Copiar instrucciones de grabación", + "copied": "Copiado", + "hintDisconnected": "Disponible al conectar", + "promptTemplate": "Usa la CLI `bsk` de BrowserSkill para grabar las acciones del navegador que voy a realizar a continuación.\n\nPasos:\n1. Ejecuta: {{command}}\n2. Cuando confirmes que se ha iniciado, operaré yo mismo en la ventana abierta.\n3. Después de que haga clic en Finalizar, lee el paquete `./trace` generado (`trace.json` + `states/`) y resume lo que hice." + }, + "interaction": { + "title": "Ajustes de automatización", + "confirmTabBorrow": "Confirmar antes de tomar prestadas pestañas", + "confirmTabBorrowHint": "Si está activado, se pedirá confirmación antes de tomar prestada una pestaña que ya tengas abierta. Si está desactivado, se toma prestada directamente.", + "requestHelpEnabled": "Permitir solicitudes de ayuda humana", + "requestHelpEnabledHint": "Si está activado, el agente puede pedir tu ayuda. Si está desactivado, intentará completar la tarea de forma autónoma e informará de los pasos que no pueda resolver.", + "scope": "Se guarda automáticamente para este perfil del navegador. Se aplica a todas las solicitudes de sesión que llegan a la extensión; las opciones de línea de comandos no pueden anularlo. Las CLI o daemons anteriores pueden finalizar la ayuda localmente. Actualiza los tres componentes para obtener compatibilidad completa.", + "readFailed": "No se pudieron cargar los ajustes. Vuelve a abrir la extensión.", + "writeFailed": "No se pudo guardar. Tus ajustes no han cambiado. Inténtalo de nuevo.", + "confirmTabBorrowInfoLabel": "Acerca de la confirmación para tomar prestadas pestañas", + "requestHelpEnabledInfoLabel": "Acerca de las solicitudes de ayuda humana" + }, + "remoteLocal": "Cambiar a local", + "remotePairing": "Enlace de emparejamiento", + "remoteHint": "Pega el enlace de emparejamiento completo de un servidor de confianza. El puerto está incluido.", + "remoteSave": "Guardar emparejamiento", + "remoteError": "El emparejamiento no se completó. Comprueba la conexión con el servidor o prueba con un nuevo enlace de emparejamiento.", + "remoteNeedsAttention": "Requiere atención", + "remoteUnknown": "Ajustes de conexión no disponibles", + "remoteStorageError": "No se pudieron leer los ajustes de conexión. BrowserSkill volverá a intentarlo. También puedes seleccionar explícitamente el daemon local para recuperarte.", + "remoteExpires": "La autorización caduca: {{date}}", + "remoteRenewing": "Renovando la autorización del navegador…", + "remoteRenewalFailed": "La renovación no pudo contactar con el servicio o no se completó correctamente. BrowserSkill volverá a intentarlo; la autorización actual sigue siendo utilizable hasta que caduque.", + "remoteRejected": "El servidor rechazó la autorización. Comprueba el servidor o usa un nuevo enlace de emparejamiento.", + "remoteExpired": "La autorización ha caducado. Usa un nuevo enlace de emparejamiento para volver a conectarte.", + "remoteUnconfirmed": "La última autorización confirmada ha caducado, pero es posible que una renovación se haya completado correctamente. BrowserSkill está reintentando la renovación pendiente; comprueba el servidor si esto continúa.", + "connectionSettings": "Ajustes de conexión", + "connectionMode": "Modo de conexión", + "connectionLocal": "Local", + "connectionRemote": "Remoto", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "Leyendo los ajustes de conexión…", + "connectionDestination": "Conectar a: {{address}}", + "connectionPortHint": "Déjalo en blanco para restaurar el puerto predeterminado, {{port}}.", + "connectionSaveWarning": "Guardar finaliza las tareas actuales y vuelve a conectar si el interruptor de conexión está activado.", + "connectionLocalWarning": "Cambiar a local finaliza las tareas actuales y elimina la credencial remota guardada. Volver a remoto requiere un nuevo enlace de emparejamiento.", + "connectionCancel": "Cancelar cambios", + "connectionLocalError": "No se pudo cambiar a local. Inténtalo de nuevo.", + "connectionLocalSaved": "Se cambió al servicio local.", + "connectionPortSaved": "Puerto guardado.", + "remoteUnreachable": "No se puede conectar con el servicio remoto. Comprueba el servidor, la red o el estado de la autorización.", + "remoteSaving": "Emparejando…", + "remoteSaved": "Emparejamiento correcto.", + "remoteSavedDisabled": "Emparejamiento correcto. El interruptor de conexión está desactivado; actívalo para conectarte.", + "remoteFormatError": "El enlace de emparejamiento está incompleto o no es válido. Copia el enlace completo proporcionado por el servidor.", + "remotePermissionsInfo": "Acerca de los permisos de conexión remota", + "remotePermissionsHint": "El servidor puede controlar ventanas de tareas dedicadas. La confirmación para tomar prestadas pestañas existentes sigue los ajustes de automatización que aparecen a continuación." + }, + "controlOverlay": { + "status": "El agente está controlando", + "interrupt": "Interrumpir", + "interrupting": "Interrumpiendo…" + }, + "borrowConfirmation": { + "title": "¿Permitir tomar prestada la pestaña?", + "titleInactive": "El agente quiere tomar prestada una pestaña", + "body": "Un agente de IA quiere mover esta pestaña a su espacio de trabajo. Puedes denegar o permitir el préstamo.", + "targetTab": "Pestaña de destino:", + "autoDeny": "La solicitud caduca en {{count}} s", + "deny": "Denegar", + "allow": "Permitir", + "notificationTitle": "BrowserSkill: el agente quiere tomar prestada una pestaña", + "notificationBody": "Aprueba o deniega el préstamo de «{{tabTitle}}» en tu navegador." + }, + "helpRequest": { + "title": "El agente necesita tu ayuda", + "compactStatus": "El agente sigue esperando a que completes este paso", + "noteLabel": "Nota opcional para el agente", + "notePlaceholder": "Añade una nota para el agente (opcional)", + "continue": "Hecho, devolver el control", + "cancel": "Cancelar solicitud", + "collapse": "Contraer", + "expand": "Expandir", + "dragHandle": "Arrastra para mover", + "notificationTitle": "BrowserSkill: el agente necesita tu ayuda" + }, + "recordOverlay": { + "recording": "Grabando tus acciones", + "finish": "Finalizar" + }, + "longScreenshot": { + "title": "Captura de página completa", + "cardDesc": "Captura una página entera, previsualízala y guárdala", + "description": "Captura una página entera automáticamente o desplázate manualmente para crear una imagen larga y nítida.", + "hint": "El modo automático empieza desde arriba. El modo manual empieza aquí y también funciona en páginas del navegador y de la tienda.", + "start": "Iniciar captura", + "cancel": "Cancelar", + "cancelling": "Cancelando y restaurando la página…", + "cancelled": "Captura cancelada. Se ha restaurado tu posición de desplazamiento.", + "preview": "Abrir vista previa", + "download": "Descargar PNG", + "runningHint": "Mantén esta pestaña seleccionada. Puedes cerrar la ventana emergente o pausar para interactuar con la página. Vuelve a abrirla aquí para reanudar o finalizar antes de tiempo.", + "pageProgress": "Creando captura de página completa…", + "zoom": "Zoom de la vista previa", + "fit": "Ajustar al ancho", + "loading": "Cargando vista previa…", + "previewHint": "Guardado localmente. Los mosaicos de la vista previa se cargan según sea necesario; al descargar se crea el PNG completo. Guarda las imágenes que quieras conservar.", + "imageAlt": "Captura de página completa de {{title}}", + "missingTitle": "Captura no disponible", + "missingDescription": "Esta vista previa puede haber caducado o haberse eliminado. Vuelve a la página web y captúrala de nuevo desde las acciones rápidas.", + "downloadError": "No se pudo iniciar la descarga. Inténtalo de nuevo.", + "phase": { + "preparing": "Preparando captura", + "capturing": "Capturando página", + "saving": "Creando PNG", + "complete": "Captura lista", + "cancelled": "Cancelada", + "error": "Captura incompleta", + "paused": "En pausa" + }, + "errors": { + "unsupported": "El desplazamiento automático no está disponible aquí. Prueba el desplazamiento manual o el área visible.", + "unavailable": "El navegador no permitió esta captura. Vuelve a hacer clic en la extensión o comprueba los permisos de acceso a la página.", + "busy": "Otra tarea está usando esta página, o ya hay una captura en curso. Espera a que finalice.", + "changed": "La página cambió durante la captura. Mantén estables la pestaña, el tamaño de la ventana y el contenido de la página, y vuelve a intentarlo.", + "tooLarge": "El navegador no pudo procesar esta imagen. Prueba a ajustar el área de captura.", + "timeout": "Esta operación de la página agotó el tiempo de espera. Puedes guardar la parte completada.", + "captureFailed": "No se pudo completar la captura de pantalla. La página se ha restaurado. Inténtalo de nuevo.", + "saveFailed": "El almacenamiento local está lleno o no disponible. Libera espacio e inténtalo de nuevo.", + "interrupted": "La captura se interrumpió. Puedes guardar la parte completada.", + "storageFull": "El almacenamiento local está lleno. Libera espacio; el contenido capturado sigue disponible para previsualizar y exportar.", + "alignment": "No se pudieron alinear estos fotogramas de forma fiable. Desplázate un poco hacia arriba para lograr más solapamiento y luego desplázate lentamente hacia abajo.", + "autoUnavailable": "No se pudo iniciar el desplazamiento automático: esta página no permite que la extensión controle el desplazamiento, o su script de captura no pudo conectarse. Actualiza la página e inténtalo de nuevo, o elige «Yo me desplazo» o «Área visible»." + }, + "mode": "Modo de captura", + "modes": { + "auto": "Página completa · Automático", + "manual": "Imagen larga · Yo me desplazo", + "visible": "Área visible" + }, + "manualHint": "Modo manual: cierra esta ventana emergente y desplázate lentamente hacia abajo, manteniendo contenido superpuesto. Vuelve a abrirla aquí y elige Finalizar para guardar.", + "pausedHint": "En pausa. Puedes cargar más contenido y luego reanudar desde la posición capturada.", + "pause": "Pausar", + "resume": "Reanudar", + "finish": "Finalizar y conservar", + "exporting": "Exportando", + "partial": "Se ha conservado la parte capturada.", + "useManual": "Usar desplazamiento manual" + }, + "audit": { + "title": "Auditoría de operaciones", + "cardDesc": "Acerca de la auditoría de operaciones", + "enabledLabel": "Registrar historial de operaciones", + "loading": "Cargando…", + "retry": "Reintentar", + "viewAll": "Ver todo", + "allTasks": "Todas las tareas", + "untitled": "Tarea del navegador", + "operationCount": "{{count}} operaciones", + "errorCount": "{{count}} errores", + "fileCount": "{{count}} archivos", + "dialogCount": "{{count}} cuadros de diálogo de página gestionados automáticamente", + "helpOutcome": "Resultado de la intervención humana", + "partialLabel": "Historial parcial", + "partialDescription": "La grabación comenzó a las {{time}}. Los intervalos en pausa no se registraron; consulta la línea de tiempo a continuación.", + "inputRedacted": "Contenido de entrada oculto", + "empty": "Aún no hay tareas registradas. Las futuras operaciones de BrowserSkill aparecerán aquí.", + "disconnected": "El servicio local está desconectado. Inicia el servicio de BrowserSkill y vuelve a intentarlo. El historial existente permanece en tu ordenador.", + "unsupported": "Este servicio local no admite la auditoría de operaciones. Actualiza bsk y vuelve a intentarlo.", + "requestFailed": "No se pudo leer o guardar el historial de auditoría. Comprueba el almacenamiento local y la disponibilidad de la tarea, o vuelve a intentarlo cuando la tarea finalice.", + "privacyShort": "Guardado localmente durante 30 días. El contenido de entrada está oculto.", + "privacyFull": "El historial permanece en tu ordenador. Las tareas finalizadas se conservan durante 30 días. No se guardan los cuerpos de entrada, scripts, texto de página ni las rutas y parámetros de las URL. Los nombres de destino reciben un ocultamiento básico. Las exportaciones contienen los mismos registros ocultados.", + "resultNote": "«Operación completada» significa que la llamada a la herramienta finalizó, no que el sitio web confirmara un resultado de negocio. Los resultados que faltan se marcan como «Resultado desconocido».", + "technicalDetails": "Detalles de la operación", + "timeline": "Línea de tiempo de operaciones", + "export": "Exportar historial", + "delete": "Eliminar historial", + "deleteConfirm": "¿Eliminar el historial de auditoría local de esta tarea? Esta acción no se puede deshacer.", + "cancel": "Cancelar", + "openDirectory": "Abrir carpeta", + "loadMore": "Cargar más", + "status": { + "running": "En curso", + "ended": "Finalizada", + "interrupted": "Interrumpida", + "completed": "Operación completada", + "error": "Error de la operación", + "unknown": "Resultado desconocido", + "cancelled": "Cancelada" + }, + "marker": { + "started": "Grabación iniciada", + "ended": "Sesión finalizada", + "paused": "Grabación en pausa · operaciones posteriores no registradas", + "resumed": "Grabación reanudada · intervalo anterior no registrado", + "user_interrupt": "El usuario solicitó detenerla", + "event": "Evento de sesión" + }, + "methods": { + "tabList": "Listar pestañas", + "tabCreate": "Abrir pestaña", + "tabClose": "Cerrar pestaña", + "tabSelect": "Cambiar de pestaña", + "tabBorrow": "Solicitar pestaña prestada", + "tabReturn": "Devolver pestaña", + "navigate": "Abrir página", + "navigateBack": "Retroceder", + "navigateForward": "Avanzar", + "reload": "Recargar página", + "click": "Clic", + "fill": "Rellenar", + "press": "Pulsar tecla", + "select": "Seleccionar opción", + "hover": "Pasar el ratón por encima", + "focus": "Enfocar", + "blur": "Quitar el foco", + "scroll": "Desplazar", + "upload": "Subir archivos", + "download": "Descargar archivo", + "read": "Leer página", + "screenshot": "Capturar pantalla", + "console": "Leer consola", + "network": "Leer información de red", + "evaluate": "Ejecutar script de página", + "wait": "Esperar", + "help": "Solicitar ayuda humana", + "recordStart": "Iniciar grabación de operaciones", + "recordStop": "Detener grabación de operaciones", + "recordAwait": "Esperar grabación", + "resize": "Redimensionar ventana", + "emulate": "Cambiar ajustes de emulación" + } + } +} diff --git a/packages/i18n/src/locales/fr-FR/common.json b/packages/i18n/src/locales/fr-FR/common.json new file mode 100644 index 00000000..5202cb4d --- /dev/null +++ b/packages/i18n/src/locales/fr-FR/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "Pilotez votre navigateur déjà connecté depuis des agents IA via le CLI bsk" + } +} diff --git a/packages/i18n/src/locales/fr-FR/extension.json b/packages/i18n/src/locales/fr-FR/extension.json new file mode 100644 index 00000000..b1827e04 --- /dev/null +++ b/packages/i18n/src/locales/fr-FR/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "Connecté à un daemon plus ancien (protocole v{{cliProtocol}}). Mettez à jour le CLI et le daemon pour profiter pleinement des paramètres d'automatisation.", + "brandCategory": "Automatisation du navigateur", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "Déconnecté", + "connecting": "Connexion…", + "connected": "Connecté", + "version_skew": "Connecté", + "disabled": "Connexion désactivée" + }, + "stateDetail": { + "disconnected": "Ouvrez BrowserSkill pour vous connecter.", + "connecting": "Connexion à BrowserSkill…", + "connected": "Prêt pour les tâches d'automatisation.", + "version_skew": "Les versions de protocole diffèrent. Veuillez mettre à jour." + }, + "stateBadge": { + "disconnected": "En veille", + "connecting": "Démarrage", + "connected": "Prêt", + "version_skew": "Mise à jour possible", + "disabled": "Désactivé" + }, + "connectionToggleTitle": "Connexion BrowserSkill", + "controlHintsToggleTitle": "Indices de contrôle", + "controlHintsToggleHint": "Affiche la pastille d'état et le halo orange pendant que l'Agent contrôle une page.", + "controlHintsInfoLabel": "À propos des indices de contrôle", + "daemonPortLabel": "Port local", + "daemonPortHint": "Connexion au daemon local sur ce port. Démarrez d'abord le daemon et faites-le écouter sur ce port. Ce paramètre modifie uniquement l'adresse de connexion de l'extension, pas la configuration locale du CLI. Enregistrer une modification met fin aux sessions en cours et reconnecte si la connexion est activée.", + "daemonPortInfoLabel": "À propos du port local", + "daemonPortInvalid": "Saisissez un port entre 1 et 65535.", + "daemonPortSave": "Enregistrer le port", + "daemonPortSaving": "Enregistrement…", + "daemonPortReadFailed": "Impossible de charger le port. Rouvrez ce popup pour réessayer.", + "daemonPortWriteFailed": "Impossible d'enregistrer le port. Veuillez réessayer.", + "daemonUnreachable": "Connexion impossible. Vérifiez que le daemon est en cours d'exécution et que le port correspond.", + "versionSkewWarning": "Protocole de l'extension v{{extensionProtocol}}, protocole du CLI v{{cliProtocol}}. Les versions de protocole diffèrent — veuillez mettre à jour.", + "upgradeAvailable": "Mise à jour possible", + "launcher": { + "title": "Actions rapides" + }, + "back": "Retour", + "runtimeTitle": "Environnement d'exécution", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "extension v{{version}}", + "extensionVersionHint": "Version de l'extension", + "daemonVersionHint": "Version de bsk", + "protocolVersion": "protocole v{{version}}", + "extensionProtocol": "protocole d'extension v{{version}}", + "daemonProtocol": "protocole du daemon v{{version}}", + "instanceTitle": "ID d'instance", + "instanceDescription": "Identifiant de connexion unique pour ce navigateur", + "copy": "Copier", + "copied": "Copié", + "copyInstanceId": "Copier l'ID d'instance", + "record": { + "sectionTitle": "Enregistrement d'actions", + "cardDesc": "Enregistrez vos actions pour référence de l'Agent", + "sectionHint": "Génère une instruction d'enregistrement — envoyez-la à votre Agent pour démarrer l'enregistrement de vos actions ; l'Agent pourra ensuite utiliser le pack de trace obtenu pour automatiser des tâches similaires.", + "topicLabel": "Sujet (facultatif)", + "topicPlaceholder": "ex. Publier un article", + "startUrlLabel": "URL de départ (facultatif)", + "startUrlPlaceholder": "https://…", + "copyButton": "Copier les instructions d'enregistrement", + "copied": "Copié", + "hintDisconnected": "Disponible une fois connecté", + "promptTemplate": "Utilise la CLI `bsk` de BrowserSkill pour enregistrer les actions du navigateur que je vais effectuer.\n\nÉtapes :\n1. Exécute : {{command}}\n2. Une fois que tu confirmes que c'est démarré, j'agirai moi-même dans la fenêtre ouverte.\n3. Après que j'aurai cliqué sur Terminer, lis le pack `./trace` généré (`trace.json` + `states/`) et résume ce que j'ai fait." + }, + "interaction": { + "title": "Paramètres d'automatisation", + "confirmTabBorrow": "Confirmer avant d'emprunter des onglets", + "confirmTabBorrowHint": "Si activé, une confirmation est demandée avant d'emprunter un onglet déjà ouvert. Si désactivé, l'emprunt est direct.", + "requestHelpEnabled": "Autoriser les demandes d'aide humaine", + "requestHelpEnabledHint": "Si activé, l'agent peut demander votre aide. Si désactivé, il tente de terminer la tâche de façon autonome et signale les étapes qu'il ne peut pas résoudre.", + "scope": "Enregistré automatiquement pour ce profil de navigateur. S'applique à toutes les demandes de session atteignant l'extension ; les options de ligne de commande ne peuvent pas le remplacer. Les CLI ou daemons plus anciens peuvent mettre fin à l'aide localement. Mettez à jour les trois composants pour une prise en charge complète.", + "readFailed": "Impossible de charger les paramètres. Rouvrez l'extension.", + "writeFailed": "Enregistrement impossible. Vos paramètres n'ont pas changé. Réessayez.", + "confirmTabBorrowInfoLabel": "À propos de la confirmation d'emprunt d'onglet", + "requestHelpEnabledInfoLabel": "À propos des demandes d'aide humaine" + }, + "remoteLocal": "Basculer en local", + "remotePairing": "Lien de couplage", + "remoteHint": "Collez le lien de couplage complet d'un serveur de confiance. Le port est inclus.", + "remoteSave": "Enregistrer le couplage", + "remoteError": "Le couplage ne s'est pas terminé. Vérifiez la connexion au serveur ou essayez un nouveau lien de couplage.", + "remoteNeedsAttention": "Nécessite une attention", + "remoteUnknown": "Paramètres de connexion indisponibles", + "remoteStorageError": "Impossible de lire les paramètres de connexion. BrowserSkill réessaiera. Vous pouvez sélectionner explicitement le daemon local pour récupérer.", + "remoteExpires": "L'autorisation expire : {{date}}", + "remoteRenewing": "Renouvellement de l'autorisation du navigateur…", + "remoteRenewalFailed": "Le renouvellement n'a pas pu joindre le service ou s'est terminé avec un échec. BrowserSkill réessaiera ; l'autorisation actuelle reste utilisable jusqu'à son expiration.", + "remoteRejected": "Le serveur a rejeté l'autorisation. Vérifiez le serveur ou utilisez un nouveau lien de couplage.", + "remoteExpired": "L'autorisation a expiré. Utilisez un nouveau lien de couplage pour vous reconnecter.", + "remoteUnconfirmed": "La dernière autorisation confirmée a expiré, mais un renouvellement a peut-être réussi. BrowserSkill retente le renouvellement en attente ; vérifiez le serveur si cela persiste.", + "connectionSettings": "Paramètres de connexion", + "connectionMode": "Mode de connexion", + "connectionLocal": "Local", + "connectionRemote": "Distant", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "Lecture des paramètres de connexion…", + "connectionDestination": "Se connecter à : {{address}}", + "connectionPortHint": "Laissez vide pour restaurer le port par défaut, {{port}}.", + "connectionSaveWarning": "L'enregistrement met fin aux tâches en cours et reconnecte si le commutateur de connexion est activé.", + "connectionLocalWarning": "Passer en local met fin aux tâches en cours et supprime l'identifiant distant enregistré. Revenir en distant nécessite un nouveau lien de couplage.", + "connectionCancel": "Annuler les modifications", + "connectionLocalError": "Impossible de passer en local. Veuillez réessayer.", + "connectionLocalSaved": "Basculé vers le service local.", + "connectionPortSaved": "Port enregistré.", + "remoteUnreachable": "Impossible de se connecter au service distant. Vérifiez le serveur, le réseau ou l'état de l'autorisation.", + "remoteSaving": "Couplage…", + "remoteSaved": "Couplage réussi.", + "remoteSavedDisabled": "Couplage réussi. Le commutateur de connexion est désactivé ; activez-le pour vous connecter.", + "remoteFormatError": "Le lien de couplage est incomplet ou invalide. Copiez le lien complet fourni par le serveur.", + "remotePermissionsInfo": "À propos des autorisations de connexion distante", + "remotePermissionsHint": "Le serveur peut contrôler des fenêtres de tâche dédiées. La confirmation pour emprunter des onglets existants suit les paramètres d'automatisation ci-dessous." + }, + "controlOverlay": { + "status": "L'Agent contrôle", + "interrupt": "Interrompre", + "interrupting": "Interruption…" + }, + "borrowConfirmation": { + "title": "Autoriser l'emprunt de l'onglet ?", + "titleInactive": "L'Agent souhaite emprunter un onglet", + "body": "Un agent IA souhaite déplacer cet onglet dans son espace de travail. Vous pouvez refuser ou autoriser l'emprunt.", + "targetTab": "Onglet cible :", + "autoDeny": "La demande expire dans {{count}} s", + "deny": "Refuser", + "allow": "Autoriser", + "notificationTitle": "BrowserSkill : l'Agent souhaite emprunter un onglet", + "notificationBody": "Approuvez ou refusez l'emprunt de « {{tabTitle}} » dans votre navigateur." + }, + "helpRequest": { + "title": "L'Agent a besoin de votre aide", + "compactStatus": "L'Agent attend toujours que vous terminiez cette étape", + "noteLabel": "Note facultative pour l'agent", + "notePlaceholder": "Ajoutez une note pour l'agent (facultatif)", + "continue": "Terminé, rendre le contrôle", + "cancel": "Annuler la demande", + "collapse": "Réduire", + "expand": "Développer", + "dragHandle": "Glisser pour déplacer", + "notificationTitle": "BrowserSkill : l'Agent a besoin de votre aide" + }, + "recordOverlay": { + "recording": "Enregistrement de vos actions", + "finish": "Terminer" + }, + "longScreenshot": { + "title": "Capture d'écran de page complète", + "cardDesc": "Capturez une page entière, prévisualisez-la et enregistrez-la", + "description": "Capturez automatiquement une page entière, ou faites défiler manuellement pour créer une longue image nette.", + "hint": "Le mode automatique démarre en haut. Le mode manuel démarre ici et fonctionne aussi sur les pages du navigateur et du store.", + "start": "Démarrer la capture", + "cancel": "Annuler", + "cancelling": "Annulation et restauration de la page…", + "cancelled": "Capture annulée. Votre position de défilement a été restaurée.", + "preview": "Ouvrir l'aperçu", + "download": "Télécharger le PNG", + "runningHint": "Gardez cet onglet sélectionné. Vous pouvez fermer le popup, ou faire une pause pour interagir avec la page. Rouvrez ici pour reprendre ou terminer plus tôt.", + "pageProgress": "Création de la capture de page complète…", + "zoom": "Zoom de l'aperçu", + "fit": "Ajuster à la largeur", + "loading": "Chargement de l'aperçu…", + "previewHint": "Enregistré localement. Les tuiles de l'aperçu se chargent au besoin ; le téléchargement crée le PNG complet. Enregistrez les images que vous souhaitez conserver.", + "imageAlt": "Capture de page complète de {{title}}", + "missingTitle": "Capture indisponible", + "missingDescription": "Cet aperçu a peut-être expiré ou été supprimé. Retournez sur la page web et recapturez-la depuis les actions rapides.", + "downloadError": "Impossible de démarrer le téléchargement. Veuillez réessayer.", + "phase": { + "preparing": "Préparation de la capture", + "capturing": "Capture de la page", + "saving": "Création du PNG", + "complete": "Capture prête", + "cancelled": "Annulée", + "error": "Capture incomplète", + "paused": "En pause" + }, + "errors": { + "unsupported": "Le défilement automatique n'est pas disponible ici. Essayez le défilement manuel ou la zone visible.", + "unavailable": "Le navigateur n'a pas autorisé cette capture. Cliquez à nouveau sur l'extension ou vérifiez les autorisations d'accès à la page.", + "busy": "Une autre tâche utilise cette page, ou une capture est déjà en cours. Attendez qu'elle se termine.", + "changed": "La page a changé pendant la capture. Gardez l'onglet, la taille de fenêtre et le contenu de la page stables, puis réessayez.", + "tooLarge": "Le navigateur n'a pas pu traiter cette image. Essayez d'ajuster la zone de capture.", + "timeout": "Cette opération de page a expiré. Vous pouvez enregistrer la partie terminée.", + "captureFailed": "Impossible de terminer la capture d'écran. La page a été restaurée. Veuillez réessayer.", + "saveFailed": "Le stockage local est plein ou indisponible. Libérez de l'espace et réessayez.", + "interrupted": "La capture a été interrompue. Vous pouvez enregistrer la partie terminée.", + "storageFull": "Le stockage local est plein. Libérez de l'espace ; le contenu capturé reste disponible pour l'aperçu et l'export.", + "alignment": "Impossible d'aligner ces images de façon fiable. Faites défiler un peu vers le haut pour plus de chevauchement, puis défilez lentement vers le bas.", + "autoUnavailable": "Le défilement automatique n'a pas pu démarrer : cette page n'autorise pas le défilement par l'extension, ou son script de capture n'a pas pu se connecter. Actualisez et réessayez, ou choisissez « Je fais défiler » ou « Zone visible »." + }, + "mode": "Mode de capture", + "modes": { + "auto": "Page complète · Automatique", + "manual": "Longue image · Je fais défiler", + "visible": "Zone visible" + }, + "manualHint": "Mode manuel : fermez ce popup et faites défiler lentement vers le bas, en gardant du contenu qui se chevauche. Rouvrez ici et choisissez Terminer pour enregistrer.", + "pausedHint": "En pause. Vous pouvez charger plus de contenu, puis reprendre depuis la position capturée.", + "pause": "Pause", + "resume": "Reprendre", + "finish": "Terminer et conserver", + "exporting": "Exportation", + "partial": "La partie capturée a été conservée.", + "useManual": "Utiliser le défilement manuel" + }, + "audit": { + "title": "Audit des opérations", + "cardDesc": "À propos de l'audit des opérations", + "enabledLabel": "Enregistrer l'historique des opérations", + "loading": "Chargement…", + "retry": "Réessayer", + "viewAll": "Tout afficher", + "allTasks": "Toutes les tâches", + "untitled": "Tâche du navigateur", + "operationCount": "{{count}} opérations", + "errorCount": "{{count}} erreurs", + "fileCount": "{{count}} fichiers", + "dialogCount": "{{count}} boîtes de dialogue de page traitées automatiquement", + "helpOutcome": "Résultat de la prise en charge humaine", + "partialLabel": "Historique partiel", + "partialDescription": "L'enregistrement a commencé à {{time}}. Les intervalles en pause n'ont pas été enregistrés ; voir la chronologie ci-dessous.", + "inputRedacted": "Contenu de saisie masqué", + "empty": "Aucune tâche enregistrée pour l'instant. Les futures opérations BrowserSkill apparaîtront ici.", + "disconnected": "Le service local est déconnecté. Démarrez le service BrowserSkill et réessayez. L'historique existant reste sur votre ordinateur.", + "unsupported": "Ce service local ne prend pas en charge l'audit des opérations. Mettez à jour bsk et réessayez.", + "requestFailed": "Impossible de lire ou d'enregistrer l'historique d'audit. Vérifiez le stockage local et la disponibilité de la tâche, ou réessayez après la fin de la tâche.", + "privacyShort": "Enregistré localement pendant 30 jours. Le contenu de saisie est masqué.", + "privacyFull": "L'historique reste sur votre ordinateur. Les tâches terminées sont conservées 30 jours. Les corps de saisie, scripts, texte de page, et chemins et paramètres d'URL ne sont pas enregistrés. Les noms des cibles reçoivent un masquage de base. Les exports contiennent les mêmes enregistrements masqués.", + "resultNote": "« Opération terminée » signifie que l'appel d'outil s'est terminé, pas que le site web a confirmé un résultat métier. Les résultats manquants sont marqués « Résultat inconnu ».", + "technicalDetails": "Détails de l'opération", + "timeline": "Chronologie des opérations", + "export": "Exporter l'historique", + "delete": "Supprimer l'historique", + "deleteConfirm": "Supprimer l'historique d'audit local de cette tâche ? Cette action est irréversible.", + "cancel": "Annuler", + "openDirectory": "Ouvrir le dossier", + "loadMore": "Charger plus", + "status": { + "running": "En cours", + "ended": "Terminé", + "interrupted": "Interrompu", + "completed": "Opération terminée", + "error": "Erreur de l'opération", + "unknown": "Résultat inconnu", + "cancelled": "Annulé" + }, + "marker": { + "started": "Enregistrement démarré", + "ended": "Session terminée", + "paused": "Enregistrement en pause · opérations suivantes non enregistrées", + "resumed": "Enregistrement repris · intervalle précédent non enregistré", + "user_interrupt": "Arrêt demandé par l'utilisateur", + "event": "Événement de session" + }, + "methods": { + "tabList": "Lister les onglets", + "tabCreate": "Ouvrir un onglet", + "tabClose": "Fermer l'onglet", + "tabSelect": "Changer d'onglet", + "tabBorrow": "Demander un onglet emprunté", + "tabReturn": "Rendre l'onglet", + "navigate": "Ouvrir une page", + "navigateBack": "Revenir en arrière", + "navigateForward": "Avancer", + "reload": "Recharger la page", + "click": "Cliquer", + "fill": "Remplir", + "press": "Appuyer sur une touche", + "select": "Sélectionner une option", + "hover": "Survoler", + "focus": "Mettre le focus", + "blur": "Retirer le focus", + "scroll": "Faire défiler", + "upload": "Téléverser des fichiers", + "download": "Télécharger un fichier", + "read": "Lire la page", + "screenshot": "Capturer une capture d'écran", + "console": "Lire la console", + "network": "Lire les informations réseau", + "evaluate": "Exécuter un script de page", + "wait": "Attendre", + "help": "Demander une aide humaine", + "recordStart": "Démarrer l'enregistrement des opérations", + "recordStop": "Arrêter l'enregistrement des opérations", + "recordAwait": "Attendre l'enregistrement", + "resize": "Redimensionner la fenêtre", + "emulate": "Modifier les paramètres d'émulation" + } + } +} diff --git a/packages/i18n/src/locales/it-IT/common.json b/packages/i18n/src/locales/it-IT/common.json new file mode 100644 index 00000000..82a4c45d --- /dev/null +++ b/packages/i18n/src/locales/it-IT/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "Controlla il tuo browser già connesso dagli agenti IA tramite la CLI bsk" + } +} diff --git a/packages/i18n/src/locales/it-IT/extension.json b/packages/i18n/src/locales/it-IT/extension.json new file mode 100644 index 00000000..8ce1f327 --- /dev/null +++ b/packages/i18n/src/locales/it-IT/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "Connesso a un daemon precedente (protocollo v{{cliProtocol}}). Aggiorna la CLI e il daemon per supportare completamente le impostazioni di automazione.", + "brandCategory": "Automazione del browser", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "Disconnesso", + "connecting": "Connessione…", + "connected": "Connesso", + "version_skew": "Connesso", + "disabled": "Connessione disattivata" + }, + "stateDetail": { + "disconnected": "Apri BrowserSkill per connetterti.", + "connecting": "Connessione a BrowserSkill…", + "connected": "Pronto per le attività di automazione.", + "version_skew": "Le versioni del protocollo sono diverse. Aggiorna." + }, + "stateBadge": { + "disconnected": "In attesa", + "connecting": "Avvio", + "connected": "Pronto", + "version_skew": "Aggiornabile", + "disabled": "Disattivato" + }, + "connectionToggleTitle": "Connessione BrowserSkill", + "controlHintsToggleTitle": "Indicatori di controllo", + "controlHintsToggleHint": "Mostra l'indicatore di stato e il bagliore arancione mentre l'agente controlla una pagina.", + "controlHintsInfoLabel": "Informazioni sugli indicatori di controllo", + "daemonPortLabel": "Porta locale", + "daemonPortHint": "Connettiti al daemon locale su questa porta. Avvia prima il daemon e fallo restare in ascolto su questa porta. Questa impostazione modifica solo l'indirizzo di connessione dell'estensione, non la configurazione locale della CLI. Salvare una modifica termina le sessioni correnti e si riconnette se la connessione è attivata.", + "daemonPortInfoLabel": "Informazioni sulla porta locale", + "daemonPortInvalid": "Inserisci una porta tra 1 e 65535.", + "daemonPortSave": "Salva porta", + "daemonPortSaving": "Salvataggio…", + "daemonPortReadFailed": "Impossibile caricare la porta. Riapri questo popup per riprovare.", + "daemonPortWriteFailed": "Impossibile salvare la porta. Riprova.", + "daemonUnreachable": "Impossibile connettersi. Verifica che il daemon sia in esecuzione e che la porta corrisponda.", + "versionSkewWarning": "Protocollo dell'estensione v{{extensionProtocol}}, protocollo della CLI v{{cliProtocol}}. Le versioni del protocollo sono diverse — aggiorna.", + "upgradeAvailable": "Aggiornabile", + "launcher": { + "title": "Azioni rapide" + }, + "back": "Indietro", + "runtimeTitle": "Runtime", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "estensione v{{version}}", + "extensionVersionHint": "Versione dell'estensione", + "daemonVersionHint": "Versione di bsk", + "protocolVersion": "protocollo v{{version}}", + "extensionProtocol": "protocollo dell'estensione v{{version}}", + "daemonProtocol": "protocollo del daemon v{{version}}", + "instanceTitle": "ID istanza", + "instanceDescription": "Identificatore di connessione univoco per questo browser", + "copy": "Copia", + "copied": "Copiato", + "copyInstanceId": "Copia ID istanza", + "record": { + "sectionTitle": "Registrazione azioni", + "cardDesc": "Registra le tue azioni come riferimento per l'agente", + "sectionHint": "Genera un'istruzione di registrazione: inviala al tuo agente per avviare la registrazione delle tue azioni; l'agente potrà poi usare il pacchetto di trace risultante per automatizzare attività simili.", + "topicLabel": "Argomento (facoltativo)", + "topicPlaceholder": "es. Pubblica un articolo", + "startUrlLabel": "URL di partenza (facoltativo)", + "startUrlPlaceholder": "https://…", + "copyButton": "Copia le istruzioni di registrazione", + "copied": "Copiato", + "hintDisconnected": "Disponibile una volta connesso", + "promptTemplate": "Usa la CLI `bsk` di BrowserSkill per registrare le azioni del browser che sto per mostrare.\n\nPassaggi:\n1. Esegui: {{command}}\n2. Una volta confermato l'avvio, opererò io stesso nella finestra aperta.\n3. Dopo aver cliccato su Fine, leggi il pacchetto `./trace` scritto (`trace.json` + `states/`) e riassumi cosa ho fatto." + }, + "interaction": { + "title": "Impostazioni di automazione", + "confirmTabBorrow": "Conferma prima di prendere in prestito le schede", + "confirmTabBorrowHint": "Se attivo, viene richiesta la conferma prima di prendere in prestito una scheda già aperta. Se disattivo, il prestito avviene direttamente.", + "requestHelpEnabled": "Consenti richieste di aiuto umano", + "requestHelpEnabledHint": "Se attivo, l'agente può chiedere il tuo aiuto. Se disattivo, cerca di completare l'attività in autonomia e segnala i passaggi che non riesce a risolvere.", + "scope": "Salvato automaticamente per questo profilo del browser. Si applica a tutte le richieste di sessione che raggiungono l'estensione; le opzioni da riga di comando non possono sovrascriverlo. CLI o daemon precedenti potrebbero terminare l'aiuto localmente. Aggiorna tutti e tre i componenti per il pieno supporto.", + "readFailed": "Impossibile caricare le impostazioni. Riapri l'estensione.", + "writeFailed": "Impossibile salvare. Le tue impostazioni non sono cambiate. Riprova.", + "confirmTabBorrowInfoLabel": "Informazioni sulla conferma del prestito di schede", + "requestHelpEnabledInfoLabel": "Informazioni sulle richieste di aiuto umano" + }, + "remoteLocal": "Passa a locale", + "remotePairing": "Link di associazione", + "remoteHint": "Incolla il link di associazione completo di un server attendibile. La porta è inclusa.", + "remoteSave": "Salva associazione", + "remoteError": "Associazione non completata. Controlla la connessione al server o prova un nuovo link di associazione.", + "remoteNeedsAttention": "Richiede attenzione", + "remoteUnknown": "Impostazioni di connessione non disponibili", + "remoteStorageError": "Impossibile leggere le impostazioni di connessione. BrowserSkill riproverà. Puoi selezionare esplicitamente il daemon locale per ripristinare.", + "remoteExpires": "L'autorizzazione scade: {{date}}", + "remoteRenewing": "Rinnovo dell'autorizzazione del browser…", + "remoteRenewalFailed": "Il rinnovo non è riuscito a raggiungere il servizio o a completarsi correttamente. BrowserSkill riproverà; l'autorizzazione attuale resta utilizzabile fino alla scadenza.", + "remoteRejected": "Il server ha rifiutato l'autorizzazione. Controlla il server o usa un nuovo link di associazione.", + "remoteExpired": "L'autorizzazione è scaduta. Usa un nuovo link di associazione per riconnetterti.", + "remoteUnconfirmed": "L'ultima autorizzazione confermata è scaduta, ma un rinnovo potrebbe essere riuscito. BrowserSkill sta ritentando il rinnovo in sospeso; controlla il server se il problema persiste.", + "connectionSettings": "Impostazioni di connessione", + "connectionMode": "Modalità di connessione", + "connectionLocal": "Locale", + "connectionRemote": "Remoto", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "Lettura delle impostazioni di connessione…", + "connectionDestination": "Connetti a: {{address}}", + "connectionPortHint": "Lascia vuoto per ripristinare la porta predefinita, {{port}}.", + "connectionSaveWarning": "Il salvataggio termina le attività correnti e si riconnette se l'interruttore di connessione è attivo.", + "connectionLocalWarning": "Passare a locale termina le attività correnti e rimuove la credenziale remota salvata. Per tornare a remoto è necessario un nuovo link di associazione.", + "connectionCancel": "Annulla modifiche", + "connectionLocalError": "Impossibile passare a locale. Riprova.", + "connectionLocalSaved": "Passato al servizio locale.", + "connectionPortSaved": "Porta salvata.", + "remoteUnreachable": "Impossibile connettersi al servizio remoto. Controlla il server, la rete o lo stato dell'autorizzazione.", + "remoteSaving": "Associazione in corso…", + "remoteSaved": "Associazione riuscita.", + "remoteSavedDisabled": "Associazione riuscita. L'interruttore di connessione è disattivato; attivalo per connetterti.", + "remoteFormatError": "Il link di associazione è incompleto o non valido. Copia il link completo fornito dal server.", + "remotePermissionsInfo": "Informazioni sui permessi di connessione remota", + "remotePermissionsHint": "Il server può controllare finestre di attività dedicate. La conferma per prendere in prestito schede esistenti segue le impostazioni di automazione riportate di seguito." + }, + "controlOverlay": { + "status": "L'agente sta controllando", + "interrupt": "Interrompi", + "interrupting": "Interruzione…" + }, + "borrowConfirmation": { + "title": "Consentire il prestito della scheda?", + "titleInactive": "L'agente vuole prendere in prestito una scheda", + "body": "Un agente IA vuole spostare questa scheda nel proprio spazio di lavoro. Puoi rifiutare o consentire il prestito.", + "targetTab": "Scheda di destinazione:", + "autoDeny": "La richiesta scade tra {{count}} s", + "deny": "Rifiuta", + "allow": "Consenti", + "notificationTitle": "BrowserSkill: l'agente vuole prendere in prestito una scheda", + "notificationBody": "Approva o rifiuta il prestito di «{{tabTitle}}» nel tuo browser." + }, + "helpRequest": { + "title": "L'agente ha bisogno del tuo aiuto", + "compactStatus": "L'agente sta ancora aspettando che tu completi questo passaggio", + "noteLabel": "Nota facoltativa per l'agente", + "notePlaceholder": "Aggiungi una nota per l'agente (facoltativo)", + "continue": "Fatto, restituisci il controllo", + "cancel": "Annulla richiesta", + "collapse": "Comprimi", + "expand": "Espandi", + "dragHandle": "Trascina per spostare", + "notificationTitle": "BrowserSkill: l'agente ha bisogno del tuo aiuto" + }, + "recordOverlay": { + "recording": "Registrazione delle tue azioni", + "finish": "Fine" + }, + "longScreenshot": { + "title": "Screenshot dell'intera pagina", + "cardDesc": "Cattura un'intera pagina, visualizzane l'anteprima e salvala", + "description": "Cattura automaticamente un'intera pagina, oppure scorri manualmente per creare un'immagine lunga e nitida.", + "hint": "La modalità automatica inizia dall'alto. La modalità manuale inizia da qui e funziona anche sulle pagine del browser e dello store.", + "start": "Avvia cattura", + "cancel": "Annulla", + "cancelling": "Annullamento e ripristino della pagina…", + "cancelled": "Cattura annullata. La posizione di scorrimento è stata ripristinata.", + "preview": "Apri anteprima", + "download": "Scarica PNG", + "runningHint": "Mantieni selezionata questa scheda. Puoi chiudere il popup o mettere in pausa per interagire con la pagina. Riaprilo qui per riprendere o terminare in anticipo.", + "pageProgress": "Creazione dello screenshot dell'intera pagina…", + "zoom": "Zoom dell'anteprima", + "fit": "Adatta alla larghezza", + "loading": "Caricamento anteprima…", + "previewHint": "Salvato localmente. I riquadri dell'anteprima si caricano in base alle necessità; il download crea il PNG completo. Salva le immagini che vuoi conservare.", + "imageAlt": "Screenshot dell'intera pagina di {{title}}", + "missingTitle": "Screenshot non disponibile", + "missingDescription": "Questa anteprima potrebbe essere scaduta o essere stata rimossa. Torna alla pagina web e catturala di nuovo dalle azioni rapide.", + "downloadError": "Impossibile avviare il download. Riprova.", + "phase": { + "preparing": "Preparazione della cattura", + "capturing": "Cattura della pagina", + "saving": "Creazione del PNG", + "complete": "Screenshot pronto", + "cancelled": "Annullato", + "error": "Cattura incompleta", + "paused": "In pausa" + }, + "errors": { + "unsupported": "Lo scorrimento automatico non è disponibile qui. Prova lo scorrimento manuale o l'area visibile.", + "unavailable": "Il browser non ha consentito questa cattura. Fai di nuovo clic sull'estensione o controlla le autorizzazioni di accesso alla pagina.", + "busy": "Un'altra attività sta usando questa pagina, oppure una cattura è già in corso. Attendi che finisca.", + "changed": "La pagina è cambiata durante la cattura. Mantieni stabili la scheda, le dimensioni della finestra e il contenuto della pagina, quindi riprova.", + "tooLarge": "Il browser non è riuscito a elaborare questa immagine. Prova a regolare l'area di cattura.", + "timeout": "Questa operazione sulla pagina è scaduta. Puoi salvare la parte completata.", + "captureFailed": "Impossibile completare lo screenshot. La pagina è stata ripristinata. Riprova.", + "saveFailed": "L'archiviazione locale è piena o non disponibile. Libera spazio e riprova.", + "interrupted": "La cattura è stata interrotta. Puoi salvare la parte completata.", + "storageFull": "L'archiviazione locale è piena. Libera spazio; il contenuto catturato resta disponibile per l'anteprima e l'esportazione.", + "alignment": "Impossibile allineare questi fotogrammi in modo affidabile. Scorri leggermente verso l'alto per ottenere più sovrapposizione, poi scorri lentamente verso il basso.", + "autoUnavailable": "Impossibile avviare lo scorrimento automatico: questa pagina non consente lo scorrimento da parte dell'estensione, oppure lo script di cattura non è riuscito a connettersi. Aggiorna e riprova, oppure scegli «Scorro io» o «Area visibile»." + }, + "mode": "Modalità di cattura", + "modes": { + "auto": "Pagina intera · Automatica", + "manual": "Immagine lunga · Scorro io", + "visible": "Area visibile" + }, + "manualHint": "Modalità manuale: chiudi questo popup e scorri lentamente verso il basso, mantenendo un contenuto sovrapposto. Riaprilo qui e scegli Fine per salvare.", + "pausedHint": "In pausa. Puoi caricare altro contenuto, quindi riprendere dalla posizione catturata.", + "pause": "Pausa", + "resume": "Riprendi", + "finish": "Termina e conserva", + "exporting": "Esportazione", + "partial": "La parte catturata è stata conservata.", + "useManual": "Usa scorrimento manuale" + }, + "audit": { + "title": "Controllo delle operazioni", + "cardDesc": "Informazioni sul controllo delle operazioni", + "enabledLabel": "Registra cronologia delle operazioni", + "loading": "Caricamento…", + "retry": "Riprova", + "viewAll": "Vedi tutto", + "allTasks": "Tutte le attività", + "untitled": "Attività del browser", + "operationCount": "{{count}} operazioni", + "errorCount": "{{count}} errori", + "fileCount": "{{count}} file", + "dialogCount": "{{count}} finestre di dialogo di pagina gestite automaticamente", + "helpOutcome": "Esito della presa in carico umana", + "partialLabel": "Cronologia parziale", + "partialDescription": "La registrazione è iniziata alle {{time}}. Gli intervalli in pausa non sono stati registrati; consulta la sequenza temporale qui sotto.", + "inputRedacted": "Contenuto di input nascosto", + "empty": "Nessuna attività registrata finora. Le future operazioni di BrowserSkill appariranno qui.", + "disconnected": "Il servizio locale è disconnesso. Avvia il servizio BrowserSkill e riprova. La cronologia esistente resta sul tuo computer.", + "unsupported": "Questo servizio locale non supporta il controllo delle operazioni. Aggiorna bsk e riprova.", + "requestFailed": "Impossibile leggere o salvare la cronologia di controllo. Verifica l'archiviazione locale e la disponibilità dell'attività, oppure riprova dopo il termine dell'attività.", + "privacyShort": "Salvato localmente per 30 giorni. Il contenuto di input è nascosto.", + "privacyFull": "La cronologia resta sul tuo computer. Le attività terminate vengono conservate per 30 giorni. Corpi di input, script, testo della pagina e percorsi e parametri URL non vengono salvati. I nomi delle destinazioni ricevono un oscuramento di base. Le esportazioni contengono gli stessi record oscurati.", + "resultNote": "«Operazione completata» significa che la chiamata allo strumento è terminata, non che il sito web abbia confermato un risultato operativo. I risultati mancanti sono contrassegnati come «Esito sconosciuto».", + "technicalDetails": "Dettagli dell'operazione", + "timeline": "Sequenza temporale delle operazioni", + "export": "Esporta cronologia", + "delete": "Elimina cronologia", + "deleteConfirm": "Eliminare la cronologia di controllo locale di questa attività? L'operazione non può essere annullata.", + "cancel": "Annulla", + "openDirectory": "Apri cartella", + "loadMore": "Carica altro", + "status": { + "running": "In corso", + "ended": "Terminata", + "interrupted": "Interrotta", + "completed": "Operazione completata", + "error": "Errore dell'operazione", + "unknown": "Esito sconosciuto", + "cancelled": "Annullata" + }, + "marker": { + "started": "Registrazione avviata", + "ended": "Sessione terminata", + "paused": "Registrazione in pausa · operazioni successive non registrate", + "resumed": "Registrazione ripresa · intervallo precedente non registrato", + "user_interrupt": "Arresto richiesto dall'utente", + "event": "Evento di sessione" + }, + "methods": { + "tabList": "Elenca schede", + "tabCreate": "Apri scheda", + "tabClose": "Chiudi scheda", + "tabSelect": "Cambia scheda", + "tabBorrow": "Richiedi scheda in prestito", + "tabReturn": "Restituisci scheda", + "navigate": "Apri pagina", + "navigateBack": "Vai indietro", + "navigateForward": "Vai avanti", + "reload": "Ricarica pagina", + "click": "Clic", + "fill": "Compila", + "press": "Premi tasto", + "select": "Seleziona opzione", + "hover": "Passa sopra", + "focus": "Attiva focus", + "blur": "Rimuovi focus", + "scroll": "Scorri", + "upload": "Carica file", + "download": "Scarica file", + "read": "Leggi pagina", + "screenshot": "Cattura screenshot", + "console": "Leggi console", + "network": "Leggi informazioni di rete", + "evaluate": "Esegui script di pagina", + "wait": "Attendi", + "help": "Richiedi aiuto umano", + "recordStart": "Avvia registrazione operazioni", + "recordStop": "Ferma registrazione operazioni", + "recordAwait": "Attendi registrazione", + "resize": "Ridimensiona finestra", + "emulate": "Modifica impostazioni di emulazione" + } + } +} diff --git a/packages/i18n/src/locales/ja-JP/common.json b/packages/i18n/src/locales/ja-JP/common.json new file mode 100644 index 00000000..e46ba7c8 --- /dev/null +++ b/packages/i18n/src/locales/ja-JP/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "bsk CLI 経由で、ログイン済みのブラウザを AI エージェントから操作します" + } +} diff --git a/packages/i18n/src/locales/ja-JP/extension.json b/packages/i18n/src/locales/ja-JP/extension.json new file mode 100644 index 00000000..f57218f3 --- /dev/null +++ b/packages/i18n/src/locales/ja-JP/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "古いバージョンのデーモンに接続しています(プロトコル v{{cliProtocol}})。自動化設定を完全にサポートするには、CLI とデーモンを更新してください。", + "brandCategory": "ブラウザ自動化", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "未接続", + "connecting": "接続中…", + "connected": "接続済み", + "version_skew": "接続済み", + "disabled": "接続オフ" + }, + "stateDetail": { + "disconnected": "BrowserSkill を開いて接続してください。", + "connecting": "BrowserSkill に接続中…", + "connected": "自動化タスクを実行できます。", + "version_skew": "プロトコルのバージョンが異なります。アップグレードしてください。" + }, + "stateBadge": { + "disconnected": "待機中", + "connecting": "起動中", + "connected": "準備完了", + "version_skew": "アップグレード可能", + "disabled": "オフ" + }, + "connectionToggleTitle": "BrowserSkill 接続", + "controlHintsToggleTitle": "操作ヒント", + "controlHintsToggleHint": "エージェントがページを操作している間、ステータス表示とオレンジ色の光を表示します。", + "controlHintsInfoLabel": "操作ヒントについて", + "daemonPortLabel": "ローカルポート", + "daemonPortHint": "このポートでローカルデーモンに接続します。まずデーモンを起動し、このポートで待ち受けるように設定してください。この設定は拡張機能の接続アドレスのみを変更し、ローカルの CLI 設定は変更しません。変更を保存すると現在のセッションは終了し、接続が有効な場合は再接続します。", + "daemonPortInfoLabel": "ローカルポートについて", + "daemonPortInvalid": "1〜65535 の範囲でポート番号を入力してください。", + "daemonPortSave": "ポートを保存", + "daemonPortSaving": "保存中…", + "daemonPortReadFailed": "ポートを読み込めませんでした。このポップアップを開き直して再試行してください。", + "daemonPortWriteFailed": "ポートを保存できませんでした。もう一度お試しください。", + "daemonUnreachable": "接続できません。デーモンが起動していること、ポートが一致していることを確認してください。", + "versionSkewWarning": "拡張機能のプロトコル v{{extensionProtocol}}、CLI のプロトコル v{{cliProtocol}}。プロトコルのバージョンが異なります — アップグレードしてください。", + "upgradeAvailable": "アップグレード可能", + "launcher": { + "title": "クイックアクション" + }, + "back": "戻る", + "runtimeTitle": "ランタイム", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "拡張機能 v{{version}}", + "extensionVersionHint": "拡張機能のバージョン", + "daemonVersionHint": "bsk のバージョン", + "protocolVersion": "プロトコル v{{version}}", + "extensionProtocol": "拡張機能のプロトコル v{{version}}", + "daemonProtocol": "デーモンのプロトコル v{{version}}", + "instanceTitle": "インスタンス ID", + "instanceDescription": "このブラウザ固有の接続識別子", + "copy": "コピー", + "copied": "コピーしました", + "copyInstanceId": "インスタンス ID をコピー", + "record": { + "sectionTitle": "操作の記録", + "cardDesc": "エージェントが参照できるよう、あなたの操作を記録します", + "sectionHint": "記録用の指示を生成します — これをエージェントに送ると操作の記録が始まり、生成された trace バンドルを使ってエージェントが同様のタスクを自動化できるようになります。", + "topicLabel": "トピック(任意)", + "topicPlaceholder": "例:記事を公開する", + "startUrlLabel": "開始 URL(任意)", + "startUrlPlaceholder": "https://…", + "copyButton": "記録の指示をコピー", + "copied": "コピーしました", + "hintDisconnected": "接続すると利用できます", + "promptTemplate": "これから私が行うブラウザ操作を、BrowserSkill の `bsk` CLI を使って記録してください。\n\n手順:\n1. 次を実行してください:{{command}}\n2. 開始したことを確認したら、開いたウィンドウで私自身が操作します。\n3. 私が「完了」をクリックしたら、生成された `./trace` バンドル(`trace.json` + `states/`)を読み込み、私が行った内容を要約してください。" + }, + "interaction": { + "title": "自動化設定", + "confirmTabBorrow": "タブを借用する前に確認する", + "confirmTabBorrowHint": "オンにすると、すでに開いているタブを借用する前に許可を求めます。オフにすると、そのまま借用します。", + "requestHelpEnabled": "人によるサポート要求を許可する", + "requestHelpEnabledHint": "オンにすると、エージェントはあなたにサポートを求めることができます。オフにすると、エージェントは自律的にタスクを完了しようとし、解決できないステップを報告します。", + "scope": "このブラウザプロファイルに自動的に保存され、拡張機能に届くすべてのセッションリクエストに適用されます。コマンドラインオプションでは上書きできません。古い CLI やデーモンではサポート要求がローカルで終了することがあります。完全にサポートするには、3 つのコンポーネントすべてを更新してください。", + "readFailed": "設定を読み込めませんでした。拡張機能を開き直してください。", + "writeFailed": "保存できませんでした。設定は変更されていません。もう一度お試しください。", + "confirmTabBorrowInfoLabel": "タブ借用の確認について", + "requestHelpEnabledInfoLabel": "人によるサポート要求について" + }, + "remoteLocal": "ローカルに切り替え", + "remotePairing": "ペアリングリンク", + "remoteHint": "信頼できるサーバーの完全なペアリングリンクを貼り付けてください。ポートも含まれています。", + "remoteSave": "ペアリングを保存", + "remoteError": "ペアリングが完了しませんでした。サーバーの接続を確認するか、新しいペアリングリンクでもう一度お試しください。", + "remoteNeedsAttention": "要確認", + "remoteUnknown": "接続設定を利用できません", + "remoteStorageError": "接続設定を読み込めませんでした。BrowserSkill が自動的に再試行します。ローカルデーモンを明示的に選択して復旧することもできます。", + "remoteExpires": "認証の有効期限:{{date}}", + "remoteRenewing": "ブラウザの認証を更新中…", + "remoteRenewalFailed": "更新がサービスに到達できなかったか、正常に完了しませんでした。BrowserSkill が自動的に再試行します。現在の認証は期限が切れるまで引き続き使用できます。", + "remoteRejected": "サーバーが認証を拒否しました。サーバーを確認するか、新しいペアリングリンクを使用してください。", + "remoteExpired": "認証の有効期限が切れました。新しいペアリングリンクを使用して再接続してください。", + "remoteUnconfirmed": "最後に確認された認証は期限切れですが、更新が成功している可能性があります。BrowserSkill は保留中の更新を再試行しています。この状態が続く場合はサーバーを確認してください。", + "connectionSettings": "接続設定", + "connectionMode": "接続方式", + "connectionLocal": "ローカル", + "connectionRemote": "リモート", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "接続設定を読み込み中…", + "connectionDestination": "接続先:{{address}}", + "connectionPortHint": "空欄のままにすると、既定のポート {{port}} に戻ります。", + "connectionSaveWarning": "保存すると現在のタスクが終了し、接続スイッチがオンの場合は再接続します。", + "connectionLocalWarning": "ローカルに切り替えると現在のタスクが終了し、保存されているリモートの認証情報が削除されます。リモートに戻るには新しいペアリングリンクが必要です。", + "connectionCancel": "変更をキャンセル", + "connectionLocalError": "ローカルへの切り替えに失敗しました。もう一度お試しください。", + "connectionLocalSaved": "ローカルサービスに切り替えました。", + "connectionPortSaved": "ポートを保存しました。", + "remoteUnreachable": "リモートサービスに接続できません。サーバー、ネットワーク、または認証状態を確認してください。", + "remoteSaving": "ペアリング中…", + "remoteSaved": "ペアリングが完了しました。", + "remoteSavedDisabled": "ペアリングが完了しました。接続スイッチがオフです。接続するにはオンにしてください。", + "remoteFormatError": "ペアリングリンクが不完全か無効です。サーバーから提供された完全なリンクをコピーしてください。", + "remotePermissionsInfo": "リモート接続の権限について", + "remotePermissionsHint": "サーバーは専用のタスクウィンドウを制御できます。既存のタブを借用する際に確認を求めるかどうかは、以下の自動化設定に従います。" + }, + "controlOverlay": { + "status": "エージェントが操作中", + "interrupt": "中断", + "interrupting": "中断中…" + }, + "borrowConfirmation": { + "title": "タブの借用を許可しますか?", + "titleInactive": "エージェントがタブの借用を希望しています", + "body": "AI エージェントがこのタブを自分のワークスペースに移動しようとしています。借用を拒否または許可できます。", + "targetTab": "対象タブ:", + "autoDeny": "{{count}} 秒後にリクエストは期限切れになります", + "deny": "拒否", + "allow": "許可", + "notificationTitle": "BrowserSkill:エージェントがタブの借用を希望しています", + "notificationBody": "ブラウザ内の「{{tabTitle}}」の借用を承認または拒否してください。" + }, + "helpRequest": { + "title": "エージェントがあなたの助けを必要としています", + "compactStatus": "エージェントはこの手順が完了するのを待っています", + "noteLabel": "エージェントへのメモ(任意)", + "notePlaceholder": "エージェントへのメモを追加(任意)", + "continue": "完了、操作権限を返す", + "cancel": "リクエストをキャンセル", + "collapse": "折りたたむ", + "expand": "展開する", + "dragHandle": "ドラッグして移動", + "notificationTitle": "BrowserSkill:エージェントがあなたの助けを必要としています" + }, + "recordOverlay": { + "recording": "操作を記録しています", + "finish": "完了" + }, + "longScreenshot": { + "title": "ページ全体のスクリーンショット", + "cardDesc": "ページ全体をキャプチャして、プレビューし、保存します", + "description": "ページ全体を自動的にキャプチャするか、手動でスクロールして鮮明な長い画像を作成します。", + "hint": "自動モードは一番上から開始します。手動モードはここから開始し、ブラウザ内蔵ページやストアページでも動作します。", + "start": "キャプチャを開始", + "cancel": "キャンセル", + "cancelling": "キャンセルしてページを復元しています…", + "cancelled": "キャプチャをキャンセルしました。スクロール位置は復元されました。", + "preview": "プレビューを開く", + "download": "PNG をダウンロード", + "runningHint": "このタブを選択したままにしてください。ポップアップを閉じたり、一時停止してページを操作したりできます。再度ここを開くと再開または早めに完了できます。", + "pageProgress": "ページ全体のスクリーンショットを作成中…", + "zoom": "プレビューのズーム", + "fit": "幅に合わせる", + "loading": "プレビューを読み込み中…", + "previewHint": "ローカルに保存されます。プレビューのタイルは必要に応じて読み込まれ、ダウンロード時に完全な PNG が作成されます。保持したい画像は保存してください。", + "imageAlt": "{{title}} のページ全体のスクリーンショット", + "missingTitle": "スクリーンショットは利用できません", + "missingDescription": "このプレビューは期限切れになったか、削除された可能性があります。ウェブページに戻り、クイックアクションから再度キャプチャしてください。", + "downloadError": "ダウンロードを開始できませんでした。もう一度お試しください。", + "phase": { + "preparing": "キャプチャを準備中", + "capturing": "ページをキャプチャ中", + "saving": "PNG を作成中", + "complete": "スクリーンショットの準備ができました", + "cancelled": "キャンセルされました", + "error": "キャプチャが未完了です", + "paused": "一時停止中" + }, + "errors": { + "unsupported": "このページでは自動スクロールを利用できません。手動スクロールまたは表示範囲をお試しください。", + "unavailable": "ブラウザがこのキャプチャを許可しませんでした。拡張機能を再度クリックするか、ページのアクセス許可を確認してください。", + "busy": "このページは別のタスクで使用中か、すでにキャプチャが実行中です。完了までお待ちください。", + "changed": "キャプチャ中にページが変更されました。タブ、ウィンドウサイズ、ページ内容を変更せずに、もう一度お試しください。", + "tooLarge": "ブラウザがこの画像を処理できませんでした。キャプチャ範囲の調整をお試しください。", + "timeout": "このページ操作はタイムアウトしました。完了した部分は保存できます。", + "captureFailed": "スクリーンショットを完了できませんでした。ページは復元されました。もう一度お試しください。", + "saveFailed": "ローカルストレージが満杯か利用できません。空き容量を確保してもう一度お試しください。", + "interrupted": "キャプチャが中断されました。完了した部分は保存できます。", + "storageFull": "ローカルストレージが満杯です。空き容量を確保してください。キャプチャ済みの内容はプレビューとエクスポートに引き続き利用できます。", + "alignment": "これらのフレームを正確に揃えられませんでした。少し上にスクロールして重なりを増やしてから、ゆっくり下にスクロールしてください。", + "autoUnavailable": "自動スクロールを開始できませんでした。このページは拡張機能によるスクロールを許可していないか、キャプチャスクリプトが接続できませんでした。更新して再試行するか、「自分でスクロール」または「表示範囲」を選択してください。" + }, + "mode": "キャプチャモード", + "modes": { + "auto": "ページ全体・自動", + "manual": "長い画像・自分でスクロール", + "visible": "表示範囲" + }, + "manualHint": "手動モード:このポップアップを閉じ、内容が重なるようにゆっくり下にスクロールしてください。再度ここを開き、「完了」を選んで保存します。", + "pausedHint": "一時停止中です。さらにコンテンツを読み込んでから、キャプチャした位置から再開できます。", + "pause": "一時停止", + "resume": "再開", + "finish": "完了して保存", + "exporting": "エクスポート中", + "partial": "キャプチャした部分は保存されました。", + "useManual": "手動スクロールを使用" + }, + "audit": { + "title": "操作監査", + "cardDesc": "操作監査について", + "enabledLabel": "操作履歴を記録する", + "loading": "読み込み中…", + "retry": "再試行", + "viewAll": "すべて表示", + "allTasks": "すべてのタスク", + "untitled": "ブラウザタスク", + "operationCount": "{{count}} 件の操作", + "errorCount": "{{count}} 件のエラー", + "fileCount": "{{count}} 個のファイル", + "dialogCount": "{{count}} 個のページダイアログを自動処理しました", + "helpOutcome": "人による対応結果", + "partialLabel": "一部の履歴", + "partialDescription": "記録は {{time}} に開始しました。一時停止していた期間は記録されていません。以下のタイムラインをご確認ください。", + "inputRedacted": "入力内容は非表示です", + "empty": "まだ記録されたタスクはありません。今後の BrowserSkill の操作がここに表示されます。", + "disconnected": "ローカルサービスが切断されています。BrowserSkill サービスを起動してから再試行してください。既存の履歴はこのコンピューターに残っています。", + "unsupported": "このローカルサービスは操作監査に対応していません。bsk を更新してから再試行してください。", + "requestFailed": "監査履歴を読み込みまたは保存できませんでした。ローカルストレージとタスクの状態を確認するか、タスク終了後にもう一度お試しください。", + "privacyShort": "ローカルに 30 日間保存されます。入力内容は非表示です。", + "privacyFull": "履歴はこのコンピューターにのみ保存されます。終了したタスクは 30 日間保持されます。入力本文、スクリプト、ページのテキスト、URL のパスとパラメータは保存されません。対象名には基本的なマスキングが適用されます。エクスポートにも同じマスキング済みの記録が含まれます。", + "resultNote": "「操作完了」とは、ツール呼び出しが完了したことを意味し、ウェブサイトが業務上の結果を確認したことを意味しません。結果が不明な場合は「結果不明」と表示されます。", + "technicalDetails": "操作の詳細", + "timeline": "操作のタイムライン", + "export": "履歴をエクスポート", + "delete": "履歴を削除", + "deleteConfirm": "このタスクのローカル監査履歴を削除しますか? この操作は元に戻せません。", + "cancel": "キャンセル", + "openDirectory": "フォルダを開く", + "loadMore": "さらに読み込む", + "status": { + "running": "実行中", + "ended": "終了", + "interrupted": "中断", + "completed": "操作完了", + "error": "操作エラー", + "unknown": "結果不明", + "cancelled": "キャンセル済み" + }, + "marker": { + "started": "記録を開始しました", + "ended": "セッションが終了しました", + "paused": "記録を一時停止・以降の操作は記録されません", + "resumed": "記録を再開・直前の期間は記録されていません", + "user_interrupt": "ユーザーが停止を要求しました", + "event": "セッションイベント" + }, + "methods": { + "tabList": "タブの一覧を取得", + "tabCreate": "タブを開く", + "tabClose": "タブを閉じる", + "tabSelect": "タブを切り替える", + "tabBorrow": "タブの借用をリクエスト", + "tabReturn": "タブを返却", + "navigate": "ページを開く", + "navigateBack": "戻る", + "navigateForward": "進む", + "reload": "ページを再読み込み", + "click": "クリック", + "fill": "入力", + "press": "キーを押す", + "select": "オプションを選択", + "hover": "ホバー", + "focus": "フォーカス", + "blur": "フォーカス解除", + "scroll": "スクロール", + "upload": "ファイルをアップロード", + "download": "ファイルをダウンロード", + "read": "ページを読み取る", + "screenshot": "スクリーンショットを取得", + "console": "コンソールを読み取る", + "network": "ネットワーク情報を読み取る", + "evaluate": "ページスクリプトを実行", + "wait": "待機", + "help": "人によるサポートを要求", + "recordStart": "操作の記録を開始", + "recordStop": "操作の記録を停止", + "recordAwait": "記録の完了を待機", + "resize": "ウィンドウサイズを変更", + "emulate": "エミュレーション設定を変更" + } + } +} diff --git a/packages/i18n/src/locales/pt-BR/common.json b/packages/i18n/src/locales/pt-BR/common.json new file mode 100644 index 00000000..4ab629de --- /dev/null +++ b/packages/i18n/src/locales/pt-BR/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "Controle seu navegador já conectado a partir de agentes de IA usando a CLI do bsk" + } +} diff --git a/packages/i18n/src/locales/pt-BR/extension.json b/packages/i18n/src/locales/pt-BR/extension.json new file mode 100644 index 00000000..072b0c4b --- /dev/null +++ b/packages/i18n/src/locales/pt-BR/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "Conectado a um daemon mais antigo (protocolo v{{cliProtocol}}). Atualize a CLI e o daemon para ter suporte completo às configurações de automação.", + "brandCategory": "Automação do navegador", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "Desconectado", + "connecting": "Conectando…", + "connected": "Conectado", + "version_skew": "Conectado", + "disabled": "Conexão desativada" + }, + "stateDetail": { + "disconnected": "Abra o BrowserSkill para conectar.", + "connecting": "Conectando ao BrowserSkill…", + "connected": "Pronto para tarefas de automação.", + "version_skew": "As versões do protocolo são diferentes. Atualize, por favor." + }, + "stateBadge": { + "disconnected": "Em espera", + "connecting": "Iniciando", + "connected": "Pronto", + "version_skew": "Atualização disponível", + "disabled": "Desativado" + }, + "connectionToggleTitle": "Conexão do BrowserSkill", + "controlHintsToggleTitle": "Indicadores de controle", + "controlHintsToggleHint": "Mostra o indicador de status e o brilho laranja enquanto o agente controla uma página.", + "controlHintsInfoLabel": "Sobre os indicadores de controle", + "daemonPortLabel": "Porta local", + "daemonPortHint": "Conecte-se ao daemon local nesta porta. Primeiro inicie o daemon e faça com que ele escute nesta porta. Essa configuração altera apenas o endereço de conexão da extensão, não a configuração local da CLI. Salvar uma alteração encerra as sessões atuais e reconecta se a conexão estiver ativada.", + "daemonPortInfoLabel": "Sobre a porta local", + "daemonPortInvalid": "Informe uma porta entre 1 e 65535.", + "daemonPortSave": "Salvar porta", + "daemonPortSaving": "Salvando…", + "daemonPortReadFailed": "Não foi possível carregar a porta. Reabra este popup para tentar novamente.", + "daemonPortWriteFailed": "Não foi possível salvar a porta. Tente novamente.", + "daemonUnreachable": "Não é possível conectar. Verifique se o daemon está em execução e se a porta corresponde.", + "versionSkewWarning": "Protocolo da extensão v{{extensionProtocol}}, protocolo da CLI v{{cliProtocol}}. As versões do protocolo são diferentes — atualize, por favor.", + "upgradeAvailable": "Atualização disponível", + "launcher": { + "title": "Ações rápidas" + }, + "back": "Voltar", + "runtimeTitle": "Ambiente de execução", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "extensão v{{version}}", + "extensionVersionHint": "Versão da extensão", + "daemonVersionHint": "Versão do bsk", + "protocolVersion": "protocolo v{{version}}", + "extensionProtocol": "protocolo da extensão v{{version}}", + "daemonProtocol": "protocolo do daemon v{{version}}", + "instanceTitle": "ID da instância", + "instanceDescription": "Identificador de conexão exclusivo deste navegador", + "copy": "Copiar", + "copied": "Copiado", + "copyInstanceId": "Copiar ID da instância", + "record": { + "sectionTitle": "Gravação de ações", + "cardDesc": "Grave suas ações como referência para o agente", + "sectionHint": "Gera uma instrução de gravação — envie-a ao seu agente para iniciar a gravação das suas ações; o agente poderá então usar o pacote de trace resultante para automatizar tarefas semelhantes.", + "topicLabel": "Tópico (opcional)", + "topicPlaceholder": "ex.: Publicar um artigo", + "startUrlLabel": "URL inicial (opcional)", + "startUrlPlaceholder": "https://…", + "copyButton": "Copiar instruções de gravação", + "copied": "Copiado", + "hintDisconnected": "Disponível após conectar", + "promptTemplate": "Use a CLI `bsk` do BrowserSkill para gravar as ações do navegador que estou prestes a demonstrar.\n\nEtapas:\n1. Execute: {{command}}\n2. Assim que você confirmar que foi iniciado, eu mesmo vou operar na janela aberta.\n3. Depois que eu clicar em Concluir, leia o pacote `./trace` gerado (`trace.json` + `states/`) e resuma o que eu fiz." + }, + "interaction": { + "title": "Configurações de automação", + "confirmTabBorrow": "Confirmar antes de tomar guias emprestadas", + "confirmTabBorrowHint": "Quando ativado, pede confirmação antes de tomar emprestada uma guia que você já tem aberta. Quando desativado, empresta diretamente.", + "requestHelpEnabled": "Permitir solicitações de ajuda humana", + "requestHelpEnabledHint": "Quando ativado, o agente pode pedir sua ajuda. Quando desativado, ele tenta concluir a tarefa de forma autônoma e relata as etapas que não consegue resolver.", + "scope": "Salvo automaticamente para este perfil do navegador. Aplica-se a todas as solicitações de sessão que chegam à extensão; opções de linha de comando não podem substituí-lo. CLIs ou daemons mais antigos podem encerrar a ajuda localmente. Atualize os três componentes para suporte completo.", + "readFailed": "Não foi possível carregar as configurações. Reabra a extensão.", + "writeFailed": "Não foi possível salvar. Suas configurações não foram alteradas. Tente novamente.", + "confirmTabBorrowInfoLabel": "Sobre a confirmação de empréstimo de guia", + "requestHelpEnabledInfoLabel": "Sobre as solicitações de ajuda humana" + }, + "remoteLocal": "Mudar para local", + "remotePairing": "Link de pareamento", + "remoteHint": "Cole o link de pareamento completo de um servidor confiável. A porta está incluída.", + "remoteSave": "Salvar pareamento", + "remoteError": "O pareamento não foi concluído. Verifique a conexão com o servidor ou tente um novo link de pareamento.", + "remoteNeedsAttention": "Requer atenção", + "remoteUnknown": "Configurações de conexão indisponíveis", + "remoteStorageError": "Não foi possível ler as configurações de conexão. O BrowserSkill tentará novamente. Você também pode selecionar explicitamente o daemon local para recuperar.", + "remoteExpires": "A autorização expira: {{date}}", + "remoteRenewing": "Renovando a autorização do navegador…", + "remoteRenewalFailed": "A renovação não conseguiu alcançar o serviço ou não foi concluída com sucesso. O BrowserSkill tentará novamente; a autorização atual continua utilizável até expirar.", + "remoteRejected": "O servidor rejeitou a autorização. Verifique o servidor ou use um novo link de pareamento.", + "remoteExpired": "A autorização expirou. Use um novo link de pareamento para reconectar.", + "remoteUnconfirmed": "A última autorização confirmada expirou, mas uma renovação pode ter sido bem-sucedida. O BrowserSkill está tentando novamente a renovação pendente; verifique o servidor se isso continuar.", + "connectionSettings": "Configurações de conexão", + "connectionMode": "Modo de conexão", + "connectionLocal": "Local", + "connectionRemote": "Remoto", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "Lendo as configurações de conexão…", + "connectionDestination": "Conectar a: {{address}}", + "connectionPortHint": "Deixe em branco para restaurar a porta padrão, {{port}}.", + "connectionSaveWarning": "Salvar encerra as tarefas atuais e reconecta se o interruptor de conexão estiver ativado.", + "connectionLocalWarning": "Mudar para local encerra as tarefas atuais e remove a credencial remota salva. Voltar para remoto requer um novo link de pareamento.", + "connectionCancel": "Cancelar alterações", + "connectionLocalError": "Não foi possível mudar para local. Tente novamente.", + "connectionLocalSaved": "Mudou para o serviço local.", + "connectionPortSaved": "Porta salva.", + "remoteUnreachable": "Não é possível conectar ao serviço remoto. Verifique o servidor, a rede ou o status da autorização.", + "remoteSaving": "Pareando…", + "remoteSaved": "Pareamento concluído com sucesso.", + "remoteSavedDisabled": "Pareamento concluído com sucesso. O interruptor de conexão está desativado; ative-o para conectar.", + "remoteFormatError": "O link de pareamento está incompleto ou inválido. Copie o link completo fornecido pelo servidor.", + "remotePermissionsInfo": "Sobre as permissões de conexão remota", + "remotePermissionsHint": "O servidor pode controlar janelas de tarefas dedicadas. A confirmação para tomar guias existentes emprestadas segue as configurações de automação abaixo." + }, + "controlOverlay": { + "status": "O agente está no controle", + "interrupt": "Interromper", + "interrupting": "Interrompendo…" + }, + "borrowConfirmation": { + "title": "Permitir empréstimo da guia?", + "titleInactive": "O agente quer tomar uma guia emprestada", + "body": "Um agente de IA quer mover esta guia para seu espaço de trabalho. Você pode negar ou permitir o empréstimo.", + "targetTab": "Guia de destino:", + "autoDeny": "A solicitação expira em {{count}} s", + "deny": "Negar", + "allow": "Permitir", + "notificationTitle": "BrowserSkill: o agente quer tomar uma guia emprestada", + "notificationBody": "Aprove ou negue o empréstimo de “{{tabTitle}}” no seu navegador." + }, + "helpRequest": { + "title": "O agente precisa da sua ajuda", + "compactStatus": "O agente ainda está esperando que você conclua esta etapa", + "noteLabel": "Nota opcional para o agente", + "notePlaceholder": "Adicione uma nota para o agente (opcional)", + "continue": "Concluído, devolver o controle", + "cancel": "Cancelar solicitação", + "collapse": "Recolher", + "expand": "Expandir", + "dragHandle": "Arraste para mover", + "notificationTitle": "BrowserSkill: o agente precisa da sua ajuda" + }, + "recordOverlay": { + "recording": "Gravando suas ações", + "finish": "Concluir" + }, + "longScreenshot": { + "title": "Captura de tela da página inteira", + "cardDesc": "Capture uma página inteira, visualize e salve", + "description": "Capture uma página inteira automaticamente ou role manualmente para criar uma imagem longa e nítida.", + "hint": "O modo automático começa do topo. O modo manual começa aqui e também funciona em páginas do navegador e da loja.", + "start": "Iniciar captura", + "cancel": "Cancelar", + "cancelling": "Cancelando e restaurando a página…", + "cancelled": "Captura cancelada. Sua posição de rolagem foi restaurada.", + "preview": "Abrir visualização", + "download": "Baixar PNG", + "runningHint": "Mantenha esta guia selecionada. Você pode fechar o popup ou pausar para interagir com a página. Reabra aqui para continuar ou terminar antecipadamente.", + "pageProgress": "Criando captura de tela da página inteira…", + "zoom": "Zoom da visualização", + "fit": "Ajustar à largura", + "loading": "Carregando visualização…", + "previewHint": "Salvo localmente. Os blocos da visualização são carregados conforme necessário; o download cria o PNG completo. Salve as imagens que deseja manter.", + "imageAlt": "Captura de tela da página inteira de {{title}}", + "missingTitle": "Captura de tela indisponível", + "missingDescription": "Esta visualização pode ter expirado ou sido removida. Volte à página web e capture-a novamente nas ações rápidas.", + "downloadError": "Não foi possível iniciar o download. Tente novamente.", + "phase": { + "preparing": "Preparando captura", + "capturing": "Capturando página", + "saving": "Criando PNG", + "complete": "Captura pronta", + "cancelled": "Cancelada", + "error": "Captura incompleta", + "paused": "Pausada" + }, + "errors": { + "unsupported": "A rolagem automática não está disponível aqui. Tente a rolagem manual ou a área visível.", + "unavailable": "O navegador não permitiu esta captura. Clique novamente na extensão ou verifique as permissões de acesso à página.", + "busy": "Outra tarefa está usando esta página, ou uma captura já está em andamento. Aguarde a conclusão.", + "changed": "A página mudou durante a captura. Mantenha a guia, o tamanho da janela e o conteúdo da página estáveis e tente novamente.", + "tooLarge": "O navegador não conseguiu processar esta imagem. Tente ajustar a área de captura.", + "timeout": "Esta operação de página expirou. Você pode salvar a parte concluída.", + "captureFailed": "Não foi possível concluir a captura de tela. A página foi restaurada. Tente novamente.", + "saveFailed": "O armazenamento local está cheio ou indisponível. Libere espaço e tente novamente.", + "interrupted": "A captura foi interrompida. Você pode salvar a parte concluída.", + "storageFull": "O armazenamento local está cheio. Libere espaço; o conteúdo capturado continua disponível para visualização e exportação.", + "alignment": "Não foi possível alinhar esses quadros de forma confiável. Role um pouco para cima para obter mais sobreposição e depois role devagar para baixo.", + "autoUnavailable": "Não foi possível iniciar a rolagem automática: esta página não permite rolagem pela extensão, ou o script de captura não conseguiu se conectar. Atualize e tente novamente, ou escolha “Eu rolo” ou “Área visível”." + }, + "mode": "Modo de captura", + "modes": { + "auto": "Página inteira · Automático", + "manual": "Imagem longa · Eu rolo", + "visible": "Área visível" + }, + "manualHint": "Modo manual: feche este popup e role devagar para baixo, mantendo conteúdo sobreposto. Reabra aqui e escolha Concluir para salvar.", + "pausedHint": "Pausado. Você pode carregar mais conteúdo e depois retomar a partir da posição capturada.", + "pause": "Pausar", + "resume": "Retomar", + "finish": "Concluir e manter", + "exporting": "Exportando", + "partial": "A parte capturada foi mantida.", + "useManual": "Usar rolagem manual" + }, + "audit": { + "title": "Auditoria de operações", + "cardDesc": "Sobre a auditoria de operações", + "enabledLabel": "Registrar histórico de operações", + "loading": "Carregando…", + "retry": "Tentar novamente", + "viewAll": "Ver tudo", + "allTasks": "Todas as tarefas", + "untitled": "Tarefa do navegador", + "operationCount": "{{count}} operações", + "errorCount": "{{count}} erros", + "fileCount": "{{count}} arquivos", + "dialogCount": "{{count}} caixas de diálogo de página tratadas automaticamente", + "helpOutcome": "Resultado da intervenção humana", + "partialLabel": "Histórico parcial", + "partialDescription": "A gravação começou às {{time}}. Os intervalos pausados não foram registrados; veja a linha do tempo abaixo.", + "inputRedacted": "Conteúdo de entrada oculto", + "empty": "Nenhuma tarefa registrada ainda. Futuras operações do BrowserSkill aparecerão aqui.", + "disconnected": "O serviço local está desconectado. Inicie o serviço BrowserSkill e tente novamente. O histórico existente permanece no seu computador.", + "unsupported": "Este serviço local não oferece suporte à auditoria de operações. Atualize o bsk e tente novamente.", + "requestFailed": "Não foi possível ler ou salvar o histórico de auditoria. Verifique o armazenamento local e a disponibilidade da tarefa, ou tente novamente após a conclusão da tarefa.", + "privacyShort": "Salvo localmente por 30 dias. O conteúdo de entrada está oculto.", + "privacyFull": "O histórico permanece no seu computador. Tarefas concluídas são mantidas por 30 dias. Corpos de entrada, scripts, texto da página e caminhos e parâmetros de URL não são salvos. Os nomes dos alvos recebem uma ocultação básica. As exportações contêm os mesmos registros ocultados.", + "resultNote": "“Operação concluída” significa que a chamada da ferramenta terminou, não que o site tenha confirmado um resultado de negócio. Resultados ausentes são marcados como “Resultado desconhecido”.", + "technicalDetails": "Detalhes da operação", + "timeline": "Linha do tempo das operações", + "export": "Exportar histórico", + "delete": "Excluir histórico", + "deleteConfirm": "Excluir o histórico de auditoria local desta tarefa? Esta ação não pode ser desfeita.", + "cancel": "Cancelar", + "openDirectory": "Abrir pasta", + "loadMore": "Carregar mais", + "status": { + "running": "Em andamento", + "ended": "Encerrada", + "interrupted": "Interrompida", + "completed": "Operação concluída", + "error": "Erro na operação", + "unknown": "Resultado desconhecido", + "cancelled": "Cancelada" + }, + "marker": { + "started": "Gravação iniciada", + "ended": "Sessão encerrada", + "paused": "Gravação pausada · operações seguintes não registradas", + "resumed": "Gravação retomada · intervalo anterior não registrado", + "user_interrupt": "Usuário solicitou parada", + "event": "Evento de sessão" + }, + "methods": { + "tabList": "Listar guias", + "tabCreate": "Abrir guia", + "tabClose": "Fechar guia", + "tabSelect": "Trocar de guia", + "tabBorrow": "Solicitar guia emprestada", + "tabReturn": "Devolver guia", + "navigate": "Abrir página", + "navigateBack": "Voltar", + "navigateForward": "Avançar", + "reload": "Recarregar página", + "click": "Clicar", + "fill": "Preencher", + "press": "Pressionar tecla", + "select": "Selecionar opção", + "hover": "Passar o mouse", + "focus": "Focar", + "blur": "Remover foco", + "scroll": "Rolar", + "upload": "Enviar arquivos", + "download": "Baixar arquivo", + "read": "Ler página", + "screenshot": "Capturar tela", + "console": "Ler console", + "network": "Ler informações de rede", + "evaluate": "Executar script da página", + "wait": "Aguardar", + "help": "Solicitar ajuda humana", + "recordStart": "Iniciar gravação de operações", + "recordStop": "Parar gravação de operações", + "recordAwait": "Aguardar gravação", + "resize": "Redimensionar janela", + "emulate": "Alterar configurações de emulação" + } + } +} diff --git a/packages/i18n/src/locales/zh-TW/common.json b/packages/i18n/src/locales/zh-TW/common.json new file mode 100644 index 00000000..09f91bc2 --- /dev/null +++ b/packages/i18n/src/locales/zh-TW/common.json @@ -0,0 +1,6 @@ +{ + "app": { + "name": "browser-skill", + "description": "透過 bsk CLI 讓 AI Agent 操作您已登入的瀏覽器" + } +} diff --git a/packages/i18n/src/locales/zh-TW/extension.json b/packages/i18n/src/locales/zh-TW/extension.json new file mode 100644 index 00000000..b44ba6ec --- /dev/null +++ b/packages/i18n/src/locales/zh-TW/extension.json @@ -0,0 +1,294 @@ +{ + "popup": { + "interactionCompatibilityWarning": "已連線至舊版 Daemon(通訊協定 v{{cliProtocol}})。部分自動化設定需要更新 CLI 和 Daemon 才能完整生效。", + "brandCategory": "Browser Automation", + "brandName": "BrowserSkill", + "stateLabel": { + "disconnected": "未連線", + "connecting": "連線中…", + "connected": "已連線", + "version_skew": "已連線", + "disabled": "連線已關閉" + }, + "stateDetail": { + "disconnected": "請先開啟 BrowserSkill。", + "connecting": "正在連線 BrowserSkill…", + "connected": "可接收自動化工作。", + "version_skew": "通訊協定版本不同,請盡快升級。" + }, + "stateBadge": { + "disconnected": "Standby", + "connecting": "Igniting", + "connected": "Ready", + "version_skew": "可升級", + "disabled": "Off" + }, + "connectionToggleTitle": "BrowserSkill 連線", + "controlHintsToggleTitle": "控制提示", + "controlHintsToggleHint": "Agent 控制頁面時顯示提示條和橙色閃光。", + "controlHintsInfoLabel": "控制提示說明", + "daemonPortLabel": "本機連接埠", + "daemonPortHint": "透過此連接埠連線本機 daemon,請先啟動 daemon 並讓其監聽此連接埠。此設定僅變更擴充功能的連線位址,不會修改本機 CLI 設定。儲存變更會結束目前的工作階段,並在連線開關開啟時重新連線。", + "daemonPortInfoLabel": "本機連接埠說明", + "daemonPortInvalid": "請輸入 1 到 65535 之間的連接埠號碼。", + "daemonPortSave": "儲存連接埠", + "daemonPortSaving": "儲存中…", + "daemonPortReadFailed": "無法讀取連接埠,請重新開啟彈出視窗後再試一次。", + "daemonPortWriteFailed": "連接埠儲存失敗,請再試一次。", + "daemonUnreachable": "無法連線,請確認 daemon 已啟動且連接埠一致。", + "versionSkewWarning": "擴充功能通訊協定 v{{extensionProtocol}},CLI 通訊協定 v{{cliProtocol}}。通訊協定版本不同,請盡快升級。", + "upgradeAvailable": "可升級", + "launcher": { + "title": "快速功能" + }, + "back": "返回", + "runtimeTitle": "執行版本", + "daemonVersion": "daemon v{{version}}", + "extensionVersion": "擴充功能 v{{version}}", + "extensionVersionHint": "擴充功能版本", + "daemonVersionHint": "bsk 版本", + "protocolVersion": "通訊協定 v{{version}}", + "extensionProtocol": "擴充功能通訊協定 v{{version}}", + "daemonProtocol": "daemon 通訊協定 v{{version}}", + "instanceTitle": "執行個體 ID", + "instanceDescription": "本瀏覽器的唯一連線識別碼", + "copy": "複製", + "copied": "已複製", + "copyInstanceId": "複製執行個體 ID", + "record": { + "sectionTitle": "操作錄製", + "cardDesc": "錄製你的操作,供 Agent 參考", + "sectionHint": "產生一段錄製指令,傳送給 Agent 後即可啟動並錄製使用者操作,之後 Agent 可以參考產生的 trace 目錄套件自動完成同類工作。", + "topicLabel": "操作主題(選填)", + "topicPlaceholder": "例如:發布一篇文章", + "startUrlLabel": "起始網址(選填)", + "startUrlPlaceholder": "https://…", + "copyButton": "複製錄製指令", + "copied": "已複製", + "hintDisconnected": "連線後可用", + "promptTemplate": "用 BrowserSkill 的 `bsk` CLI 錄製我接下來的瀏覽器操作。\n\n步驟:\n1. 執行:{{command}}\n2. 你確認已開始後,我會在開啟的視窗裡自行操作。\n3. 我按下「完成」後,讀取寫出的 `./trace` 目錄套件(`trace.json` + `states/`),總結我做了什麼。" + }, + "interaction": { + "title": "自動化設定", + "confirmTabBorrow": "借用分頁前確認", + "confirmTabBorrowHint": "開啟時,借用你已開啟的分頁前會請求允許;關閉時,直接借用。", + "requestHelpEnabled": "允許請求人工協助", + "requestHelpEnabledHint": "開啟時,Agent 可以請求你協助。關閉時,Agent 會盡力自行完成操作,遇到無法處理的步驟再回報受阻。", + "scope": "自動儲存至目前瀏覽器設定檔,對所有送達擴充功能的工作階段請求生效;命令列參數無法覆寫。舊版 CLI 或 Daemon 可能會在本機結束求助,完整支援需更新三端。", + "readFailed": "無法讀取自動化設定,請重新開啟擴充功能。", + "writeFailed": "儲存失敗,設定未變更,請再試一次。", + "confirmTabBorrowInfoLabel": "借用分頁確認說明", + "requestHelpEnabledInfoLabel": "人工協助說明" + }, + "remoteLocal": "切換至本機", + "remotePairing": "配對連結", + "remoteHint": "貼上可信伺服器的完整配對連結,連接埠已包含在內。", + "remoteSave": "儲存配對", + "remoteError": "配對未完成,請檢查伺服器連線,或取得新的配對連結後重試。", + "remoteNeedsAttention": "需要注意", + "remoteUnknown": "無法讀取連線設定", + "remoteStorageError": "無法讀取連線設定,系統會自動重試。你也可以主動選擇本機連線以復原使用。", + "remoteExpires": "授權到期時間:{{date}}", + "remoteRenewing": "正在續期瀏覽器授權…", + "remoteRenewalFailed": "續期未能連上服務,或未能順利完成。系統會自動重試,現有授權在到期前仍可使用。", + "remoteRejected": "伺服器拒絕了授權。請檢查伺服器狀態,或使用新的配對連結。", + "remoteExpired": "授權已過期,請使用新的配對連結重新連線。", + "remoteUnconfirmed": "上次確認的授權已過期,但先前的續期可能已成功。系統正在重試待確認的續期;若持續發生,請檢查伺服器狀態。", + "connectionSettings": "連線設定", + "connectionMode": "連線方式", + "connectionLocal": "本機", + "connectionRemote": "遠端", + "connectionCurrent": "{{mode}} · {{address}}", + "connectionLoading": "正在讀取連線設定…", + "connectionDestination": "將連線至:{{address}}", + "connectionPortHint": "留空以還原預設連接埠 {{port}}。", + "connectionSaveWarning": "儲存後會結束目前的工作,並在連線開關開啟時重新連線。", + "connectionLocalWarning": "切回本機將結束目前的工作,並移除已儲存的遠端憑證。再次連線遠端需要新的配對連結。", + "connectionCancel": "取消變更", + "connectionLocalError": "切換至本機失敗,請再試一次。", + "connectionLocalSaved": "已切換至本機服務。", + "connectionPortSaved": "連接埠已儲存。", + "remoteUnreachable": "無法連線至遠端服務,請檢查伺服器、網路或授權狀態。", + "remoteSaving": "正在配對…", + "remoteSaved": "配對成功。", + "remoteSavedDisabled": "配對成功,連線開關目前已關閉,請開啟後再連線。", + "remoteFormatError": "配對連結不完整或格式不正確,請重新複製伺服器提供的完整連結。", + "remotePermissionsInfo": "遠端連線權限說明", + "remotePermissionsHint": "伺服器可操作專用的工作視窗。借用既有分頁時是否需要確認,取決於下方的「自動化設定」。" + }, + "controlOverlay": { + "status": "Agent 正在控制", + "interrupt": "中斷", + "interrupting": "中斷中…" + }, + "borrowConfirmation": { + "title": "允許借用分頁?", + "titleInactive": "Agent 請求借用分頁", + "body": "AI Agent 希望將此分頁移入工作區。您可以拒絕或允許借用。", + "targetTab": "目標分頁:", + "autoDeny": "{{count}} 秒後自動拒絕", + "deny": "拒絕", + "allow": "允許", + "notificationTitle": "BrowserSkill:Agent 請求借用分頁", + "notificationBody": "請在瀏覽器中允許或拒絕對「{{tabTitle}}」的借用。" + }, + "helpRequest": { + "title": "Agent 需要你的協助", + "compactStatus": "目前 Agent 仍在等待你完成此步驟", + "noteLabel": "給 Agent 的備註(選填)", + "notePlaceholder": "給 Agent 留言(選填)", + "continue": "完成並交還控制權", + "cancel": "取消請求", + "collapse": "摺疊", + "expand": "展開", + "dragHandle": "拖曳以移動", + "notificationTitle": "BrowserSkill:Agent 需要你的協助" + }, + "recordOverlay": { + "recording": "正在錄製你的操作", + "finish": "結束" + }, + "longScreenshot": { + "title": "整頁截圖", + "cardDesc": "從網頁頂部截到底部,預覽並儲存長圖", + "description": "自動捲動整頁,或手動捲動擷取,將內容拼成清晰長圖。", + "hint": "選擇擷取方式。整頁模式從頂部開始;手動模式從目前位置開始,可用於瀏覽器內建頁面和商店頁面。", + "start": "開始截圖", + "cancel": "取消", + "cancelling": "正在取消並還原頁面…", + "cancelled": "截圖已取消,頁面位置已還原。", + "preview": "開啟預覽", + "download": "下載 PNG", + "runningHint": "請保持目前分頁開啟。可關閉彈出視窗,或暫停後操作頁面;重新開啟這裡可繼續或提前完成。", + "pageProgress": "正在製作整頁截圖…", + "zoom": "預覽縮放", + "fit": "符合寬度", + "loading": "正在載入預覽…", + "previewHint": "截圖儲存在本機。預覽依需要載入,下載時產生完整 PNG,請儲存需要保留的圖片。", + "imageAlt": "{{title}} 的完整網頁截圖", + "missingTitle": "截圖暫不可用", + "missingDescription": "預覽可能已過期或已被清除。請回到網頁,透過快速功能重新截圖。", + "downloadError": "未能開始下載,請再試一次。", + "phase": { + "preparing": "正在準備截圖", + "capturing": "正在擷取長圖", + "saving": "正在產生 PNG", + "complete": "整頁截圖已完成", + "cancelled": "已取消", + "error": "截圖未完成", + "paused": "已暫停" + }, + "errors": { + "unsupported": "此頁面無法自動捲動,請嘗試「我來捲動」或「目前可視範圍」。", + "unavailable": "瀏覽器未允許擷取此頁面畫面。請重新點擊擴充功能後再試一次,或檢查頁面存取權限。", + "busy": "頁面正在被其他工作使用,或已有截圖工作。請等待工作結束後再試一次。", + "changed": "頁面在截圖過程中發生變化。請保持分頁、視窗大小和頁面內容穩定後再試一次。", + "tooLarge": "瀏覽器無法處理目前圖片,請嘗試調整截圖範圍。", + "timeout": "本次頁面操作等待逾時,可儲存已完成的部分。", + "captureFailed": "未能完成截圖,頁面已還原。請稍後再試一次。", + "saveFailed": "本機儲存空間不足或不可用,無法儲存預覽。請釋放空間後再試一次。", + "interrupted": "擷取意外中斷,可儲存已完成的部分。", + "storageFull": "本機可用儲存空間不足,請釋放空間。已擷取的內容仍可預覽和匯出。", + "alignment": "未能可靠對齊畫面。請往回捲動一點,保留更多重疊範圍,再緩慢向下捲動。", + "autoUnavailable": "未能啟動自動捲動:此頁面未允許擴充功能控制捲動,或截圖指令碼無法連線。可重新整理頁面後再試一次,或選擇「我來捲動」或「目前可視範圍」。" + }, + "mode": "擷取方式", + "modes": { + "auto": "整頁 · 自動捲動", + "manual": "長圖 · 我來捲動", + "visible": "目前可視範圍" + }, + "manualHint": "手動捲動模式:關閉彈出視窗後緩慢向下捲動,每次保留一部分重疊畫面。重新開啟這裡,點擊「完成」儲存。", + "pausedHint": "已暫停,可以載入更多內容。點擊「繼續」後將從已擷取位置接著截圖。", + "pause": "暫停", + "resume": "繼續", + "finish": "完成並保留", + "exporting": "正在匯出", + "partial": "已保留完成的部分。", + "useManual": "改用手動捲動" + }, + "audit": { + "title": "操作稽核", + "cardDesc": "操作稽核介紹", + "enabledLabel": "開啟操作稽核", + "loading": "正在載入…", + "retry": "重試", + "viewAll": "檢視全部", + "allTasks": "全部工作", + "untitled": "瀏覽器工作", + "operationCount": "{{count}} 次操作", + "errorCount": "{{count}} 則錯誤", + "fileCount": "{{count}} 個檔案", + "dialogCount": "自動處理了 {{count}} 個網頁對話方塊", + "helpOutcome": "人工接手結果", + "partialLabel": "部分記錄", + "partialDescription": "本次稽核從 {{time}} 開始。中途暫停的時間段未記錄,詳細位置請見下方時間軸。", + "inputRedacted": "輸入內容已隱藏", + "empty": "尚無工作記錄。之後透過 BrowserSkill 執行的操作會顯示在這裡。", + "disconnected": "本機服務未連線。啟動 BrowserSkill 本機服務後再試一次,既有記錄仍會儲存在電腦上。", + "unsupported": "目前的本機服務尚不支援操作稽核,請更新 bsk 後再試一次。", + "requestFailed": "無法讀取或儲存稽核記錄。請檢查本機儲存空間,確認工作仍存在且未在執行後再試一次。", + "privacyShort": "僅儲存在本機,預設保留 30 天。輸入內容已隱藏。", + "privacyFull": "記錄僅儲存在本機,已結束的工作保留 30 天。輸入內文、指令碼、頁面內文以及網址路徑與參數不會儲存;目標名稱會做基本去識別化。匯出內容包含相同的去識別化記錄。", + "resultNote": "「操作完成」表示工具呼叫已完成,不代表網站業務已成功;未取得結果的操作會標記為「結果未知」。", + "technicalDetails": "檢視操作詳情", + "timeline": "操作時間軸", + "export": "匯出記錄", + "delete": "刪除記錄", + "deleteConfirm": "刪除這次工作的本機稽核記錄?此操作無法復原。", + "cancel": "取消", + "openDirectory": "開啟資料夾", + "loadMore": "載入更多", + "status": { + "running": "進行中", + "ended": "已結束", + "interrupted": "已中斷", + "completed": "操作完成", + "error": "操作錯誤", + "unknown": "結果未知", + "cancelled": "已取消" + }, + "marker": { + "started": "開始記錄", + "ended": "工作階段結束", + "paused": "暫停記錄 · 之後的操作未記錄", + "resumed": "恢復記錄 · 上一時間段未記錄", + "user_interrupt": "使用者請求停止操作", + "event": "工作階段事件" + }, + "methods": { + "tabList": "檢視分頁", + "tabCreate": "開啟分頁", + "tabClose": "關閉分頁", + "tabSelect": "切換分頁", + "tabBorrow": "請求借用分頁", + "tabReturn": "歸還分頁", + "navigate": "開啟網頁", + "navigateBack": "上一頁", + "navigateForward": "下一頁", + "reload": "重新整理頁面", + "click": "點擊", + "fill": "填寫", + "press": "按鍵", + "select": "選擇選項", + "hover": "懸停", + "focus": "聚焦", + "blur": "移開焦點", + "scroll": "捲動", + "upload": "上傳檔案", + "download": "下載檔案", + "read": "讀取頁面", + "screenshot": "擷取截圖", + "console": "讀取主控台", + "network": "讀取網路資訊", + "evaluate": "執行頁面指令碼", + "wait": "等待", + "help": "請求人工接手", + "recordStart": "開始操作錄製", + "recordStop": "結束操作錄製", + "recordAwait": "等待錄製完成", + "resize": "調整視窗大小", + "emulate": "調整瀏覽器模擬設定" + } + } +} diff --git a/packages/i18n/tests/i18n.test.ts b/packages/i18n/tests/i18n.test.ts index 02a73ed4..eff1e276 100644 --- a/packages/i18n/tests/i18n.test.ts +++ b/packages/i18n/tests/i18n.test.ts @@ -39,9 +39,10 @@ describe("shipped language detection", () => { it.each([ ["en-GB", "en-US", "Connected"], - ["zh-Hant", "zh-CN", "已连接"], - ["fr-FR", "en-US", "Connected"], - ])("preserves the fallback for %s", async (language, resolved, label) => { + ["zh-Hant", "zh-TW", "已連線"], + ["fr-FR", "fr-FR", "Connecté"], + ["ru-RU", "en-US", "Connected"], + ])("resolves %s to the %s resource", async (language, resolved, label) => { const { i18n } = await loadI18n(language); expect(i18n.resolvedLanguage).toBe(resolved); expect(i18n.t("popup.stateLabel.connected", { ns: "extension" })).toBe(label); diff --git a/packages/i18n/tests/locale-resolution.test.ts b/packages/i18n/tests/locale-resolution.test.ts index bd2e405f..b978813d 100644 --- a/packages/i18n/tests/locale-resolution.test.ts +++ b/packages/i18n/tests/locale-resolution.test.ts @@ -31,28 +31,41 @@ describe("createLanguageNormalizer", () => { ["KO-kr", "ko-KR"], ["ko_KR", "ko-KR"], - // Chinese — only `zh-CN` ships today, so every variant resolves to it - // directly rather than leaking into the fallback chain. Traditional picks - // up `zh-TW` automatically once that bundle is registered (see below). + // Chinese — Simplified and Traditional both ship, disambiguated by + // script/region; every other Chinese variant defaults to Simplified. ["zh", "zh-CN"], ["zh-CN", "zh-CN"], ["zh-SG", "zh-CN"], ["zh-Hans", "zh-CN"], ["zh-Hans-CN", "zh-CN"], ["zh-Hans-SG", "zh-CN"], - ["zh-TW", "zh-CN"], - ["zh-HK", "zh-CN"], - ["zh-MO", "zh-CN"], - ["zh-Hant", "zh-CN"], - ["zh-Hant-TW", "zh-CN"], - ["zh-Hant-HK", "zh-CN"], - - // No translation shipped — returned unchanged so i18next applies the - // `default` fallback (en-US) rather than Chinese. - ["ja", "ja"], + ["zh-TW", "zh-TW"], + ["zh-HK", "zh-TW"], + ["zh-MO", "zh-TW"], + ["zh-Hant", "zh-TW"], + ["zh-Hant-TW", "zh-TW"], + ["zh-Hant-HK", "zh-TW"], + + // Other shipped languages — a bare primary subtag resolves to the single + // registered resource; exact tags stay unchanged. + ["ja", "ja-JP"], ["ja-JP", "ja-JP"], + ["fr", "fr-FR"], ["fr-FR", "fr-FR"], + ["de", "de-DE"], ["de-DE", "de-DE"], + ["it", "it-IT"], + ["it-IT", "it-IT"], + ["es", "es-ES"], + ["es-ES", "es-ES"], + ["pt", "pt-BR"], + ["pt-BR", "pt-BR"], + + // No translation shipped — returned unchanged so i18next applies the + // `default` fallback (en-US) rather than Chinese. + ["ru", "ru"], + ["ru-RU", "ru-RU"], + ["nl-NL", "nl-NL"], ]; it.each(cases)("maps %s to %s", (detected, resource) => { @@ -61,7 +74,7 @@ describe("createLanguageNormalizer", () => { it("is case-insensitive", () => { expect(normalize("EN-us")).toBe("en-US"); - expect(normalize("zh-hant-tw")).toBe("zh-CN"); + expect(normalize("zh-hant-tw")).toBe("zh-TW"); }); }); @@ -71,9 +84,9 @@ describe("createLanguageNormalizer", () => { */ describe("createLanguageNormalizer extensibility", () => { it("auto-resolves a newly registered language", () => { - const normalize = createLanguageNormalizer([...SHIPPED_RESOURCE_KEYS, "ja-JP"]); - expect(normalize("ja")).toBe("ja-JP"); - expect(normalize("ja-JP")).toBe("ja-JP"); + const normalize = createLanguageNormalizer([...SHIPPED_RESOURCE_KEYS, "nl-NL"]); + expect(normalize("nl")).toBe("nl-NL"); + expect(normalize("nl-NL")).toBe("nl-NL"); }); it("disambiguates zh once a Traditional bundle ships", () => { @@ -123,7 +136,7 @@ describe("getLanguageDetectionOptions", () => { it("normalises whatever the detectors report", () => { const { convertDetectedLanguage } = getLanguageDetectionOptions(SHIPPED_RESOURCE_KEYS); expect(convertDetectedLanguage("en-GB")).toBe("en-US"); - expect(convertDetectedLanguage("zh-TW")).toBe("zh-CN"); + expect(convertDetectedLanguage("zh-TW")).toBe("zh-TW"); expect(convertDetectedLanguage("ja-JP")).toBe("ja-JP"); });