diff --git a/public/locales/de.json b/public/locales/de.json index 650e024d9..29326df67 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -1,605 +1,621 @@ { - "login": { - "title": "Willkommen zurück!", - "email": "Geben Sie Ihre geschäftliche E-Mail-Adresse ein", - "password": "Passwort", - "button": "Einloggen", - "loading": "Lädt", - "register_prompt": "Noch keinen Account?", - "register_link": "Registrieren", - "welcome_notification": "Willkommen bei Maxun!", - "validation": { - "required_fields": "E-Mail und Passwort sind erforderlich", - "password_length": "Das Passwort muss mindestens 6 Zeichen lang sein" - }, - "error": { - "user_not_found": "Benutzer existiert nicht", - "invalid_credentials": "Ungültige E-Mail oder Passwort", - "server_error": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es später erneut", - "generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut" - } + "login": { + "title": "Willkommen zurück!", + "email": "Geschäftliche E-Mail eingeben", + "password": "Passwort", + "button": "Anmelden", + "loading": "Lädt", + "register_prompt": "Noch kein Konto?", + "register_link": "Registrieren", + "welcome_notification": "Willkommen bei Maxun!", + "validation": { + "required_fields": "E-Mail und Passwort sind erforderlich", + "password_length": "Das Passwort muss mindestens 6 Zeichen lang sein" }, - "register": { - "title": "Konto registrieren", - "email": "Geben Sie Ihre geschäftliche E-Mail-Adresse ein", - "password": "Passwort", - "button": "Registrieren", - "loading": "Lädt", - "register_prompt": "Bereits ein Konto?", - "login_link": "Einloggen", - "welcome_notification": "Willkommen bei Maxun!", - "validation": { - "email_required": "E-Mail-Adresse ist erforderlich", - "password_requirements": "Das Passwort muss mindestens 6 Zeichen lang sein" - }, - "error": { - "user_exists": "Ein Benutzer mit dieser E-Mail existiert bereits", - "creation_failed": "Konto konnte nicht erstellt werden", - "server_error": "Serverfehler aufgetreten", - "generic": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut" - } + "error": { + "user_not_found": "Benutzer existiert nicht", + "invalid_credentials": "Ungültige E-Mail oder Passwort", + "server_error": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es später erneut", + "generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut" + } + }, + "register": { + "title": "Konto erstellen", + "email": "Geschäftliche E-Mail eingeben", + "password": "Passwort", + "button": "Registrieren", + "loading": "Lädt", + "register_prompt": "Bereits ein Konto?", + "login_link": "Anmelden", + "welcome_notification": "Willkommen bei Maxun!", + "validation": { + "email_required": "E-Mail ist erforderlich", + "password_requirements": "Das Passwort muss mindestens 6 Zeichen lang sein" }, - "recordingtable": { - "run": "Ausführen", - "name": "Name", - "schedule": "Zeitplan", - "integrate": "Integrieren", - "settings": "Einstellungen", - "options": "Optionen", - "heading": "Meine Roboter", - "new": "Roboter erstellen", - "modal": { - "title": "Geben Sie die URL ein", - "login_title": "Ist für diese Website eine Anmeldung erforderlich?", - "label": "URL", - "button": "Aufnahme starten" - }, - "retrain": "Neu trainieren", - "edit": "Bearbeiten", - "delete": "Löschen", - "duplicate": "Duplizieren", - "notifications": { - "delete_warning": "Der Roboter hat zugehörige Ausführungen. Löschen Sie zuerst die Ausführungen, um den Roboter zu löschen", - "delete_success": "Roboter erfolgreich gelöscht", - "auth_success": "Roboter erfolgreich authentifiziert", - "browser_limit_warning": "Remote-Browser sind derzeit ausgelastet. Bitte warten Sie einige Minuten und versuchen Sie es erneut" - } + "error": { + "user_exists": "Ein Benutzer mit dieser E-Mail existiert bereits", + "creation_failed": "Konto konnte nicht erstellt werden", + "server_error": "Serverfehler aufgetreten", + "generic": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut" + } + }, + "recordingtable": { + "run": "Ausführen", + "name": "Name", + "schedule": "Zeitplan", + "integrate": "Integrieren", + "settings": "Einstellungen", + "options": "Optionen", + "heading": "Meine Roboter", + "new": "Roboter erstellen", + "modal": { + "title": "URL eingeben", + "login_title": "Erfordert diese Website eine Anmeldung?", + "label": "URL", + "button": "Aufzeichnung starten" }, - "mainmenu": { - "recordings": "Roboter", - "runs": "Ausführungen", - "proxy": "Proxy", - "apikey": "API-Schlüssel", - "feedback": "Maxun Cloud beitreten", - "apidocs": "Website zu API" - }, - "runstable": { - "runs": "Alle Ausführungen", - "runStatus": "Status", - "runName": "Name", - "startedAt": "Gestartet am", - "finishedAt": "Beendet am", - "delete": "Löschen", - "settings": "Einstellungen", - "search": "Ausführungen suchen...", - "sort_tooltip": "Zum Sortieren klicken", - "notifications": { - "no_runs": "Keine Ausführungen gefunden. Bitte versuchen Sie es erneut.", - "delete_success": "Ausführung erfolgreich gelöscht" - } + "warning_modal": { + "title": "Aktiver Browser erkannt", + "message": "Es läuft bereits eine Browser-Aufzeichnungssitzung. Möchten Sie diese verwerfen und eine neue Aufnahme starten?", + "discard_and_create": "Verwerfen & Neue aufnehmen", + "cancel": "Abbrechen" }, - "proxy": { - "title": "Proxy-Konfiguration", - "tab_standard": "Standard-Proxy", - "tab_rotation": "Automatische Proxy-Rotation", - "server_url": "Proxy-Server-URL", - "server_url_helper": "Proxy für alle Roboter. HTTP- und SOCKS-Proxys werden unterstützt. Beispiel http://myproxy.com:3128 oder socks5://myproxy.com:3128. Kurzform myproxy.com:3128 wird als HTTP-Proxy behandelt.", - "requires_auth": "Authentifizierung erforderlich?", - "username": "Benutzername", - "password": "Passwort", - "add_proxy": "Proxy hinzufügen", - "test_proxy": "Proxy testen", - "remove_proxy": "Proxy entfernen", - "table": { - "proxy_url": "Proxy-URL", - "requires_auth": "Authentifizierung erforderlich" - }, - "coming_soon": "Demnächst verfügbar - In Open Source (Basis-Rotation) & Cloud (Erweiterte Rotation). Wenn Sie die Infrastruktur nicht selbst verwalten möchten, tragen Sie sich in unsere Cloud-Warteliste ein.", - "join_waitlist": "Maxun Cloud Warteliste beitreten", - "alert": { - "title": "Wenn Ihr Proxy einen Benutzernamen und ein Passwort erfordert, geben Sie diese immer separat von der Proxy-URL an.", - "right_way": "Der richtige Weg", - "wrong_way": "Der falsche Weg", - "proxy_url": "Proxy-URL:", - "username": "Benutzername:", - "password": "Passwort:" - }, - "notifications": { - "config_success": "Proxy-Konfiguration erfolgreich übermittelt", - "config_error": "Fehler beim Übermitteln der Proxy-Konfiguration. Bitte erneut versuchen.", - "test_success": "Proxy-Konfiguration funktioniert", - "test_error": "Fehler beim Testen der Proxy-Konfiguration. Bitte erneut versuchen.", - "fetch_success": "Proxy-Konfiguration erfolgreich abgerufen", - "remove_success": "Proxy-Konfiguration erfolgreich entfernt", - "remove_error": "Fehler beim Entfernen der Proxy-Konfiguration. Bitte erneut versuchen." - } + "retrain": "Neu trainieren", + "edit": "Bearbeiten", + "delete": "Löschen", + "duplicate": "Duplizieren", + "search": "Roboter suchen...", + "notifications": { + "delete_warning": "Dieser Roboter hat zugehörige Ausführungen. Löschen Sie zuerst die Ausführungen, um den Roboter zu entfernen", + "delete_success": "Roboter erfolgreich gelöscht", + "auth_success": "Roboter erfolgreich authentifiziert", + "browser_limit_warning": "Remote-Browser sind zurzeit ausgelastet. Bitte warten Sie ein paar Minuten und versuchen Sie es erneut" + } + }, + "mainmenu": { + "recordings": "Roboter", + "runs": "Ausführungen", + "proxy": "Proxy", + "apikey": "API-Schlüssel", + "feedback": "Maxun Cloud beitreten", + "apidocs": "Website zu API" + }, + "runstable": { + "runs": "Alle Ausführungen", + "runStatus": "Status", + "runName": "Name", + "startedAt": "Gestartet am", + "finishedAt": "Beendet am", + "delete": "Löschen", + "settings": "Einstellungen", + "search": "Ausführungen suchen...", + "sort_tooltip": "Zum Sortieren klicken", + "notifications": { + "no_runs": "Keine Ausführungen gefunden. Bitte versuchen Sie es erneut.", + "delete_success": "Ausführung erfolgreich gelöscht" + } + }, + "proxy": { + "title": "Proxy-Konfiguration", + "tab_standard": "Standard-Proxy", + "tab_rotation": "Automatische Proxy-Rotation", + "server_url": "Proxy-Server-URL", + "server_url_helper": "Proxy für alle Roboter. HTTP- und SOCKS-Proxys werden unterstützt. Beispiel: http://myproxy.com:3128 oder socks5://myproxy.com:3128. Kurzform myproxy.com:3128 gilt als HTTP-Proxy.", + "requires_auth": "Erfordert Authentifizierung?", + "username": "Benutzername", + "password": "Passwort", + "add_proxy": "Proxy hinzufügen", + "test_proxy": "Proxy testen", + "remove_proxy": "Proxy entfernen", + "table": { + "proxy_url": "Proxy-URL", + "requires_auth": "Erfordert Authentifizierung" }, - "apikey": { - "title": "API-Schlüssel verwalten", - "default_name": "Maxun API-Schlüssel", - "table": { - "name": "API-Schlüssel Name", - "key": "API-Schlüssel", - "actions": "Aktionen" - }, - "actions": { - "copy": "Kopieren", - "show": "Anzeigen", - "hide": "Ausblenden", - "delete": "Löschen" - }, - "no_key_message": "Sie haben noch keinen API-Schlüssel generiert.", - "generate_button": "API-Schlüssel generieren", - "notifications": { - "fetch_error": "API-Schlüssel konnte nicht abgerufen werden - ${error}", - "generate_success": "API-Schlüssel erfolgreich generiert", - "generate_error": "API-Schlüssel konnte nicht generiert werden - ${error}", - "delete_success": "API-Schlüssel erfolgreich gelöscht", - "delete_error": "API-Schlüssel konnte nicht gelöscht werden - ${error}", - "copy_success": "API-Schlüssel erfolgreich kopiert" - } + "coming_soon": "Demnächst – In Open Source (Basis-Rotation) & Cloud (Erweiterte Rotation). Wenn Sie die Infrastruktur nicht verwalten möchten, treten Sie unserer Cloud-Warteliste bei.", + "join_waitlist": "Maxun Cloud Warteliste beitreten", + "alert": { + "title": "Wenn Ihr Proxy einen Benutzernamen und ein Passwort benötigt, geben Sie diese immer getrennt von der Proxy-URL ein.", + "right_way": "Die richtige Methode", + "wrong_way": "Die falsche Methode", + "proxy_url": "Proxy-URL:", + "username": "Benutzername:", + "password": "Passwort:" }, - "action_description": { - "text": { - "title": "Text erfassen", - "description": "Fahren Sie über die Texte, die Sie extrahieren möchten, und klicken Sie, um sie auszuwählen" - }, - "screenshot": { - "title": "Screenshot erfassen", - "description": "Erfassen Sie einen Teil- oder Vollbildschirmfoto der aktuellen Seite." - }, - "list": { - "title": "Liste erfassen", - "description": "Fahren Sie über die Liste, die Sie extrahieren möchten. Nach der Auswahl können Sie über alle Texte in der ausgewählten Liste fahren. Klicken Sie zum Auswählen." - }, - "default": { - "title": "Welche Daten möchten Sie extrahieren?", - "description": "Ein Roboter kann eine oder mehrere Aktionen ausführen. Wählen Sie aus den unten aufgeführten Optionen." - }, - "list_stages": { - "initial": "Wählen Sie die Liste aus, die Sie extrahieren möchten, zusammen mit den darin enthaltenen Texten", - "pagination": "Wählen Sie aus, wie der Roboter den Rest der Liste erfassen kann", - "limit": "Wählen Sie die Anzahl der zu extrahierenden Elemente", - "complete": "Erfassung ist abgeschlossen" - } + "notifications": { + "config_success": "Proxy-Konfiguration erfolgreich übermittelt", + "config_error": "Proxy-Konfiguration konnte nicht übermittelt werden. Versuchen Sie es erneut.", + "test_success": "Proxy-Konfiguration funktioniert", + "test_error": "Proxy-Test fehlgeschlagen. Versuchen Sie es erneut.", + "fetch_success": "Proxy-Konfiguration erfolgreich abgerufen", + "remove_success": "Proxy-Konfiguration erfolgreich entfernt", + "remove_error": "Proxy-Konfiguration konnte nicht entfernt werden. Versuchen Sie es erneut." + } + }, + "apikey": { + "title": "API-Schlüssel verwalten", + "default_name": "Maxun API-Schlüssel", + "table": { + "name": "API-Schlüssel Name", + "key": "API-Schlüssel", + "actions": "Aktionen" }, - "right_panel": { - "buttons": { - "capture_list": "Liste erfassen", - "capture_text": "Text erfassen", - "capture_screenshot": "Screenshot erfassen", - "confirm": "Bestätigen", - "discard": "Verwerfen", - "confirm_capture": "Erfassung bestätigen", - "confirm_pagination": "Bestätigen", - "confirm_limit": "Bestätigen", - "finish_capture": "Erfassung abschließen", - "back": "Zurück", - "reset": "Starten Sie die Aufnahme neu", - "finish": "Fertig", - "cancel": "Abbrechen", - "delete": "Löschen" - }, - "screenshot": { - "capture_fullpage": "Vollständige Seite erfassen", - "capture_visible": "Sichtbaren Bereich erfassen", - "display_fullpage": "Vollständige Seite Screenshot", - "display_visible": "Sichtbarer Bereich Screenshot" - }, - "pagination": { - "title": "Wie können wir das nächste Listenelement auf der Seite finden?", - "click_next": "Auf 'Weiter' klicken, um zur nächsten Seite zu navigieren", - "click_load_more": "Auf 'Mehr laden' klicken, um weitere Elemente zu laden", - "scroll_down": "Nach unten scrollen, um mehr Elemente zu laden", - "scroll_up": "Nach oben scrollen, um mehr Elemente zu laden", - "none": "Keine weiteren Elemente zu laden" - }, - "limit": { - "title": "Wie viele Zeilen möchten Sie maximal extrahieren?", - "custom": "Benutzerdefiniert", - "enter_number": "Nummer eingeben" - }, - "fields": { - "label": "Bezeichnung", - "data": "Daten", - "field_label": "Feldbezeichnung", - "field_data": "Felddaten" - }, - "messages": { - "list_selected": "Liste erfolgreich ausgewählt", - "list_empty": "Liste ausgewählt. Bitte wählen Sie Felder innerhalb der Liste aus." - }, - "errors": { - "select_pagination": "Bitte wählen Sie einen Paginierungstyp aus.", - "select_pagination_element": "Bitte wählen Sie zuerst das Paginierungselement aus.", - "select_limit": "Bitte wählen Sie ein Limit oder geben Sie ein benutzerdefiniertes Limit ein.", - "invalid_limit": "Bitte geben Sie ein gültiges Limit ein.", - "confirm_text_fields": "Bitte bestätigen Sie alle Textfelder", - "unable_create_settings": "Listeneinstellungen können nicht erstellt werden. Stellen Sie sicher, dass Sie ein Feld für die Liste definiert haben.", - "capture_text_discarded": "Texterfassung verworfen", - "capture_list_discarded": "Listenerfassung verworfen", - "label_required": "Beschriftung darf nicht leer sein" - } + "actions": { + "copy": "Kopieren", + "show": "Anzeigen", + "hide": "Verbergen", + "delete": "Löschen" }, - "save_recording": { - "title": "Roboter speichern", - "robot_name": "Roboter Name", - "buttons": { - "save": "Speichern", - "confirm": "Bestätigen" - }, - "notifications": { - "save_success": "Roboter erfolgreich gespeichert", - "retrain_success": "Roboter erfolgreich neu trainiert", - "save_error": "Fehler beim Speichern des Roboters" - }, - "errors": { - "user_not_logged": "Benutzer nicht angemeldet. Aufnahme kann nicht gespeichert werden.", - "exists_warning": "Ein Roboter mit diesem Namen existiert bereits, bitte bestätigen Sie das Überschreiben des Roboters." - }, - "tooltips": { - "saving": "Workflow wird optimiert und gespeichert" - } + "no_key_message": "Sie haben noch keinen API-Schlüssel generiert.", + "generate_button": "API-Schlüssel generieren", + "notifications": { + "fetch_error": "API-Schlüssel konnte nicht abgerufen werden - ${error}", + "generate_success": "API-Schlüssel erfolgreich generiert", + "generate_error": "API-Schlüssel konnte nicht generiert werden - ${error}", + "delete_success": "API-Schlüssel erfolgreich gelöscht", + "delete_error": "API-Schlüssel konnte nicht gelöscht werden - ${error}", + "copy_success": "API-Schlüssel erfolgreich kopiert" + } + }, + "action_description": { + "text": { + "title": "Text erfassen", + "description": "Fahren Sie mit der Maus über die Texte, die Sie extrahieren möchten, und klicken Sie zum Auswählen" }, - "browser_recording": { - "modal": { - "confirm_discard": "Sind Sie sicher, dass Sie die Aufnahme verwerfen möchten?", - "confirm_reset": "Sind Sie sicher, dass Sie zurücksetzen möchten?", - "reset_warning": "Dadurch werden alle vorherigen Aufnahmen in der aktuellen Sitzung gelöscht. Die Aufnahmesitzung wird für dieselbe Website neu gestartet." - }, - "notifications": { - "terminated": "Aktuelle Aufnahme wurde beendet", - "environment_reset": "Browser-Umgebung wurde zurückgesetzt", - "reset_successful": "Alle Aufnahmen erfolgreich zurückgesetzt und zum Ausgangszustand zurückgekehrt" - } + "screenshot": { + "title": "Screenshot erfassen", + "description": "Erfassen Sie einen Teil- oder Vollseiten-Screenshot der aktuellen Seite." }, - "interpretation_log": { - "titles": { - "output_preview": "Vorschau der Ausgabedaten", - "screenshot": "Bildschirmfoto" - }, - "messages": { - "additional_rows": "Weitere Datenzeilen werden nach Abschluss der Aufnahme extrahiert.", - "successful_training": "Sie haben den Roboter erfolgreich für Aktionen trainiert! Klicken Sie auf die Schaltfläche unten, um eine Vorschau der Daten zu erhalten, die Ihr Roboter extrahieren wird.", - "no_selection": "Sie haben noch nichts zur Extraktion ausgewählt. Sobald Sie dies tun, wird der Roboter hier eine Vorschau Ihrer Auswahl anzeigen." - }, - "data_sections": { - "binary_received": "---------- Binäre Ausgabedaten empfangen ----------", - "serializable_received": "---------- Serialisierbare Ausgabedaten empfangen ----------", - "mimetype": "Medientyp: ", - "image_below": "Bild wird unten angezeigt:", - "separator": "--------------------------------------------------" - }, - "notifications": { - "reset_success": "Vorschau erfolgreich zurückgesetzt" - } + "list": { + "title": "Liste erfassen", + "description": "Fahren Sie mit der Maus über die Liste, die Sie extrahieren möchten. Nach der Auswahl können Sie alle Texte innerhalb der Liste auswählen – klicken Sie, um sie auszuwählen." }, - "interpretation_buttons": { - "buttons": { - "preview": "Vorschau der Ausgabedaten anzeigen", - "reset": "Zurücksetzen", - "yes": "Ja", - "no": "Nein" - }, - "messages": { - "extracting": "Daten werden extrahiert...bitte warten Sie 10 Sekunden bis 1 Minute", - "restart_required": "Bitte starten Sie die Interpretation nach der Aktualisierung der Aufnahme neu", - "run_finished": "Durchlauf beendet", - "run_failed": "Start fehlgeschlagen" - }, - "modal": { - "use_previous": "Möchten Sie Ihre vorherige Auswahl als Bedingung für diese Aktion verwenden?", - "previous_action": "Ihre vorherige Aktion war: ", - "element_text": "auf einem Element mit Text " - } + "default": { + "title": "Welche Daten möchten Sie extrahieren?", + "description": "Ein Roboter kann eine oder mehrere Aktionen ausführen. Wählen Sie unten aus." }, - "recording_page": { - "loader": { - "browser_startup": "Browser wird gestartet...Navigation zu {{url}}" - } + "list_stages": { + "initial": "Wählen Sie die Liste und die darin enthaltenen Texte aus, die Sie extrahieren möchten", + "pagination": "Wählen Sie aus, wie der Roboter den Rest der Liste erfassen kann", + "limit": "Geben Sie die Anzahl der zu extrahierenden Einträge an", + "complete": "Erfassung abgeschlossen" }, - "integration_settings": { - "title": "Integrationseinstellungen", - "descriptions": { - "authenticated_as": "Authentifiziert als: {{email}}" - }, - "buttons": { - "submit": "Absenden", - "remove_integration": "Integration entfernen" - }, - "google": { - "title": "Mit Google Sheet integrieren", - "descriptions": { - "sync_info": "Wenn Sie diese Option aktivieren, werden bei jeder erfolgreichen Ausführung einer Aufgabe durch diesen Roboter die erfassten Daten an Ihr Google Sheet angehängt.", - "authenticated_as": "Authentifiziert als: {{email}}" - }, - "alerts": { - "success": { - "title": "Google Sheet erfolgreich integriert.", - "content": "Jedes Mal, wenn dieser Roboter einen erfolgreichen Lauf erstellt, werden seine erfassten Daten an Ihr Google Sheet {{sheetName}} angehängt. Sie können die Datenaktualisierungen überprüfen", - "here": "hier", - "note": "Hinweis:", - "sync_limitation": "Die vor der Integration mit Google Sheets extrahierten Daten werden nicht im Google Sheet synchronisiert. Nur die nach der Integration extrahierten Daten werden synchronisiert." - } - }, - "buttons": { - "authenticate": "Mit Google authentifizieren", - "fetch_sheets": "Google Tabellenkalkulationen abrufen", - "remove_integration": "Integration entfernen", - "submit": "Absenden" - }, - "fields": { - "select_sheet": "Google Sheet auswählen", - "selected_sheet": "Ausgewähltes Sheet: {{name}} (ID: {{id}})" - }, - "errors": { - "auth_error": "Fehler bei der Authentifizierung mit Google", - "fetch_error": "Fehler beim Abrufen der Tabellenkalkulationsdateien: {{message}}", - "update_error": "Fehler beim Aktualisieren der Google Sheet-ID: {{message}}", - "remove_error": "Fehler beim Entfernen der Google Sheets-Integration: {{message}}" - }, - "notifications": { - "sheet_selected": "Google Sheet erfolgreich ausgewählt", - "integration_removed": "Google Sheets-Integration erfolgreich entfernt" - } - }, - "airtable": { - "title": "Mit Airtable integrieren", - "descriptions": { - "sync_info": "Wenn Sie diese Option aktivieren, werden bei jeder erfolgreichen Ausführung einer Aufgabe durch diesen Roboter die erfassten Daten an Ihre Airtable angehängt.", - "authenticated_as": "Erfolgreich bei Airtable authentifiziert. Sie können nun die Basis und den Tisch auswählen, in die Sie integrieren möchten." - }, - "alerts": { - "success": { - "title": "Airtable Base erfolgreich integriert", - "content": "Jedes Mal, wenn dieser Roboter einen erfolgreichen Lauf erstellt, werden seine erfassten Daten an Ihre {{baseName}}-Basis und Ihre {{tableName}}-Tabelle angehängt. Sie können Updates überprüfen", - "here": "hier", - "note": "Hinweis:", - "sync_limitation": "Nur nach der Integration erfasste Daten werden mit Airtable synchronisiert." - } - }, - "buttons": { - "authenticate": "Mit Airtable verbinden", - "fetch_bases": "Airtable Basen abrufen", - "fetch_tables": "Airtable Tabellen abrufen", - "remove_integration": "Integration entfernen", - "submit": "Basis und Tabelle auswählen" - }, - "fields": { - "select_base": "Airtable Basis auswählen", - "select_table": "Airtable Tabelle auswählen", - "selected_base": "Ausgewählte Basis: {{name}}", - "selected_table": "Ausgewählte Tabelle: {{name}}" - }, - "errors": { - "auth_error": "Fehler bei der Authentifizierung mit Airtable", - "fetch_error": "Fehler beim Abrufen von Airtable-Basen: {{message}}", - "fetch_tables_error": "Fehler beim Abrufen von Airtable-Tabellen: {{message}}", - "update_error": "Fehler beim Aktualisieren der Airtable-Basis: {{message}}", - "remove_error": "Fehler beim Entfernen der Airtable-Integration: {{message}}" - }, - "notifications": { - "base_selected": "Airtable-Basis erfolgreich ausgewählt", - "table_selected": "Airtable-Tabelle erfolgreich ausgewählt", - "integration_removed": "Airtable-Integration erfolgreich entfernt" - } - } + "actions": { + "text": "Text erfassen", + "list": "Liste erfassen", + "screenshot": "Screenshot erfassen" + } + }, + "right_panel": { + "buttons": { + "capture_list": "Liste erfassen", + "capture_text": "Text erfassen", + "capture_screenshot": "Screenshot erfassen", + "confirm": "Bestätigen", + "discard": "Verwerfen", + "confirm_capture": "Erfassung bestätigen", + "confirm_pagination": "Bestätigen", + "confirm_limit": "Bestätigen", + "confirm_reset": "Bestätigen", + "finish_capture": "Erfassung abschließen", + "back": "Zurück", + "reset": "Aufnahme neu starten", + "finish": "Fertig", + "cancel": "Abbrechen", + "delete": "Löschen" }, - "robot_duplication": { - "title": "Roboter duplizieren", - "descriptions": { - "purpose": "Die Roboter-Duplizierung ist nützlich, um Daten von Seiten mit der gleichen Struktur zu extrahieren.", - "example": "Beispiel: Wenn Sie einen Roboter für {{url1}} erstellt haben, können Sie ihn duplizieren, um ähnliche Seiten wie {{url2}} zu durchsuchen, ohne einen Roboter von Grund auf neu zu trainieren.", - "warning": "⚠️ Stellen Sie sicher, dass die neue Seite die gleiche Struktur wie die Originalseite hat." - }, - "fields": { - "target_url": "Roboter Ziel-URL" - }, - "buttons": { - "duplicate": "Roboter duplizieren", - "cancel": "Abbrechen" - }, - "notifications": { - "robot_not_found": "Roboterdetails konnten nicht gefunden werden. Bitte versuchen Sie es erneut.", - "url_required": "Ziel-URL ist erforderlich.", - "duplicate_success": "Roboter erfolgreich dupliziert.", - "duplicate_error": "Fehler beim Aktualisieren der Ziel-URL. Bitte versuchen Sie es erneut.", - "unknown_error": "Beim Aktualisieren der Ziel-URL ist ein Fehler aufgetreten." - } + "screenshot": { + "capture_fullpage": "Gesamte Seite erfassen", + "capture_visible": "Sichtbaren Bereich erfassen", + "display_fullpage": "Screenshot der gesamten Seite machen", + "display_visible": "Screenshot des sichtbaren Bereichs machen" }, - "robot_settings": { - "title": "Roboter-Einstellungen", - "target_url": "Roboter-Ziel-URL", - "robot_id": "Roboter-ID", - "robot_limit": "Roboter-Limit", - "created_by_user": "Erstellt von Benutzer", - "created_at": "Erstellungsdatum des Roboters", - "errors": { - "robot_not_found": "Roboterdetails konnten nicht gefunden werden. Bitte versuchen Sie es erneut." - } + "pagination": { + "title": "Wie finden wir das nächste Listenelement auf der Seite?", + "click_next": "Auf 'Weiter' klicken, um zur nächsten Seite zu wechseln", + "click_load_more": "Auf 'Mehr laden' klicken, um mehr Elemente anzuzeigen", + "scroll_down": "Nach unten scrollen, um mehr zu laden", + "scroll_up": "Nach oben scrollen, um mehr zu laden", + "none": "Keine weiteren Elemente zu laden" }, - "robot_edit": { - "title": "Roboter bearbeiten", - "change_name": "Roboternamen ändern", - "robot_limit": "Roboter-Limit", - "save": "Änderungen speichern", - "cancel": "Abbrechen", - "notifications": { - "update_success": "Roboter erfolgreich aktualisiert.", - "update_failed": "Aktualisierung des Roboters fehlgeschlagen. Bitte erneut versuchen.", - "update_error": "Beim Aktualisieren des Roboters ist ein Fehler aufgetreten." - } + "limit": { + "title": "Wie viele Zeilen möchten Sie maximal extrahieren?", + "custom": "Benutzerdefiniert", + "enter_number": "Nummer eingeben" }, - "schedule_settings": { - "title": "Zeitplan-Einstellungen", - "run_every": "Ausführen alle", - "start_from": "Beginnen ab", - "on_day": "An Tag", - "at_around": "Um", - "timezone": "Zeitzone", - "buttons": { - "delete_schedule": "Zeitplan löschen", - "save_schedule": "Zeitplan speichern", - "cancel": "Abbrechen" - }, - "labels": { - "in_between": "Zwischen", - "run_once_every": "Ausführen alle", - "start_from_label": "Beginnen ab", - "on_day_of_month": "Tag des Monats", - "on_day": { - "st": ".", - "nd": ".", - "rd": ".", - "th": "." - } - } + "fields": { + "label": "Bezeichnung", + "data": "Daten", + "field_label": "Feldbezeichnung", + "field_data": "Felddaten" + }, + "messages": { + "list_selected": "Liste erfolgreich ausgewählt", + "list_empty": "Liste ausgewählt. Bitte wählen Sie Felder in der Liste aus." + }, + "errors": { + "select_pagination": "Bitte wählen Sie einen Paginierungstyp.", + "select_pagination_element": "Bitte wählen Sie zuerst das Paginierungselement aus.", + "select_limit": "Bitte wählen oder geben Sie ein Limit ein.", + "invalid_limit": "Bitte geben Sie ein gültiges Limit an.", + "confirm_text_fields": "Bitte bestätigen Sie alle Textfelder", + "unable_create_settings": "Listeneinstellungen konnten nicht erstellt werden. Definieren Sie ein Feld für die Liste.", + "capture_text_discarded": "Text-Erfassung verworfen", + "capture_list_discarded": "Listen-Erfassung verworfen", + "label_required": "Bezeichnung darf nicht leer sein" + } + }, + "save_recording": { + "title": "Roboter speichern", + "robot_name": "Robotername", + "buttons": { + "save": "Speichern", + "confirm": "Bestätigen" + }, + "notifications": { + "save_success": "Roboter erfolgreich gespeichert", + "retrain_success": "Roboter erfolgreich neu trainiert", + "save_error": "Fehler beim Speichern des Roboters" + }, + "errors": { + "user_not_logged": "Der Benutzer ist nicht angemeldet. Die Aufzeichnung kann nicht gespeichert werden.", + "exists_warning": "Ein Roboter mit diesem Namen existiert bereits. Bitte bestätigen Sie das Überschreiben." + }, + "tooltips": { + "saving": "Workflow wird optimiert und gespeichert" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "Möchten Sie die Aufzeichnung wirklich verwerfen?", + "confirm_reset": "Möchten Sie die Aufzeichnung wirklich neu starten?", + "reset_warning": "Alle bisherigen Aufnahmen in dieser Sitzung werden gelöscht. Die Aufzeichnung beginnt erneut auf derselben Website." }, - "main_page": { - "notifications": { - "interpretation_success": "Interpretation des Roboters {{name}} erfolgreich", - "interpretation_failed": "Interpretation des Roboters {{name}} fehlgeschlagen", - "run_started": "Roboter wird ausgeführt: {{name}}", - "run_start_failed": "Fehler beim Ausführen des Roboters: {{name}}", - "schedule_success": "Roboter {{name}} erfolgreich geplant", - "schedule_failed": "Planen des Roboters {{name}} fehlgeschlagen", - "abort_success": "Interpretation des Roboters {{name}} erfolgreich abgebrochen", - "abort_failed": "Abbrechen der Interpretation des Roboters {{name}} fehlgeschlagen", - "abort_initiated": "Interpretation des Roboters {{name}} wird abgebrochen" - }, - "menu": { - "recordings": "Roboter", - "runs": "Ausführungen", - "proxy": "Proxy", - "apikey": "API-Schlüssel" + "notifications": { + "terminated": "Die aktuelle Aufzeichnung wurde beendet", + "environment_reset": "Browserumgebung wurde zurückgesetzt", + "reset_successful": "Alle Erfassungen zurückgesetzt und zum Anfangszustand zurückgekehrt" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "Vorschau der Ausgabedaten", + "screenshot": "Screenshot" + }, + "messages": { + "additional_rows": "Zusätzliche Datenzeilen werden nach Abschluss der Aufzeichnung extrahiert.", + "successful_training": "Sie haben den Roboter erfolgreich trainiert! Klicken Sie unten, um eine Vorschau der Daten zu erhalten.", + "no_selection": "Sie haben noch nichts zum Extrahieren ausgewählt. Sobald Sie dies tun, wird eine Vorschau angezeigt." + }, + "data_sections": { + "binary_received": "---------- Binäre Ausgabedaten empfangen ----------", + "serializable_received": "---------- Serialisierbare Ausgabedaten empfangen ----------", + "mimetype": "mimetype: ", + "image_below": "Bild wird unten angezeigt:", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "Vorschau zurückgesetzt" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "Vorschau der Ausgabedaten", + "reset": "Zurücksetzen", + "yes": "Ja", + "no": "Nein" + }, + "messages": { + "extracting": "Daten werden extrahiert...bitte warten Sie 10 Sekunden bis 1 Minute", + "restart_required": "Bitte starten Sie die Interpretation nach der Aktualisierung neu", + "run_finished": "Ausführung abgeschlossen", + "run_failed": "Ausführung konnte nicht gestartet werden" + }, + "modal": { + "use_previous": "Vorherige Auswahl als Bedingung für diese Aktion verwenden?", + "previous_action": "Vorherige Aktion: ", + "element_text": "auf einem Element mit Text " + } + }, + "recording_page": { + "loader": { + "browser_startup": "Browser wird gestartet... Navigiere zu {{url}}" + } + }, + "integration_settings": { + "title": "Integrationseinstellungen", + "descriptions": { + "authenticated_as": "Authentifiziert als: {{email}}" + }, + "buttons": { + "submit": "Abschicken", + "remove_integration": "Integration entfernen" + }, + "google": { + "title": "Mit Google Sheet integrieren", + "descriptions": { + "sync_info": "Wenn Sie diese Option aktivieren, werden die Daten nach jedem erfolgreichen Roboterlauf automatisch an Google Sheet angehängt.", + "authenticated_as": "Authentifiziert als: {{email}}" + }, + "alerts": { + "success": { + "title": "Google Sheet erfolgreich integriert.", + "content": "Nach jedem erfolgreichen Roboterlauf werden die Daten an Ihre {{sheetName}} Google Sheet angehängt. Sie können die Aktualisierungen", + "here": "hier", + "note": "Hinweis:", + "sync_limitation": "Daten, die vor der Google Sheets Integration extrahiert wurden, werden nicht synchronisiert. Nur Daten nach der Integration werden synchronisiert." } + }, + "buttons": { + "authenticate": "Mit Google authentifizieren", + "fetch_sheets": "Google Tabellen abrufen", + "remove_integration": "Integration entfernen", + "submit": "Abschicken" + }, + "fields": { + "select_sheet": "Google Sheet auswählen", + "selected_sheet": "Ausgewählte Sheet: {{name}} (ID: {{id}})" + }, + "errors": { + "auth_error": "Fehler bei der Google-Authentifizierung", + "fetch_error": "Fehler beim Abrufen der Tabellen: {{message}}", + "update_error": "Fehler beim Aktualisieren der Google Sheet ID: {{message}}", + "remove_error": "Fehler beim Entfernen der Google Sheets Integration: {{message}}" + }, + "notifications": { + "sheet_selected": "Google Sheet erfolgreich ausgewählt", + "integration_removed": "Google Sheets Integration erfolgreich entfernt" + } }, - "browser_window": { - "attribute_modal": { - "title": "Attribut auswählen", - "notifications": { - "list_select_success": "Liste erfolgreich ausgewählt. Wählen Sie die zu extrahierenden Textdaten.", - "pagination_select_success": "Paginierungselement erfolgreich ausgewählt." - } - }, - "attribute_options": { - "anchor": { - "text": "Text: {{text}}", - "url": "URL: {{url}}" - }, - "image": { - "alt_text": "Alt-Text: {{altText}}", - "image_url": "Bild-URL: {{imageUrl}}" - }, - "default": { - "text": "Text: {{text}}" - } + "airtable": { + "title": "Mit Airtable integrieren", + "descriptions": { + "sync_info": "Wenn Sie diese Option aktivieren, werden nach jedem erfolgreichen Roboterlauf Ihre Daten an die Airtable Base angehängt.", + "authenticated_as": "Airtable erfolgreich authentifiziert. Sie können nun Base und Tabelle zur Integration auswählen." + }, + "alerts": { + "success": { + "title": "Airtable Base erfolgreich integriert", + "content": "Nach jedem erfolgreichen Roboterlauf werden die Daten an {{baseName}} Base und {{tableName}} Tabelle angehängt.", + "here": "hier", + "note": "Hinweis:", + "sync_limitation": "Nur Daten, die nach der Integration erfasst wurden, werden mit Airtable synchronisiert." } + }, + "buttons": { + "authenticate": "Mit Airtable verbinden", + "fetch_bases": "Airtable Bases abrufen", + "fetch_tables": "Airtable Tabellen abrufen", + "remove_integration": "Integration entfernen", + "submit": "Base und Tabelle auswählen" + }, + "fields": { + "select_base": "Airtable Base auswählen", + "select_table": "Airtable Tabelle auswählen", + "selected_base": "Ausgewählte Base: {{name}}", + "selected_table": "Ausgewählte Tabelle: {{name}}" + }, + "errors": { + "auth_error": "Fehler bei der Airtable-Authentifizierung", + "fetch_error": "Fehler beim Abrufen der Bases: {{message}}", + "fetch_tables_error": "Fehler beim Abrufen der Tabellen: {{message}}", + "update_error": "Fehler beim Aktualisieren der Base: {{message}}", + "remove_error": "Fehler beim Entfernen der Airtable Integration: {{message}}" + }, + "notifications": { + "base_selected": "Airtable Base erfolgreich ausgewählt", + "table_selected": "Airtable Tabelle erfolgreich ausgewählt", + "integration_removed": "Airtable Integration erfolgreich entfernt" + } + } + }, + "robot_duplication": { + "title": "Roboter duplizieren", + "descriptions": { + "purpose": "Das Duplizieren von Robotern ist hilfreich, um Daten von Seiten mit gleicher Struktur zu extrahieren.", + "example": "Beispiel: Wenn Sie einen Roboter für {{url1}} erstellt haben, können Sie ihn für z.B. {{url2}} duplizieren, ohne einen neuen Roboter von Grund auf zu trainieren.", + "warning": "⚠️ Achten Sie darauf, dass die neue Seite die gleiche Struktur wie das Original hat." }, - "runs_table": { - "run_type_chips": { - "manual_run": "Manuelle Ausführung", - "scheduled_run": "Geplante Ausführung", - "api": "API", - "unknown_run_type": "Unbekannter Ausführungstyp" - }, - "run_status_chips": { - "success": "Erfolg", - "running": "Läuft", - "scheduled": "Geplant", - "queued": "In Warteschlange", - "failed": "Fehlgeschlagen", - "aborted": "Abgebrochen" - }, - "run_settings_modal": { - "title": "Ausführungseinstellungen", - "labels": { - "run_id": "Ausführungs-ID", - "run_by_user": "Ausgeführt von Benutzer", - "run_by_schedule": "Ausgeführt nach Zeitplan-ID", - "run_by_api": "Ausgeführt durch API", - "run_type": "Ausführungstyp" - } + "fields": { + "target_url": "Ziel-URL des Roboters" + }, + "buttons": { + "duplicate": "Roboter duplizieren", + "cancel": "Abbrechen" + }, + "notifications": { + "robot_not_found": "Roboterinformationen nicht gefunden. Bitte versuchen Sie es erneut.", + "url_required": "Ziel-URL ist erforderlich.", + "duplicate_success": "Roboter erfolgreich dupliziert.", + "duplicate_error": "Fehler beim Aktualisieren der Ziel-URL. Bitte versuchen Sie es erneut.", + "unknown_error": "Beim Aktualisieren der Ziel-URL ist ein Fehler aufgetreten." + } + }, + "robot_settings": { + "title": "Roboter-Einstellungen", + "target_url": "Ziel-URL", + "robot_id": "Roboter-ID", + "robot_limit": "Roboter-Limit", + "created_by_user": "Erstellt von Benutzer", + "created_at": "Erstellt am", + "errors": { + "robot_not_found": "Roboterinformationen nicht gefunden. Bitte versuchen Sie es erneut." + } + }, + "robot_edit": { + "title": "Roboter bearbeiten", + "change_name": "Robotername", + "robot_limit": "Roboter-Limit", + "save": "Änderungen speichern", + "cancel": "Abbrechen", + "notifications": { + "update_success": "Roboter erfolgreich aktualisiert.", + "update_failed": "Roboteraktualisierung fehlgeschlagen. Bitte versuchen Sie es erneut.", + "update_error": "Beim Aktualisieren des Roboters ist ein Fehler aufgetreten." + } + }, + "schedule_settings": { + "title": "Zeitplaneinstellungen", + "run_every": "Ausführen alle", + "start_from": "Startet ab", + "on_day": "Am Tag", + "at_around": "Um ca.", + "timezone": "Zeitzone", + "buttons": { + "delete_schedule": "Zeitplan löschen", + "save_schedule": "Zeitplan speichern", + "cancel": "Abbrechen" + }, + "labels": { + "in_between": "Zwischen", + "run_once_every": "Einmal alle", + "start_from_label": "Start ab", + "on_day_of_month": "An Tag des Monats", + "on_day": { + "st": ".", + "nd": ".", + "rd": ".", + "th": "." + } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "Interpretation des Roboters {{name}} erfolgreich", + "interpretation_failed": "Interpretation des Roboters {{name}} fehlgeschlagen", + "run_started": "Roboter wird ausgeführt: {{name}}", + "run_start_failed": "Ausführung des Roboters fehlgeschlagen: {{name}}", + "schedule_success": "Roboter {{name}} erfolgreich geplant", + "schedule_failed": "Planung des Roboters {{name}} fehlgeschlagen", + "abort_success": "Interpretation des Roboters {{name}} erfolgreich abgebrochen", + "abort_failed": "Das Abbrechen der Interpretation von {{name}} ist fehlgeschlagen", + "abort_initiated": "Abbrechen der Interpretation von {{name}} wird vorbereitet" + }, + "menu": { + "recordings": "Roboter", + "runs": "Ausführungen", + "proxy": "Proxy", + "apikey": "API-Schlüssel" + } + }, + "browser_window": { + "attribute_modal": { + "title": "Attribut auswählen", + "notifications": { + "list_select_success": "Liste erfolgreich ausgewählt. Bitte wählen Sie die zu extrahierenden Textdaten.", + "pagination_select_success": "Seitenelement zur Paginierung erfolgreich ausgewählt." + } + }, + "attribute_options": { + "anchor": { + "text": "Text: {{text}}", + "url": "URL: {{url}}" + }, + "image": { + "alt_text": "Alt-Text: {{altText}}", + "image_url": "Bild-URL: {{imageUrl}}" + }, + "default": { + "text": "Text: {{text}}" + } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "Manueller Lauf", + "scheduled_run": "Geplanter Lauf", + "api": "API", + "unknown_run_type": "Unbekannter Lauf-Typ" + }, + "run_status_chips": { + "success": "Erfolg", + "running": "Läuft", + "scheduled": "Geplant", + "queued": "Wartend", + "failed": "Fehlgeschlagen", + "aborted": "Abgebrochen" + }, + "run_settings_modal": { + "title": "Laufeinstellungen", + "labels": { + "run_id": "Lauf-ID", + "run_by_user": "Vom Benutzer gestartet", + "run_by_schedule": "Durch Zeitplan gestartet", + "run_by_api": "Durch API gestartet", + "run_type": "Lauf-Typ" + } + } + }, + "run_content": { + "tabs": { + "output_data": "Ausgabedaten", + "log": "Protokoll" + }, + "buttons": { + "stop": "Stopp" + }, + "loading": "Lade Daten...", + "empty_output": "Keine Ausgabedaten verfügbar", + "captured_data": { + "title": "Erfasste Daten", + "download_csv": "CSV herunterladen", + "view_full": "Alle Daten anzeigen", + "items": "Einträge", + "schema_title": "Erfasste Texte", + "list_title": "Erfasste Listen" + }, + "captured_screenshot": { + "title": "Erfasste Screenshots", + "download": "Herunterladen", + "render_failed": "Screenshot konnte nicht angezeigt werden" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "Erfolgreich abgemeldet" + }, + "errors": { + "logout": { + "unauthorized": "Sie sind nicht berechtigt, diese Aktion durchzuführen", + "server": "Serverfehler beim Abmelden", + "network": "Netzwerkfehler beim Abmelden", + "unknown": "Unerwarteter Fehler beim Abmelden" } + } }, - "run_content": { + "upgrade": { + "button": "Upgrade", + "modal": { + "up_to_date": "🎉 Sie sind auf dem neuesten Stand!", + "new_version_available": "Eine neue Version ist verfügbar: {{version}}. Für Fehlerbehebungen, Verbesserungen und neue Funktionen jetzt upgraden!", + "view_updates": "Alle neuen Updates ansehen", + "view_updates_link": "hier", "tabs": { - "output_data": "Ausgabedaten", - "log": "Protokoll" - }, - "buttons": { - "stop": "Stoppen" - }, - "loading": "Daten werden geladen...", - "empty_output": "Keine Ausgabedaten verfügbar", - "captured_data": { - "title": "Erfasste Daten", - "download_csv": "CSV herunterladen", - "view_full": "Vollständige Daten anzeigen", - "items": "Elemente", - "schema_title": "Erfasste Texte", - "list_title": "Erfasste Listen" - }, - "captured_screenshot": { - "title": "Erfasste Screenshots", - "download": "Herunterladen", - "render_failed": "Fehler beim Rendern des Screenshots" + "manual_setup": "Manuelles Upgrade", + "docker_setup": "Docker Compose Upgrade" } + } }, - "navbar": { - "project_name": "Maxun", - "notifications": { - "success": { - "logout": "Erfolgreich abgemeldet" - }, - "errors": { - "logout": { - "unauthorized": "Sie sind nicht berechtigt, diese Aktion durchzuführen", - "server": "Serverfehler beim Abmelden", - "network": "Netzwerkfehler beim Abmelden", - "unknown": "Ein unerwarteter Fehler ist beim Abmelden aufgetreten" - } - } - }, - "upgrade": { - "button": "Upgrade", - "modal": { - "up_to_date": "🎉 Du bist auf dem neuesten Stand!", - "new_version_available": "Eine neue Version ist verfügbar: {{version}}. Aktualisieren Sie auf die neueste Version für Fehlerkorrekturen, Verbesserungen und neue Funktionen!", - "view_updates": "Alle Updates anzeigen", - "view_updates_link": "hier", - "tabs": { - "manual_setup": "Manuelles Setup-Upgrade", - "docker_setup": "Docker Compose Setup-Upgrade" - } - } - }, - "menu_items": { - "logout": "Abmelden", - "discord": "Discord", - "youtube": "YouTube", - "twitter": "Twitter (X)", - "language": "Sprache" - }, - "recording": { - "discard": "Verwerfen" - } + "menu_items": { + "logout": "Abmelden", + "discord": "Discord", + "youtube": "YouTube", + "twitter": "Twitter (X)", + "language": "Sprache" }, - "language_menu": { - "en": "Englisch", - "es": "Spanisch", - "ja": "Japanisch", - "zh": "Chinesisch", - "de": "Deutsch" + "recording": { + "discard": "Verwerfen" } + }, + "language_menu": { + "en": "Englisch", + "es": "Spanisch", + "ja": "Japanisch", + "zh": "Chinesisch", + "de": "Deutsch", + "ru": "Russisch", + "fr": "Französisch", + "ko": "Koreanisch" + } } diff --git a/public/locales/en.json b/public/locales/en.json index 4b981a58b..8916ef1ec 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -1,618 +1,621 @@ { - "login": { - "title": "Welcome Back!", - "email": "Enter Work Email", - "password": "Password", - "button": "Login", - "loading": "Loading", - "register_prompt": "Don't have an account?", - "register_link": "Register", - "welcome_notification": "Welcome to Maxun!", - "validation": { - "required_fields": "Email and password are required", - "password_length": "Password must be at least 6 characters" - }, - "error": { - "user_not_found": "User does not exist", - "invalid_credentials": "Invalid email or password", - "server_error": "Login failed. Please try again later", - "generic": "An error occurred. Please try again" - } + "login": { + "title": "Welcome Back!", + "email": "Enter Work Email", + "password": "Password", + "button": "Login", + "loading": "Loading", + "register_prompt": "Don't have an account?", + "register_link": "Register", + "welcome_notification": "Welcome to Maxun!", + "validation": { + "required_fields": "Email and password are required", + "password_length": "Password must be at least 6 characters" }, - "register": { - "title": "Create An Account", - "email": "Enter Work Email", - "password": "Password", - "button": "Register", - "loading": "Loading", - "register_prompt": "Already have an account?", - "login_link": "Login", - "welcome_notification": "Welcome to Maxun!", - "validation": { - "email_required": "Email is required", - "password_requirements": "Password must be at least 6 characters" - }, - "error": { - "user_exists": "User with this email already exists", - "creation_failed": "Could not create account", - "server_error": "Server error occurred", - "generic": "Registration failed. Please try again" - } + "error": { + "user_not_found": "User does not exist", + "invalid_credentials": "Invalid email or password", + "server_error": "Login failed. Please try again later", + "generic": "An error occurred. Please try again" + } + }, + "register": { + "title": "Create An Account", + "email": "Enter Work Email", + "password": "Password", + "button": "Register", + "loading": "Loading", + "register_prompt": "Already have an account?", + "login_link": "Login", + "welcome_notification": "Welcome to Maxun!", + "validation": { + "email_required": "Email is required", + "password_requirements": "Password must be at least 6 characters" }, - "recordingtable":{ - "run": "Run", - "name": "Name", - "schedule": "Schedule", - "integrate": "Integrate", - "settings": "Settings", - "options": "Options", - "heading":"My Robots", - "new":"Create Robot", - "modal":{ - "title":"Enter the URL", - "login_title": "Does this website require logging in?", - "label":"URL", - "button":"Start Recording" - }, - "warning_modal":{ - "title":"Active Browser Detected", - "message": "There is already a browser recording session running. Would you like to discard it and create a new recording?", - "discard_and_create":"Discard & Create New", - "cancel":"Cancel" - }, - "retrain": "Retrain", - "edit":"Edit", - "delete":"Delete", - "duplicate":"Duplicate", - "search":"Search Robots...", - "notifications": { - "delete_warning": "The robot has associated runs. First delete runs to delete the robot", - "delete_success": "Robot deleted successfully", - "auth_success": "Robot successfully authenticated", - "browser_limit_warning": "Remote browsers are currently busy. Please wait for a few minutes and try again" - } + "error": { + "user_exists": "User with this email already exists", + "creation_failed": "Could not create account", + "server_error": "Server error occurred", + "generic": "Registration failed. Please try again" + } + }, + "recordingtable": { + "run": "Run", + "name": "Name", + "schedule": "Schedule", + "integrate": "Integrate", + "settings": "Settings", + "options": "Options", + "heading": "My Robots", + "new": "Create Robot", + "modal": { + "title": "Enter the URL", + "login_title": "Does this website require logging in?", + "label": "URL", + "button": "Start Recording" }, - "mainmenu":{ - "recordings": "Robots", - "runs": "Runs", - "proxy": "Proxy", - "apikey": "API Key", - "feedback":"Join Maxun Cloud", - "apidocs":"Website To API" - }, - "runstable":{ - "runs":"All Runs", - "runStatus":"Status", - "runName":"Name", - "startedAt":"Started At", - "finishedAt":"Finished At", - "delete":"Delete", - "settings":"Settings", - "search":"Search Runs...", - "sort_tooltip": "Click to sort", - "notifications": { - "no_runs": "No runs found. Please try again.", - "delete_success": "Run deleted successfully" - } + "warning_modal": { + "title": "Active Browser Detected", + "message": "There is already a browser recording session running. Would you like to discard it and create a new recording?", + "discard_and_create": "Discard & Create New", + "cancel": "Cancel" }, - "proxy": { - "title": "Proxy Configuration", - "tab_standard": "Standard Proxy", - "tab_rotation": "Automatic Proxy Rotation", - "server_url": "Proxy Server URL", - "server_url_helper": "Proxy to be used for all robots. HTTP and SOCKS proxies are supported. Example http://myproxy.com:3128 or socks5://myproxy.com:3128. Short form myproxy.com:3128 is considered an HTTP proxy.", - "requires_auth": "Requires Authentication?", - "username": "Username", - "password": "Password", - "add_proxy": "Add Proxy", - "test_proxy": "Test Proxy", - "remove_proxy": "Remove Proxy", - "table": { - "proxy_url": "Proxy URL", - "requires_auth": "Requires Authentication" - }, - "coming_soon": "Coming Soon - In Open Source (Basic Rotation) & Cloud (Advanced Rotation). If you don't want to manage the infrastructure, join our cloud waitlist to get early access.", - "join_waitlist": "Join Maxun Cloud Waitlist", - "alert": { - "title": "If your proxy requires a username and password, always provide them separate from the proxy URL.", - "right_way": "The right way", - "wrong_way": "The wrong way", - "proxy_url": "Proxy URL:", - "username": "Username:", - "password": "Password:" - }, - "notifications": { - "config_success": "Proxy configuration submitted successfully", - "config_error": "Failed to submit proxy configuration. Try again.", - "test_success": "Proxy configuration is working", - "test_error": "Failed to test proxy configuration. Try again.", - "fetch_success": "Proxy configuration fetched successfully", - "remove_success": "Proxy configuration removed successfully", - "remove_error": "Failed to remove proxy configuration. Try again." - } + "retrain": "Retrain", + "edit": "Edit", + "delete": "Delete", + "duplicate": "Duplicate", + "search": "Search Robots...", + "notifications": { + "delete_warning": "The robot has associated runs. First delete runs to delete the robot", + "delete_success": "Robot deleted successfully", + "auth_success": "Robot successfully authenticated", + "browser_limit_warning": "Remote browsers are currently busy. Please wait for a few minutes and try again" + } + }, + "mainmenu": { + "recordings": "Robots", + "runs": "Runs", + "proxy": "Proxy", + "apikey": "API Key", + "feedback": "Join Maxun Cloud", + "apidocs": "Website To API" + }, + "runstable": { + "runs": "All Runs", + "runStatus": "Status", + "runName": "Name", + "startedAt": "Started At", + "finishedAt": "Finished At", + "delete": "Delete", + "settings": "Settings", + "search": "Search Runs...", + "sort_tooltip": "Click to sort", + "notifications": { + "no_runs": "No runs found. Please try again.", + "delete_success": "Run deleted successfully" + } + }, + "proxy": { + "title": "Proxy Configuration", + "tab_standard": "Standard Proxy", + "tab_rotation": "Automatic Proxy Rotation", + "server_url": "Proxy Server URL", + "server_url_helper": "Proxy to be used for all robots. HTTP and SOCKS proxies are supported. Example http://myproxy.com:3128 or socks5://myproxy.com:3128. Short form myproxy.com:3128 is considered an HTTP proxy.", + "requires_auth": "Requires Authentication?", + "username": "Username", + "password": "Password", + "add_proxy": "Add Proxy", + "test_proxy": "Test Proxy", + "remove_proxy": "Remove Proxy", + "table": { + "proxy_url": "Proxy URL", + "requires_auth": "Requires Authentication" }, - "apikey": { - "title": "Manage Your API Key", - "default_name": "Maxun API Key", - "table": { - "name": "API Key Name", - "key": "API Key", - "actions": "Actions" - }, - "actions": { - "copy": "Copy", - "show": "Show", - "hide": "Hide", - "delete": "Delete" - }, - "no_key_message": "You haven't generated an API key yet.", - "generate_button": "Generate API Key", - "notifications": { - "fetch_error": "Failed to fetch API Key - ${error}", - "generate_success": "Generated API Key successfully", - "generate_error": "Failed to generate API Key - ${error}", - "delete_success": "API Key deleted successfully", - "delete_error": "Failed to delete API Key - ${error}", - "copy_success": "Copied API Key successfully" - } + "coming_soon": "Coming Soon - In Open Source (Basic Rotation) & Cloud (Advanced Rotation). If you don't want to manage the infrastructure, join our cloud waitlist to get early access.", + "join_waitlist": "Join Maxun Cloud Waitlist", + "alert": { + "title": "If your proxy requires a username and password, always provide them separate from the proxy URL.", + "right_way": "The right way", + "wrong_way": "The wrong way", + "proxy_url": "Proxy URL:", + "username": "Username:", + "password": "Password:" }, - "action_description": { - "text": { - "title": "Capture Text", - "description": "Hover over the texts you want to extract and click to select them" - }, - "screenshot": { - "title": "Capture Screenshot", - "description": "Capture a partial or full page screenshot of the current page." - }, - "list": { - "title": "Capture List", - "description": "Hover over the list you want to extract. Once selected, you can hover over all texts inside the list you selected. Click to select them." - }, - "default": { - "title": "What data do you want to extract?", - "description": "A robot can perform one or multiple actions. Choose from the options listed below." - }, - "list_stages": { - "initial": "Select the list you want to extract along with the texts inside it", - "pagination": "Select how the robot can capture the rest of the list", - "limit": "Choose the number of items to extract", - "complete": "Capture is complete" - }, - "actions": { - "text": "Capture Text", - "list": "Capture List", - "screenshot": "Capture Screenshot" - } + "notifications": { + "config_success": "Proxy configuration submitted successfully", + "config_error": "Failed to submit proxy configuration. Try again.", + "test_success": "Proxy configuration is working", + "test_error": "Failed to test proxy configuration. Try again.", + "fetch_success": "Proxy configuration fetched successfully", + "remove_success": "Proxy configuration removed successfully", + "remove_error": "Failed to remove proxy configuration. Try again." + } + }, + "apikey": { + "title": "Manage Your API Key", + "default_name": "Maxun API Key", + "table": { + "name": "API Key Name", + "key": "API Key", + "actions": "Actions" }, - "right_panel": { - "buttons": { - "capture_list": "Capture List", - "capture_text": "Capture Text", - "capture_screenshot": "Capture Screenshot", - "confirm": "Confirm", - "discard": "Discard", - "confirm_capture": "Confirm Capture", - "confirm_pagination": "Confirm", - "confirm_limit": "Confirm", - "confirm_reset": "Confirm", - "finish_capture": "Finish Capture", - "back": "Back", - "reset": "Restart Recording", - "finish": "Finish", - "cancel": "Cancel", - "delete": "Delete" - }, - "screenshot": { - "capture_fullpage": "Capture Fullpage", - "capture_visible": "Capture Visible Part", - "display_fullpage": "Take Fullpage Screenshot", - "display_visible": "Take Visible Part Screenshot" - }, - "pagination": { - "title": "How can we find the next list item on the page?", - "click_next": "Click on next to navigate to the next page", - "click_load_more": "Click on load more to load more items", - "scroll_down": "Scroll down to load more items", - "scroll_up": "Scroll up to load more items", - "none": "No more items to load" - }, - "limit": { - "title": "What is the maximum number of rows you want to extract?", - "custom": "Custom", - "enter_number": "Enter number" - }, - "fields": { - "label": "Label", - "data": "Data", - "field_label": "Field Label", - "field_data": "Field Data" - }, - "messages": { - "list_selected": "List Selected Successfully", - "list_empty": "List selected. Please select fields inside the list." - }, - "errors": { - "select_pagination": "Please select a pagination type.", - "select_pagination_element": "Please select the pagination element first.", - "select_limit": "Please select a limit or enter a custom limit.", - "invalid_limit": "Please enter a valid limit.", - "confirm_text_fields": "Please confirm all text fields", - "unable_create_settings": "Unable to create list settings. Make sure you have defined a field for the list.", - "capture_text_discarded": "Capture Text Discarded", - "capture_list_discarded": "Capture List Discarded", - "label_required": "Label cannot be empty" - } + "actions": { + "copy": "Copy", + "show": "Show", + "hide": "Hide", + "delete": "Delete" }, - "save_recording": { - "title": "Save Robot", - "robot_name": "Robot Name", - "buttons": { - "save": "Save", - "confirm": "Confirm" - }, - "notifications": { - "save_success": "Robot saved successfully", - "retrain_success": "Robot retrained successfully", - "save_error": "Error saving robot" - }, - "errors": { - "user_not_logged": "User not logged in. Cannot save recording.", - "exists_warning": "Robot with this name already exists, please confirm the Robot's overwrite." - }, - "tooltips": { - "saving": "Optimizing and saving the workflow" - } + "no_key_message": "You haven't generated an API key yet.", + "generate_button": "Generate API Key", + "notifications": { + "fetch_error": "Failed to fetch API Key - ${error}", + "generate_success": "Generated API Key successfully", + "generate_error": "Failed to generate API Key - ${error}", + "delete_success": "API Key deleted successfully", + "delete_error": "Failed to delete API Key - ${error}", + "copy_success": "Copied API Key successfully" + } + }, + "action_description": { + "text": { + "title": "Capture Text", + "description": "Hover over the texts you want to extract and click to select them" }, - "browser_recording": { - "modal": { - "confirm_discard": "Are you sure you want to discard the recording?", - "confirm_reset": "Are you sure you want to restart the recording?", - "reset_warning": "This will clear all previous captures in the current session. The recording session will restart for the same website." - }, - "notifications": { - "terminated": "Current Recording was terminated", - "environment_reset": "Browser environment has been reset", - "reset_successful": "Successfully reset all captures and returned to initial state" - } + "screenshot": { + "title": "Capture Screenshot", + "description": "Capture a partial or full page screenshot of the current page." }, - "interpretation_log": { - "titles": { - "output_preview": "Output Data Preview", - "screenshot": "Screenshot" - }, - "messages": { - "additional_rows": "Additional rows of data will be extracted once you finish recording.", - "successful_training": "You've successfully trained the robot to perform actions! Click on the button below to get a preview of the data your robot will extract.", - "no_selection": "It looks like you have not selected anything for extraction yet. Once you do, the robot will show a preview of your selections here." - }, - "data_sections": { - "binary_received": "---------- Binary output data received ----------", - "serializable_received": "---------- Serializable output data received ----------", - "mimetype": "mimetype: ", - "image_below": "Image is rendered below:", - "separator": "--------------------------------------------------" - }, - "notifications": { - "reset_success": "Output Preview reset successfully" - } + "list": { + "title": "Capture List", + "description": "Hover over the list you want to extract. Once selected, you can hover over all texts inside the list you selected. Click to select them." }, - "interpretation_buttons": { - "buttons": { - "preview": "Get Preview of Output Data", - "reset": "Reset", - "yes": "Yes", - "no": "No" - }, - "messages": { - "extracting": "Extracting data...please wait for 10secs to 1min", - "restart_required": "Please restart the interpretation after updating the recording", - "run_finished": "Run finished", - "run_failed": "Run failed to start" - }, - "modal": { - "use_previous": "Do you want to use your previous selection as a condition for performing this action?", - "previous_action": "Your previous action was: ", - "element_text": "on an element with text " - } + "default": { + "title": "What data do you want to extract?", + "description": "A robot can perform one or multiple actions. Choose from the options listed below." }, - "recording_page": { - "loader": { - "browser_startup": "Spinning up a browser...Navigating to {{url}}" - } + "list_stages": { + "initial": "Select the list you want to extract along with the texts inside it", + "pagination": "Select how the robot can capture the rest of the list", + "limit": "Choose the number of items to extract", + "complete": "Capture is complete" + }, + "actions": { + "text": "Capture Text", + "list": "Capture List", + "screenshot": "Capture Screenshot" + } + }, + "right_panel": { + "buttons": { + "capture_list": "Capture List", + "capture_text": "Capture Text", + "capture_screenshot": "Capture Screenshot", + "confirm": "Confirm", + "discard": "Discard", + "confirm_capture": "Confirm Capture", + "confirm_pagination": "Confirm", + "confirm_limit": "Confirm", + "confirm_reset": "Confirm", + "finish_capture": "Finish Capture", + "back": "Back", + "reset": "Restart Recording", + "finish": "Finish", + "cancel": "Cancel", + "delete": "Delete" + }, + "screenshot": { + "capture_fullpage": "Capture Fullpage", + "capture_visible": "Capture Visible Part", + "display_fullpage": "Take Fullpage Screenshot", + "display_visible": "Take Visible Part Screenshot" + }, + "pagination": { + "title": "How can we find the next list item on the page?", + "click_next": "Click on next to navigate to the next page", + "click_load_more": "Click on load more to load more items", + "scroll_down": "Scroll down to load more items", + "scroll_up": "Scroll up to load more items", + "none": "No more items to load" + }, + "limit": { + "title": "What is the maximum number of rows you want to extract?", + "custom": "Custom", + "enter_number": "Enter number" + }, + "fields": { + "label": "Label", + "data": "Data", + "field_label": "Field Label", + "field_data": "Field Data" + }, + "messages": { + "list_selected": "List Selected Successfully", + "list_empty": "List selected. Please select fields inside the list." + }, + "errors": { + "select_pagination": "Please select a pagination type.", + "select_pagination_element": "Please select the pagination element first.", + "select_limit": "Please select a limit or enter a custom limit.", + "invalid_limit": "Please enter a valid limit.", + "confirm_text_fields": "Please confirm all text fields", + "unable_create_settings": "Unable to create list settings. Make sure you have defined a field for the list.", + "capture_text_discarded": "Capture Text Discarded", + "capture_list_discarded": "Capture List Discarded", + "label_required": "Label cannot be empty" + } + }, + "save_recording": { + "title": "Save Robot", + "robot_name": "Robot Name", + "buttons": { + "save": "Save", + "confirm": "Confirm" + }, + "notifications": { + "save_success": "Robot saved successfully", + "retrain_success": "Robot retrained successfully", + "save_error": "Error saving robot" }, - "integration_settings": { - "title": "Integration Settings", + "errors": { + "user_not_logged": "User not logged in. Cannot save recording.", + "exists_warning": "Robot with this name already exists, please confirm the Robot's overwrite." + }, + "tooltips": { + "saving": "Optimizing and saving the workflow" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "Are you sure you want to discard the recording?", + "confirm_reset": "Are you sure you want to restart the recording?", + "reset_warning": "This will clear all previous captures in the current session. The recording session will restart for the same website." + }, + "notifications": { + "terminated": "Current Recording was terminated", + "environment_reset": "Browser environment has been reset", + "reset_successful": "Successfully reset all captures and returned to initial state" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "Output Data Preview", + "screenshot": "Screenshot" + }, + "messages": { + "additional_rows": "Additional rows of data will be extracted once you finish recording.", + "successful_training": "You've successfully trained the robot to perform actions! Click on the button below to get a preview of the data your robot will extract.", + "no_selection": "It looks like you have not selected anything for extraction yet. Once you do, the robot will show a preview of your selections here." + }, + "data_sections": { + "binary_received": "---------- Binary output data received ----------", + "serializable_received": "---------- Serializable output data received ----------", + "mimetype": "mimetype: ", + "image_below": "Image is rendered below:", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "Output Preview reset successfully" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "Get Preview of Output Data", + "reset": "Reset", + "yes": "Yes", + "no": "No" + }, + "messages": { + "extracting": "Extracting data...please wait for 10secs to 1min", + "restart_required": "Please restart the interpretation after updating the recording", + "run_finished": "Run finished", + "run_failed": "Run failed to start" + }, + "modal": { + "use_previous": "Do you want to use your previous selection as a condition for performing this action?", + "previous_action": "Your previous action was: ", + "element_text": "on an element with text " + } + }, + "recording_page": { + "loader": { + "browser_startup": "Spinning up a browser...Navigating to {{url}}" + } + }, + "integration_settings": { + "title": "Integration Settings", + "descriptions": { + "authenticated_as": "Authenticated as: {{email}}" + }, + "buttons": { + "submit": "Submit", + "remove_integration": "Remove Integration" + }, + "google": { + "title": "Integrate with Google Sheet", "descriptions": { + "sync_info": "If you enable this option, every time this robot runs a task successfully, its captured data will be appended to your Google Sheet.", "authenticated_as": "Authenticated as: {{email}}" }, + "alerts": { + "success": { + "title": "Google Sheet Integrated Successfully.", + "content": "Every time this robot creates a successful run, its captured data is appended to your {{sheetName}} Google Sheet. You can check the data updates", + "here": "here", + "note": "Note:", + "sync_limitation": "The data extracted before integrating with Google Sheets will not be synced in the Google Sheet. Only the data extracted after the integration will be synced." + } + }, "buttons": { - "submit": "Submit", - "remove_integration": "Remove Integration" + "authenticate": "Authenticate with Google", + "fetch_sheets": "Fetch Google Spreadsheets", + "remove_integration": "Remove Integration", + "submit": "Submit" }, - "google": { - "title": "Integrate with Google Sheet", - "descriptions": { - "sync_info": "If you enable this option, every time this robot runs a task successfully, its captured data will be appended to your Google Sheet.", - "authenticated_as": "Authenticated as: {{email}}" - }, - "alerts": { - "success": { - "title": "Google Sheet Integrated Successfully.", - "content": "Every time this robot creates a successful run, its captured data is appended to your {{sheetName}} Google Sheet. You can check the data updates", - "here": "here", - "note": "Note:", - "sync_limitation": "The data extracted before integrating with Google Sheets will not be synced in the Google Sheet. Only the data extracted after the integration will be synced." - } - }, - "buttons": { - "authenticate": "Authenticate with Google", - "fetch_sheets": "Fetch Google Spreadsheets", - "remove_integration": "Remove Integration", - "submit": "Submit" - }, - "fields": { - "select_sheet": "Select Google Sheet", - "selected_sheet": "Selected Sheet: {{name}} (ID: {{id}})" - }, - "errors": { - "auth_error": "Error authenticating with Google", - "fetch_error": "Error fetching spreadsheet files: {{message}}", - "update_error": "Error updating Google Sheet ID: {{message}}", - "remove_error": "Error removing Google Sheets integration: {{message}}" - }, - "notifications": { - "sheet_selected": "Google Sheet selected successfully", - "integration_removed": "Google Sheets integration removed successfully" - } + "fields": { + "select_sheet": "Select Google Sheet", + "selected_sheet": "Selected Sheet: {{name}} (ID: {{id}})" }, - "airtable": { - "title": "Integrate with Airtable", - "descriptions": { - "sync_info": "If you enable this option, every time this robot runs a task successfully, its captured data will be appended to your Airtable Base.", - "authenticated_as": "Authenticated with Airtable successfully. You can now select the base and table to integrate with." - }, - "alerts": { - "success": { - "title": "Airtable Base Integrated Successfully", - "content": "Every time this robot creates a successful run, its captured data is appended to your {{baseName}} Base and {{tableName}} Table. You can check updates", - "here": "here", - "note": "Note:", - "sync_limitation": "Only data captured after integration will be synced to Airtable." - } - }, - "buttons": { - "authenticate": "Connect with Airtable", - "fetch_bases": "Fetch Airtable Bases", - "fetch_tables": "Fetch Airtable Tables", - "remove_integration": "Remove Integration", - "submit": "Select Base and Table" - }, - "fields": { - "select_base": "Select Airtable Base", - "select_table": "Select Airtable Table", - "selected_base": "Selected Base: {{name}}", - "selected_table": "Selected Table: {{name}}" - }, - "errors": { - "auth_error": "Error authenticating with Airtable", - "fetch_error": "Error fetching Airtable bases: {{message}}", - "fetch_tables_error": "Error fetching Airtable tables: {{message}}", - "update_error": "Error updating Airtable base: {{message}}", - "remove_error": "Error removing Airtable integration: {{message}}" - }, - "notifications": { - "base_selected": "Airtable base selected successfully", - "table_selected": "Airtable table selected successfully", - "integration_removed": "Airtable integration removed successfully" - } + "errors": { + "auth_error": "Error authenticating with Google", + "fetch_error": "Error fetching spreadsheet files: {{message}}", + "update_error": "Error updating Google Sheet ID: {{message}}", + "remove_error": "Error removing Google Sheets integration: {{message}}" + }, + "notifications": { + "sheet_selected": "Google Sheet selected successfully", + "integration_removed": "Google Sheets integration removed successfully" } }, - "robot_duplication": { - "title": "Duplicate Robot", + "airtable": { + "title": "Integrate with Airtable", "descriptions": { - "purpose": "Robot duplication is useful to extract data from pages with the same structure.", - "example": "Example: If you've created a robot for {{url1}}, you can duplicate it to scrape similar pages like {{url2}} without training a robot from scratch.", - "warning": "⚠️ Ensure the new page has the same structure as the original page." + "sync_info": "If you enable this option, every time this robot runs a task successfully, its captured data will be appended to your Airtable Base.", + "authenticated_as": "Authenticated with Airtable successfully. You can now select the base and table to integrate with." }, - "fields": { - "target_url": "Robot Target URL" + "alerts": { + "success": { + "title": "Airtable Base Integrated Successfully", + "content": "Every time this robot creates a successful run, its captured data is appended to your {{baseName}} Base and {{tableName}} Table. You can check updates", + "here": "here", + "note": "Note:", + "sync_limitation": "Only data captured after integration will be synced to Airtable." + } }, "buttons": { - "duplicate": "Duplicate Robot", - "cancel": "Cancel" + "authenticate": "Connect with Airtable", + "fetch_bases": "Fetch Airtable Bases", + "fetch_tables": "Fetch Airtable Tables", + "remove_integration": "Remove Integration", + "submit": "Select Base and Table" + }, + "fields": { + "select_base": "Select Airtable Base", + "select_table": "Select Airtable Table", + "selected_base": "Selected Base: {{name}}", + "selected_table": "Selected Table: {{name}}" + }, + "errors": { + "auth_error": "Error authenticating with Airtable", + "fetch_error": "Error fetching Airtable bases: {{message}}", + "fetch_tables_error": "Error fetching Airtable tables: {{message}}", + "update_error": "Error updating Airtable base: {{message}}", + "remove_error": "Error removing Airtable integration: {{message}}" }, "notifications": { - "robot_not_found": "Could not find robot details. Please try again.", - "url_required": "Target URL is required.", - "duplicate_success": "Robot duplicated successfully.", - "duplicate_error": "Failed to update the Target URL. Please try again.", - "unknown_error": "An error occurred while updating the Target URL." + "base_selected": "Airtable base selected successfully", + "table_selected": "Airtable table selected successfully", + "integration_removed": "Airtable integration removed successfully" } + } + }, + "robot_duplication": { + "title": "Duplicate Robot", + "descriptions": { + "purpose": "Robot duplication is useful to extract data from pages with the same structure.", + "example": "Example: If you've created a robot for {{url1}}, you can duplicate it to scrape similar pages like {{url2}} without training a robot from scratch.", + "warning": "⚠️ Ensure the new page has the same structure as the original page." }, - "robot_settings": { - "title": "Robot Settings", - "target_url": "Robot Target URL", - "robot_id": "Robot ID", - "robot_limit": "Robot Limit", - "created_by_user": "Created By User", - "created_at": "Robot Created At", - "errors": { - "robot_not_found": "Could not find robot details. Please try again." - } + "fields": { + "target_url": "Robot Target URL" }, - "robot_edit": { - "title": "Edit Robot", - "change_name": "Robot Name", - "robot_limit": "Robot Limit", - "save": "Save Changes", - "cancel": "Cancel", - "notifications": { - "update_success": "Robot updated successfully.", - "update_failed": "Failed to update the robot. Please try again.", - "update_error": "An error occurred while updating the robot." - } + "buttons": { + "duplicate": "Duplicate Robot", + "cancel": "Cancel" }, - "schedule_settings": { - "title": "Schedule Settings", - "run_every": "Run every", - "start_from": "Start From", - "on_day": "On day", - "at_around": "At around", - "timezone": "Timezone", - "buttons": { - "delete_schedule": "Delete Schedule", - "save_schedule": "Save Schedule", - "cancel": "Cancel" - }, - "labels": { - "in_between": "In Between", - "run_once_every": "Run once every", - "start_from_label": "Start From", - "on_day_of_month": "On Day of the Month", - "on_day": { - "st": "st", - "nd": "nd", - "rd": "rd", - "th": "th" - } + "notifications": { + "robot_not_found": "Could not find robot details. Please try again.", + "url_required": "Target URL is required.", + "duplicate_success": "Robot duplicated successfully.", + "duplicate_error": "Failed to update the Target URL. Please try again.", + "unknown_error": "An error occurred while updating the Target URL." + } + }, + "robot_settings": { + "title": "Robot Settings", + "target_url": "Robot Target URL", + "robot_id": "Robot ID", + "robot_limit": "Robot Limit", + "created_by_user": "Created By User", + "created_at": "Robot Created At", + "errors": { + "robot_not_found": "Could not find robot details. Please try again." + } + }, + "robot_edit": { + "title": "Edit Robot", + "change_name": "Robot Name", + "robot_limit": "Robot Limit", + "save": "Save Changes", + "cancel": "Cancel", + "notifications": { + "update_success": "Robot updated successfully.", + "update_failed": "Failed to update the robot. Please try again.", + "update_error": "An error occurred while updating the robot." + } + }, + "schedule_settings": { + "title": "Schedule Settings", + "run_every": "Run every", + "start_from": "Start From", + "on_day": "On day", + "at_around": "At around", + "timezone": "Timezone", + "buttons": { + "delete_schedule": "Delete Schedule", + "save_schedule": "Save Schedule", + "cancel": "Cancel" + }, + "labels": { + "in_between": "In Between", + "run_once_every": "Run once every", + "start_from_label": "Start From", + "on_day_of_month": "On Day of the Month", + "on_day": { + "st": "st", + "nd": "nd", + "rd": "rd", + "th": "th" } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "Interpretation of robot {{name}} succeeded", + "interpretation_failed": "Failed to interpret robot {{name}}", + "run_started": "Running robot: {{name}}", + "run_start_failed": "Failed to run robot: {{name}}", + "schedule_success": "Robot {{name}} scheduled successfully", + "schedule_failed": "Failed to schedule robot {{name}}", + "abort_success": "Interpretation of robot {{name}} aborted successfully", + "abort_failed": "Failed to abort the interpretation of robot {{name}}", + "abort_initiated": "Aborting the interpretation of robot {{name}}" }, - "main_page": { + "menu": { + "recordings": "Robots", + "runs": "Runs", + "proxy": "Proxy", + "apikey": "API Key" + } + }, + "browser_window": { + "attribute_modal": { + "title": "Select Attribute", "notifications": { - "interpretation_success": "Interpretation of robot {{name}} succeeded", - "interpretation_failed": "Failed to interpret robot {{name}}", - "run_started": "Running robot: {{name}}", - "run_start_failed": "Failed to run robot: {{name}}", - "schedule_success": "Robot {{name}} scheduled successfully", - "schedule_failed": "Failed to schedule robot {{name}}", - "abort_success": "Interpretation of robot {{name}} aborted successfully", - "abort_failed": "Failed to abort the interpretation of robot {{name}}", - "abort_initiated": "Aborting the interpretation of robot {{name}}" - }, - "menu": { - "recordings": "Robots", - "runs": "Runs", - "proxy": "Proxy", - "apikey": "API Key" + "list_select_success": "List has been successfully selected. Please select the text data to extract.", + "pagination_select_success": "Pagination element has been successfully selected." } }, - "browser_window": { - "attribute_modal": { - "title": "Select Attribute", - "notifications": { - "list_select_success": "List has been successfully selected. Please select the text data to extract.", - "pagination_select_success": "Pagination element has been successfully selected." - } + "attribute_options": { + "anchor": { + "text": "Text: {{text}}", + "url": "URL: {{url}}" + }, + "image": { + "alt_text": "Alt Text: {{altText}}", + "image_url": "Image URL: {{imageUrl}}" }, - "attribute_options": { - "anchor": { - "text": "Text: {{text}}", - "url": "URL: {{url}}" - }, - "image": { - "alt_text": "Alt Text: {{altText}}", - "image_url": "Image URL: {{imageUrl}}" - }, - "default": { - "text": "Text: {{text}}" - } + "default": { + "text": "Text: {{text}}" } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "Manual Run", + "scheduled_run": "Scheduled Run", + "api": "API", + "unknown_run_type": "Unknown Run Type" }, - "runs_table": { - "run_type_chips": { - "manual_run": "Manual Run", - "scheduled_run": "Scheduled Run", - "api": "API", - "unknown_run_type": "Unknown Run Type" - }, - "run_status_chips": { - "success": "Success", - "running": "Running", - "scheduled": "Scheduled", - "queued": "Queued", - "failed": "Failed", - "aborted": "Aborted" - }, - "run_settings_modal": { - "title": "Run Settings", - "labels": { - "run_id": "Run ID", - "run_by_user": "Run by User", - "run_by_schedule": "Run by Schedule ID", - "run_by_api": "Run by API", - "run_type": "Run Type" - } + "run_status_chips": { + "success": "Success", + "running": "Running", + "scheduled": "Scheduled", + "queued": "Queued", + "failed": "Failed", + "aborted": "Aborted" + }, + "run_settings_modal": { + "title": "Run Settings", + "labels": { + "run_id": "Run ID", + "run_by_user": "Run by User", + "run_by_schedule": "Run by Schedule ID", + "run_by_api": "Run by API", + "run_type": "Run Type" } + } + }, + "run_content": { + "tabs": { + "output_data": "Output Data", + "log": "Log" }, - "run_content": { - "tabs": { - "output_data": "Output Data", - "log": "Log" - }, - "buttons": { - "stop": "Stop" - }, - "loading": "Loading data...", - "empty_output": "No output data available", - "captured_data": { - "title": "Captured Data", - "download_csv": "Download CSV", - "view_full": "View Full Data", - "items": "items", - "schema_title": "Captured Texts", - "list_title": "Captured Lists" + "buttons": { + "stop": "Stop" + }, + "loading": "Loading data...", + "empty_output": "No output data available", + "captured_data": { + "title": "Captured Data", + "download_csv": "Download CSV", + "view_full": "View Full Data", + "items": "items", + "schema_title": "Captured Texts", + "list_title": "Captured Lists" + }, + "captured_screenshot": { + "title": "Captured Screenshots", + "download": "Download", + "render_failed": "Failed to render screenshot" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "Logged out successfully" }, - "captured_screenshot": { - "title": "Captured Screenshots", - "download": "Download", - "render_failed": "Failed to render screenshot" + "errors": { + "logout": { + "unauthorized": "You are not authorized to perform this action", + "server": "Server error occurred during logout", + "network": "Network error while logging out", + "unknown": "An unexpected error occurred during logout" + } } }, - "navbar": { - "project_name": "Maxun", - "notifications": { - "success": { - "logout": "Logged out successfully" - }, - "errors": { - "logout": { - "unauthorized": "You are not authorized to perform this action", - "server": "Server error occurred during logout", - "network": "Network error while logging out", - "unknown": "An unexpected error occurred during logout" - } - } - }, - "upgrade": { - "button": "Upgrade", - "modal": { - "up_to_date": "🎉 You're up to date!", - "new_version_available": "A new version is available: {{version}}. Upgrade to the latest version for bug fixes, enhancements and new features!", - "view_updates": "View all the new updates", - "view_updates_link": "here", - "tabs": { - "manual_setup": "Manual Setup Upgrade", - "docker_setup": "Docker Compose Setup Upgrade" - } + "upgrade": { + "button": "Upgrade", + "modal": { + "up_to_date": "🎉 You're up to date!", + "new_version_available": "A new version is available: {{version}}. Upgrade to the latest version for bug fixes, enhancements and new features!", + "view_updates": "View all the new updates", + "view_updates_link": "here", + "tabs": { + "manual_setup": "Manual Setup Upgrade", + "docker_setup": "Docker Compose Setup Upgrade" } - }, - "menu_items": { - "logout": "Logout", - "discord": "Discord", - "youtube": "YouTube", - "twitter": "Twitter (X)", - "language": "Language" - }, - "recording": { - "discard": "Discard" } }, - "language_menu": { - "en": "English", - "es": "Spanish", - "ja": "Japanese", - "zh": "Chinese", - "de": "German" + "menu_items": { + "logout": "Logout", + "discord": "Discord", + "youtube": "YouTube", + "twitter": "Twitter (X)", + "language": "Language" + }, + "recording": { + "discard": "Discard" } -} \ No newline at end of file + }, + "language_menu": { + "en": "English", + "es": "Spanish", + "ja": "Japanese", + "zh": "Chinese", + "de": "German", + "ru": "Russian", + "fr": "French", + "ko": "Korean" + } +} diff --git a/public/locales/es.json b/public/locales/es.json index 8236157c0..cdf52909c 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -1,7 +1,7 @@ { "login": { "title": "¡Bienvenido de nuevo!", - "email": "Introducir correo electrónico de trabajo", + "email": "Ingrese correo de trabajo", "password": "Contraseña", "button": "Iniciar sesión", "loading": "Cargando", @@ -9,19 +9,19 @@ "register_link": "Registrarse", "welcome_notification": "¡Bienvenido a Maxun!", "validation": { - "required_fields": "El correo electrónico y la contraseña son obligatorios", + "required_fields": "Correo y contraseña son obligatorios", "password_length": "La contraseña debe tener al menos 6 caracteres" }, "error": { "user_not_found": "El usuario no existe", - "invalid_credentials": "Correo electrónico o contraseña inválidos", - "server_error": "Error al iniciar sesión. Por favor, inténtelo de nuevo más tarde", - "generic": "Se produjo un error. Por favor, inténtelo de nuevo" + "invalid_credentials": "Correo o contraseña inválidos", + "server_error": "Error de inicio de sesión. Por favor, inténtalo más tarde", + "generic": "Ocurrió un error. Por favor, inténtalo de nuevo" } }, "register": { - "title": "Crear cuenta", - "email": "Introducir correo electrónico de trabajo", + "title": "Crear una cuenta", + "email": "Ingrese correo de trabajo", "password": "Contraseña", "button": "Registrarse", "loading": "Cargando", @@ -29,14 +29,14 @@ "login_link": "Iniciar sesión", "welcome_notification": "¡Bienvenido a Maxun!", "validation": { - "email_required": "El correo electrónico es obligatorio", + "email_required": "El correo es obligatorio", "password_requirements": "La contraseña debe tener al menos 6 caracteres" }, "error": { - "user_exists": "Ya existe un usuario con este correo electrónico", + "user_exists": "Ya existe un usuario con este correo", "creation_failed": "No se pudo crear la cuenta", "server_error": "Ocurrió un error en el servidor", - "generic": "Error en el registro. Por favor, inténtelo de nuevo" + "generic": "El registro falló. Por favor, inténtalo de nuevo" } }, "recordingtable": { @@ -44,26 +44,32 @@ "name": "Nombre", "schedule": "Programar", "integrate": "Integrar", - "settings": "Ajustes", + "settings": "Configuración", "options": "Opciones", "heading": "Mis Robots", "new": "Crear Robot", "modal": { - "title": "Ingresa la URL", - "login_title": "¿Este sitio web requiere iniciar sesión?", + "title": "Introduce la URL", + "login_title": "¿Este sitio web requiere inicio de sesión?", "label": "URL", "button": "Comenzar grabación" }, + "warning_modal": { + "title": "Navegador activo detectado", + "message": "Ya hay una sesión de grabación del navegador activa. ¿Deseas descartarla y crear una nueva grabación?", + "discard_and_create": "Descartar y crear nueva", + "cancel": "Cancelar" + }, "retrain": "Reentrenar", "edit": "Editar", "delete": "Eliminar", "duplicate": "Duplicar", "search": "Buscar robots...", "notifications": { - "delete_warning": "El robot tiene ejecuciones asociadas. Primero elimine las ejecuciones para eliminar el robot", + "delete_warning": "El robot tiene ejecuciones asociadas. Primero elimina las ejecuciones para poder eliminar el robot", "delete_success": "Robot eliminado exitosamente", "auth_success": "Robot autenticado exitosamente", - "browser_limit_warning": "Los navegadores remotos están ocupados actualmente. Por favor, espere unos minutos e inténtelo de nuevo" + "browser_limit_warning": "Los navegadores remotos están ocupados. Espera unos minutos y vuelve a intentarlo" } }, "mainmenu": { @@ -72,62 +78,62 @@ "proxy": "Proxy", "apikey": "Clave API", "feedback": "Unirse a Maxun Cloud", - "apidocs": "Sitio Web a API" + "apidocs": "Website a API" }, "runstable": { - "runs": "Todas las ejecuciones", + "runs": "Todas las Ejecuciones", "runStatus": "Estado", "runName": "Nombre", - "startedAt": "Iniciado el", - "finishedAt": "Finalizado el", + "startedAt": "Iniciado en", + "finishedAt": "Finalizado en", "delete": "Eliminar", - "settings": "Ajustes", + "settings": "Configuración", "search": "Buscar ejecuciones...", - "sort_tooltip": "Haga clic para ordenar", + "sort_tooltip": "Haz clic para ordenar", "notifications": { - "no_runs": "No se encontraron ejecuciones. Por favor, inténtelo de nuevo.", - "delete_success": "Ejecución eliminada con éxito" + "no_runs": "No se encontraron ejecuciones. Por favor, inténtalo de nuevo.", + "delete_success": "Ejecución eliminada exitosamente" } }, "proxy": { - "title": "Configuración del Proxy", + "title": "Configuración de Proxy", "tab_standard": "Proxy Estándar", "tab_rotation": "Rotación Automática de Proxy", - "server_url": "URL del Servidor Proxy", - "server_url_helper": "Proxy para usar en todos los robots. Se admiten proxies HTTP y SOCKS. Ejemplo http://myproxy.com:3128 o socks5://myproxy.com:3128. La forma corta myproxy.com:3128 se considera un proxy HTTP.", - "requires_auth": "¿Requiere Autenticación?", + "server_url": "URL del servidor de proxy", + "server_url_helper": "Proxy a utilizar para todos los robots. Se admiten proxies HTTP y SOCKS. Ejemplo http://myproxy.com:3128 o socks5://myproxy.com:3128. El formato corto myproxy.com:3128 se considerará como proxy HTTP.", + "requires_auth": "¿Requiere autenticación?", "username": "Usuario", "password": "Contraseña", "add_proxy": "Agregar Proxy", "test_proxy": "Probar Proxy", "remove_proxy": "Eliminar Proxy", "table": { - "proxy_url": "URL del Proxy", + "proxy_url": "URL de Proxy", "requires_auth": "Requiere Autenticación" }, - "coming_soon": "Próximamente - En Open Source (Rotación Básica) y Cloud (Rotación Avanzada). Si no desea administrar la infraestructura, únase a nuestra lista de espera en la nube para obtener acceso anticipado.", - "join_waitlist": "Unirse a la Lista de Espera de Maxun Cloud", + "coming_soon": "Próximamente - En Open Source (Rotación básica) y Cloud (Rotación avanzada). Si no deseas gestionar la infraestructura, únete a la lista de espera de nuestra cloud para obtener acceso anticipado.", + "join_waitlist": "Unirse a la lista de espera de Maxun Cloud", "alert": { - "title": "Si su proxy requiere un nombre de usuario y contraseña, proporcione siempre estos datos por separado de la URL del proxy.", - "right_way": "La forma correcta", - "wrong_way": "La forma incorrecta", - "proxy_url": "URL del Proxy:", + "title": "Si tu proxy requiere usuario y contraseña, siéntete libre de proporcionarlos por separado de la URL.", + "right_way": "La manera correcta", + "wrong_way": "De la manera incorrecta", + "proxy_url": "URL de Proxy:", "username": "Usuario:", "password": "Contraseña:" }, "notifications": { - "config_success": "Configuración del proxy enviada con éxito", - "config_error": "Error al enviar la configuración del proxy. Inténtelo de nuevo.", - "test_success": "La configuración del proxy funciona correctamente", - "test_error": "Error al probar la configuración del proxy. Inténtelo de nuevo.", - "fetch_success": "Configuración del proxy recuperada con éxito", - "remove_success": "Configuración del proxy eliminada con éxito", - "remove_error": "Error al eliminar la configuración del proxy. Inténtelo de nuevo." + "config_success": "Configuración de proxy enviada exitosamente", + "config_error": "Error al enviar configuración de proxy. Inténtalo de nuevo.", + "test_success": "La configuración de proxy está funcionando", + "test_error": "Error al probar la configuración de proxy. Inténtalo de nuevo.", + "fetch_success": "Configuración de proxy obtenida exitosamente", + "remove_success": "Configuración de proxy eliminada exitosamente", + "remove_error": "Error al eliminar la configuración de proxy. Inténtalo de nuevo." } }, "apikey": { - "title": "Gestionar tu Clave API", - "default_name": "Clave API de Maxun", + "title": "Gestiona tu clave API", + "default_name": "Clave API Maxun", "table": { "name": "Nombre de la Clave API", "key": "Clave API", @@ -139,54 +145,60 @@ "hide": "Ocultar", "delete": "Eliminar" }, - "no_key_message": "Aún no has generado una clave API.", - "generate_button": "Generar Clave API", + "no_key_message": "Aún no has generado una clave de API.", + "generate_button": "Generar clave API", "notifications": { - "fetch_error": "Error al obtener la clave API - ${error}", - "generate_success": "Clave API generada con éxito", - "generate_error": "Error al generar la clave API - ${error}", - "delete_success": "Clave API eliminada con éxito", - "delete_error": "Error al eliminar la clave API - ${error}", - "copy_success": "Clave API copiada con éxito" + "fetch_error": "No se pudo obtener la clave API - ${error}", + "generate_success": "Clave API generada exitosamente", + "generate_error": "Error al generar clave API - ${error}", + "delete_success": "Clave API eliminada exitosamente", + "delete_error": "Error al eliminar clave API - ${error}", + "copy_success": "Clave API copiada exitosamente" } }, "action_description": { "text": { "title": "Capturar Texto", - "description": "Pase el cursor sobre los textos que desea extraer y haga clic para seleccionarlos" + "description": "Pasa el cursor sobre los textos que deseas extraer y haz clic para seleccionarlos" }, "screenshot": { - "title": "Capturar Pantalla", - "description": "Capture una captura de pantalla parcial o completa de la página actual." + "title": "Capturar Captura de Pantalla", + "description": "Captura una captura de pantalla parcial o de página completa." }, "list": { "title": "Capturar Lista", - "description": "Pase el cursor sobre la lista que desea extraer. Una vez seleccionada, puede pasar el cursor sobre todos los textos dentro de la lista seleccionada. Haga clic para seleccionarlos." + "description": "Pasa el cursor sobre la lista que deseas extraer. Una vez seleccionada, puedes pasar el cursor por todos los textos dentro de la lista seleccionada. Haz clic para seleccionarlos." }, "default": { - "title": "¿Qué datos desea extraer?", - "description": "Un robot puede realizar una o varias acciones. Elija entre las opciones que aparecen a continuación." + "title": "¿Qué datos deseas extraer?", + "description": "Un robot puede realizar una o varias acciones. Elige de las opciones de abajo." }, "list_stages": { - "initial": "Seleccione la lista que desea extraer junto con los textos que contiene", - "pagination": "Seleccione cómo puede el robot capturar el resto de la lista", - "limit": "Elija el número de elementos a extraer", + "initial": "Selecciona la lista que deseas extraer junto con los textos en ella", + "pagination": "Selecciona cómo el robot puede capturar el resto de la lista", + "limit": "Elige el número de elementos a extraer", "complete": "Captura completada" + }, + "actions": { + "text": "Capturar Texto", + "list": "Capturar Lista", + "screenshot": "Capturar Captura de Pantalla" } }, "right_panel": { "buttons": { "capture_list": "Capturar Lista", "capture_text": "Capturar Texto", - "capture_screenshot": "Capturar Pantalla", + "capture_screenshot": "Capturar Captura de Pantalla", "confirm": "Confirmar", "discard": "Descartar", "confirm_capture": "Confirmar Captura", "confirm_pagination": "Confirmar", "confirm_limit": "Confirmar", + "confirm_reset": "Confirmar", "finish_capture": "Finalizar Captura", "back": "Atrás", - "reset": "Reiniciar", + "reset": "Reiniciar Grabación", "finish": "Finalizar", "cancel": "Cancelar", "delete": "Eliminar" @@ -194,41 +206,41 @@ "screenshot": { "capture_fullpage": "Capturar Página Completa", "capture_visible": "Capturar Parte Visible", - "display_fullpage": "Capturar Screenshot de Página Completa", - "display_visible": "Capturar Screenshot de Parte Visible" + "display_fullpage": "Tomar captura de pantalla de toda la página", + "display_visible": "Tomar captura de pantalla de la parte visible" }, "pagination": { - "title": "¿Cómo podemos encontrar el siguiente elemento de la lista en la página?", - "click_next": "Hacer clic en siguiente para navegar a la siguiente página", - "click_load_more": "Hacer clic en cargar más para cargar más elementos", - "scroll_down": "Desplazarse hacia abajo para cargar más elementos", - "scroll_up": "Desplazarse hacia arriba para cargar más elementos", + "title": "¿Cómo encontramos el siguiente elemento de lista en la página?", + "click_next": "Haz clic en siguiente para ir a la siguiente página", + "click_load_more": "Haz clic en cargar más para cargar más elementos", + "scroll_down": "Desplázate hacia abajo para cargar más elementos", + "scroll_up": "Desplázate hacia arriba para cargar más elementos", "none": "No hay más elementos para cargar" }, "limit": { - "title": "¿Cuál es el número máximo de filas que desea extraer?", + "title": "¿Cuál es el número máximo de filas a extraer?", "custom": "Personalizado", - "enter_number": "Ingrese número" + "enter_number": "Introduce un número" }, "fields": { "label": "Etiqueta", "data": "Datos", - "field_label": "Etiqueta del Campo", - "field_data": "Datos del Campo" + "field_label": "Etiqueta de campo", + "field_data": "Dato de campo" }, "messages": { "list_selected": "Lista seleccionada exitosamente", - "list_empty": "Lista seleccionada. Seleccione los campos dentro de la lista." + "list_empty": "Lista seleccionada. Por favor, selecciona los campos dentro de la lista." }, "errors": { - "select_pagination": "Por favor seleccione un tipo de paginación.", - "select_pagination_element": "Por favor seleccione primero el elemento de paginación.", - "select_limit": "Por favor seleccione un límite o ingrese un límite personalizado.", - "invalid_limit": "Por favor ingrese un límite válido.", - "confirm_text_fields": "Por favor confirme todos los campos de texto", - "unable_create_settings": "No se pueden crear las configuraciones de la lista. Asegúrese de haber definido un campo para la lista.", - "capture_text_discarded": "Captura de texto descartada", - "capture_list_discarded": "Captura de lista descartada", + "select_pagination": "Por favor selecciona un tipo de paginación.", + "select_pagination_element": "Por favor selecciona primero el elemento de paginación.", + "select_limit": "Por favor selecciona o introduce un límite personalizado.", + "invalid_limit": "Por favor introduce un límite válido.", + "confirm_text_fields": "Por favor confirma todos los campos de texto", + "unable_create_settings": "No se pueden crear ajustes de lista. Asegúrate de haber definido un campo para la lista.", + "capture_text_discarded": "Captura de Texto Descartada", + "capture_list_discarded": "Captura de Lista Descartada", "label_required": "La etiqueta no puede estar vacía" } }, @@ -240,13 +252,13 @@ "confirm": "Confirmar" }, "notifications": { - "save_success": "Robot guardado correctamente", - "retrain_success": "Robot reentrenado correctamente", + "save_success": "Robot guardado exitosamente", + "retrain_success": "Robot reentrenado exitosamente", "save_error": "Error al guardar el robot" }, "errors": { - "user_not_logged": "Usuario no conectado. No se puede guardar la grabación.", - "exists_warning": "Ya existe un robot con este nombre, por favor confirme la sobrescritura del robot." + "user_not_logged": "Usuario no ha iniciado sesión. No se puede guardar la grabación.", + "exists_warning": "Ya existe un robot con este nombre, por favor confirma la sobrescritura del robot." }, "tooltips": { "saving": "Optimizando y guardando el flujo de trabajo" @@ -254,116 +266,116 @@ }, "browser_recording": { "modal": { - "confirm_discard": "¿Está seguro de que desea descartar la grabación?", - "confirm_reset": "¿Está seguro de que desea reiniciar?", - "reset_warning": "Esto borrará todas las capturas anteriores de la sesión actual. La sesión de grabación se reiniciará para el mismo sitio web." + "confirm_discard": "¿Seguro que deseas descartar la grabación?", + "confirm_reset": "¿Seguro que deseas reiniciar la grabación?", + "reset_warning": "Esto borrará todas las capturas anteriores en la sesión actual. La grabación se reiniciará para el mismo sitio web." }, "notifications": { - "terminated": "La grabación actual fue terminada", - "environment_reset": "El entorno del navegador ha sido reiniciado", - "reset_successful": "Se reiniciaron correctamente todas las capturas y se volvió al estado inicial" + "terminated": "La grabación actual ha sido terminada", + "environment_reset": "El entorno del navegador ha sido restablecido", + "reset_successful": "Capturas reiniciadas con éxito y ha vuelto al estado inicial" } }, "interpretation_log": { "titles": { - "output_preview": "Vista Previa de Datos de Salida", + "output_preview": "Vista previa de los datos de salida", "screenshot": "Captura de pantalla" }, "messages": { - "additional_rows": "Se extraerán filas adicionales de datos una vez que termine la grabación.", - "successful_training": "¡Has entrenado exitosamente al robot para realizar acciones! Haz clic en el botón de abajo para obtener una vista previa de los datos que tu robot extraerá.", - "no_selection": "Parece que aún no has seleccionado nada para extraer. Una vez que lo hagas, el robot mostrará una vista previa de tus selecciones aquí." + "additional_rows": "Se extraerán más filas de datos al finalizar la grabación.", + "successful_training": "¡Has entrenado exitosamente al robot! Haz clic en el botón de abajo para ver una vista previa de los datos que tu robot extraerá.", + "no_selection": "Parece que aún no has seleccionado nada para extraer. Una vez lo hagas, el robot mostrará una vista previa aquí." }, "data_sections": { "binary_received": "---------- Datos binarios de salida recibidos ----------", - "serializable_received": "---------- Datos serializables de salida recibidos ----------", - "mimetype": "tipo MIME: ", + "serializable_received": "---------- Datos de salida serializables recibidos ----------", + "mimetype": "mimetype: ", "image_below": "La imagen se muestra a continuación:", "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "Vista previa de salida reiniciada exitosamente" } }, "interpretation_buttons": { "buttons": { - "preview": "Obtener Vista Previa de Datos de Salida", + "preview": "Obtener vista previa de salida", "reset": "Restablecer", "yes": "Sí", "no": "No" }, "messages": { - "extracting": "Extrayendo datos...espere de 10 segundos a 1 minuto", - "restart_required": "Por favor, reinicie la interpretación después de actualizar la grabación", + "extracting": "Extrayendo datos... espera de 10 segundos a 1 minuto", + "restart_required": "Por favor reinicia la interpretación después de actualizar la grabación", "run_finished": "Ejecución finalizada", - "run_failed": "Error al iniciar la ejecución" + "run_failed": "La ejecución no pudo iniciarse" }, "modal": { - "use_previous": "¿Desea usar su selección anterior como condición para realizar esta acción?", - "previous_action": "Su acción anterior fue: ", + "use_previous": "¿Deseas usar tu selección anterior como condición para esta acción?", + "previous_action": "Tu acción anterior fue: ", "element_text": "en un elemento con texto " - }, - "notifications": { - "reset_success": "Vista previa restablecida correctamente" } }, "recording_page": { "loader": { - "browser_startup": "Iniciando el navegador...Navegando a {{url}}" + "browser_startup": "Iniciando navegador... Navegando a {{url}}" } }, "integration_settings": { - "title": "Ajustes de Integración", + "title": "Configuración de integración", "descriptions": { "authenticated_as": "Autenticado como: {{email}}" }, "buttons": { "submit": "Enviar", - "remove_integration": "Eliminar Integración" + "remove_integration": "Eliminar integración" }, "google": { "title": "Integrar con Google Sheet", "descriptions": { - "sync_info": "Si habilita esta opción, cada vez que este robot ejecute una tarea correctamente, sus datos capturados se añadirán a su Google Sheet.", + "sync_info": "Si activas esta opción, cada vez que el robot completa una tarea exitosamente, sus datos capturados se añadirán a tu Google Sheet.", "authenticated_as": "Autenticado como: {{email}}" }, "alerts": { "success": { - "title": "Google Sheet Integrado Correctamente.", - "content": "Cada vez que este robot crea una ejecución exitosa, sus datos capturados se añaden a su Google Sheet {{sheetName}}. Puede comprobar las actualizaciones de datos", + "title": "Integración con Google Sheet exitosa.", + "content": "Cada vez que el robot realice una ejecución exitosa, los datos capturados se añadirán a tu Google Sheet {{sheetName}}. Puedes revisar los datos", "here": "aquí", "note": "Nota:", - "sync_limitation": "Los datos extraídos antes de la integración con Google Sheets no se sincronizarán en la Google Sheet. Solo los datos extraídos después de la integración se sincronizarán." + "sync_limitation": "Los datos extraídos antes de integrar Google Sheets no se sincronizarán. Solo los datos extraídos después de la integración serán sincronizados." } }, "buttons": { - "authenticate": "Autenticar con Google", - "fetch_sheets": "Obtener Hojas de Cálculo de Google", - "remove_integration": "Eliminar Integración", + "authenticate": "Autenticarse con Google", + "fetch_sheets": "Obtener hojas de Google", + "remove_integration": "Eliminar integración", "submit": "Enviar" }, "fields": { - "select_sheet": "Seleccionar Google Sheet", - "selected_sheet": "Hoja Seleccionada: {{name}} (ID: {{id}})" + "select_sheet": "Seleccionar hoja de Google", + "selected_sheet": "Hoja seleccionada: {{name}} (ID: {{id}})" }, "errors": { - "auth_error": "Error al autenticar con Google", - "fetch_error": "Error al obtener archivos de hojas de cálculo: {{message}}", - "update_error": "Error al actualizar ID de Google Sheet: {{message}}", - "remove_error": "Error al eliminar la integración de Google Sheets: {{message}}" + "auth_error": "Error autenticando con Google", + "fetch_error": "Error obteniendo hojas de cálculo: {{message}}", + "update_error": "Error actualizando el ID de Google Sheet: {{message}}", + "remove_error": "Error eliminando integración con Google Sheets: {{message}}" }, "notifications": { - "sheet_selected": "Google Sheet seleccionado correctamente", - "integration_removed": "Integración de Google Sheets eliminada correctamente" + "sheet_selected": "Google Sheet seleccionada exitosamente", + "integration_removed": "Integración de Google Sheets eliminada exitosamente" } }, "airtable": { "title": "Integrar con Airtable", "descriptions": { - "sync_info": "Si habilita esta opción, cada vez que este robot ejecute una tarea correctamente, sus datos capturados se añadirán a su Airtable.", - "authenticated_as": "Autenticado con Airtable exitosamente. Ahora puede seleccionar la base y la mesa con las que desea integrar." + "sync_info": "Si activas esta opción, cada vez que el robot complete una tarea exitosamente, sus datos capturados se añadirán a tu base de Airtable.", + "authenticated_as": "Autenticado con Airtable exitosamente. Ahora puedes seleccionar la base y la tabla para integrar." }, "alerts": { "success": { - "title": "Base Airtable integrada con éxito", - "content": "Cada vez que este robot crea una ejecución exitosa, los datos capturados se agregan a su base {{baseName}} y a su tabla {{tableName}}. Puedes consultar actualizaciones", + "title": "Base de Airtable integrada exitosamente", + "content": "Cada vez que el robot completa una ejecución exitosa, sus datos capturados se añadirán a la base {{baseName}} y a la tabla {{tableName}}. Puedes revisar las actualizaciones", "here": "aquí", "note": "Nota:", "sync_limitation": "Solo los datos capturados después de la integración se sincronizarán con Airtable." @@ -371,28 +383,28 @@ }, "buttons": { "authenticate": "Conectar con Airtable", - "fetch_bases": "Obtener Bases de Airtable", - "fetch_tables": "Obtener Tablas de Airtable", - "remove_integration": "Eliminar Integración", - "submit": "Seleccionar Base y Tabla" + "fetch_bases": "Obtener bases de Airtable", + "fetch_tables": "Obtener tablas de Airtable", + "remove_integration": "Eliminar integración", + "submit": "Seleccionar base y tabla" }, "fields": { - "select_base": "Seleccionar Base de Airtable", - "select_table": "Seleccionar Tabla de Airtable", - "selected_base": "Base Seleccionada: {{name}}", - "selected_table": "Tabla Seleccionada: {{name}}" + "select_base": "Seleccionar base de Airtable", + "select_table": "Seleccionar tabla de Airtable", + "selected_base": "Base seleccionada: {{name}}", + "selected_table": "Tabla seleccionada: {{name}}" }, "errors": { - "auth_error": "Error al autenticar con Airtable", - "fetch_error": "Error al obtener bases de Airtable: {{message}}", - "fetch_tables_error": "Error al obtener tablas de Airtable: {{message}}", - "update_error": "Error al actualizar base de Airtable: {{message}}", - "remove_error": "Error al eliminar la integración de Airtable: {{message}}" + "auth_error": "Error autenticando con Airtable", + "fetch_error": "Error obteniendo bases de Airtable: {{message}}", + "fetch_tables_error": "Error obteniendo tablas de Airtable: {{message}}", + "update_error": "Error actualizando base de Airtable: {{message}}", + "remove_error": "Error eliminando integración con Airtable: {{message}}" }, "notifications": { - "base_selected": "Base de Airtable seleccionada correctamente", - "table_selected": "Tabla de Airtable seleccionada correctamente", - "integration_removed": "Integración de Airtable eliminada correctamente" + "base_selected": "Base de Airtable seleccionada exitosamente", + "table_selected": "Tabla de Airtable seleccionada exitosamente", + "integration_removed": "Integración de Airtable eliminada exitosamente" } } }, @@ -400,64 +412,64 @@ "title": "Duplicar Robot", "descriptions": { "purpose": "La duplicación de robots es útil para extraer datos de páginas con la misma estructura.", - "example": "Ejemplo: Si has creado un robot para {{url1}}, puedes duplicarlo para extraer páginas similares como {{url2}} sin tener que entrenar un robot desde cero.", - "warning": "⚠️ Asegúrate de que la nueva página tenga la misma estructura que la página original." + "example": "Ejemplo: Si has creado un robot para {{url1}}, puedes duplicarlo para tomar datos de páginas similares como {{url2}} sin tener que entrenar un robot desde cero.", + "warning": "⚠️ Asegúrate de que la nueva página tenga la misma estructura que la original." }, "fields": { - "target_url": "URL Destino del Robot" + "target_url": "URL objetivo del robot" }, "buttons": { "duplicate": "Duplicar Robot", "cancel": "Cancelar" }, "notifications": { - "robot_not_found": "No se pudieron encontrar los detalles del robot. Por favor, inténtalo de nuevo.", - "url_required": "Se requiere la URL de destino.", - "duplicate_success": "Robot duplicado con éxito.", - "duplicate_error": "Error al actualizar la URL de destino. Por favor, inténtalo de nuevo.", - "unknown_error": "Ocurrió un error al actualizar la URL de destino." + "robot_not_found": "No se pudo encontrar los detalles del robot. Por favor, inténtalo de nuevo.", + "url_required": "La URL objetivo es obligatoria.", + "duplicate_success": "Robot duplicado exitosamente.", + "duplicate_error": "No se pudo actualizar la URL objetivo. Por favor, inténtalo de nuevo.", + "unknown_error": "Ocurrió un error al actualizar la URL objetivo." } }, "robot_settings": { "title": "Configuración del Robot", - "target_url": "URL de Destino del Robot", + "target_url": "URL objetivo del robot", "robot_id": "ID del Robot", "robot_limit": "Límite del Robot", - "created_by_user": "Creado por Usuario", - "created_at": "Fecha de Creación del Robot", + "created_by_user": "Creado por el usuario", + "created_at": "Robot creado el", "errors": { - "robot_not_found": "No se pudieron encontrar los detalles del robot. Inténtelo de nuevo." + "robot_not_found": "No se pudo encontrar los detalles del robot. Por favor, inténtalo de nuevo." } }, "robot_edit": { "title": "Editar Robot", - "change_name": "Cambiar Nombre del Robot", + "change_name": "Nombre del Robot", "robot_limit": "Límite del Robot", - "save": "Guardar Cambios", + "save": "Guardar cambios", "cancel": "Cancelar", "notifications": { "update_success": "Robot actualizado exitosamente.", - "update_failed": "Error al actualizar el robot. Intente de nuevo.", + "update_failed": "No se pudo actualizar el robot. Por favor, inténtalo de nuevo.", "update_error": "Ocurrió un error al actualizar el robot." } }, "schedule_settings": { - "title": "Configuración de Programación", + "title": "Configuración de programación", "run_every": "Ejecutar cada", - "start_from": "Iniciar desde", - "on_day": "En día", - "at_around": "Alrededor de", + "start_from": "Comenzar desde", + "on_day": "En el día", + "at_around": "Aproximadamente a las", "timezone": "Zona horaria", "buttons": { - "delete_schedule": "Eliminar Programación", - "save_schedule": "Guardar Programación", + "delete_schedule": "Eliminar programación", + "save_schedule": "Guardar programación", "cancel": "Cancelar" }, "labels": { "in_between": "Entre", - "run_once_every": "Ejecutar cada", - "start_from_label": "Iniciar desde", - "on_day_of_month": "Día del mes", + "run_once_every": "Ejecutar una vez cada", + "start_from_label": "Comenzar desde", + "on_day_of_month": "En el día del mes", "on_day": { "st": "º", "nd": "º", @@ -468,7 +480,7 @@ }, "main_page": { "notifications": { - "interpretation_success": "Interpretación del robot {{name}} completada con éxito", + "interpretation_success": "Se interpretó exitosamente el robot {{name}}", "interpretation_failed": "Error al interpretar el robot {{name}}", "run_started": "Ejecutando robot: {{name}}", "run_start_failed": "Error al ejecutar el robot: {{name}}", @@ -476,7 +488,7 @@ "schedule_failed": "Error al programar el robot {{name}}", "abort_success": "Interpretación del robot {{name}} abortada exitosamente", "abort_failed": "Error al abortar la interpretación del robot {{name}}", - "abort_initiated": "Cancelando la interpretación del robot {{name}}" + "abort_initiated": "Abortando la interpretación del robot {{name}}" }, "menu": { "recordings": "Robots", @@ -489,8 +501,8 @@ "attribute_modal": { "title": "Seleccionar Atributo", "notifications": { - "list_select_success": "Lista seleccionada correctamente. Seleccione los datos de texto para extracción.", - "pagination_select_success": "Elemento de paginación seleccionado correctamente." + "list_select_success": "La lista ha sido seleccionada exitosamente. Por favor, selecciona los datos de texto a extraer.", + "pagination_select_success": "Elemento de paginación seleccionado exitosamente." } }, "attribute_options": { @@ -499,8 +511,8 @@ "url": "URL: {{url}}" }, "image": { - "alt_text": "Texto Alt: {{altText}}", - "image_url": "URL de Imagen: {{imageUrl}}" + "alt_text": "Texto alternativo: {{altText}}", + "image_url": "URL de la imagen: {{imageUrl}}" }, "default": { "text": "Texto: {{text}}" @@ -512,11 +524,11 @@ "manual_run": "Ejecución Manual", "scheduled_run": "Ejecución Programada", "api": "API", - "unknown_run_type": "Tipo de Ejecución Desconocido" + "unknown_run_type": "Tipo de ejecución desconocido" }, "run_status_chips": { "success": "Éxito", - "running": "Ejecutando", + "running": "En ejecución", "scheduled": "Programado", "queued": "En cola", "failed": "Fallido", @@ -525,17 +537,17 @@ "run_settings_modal": { "title": "Configuración de Ejecución", "labels": { - "run_id": "ID de Ejecución", - "run_by_user": "Ejecutado por Usuario", - "run_by_schedule": "Ejecutado por ID de Programación", + "run_id": "ID de ejecución", + "run_by_user": "Ejecutado por el usuario", + "run_by_schedule": "Ejecutado por ID de programación", "run_by_api": "Ejecutado por API", - "run_type": "Tipo de Ejecución" + "run_type": "Tipo de ejecución" } } }, "run_content": { "tabs": { - "output_data": "Datos de Salida", + "output_data": "Datos de salida", "log": "Registro" }, "buttons": { @@ -544,29 +556,29 @@ "loading": "Cargando datos...", "empty_output": "No hay datos de salida disponibles", "captured_data": { - "title": "Datos capturados", + "title": "Datos Obtenidos", "download_csv": "Descargar CSV", - "view_full": "Ver datos completos", + "view_full": "Ver todos los datos", "items": "elementos", "schema_title": "Textos capturados", "list_title": "Listas capturadas" }, "captured_screenshot": { - "title": "Capturas de pantalla", + "title": "Capturas de pantalla obtenidas", "download": "Descargar", - "render_failed": "Error al renderizar la captura de pantalla" + "render_failed": "Error al mostrar la captura de pantalla" } }, "navbar": { "project_name": "Maxun", "notifications": { "success": { - "logout": "Sesión cerrada exitosamente" + "logout": "Cierre de sesión exitoso" }, "errors": { "logout": { - "unauthorized": "No estás autorizado para realizar esta acción", - "server": "Error del servidor durante el cierre de sesión", + "unauthorized": "No tienes autorización para realizar esta acción", + "server": "Ocurrió un error del servidor al cerrar sesión", "network": "Error de red al cerrar sesión", "unknown": "Ocurrió un error inesperado al cerrar sesión" } @@ -575,13 +587,13 @@ "upgrade": { "button": "Actualizar", "modal": { - "up_to_date": "¡Estás actualizado!", - "new_version_available": "Hay una nueva versión disponible: {{version}}. ¡Actualice a la última versión para correcciones de errores, mejoras y nuevas características!", + "up_to_date": "🎉 ¡Estás actualizado!", + "new_version_available": "Nueva versión disponible: {{version}}. ¡Actualiza a la última versión para corrección de errores, mejoras y nuevas funciones!", "view_updates": "Ver todas las actualizaciones", "view_updates_link": "aquí", "tabs": { - "manual_setup": "Actualización de Configuración Manual", - "docker_setup": "Actualización de Configuración Docker Compose" + "manual_setup": "Actualización con configuración manual", + "docker_setup": "Actualización con Docker Compose" } } }, @@ -601,6 +613,9 @@ "es": "Español", "ja": "Japonés", "zh": "Chino", - "de": "Alemán" + "de": "Alemán", + "ru": "Ruso", + "fr": "Francés", + "ko": "Coreano" } -} \ No newline at end of file +} diff --git a/public/locales/fr.json b/public/locales/fr.json new file mode 100644 index 000000000..f13b1d5b8 --- /dev/null +++ b/public/locales/fr.json @@ -0,0 +1,621 @@ +{ + "login": { + "title": "Bon retour !", + "email": "Entrez votre e-mail professionnel", + "password": "Mot de passe", + "button": "Connexion", + "loading": "Chargement", + "register_prompt": "Vous n'avez pas de compte ?", + "register_link": "S'inscrire", + "welcome_notification": "Bienvenue sur Maxun !", + "validation": { + "required_fields": "L'e-mail et le mot de passe sont requis", + "password_length": "Le mot de passe doit comporter au moins 6 caractères" + }, + "error": { + "user_not_found": "Utilisateur inexistant", + "invalid_credentials": "E-mail ou mot de passe invalide", + "server_error": "Échec de la connexion. Veuillez réessayer plus tard", + "generic": "Une erreur est survenue. Veuillez réessayer" + } + }, + "register": { + "title": "Créer un compte", + "email": "Entrez votre e-mail professionnel", + "password": "Mot de passe", + "button": "S'inscrire", + "loading": "Chargement", + "register_prompt": "Vous avez déjà un compte ?", + "login_link": "Connexion", + "welcome_notification": "Bienvenue sur Maxun !", + "validation": { + "email_required": "L'e-mail est requis", + "password_requirements": "Le mot de passe doit comporter au moins 6 caractères" + }, + "error": { + "user_exists": "Un utilisateur avec cet e-mail existe déjà", + "creation_failed": "Impossible de créer un compte", + "server_error": "Erreur du serveur", + "generic": "Échec de l'inscription. Veuillez réessayer" + } + }, + "recordingtable": { + "run": "Exécuter", + "name": "Nom", + "schedule": "Planifier", + "integrate": "Intégrer", + "settings": "Paramètres", + "options": "Options", + "heading": "Mes robots", + "new": "Créer un robot", + "modal": { + "title": "Entrer l'URL", + "login_title": "Ce site requiert-il une connexion ?", + "label": "URL", + "button": "Démarrer l'enregistrement" + }, + "warning_modal": { + "title": "Navigateur actif détecté", + "message": "Une session d'enregistrement de navigateur est déjà en cours. Voulez-vous la supprimer et en créer une nouvelle ?", + "discard_and_create": "Supprimer & Créer un nouveau", + "cancel": "Annuler" + }, + "retrain": "Réentraîner", + "edit": "Modifier", + "delete": "Supprimer", + "duplicate": "Dupliquer", + "search": "Rechercher des robots...", + "notifications": { + "delete_warning": "Ce robot est associé à des exécutions. Supprimez d'abord les exécutions pour pouvoir supprimer le robot", + "delete_success": "Robot supprimé avec succès", + "auth_success": "Robot authentifié avec succès", + "browser_limit_warning": "Les navigateurs distants sont actuellement occupés. Veuillez patienter quelques minutes et réessayer" + } + }, + "mainmenu": { + "recordings": "Robots", + "runs": "Exécutions", + "proxy": "Proxy", + "apikey": "Clé API", + "feedback": "Rejoindre Maxun Cloud", + "apidocs": "Site web vers API" + }, + "runstable": { + "runs": "Toutes les exécutions", + "runStatus": "Statut", + "runName": "Nom", + "startedAt": "Début le", + "finishedAt": "Terminé le", + "delete": "Supprimer", + "settings": "Paramètres", + "search": "Rechercher des exécutions...", + "sort_tooltip": "Cliquez pour trier", + "notifications": { + "no_runs": "Aucune exécution trouvée. Veuillez réessayer.", + "delete_success": "Exécution supprimée avec succès" + } + }, + "proxy": { + "title": "Configuration du proxy", + "tab_standard": "Proxy standard", + "tab_rotation": "Rotation automatique du proxy", + "server_url": "URL du serveur proxy", + "server_url_helper": "Proxy à utiliser pour tous les robots. Les proxies HTTP et SOCKS sont pris en charge. Exemple : http://myproxy.com:3128 ou socks5://myproxy.com:3128. Le format court myproxy.com:3128 est considéré comme un proxy HTTP.", + "requires_auth": "Requiert une authentification ?", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "add_proxy": "Ajouter un proxy", + "test_proxy": "Tester le proxy", + "remove_proxy": "Supprimer le proxy", + "table": { + "proxy_url": "URL Proxy", + "requires_auth": "Authentification requise" + }, + "coming_soon": "Bientôt disponible - En open source (Rotation basique) & Cloud (Rotation avancée). Si vous ne souhaitez pas gérer l'infrastructure, rejoignez la liste d'attente cloud pour un accès anticipé.", + "join_waitlist": "Rejoindre la liste d'attente de Maxun Cloud", + "alert": { + "title": "Si votre proxy nécessite un nom d'utilisateur et un mot de passe, fournissez-les toujours séparément de l'URL du proxy.", + "right_way": "La bonne manière", + "wrong_way": "Mauvaise manière", + "proxy_url": "URL du proxy:", + "username": "Nom d'utilisateur:", + "password": "Mot de passe:" + }, + "notifications": { + "config_success": "Configuration du proxy envoyée avec succès", + "config_error": "Échec de la configuration du proxy. Réessayez.", + "test_success": "La configuration du proxy fonctionne", + "test_error": "Échec du test du proxy. Réessayez.", + "fetch_success": "Configuration du proxy récupérée avec succès", + "remove_success": "Configuration du proxy supprimée avec succès", + "remove_error": "Impossible de supprimer la configuration du proxy. Réessayez." + } + }, + "apikey": { + "title": "Gérer votre clé API", + "default_name": "Clé API Maxun", + "table": { + "name": "Nom de la clé API", + "key": "Clé API", + "actions": "Actions" + }, + "actions": { + "copy": "Copier", + "show": "Afficher", + "hide": "Masquer", + "delete": "Supprimer" + }, + "no_key_message": "Vous n'avez pas encore généré de clé API.", + "generate_button": "Générer une clé API", + "notifications": { + "fetch_error": "Échec de la récupération de la clé API - ${error}", + "generate_success": "Clé API générée avec succès", + "generate_error": "Échec de la génération de la clé API - ${error}", + "delete_success": "Clé API supprimée avec succès", + "delete_error": "Échec de la suppression de la clé API - ${error}", + "copy_success": "Clé API copiée avec succès" + } + }, + "action_description": { + "text": { + "title": "Capturer du texte", + "description": "Survolez les textes à extraire et cliquez pour les sélectionner" + }, + "screenshot": { + "title": "Capturer une capture d'écran", + "description": "Capturez une capture d'écran partielle ou complète de la page actuelle." + }, + "list": { + "title": "Capturer une liste", + "description": "Survolez la liste à extraire. Une fois sélectionnée, vous pouvez survoler et cliquer pour choisir tous les textes de la liste." + }, + "default": { + "title": "Quelles données souhaitez-vous extraire ?", + "description": "Un robot peut exécuter une ou plusieurs actions. Choisissez parmi les options ci-dessous." + }, + "list_stages": { + "initial": "Sélectionnez la liste à extraire ainsi que les textes à l'intérieur", + "pagination": "Sélectionnez comment le robot peut capturer le reste de la liste", + "limit": "Choisissez le nombre d'éléments à extraire", + "complete": "Capture terminée" + }, + "actions": { + "text": "Capturer du texte", + "list": "Capturer une liste", + "screenshot": "Capturer une capture d'écran" + } + }, + "right_panel": { + "buttons": { + "capture_list": "Capturer une liste", + "capture_text": "Capturer du texte", + "capture_screenshot": "Capturer une capture d'écran", + "confirm": "Confirmer", + "discard": "Annuler", + "confirm_capture": "Confirmer la capture", + "confirm_pagination": "Confirmer", + "confirm_limit": "Confirmer", + "confirm_reset": "Confirmer", + "finish_capture": "Terminer la capture", + "back": "Retour", + "reset": "Redémarrer l'enregistrement", + "finish": "Terminer", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "screenshot": { + "capture_fullpage": "Capturer toute la page", + "capture_visible": "Capturer la partie visible", + "display_fullpage": "Prendre une capture d'écran de toute la page", + "display_visible": "Prendre une capture d'écran de la partie visible" + }, + "pagination": { + "title": "Comment trouver le prochain élément de liste sur la page ?", + "click_next": "Cliquer sur suivant pour passer à la page suivante", + "click_load_more": "Cliquer sur charger plus pour plus d'éléments", + "scroll_down": "Faire défiler vers le bas pour charger plus d'éléments", + "scroll_up": "Faire défiler vers le haut pour charger plus d'éléments", + "none": "Aucun autre élément à charger" + }, + "limit": { + "title": "Quel est le nombre maximum de lignes à extraire ?", + "custom": "Personnalisé", + "enter_number": "Entrer un nombre" + }, + "fields": { + "label": "Étiquette", + "data": "Donnée", + "field_label": "Étiquette de champ", + "field_data": "Donnée du champ" + }, + "messages": { + "list_selected": "Liste sélectionnée avec succès", + "list_empty": "Liste sélectionnée. Veuillez choisir les champs à l'intérieur de la liste." + }, + "errors": { + "select_pagination": "Veuillez sélectionner un type de pagination.", + "select_pagination_element": "Veuillez d'abord sélectionner l'élément de pagination.", + "select_limit": "Veuillez sélectionner ou entrer une limite personnalisée.", + "invalid_limit": "Veuillez entrer une limite valide.", + "confirm_text_fields": "Veuillez confirmer tous les champs texte", + "unable_create_settings": "Impossible de créer les paramètres de liste. Assurez-vous d'avoir défini un champ pour la liste.", + "capture_text_discarded": "Capture de texte annulée", + "capture_list_discarded": "Capture de liste annulée", + "label_required": "L'étiquette ne peut pas être vide" + } + }, + "save_recording": { + "title": "Enregistrer le robot", + "robot_name": "Nom du robot", + "buttons": { + "save": "Enregistrer", + "confirm": "Confirmer" + }, + "notifications": { + "save_success": "Robot enregistré avec succès", + "retrain_success": "Robot réentraîné avec succès", + "save_error": "Erreur lors de l'enregistrement du robot" + }, + "errors": { + "user_not_logged": "Utilisateur non connecté. Impossible d'enregistrer l'enregistrement.", + "exists_warning": "Un robot portant ce nom existe déjà, confirmez l'écrasement du robot." + }, + "tooltips": { + "saving": "Optimisation et enregistrement du workflow" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "Voulez-vous vraiment annuler l'enregistrement ?", + "confirm_reset": "Voulez-vous vraiment redémarrer l'enregistrement ?", + "reset_warning": "Cela effacera toutes les captures précédentes de la session actuelle. L'enregistrement recommencera pour le même site." + }, + "notifications": { + "terminated": "Enregistrement actuel interrompu", + "environment_reset": "Environnement du navigateur réinitialisé", + "reset_successful": "Toutes les captures ont été réinitialisées et retour à l'état initial" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "Aperçu des données de sortie", + "screenshot": "Capture d'écran" + }, + "messages": { + "additional_rows": "Des lignes de données supplémentaires seront extraites à la fin de l'enregistrement.", + "successful_training": "Vous avez entraîné le robot avec succès ! Cliquez ci-dessous pour voir un aperçu des données extraites.", + "no_selection": "Il semble que vous n'ayez encore rien sélectionné à extraire. Une fois que c'est fait, l'aperçu s'affichera ici." + }, + "data_sections": { + "binary_received": "---------- Données binaires reçues ----------", + "serializable_received": "---------- Données sérialisables reçues ----------", + "mimetype": "mimetype : ", + "image_below": "L'image s'affiche ci-dessous :", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "Aperçu de sortie réinitialisé avec succès" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "Aperçu des données de sortie", + "reset": "Réinitialiser", + "yes": "Oui", + "no": "Non" + }, + "messages": { + "extracting": "Extraction des données... veuillez patienter 10 secondes à 1 minute", + "restart_required": "Veuillez redémarrer l'interprétation après avoir mis à jour l'enregistrement", + "run_finished": "Exécution terminée", + "run_failed": "Échec du démarrage de l'exécution" + }, + "modal": { + "use_previous": "Voulez-vous utiliser votre sélection précédente comme condition pour cette action ?", + "previous_action": "Votre action précédente était : ", + "element_text": "sur un élément contenant le texte " + } + }, + "recording_page": { + "loader": { + "browser_startup": "Démarrage du navigateur... Navigation vers {{url}}" + } + }, + "integration_settings": { + "title": "Paramètres d'intégration", + "descriptions": { + "authenticated_as": "Authentifié en tant que : {{email}}" + }, + "buttons": { + "submit": "Soumettre", + "remove_integration": "Supprimer l'intégration" + }, + "google": { + "title": "Intégrer avec Google Sheet", + "descriptions": { + "sync_info": "Si vous activez cette option, chaque fois que ce robot exécute une tâche avec succès, ses données seront ajoutées à votre Google Sheet.", + "authenticated_as": "Authentifié en tant que : {{email}}" + }, + "alerts": { + "success": { + "title": "Google Sheet intégré avec succès.", + "content": "À chaque exécution réussie, les données capturées seront ajoutées à votre Google Sheet {{sheetName}}. Vous pouvez voir les mises à jour", + "here": "ici", + "note": "Note :", + "sync_limitation": "Les données extraites avant l'intégration de Google Sheets ne seront pas synchronisées. Seules les nouvelles données le seront." + } + }, + "buttons": { + "authenticate": "Authentifier avec Google", + "fetch_sheets": "Charger les feuilles Google", + "remove_integration": "Supprimer l'intégration", + "submit": "Soumettre" + }, + "fields": { + "select_sheet": "Sélectionner la feuille Google", + "selected_sheet": "Feuille sélectionnée : {{name}} (ID : {{id}})" + }, + "errors": { + "auth_error": "Erreur d'authentification Google", + "fetch_error": "Erreur lors du chargement des feuilles : {{message}}", + "update_error": "Erreur lors de la mise à jour de l'ID de Sheet : {{message}}", + "remove_error": "Erreur lors de la suppression de l'intégration Google Sheets : {{message}}" + }, + "notifications": { + "sheet_selected": "Feuille Google sélectionnée avec succès", + "integration_removed": "Intégration Google Sheets supprimée avec succès" + } + }, + "airtable": { + "title": "Intégrer avec Airtable", + "descriptions": { + "sync_info": "Si vous activez cette option, après chaque succès du robot, les données seront ajoutées à votre base Airtable.", + "authenticated_as": "Authentification à Airtable réussie. Vous pouvez maintenant choisir la base et la table à intégrer." + }, + "alerts": { + "success": { + "title": "Base Airtable intégrée avec succès", + "content": "A chaque exécution réussie, les données capturées sont ajoutées à la base {{baseName}} et la table {{tableName}}. Vous pouvez voir les mises à jour", + "here": "ici", + "note": "Note :", + "sync_limitation": "Seules les données capturées après l'intégration seront synchronisées dans Airtable." + } + }, + "buttons": { + "authenticate": "Connecter à Airtable", + "fetch_bases": "Charger les bases Airtable", + "fetch_tables": "Charger les tables Airtable", + "remove_integration": "Supprimer l'intégration", + "submit": "Sélectionner la base et la table" + }, + "fields": { + "select_base": "Sélectionner la base Airtable", + "select_table": "Sélectionner la table Airtable", + "selected_base": "Base sélectionnée : {{name}}", + "selected_table": "Table sélectionnée : {{name}}" + }, + "errors": { + "auth_error": "Erreur d'authentification Airtable", + "fetch_error": "Erreur lors du chargement des bases : {{message}}", + "fetch_tables_error": "Erreur lors du chargement des tables : {{message}}", + "update_error": "Erreur lors de la mise à jour de la base : {{message}}", + "remove_error": "Erreur lors de la suppression de l'intégration Airtable : {{message}}" + }, + "notifications": { + "base_selected": "Base Airtable sélectionnée avec succès", + "table_selected": "Table Airtable sélectionnée avec succès", + "integration_removed": "Intégration Airtable supprimée avec succès" + } + } + }, + "robot_duplication": { + "title": "Dupliquer le robot", + "descriptions": { + "purpose": "La duplication de robot est utile pour extraire des données de pages ayant la même structure.", + "example": "Exemple : si vous avez créé un robot pour {{url1}}, vous pouvez le dupliquer pour extraire des pages similaires comme {{url2}} sans devoir tout reconfigurer.", + "warning": "⚠️ Assurez-vous que la nouvelle page possède la même structure que l'originale." + }, + "fields": { + "target_url": "URL cible du robot" + }, + "buttons": { + "duplicate": "Dupliquer le robot", + "cancel": "Annuler" + }, + "notifications": { + "robot_not_found": "Impossible de trouver les détails du robot. Veuillez réessayer.", + "url_required": "L'URL cible est requise.", + "duplicate_success": "Robot dupliqué avec succès.", + "duplicate_error": "Impossible de mettre à jour l'URL cible. Veuillez réessayer.", + "unknown_error": "Une erreur est survenue lors de la mise à jour de l'URL cible." + } + }, + "robot_settings": { + "title": "Paramètres du robot", + "target_url": "URL cible du robot", + "robot_id": "ID du robot", + "robot_limit": "Limite du robot", + "created_by_user": "Créé par l'utilisateur", + "created_at": "Robot créé le", + "errors": { + "robot_not_found": "Impossible de trouver les détails du robot. Veuillez réessayer." + } + }, + "robot_edit": { + "title": "Modifier le robot", + "change_name": "Nom du robot", + "robot_limit": "Limite du robot", + "save": "Enregistrer les modifications", + "cancel": "Annuler", + "notifications": { + "update_success": "Robot mis à jour avec succès.", + "update_failed": "Échec de la mise à jour du robot. Veuillez réessayer.", + "update_error": "Une erreur est survenue lors de la mise à jour du robot." + } + }, + "schedule_settings": { + "title": "Paramètres de planification", + "run_every": "Exécuter toutes les", + "start_from": "Démarrer à partir de", + "on_day": "Le", + "at_around": "Autour de", + "timezone": "Fuseau horaire", + "buttons": { + "delete_schedule": "Supprimer le calendrier", + "save_schedule": "Enregistrer le calendrier", + "cancel": "Annuler" + }, + "labels": { + "in_between": "Entre", + "run_once_every": "Exécuter une fois chaque", + "start_from_label": "Démarrer à partir de", + "on_day_of_month": "Le jour du mois", + "on_day": { + "st": "er", + "nd": "e", + "rd": "e", + "th": "e" + } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "Interprétation du robot {{name}} réussie", + "interpretation_failed": "Échec de l'interprétation du robot {{name}}", + "run_started": "Exécution du robot : {{name}}", + "run_start_failed": "Échec de l'exécution du robot : {{name}}", + "schedule_success": "Robot {{name}} planifié avec succès", + "schedule_failed": "Échec de la planification du robot {{name}}", + "abort_success": "Interprétation du robot {{name}} annulée avec succès", + "abort_failed": "Échec de l'annulation de l'interprétation du robot {{name}}", + "abort_initiated": "Annulation de l'interprétation du robot {{name}} en cours" + }, + "menu": { + "recordings": "Robots", + "runs": "Exécutions", + "proxy": "Proxy", + "apikey": "Clé API" + } + }, + "browser_window": { + "attribute_modal": { + "title": "Sélectionner l'attribut", + "notifications": { + "list_select_success": "Liste sélectionnée avec succès. Veuillez sélectionner les données texte à extraire.", + "pagination_select_success": "Élément de pagination sélectionné avec succès." + } + }, + "attribute_options": { + "anchor": { + "text": "Texte : {{text}}", + "url": "URL : {{url}}" + }, + "image": { + "alt_text": "Texte alternatif : {{altText}}", + "image_url": "URL de l'image : {{imageUrl}}" + }, + "default": { + "text": "Texte : {{text}}" + } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "Exécution manuelle", + "scheduled_run": "Exécution planifiée", + "api": "API", + "unknown_run_type": "Type d'exécution inconnu" + }, + "run_status_chips": { + "success": "Succès", + "running": "En cours", + "scheduled": "Planifié", + "queued": "En file d'attente", + "failed": "Échec", + "aborted": "Annulé" + }, + "run_settings_modal": { + "title": "Paramètres d'exécution", + "labels": { + "run_id": "ID d'exécution", + "run_by_user": "Exécuté par l'utilisateur", + "run_by_schedule": "Exécuté par planification", + "run_by_api": "Exécuté par API", + "run_type": "Type d'exécution" + } + } + }, + "run_content": { + "tabs": { + "output_data": "Données de sortie", + "log": "Journal" + }, + "buttons": { + "stop": "Arrêter" + }, + "loading": "Chargement des données...", + "empty_output": "Pas de données de sortie disponibles", + "captured_data": { + "title": "Données capturées", + "download_csv": "Télécharger CSV", + "view_full": "Voir toutes les données", + "items": "éléments", + "schema_title": "Textes capturés", + "list_title": "Listes capturées" + }, + "captured_screenshot": { + "title": "Captures d'écrans capturées", + "download": "Télécharger", + "render_failed": "Échec d'affichage de la capture d'écran" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "Déconnexion réussie" + }, + "errors": { + "logout": { + "unauthorized": "Vous n'êtes pas autorisé à effectuer cette action", + "server": "Erreur serveur lors de la déconnexion", + "network": "Erreur réseau lors de la déconnexion", + "unknown": "Erreur imprévue lors de la déconnexion" + } + } + }, + "upgrade": { + "button": "Mettre à jour", + "modal": { + "up_to_date": "🎉 Vous êtes à jour !", + "new_version_available": "Une nouvelle version est disponible : {{version}}. Mettez à jour pour corriger des bugs, profiter des nouveautés et améliorations !", + "view_updates": "Voir toutes les nouveautés", + "view_updates_link": "ici", + "tabs": { + "manual_setup": "Mise à niveau manuelle", + "docker_setup": "Mise à niveau Docker Compose" + } + } + }, + "menu_items": { + "logout": "Déconnexion", + "discord": "Discord", + "youtube": "YouTube", + "twitter": "Twitter (X)", + "language": "Langue" + }, + "recording": { + "discard": "Annuler" + } + }, + "language_menu": { + "en": "Anglais", + "es": "Espagnol", + "ja": "Japonais", + "zh": "Chinois", + "de": "Allemand", + "ru": "Russe", + "fr": "Français", + "ko": "Coréen" + } +} diff --git a/public/locales/ja.json b/public/locales/ja.json index ce4b74e5e..bec5464c0 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -1,606 +1,621 @@ { "login": { - "title": "お帰りなさい!", - "email": "勤務先メールアドレスを入力", - "password": "パスワード", - "button": "ログイン", - "loading": "読み込み中", - "register_prompt": "アカウントをお持ちでないですか?", - "register_link": "登録する", - "welcome_notification": "Maxunへようこそ!", - "validation": { - "required_fields": "メールアドレスとパスワードは必須です", - "password_length": "パスワードは6文字以上である必要があります" - }, - "error": { - "user_not_found": "ユーザーが存在しません", - "invalid_credentials": "メールアドレスまたはパスワードが無効です", - "server_error": "ログインに失敗しました。後でもう一度お試しください", - "generic": "エラーが発生しました。もう一度お試しください" - } + "title": "お帰りなさい!", + "email": "会社のメールアドレスを入力", + "password": "パスワード", + "button": "ログイン", + "loading": "読み込み中", + "register_prompt": "アカウントをお持ちではありませんか?", + "register_link": "登録する", + "welcome_notification": "Maxunへようこそ!", + "validation": { + "required_fields": "メールアドレスとパスワードが必要です", + "password_length": "パスワードは6文字以上で入力してください" + }, + "error": { + "user_not_found": "ユーザーが存在しません", + "invalid_credentials": "メールアドレスまたはパスワードが間違っています", + "server_error": "ログインに失敗しました。後で再試行してください", + "generic": "エラーが発生しました。再試行してください" + } }, "register": { - "title": "アカウントを登録する", - "email": "勤務先メールアドレスを入力", - "password": "パスワード", - "button": "登録する", - "loading": "読み込み中", - "register_prompt": "既にアカウントをお持ちですか?", - "login_link": "ログイン", - "welcome_notification": "Maxunへようこそ!", - "validation": { - "email_required": "メールアドレスは必須です", - "password_requirements": "パスワードは6文字以上である必要があります" - }, - "error": { - "user_exists": "このメールアドレスは既に登録されています", - "creation_failed": "アカウントを作成できませんでした", - "server_error": "サーバーエラーが発生しました", - "generic": "登録に失敗しました。もう一度お試しください" - } + "title": "アカウント作成", + "email": "会社のメールアドレスを入力", + "password": "パスワード", + "button": "登録", + "loading": "読み込み中", + "register_prompt": "既にアカウントをお持ちですか?", + "login_link": "ログイン", + "welcome_notification": "Maxunへようこそ!", + "validation": { + "email_required": "メールアドレスを入力してください", + "password_requirements": "パスワードは6文字以上が必要です" + }, + "error": { + "user_exists": "このメールアドレスは既に登録されています", + "creation_failed": "アカウントを作成できませんでした", + "server_error": "サーバーエラーが発生しました", + "generic": "登録に失敗しました。再試行してください" + } }, "recordingtable": { - "run": "実行", - "name": "名前", - "schedule": "スケジュール", - "integrate": "統合", - "settings": "設定", - "options": "オプション", - "heading": "私のロボット", - "new": "ロボットを作成", - "modal": { - "title": "URLを入力してください", - "login_title": "このサイトはログインが必要ですか?", - "label": "URL", - "button": "録画を開始" - }, - "retrain": "再学習", - "edit": "編集", - "delete": "削除", - "duplicate": "複製", - "search": "ロボットを検索...", - "notifications": { - "delete_warning": "ロボットには関連する実行があります。ロボットを削除するには、まず実行を削除してください", - "delete_success": "ロボットが正常に削除されました", - "auth_success": "ロボットの認証に成功しました", - "browser_limit_warning": "リモートブラウザは現在ビジー状態です。数分お待ちいただいてから再度お試しください" - } + "run": "実行", + "name": "名前", + "schedule": "スケジュール", + "integrate": "連携", + "settings": "設定", + "options": "オプション", + "heading": "マイロボット", + "new": "ロボット作成", + "modal": { + "title": "URLを入力してください", + "login_title": "このウェブサイトにはログインが必要ですか?", + "label": "URL", + "button": "録画開始" + }, + "warning_modal": { + "title": "アクティブなブラウザが検出されました", + "message": "既にブラウザ録画セッションが実行中です。それを破棄して新しい録画を作成しますか?", + "discard_and_create": "破棄して新規作成", + "cancel": "キャンセル" + }, + "retrain": "再学習", + "edit": "編集", + "delete": "削除", + "duplicate": "複製", + "search": "ロボットを検索...", + "notifications": { + "delete_warning": "このロボットには関連する実行履歴があります。ロボットを削除する前に実行履歴を削除してください", + "delete_success": "ロボットが正常に削除されました", + "auth_success": "ロボットの認証に成功しました", + "browser_limit_warning": "リモートブラウザが現在使用中です。数分後に再試行してください" + } }, "mainmenu": { - "recordings": "ロボット", - "runs": "実行", - "proxy": "プロキシ", - "apikey": "APIキー", - "feedback": "Maxunクラウドに参加する", - "apidocs": "WebサイトからAPI" + "recordings": "ロボット", + "runs": "実行履歴", + "proxy": "プロキシ", + "apikey": "APIキー", + "feedback": "Maxun Cloud参加", + "apidocs": "Webサイト → API" }, "runstable": { - "runs": "すべての実行", - "runStatus": "ステータス", - "runName": "名前", - "startedAt": "開始日時", - "finishedAt": "終了日時", - "delete": "削除", - "settings": "設定", - "search": "実行を検索...", - "sort_tooltip": "クリックして並べ替え", - "notifications": { - "no_runs": "実行が見つかりません。もう一度お試しください。", - "delete_success": "実行が正常に削除されました" - } + "runs": "すべての実行", + "runStatus": "ステータス", + "runName": "名前", + "startedAt": "開始日時", + "finishedAt": "完了日時", + "delete": "削除", + "settings": "設定", + "search": "実行履歴を検索...", + "sort_tooltip": "クリックして並べ替え", + "notifications": { + "no_runs": "実行履歴がありません。再試行してください。", + "delete_success": "実行履歴は削除されました" + } }, "proxy": { - "title": "プロキシ設定", - "tab_standard": "標準プロキシ", - "tab_rotation": "自動プロキシローテーション", - "server_url": "プロキシサーバーURL", - "server_url_helper": "すべてのロボットで使用するプロキシ。HTTPとSOCKSプロキシがサポートされています。例:http://myproxy.com:3128 または socks5://myproxy.com:3128。短縮形 myproxy.com:3128 はHTTPプロキシとして扱われます。", - "requires_auth": "認証が必要ですか?", - "username": "ユーザー名", - "password": "パスワード", - "add_proxy": "プロキシを追加", - "test_proxy": "プロキシをテスト", - "remove_proxy": "プロキシを削除", - "table": { - "proxy_url": "プロキシURL", - "requires_auth": "認証が必要" - }, - "coming_soon": "近日公開 - オープンソース(基本ローテーション)とクラウド(高度なローテーション)。インフラストラクチャを管理したくない場合は、クラウドの待機リストに参加して早期アクセスを取得してください。", - "join_waitlist": "Maxun Cloud待機リストに参加", - "alert": { - "title": "プロキシにユーザー名とパスワードが必要な場合は、必ずプロキシURLとは別に指定してください。", - "right_way": "正しい方法", - "wrong_way": "間違った方法", - "proxy_url": "プロキシURL:", - "username": "ユーザー名:", - "password": "パスワード:" - }, - "notifications": { - "config_success": "プロキシ設定が正常に送信されました", - "config_error": "プロキシ設定の送信に失敗しました。もう一度お試しください。", - "test_success": "プロキシ設定は正常に動作しています", - "test_error": "プロキシ設定のテストに失敗しました。もう一度お試しください。", - "fetch_success": "プロキシ設定の取得に成功しました", - "remove_success": "プロキシ設定が正常に削除されました", - "remove_error": "プロキシ設定の削除に失敗しました。もう一度お試しください。" - } + "title": "プロキシ設定", + "tab_standard": "標準プロキシ", + "tab_rotation": "自動プロキシローテーション", + "server_url": "プロキシサーバーURL", + "server_url_helper": "すべてのロボットで使用するプロキシ。HTTPおよびSOCKSプロキシがサポートされています。例: http://myproxy.com:3128 または socks5://myproxy.com:3128。短縮形 myproxy.com:3128 はHTTPプロキシとして扱われます。", + "requires_auth": "認証が必要ですか?", + "username": "ユーザー名", + "password": "パスワード", + "add_proxy": "プロキシ追加", + "test_proxy": "プロキシテスト", + "remove_proxy": "プロキシ削除", + "table": { + "proxy_url": "プロキシURL", + "requires_auth": "認証が必要" }, - "apikey": { - "title": "APIキーの管理", - "default_name": "Maxun APIキー", - "table": { - "name": "APIキー名", - "key": "APIキー", - "actions": "アクション" - }, - "actions": { - "copy": "コピー", - "show": "表示", - "hide": "非表示", - "delete": "削除" - }, - "no_key_message": "APIキーはまだ生成されていません。", - "generate_button": "APIキーを生成", - "notifications": { - "fetch_error": "APIキーの取得に失敗しました - ${error}", - "generate_success": "APIキーの生成に成功しました", - "generate_error": "APIキーの生成に失敗しました - ${error}", - "delete_success": "APIキーの削除に成功しました", - "delete_error": "APIキーの削除に失敗しました - ${error}", - "copy_success": "APIキーのコピーに成功しました" - } + "coming_soon": "近日公開 - オープンソース(基本ローテーション)およびクラウド(高度なローテーション)。インフラ管理をしたくない方はクラウド用ウェイトリストにご参加ください。", + "join_waitlist": "Maxun Cloudウェイトリスト参加", + "alert": { + "title": "プロキシがユーザー名とパスワードの認証を要求する場合、それらをプロキシURLから分離して入力してください。", + "right_way": "正しい方法", + "wrong_way": "間違った方法", + "proxy_url": "プロキシURL:", + "username": "ユーザー名:", + "password": "パスワード:" }, - "action_description": { - "text": { - "title": "テキストを取得", - "description": "抽出したいテキストにカーソルを合わせ、クリックして選択してください" - }, - "screenshot": { - "title": "スクリーンショットを取得", - "description": "現在のページの部分的または全体のスクリーンショットを取得します。" - }, - "list": { - "title": "リストを取得", - "description": "抽出したいリストにカーソルを合わせてください。選択後、選択したリスト内のすべてのテキストにカーソルを合わせることができます。クリックして選択してください。" - }, - "default": { - "title": "どのデータを抽出しますか?", - "description": "ロボットは1つまたは複数のアクションを実行できます。以下のオプションから選択してください。" - }, - "list_stages": { - "initial": "抽出したいリストとその中のテキストを選択してください", - "pagination": "ロボットがリストの残りをどのように取得するか選択してください", - "limit": "抽出するアイテムの数を選択してください", - "complete": "取得が完了しました" - } + "notifications": { + "config_success": "プロキシ設定が正常に送信されました", + "config_error": "プロキシ設定の送信に失敗しました。再試行してください。", + "test_success": "プロキシ設定が動作しています", + "test_error": "プロキシ設定のテストに失敗しました。再試行してください。", + "fetch_success": "プロキシ設定の取得に成功しました", + "remove_success": "プロキシが正常に削除されました", + "remove_error": "プロキシ削除に失敗しました。再試行してください。" + } + }, + "apikey": { + "title": "APIキー管理", + "default_name": "Maxun APIキー", + "table": { + "name": "APIキーネーム", + "key": "APIキー", + "actions": "操作" }, - "right_panel": { - "buttons": { - "capture_list": "リストを取得", - "capture_text": "テキストを取得", - "capture_screenshot": "スクリーンショットを取得", - "confirm": "確認", - "discard": "破棄", - "confirm_capture": "取得を確認", - "confirm_pagination": "確認", - "confirm_limit": "確認", - "finish_capture": "取得を完了", - "back": "戻る", - "reset": "リセット", - "finish": "完了", - "cancel": "キャンセル", - "delete": "削除" - }, - "screenshot": { - "capture_fullpage": "フルページを取得", - "capture_visible": "表示部分を取得", - "display_fullpage": "フルページスクリーンショットを撮影", - "display_visible": "表示部分のスクリーンショットを撮影" - }, - "pagination": { - "title": "次のリスト項目をページ上でどのように見つけますか?", - "click_next": "次へをクリックして次のページへ移動", - "click_load_more": "もっと読み込むをクリックして項目を追加", - "scroll_down": "下にスクロールして項目を追加", - "scroll_up": "上にスクロールして項目を追加", - "none": "これ以上読み込む項目はありません" - }, - "limit": { - "title": "抽出する最大行数はいくつですか?", - "custom": "カスタム", - "enter_number": "数値を入力" - }, - "fields": { - "label": "ラベル", - "data": "データ", - "field_label": "フィールドラベル", - "field_data": "フィールドデータ" - }, - "messages": { - "list_selected": "リストが正常に選択されました", - "list_empty": "リストが選択されました。リスト内のフィールドを選択してください。" - }, - "errors": { - "select_pagination": "ページネーションタイプを選択してください。", - "select_pagination_element": "まずページネーション要素を選択してください。", - "select_limit": "制限を選択するかカスタム制限を入力してください。", - "invalid_limit": "有効な制限を入力してください。", - "confirm_text_fields": "すべてのテキストフィールドを確認してください", - "unable_create_settings": "リスト設定を作成できません。リストのフィールドを定義したことを確認してください。", - "capture_text_discarded": "テキスト取得が破棄されました", - "capture_list_discarded": "リスト取得が破棄されました", - "label_required": "ラベルは空にできません" - } + "actions": { + "copy": "コピー", + "show": "表示", + "hide": "非表示", + "delete": "削除" }, - "save_recording": { - "title": "ロボットを保存", - "robot_name": "ロボット名", - "buttons": { - "save": "保存", - "confirm": "確認" - }, - "notifications": { - "save_success": "ロボットの保存に成功しました", - "retrain_success": "ロボットの再トレーニングに成功しました", - "save_error": "ロボットの保存中にエラーが発生しました" - }, - "errors": { - "user_not_logged": "ユーザーがログインしていません。録画を保存できません。", - "exists_warning": "この名前のロボットは既に存在します。ロボットの上書きを確認してください。" - }, - "tooltips": { - "saving": "ワークフローを最適化して保存中" - } + "no_key_message": "まだAPIキーを生成していません。", + "generate_button": "APIキー生成", + "notifications": { + "fetch_error": "APIキーの取得に失敗しました - ${error}", + "generate_success": "APIキーを正常に生成しました", + "generate_error": "APIキーの生成に失敗しました - ${error}", + "delete_success": "APIキーを削除しました", + "delete_error": "APIキーの削除に失敗しました - ${error}", + "copy_success": "APIキーをコピーしました" + } + }, + "action_description": { + "text": { + "title": "テキストを取得", + "description": "抽出したいテキストの上にカーソルを合わせてクリックして選択してください" }, - "browser_recording": { - "modal": { - "confirm_discard": "録画を破棄してもよろしいですか?", - "confirm_reset": "リセットしてもよろしいですか?", - "reset_warning": "これにより、現在のセッションの以前のキャプチャがすべてクリアされます。同じ Web サイトの記録セッションが再開されます。" - }, - "notifications": { - "terminated": "現在の録画は終了しました", - "environment_reset": "ブラウザー環境がリセットされました", - "reset_successful": "すべてのキャプチャーを正常にリセットし、初期状態に戻りました" - } + "screenshot": { + "title": "スクリーンショットを取得", + "description": "現在のページの一部または全体のスクリーンショットを取得します。" }, - "interpretation_log": { - "titles": { - "output_preview": "出力データプレビュー", - "screenshot": "スクリーンショット" - }, - "messages": { - "additional_rows": "記録が完了すると、追加のデータ行が抽出されます。", - "successful_training": "ロボットのアクショントレーニングが成功しました!下のボタンをクリックすると、ロボットが抽出するデータのプレビューが表示されます。", - "no_selection": "まだ抽出対象が選択されていません。選択すると、ロボットがここで選択内容のプレビューを表示します。" - }, - "data_sections": { - "binary_received": "---------- バイナリ出力データを受信 ----------", - "serializable_received": "---------- シリアライズ可能な出力データを受信 ----------", - "mimetype": "MIMEタイプ: ", - "image_below": "画像は以下に表示されます:", - "separator": "--------------------------------------------------" - }, - "notifications": { - "reset_success": "出力プレビューが正常にリセットされました" - } + "list": { + "title": "リストを取得", + "description": "抽出したいリストにカーソルを合わせてください。選択後、そのリスト内のテキストを選択してクリックできます。" }, - "interpretation_buttons": { - "buttons": { - "preview": "出力データのプレビューを取得", - "reset": "リセット", - "yes": "はい", - "no": "いいえ" - }, - "messages": { - "extracting": "データ抽出中...10秒から1分ほどお待ちください", - "restart_required": "録画を更新した後、解釈を再起動してください", - "run_finished": "実行完了", - "run_failed": "実行の開始に失敗しました" - }, - "modal": { - "use_previous": "この操作の条件として前回の選択を使用しますか?", - "previous_action": "前回の操作: ", - "element_text": "テキスト要素 " - } + "default": { + "title": "どのデータを抽出しますか?", + "description": "ロボットは1つまたは複数のアクションを行えます。下のオプションから選択してください。" }, - "recording_page": { - "loader": { - "browser_startup": "ブラウザを起動中...{{url}}に移動中" - } + "list_stages": { + "initial": "取得したいリストとその内容を選択してください", + "pagination": "ロボットがリストの続きを取得する方法を選択してください", + "limit": "抽出する件数を指定してください", + "complete": "取得完了" }, - "integration_settings": { - "title": "連携設定", - "descriptions": { - "authenticated_as": "認証済み: {{email}}" - }, - "buttons": { - "submit": "送信", - "remove_integration": "連携を解除" - }, - "google": { - "title": "Google シートと連携", - "descriptions": { - "sync_info": "このオプションを有効にすると、このロボットがタスクを正常に実行するたびに、取得したデータがGoogle シートに追加されます。", - "authenticated_as": "認証済み: {{email}}" - }, - "alerts": { - "success": { - "title": "Google シートの連携に成功しました。", - "content": "このロボットが正常に実行されるたびに、取得したデータが{{sheetName}}という名前のGoogle シートに追加されます。データの更新を確認できます", - "here": "こちら", - "note": "注意:", - "sync_limitation": "Google シートとの連携前に抽出されたデータはGoogle シートに同期されません。連携後に抽出されたデータのみが同期されます。" - } - }, - "buttons": { - "authenticate": "Googleで認証", - "fetch_sheets": "Google スプレッドシートを取得", - "remove_integration": "連携を解除", - "submit": "送信" - }, - "fields": { - "select_sheet": "Google シートを選択", - "selected_sheet": "選択したシート: {{name}} (ID: {{id}})" - }, - "errors": { - "auth_error": "Googleでの認証エラー", - "fetch_error": "スプレッドシートファイルの取得エラー: {{message}}", - "update_error": "Google シートIDの更新エラー: {{message}}", - "remove_error": "Google シート連携の解除エラー: {{message}}" - }, - "notifications": { - "sheet_selected": "Google シートが正常に選択されました", - "integration_removed": "Google シートの連携が正常に解除されました" - } - }, - "airtable": { - "title": "Airtableと連携", - "descriptions": { - "sync_info": "このオプションを有効にすると、このロボットがタスクを正常に実行するたびに、取得したデータがAirtableに追加されます。", - "authenticated_as": "Airtableで認証に成功しました。統合するベースとテーブルを選択できるようになりました。" - }, - "alerts": { - "success": { - "title": "Airtable ベースの統合に成功", - "content": "このロボットが正常な実行を作成するたびに、キャプチャされたデータが {{baseName}} ベースと {{tableName}} テーブルに追加されます。更新情報を確認できます", - "here": "こちら", - "note": "注意:", - "sync_limitation": "連携後に取得されたデータのみがAirtableに同期されます。" - } - }, - "buttons": { - "authenticate": "Airtableと接続", - "fetch_bases": "Airtableベースを取得", - "fetch_tables": "Airtableテーブルを取得", - "remove_integration": "連携を解除", - "submit": "ベースとテーブルを選択" - }, - "fields": { - "select_base": "Airtableベースを選択", - "select_table": "Airtableテーブルを選択", - "selected_base": "選択したベース: {{name}}", - "selected_table": "選択したテーブル: {{name}}" - }, - "errors": { - "auth_error": "Airtableでの認証エラー", - "fetch_error": "Airtableベースの取得エラー: {{message}}", - "fetch_tables_error": "Airtableテーブルの取得エラー: {{message}}", - "update_error": "Airtableベースの更新エラー: {{message}}", - "remove_error": "Airtable連携の解除エラー: {{message}}" - }, - "notifications": { - "base_selected": "Airtableベースが正常に選択されました", - "table_selected": "Airtableテーブルが正常に選択されました", - "integration_removed": "Airtable連携が正常に解除されました" - } - } + "actions": { + "text": "テキストを取得", + "list": "リストを取得", + "screenshot": "スクリーンショットを取得" + } + }, + "right_panel": { + "buttons": { + "capture_list": "リストを取得", + "capture_text": "テキストを取得", + "capture_screenshot": "スクリーンショットを取得", + "confirm": "確定", + "discard": "破棄", + "confirm_capture": "取得を確定", + "confirm_pagination": "確定", + "confirm_limit": "確定", + "confirm_reset": "確定", + "finish_capture": "取得完了", + "back": "戻る", + "reset": "録画をリスタート", + "finish": "完了", + "cancel": "キャンセル", + "delete": "削除" }, - "robot_duplication": { - "title": "ロボットを複製", - "descriptions": { - "purpose": "ロボットの複製は、同じ構造のページからデータを抽出する際に便利です。", - "example": "例:{{url1}}用のロボットを作成した場合、ロボットを一から作り直すことなく、{{url2}}のような類似のページをスクレイピングするために複製できます。", - "warning": "⚠️ 新しいページが元のページと同じ構造であることを確認してください。" - }, - "fields": { - "target_url": "ロボットのターゲットURL" - }, - "buttons": { - "duplicate": "ロボットを複製", - "cancel": "キャンセル" - }, - "notifications": { - "robot_not_found": "ロボットの詳細が見つかりません。もう一度お試しください。", - "url_required": "ターゲットURLが必要です。", - "duplicate_success": "ロボットが正常に複製されました。", - "duplicate_error": "ターゲットURLの更新に失敗しました。もう一度お試しください。", - "unknown_error": "ターゲットURLの更新中にエラーが発生しました。" - } + "screenshot": { + "capture_fullpage": "全ページを取得", + "capture_visible": "表示領域を取得", + "display_fullpage": "全ページのスクリーンショットを撮る", + "display_visible": "表示部分のスクリーンショットを撮る" }, - "robot_settings": { - "title": "ロボット設定", - "target_url": "ロボットのターゲットURL", - "robot_id": "ロボットID", - "robot_limit": "ロボットの制限", - "created_by_user": "作成したユーザー", - "created_at": "作成日時", - "errors": { - "robot_not_found": "ロボットの詳細が見つかりませんでした。もう一度試してください。" - } + "pagination": { + "title": "次のリスト項目をページ上でどう見つけますか?", + "click_next": "次へボタンをクリック", + "click_load_more": "もっと見るボタンをクリック", + "scroll_down": "下へスクロールしてさらに項目を取得", + "scroll_up": "上へスクロールしてさらに項目を取得", + "none": "これ以上項目なし" }, - "robot_edit": { - "title": "ロボットを編集", - "change_name": "ロボット名の変更", - "robot_limit": "ロボットの制限", - "save": "変更を保存", - "cancel": "キャンセル", - "notifications": { - "update_success": "ロボットが正常に更新されました。", - "update_failed": "ロボットの更新に失敗しました。もう一度試してください。", - "update_error": "ロボットの更新中にエラーが発生しました。" - } + "limit": { + "title": "最大でいくつの行を抽出しますか?", + "custom": "カスタム", + "enter_number": "件数を入力" }, - "schedule_settings": { - "title": "スケジュール設定", - "run_every": "実行間隔", - "start_from": "開始日", - "on_day": "日付", - "at_around": "時刻", - "timezone": "タイムゾーン", - "buttons": { - "delete_schedule": "スケジュールを削除", - "save_schedule": "スケジュールを保存", - "cancel": "キャンセル" - }, - "labels": { - "in_between": "間隔", - "run_once_every": "実行間隔", - "start_from_label": "開始日", - "on_day_of_month": "月の日付", - "on_day": { - "st": "日", - "nd": "日", - "rd": "日", - "th": "日" - } - } + "fields": { + "label": "ラベル", + "data": "データ", + "field_label": "フィールドラベル", + "field_data": "フィールドデータ" + }, + "messages": { + "list_selected": "リストが正常に選択されました", + "list_empty": "リストが選択されました。リスト内のフィールドを選択してください。" + }, + "errors": { + "select_pagination": "ページネーション方式を選択してください。", + "select_pagination_element": "まずページネーション要素を選択してください。", + "select_limit": "制限を選択するか、カスタム制限値を入力してください。", + "invalid_limit": "有効な制限値を入力してください。", + "confirm_text_fields": "すべてのテキストフィールドを確定してください", + "unable_create_settings": "リストのフィールドを定義しているかご確認ください。リスト設定を作成できません。", + "capture_text_discarded": "テキスト取得を破棄しました", + "capture_list_discarded": "リスト取得を破棄しました", + "label_required": "ラベルは必須です" + } + }, + "save_recording": { + "title": "ロボット保存", + "robot_name": "ロボット名", + "buttons": { + "save": "保存", + "confirm": "確定" + }, + "notifications": { + "save_success": "ロボットが保存されました", + "retrain_success": "ロボット再学習が完了しました", + "save_error": "ロボットの保存でエラーが発生しました" + }, + "errors": { + "user_not_logged": "未ログインのため録画を保存できません。", + "exists_warning": "この名前のロボットが既に存在します。上書きを確定してください。" + }, + "tooltips": { + "saving": "ワークフローの最適化・保存中" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "本当に録画を破棄しますか?", + "confirm_reset": "録画を再スタートしますか?", + "reset_warning": "これまでの取得内容はすべて削除され、同じサイトで録画が再スタートします。" + }, + "notifications": { + "terminated": "現在の録画は終了しました", + "environment_reset": "ブラウザ環境がリセットされました", + "reset_successful": "全ての取得がリセットされ初期状態に戻りました" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "データ出力プレビュー", + "screenshot": "スクリーンショット" }, - "main_page": { - "notifications": { - "interpretation_success": "ロボット{{name}}の解釈に成功しました", - "interpretation_failed": "ロボット{{name}}の解釈に失敗しました", - "run_started": "ロボット{{name}}を実行中", - "run_start_failed": "ロボット{{name}}の実行に失敗しました", - "schedule_success": "ロボット{{name}}のスケジュールが正常に設定されました", - "schedule_failed": "ロボット{{name}}のスケジュール設定に失敗しました", - "abort_success": "ロボット{{name}}の解釈を中止しました", - "abort_failed": "ロボット{{name}}の解釈中止に失敗しました", - "abort_initiated": "ロボット {{name}} の解釈を中止しています" - }, - "menu": { - "recordings": "ロボット", - "runs": "実行", - "proxy": "プロキシ", - "apikey": "APIキー" + "messages": { + "additional_rows": "録画完了後に、追加データが抽出されます。", + "successful_training": "ロボットのアクション学習が完了しました!下のボタンで、ロボットが抽出するデータのプレビューを確認できます。", + "no_selection": "まだ抽出対象を選択していません。選択すると、ここにプレビューが表示されます。" + }, + "data_sections": { + "binary_received": "---------- バイナリ出力データを受信しました ----------", + "serializable_received": "---------- シリアライズ可能な出力データを受信 ----------", + "mimetype": "mimetype: ", + "image_below": "画像はこちらに表示されます:", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "出力プレビューのリセットに成功しました" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "出力データのプレビューを取得", + "reset": "リセット", + "yes": "はい", + "no": "いいえ" + }, + "messages": { + "extracting": "データ抽出中...しばらく(10秒~1分)お待ちください", + "restart_required": "録画を更新後は解釈を再スタートしてください", + "run_finished": "実行が完了しました", + "run_failed": "実行開始に失敗しました" + }, + "modal": { + "use_previous": "前回選択をこの操作の条件にしますか?", + "previous_action": "前回選択:", + "element_text": "テキストのある要素:" + } + }, + "recording_page": { + "loader": { + "browser_startup": "ブラウザ起動中... {{url}} にアクセスしています" + } + }, + "integration_settings": { + "title": "連携設定", + "descriptions": { + "authenticated_as": "認証済み:{{email}}" + }, + "buttons": { + "submit": "送信", + "remove_integration": "連携解除" + }, + "google": { + "title": "Googleスプレッドシート連携", + "descriptions": { + "sync_info": "このオプションを有効にすると、タスクが成功するたびGoogleスプレッドシートにデータが追加されます。", + "authenticated_as": "認証済み:{{email}}" + }, + "alerts": { + "success": { + "title": "Googleシートの連携に成功しました。", + "content": "ロボットが正常に実行される度に、そのデータが {{sheetName}} のGoogleシートに追加されます。データ更新の確認は", + "here": "こちら", + "note": "注意:", + "sync_limitation": "Googleシート連携前のデータは同期されません。連携後のデータのみ同期されます。" } + }, + "buttons": { + "authenticate": "Googleで認証", + "fetch_sheets": "スプレッドシート取得", + "remove_integration": "連携解除", + "submit": "送信" + }, + "fields": { + "select_sheet": "Googleシートを選択", + "selected_sheet": "選択されたシート:{{name}}(ID: {{id}})" + }, + "errors": { + "auth_error": "Google認証エラー", + "fetch_error": "スプレッドシート取得エラー: {{message}}", + "update_error": "GoogleシートID更新エラー: {{message}}", + "remove_error": "Googleシート連携解除エラー: {{message}}" + }, + "notifications": { + "sheet_selected": "Googleシートが選択されました", + "integration_removed": "Googleシート連携を解除しました" + } }, - "browser_window": { - "attribute_modal": { - "title": "属性を選択", - "notifications": { - "list_select_success": "リストが正常に選択されました。抽出するテキストデータを選択してください。", - "pagination_select_success": "ページネーション要素が正常に選択されました。" - } - }, - "attribute_options": { - "anchor": { - "text": "テキスト: {{text}}", - "url": "URL: {{url}}" - }, - "image": { - "alt_text": "代替テキスト: {{altText}}", - "image_url": "画像URL: {{imageUrl}}" - }, - "default": { - "text": "テキスト: {{text}}" - } + "airtable": { + "title": "Airtable連携", + "descriptions": { + "sync_info": "このオプションを有効にすると、タスクが成功するたびAirtable Baseにデータが追加されます。", + "authenticated_as": "Airtable認証に成功しました。これからBaseとTableが選択できます。" + }, + "alerts": { + "success": { + "title": "Airtable Base連携成功", + "content": "ロボットの実行データは {{baseName}} Base, {{tableName}} Table に追加されます。更新確認は", + "here": "こちら", + "note": "注意:", + "sync_limitation": "連携後に取得したデータのみAirtableに同期されます。" } + }, + "buttons": { + "authenticate": "Airtableに接続", + "fetch_bases": "Airtable Base取得", + "fetch_tables": "Airtable Table取得", + "remove_integration": "連携解除", + "submit": "BaseとTableを選択" + }, + "fields": { + "select_base": "Airtable Baseを選択", + "select_table": "Airtable Tableを選択", + "selected_base": "選択されたBase:{{name}}", + "selected_table": "選択されたTable:{{name}}" + }, + "errors": { + "auth_error": "Airtable認証エラー", + "fetch_error": "Airtable Base取得エラー: {{message}}", + "fetch_tables_error": "Airtable Table取得エラー: {{message}}", + "update_error": "Airtable Base更新エラー: {{message}}", + "remove_error": "Airtable連携解除エラー: {{message}}" + }, + "notifications": { + "base_selected": "Airtable Baseが選択されました", + "table_selected": "Airtable Tableが選択されました", + "integration_removed": "Airtable連携が解除されました" + } + } + }, + "robot_duplication": { + "title": "ロボット複製", + "descriptions": { + "purpose": "ロボットの複製は、同じ構造のページからデータを抽出する際に便利です。", + "example": "例:{{url1}}のロボットを作成した場合、複製機能で{{url2}}など類似ページでも初期トレーニング不要で抽出できます。", + "warning": "⚠️ 新しいページの構造が元ページと同じかご確認ください。" }, - "runs_table": { - "run_type_chips": { - "manual_run": "手動実行", - "scheduled_run": "スケジュール実行", - "api": "API", - "unknown_run_type": "不明な実行タイプ" - }, - "run_status_chips": { - "success": "成功", - "running": "実行中", - "scheduled": "スケジュール済み", - "queued": "キューに入れました", - "failed": "失敗", - "aborted": "中止されました" - }, - "run_settings_modal": { - "title": "実行設定", - "labels": { - "run_id": "実行ID", - "run_by_user": "ユーザーによる実行", - "run_by_schedule": "スケジュールによる実行", - "run_by_api": "APIによる実行", - "run_type": "実行タイプ" - } + "fields": { + "target_url": "ロボット対象URL" + }, + "buttons": { + "duplicate": "ロボット複製", + "cancel": "キャンセル" + }, + "notifications": { + "robot_not_found": "ロボットの詳細が見つかりません。再試行してください。", + "url_required": "対象URLを入力してください。", + "duplicate_success": "ロボットが正常に複製されました。", + "duplicate_error": "対象URLの更新に失敗しました。再試行してください。", + "unknown_error": "対象URLの更新中にエラーが発生しました。" + } + }, + "robot_settings": { + "title": "ロボット設定", + "target_url": "ロボット対象URL", + "robot_id": "ロボットID", + "robot_limit": "ロボット制限", + "created_by_user": "作成者", + "created_at": "作成日時", + "errors": { + "robot_not_found": "ロボット情報が見つかりません。再試行してください。" + } + }, + "robot_edit": { + "title": "ロボット編集", + "change_name": "ロボット名", + "robot_limit": "ロボット制限", + "save": "変更を保存", + "cancel": "キャンセル", + "notifications": { + "update_success": "ロボットが正常に更新されました。", + "update_failed": "ロボットの更新に失敗しました。再試行してください。", + "update_error": "ロボットの更新中にエラーが発生しました。" + } + }, + "schedule_settings": { + "title": "スケジュール設定", + "run_every": "実行間隔", + "start_from": "開始日時", + "on_day": "曜日", + "at_around": "時間", + "timezone": "タイムゾーン", + "buttons": { + "delete_schedule": "スケジュール削除", + "save_schedule": "スケジュール保存", + "cancel": "キャンセル" + }, + "labels": { + "in_between": "の間", + "run_once_every": "毎週1回実行", + "start_from_label": "開始日", + "on_day_of_month": "月の日付で実行", + "on_day": { + "st": "日", + "nd": "日", + "rd": "日", + "th": "日" + } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "ロボット{{name}}の解釈に成功しました", + "interpretation_failed": "ロボット{{name}}の解釈に失敗しました", + "run_started": "ロボット実行中: {{name}}", + "run_start_failed": "ロボットの実行開始に失敗: {{name}}", + "schedule_success": "ロボット{{name}}のスケジュールが成功しました", + "schedule_failed": "ロボット{{name}}のスケジュール失敗", + "abort_success": "ロボット{{name}}の解釈中断に成功しました", + "abort_failed": "ロボット{{name}}の解釈中断に失敗しました", + "abort_initiated": "ロボット{{name}}の解釈中断を開始しました" + }, + "menu": { + "recordings": "ロボット", + "runs": "実行履歴", + "proxy": "プロキシ", + "apikey": "APIキー" + } + }, + "browser_window": { + "attribute_modal": { + "title": "属性を選択", + "notifications": { + "list_select_success": "リストが正常に選択されました。抽出するテキストデータを選択してください。", + "pagination_select_success": "ページネーション要素が正常に選択されました。" + } + }, + "attribute_options": { + "anchor": { + "text": "テキスト:{{text}}", + "url": "URL:{{url}}" + }, + "image": { + "alt_text": "代替テキスト:{{altText}}", + "image_url": "画像URL:{{imageUrl}}" + }, + "default": { + "text": "テキスト:{{text}}" + } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "手動実行", + "scheduled_run": "スケジュール実行", + "api": "API", + "unknown_run_type": "不明な実行タイプ" + }, + "run_status_chips": { + "success": "成功", + "running": "実行中", + "scheduled": "スケジュール済み", + "queued": "キュー中", + "failed": "失敗", + "aborted": "中断" + }, + "run_settings_modal": { + "title": "実行設定", + "labels": { + "run_id": "実行ID", + "run_by_user": "ユーザーによる実行", + "run_by_schedule": "スケジュールで実行", + "run_by_api": "APIによる実行", + "run_type": "実行タイプ" + } + } + }, + "run_content": { + "tabs": { + "output_data": "出力データ", + "log": "ログ" + }, + "buttons": { + "stop": "停止" + }, + "loading": "データ読込中...", + "empty_output": "出力データがありません", + "captured_data": { + "title": "取得データ", + "download_csv": "CSVダウンロード", + "view_full": "全データ表示", + "items": "件", + "schema_title": "取得テキスト", + "list_title": "取得リスト" + }, + "captured_screenshot": { + "title": "取得スクリーンショット", + "download": "ダウンロード", + "render_failed": "スクリーンショットの表示に失敗しました" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "正常にログアウトしました" + }, + "errors": { + "logout": { + "unauthorized": "この操作を行う権限がありません", + "server": "ログアウト中にサーバーエラーが発生しました", + "network": "ネットワークエラーでログアウトに失敗しました", + "unknown": "予期しないエラーでログアウトに失敗しました" } + } }, - "run_content": { + "upgrade": { + "button": "アップグレード", + "modal": { + "up_to_date": "🎉 最新バージョンです!", + "new_version_available": "新しいバージョンが利用可能です: {{version}}。バグ修正・機能強化・新機能のため最新バージョンにアップグレードしましょう!", + "view_updates": "新着情報を見る", + "view_updates_link": "こちら", "tabs": { - "output_data": "出力データ", - "log": "ログ" - }, - "buttons": { - "stop": "停止" - }, - "loading": "データを読み込み中...", - "empty_output": "出力データがありません", - "captured_data": { - "title": "キャプチャしたデータ", - "download_csv": "CSVをダウンロード", - "view_full": "完全なデータを表示", - "items": "アイテム", - "schema_title": "キャプチャしたテキスト", - "list_title": "キャプチャしたリスト" - }, - "captured_screenshot": { - "title": "キャプチャしたスクリーンショット", - "download": "ダウンロード", - "render_failed": "スクリーンショットのレンダリングに失敗しました" + "manual_setup": "手動アップグレード設定", + "docker_setup": "Docker Composeアップグレード設定" } + } }, - "navbar": { - "project_name": "Maxun", - "notifications": { - "success": { - "logout": "ログアウトに成功しました" - }, - "errors": { - "logout": { - "unauthorized": "この操作を実行する権限がありません", - "server": "ログアウト中にサーバーエラーが発生しました", - "network": "ログアウト中にネットワークエラーが発生しました", - "unknown": "ログアウト中に予期せぬエラーが発生しました" - } - } - }, - "upgrade": { - "button": "アップグレード", - "modal": { - "up_to_date": "最新版です!", - "new_version_available": "新しいバージョンが利用可能です: {{version}}。バグ修正、機能強化のために最新版にアップグレードしてください。", - "view_updates": "すべての更新を", - "view_updates_link": "こちら", - "tabs": { - "manual_setup": "手動セットアップ", - "docker_setup": "Docker Composeセットアップ" - } - } - }, - "menu_items": { - "logout": "ログアウト", - "discord": "Discord", - "youtube": "YouTube", - "twitter": "Twitter (X)", - "language": "言語" - }, - "recording": { - "discard": "破棄" - } + "menu_items": { + "logout": "ログアウト", + "discord": "Discord", + "youtube": "YouTube", + "twitter": "Twitter(X)", + "language": "言語" }, - "language_menu": { - "en": "英語", - "es": "スペイン語", - "ja": "日本語", - "zh": "中国語", - "de": "ドイツ語" + "recording": { + "discard": "破棄" } + }, + "language_menu": { + "en": "英語", + "es": "スペイン語", + "ja": "日本語", + "zh": "中国語", + "de": "ドイツ語", + "ru": "ロシア語", + "fr": "フランス語", + "ko": "韓国語" + } } diff --git a/public/locales/ko.json b/public/locales/ko.json new file mode 100644 index 000000000..f50fc9a4b --- /dev/null +++ b/public/locales/ko.json @@ -0,0 +1,621 @@ +{ + "login": { + "title": "다시 오신 것을 환영합니다!", + "email": "이메일 입력 (회사 이메일)", + "password": "비밀번호", + "button": "로그인", + "loading": "로딩 중", + "register_prompt": "계정이 없으신가요?", + "register_link": "회원가입", + "welcome_notification": "Maxun에 오신 것을 환영합니다!", + "validation": { + "required_fields": "이메일과 비밀번호를 입력하세요", + "password_length": "비밀번호는 최소 6자 이상이어야 합니다" + }, + "error": { + "user_not_found": "존재하지 않는 사용자입니다", + "invalid_credentials": "이메일 또는 비밀번호가 올바르지 않습니다", + "server_error": "로그인에 실패했습니다. 나중에 다시 시도해주세요", + "generic": "오류가 발생했습니다. 다시 시도해주세요" + } + }, + "register": { + "title": "계정 만들기", + "email": "이메일 입력 (회사 이메일)", + "password": "비밀번호", + "button": "회원가입", + "loading": "로딩 중", + "register_prompt": "이미 계정이 있으신가요?", + "login_link": "로그인", + "welcome_notification": "Maxun에 오신 것을 환영합니다!", + "validation": { + "email_required": "이메일을 입력하세요", + "password_requirements": "비밀번호는 최소 6자 이상이어야 합니다" + }, + "error": { + "user_exists": "이미 이 이메일로 가입된 사용자가 있습니다", + "creation_failed": "계정을 생성할 수 없습니다", + "server_error": "서버 오류가 발생했습니다", + "generic": "회원가입에 실패했습니다. 다시 시도해주세요" + } + }, + "recordingtable": { + "run": "실행", + "name": "이름", + "schedule": "스케줄", + "integrate": "연동", + "settings": "설정", + "options": "옵션", + "heading": "내 로봇", + "new": "로봇 생성", + "modal": { + "title": "URL 입력", + "login_title": "이 웹사이트에 로그인해야 합니까?", + "label": "URL", + "button": "녹화 시작" + }, + "warning_modal": { + "title": "활성 브라우저 감지됨", + "message": "이미 브라우저 녹화 세션이 실행 중입니다. 이를 중단하고 새 녹화를 시작하시겠습니까?", + "discard_and_create": "중단 후 새로 생성", + "cancel": "취소" + }, + "retrain": "재학습", + "edit": "수정", + "delete": "삭제", + "duplicate": "복제", + "search": "로봇 검색...", + "notifications": { + "delete_warning": "이 로봇에 연관된 실행 기록이 있습니다. 실행 기록을 모두 삭제한 후 로봇을 삭제할 수 있습니다", + "delete_success": "로봇이 성공적으로 삭제되었습니다", + "auth_success": "로봇 인증에 성공했습니다", + "browser_limit_warning": "원격 브라우저가 현재 바쁩니다. 잠시 후 다시 시도해주세요" + } + }, + "mainmenu": { + "recordings": "로봇", + "runs": "실행 기록", + "proxy": "프록시", + "apikey": "API 키", + "feedback": "Maxun Cloud 참여", + "apidocs": "웹사이트 → API" + }, + "runstable": { + "runs": "전체 실행", + "runStatus": "상태", + "runName": "이름", + "startedAt": "시작 시간", + "finishedAt": "종료 시간", + "delete": "삭제", + "settings": "설정", + "search": "실행 기록 검색...", + "sort_tooltip": "정렬하려면 클릭", + "notifications": { + "no_runs": "실행 기록이 없습니다. 다시 시도해보세요.", + "delete_success": "실행 기록이 삭제되었습니다" + } + }, + "proxy": { + "title": "프록시 설정", + "tab_standard": "기본 프록시", + "tab_rotation": "자동 프록시 교체", + "server_url": "프록시 서버 URL", + "server_url_helper": "모든 로봇에 사용할 프록시입니다. HTTP(S) 및 SOCKS 프록시를 지원합니다. 예시: http://myproxy.com:3128 또는 socks5://myproxy.com:3128. 'myproxy.com:3128' 형식은 HTTP 프록시로 인식됩니다.", + "requires_auth": "인증 필요 여부", + "username": "사용자명", + "password": "비밀번호", + "add_proxy": "프록시 추가", + "test_proxy": "프록시 테스트", + "remove_proxy": "프록시 제거", + "table": { + "proxy_url": "프록시 URL", + "requires_auth": "인증 필요" + }, + "coming_soon": "곧 출시 - 오픈소스(기본 교체) 및 클라우드(고급 교체). 인프라 관리를 원하지 않으면 클라우드 대기자 명단에 등록하세요.", + "join_waitlist": "Maxun Cloud 대기자 명단 등록", + "alert": { + "title": "프록시가 사용자명/비밀번호 인증을 요구한다면, 반드시 URL과 분리해서 입력하세요.", + "right_way": "올바른 방법", + "wrong_way": "잘못된 방법", + "proxy_url": "프록시 URL:", + "username": "사용자명:", + "password": "비밀번호:" + }, + "notifications": { + "config_success": "프록시 설정이 성공적으로 제출되었습니다", + "config_error": "프록시 설정 제출에 실패했습니다. 다시 시도해주세요.", + "test_success": "프록시 설정이 정상 작동합니다", + "test_error": "프록시 설정 테스트에 실패했습니다. 다시 시도해주세요.", + "fetch_success": "프록시 설정을 정상적으로 불러왔습니다", + "remove_success": "프록시가 정상적으로 삭제되었습니다", + "remove_error": "프록시 삭제에 실패했습니다. 다시 시도해주세요." + } + }, + "apikey": { + "title": "API 키 관리", + "default_name": "Maxun API 키", + "table": { + "name": "API 키 이름", + "key": "API 키", + "actions": "동작" + }, + "actions": { + "copy": "복사", + "show": "보기", + "hide": "숨기기", + "delete": "삭제" + }, + "no_key_message": "아직 API 키를 생성하지 않았습니다.", + "generate_button": "API 키 생성", + "notifications": { + "fetch_error": "API 키를 불러오지 못했습니다 - ${error}", + "generate_success": "API 키가 성공적으로 생성되었습니다", + "generate_error": "API 키 생성에 실패했습니다 - ${error}", + "delete_success": "API 키가 삭제되었습니다", + "delete_error": "API 키 삭제에 실패했습니다 - ${error}", + "copy_success": "API 키가 복사되었습니다" + } + }, + "action_description": { + "text": { + "title": "텍스트 추출", + "description": "추출하고 싶은 텍스트 위에 마우스를 올리고 클릭하여 선택하세요" + }, + "screenshot": { + "title": "스크린샷 캡처", + "description": "현재 페이지의 일부 또는 전체 스크린샷을 캡처하세요." + }, + "list": { + "title": "목록 추출", + "description": "추출할 목록 위에 마우스를 올리세요. 선택한 후 목록 내 개별 텍스트들을 마우스로 선택할 수 있습니다. 클릭하여 선택하세요." + }, + "default": { + "title": "어떤 데이터를 추출하시겠습니까?", + "description": "로봇은 하나 이상의 작업을 수행할 수 있습니다. 아래 옵션 중 선택하세요." + }, + "list_stages": { + "initial": "추출할 목록과 목록의 텍스트를 선택하세요", + "pagination": "로봇이 목록의 나머지 항목을 어떻게 캡처할지 선택하세요", + "limit": "추출할 항목 개수를 지정하세요", + "complete": "캡처가 완료되었습니다" + }, + "actions": { + "text": "텍스트 추출", + "list": "목록 추출", + "screenshot": "스크린샷 캡처" + } + }, + "right_panel": { + "buttons": { + "capture_list": "목록 추출", + "capture_text": "텍스트 추출", + "capture_screenshot": "스크린샷 캡처", + "confirm": "확인", + "discard": "취소", + "confirm_capture": "추출 확정", + "confirm_pagination": "확정", + "confirm_limit": "확정", + "confirm_reset": "확정", + "finish_capture": "캡처 완료", + "back": "뒤로", + "reset": "녹화 재시작", + "finish": "완료", + "cancel": "취소", + "delete": "삭제" + }, + "screenshot": { + "capture_fullpage": "전체 페이지 캡처", + "capture_visible": "보이는 영역 캡처", + "display_fullpage": "전체 페이지 스크린샷 찍기", + "display_visible": "보이는 부분 스크린샷 찍기" + }, + "pagination": { + "title": "페이지의 다음 목록 항목을 어떻게 찾을까요?", + "click_next": "다음 버튼 클릭", + "click_load_more": "더보기 버튼 클릭", + "scroll_down": "아래로 스크롤해서 더 불러오기", + "scroll_up": "위로 스크롤해서 더 불러오기", + "none": "더 이상 항목 없음" + }, + "limit": { + "title": "최대 몇 행을 추출할까요?", + "custom": "사용자 지정", + "enter_number": "숫자 입력" + }, + "fields": { + "label": "라벨", + "data": "데이터", + "field_label": "필드 라벨", + "field_data": "필드 데이터" + }, + "messages": { + "list_selected": "목록이 선택되었습니다", + "list_empty": "목록이 선택되었습니다. 목록 내 추출할 필드를 선택하세요." + }, + "errors": { + "select_pagination": "페이지 타입을 선택해 주세요.", + "select_pagination_element": "먼저 페이지네이션 요소를 선택해 주세요.", + "select_limit": "개수 제한을 선택하거나 직접 입력해 주세요.", + "invalid_limit": "유효한 제한값을 입력해 주세요.", + "confirm_text_fields": "모든 텍스트 필드를 확정해 주세요", + "unable_create_settings": "목록 필드를 정의했는지 확인하세요. 목록 설정을 생성할 수 없습니다.", + "capture_text_discarded": "텍스트 추출이 취소되었습니다", + "capture_list_discarded": "목록 추출이 취소되었습니다", + "label_required": "라벨이 비어 있을 수 없습니다" + } + }, + "save_recording": { + "title": "로봇 저장", + "robot_name": "로봇 이름", + "buttons": { + "save": "저장", + "confirm": "확정" + }, + "notifications": { + "save_success": "로봇이 성공적으로 저장되었습니다", + "retrain_success": "로봇 재학습이 완료되었습니다", + "save_error": "로봇 저장 중 오류가 발생했습니다" + }, + "errors": { + "user_not_logged": "로그인하지 않아 녹화를 저장할 수 없습니다.", + "exists_warning": "동일한 이름의 로봇이 이미 존재합니다. 덮어쓰기를 확정해 주세요." + }, + "tooltips": { + "saving": "워크플로 최적화 및 저장 중" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "녹화를 취소하시겠습니까?", + "confirm_reset": "녹화를 재시작하시겠습니까?", + "reset_warning": "이전 모든 캡처가 삭제되고, 같은 사이트에 대해 녹화가 다시 시작됩니다." + }, + "notifications": { + "terminated": "현재 녹화가 종료되었습니다", + "environment_reset": "브라우저 환경이 초기화되었습니다", + "reset_successful": "모든 캡처가 초기화되었고 초기 상태로 돌아갔습니다" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "데이터 출력 미리보기", + "screenshot": "스크린샷" + }, + "messages": { + "additional_rows": "녹화 완료 후 추가 데이터가 추출됩니다.", + "successful_training": "로봇이 성공적으로 동작을 학습했습니다! 아래 버튼을 클릭해 로봇이 추출할 데이터의 미리보기를 확인하세요.", + "no_selection": "아직 추출할 대상을 선택하지 않았습니다. 추출 대상을 선택하면 이곳에 미리보기가 표시됩니다." + }, + "data_sections": { + "binary_received": "---------- 바이너리 데이터 수신 ----------", + "serializable_received": "---------- 직렬화 가능한 데이터 수신 ----------", + "mimetype": "mimetype: ", + "image_below": "이미지는 아래에 렌더링됨:", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "출력 미리보기가 초기화되었습니다" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "출력 데이터 미리보기", + "reset": "초기화", + "yes": "예", + "no": "아니오" + }, + "messages": { + "extracting": "데이터 추출 중... 10초~1분 정도 소요될 수 있습니다", + "restart_required": "녹화 업데이트 후 해석을 다시 시작해 주세요", + "run_finished": "실행이 완료되었습니다", + "run_failed": "실행 시작에 실패했습니다" + }, + "modal": { + "use_previous": "이전 선택을 동작의 조건으로 사용할까요?", + "previous_action": "이전 동작: ", + "element_text": "텍스트가 포함된 요소: " + } + }, + "recording_page": { + "loader": { + "browser_startup": "브라우저 시작 중... {{url}} 로 이동합니다" + } + }, + "integration_settings": { + "title": "연동 설정", + "descriptions": { + "authenticated_as": "다음 계정으로 인증됨: {{email}}" + }, + "buttons": { + "submit": "제출", + "remove_integration": "연동 해제" + }, + "google": { + "title": "구글 시트 연동", + "descriptions": { + "sync_info": "이 옵션을 활성화하면, 로봇이 작업을 성공적으로 수행할 때마다 데이터가 구글 시트에 자동 추가됩니다.", + "authenticated_as": "다음 계정으로 인증됨: {{email}}" + }, + "alerts": { + "success": { + "title": "구글 시트 연동이 성공적으로 완료되었습니다.", + "content": "로봇이 성공적으로 실행될 때마다, 데이터가 {{sheetName}} 구글 시트에 추가됩니다. 데이터 업데이트를 확인하려면", + "here": "여기", + "note": "참고:", + "sync_limitation": "구글 시트 연동 전 추출한 데이터는 동기화되지 않습니다. 연동 후 추출 데이터만 동기화됩니다." + } + }, + "buttons": { + "authenticate": "구글 인증", + "fetch_sheets": "구글 시트 불러오기", + "remove_integration": "연동 해제", + "submit": "제출" + }, + "fields": { + "select_sheet": "구글 시트 선택", + "selected_sheet": "선택된 시트: {{name}} (ID: {{id}})" + }, + "errors": { + "auth_error": "구글 인증 중 오류", + "fetch_error": "구글 스프레드시트 파일 불러오기 오류: {{message}}", + "update_error": "구글 시트 ID 갱신 오류: {{message}}", + "remove_error": "구글 시트 연동 해제 오류: {{message}}" + }, + "notifications": { + "sheet_selected": "구글 시트가 선택되었습니다", + "integration_removed": "구글 시트 연동이 해제되었습니다" + } + }, + "airtable": { + "title": "Airtable 연동", + "descriptions": { + "sync_info": "이 옵션을 활성화하면, 로봇이 작업을 성공적으로 수행할 때마다 데이터가 Airtable Base에 추가됩니다.", + "authenticated_as": "Airtable 인증이 완료되었습니다. 이제 연동할 base와 table을 선택할 수 있습니다." + }, + "alerts": { + "success": { + "title": "Airtable Base 연동 성공", + "content": "로봇 실행 시 데이터가 {{baseName}} Base, {{tableName}} Table에 자동 저장됩니다. 업데이트 확인은", + "here": "여기", + "note": "참고:", + "sync_limitation": "연동 후에 추출된 데이터만 Airtable에 동기화됩니다." + } + }, + "buttons": { + "authenticate": "Airtable 연결", + "fetch_bases": "Airtable Base 불러오기", + "fetch_tables": "Airtable Table 불러오기", + "remove_integration": "연동 해제", + "submit": "Base 및 Table 선택" + }, + "fields": { + "select_base": "Airtable Base 선택", + "select_table": "Airtable Table 선택", + "selected_base": "선택된 Base: {{name}}", + "selected_table": "선택된 Table: {{name}}" + }, + "errors": { + "auth_error": "Airtable 인증 오류", + "fetch_error": "Airtable base 불러오기 오류: {{message}}", + "fetch_tables_error": "Airtable table 불러오기 오류: {{message}}", + "update_error": "Airtable base 갱신 오류: {{message}}", + "remove_error": "Airtable 연동 해제 오류: {{message}}" + }, + "notifications": { + "base_selected": "Airtable base가 선택되었습니다", + "table_selected": "Airtable table이 선택되었습니다", + "integration_removed": "Airtable 연동이 해제되었습니다" + } + } + }, + "robot_duplication": { + "title": "로봇 복제", + "descriptions": { + "purpose": "로봇 복제는 동일한 구조의 페이지에서 데이터를 추출할 때 유용합니다.", + "example": "예시: {{url1}}에 대한 로봇을 만들었다면, 복제 기능으로 {{url2}}와 같이 유사한 페이지에서도 반복 학습 없이 데이터를 추출할 수 있습니다.", + "warning": "⚠️ 새 페이지의 구조가 원본과 동일한지 꼭 확인하세요." + }, + "fields": { + "target_url": "로봇 대상 URL" + }, + "buttons": { + "duplicate": "로봇 복제", + "cancel": "취소" + }, + "notifications": { + "robot_not_found": "로봇 정보를 찾지 못했습니다. 다시 시도해주세요.", + "url_required": "대상 URL을 입력하세요.", + "duplicate_success": "로봇이 성공적으로 복제되었습니다.", + "duplicate_error": "대상 URL 업데이트에 실패했습니다. 다시 시도해주세요.", + "unknown_error": "대상 URL 업데이트 중 오류가 발생했습니다." + } + }, + "robot_settings": { + "title": "로봇 설정", + "target_url": "로봇 대상 URL", + "robot_id": "로봇 ID", + "robot_limit": "로봇 한도", + "created_by_user": "제작자", + "created_at": "생성 일시", + "errors": { + "robot_not_found": "로봇 정보를 찾지 못했습니다. 다시 시도해주세요." + } + }, + "robot_edit": { + "title": "로봇 수정", + "change_name": "로봇 이름", + "robot_limit": "로봇 한도", + "save": "변경사항 저장", + "cancel": "취소", + "notifications": { + "update_success": "로봇이 성공적으로 수정되었습니다.", + "update_failed": "로봇 수정에 실패했습니다. 다시 시도해주세요.", + "update_error": "로봇 수정 중 오류가 발생했습니다." + } + }, + "schedule_settings": { + "title": "스케줄 설정", + "run_every": "실행 주기", + "start_from": "시작 시점", + "on_day": "요일", + "at_around": "시작 시간", + "timezone": "시간대", + "buttons": { + "delete_schedule": "스케줄 삭제", + "save_schedule": "스케줄 저장", + "cancel": "취소" + }, + "labels": { + "in_between": "사이", + "run_once_every": "매주 1회 실행", + "start_from_label": "시작일", + "on_day_of_month": "월 별 실행일", + "on_day": { + "st": "일", + "nd": "일", + "rd": "일", + "th": "일" + } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "로봇 {{name}} 해석 성공", + "interpretation_failed": "로봇 {{name}} 해석 실패", + "run_started": "로봇 실행 중: {{name}}", + "run_start_failed": "로봇 실행 실패: {{name}}", + "schedule_success": "로봇 {{name}} 스케줄이 성공적으로 적용됨", + "schedule_failed": "로봇 {{name}} 스케줄 적용 실패", + "abort_success": "로봇 {{name}} 해석이 성공적으로 중단됨", + "abort_failed": "로봇 {{name}} 해석 중단 실패", + "abort_initiated": "로봇 {{name}} 해석 중단을 시도 중" + }, + "menu": { + "recordings": "로봇", + "runs": "실행 기록", + "proxy": "프록시", + "apikey": "API 키" + } + }, + "browser_window": { + "attribute_modal": { + "title": "속성 선택", + "notifications": { + "list_select_success": "목록이 선택되었습니다. 텍스트 데이터를 선택하세요.", + "pagination_select_success": "페이지네이션 요소가 선택되었습니다." + } + }, + "attribute_options": { + "anchor": { + "text": "텍스트: {{text}}", + "url": "URL: {{url}}" + }, + "image": { + "alt_text": "대체 텍스트: {{altText}}", + "image_url": "이미지 URL: {{imageUrl}}" + }, + "default": { + "text": "텍스트: {{text}}" + } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "수동 실행", + "scheduled_run": "예약 실행", + "api": "API", + "unknown_run_type": "알 수 없는 실행 방식" + }, + "run_status_chips": { + "success": "성공", + "running": "실행 중", + "scheduled": "예약됨", + "queued": "대기 중", + "failed": "실패", + "aborted": "중단됨" + }, + "run_settings_modal": { + "title": "실행 설정", + "labels": { + "run_id": "실행 ID", + "run_by_user": "사용자 실행", + "run_by_schedule": "스케줄 실행", + "run_by_api": "API 실행", + "run_type": "실행 타입" + } + } + }, + "run_content": { + "tabs": { + "output_data": "출력 데이터", + "log": "로그" + }, + "buttons": { + "stop": "중지" + }, + "loading": "데이터 불러오는 중...", + "empty_output": "출력 데이터가 없습니다", + "captured_data": { + "title": "추출된 데이터", + "download_csv": "CSV 다운로드", + "view_full": "전체 데이터 보기", + "items": "개 항목", + "schema_title": "추출된 텍스트", + "list_title": "추출된 목록" + }, + "captured_screenshot": { + "title": "캡처된 스크린샷", + "download": "다운로드", + "render_failed": "스크린샷 렌더링 실패" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "성공적으로 로그아웃 되었습니다" + }, + "errors": { + "logout": { + "unauthorized": "이 작업을 수행할 권한이 없습니다", + "server": "로그아웃 도중 서버 오류 발생", + "network": "네트워크 오류로 로그아웃에 실패했습니다", + "unknown": "알 수 없는 오류로 로그아웃에 실패했습니다" + } + } + }, + "upgrade": { + "button": "업그레이드", + "modal": { + "up_to_date": "🎉 최신 버전입니다!", + "new_version_available": "새 버전 사용 가능: {{version}}. 버그 수정, 개선, 새로운 기능을 위해 최신 버전으로 업그레이드하세요!", + "view_updates": "업데이트 내역 보기", + "view_updates_link": "여기", + "tabs": { + "manual_setup": "수동 업그레이드 설정", + "docker_setup": "도커 컴포즈 업그레이드 설정" + } + } + }, + "menu_items": { + "logout": "로그아웃", + "discord": "디스코드", + "youtube": "유튜브", + "twitter": "트위터(X)", + "language": "언어" + }, + "recording": { + "discard": "취소" + } + }, + "language_menu": { + "en": "영어", + "es": "스페인어", + "ja": "일본어", + "zh": "중국어", + "de": "독일어", + "ru": "러시아어", + "fr": "프랑스어", + "ko": "한국어" + } +} diff --git a/public/locales/ru.json b/public/locales/ru.json new file mode 100644 index 000000000..6d4fae60b --- /dev/null +++ b/public/locales/ru.json @@ -0,0 +1,621 @@ +{ + "login": { + "title": "С возвращением!", + "email": "Введите рабочий e-mail", + "password": "Пароль", + "button": "Войти", + "loading": "Загрузка", + "register_prompt": "Нет аккаунта?", + "register_link": "Регистрация", + "welcome_notification": "Добро пожаловать в Maxun!", + "validation": { + "required_fields": "E-mail и пароль обязательны", + "password_length": "Пароль должен содержать не менее 6 символов" + }, + "error": { + "user_not_found": "Пользователь не найден", + "invalid_credentials": "Неверный e-mail или пароль", + "server_error": "Ошибка входа. Попробуйте позже", + "generic": "Произошла ошибка. Попробуйте снова" + } + }, + "register": { + "title": "Создать аккаунт", + "email": "Введите рабочий e-mail", + "password": "Пароль", + "button": "Зарегистрироваться", + "loading": "Загрузка", + "register_prompt": "Уже есть аккаунт?", + "login_link": "Войти", + "welcome_notification": "Добро пожаловать в Maxun!", + "validation": { + "email_required": "Необходимо указать e-mail", + "password_requirements": "Пароль должен содержать не менее 6 символов" + }, + "error": { + "user_exists": "Пользователь с этим e-mail уже существует", + "creation_failed": "Не удалось создать аккаунт", + "server_error": "Произошла ошибка сервера", + "generic": "Ошибка регистрации. Попробуйте снова" + } + }, + "recordingtable": { + "run": "Запустить", + "name": "Имя", + "schedule": "Расписание", + "integrate": "Интеграция", + "settings": "Настройки", + "options": "Опции", + "heading": "Мои роботы", + "new": "Создать робота", + "modal": { + "title": "Введите URL", + "login_title": "Этот сайт требует вход?", + "label": "URL", + "button": "Начать запись" + }, + "warning_modal": { + "title": "Активный браузер обнаружен", + "message": "Уже есть активная сессия записи браузера. Хотите отменить её и начать новую?", + "discard_and_create": "Отменить и создать новую", + "cancel": "Отмена" + }, + "retrain": "Переобучить", + "edit": "Редактировать", + "delete": "Удалить", + "duplicate": "Дублировать", + "search": "Поиск роботов...", + "notifications": { + "delete_warning": "У робота есть связанные выполнения. Сначала удалите их, чтобы удалить робота", + "delete_success": "Робот успешно удалён", + "auth_success": "Робот успешно аутентифицирован", + "browser_limit_warning": "Удалённые браузеры заняты. Подождите несколько минут и попробуйте снова" + } + }, + "mainmenu": { + "recordings": "Роботы", + "runs": "Запуски", + "proxy": "Прокси", + "apikey": "API-ключ", + "feedback": "Присоединяйтесь к Maxun Cloud", + "apidocs": "Сайт в API" + }, + "runstable": { + "runs": "Все запуски", + "runStatus": "Статус", + "runName": "Имя", + "startedAt": "Начато в", + "finishedAt": "Завершено в", + "delete": "Удалить", + "settings": "Настройки", + "search": "Поиск запусков...", + "sort_tooltip": "Кликните для сортировки", + "notifications": { + "no_runs": "Запуски не найдены. Попробуйте снова.", + "delete_success": "Запуск успешно удалён" + } + }, + "proxy": { + "title": "Настройки прокси", + "tab_standard": "Стандартный прокси", + "tab_rotation": "Автоматическая ротация прокси", + "server_url": "URL сервера прокси", + "server_url_helper": "Прокси для всех роботов. Поддерживаются HTTP и SOCKS прокси. Пример: http://myproxy.com:3128 или socks5://myproxy.com:3128. Короткая форма myproxy.com:3128 — HTTP-прокси.", + "requires_auth": "Требуется аутентификация?", + "username": "Имя пользователя", + "password": "Пароль", + "add_proxy": "Добавить прокси", + "test_proxy": "Проверить прокси", + "remove_proxy": "Удалить прокси", + "table": { + "proxy_url": "Прокси URL", + "requires_auth": "Требует аутентификации" + }, + "coming_soon": "Скоро — в Open Source (базовая ротация) и Cloud (продвинутая ротация). Если не хотите управлять инфраструктурой, присоединяйтесь к списку ожидания облака.", + "join_waitlist": "Встать в очередь Maxun Cloud", + "alert": { + "title": "Если для прокси требуется имя пользователя и пароль, всегда вводите их отдельно от URL.", + "right_way": "Правильный способ", + "wrong_way": "Неправильный способ", + "proxy_url": "Прокси URL:", + "username": "Имя пользователя:", + "password": "Пароль:" + }, + "notifications": { + "config_success": "Настройки прокси успешно отправлены", + "config_error": "Не удалось сохранить настройки прокси. Попробуйте снова.", + "test_success": "Прокси работает корректно", + "test_error": "Ошибка тестирования прокси. Попробуйте снова.", + "fetch_success": "Настройки прокси успешно получены", + "remove_success": "Прокси успешно удалён", + "remove_error": "Не удалось удалить прокси. Попробуйте снова." + } + }, + "apikey": { + "title": "Управление вашим API-ключом", + "default_name": "API-ключ Maxun", + "table": { + "name": "Название ключа API", + "key": "API-ключ", + "actions": "Действия" + }, + "actions": { + "copy": "Копировать", + "show": "Показать", + "hide": "Скрыть", + "delete": "Удалить" + }, + "no_key_message": "Вы ещё не создали API-ключ.", + "generate_button": "Создать API-ключ", + "notifications": { + "fetch_error": "Ошибка получения API-ключа - ${error}", + "generate_success": "API-ключ успешно создан", + "generate_error": "Ошибка при создании API-ключа - ${error}", + "delete_success": "API-ключ успешно удалён", + "delete_error": "Ошибка при удалении API-ключа - ${error}", + "copy_success": "API-ключ успешно скопирован" + } + }, + "action_description": { + "text": { + "title": "Захватить текст", + "description": "Наведите курсор и кликните по тексту, который хотите извлечь" + }, + "screenshot": { + "title": "Сделать скриншот", + "description": "Сделать частичный или полный скриншот текущей страницы." + }, + "list": { + "title": "Захватить список", + "description": "Наведите курсор на список для извлечения. Выбрав, вы можете кликать по текстам внутри этого списка." + }, + "default": { + "title": "Какие данные вы хотите извлечь?", + "description": "Робот может выполнять одну или несколько действий. Выберите вариант ниже." + }, + "list_stages": { + "initial": "Выберите список и тексты для извлечения", + "pagination": "Выберите способ сбора остального списка", + "limit": "Укажите максимальное число элементов для извлечения", + "complete": "Захват завершён" + }, + "actions": { + "text": "Захватить текст", + "list": "Захватить список", + "screenshot": "Сделать скриншот" + } + }, + "right_panel": { + "buttons": { + "capture_list": "Захватить список", + "capture_text": "Захватить текст", + "capture_screenshot": "Сделать скриншот", + "confirm": "Подтвердить", + "discard": "Отмена", + "confirm_capture": "Подтвердить захват", + "confirm_pagination": "Подтвердить", + "confirm_limit": "Подтвердить", + "confirm_reset": "Подтвердить", + "finish_capture": "Завершить захват", + "back": "Назад", + "reset": "Перезапустить запись", + "finish": "Готово", + "cancel": "Отмена", + "delete": "Удалить" + }, + "screenshot": { + "capture_fullpage": "Сделать снимок всей страницы", + "capture_visible": "Сделать снимок видимой части", + "display_fullpage": "Сделать полный скриншот страницы", + "display_visible": "Сделать скриншот видимой части" + }, + "pagination": { + "title": "Как найти следующий элемент списка на странице?", + "click_next": "Кликнуть по 'далее', чтобы перейти на следующую страницу", + "click_load_more": "Кликнуть по 'загрузить ещё', чтобы получить больше элементов", + "scroll_down": "Прокрутить вниз для загрузки следующих элементов", + "scroll_up": "Прокрутить вверх для загрузки следующих элементов", + "none": "Больше элементов нет" + }, + "limit": { + "title": "Максимальное число строк для извлечения?", + "custom": "Другое", + "enter_number": "Введите число" + }, + "fields": { + "label": "Метка", + "data": "Данные", + "field_label": "Метка поля", + "field_data": "Данные поля" + }, + "messages": { + "list_selected": "Список успешно выбран", + "list_empty": "Список выбран. Пожалуйста, выберите поля в списке." + }, + "errors": { + "select_pagination": "Пожалуйста, выберите способ пагинации.", + "select_pagination_element": "Пожалуйста, сначала выберите элемент пагинации.", + "select_limit": "Пожалуйста, выберите лимит или введите свой вариант.", + "invalid_limit": "Введите корректный лимит.", + "confirm_text_fields": "Подтвердите все текстовые поля", + "unable_create_settings": "Не удаётся создать настройки для списка. Проверьте, что указано поле.", + "capture_text_discarded": "Захват текста отменён", + "capture_list_discarded": "Захват списка отменён", + "label_required": "Метка не может быть пустой" + } + }, + "save_recording": { + "title": "Сохранить робота", + "robot_name": "Имя робота", + "buttons": { + "save": "Сохранить", + "confirm": "Подтвердить" + }, + "notifications": { + "save_success": "Робот успешно сохранён", + "retrain_success": "Робот успешно переобучен", + "save_error": "Ошибка при сохранении робота" + }, + "errors": { + "user_not_logged": "Пользователь не вошёл. Сохранение невозможно.", + "exists_warning": "Робот с таким именем уже существует, подтвердите перезапись." + }, + "tooltips": { + "saving": "Оптимизация и сохранение схемы" + } + }, + "browser_recording": { + "modal": { + "confirm_discard": "Вы уверены, что хотите отменить запись?", + "confirm_reset": "Вы уверены, что хотите перезапустить запись?", + "reset_warning": "Все предыдущие захваты текущей сессии будут удалены. Запись начнётся заново на том же сайте." + }, + "notifications": { + "terminated": "Текущая запись завершена", + "environment_reset": "Окружение браузера сброшено", + "reset_successful": "Все захваты сброшены, возвращение к начальному состоянию" + } + }, + "interpretation_log": { + "titles": { + "output_preview": "Предпросмотр выходных данных", + "screenshot": "Скриншот" + }, + "messages": { + "additional_rows": "После завершения записи будут извлечены дополнительные данные.", + "successful_training": "Робот успешно обучен для действий! Нажмите на кнопку ниже, чтобы получить предпросмотр извлекаемых данных.", + "no_selection": "Похоже, вы ещё не выбрали элементы для извлечения. Как только выберете — здесь появится предпросмотр." + }, + "data_sections": { + "binary_received": "---------- Получены бинарные данные выхода ----------", + "serializable_received": "---------- Получены сериализуемые данные выхода ----------", + "mimetype": "mimetype: ", + "image_below": "Изображение ниже:", + "separator": "--------------------------------------------------" + }, + "notifications": { + "reset_success": "Предпросмотр выхода успешно сброшен" + } + }, + "interpretation_buttons": { + "buttons": { + "preview": "Получить предпросмотр данных", + "reset": "Сбросить", + "yes": "Да", + "no": "Нет" + }, + "messages": { + "extracting": "Идёт извлечение данных... подождите 10 сек – 1 мин", + "restart_required": "Пожалуйста, перезапустите интерпретацию после обновления записи", + "run_finished": "Выполнение завершено", + "run_failed": "Не удалось запустить выполнение" + }, + "modal": { + "use_previous": "Использовать ваш предыдущий выбор как условие для этого действия?", + "previous_action": "Ваше предыдущее действие:", + "element_text": "на элементе с текстом " + } + }, + "recording_page": { + "loader": { + "browser_startup": "Запуск браузера... Переход на {{url}}" + } + }, + "integration_settings": { + "title": "Настройки интеграций", + "descriptions": { + "authenticated_as": "Выполнен вход как: {{email}}" + }, + "buttons": { + "submit": "Отправить", + "remove_integration": "Удалить интеграцию" + }, + "google": { + "title": "Интеграция с Google Sheets", + "descriptions": { + "sync_info": "Если включено, после каждого успешного запуска робота данные добавляются в ваш Google Sheet.", + "authenticated_as": "Выполнен вход как: {{email}}" + }, + "alerts": { + "success": { + "title": "Интеграция с Google Sheets прошла успешно.", + "content": "После каждого успешного запуска данные будут добавлены в таблицу {{sheetName}}. Смотрите обновления", + "here": "здесь", + "note": "Примечание:", + "sync_limitation": "Данные, полученные до интеграции с Google Sheets, не будут синхронизированы. Только новые данные будут синхронизированы." + } + }, + "buttons": { + "authenticate": "Войти в Google", + "fetch_sheets": "Загрузить таблицы Google", + "remove_integration": "Удалить интеграцию", + "submit": "Отправить" + }, + "fields": { + "select_sheet": "Выберите таблицу Google", + "selected_sheet": "Выбрана таблица: {{name}} (ID: {{id}})" + }, + "errors": { + "auth_error": "Ошибка авторизации Google", + "fetch_error": "Ошибка загрузки файлов: {{message}}", + "update_error": "Ошибка обновления Google Sheet ID: {{message}}", + "remove_error": "Ошибка удаления интеграции с Google Sheets: {{message}}" + }, + "notifications": { + "sheet_selected": "Google Sheet успешно выбран", + "integration_removed": "Интеграция Google Sheets успешно удалена" + } + }, + "airtable": { + "title": "Интеграция с Airtable", + "descriptions": { + "sync_info": "Если включено, после каждого успешного запуска робота данные добавляются в вашу базу Airtable.", + "authenticated_as": "Успешная авторизация в Airtable. Можете выбрать базу и таблицу для интеграции." + }, + "alerts": { + "success": { + "title": "База Airtable успешно интегрирована", + "content": "После каждого успешного выполнения данные добавляются в базу {{baseName}} и таблицу {{tableName}}. Смотрите обновления", + "here": "здесь", + "note": "Примечание:", + "sync_limitation": "Только новые данные будут синхронизированы с Airtable." + } + }, + "buttons": { + "authenticate": "Подключить Airtable", + "fetch_bases": "Получить базы Airtable", + "fetch_tables": "Получить таблицы Airtable", + "remove_integration": "Удалить интеграцию", + "submit": "Выбрать Базу и Таблицу" + }, + "fields": { + "select_base": "Выберите базу Airtable", + "select_table": "Выберите таблицу Airtable", + "selected_base": "Выбрана база: {{name}}", + "selected_table": "Выбрана таблица: {{name}}" + }, + "errors": { + "auth_error": "Ошибка авторизации Airtable", + "fetch_error": "Ошибка получения баз данных: {{message}}", + "fetch_tables_error": "Ошибка получения таблиц: {{message}}", + "update_error": "Ошибка обновления базы: {{message}}", + "remove_error": "Ошибка удаления интеграции Airtable: {{message}}" + }, + "notifications": { + "base_selected": "База Airtable успешно выбрана", + "table_selected": "Таблица Airtable успешно выбрана", + "integration_removed": "Интеграция Airtable успешно удалена" + } + } + }, + "robot_duplication": { + "title": "Дублировать робота", + "descriptions": { + "purpose": "Дублирование робота удобно для извлечения данных со страниц одинаковой структуры.", + "example": "Например: если вы создали робота для {{url1}}, вы можете дублировать его и использовать для {{url2}}, не обучая заново.", + "warning": "⚠️ Убедитесь, что новая страница имеет такую же структуру, как оригинал." + }, + "fields": { + "target_url": "Целевой URL робота" + }, + "buttons": { + "duplicate": "Дублировать робота", + "cancel": "Отмена" + }, + "notifications": { + "robot_not_found": "Не удалось найти детали робота. Попробуйте снова.", + "url_required": "Требуется целевой URL.", + "duplicate_success": "Робот успешно дублирован.", + "duplicate_error": "Не удалось обновить целевой URL. Попробуйте снова.", + "unknown_error": "Произошла неизвестная ошибка при обновлении целевого URL." + } + }, + "robot_settings": { + "title": "Настройки робота", + "target_url": "Целевой URL робота", + "robot_id": "ID робота", + "robot_limit": "Лимит робота", + "created_by_user": "Создал пользователь", + "created_at": "Робот создан", + "errors": { + "robot_not_found": "Не удалось найти детали робота. Попробуйте снова." + } + }, + "robot_edit": { + "title": "Редактировать робота", + "change_name": "Имя робота", + "robot_limit": "Лимит робота", + "save": "Сохранить изменения", + "cancel": "Отмена", + "notifications": { + "update_success": "Робот успешно обновлён.", + "update_failed": "Ошибка обновления робота. Попробуйте снова.", + "update_error": "Произошла ошибка при обновлении робота." + } + }, + "schedule_settings": { + "title": "Настройки расписания", + "run_every": "Запускать каждые", + "start_from": "Начать с", + "on_day": "В день", + "at_around": "Около", + "timezone": "Часовой пояс", + "buttons": { + "delete_schedule": "Удалить расписание", + "save_schedule": "Сохранить расписание", + "cancel": "Отмена" + }, + "labels": { + "in_between": "между", + "run_once_every": "Запускать раз в", + "start_from_label": "Начинать с", + "on_day_of_month": "В день месяца", + "on_day": { + "st": "е", + "nd": "е", + "rd": "е", + "th": "е" + } + } + }, + "main_page": { + "notifications": { + "interpretation_success": "Интерпретация робота {{name}} завершена успешно", + "interpretation_failed": "Ошибка интерпретации робота {{name}}", + "run_started": "Запуск робота: {{name}}", + "run_start_failed": "Не удалось запустить робота: {{name}}", + "schedule_success": "Расписание для робота {{name}} успешно сохранено", + "schedule_failed": "Ошибка сохранения расписания для робота {{name}}", + "abort_success": "Интерпретацию робота {{name}} успешно прервали", + "abort_failed": "Ошибка прерывания интерпретации робота {{name}}", + "abort_initiated": "Прерываем интерпретацию робота {{name}}" + }, + "menu": { + "recordings": "Роботы", + "runs": "Запуски", + "proxy": "Прокси", + "apikey": "API-ключ" + } + }, + "browser_window": { + "attribute_modal": { + "title": "Выберите атрибут", + "notifications": { + "list_select_success": "Список успешно выбран. Теперь выберите текстовые данные для извлечения.", + "pagination_select_success": "Элемент для пагинации успешно выбран." + } + }, + "attribute_options": { + "anchor": { + "text": "Текст: {{text}}", + "url": "URL: {{url}}" + }, + "image": { + "alt_text": "Альтернативный текст: {{altText}}", + "image_url": "URL изображения: {{imageUrl}}" + }, + "default": { + "text": "Текст: {{text}}" + } + } + }, + "runs_table": { + "run_type_chips": { + "manual_run": "Ручной запуск", + "scheduled_run": "По расписанию", + "api": "API", + "unknown_run_type": "Неизвестный тип запуска" + }, + "run_status_chips": { + "success": "Успешно", + "running": "Выполняется", + "scheduled": "Запланировано", + "queued": "В очереди", + "failed": "Ошибка", + "aborted": "Прервано" + }, + "run_settings_modal": { + "title": "Настройки запуска", + "labels": { + "run_id": "ID запуска", + "run_by_user": "Запущено пользователем", + "run_by_schedule": "Запущено по расписанию", + "run_by_api": "Запущено через API", + "run_type": "Тип запуска" + } + } + }, + "run_content": { + "tabs": { + "output_data": "Выходные данные", + "log": "Журнал" + }, + "buttons": { + "stop": "Стоп" + }, + "loading": "Загрузка данных...", + "empty_output": "Нет выходных данных", + "captured_data": { + "title": "Полученные данные", + "download_csv": "Скачать CSV", + "view_full": "Показать все данные", + "items": "элементов", + "schema_title": "Извлечённые тексты", + "list_title": "Извлечённые списки" + }, + "captured_screenshot": { + "title": "Сделанные скриншоты", + "download": "Скачать", + "render_failed": "Не удалось отобразить скриншот" + } + }, + "navbar": { + "project_name": "Maxun", + "notifications": { + "success": { + "logout": "Выход выполнен успешно" + }, + "errors": { + "logout": { + "unauthorized": "У вас нет прав на это действие", + "server": "Ошибка сервера при выходе", + "network": "Ошибка сети при выходе", + "unknown": "Неожиданная ошибка при выходе" + } + } + }, + "upgrade": { + "button": "Обновить", + "modal": { + "up_to_date": "🎉 У вас последняя версия!", + "new_version_available": "Доступна новая версия: {{version}}. Обновитесь для исправлений, улучшений и новых функций!", + "view_updates": "Смотреть все обновления", + "view_updates_link": "здесь", + "tabs": { + "manual_setup": "Обновление вручную", + "docker_setup": "Обновление Docker Compose" + } + } + }, + "menu_items": { + "logout": "Выход", + "discord": "Discord", + "youtube": "YouTube", + "twitter": "Twitter (X)", + "language": "Язык" + }, + "recording": { + "discard": "Отмена" + } + }, + "language_menu": { + "en": "Английский", + "es": "Испанский", + "ja": "Японский", + "zh": "Китайский", + "de": "Немецкий", + "ru": "Русский", + "fr": "Французский", + "ko": "Корейский" + } +} diff --git a/public/locales/zh.json b/public/locales/zh.json index 3abcfa405..8d05fb2d5 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -1,41 +1,41 @@ { "login": { "title": "欢迎回来!", - "email": "输入工作电子邮箱", + "email": "输入工作邮箱", "password": "密码", "button": "登录", "loading": "加载中", "register_prompt": "还没有账号?", "register_link": "注册", - "welcome_notification": "欢迎使用 Maxun!", + "welcome_notification": "欢迎来到 Maxun!", "validation": { - "required_fields": "邮箱和密码为必填项", - "password_length": "密码必须至少6个字符" + "required_fields": "邮箱和密码必填", + "password_length": "密码至少需要6个字符" }, "error": { "user_not_found": "用户不存在", - "invalid_credentials": "邮箱或密码无效", + "invalid_credentials": "邮箱或密码错误", "server_error": "登录失败,请稍后重试", "generic": "发生错误,请重试" } }, "register": { - "title": "注册账号", - "email": "输入工作电子邮箱", + "title": "创建账户", + "email": "输入工作邮箱", "password": "密码", "button": "注册", "loading": "加载中", "register_prompt": "已有账号?", "login_link": "登录", - "welcome_notification": "欢迎使用 Maxun!", + "welcome_notification": "欢迎来到 Maxun!", "validation": { - "email_required": "邮箱是必填项", - "password_requirements": "密码必须至少6个字符" + "email_required": "邮箱为必填项", + "password_requirements": "密码至少需要6个字符" }, "error": { "user_exists": "该邮箱已被注册", "creation_failed": "无法创建账户", - "server_error": "服务器错误", + "server_error": "服务器发生错误", "generic": "注册失败,请重试" } }, @@ -49,21 +49,27 @@ "heading": "我的机器人", "new": "创建机器人", "modal": { - "title": "输入URL", - "login_title": "此网站需要登录吗?", + "title": "请输入URL", + "login_title": "此网站是否需要登录?", "label": "URL", "button": "开始录制" }, + "warning_modal": { + "title": "检测到活动浏览器", + "message": "已有浏览器录制会话正在运行。是否要丢弃它并创建新的录制?", + "discard_and_create": "丢弃并新建", + "cancel": "取消" + }, "retrain": "重新训练", "edit": "编辑", "delete": "删除", "duplicate": "复制", "search": "搜索机器人...", "notifications": { - "delete_warning": "该机器人有关联的运行记录。请先删除运行记录才能删除机器人", + "delete_warning": "该机器人有相关运行记录,请先删除运行记录再删除机器人", "delete_success": "机器人删除成功", "auth_success": "机器人认证成功", - "browser_limit_warning": "远程浏览器当前繁忙。请稍等几分钟后重试" + "browser_limit_warning": "远程浏览器当前繁忙,请稍后重试" } }, "mainmenu": { @@ -71,21 +77,21 @@ "runs": "运行记录", "proxy": "代理", "apikey": "API密钥", - "feedback": "加入 Maxun Cloud", + "feedback": "加入Maxun Cloud", "apidocs": "网站转API" }, "runstable": { - "runs": "所有运行记录", + "runs": "全部运行", "runStatus": "状态", "runName": "名称", "startedAt": "开始时间", "finishedAt": "结束时间", "delete": "删除", "settings": "设置", - "search": "搜索运行记录...", + "search": "搜索运行...", "sort_tooltip": "点击排序", "notifications": { - "no_runs": "未找到运行记录。请重试。", + "no_runs": "未找到运行记录,请重试。", "delete_success": "运行记录删除成功" } }, @@ -94,21 +100,21 @@ "tab_standard": "标准代理", "tab_rotation": "自动代理轮换", "server_url": "代理服务器URL", - "server_url_helper": "用于所有机器人的代理。支持HTTP和SOCKS代理。示例 http://myproxy.com:3128 或 socks5://myproxy.com:3128。简短形式 myproxy.com:3128 被视为HTTP代理。", + "server_url_helper": "所有机器人使用的代理。支持HTTP和SOCKS代理。例如:http://myproxy.com:3128 或 socks5://myproxy.com:3128。简写 myproxy.com:3128 视为HTTP代理。", "requires_auth": "需要认证?", "username": "用户名", "password": "密码", "add_proxy": "添加代理", "test_proxy": "测试代理", - "remove_proxy": "删除代理", + "remove_proxy": "移除代理", "table": { "proxy_url": "代理URL", - "requires_auth": "需要认证" + "requires_auth": "需认证" }, - "coming_soon": "即将推出 - 开源版(基础轮换)和云版(高级轮换)。如果您不想管理基础设施,请加入我们的云服务等候名单以获得早期访问权限。", - "join_waitlist": "加入Maxun Cloud等候名单", + "coming_soon": "即将上线 - 开源(基本轮换)及云端(高级轮换)。如不想自管基础设施可加入我们的云端候补名单抢先体验。", + "join_waitlist": "加入Maxun Cloud候补名单", "alert": { - "title": "如果您的代理需要用户名和密码,请务必将它们与代理URL分开提供。", + "title": "如代理要求用户名和密码,请务必与代理URL分开填写。", "right_way": "正确方式", "wrong_way": "错误方式", "proxy_url": "代理URL:", @@ -117,16 +123,16 @@ }, "notifications": { "config_success": "代理配置提交成功", - "config_error": "提交代理配置失败。请重试。", - "test_success": "代理配置运行正常", - "test_error": "测试代理配置失败。请重试。", - "fetch_success": "成功获取代理配置", - "remove_success": "成功删除代理配置", - "remove_error": "删除代理配置失败。请重试。" + "config_error": "代理配置提交失败,请重试。", + "test_success": "代理配置正常", + "test_error": "代理配置测试失败,请重试。", + "fetch_success": "代理配置获取成功", + "remove_success": "代理配置移除成功", + "remove_error": "代理配置移除失败,请重试。" } }, "apikey": { - "title": "管理API密钥", + "title": "管理您的API密钥", "default_name": "Maxun API密钥", "table": { "name": "API密钥名称", @@ -139,74 +145,80 @@ "hide": "隐藏", "delete": "删除" }, - "no_key_message": "您还未生成API密钥。", + "no_key_message": "您还没有生成API密钥。", "generate_button": "生成API密钥", "notifications": { "fetch_error": "获取API密钥失败 - ${error}", - "generate_success": "成功生成API密钥", + "generate_success": "API密钥生成成功", "generate_error": "生成API密钥失败 - ${error}", - "delete_success": "成功删除API密钥", - "delete_error": "删除API密钥失败 - ${error}", - "copy_success": "成功复制API密钥" + "delete_success": "API密钥删除成功", + "delete_error": "API密钥删除失败 - ${error}", + "copy_success": "API密钥复制成功" } }, "action_description": { "text": { - "title": "捕获文本", - "description": "将鼠标悬停在要提取的文本上并点击选择" + "title": "提取文本", + "description": "鼠标悬停在要提取的文本上并点击选中" }, "screenshot": { - "title": "捕获截图", - "description": "捕获当前页面的部分或全部截图。" + "title": "截取屏幕", + "description": "截取当前页面的部分或全页截图。" }, "list": { - "title": "捕获列表", - "description": "将鼠标悬停在要提取的列表上。选择后,您可以将鼠标悬停在所选列表中的所有文本上。点击选择它们。" + "title": "提取列表", + "description": "鼠标悬停在要提取的列表上,选中后可选择列表中所有文本,点击选中即可。" }, "default": { - "title": "您想提取什么数据?", - "description": "机器人可以执行一个或多个动作。请从以下选项中选择。" + "title": "你想提取哪些数据?", + "description": "一个机器人可以执行一项或多项操作。请在下方选取。" }, "list_stages": { "initial": "选择要提取的列表及其中的文本", - "pagination": "选择机器人如何捕获列表的其余部分", - "limit": "选择要提取的项目数量", - "complete": "捕获完成" + "pagination": "选择机器人如何抓取列表的其余内容", + "limit": "选择要提取的数据条数", + "complete": "提取完成" + }, + "actions": { + "text": "提取文本", + "list": "提取列表", + "screenshot": "截取屏幕" } }, "right_panel": { "buttons": { - "capture_list": "捕获列表", - "capture_text": "捕获文本", - "capture_screenshot": "捕获截图", + "capture_list": "提取列表", + "capture_text": "提取文本", + "capture_screenshot": "截取屏幕", "confirm": "确认", - "discard": "放弃", - "confirm_capture": "确认捕获", + "discard": "丢弃", + "confirm_capture": "确认提取", "confirm_pagination": "确认", "confirm_limit": "确认", - "finish_capture": "完成捕获", + "confirm_reset": "确认", + "finish_capture": "完成提取", "back": "返回", - "reset": "重置", + "reset": "重新录制", "finish": "完成", "cancel": "取消", "delete": "删除" }, "screenshot": { - "capture_fullpage": "捕获整页", - "capture_visible": "捕获可见部分", - "display_fullpage": "获取整页截图", - "display_visible": "获取可见部分截图" + "capture_fullpage": "截取整页", + "capture_visible": "截取可见部分", + "display_fullpage": "整页截图", + "display_visible": "可见部分截图" }, "pagination": { - "title": "如何在页面上找到下一个列表项?", - "click_next": "点击下一页导航到下一页", - "click_load_more": "点击加载更多来加载更多项目", - "scroll_down": "向下滚动加载更多项目", - "scroll_up": "向上滚动加载更多项目", - "none": "没有更多项目可加载" + "title": "我们如何在页面上找到下一个列表项?", + "click_next": "点击“下一页”", + "click_load_more": "点击“加载更多”", + "scroll_down": "下拉加载更多", + "scroll_up": "上拉加载更多", + "none": "无更多可加载项" }, "limit": { - "title": "您想要提取的最大行数是多少?", + "title": "最多想提取多少行?", "custom": "自定义", "enter_number": "输入数字" }, @@ -218,17 +230,17 @@ }, "messages": { "list_selected": "列表选择成功", - "list_empty": "已选择列表。请选择列表内的字段。" + "list_empty": "列表已选,请继续选择列表中的字段。" }, "errors": { - "select_pagination": "请选择分页类型。", + "select_pagination": "请选择一种分页方式。", "select_pagination_element": "请先选择分页元素。", - "select_limit": "请选择限制或输入自定义限制。", - "invalid_limit": "请输入有效的限制。", + "select_limit": "请选择或输入一个提取上限。", + "invalid_limit": "请输入有效的上限。", "confirm_text_fields": "请确认所有文本字段", - "unable_create_settings": "无法创建列表设置。请确保您已为列表定义了字段。", - "capture_text_discarded": "文本捕获已放弃", - "capture_list_discarded": "列表捕获已放弃", + "unable_create_settings": "无法创建列表设置,请确保已定义字段。", + "capture_text_discarded": "文本提取已丢弃", + "capture_list_discarded": "列表提取已丢弃", "label_required": "标签不能为空" } }, @@ -242,166 +254,166 @@ "notifications": { "save_success": "机器人保存成功", "retrain_success": "机器人重新训练成功", - "save_error": "保存机器人时出错" + "save_error": "保存机器人出错" }, "errors": { - "user_not_logged": "用户未登录。无法保存录制。", - "exists_warning": "已存在同名机器人,请确认是否覆盖机器人。" + "user_not_logged": "未登录,无法保存录制内容。", + "exists_warning": "此名称的机器人已存在,请确认是否覆盖。" }, "tooltips": { - "saving": "正在优化并保存工作流程" + "saving": "正在优化并保存流程" } }, "browser_recording": { "modal": { - "confirm_discard": "您确定要放弃此录制吗?", - "confirm_reset": "您确定要重置吗?", - "reset_warning": "这将清除当前会话中的所有先前捕获。录制会话将针对同一网站重新启动。" + "confirm_discard": "确定要丢弃此次录制吗?", + "confirm_reset": "确定要重新开始录制吗?", + "reset_warning": "这会清除本次会话中的所有捕获内容,录制会为同一网站重新开始。" }, "notifications": { "terminated": "当前录制已终止", "environment_reset": "浏览器环境已重置", - "reset_successful": "已成功重置所有捕获并返回初始状态" + "reset_successful": "所有内容已重置并返回初始状态" } }, "interpretation_log": { "titles": { - "output_preview": "输出数据预览", + "output_preview": "数据输出预览", "screenshot": "截图" }, "messages": { - "additional_rows": "完成录制后将提取更多数据行。", - "successful_training": "您已成功训练机器人执行操作!点击下方按钮预览机器人将提取的数据。", - "no_selection": "看起来您还没有选择要提取的内容。选择后,机器人将在此处显示您的选择预览。" + "additional_rows": "录制完成后将提取更多数据。", + "successful_training": "你已成功训练机器人并配置动作!点击下方按钮查看你的机器人将提取的数据预览。", + "no_selection": "你还没有选择任何要提取的内容,选择后将在此显示数据预览。" }, "data_sections": { - "binary_received": "---------- 已接收二进制输出数据 ----------", - "serializable_received": "---------- 已接收可序列化输出数据 ----------", - "mimetype": "MIME类型:", - "image_below": "图片显示如下:", + "binary_received": "---------- 已收到二进制输出数据 ----------", + "serializable_received": "---------- 已收到可序列化输出数据 ----------", + "mimetype": "mimetype: ", + "image_below": "图片已显示如下:", "separator": "--------------------------------------------------" }, "notifications": { - "reset_success": "输出预览已成功重置" + "reset_success": "输出预览重置成功" } }, "interpretation_buttons": { "buttons": { - "preview": "获取输出数据预览", + "preview": "获取数据输出预览", "reset": "重置", "yes": "是", "no": "否" }, "messages": { - "extracting": "正在提取数据...请等待10秒到1分钟", - "restart_required": "更新录制后请重新启动解释", - "run_finished": "运行完成", + "extracting": "正在提取数据...请等待10秒至1分钟", + "restart_required": "更新录制内容后请重新开始解析", + "run_finished": "运行已完成", "run_failed": "运行启动失败" }, "modal": { - "use_previous": "您要将之前的选择用作执行此操作的条件吗?", - "previous_action": "您之前的操作是:", - "element_text": "在文本元素上 " + "use_previous": "是否将之前的选择用作本动作的条件?", + "previous_action": "上个动作:", + "element_text": "包含文本的元素 " } }, "recording_page": { "loader": { - "browser_startup": "正在启动浏览器...正在导航至{{url}}" + "browser_startup": "正在启动浏览器...跳转到{{url}}" } }, "integration_settings": { "title": "集成设置", "descriptions": { - "authenticated_as": "已认证为:{{email}}" + "authenticated_as": "当前身份:{{email}}" }, "buttons": { "submit": "提交", "remove_integration": "移除集成" }, "google": { - "title": "与Google表格集成", + "title": "集成Google表格", "descriptions": { - "sync_info": "如果启用此选项,每次机器人成功运行任务时,其捕获的数据将附加到您的Google表格中。", - "authenticated_as": "已认证为:{{email}}" + "sync_info": "启用此选项后,每次机器人成功执行任务,采集到数据都会添加到您的Google表格。", + "authenticated_as": "当前身份:{{email}}" }, "alerts": { "success": { - "title": "Google表格集成成功。", - "content": "每次此机器人创建成功运行时,其捕获的数据将附加到您的{{sheetName}} Google表格中。您可以检查数据更新", - "here": "在这里", + "title": "Google 表格集成成功。", + "content": "每当机器人运行成功,其采集数据将附加到 {{sheetName}} 的Google表格。点击", + "here": "这里", "note": "注意:", - "sync_limitation": "在与Google表格集成之前提取的数据将不会在Google表格中同步。只有集成后提取的数据才会同步。" + "sync_limitation": "在集成Google表格前采集的数据不会同步,仅集成后采集的数据会同步。" } }, "buttons": { - "authenticate": "使用Google认证", - "fetch_sheets": "获取Google电子表格", + "authenticate": "通过Google认证", + "fetch_sheets": "加载Google表格", "remove_integration": "移除集成", "submit": "提交" }, "fields": { "select_sheet": "选择Google表格", - "selected_sheet": "已选择表格:{{name}}(ID:{{id}})" + "selected_sheet": "已选择:{{name}} (ID: {{id}})" }, "errors": { - "auth_error": "使用Google认证时出错", - "fetch_error": "获取电子表格文件时出错:{{message}}", - "update_error": "更新Google表格ID时出错:{{message}}", - "remove_error": "移除Google表格集成时出错:{{message}}" + "auth_error": "Google认证错误", + "fetch_error": "加载表格文件出错: {{message}}", + "update_error": "更新Google表格ID出错: {{message}}", + "remove_error": "移除Google表格集成出错: {{message}}" }, "notifications": { "sheet_selected": "Google表格选择成功", - "integration_removed": "Google表格集成已成功移除" + "integration_removed": "Google表格集成移除成功" } }, "airtable": { - "title": "与Airtable集成", + "title": "集成Airtable", "descriptions": { - "sync_info": "如果启用此选项,每次机器人成功运行任务时,其捕获的数据将附加到您的Airtable中。", - "authenticated_as": "已成功通过 Airtable 进行身份验证。您现在可以选择要集成的底座和桌子。" + "sync_info": "启用此选项后,每当机器人成功运行,将采集到的数据写入你的Airtable Base。", + "authenticated_as": "Airtable认证成功,可选择Base和表进行集成。" }, "alerts": { "success": { - "title": "Airtable 基地成功集成", - "content": "每次此机器人成功运行时,其捕获的数据都会附加到您的 {{baseName}} 基础和 {{tableName}} 表中。您可以检查更新情况", - "here": "在这里", + "title": "Airtable Base集成成功", + "content": "每次机器人运行成功时,数据会写入 {{baseName}} Base 和 {{tableName}} 表。点击", + "here": "这里", "note": "注意:", - "sync_limitation": "只有集成后捕获的数据才会同步到Airtable。" + "sync_limitation": "仅集成后采集的数据会同步到Airtable。" } }, "buttons": { "authenticate": "连接Airtable", - "fetch_bases": "获取Airtable基础", - "fetch_tables": "获取Airtable表格", + "fetch_bases": "加载Airtable Base", + "fetch_tables": "加载Airtable表", "remove_integration": "移除集成", - "submit": "选择基础和表格" + "submit": "选择Base与表" }, "fields": { - "select_base": "选择Airtable基础", - "select_table": "选择Airtable表格", - "selected_base": "已选择基础:{{name}}", - "selected_table": "已选择表格:{{name}}" + "select_base": "选择Airtable Base", + "select_table": "选择Airtable表", + "selected_base": "已选Base:{{name}}", + "selected_table": "已选表:{{name}}" }, "errors": { - "auth_error": "使用Airtable认证时出错", - "fetch_error": "获取Airtable基础时出错:{{message}}", - "fetch_tables_error": "获取Airtable表格时出错:{{message}}", - "update_error": "更新Airtable基础时出错:{{message}}", - "remove_error": "移除Airtable集成时出错:{{message}}" + "auth_error": "Airtable认证错误", + "fetch_error": "加载Airtable Base出错: {{message}}", + "fetch_tables_error": "加载Airtable表出错: {{message}}", + "update_error": "更新Airtable Base出错: {{message}}", + "remove_error": "移除Airtable集成出错: {{message}}" }, "notifications": { - "base_selected": "Airtable基础选择成功", - "table_selected": "Airtable表格选择成功", - "integration_removed": "Airtable集成已成功移除" + "base_selected": "Airtable Base选择成功", + "table_selected": "Airtable表选择成功", + "integration_removed": "Airtable集成移除成功" } } }, "robot_duplication": { "title": "复制机器人", "descriptions": { - "purpose": "机器人复制功能用于从具有相同结构的页面提取数据。", - "example": "示例:如果您已经为{{url1}}创建了机器人,您可以复制它来抓取类似的页面(如{{url2}}),而无需从头开始训练机器人。", - "warning": "⚠️ 确保新页面与原始页面具有相同的结构。" + "purpose": "复制机器人可用于采集结构相同页面的数据。", + "example": "例:你为{{url1}}创建了机器人后,可复制到{{url2}}这类结构页面,无需重新训练。", + "warning": "⚠️ 请保证新页面结构与原页面一致。" }, "fields": { "target_url": "机器人目标URL" @@ -411,42 +423,42 @@ "cancel": "取消" }, "notifications": { - "robot_not_found": "找不到机器人详细信息。请重试。", - "url_required": "需要目标URL。", + "robot_not_found": "未找到机器人信息,请重试。", + "url_required": "请输入目标URL。", "duplicate_success": "机器人复制成功。", - "duplicate_error": "更新目标URL失败。请重试。", - "unknown_error": "更新目标URL时发生错误。" + "duplicate_error": "目标URL更新失败,请重试。", + "unknown_error": "目标URL更新时发生错误。" } }, "robot_settings": { "title": "机器人设置", "target_url": "机器人目标URL", "robot_id": "机器人ID", - "robot_limit": "机器人限制", - "created_by_user": "由用户创建", - "created_at": "机器人创建时间", + "robot_limit": "机器人上限", + "created_by_user": "创建者", + "created_at": "创建时间", "errors": { - "robot_not_found": "无法找到机器人详细信息。请重试。" + "robot_not_found": "未找到机器人信息,请重试。" } }, "robot_edit": { "title": "编辑机器人", - "change_name": "更改机器人名称", - "robot_limit": "机器人限制", + "change_name": "机器人名称", + "robot_limit": "机器人上限", "save": "保存更改", "cancel": "取消", "notifications": { "update_success": "机器人更新成功。", - "update_failed": "无法更新机器人。请重试。", + "update_failed": "机器人更新失败,请重试。", "update_error": "更新机器人时发生错误。" } }, "schedule_settings": { "title": "计划设置", - "run_every": "每次运行", + "run_every": "每隔", "start_from": "开始于", - "on_day": "在日", - "at_around": "大约在", + "on_day": "在星期", + "at_around": "大约时间", "timezone": "时区", "buttons": { "delete_schedule": "删除计划", @@ -455,9 +467,9 @@ }, "labels": { "in_between": "之间", - "run_once_every": "每次运行", - "start_from_label": "开始于", - "on_day_of_month": "月份日期", + "run_once_every": "每隔", + "start_from_label": "从以下时间开始", + "on_day_of_month": "每月第几天", "on_day": { "st": "日", "nd": "日", @@ -468,19 +480,19 @@ }, "main_page": { "notifications": { - "interpretation_success": "机器人{{name}}解释成功", - "interpretation_failed": "机器人{{name}}解释失败", + "interpretation_success": "机器人 {{name}} 解析成功", + "interpretation_failed": "机器人 {{name}} 解析失败", "run_started": "正在运行机器人:{{name}}", - "run_start_failed": "机器人运行失败:{{name}}", - "schedule_success": "机器人{{name}}调度成功", - "schedule_failed": "机器人{{name}}调度失败", - "abort_success": "成功中止机器人{{name}}的解释", - "abort_failed": "中止机器人{{name}}的解释失败", - "abort_initiated": "正在中止机器人 {{name}} 的解释" + "run_start_failed": "启动机器人失败:{{name}}", + "schedule_success": "机器人 {{name}} 计划成功", + "schedule_failed": "机器人 {{name}} 计划失败", + "abort_success": "机器人 {{name}} 解析已成功中止", + "abort_failed": "机器人 {{name}} 解析中止失败", + "abort_initiated": "正在中止机器人 {{name}} 解析" }, "menu": { "recordings": "机器人", - "runs": "运行", + "runs": "运行记录", "proxy": "代理", "apikey": "API密钥" } @@ -489,21 +501,21 @@ "attribute_modal": { "title": "选择属性", "notifications": { - "list_select_success": "列表选择成功。选择要提取的文本数据。", + "list_select_success": "列表选择成功,请选择要提取的文本数据。", "pagination_select_success": "分页元素选择成功。" } }, "attribute_options": { "anchor": { - "text": "文本: {{text}}", - "url": "URL: {{url}}" + "text": "文本:{{text}}", + "url": "URL:{{url}}" }, "image": { - "alt_text": "替代文本: {{altText}}", - "image_url": "图像URL: {{imageUrl}}" + "alt_text": "图片描述:{{altText}}", + "image_url": "图片地址:{{imageUrl}}" }, "default": { - "text": "文本: {{text}}" + "text": "文本:{{text}}" } } }, @@ -518,7 +530,7 @@ "success": "成功", "running": "运行中", "scheduled": "已计划", - "queued": "排队", + "queued": "排队中", "failed": "失败", "aborted": "已中止" }, @@ -526,9 +538,9 @@ "title": "运行设置", "labels": { "run_id": "运行ID", - "run_by_user": "由用户运行", - "run_by_schedule": "按计划ID运行", - "run_by_api": "由API运行", + "run_by_user": "用户运行", + "run_by_schedule": "按计划运行", + "run_by_api": "API运行", "run_type": "运行类型" } } @@ -541,20 +553,20 @@ "buttons": { "stop": "停止" }, - "loading": "加载数据中...", - "empty_output": "没有可用的输出数据", + "loading": "正在加载数据...", + "empty_output": "暂无输出数据", "captured_data": { - "title": "已捕获的数据", + "title": "已提取数据", "download_csv": "下载CSV", - "view_full": "查看完整数据", - "items": "项目", - "schema_title": "已捕获的文本", - "list_title": "已捕获的列表" + "view_full": "查看全部数据", + "items": "条", + "schema_title": "提取文本", + "list_title": "提取列表" }, "captured_screenshot": { - "title": "已捕获的截图", + "title": "已截取截图", "download": "下载", - "render_failed": "渲染截图失败" + "render_failed": "截图显示失败" } }, "navbar": { @@ -565,23 +577,23 @@ }, "errors": { "logout": { - "unauthorized": "您没有执行此操作的权限", - "server": "退出登录时发生服务器错误", - "network": "退出登录时发生网络错误", - "unknown": "退出登录时发生未知错误" + "unauthorized": "您未被授权执行该操作", + "server": "注销过程中服务器错误", + "network": "注销时网络错误", + "unknown": "注销时发生未知错误" } } }, "upgrade": { "button": "升级", "modal": { - "up_to_date": "🎉 您已是最新版本!", - "new_version_available": "新版本已可用:{{version}}。升级到最新版本以获取错误修复、增强和新功能!", + "up_to_date": "🎉 您已是最新版!", + "new_version_available": "新版本可用:{{version}}。升级可获得Bug修复、优化和新功能!", "view_updates": "查看所有新更新", - "view_updates_link": "此处", + "view_updates_link": "点此", "tabs": { - "manual_setup": "手动设置升级", - "docker_setup": "Docker Compose设置升级" + "manual_setup": "手动升级", + "docker_setup": "Docker Compose升级" } } }, @@ -589,7 +601,7 @@ "logout": "退出登录", "discord": "Discord", "youtube": "YouTube", - "twitter": "Twitter (X)", + "twitter": "推特(X)", "language": "语言" }, "recording": { @@ -601,6 +613,9 @@ "es": "西班牙语", "ja": "日语", "zh": "中文", - "de": "德语" + "de": "德语", + "ru": "俄语", + "fr": "法语", + "ko": "韩语" } -} \ No newline at end of file +} diff --git a/src/components/dashboard/NavBar.tsx b/src/components/dashboard/NavBar.tsx index 591b7624d..2779d75bb 100644 --- a/src/components/dashboard/NavBar.tsx +++ b/src/components/dashboard/NavBar.tsx @@ -468,6 +468,30 @@ export const NavBar: React.FC = ({ > Deutsch + { + changeLanguage("ko"); + handleMenuClose(); + }} + > + 한국어 + + { + changeLanguage("fr"); + handleMenuClose(); + }} + > + Français + + { + changeLanguage("ru"); + handleMenuClose(); + }} + > + Русский + { window.open('https://docs.maxun.dev/development/i18n', '_blank'); diff --git a/src/i18n.ts b/src/i18n.ts index c5e84364e..7bad60675 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -10,7 +10,7 @@ i18n .init({ fallbackLng: 'en', debug: import.meta.env.DEV, - supportedLngs: ['en', 'es', 'ja', 'zh','de'], + supportedLngs: ['en', 'es', 'ja', 'zh','de','fr','ru','ko'], interpolation: { escapeValue: false, // React already escapes },