diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/locales')
10 files changed, 1642 insertions, 40 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js index c78bb52..afa1ba0 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js @@ -66,6 +66,7 @@ export default { 'register.submit': 'Konto erstellen', 'register.loading': 'Konto wird erstellt …', 'register.has_account': 'Sie haben bereits ein Konto?', + 'register.legal_notice': "Mit dem Erstellen eines Kontos akzeptieren Sie die Nutzungsbedingungen dieses Hubs. Das Gesetz verpflichtet ihn, ein Protokoll Ihrer Verbindungen (IP-Adresse, Datum, Aktion) ein Jahr lang aufzubewahren, auch nach der Löschung Ihres Kontos.", 'register.login_link': 'Anmelden', 'register.recovery_title': 'Speichern Sie Ihren Wiederherstellungsschlüssel', 'register.recovery_intro': 'Dieser Schlüssel stellt Ihre Gruppenidentitäten wieder her, falls Sie jemals Ihre Passphrase vergessen. Bewahren Sie ihn in einem Passwortmanager oder an einem sicheren Ort auf.', @@ -123,6 +124,7 @@ export default { 'welcome.docs_devel': 'Entwicklerdoku', 'welcome.docs_design': 'Architektur', 'welcome.docs_protocol': 'Protokoll', + 'welcome.docs_api': 'API', 'welcome.download': 'Herunterladen (Beta)', 'welcome.legal': 'Rechtliche Hinweise', 'register.err_mismatch': 'Die Passwörter stimmen nicht überein', @@ -209,6 +211,11 @@ export default { 'group.mkdir_prompt': 'Name des neuen Ordners', 'group.mkdir_offline': 'Nicht mit dem Node verbunden.', 'group.download_offline': 'Keine Verbindung zum Node — der Download kann nicht starten. Die Verbindung wird automatisch wiederhergestellt; versuchen Sie es gleich erneut.', + 'group.link_unknown': "Dieser Link verweist auf eine Gruppe, in der Sie nicht Mitglied sind, oder die nicht mehr so heißt.", + 'group.link_path_unknown': "Unter {path} gibt es in dieser Gruppe nichts — die Datei wurde vielleicht verschoben, umbenannt oder gelöscht.", + 'link.copy': "Link kopieren", + 'link.copied': "Link kopiert", + 'link.copy_failed': "Kopieren nicht möglich — der Link lautet {url}", 'group.download_write_stalled': 'Die Datei wird nicht mehr auf die Festplatte geschrieben ({seconds} s ohne Fortschritt). Der Download wurde abgebrochen statt hängen gelassen; versuchen Sie es erneut.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -277,6 +284,7 @@ export default { 'group.upload_indexing': 'wird indiziert …', 'video.err_transport': 'Transport nicht verbunden', 'video.err_mse': 'Codec wird für das Streaming nicht unterstützt: {codec}', + 'video.err_no_mse': 'Dieser Browser kann keine Videos streamen (auf dem iPhone ist iOS 17.1 oder neuer nötig)', 'video.mode_poster': 'Poster', 'video.mode_flat': 'Flache Liste', 'video.filter_all': 'All', @@ -373,10 +381,17 @@ export default { one: '{n} Foto', other: '{n} Fotos', }, + 'photo.n_videos': { + one: "{n} Video", + other: "{n} Videos", + }, + 'photo.play_video': "Video abspielen", 'photo.back': 'Zurück', 'photo.prev': 'Vorherige (←)', 'photo.next': 'Nächste (→)', 'photo.zip_album': 'Album als ZIP herunterladen', + 'photo.slideshow': 'Diashow', + 'photo.slideshow_stop': 'Diashow beenden', 'photo.zoom_in': 'Vergrößern', 'photo.zoom_out': 'Verkleinern', 'photo.zoom_fit_title': 'An Fenster anpassen', @@ -390,6 +405,13 @@ export default { 'cast.copied': 'URL kopiert', 'cast.scanning': 'Suche nach Geräten…', 'cast.no_devices': 'Keine Geräte gefunden', + 'cast.casting_to': 'Wiedergabe auf', + 'cast.seek': 'Position im Film', + 'cast.waiting': 'Warten auf den Fernseher…', + 'cast.back30': '30 Sekunden zurück', + 'cast.fwd30': '30 Sekunden vor', + 'cast.play': 'Abspielen', + 'cast.pause': 'Pause', // Settings 'settings.title': 'Einstellungen', @@ -420,6 +442,15 @@ export default { 'settings.email_verified': 'E-Mail-Adresse erfolgreich geändert.', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'Benachrichtigungen auf diesem Telefon', + 'settings.push_off': 'Aus. Einschalten, um bei geschlossenem MeshBay über neue Nachrichten und Einladungen informiert zu werden.', + 'settings.push_pending': 'Warte auf die Antwort des Verteilers…', + 'settings.push_blocked': 'Android blockiert die Benachrichtigungen von MeshBay: Erlauben Sie sie in den Systemeinstellungen.', + 'settings.push_ready': 'An. Neue Benachrichtigungen erreichen dieses Telefon über den Verteiler, verschlüsselt, sodass er sie nicht lesen kann.', + 'settings.push_poll': 'An. Dieses Telefon sieht etwa alle fünfzehn Minuten nach neuen Benachrichtigungen. Damit sie sofort ankommen, können Sie eine UnifiedPush-Verteiler-App wie ntfy installieren (optional).', + 'settings.push_global_off': 'Solange alle Benachrichtigungen ausgeschaltet sind, wird nichts gesendet.', + 'push.channel_chat': 'Nachrichten', + 'push.channel_other': 'Einladungen und Konto', 'settings.defaults': 'Standardwerte', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -494,12 +525,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -518,12 +548,14 @@ export default { 'settings.node_key_placeholder': 'Öffentlichen Ed25519-Schlüssel des Nodes einfügen (base64)', 'settings.node_key_submit': 'Node verknüpfen', 'settings.node_key_success': 'Node erfolgreich verknüpft', + 'settings.node_key_unlink': "Trennen", + 'settings.node_key_unlink_confirm': "Den Node von Ihrem Konto trennen? Er stellt Ihre Gruppen nicht mehr bereit, bis wieder ein Node verknüpft ist.", + 'settings.node_key_unlinked': "Node getrennt", 'settings.node_key_current': 'Schlüssel des verknüpften Nodes', // Sidebar 'sidebar.create_group': 'Gruppe erstellen', 'sidebar.settings': 'Einstellungen', - 'sidebar.admin': 'Verwaltung', // User menu 'usermenu.language': 'Sprache', @@ -759,6 +791,7 @@ export default { 'transfers.eta_minutes': 'noch {n} Min.', 'transfers.eta_hours': 'noch {n} Std.', 'transfers.failed': 'Fehlgeschlagen', + 'transfers.disk_full': 'Die Festplatte des Nodes ist voll', 'group.select': 'Auswählen', 'group.select_done': 'Fertig', 'group.actions': 'Aktionen ({n})', @@ -846,6 +879,7 @@ export default { 'indexdock.next_count': "Wartend: {count}", 'indexdock.open': "Einstellungen dieser Gruppe öffnen", 'indexdock.hide': "Bis zur nächsten Indizierung ausblenden", + 'indexdock.pause': "Indexierung dieses Ordners pausieren", 'chat.load_older': '{n} ältere Nachrichten laden', 'chat.start_of_history': 'Anfang des Gesprächs', 'chat.today': 'Heute', @@ -892,7 +926,7 @@ export default { 'lazy.reload': 'Seite neu laden', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -917,6 +951,7 @@ export default { 'node.startup_mode_service': 'Als Hintergrunddienst (startet beim Booten)', 'node.startup_mode_updating': 'Modus wird gewechselt — achten Sie auf eine Administrator-Eingabeaufforderung…', 'node.startup_mode_service_unavailable_hint': 'Der Hintergrunddienst-Modus erfordert eine installierte Version. Führen Sie zum lokalen Testen "meshbay-node service install" in einer PowerShell mit Administratorrechten aus.', + 'node.startup_mode_service_store_hint': 'Der Start beim Hochfahren, bevor sich jemand anmeldet, erfordert das MeshBay-Installationsprogramm (.exe) statt der Version aus dem Microsoft Store.', 'node.not_operator': 'Ihr Node konnte nicht erreicht werden. Stellen Sie sicher, dass er läuft.', 'node.offline': 'Node ist offline', 'node.retry': 'Erneut versuchen', @@ -924,6 +959,13 @@ export default { 'node.pair_code_placeholder': 'Kopplungscode', 'node.pair_button': 'Diesen Browser koppeln', 'node.pair_success': 'Erfolgreich gekoppelt.', + 'node.pair_pending': 'Kopplungscode bereit: Er wird verwendet, wenn Sie das nächste Mal eine Gruppe dieses Nodes öffnen.', + 'node.link_other_node': "Ihr Konto ist mit dem Node eines anderen Rechners verknüpft, daher kann dieser Node Ihre Gruppen nicht bereitstellen.", + 'node.link_here': "Stattdessen diesen Node verknüpfen", + 'node.link_here_confirm': "Diesen Node mit Ihrem Konto verknüpfen? Der derzeit verknüpfte Node auf einem anderen Rechner stellt Ihre Gruppen nicht mehr bereit, bis er erneut verknüpft wird.", + 'node.link_other_account': "Dieser Node ist für {account} eingerichtet, nicht für Sie, daher kann er Ihre Gruppen nicht bereitstellen.", + 'node.link_take_over': "Diesen Node für mein Konto verwenden", + 'node.link_linking': "Verknüpfen…", 'node.reload': 'Konfiguration neu laden', 'node.reloaded': 'Konfiguration neu geladen. Verzeichnisänderungen an bestehenden Gruppen sind jetzt aktiv.', 'node.restart_needed': 'Nach dem Hinzufügen: Gruppenschlüssel initialisieren (meshbay-node gek-init --group <name>).', @@ -942,6 +984,8 @@ export default { 'node.setting_max_uploads': 'Max. gleichzeitige Uploads', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Größter einzelner Upload', + 'node.setting_connection_processes': 'CPU-Kerne für Verbindungen', + 'node.setting_unit_of': 'von {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -955,6 +999,9 @@ export default { 'node.remove_root': 'Entfernen', 'node.root_no_signing_key': 'Kein Signaturschlüssel verfügbar — koppeln Sie dieses Gerät zuerst mit dem Node', 'node.root_no_route': 'Keine Verbindung zum Node — verbinden Sie sich damit oder verwenden Sie die App auf dem Rechner, der ihn hostet', + 'node.root_pause': "Indexierung pausieren", + 'node.root_resume': "Indexierung fortsetzen", + 'node.root_paused': "Indexierung pausiert", 'node.root_remove_last': 'Eine Gruppe braucht mindestens ein Verzeichnis', 'node.root_path': 'Pfad', 'node.directory': 'Verzeichnis', @@ -1074,6 +1121,8 @@ export default { 'settings_app.chat_encrypted_always': 'Der Chat dieser Gruppe ist immer verschlüsselt. Das lässt sich nicht abschalten.', 'settings_app.chat_rotate_epoch': 'Chat-Schlüssel weiterdrehen', 'settings_app.chat_rotate_epoch_hint': 'Mitglieder lesen weiterhin den gesamten Verlauf. Wer aus der Gruppe entfernt wurde, kann nicht mehr lesen, was ab jetzt geschrieben wird. Ein Mitglied oder Gerät zu entfernen tut das bereits von selbst.', + 'settings_app.chat_purge': 'Chat leeren', + 'settings_app.chat_purge_hint': 'Löscht alle Nachrichten im Chat dieser Gruppe auf diesem Knoten, für alle Mitglieder. Anhänge bleiben in ihrem Ordner. Das lässt sich nicht rückgängig machen.', 'settings_app.tmdb_token_prompt': 'Registrieren Sie sich bei TMDB, um einen eigenen API-Schlüssel zu erzeugen.', 'settings_app.tmdb_token_link': 'Schlüssel holen', 'settings_node.roots_offline_hint': 'Nicht mit dem Node verbunden — Änderungen laufen über den lokalen Node und greifen beim nächsten Neuladen.', @@ -1228,6 +1277,7 @@ export default { 'home.accept': "Annehmen", 'home.decline': "Ablehnen", 'members.invited': "eingeladen", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Hosts", 'hosts.hint': "Ihre eigenen Nodes stellen diese Gruppe ohne Rückfrage bereit. Ein anderer Node tut es erst, wenn Sie ihn hier genehmigen; ein Node, der anfragt, steht unten.", 'hosts.none': "Kein anderer Node hat angefragt, diese Gruppe bereitzustellen.", @@ -1253,4 +1303,114 @@ export default { 'native.node_account_confirm': 'Der Node auf diesem Computer ist für {current} eingerichtet. Stattdessen für {next} einrichten? Er stellt dann die Gruppen, die er für {current} hostet, nicht mehr bereit.', 'native.browser_access_confirm': 'Die Anmeldung über einen Browser erlauben? Die Anwendung legt Ihre Identität auf jedem genutzten Node ab, so versiegelt, dass nur Ihre Passphrase zusammen mit Ihrem Hub-Konto sie öffnen kann.', 'native.declined': 'Abgebrochen — nichts wurde geändert.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Foto-Sicherung", + 'photosync.intro': "Die mit diesem Telefon aufgenommenen Fotos einmal täglich über WLAN in einen Ordner einer Ihrer Gruppen senden. Auf dem Telefon gelöschte Fotos bleiben in der Gruppe.", + 'photosync.setup': "Einrichten", + 'photosync.change': "Ändern", + 'photosync.turn_off': "Ausschalten", + 'photosync.now': "Jetzt sichern", + 'photosync.permission_needed': "MeshBay braucht Zugriff auf die Fotos dieses Telefons.", + 'photosync.permission_allow': "Zugriff erlauben", + 'photosync.permission_partial': "Der Zugriff ist auf die ausgewählten Fotos beschränkt: Neue Fotos werden erst gesichert, wenn Sie den Zugriff auf alle erlauben.", + 'photosync.group': "Gruppe", + 'photosync.choose_group': "Gruppe wählen", + 'photosync.checking_group': "Ordner der Gruppe werden gelesen…", + 'photosync.group_offline': "Gerade ist kein Node online, der diese Gruppe hostet. Versuchen Sie es erneut, sobald einer online ist.", + 'photosync.folder': "Ordner", + 'photosync.albums': "Alben auf diesem Telefon", + 'photosync.album_camera': "Kamera", + 'photosync.album_count': "{n} Fotos · {size}", + 'photosync.videos_not_included': "Videos werden nicht gesichert: „Ändern“, um sie hinzuzufügen.", + 'photosync.videos_included': "Videos werden ebenfalls gesichert.", + 'photosync.include_videos': "Auch Videos", + 'photosync.include_videos_hint': "Videos sind groß: Sie werden wie Fotos über WLAN gesendet, und die erste Sicherung kann dauern.", + 'photosync.album_count_videos': "{n} Fotos, {v} Videos · {size}", + 'photosync.confirm_videos': "{count} Fotos und Videos ({size}), davon {videos} Videos ({videoSize}), werden nach {dir} gesendet, danach einmal täglich die neuen.", + 'photosync.video_permission_needed': "MeshBay braucht auch Zugriff auf die Videos dieses Telefons.", + 'photosync.scope_existing': "Die Fotos, die schon auf diesem Telefon sind, dann neue", + 'photosync.scope_new': "Nur Fotos, die ab jetzt aufgenommen werden", + 'photosync.start': "Sicherung starten", + 'photosync.confirm': "{count} Fotos ({size}) werden nach {dir} gesendet, danach einmal täglich die neuen.", + 'photosync.confirm_new': "Neue Fotos werden einmal täglich nach {dir} gesendet.", + 'photosync.metered_confirm': "Sie sind mit mobilen Daten verbunden — {count} Fotos, {size}. Trotzdem senden?", + 'photosync.other_account': "Eingerichtet für @{account}. Melden Sie sich als @{account} an, um sie fortzusetzen, oder richten Sie sie hier neu ein.", + 'photosync.sent_total': "Gesendete Fotos: {n}", + 'photosync.last_run': "Letzte Sicherung: {when}", + 'photosync.never': "Noch nicht gesichert", + 'photosync.state_waiting_wifi': "Wartet auf WLAN", + 'photosync.state_connecting': "Verbindung zur Gruppe…", + 'photosync.state_sending': "Sende {done} / {total}", + 'photosync.state_offline': "Kein Node der Gruppe ist online; später neuer Versuch", + 'photosync.state_interrupted': "Unterbrochen — wird bei nächster Gelegenheit fortgesetzt", + 'photosync.state_up_to_date': "Aktuell", + 'photosync.notif_progress': "Fotos werden gesichert — {done} / {total}", + 'photosync.fail_disk_full': "Foto-Sicherung angehalten: Die Festplatte des Nodes ist voll.", + 'photosync.fail_read_only': "Foto-Sicherung angehalten: Der Ordner nimmt keine Uploads mehr an.", + 'photosync.fail_no_folder': "Foto-Sicherung angehalten: Der Ordner existiert in der Gruppe nicht mehr.", + 'photosync.fail_unavailable': "Foto-Sicherung angehalten: Das Laufwerk des Ordners ist nicht mit dem Node verbunden.", + 'photosync.fail_not_member': "Foto-Sicherung angehalten: Sie sind kein Mitglied dieser Gruppe mehr.", + 'photosync.fail_permission': "Foto-Sicherung angehalten: MeshBay hat keinen Zugriff mehr auf die Fotos.", + 'photosync.fail_other': "Foto-Sicherung angehalten.", + 'contactsync.heading': "Kontakte-Sicherung", + 'contactsync.intro': "Einmal täglich, wenn sie sich geändert haben, eine Kopie der Kontakte dieses Telefons senden. Jede Kopie ist eine .vcf-Datei, die jedes Telefon importieren kann.", + 'contactsync.permission_needed': "MeshBay braucht Zugriff auf die Kontakte dieses Telefons.", + 'calendarsync.heading': "Kalender-Sicherung", + 'calendarsync.intro': "Einmal täglich, wenn sie sich geändert haben, eine Kopie der Kalender dieses Telefons senden: die, die du bearbeiten kannst, nicht die nur abonnierten. Jede Kopie ist eine .ics-Datei, die jeder Kalender importieren kann.", + 'calendarsync.permission_needed': "MeshBay braucht Zugriff auf die Kalender dieses Telefons.", + 'messagesync.heading': "SMS-Sicherung", + 'messagesync.intro': "Die SMS dieses Telefons einmal täglich senden: Die erste Kopie enthält alle, jede weitere nur die neuen. Die Dateien sind im XML-Format, das SMS-Sicherungs-Apps wiederherstellen können. MMS sind nicht enthalten.", + 'messagesync.permission_needed': "MeshBay braucht Zugriff auf die SMS dieses Telefons.", + 'messagesync.restricted_hint': "Wenn Android von einer eingeschränkten Einstellung spricht: Öffne die App-Einstellungen, tippe oben auf ⋮, „Eingeschränkte Einstellungen zulassen“, und schalte es dann hier wieder ein. Android verlangt das von Apps, die nicht aus einem Store installiert wurden.", + 'phonesync.state_sending': "Wird gesendet…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Gesendete Kopien: {n}", + 'phonesync.last_file': "Letzte Kopie: {name}", + 'phonesync.checking_groups': "Suche nach Gruppen, die dir gehören und deren einziges Mitglied du bist…", + 'phonesync.no_private_group': "Du hast keine Gruppe, die dir gehört und deren einziges Mitglied du bist. Erstelle eine nur für dich und komm dann hierher zurück.", + 'phonesync.no_folder': "Diese Gruppe hat keinen Ordner, in den du hochladen kannst.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Gestoppt: Der Datenträger des Nodes ist voll.", + 'phonesync.fail_read_only': "Gestoppt: Der Ordner nimmt keine Uploads mehr an.", + 'phonesync.fail_no_folder': "Gestoppt: Der Ordner existiert in der Gruppe nicht mehr.", + 'phonesync.fail_unavailable': "Gestoppt: Das Laufwerk des Ordners ist nicht mit dem Node verbunden.", + 'phonesync.fail_not_member': "Gestoppt: Du bist kein Mitglied dieser Gruppe mehr.", + 'phonesync.fail_not_private': "Gestoppt: Jemand anderes ist der Gruppe beigetreten.", + 'phonesync.fail_permission': "Gestoppt: MeshBay hat keinen Zugriff mehr.", + 'phonesync.fail_other': "Gestoppt.", + 'phonesync.open_settings': "App-Einstellungen öffnen", + 'drivesync.heading': "Datei-Sicherung", + 'drivesync.intro': "Die Dateien der Ordner, die du auf diesem Telefon auswählst, einmal täglich über WLAN senden. Eine auf dem Telefon geänderte Datei wird neben der früheren Kopie erneut gesendet; nichts wird je ersetzt.", + 'drivesync.folders': "Gesicherte Ordner", + 'drivesync.no_folders': "Noch kein Ordner ausgewählt.", + 'drivesync.folders_hint': "Fotos und Videos übernimmt die Foto-Sicherung: DCIM, Pictures und Movies können nicht gewählt werden. Android lässt eine App nicht den ganzen Download-Ordner nehmen, nur Ordner darin.", + 'drivesync.add_folder': "Ordner hinzufügen", + 'drivesync.remove': "Entfernen", + 'drivesync.refused_media': "Dieser Ordner enthält Fotos und Videos, die die Foto-Sicherung sendet: Wähle einen anderen.", + 'drivesync.refused_root': "Android erlaubt nicht, einen ganzen Speicher zu wählen: Wähle einen Ordner darin.", + 'drivesync.notif_progress': "Dateien werden gesichert: {done} / {total}", + 'drivesync.metered_confirm': "Du bist im Mobilfunknetz. Die Dateien trotzdem senden?", + 'drivesync.sent_total': "Gesendete Dateien: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Die Chat-Sicherungen von WhatsApp einmal täglich über WLAN kopieren, damit sie auf einem neuen Telefon wiederhergestellt werden können. Sie bleiben von WhatsApp verschlüsselt: Hier lassen sie sich nicht lesen, nur wiederherstellen.", + 'whatsappsync.folder_needed': "Der WhatsApp-Ordner ist noch nicht ausgewählt.", + 'whatsappsync.folder_chosen': "Der WhatsApp-Ordner ist ausgewählt.", + 'whatsappsync.folder_choose': "WhatsApp-Ordner wählen", + 'whatsappsync.folder_hint': "Die Auswahl öffnet sich darauf: Android/media/com.whatsapp/WhatsApp. Tippe auf „Diesen Ordner verwenden“.", + 'whatsappsync.media': "Auch Medien", + 'whatsappsync.media_hint': "Empfangene und gesendete Fotos, Videos, Sprachnachrichten und Dokumente: oft mehrere Gigabyte. Was die Foto-Sicherung schon sendet, wird nicht doppelt gesendet.", + 'whatsappsync.refused': "Das ist nicht der WhatsApp-Ordner: Wähle Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Wiederherstellen auf einem neuen Telefon: Kopiere die Ordner Databases und Backups der letzten Kopie nach Android/media/com.whatsapp/WhatsApp, bevor du WhatsApp installierst, und stelle dann mit derselben Telefonnummer wieder her (und dem Passwort oder 64-stelligen Schlüssel, wenn die Ende-zu-Ende-Sicherung aktiv ist).", + 'whatsappsync.notif_progress': "WhatsApp wird gesichert: {done} / {total}", + 'androidsync.dest_heading': "Ziel der Sicherungen", + 'androidsync.dest_intro': "Sicherungen landen in einem Ordner einer Gruppe, die dir gehört und deren einziges Mitglied du bist. Jede Art von Sicherung bekommt dort einen eigenen Ordner.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Verwendete Ordner: {dirs}", + 'androidsync.dest_change_confirm': "Alle Sicherungen beginnen neu in {folder} von {group}. Bereits Gesendetes bleibt, wo es ist.", + 'androidsync.dest_not_in_photos': "Der Fotos-Tab der Gruppe zeigt {dir} nicht: Fotos werden gesichert, aber dort erst angezeigt, wenn der Ordner zu den Ordnern des Tabs gehört (Gruppeneinstellungen).", + 'androidsync.dest_needed': "Wähle zuerst oben auf dieser Seite das Ziel der Sicherungen.", + 'androidsync.dest_save': "Speichern", + 'phonesync.turn_on': "Einschalten", + 'photosync.fail_not_private': "Foto-Sicherung angehalten: Jemand anderes ist der Gruppe beigetreten.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js index f5879b3..b4346b9 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js @@ -69,6 +69,7 @@ export default { 'register.submit': 'Register', 'register.loading': 'Creating account...', 'register.has_account': 'Already have an account?', + 'register.legal_notice': "By creating an account, you accept this hub's terms of use. The law requires it to keep a log of your connections (IP address, date, action) for one year, even after your account is deleted.", 'register.login_link': 'Login', 'register.recovery_title': 'Save your recovery key', 'register.recovery_intro': 'This key restores your group identities if you ever forget your passphrase. Store it in a password manager or somewhere safe.', @@ -126,6 +127,7 @@ export default { 'welcome.docs_devel': 'Developer docs', 'welcome.docs_design': 'Design', 'welcome.docs_protocol': 'Protocol', + 'welcome.docs_api': 'API', 'welcome.download': 'Download (beta)', 'welcome.legal': 'Legal information', 'register.err_mismatch': 'Passwords do not match', @@ -209,6 +211,11 @@ export default { 'group.mkdir_prompt': 'New folder name', 'group.mkdir_offline': 'Not connected to the node.', 'group.download_offline': 'Not connected to the node — the download cannot start. It reconnects on its own; try again in a moment.', + 'group.link_unknown': "This link names a group you are not a member of, or one that no longer goes by that name.", + 'group.link_path_unknown': "Nothing at {path} in this group — the file may have been moved, renamed or deleted.", + 'link.copy': "Copy link", + 'link.copied': "Link copied", + 'link.copy_failed': "Could not copy — the link is {url}", 'group.download_write_stalled': 'The file stopped being written to disk ({seconds}s with no progress). The download was stopped rather than left hanging; try it again.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -275,6 +282,7 @@ export default { 'group.upload_indexing': 'indexing…', 'video.err_transport': 'Transport not connected', 'video.err_mse': 'Codec not supported for streaming: {codec}', + 'video.err_no_mse': 'This browser cannot stream video (an iPhone needs iOS 17.1 or later)', 'video.mode_poster': 'Posters', 'video.mode_flat': 'Flat list', 'video.filter_all': 'All', @@ -371,10 +379,17 @@ export default { one: '{n} photo', other: '{n} photos', }, + 'photo.n_videos': { + one: "{n} video", + other: "{n} videos", + }, + 'photo.play_video': "Play the video", 'photo.back': 'Back', 'photo.prev': 'Previous (←)', 'photo.next': 'Next (→)', 'photo.zip_album': 'Download album as zip', + 'photo.slideshow': 'Slideshow', + 'photo.slideshow_stop': 'Stop slideshow', 'photo.zoom_in': 'Zoom in', 'photo.zoom_out': 'Zoom out', 'photo.zoom_fit_title': 'Fit to window', @@ -388,6 +403,13 @@ export default { 'cast.copied': 'URL copied', 'cast.scanning': 'Scanning for devices…', 'cast.no_devices': 'No devices found', + 'cast.casting_to': 'Casting to', + 'cast.seek': 'Position in the film', + 'cast.waiting': 'Waiting for the television…', + 'cast.back30': 'Back 30 seconds', + 'cast.fwd30': 'Forward 30 seconds', + 'cast.play': 'Play', + 'cast.pause': 'Pause', // Settings 'settings.title': 'Settings', @@ -417,6 +439,15 @@ export default { 'settings.email_verified': 'Email address changed successfully.', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'Notifications on this phone', + 'settings.push_off': 'Off. Turn on to be told about new messages and invitations while MeshBay is closed.', + 'settings.push_pending': 'Waiting for the distributor’s answer…', + 'settings.push_blocked': 'Android is blocking MeshBay’s notifications: allow them in the system settings.', + 'settings.push_ready': 'On. New notifications reach this phone through the distributor, encrypted so it cannot read them.', + 'settings.push_poll': 'On. This phone checks for new notifications about every fifteen minutes. For them to arrive at once, you can install a UnifiedPush distributor app such as ntfy (optional).', + 'settings.push_global_off': 'Nothing is sent while every notification is turned off.', + 'push.channel_chat': 'Messages', + 'push.channel_other': 'Invitations and account', 'settings.defaults': 'Defaults', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -486,12 +517,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -506,12 +536,14 @@ export default { 'settings.node_key_placeholder': 'Paste node Ed25519 public key (base64)', 'settings.node_key_submit': 'Link Node', 'settings.node_key_success': 'Node linked successfully', + 'settings.node_key_unlink': "Unlink", + 'settings.node_key_unlink_confirm': "Unlink the node from your account? It stops serving your groups until a node is linked again.", + 'settings.node_key_unlinked': "Node unlinked", 'settings.node_key_current': 'Linked node key', // Sidebar 'sidebar.create_group': 'Create group', 'sidebar.settings': 'Settings', - 'sidebar.admin': 'Admin', // User menu 'usermenu.language': 'Language', @@ -775,6 +807,8 @@ export default { 'settings_app.chat_encrypted_always': 'Chat in this group is always encrypted. It cannot be turned off.', 'settings_app.chat_rotate_epoch': 'Move the chat key on', 'settings_app.chat_rotate_epoch_hint': 'Members keep reading the whole history. Anyone removed from the group cannot read what is written from now on. Removing a member or a device already does this by itself.', + 'settings_app.chat_purge': 'Purge the chat', + 'settings_app.chat_purge_hint': 'Deletes every message in this group\'s chat on this node, for every member. Attachments stay in their folder. This cannot be undone.', 'settings_app.tmdb_token_prompt': 'Sign up on TMDB to generate your own API key.', 'settings_app.tmdb_token_link': 'Get a key', 'settings_node.roots_offline_hint': 'Not connected to the node — changes go through the local node instead, and take effect on its next reload.', @@ -876,6 +910,7 @@ export default { 'transfers.eta_minutes': '{n} min left', 'transfers.eta_hours': '{n} h left', 'transfers.failed': 'Failed', + 'transfers.disk_full': "The node's disk is full", 'group.select': 'Select', 'group.select_done': 'Done', 'group.actions': 'Actions ({n})', @@ -957,6 +992,7 @@ export default { 'indexdock.next_count': "{count} more waiting", 'indexdock.open': "Open this group's settings", 'indexdock.hide': "Hide until the next indexing", + 'indexdock.pause': "Pause indexing this folder", 'chat.load_older': 'Load {n} older messages', 'chat.start_of_history': 'Beginning of the conversation', 'chat.today': 'Today', @@ -991,7 +1027,7 @@ export default { 'usermenu.profile': 'Profile', // Node management (D5) - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', 'node.title': 'Node', 'node.service_checking': 'Checking node service…', 'node.service_not_installed': 'Not installed as a service', @@ -1014,6 +1050,7 @@ export default { 'node.startup_mode_service': 'As a background service (starts at boot)', 'node.startup_mode_updating': 'Switching mode — check for an administrator prompt…', 'node.startup_mode_service_unavailable_hint': 'Background service mode needs an installed build. For local testing, run "meshbay-node service install" from an elevated PowerShell.', + 'node.startup_mode_service_store_hint': 'Starting at boot, before anyone signs in, needs the MeshBay installer (.exe) rather than the Microsoft Store version.', 'node.offline': 'Node is offline', 'node.no_groups': 'No groups configured on this node.', 'node.retry': 'Retry', @@ -1030,6 +1067,9 @@ export default { 'node.remove_root': 'Remove', 'node.root_no_signing_key': 'No signing key available — pair this device with the node first', 'node.root_no_route': 'No route to the node — connect to it, or use the app on the machine hosting it', + 'node.root_pause': "Pause indexing", + 'node.root_resume': "Resume indexing", + 'node.root_paused': "indexing paused", 'node.root_remove_last': 'A group needs at least one directory', 'node.root_path': 'Path', 'node.root_added': 'Directory added.', @@ -1064,6 +1104,13 @@ export default { 'node.pair_code_placeholder': 'Pairing code', 'node.pair_button': 'Pair this browser', 'node.pair_success': 'Paired successfully.', + 'node.pair_pending': "Pairing code ready: it is used the next time you open one of this node's groups.", + 'node.link_other_node': "Your account is linked to the node of another machine, so this node cannot serve your groups.", + 'node.link_here': "Link this node instead", + 'node.link_here_confirm': "Link this node to your account? The node linked now, on another machine, stops serving your groups until it is linked again.", + 'node.link_other_account': "This node is set up for {account}, not for you, so it cannot serve your groups.", + 'node.link_take_over': "Use this node for my account", + 'node.link_linking': "Linking…", 'node.reload': 'Reload config', 'node.reloaded': 'Config reloaded. Root changes on existing groups are now active.', 'node.attach_group': 'Add group', @@ -1090,6 +1137,8 @@ export default { 'node.setting_max_uploads': 'Max concurrent uploads', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Largest single upload', + 'node.setting_connection_processes': 'CPU cores for connections', + 'node.setting_unit_of': 'of {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -1209,6 +1258,7 @@ export default { 'home.accept': "Accept", 'home.decline': "Decline", 'members.invited': "invited", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Hosts", 'hosts.hint': "Your own nodes serve this group without asking. Another node serves it only once you approve it here; a node that asks is listed below.", 'hosts.none': "No other node has asked to host this group.", @@ -1234,4 +1284,114 @@ export default { 'native.node_account_confirm': 'The node on this computer is set up for {current}. Set it up for {next} instead? It will stop serving the groups it hosts for {current}.', 'native.browser_access_confirm': 'Allow signing in from a browser? The application will leave your identity on every node you use, sealed so that only your passphrase together with your hub account can open it.', 'native.declined': 'Cancelled — nothing was changed.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Photo backup", + 'photosync.intro': "Send the photos taken on this phone to a folder of one of your groups, once a day, on Wi-Fi. Photos deleted from the phone stay in the group.", + 'photosync.setup': "Set up", + 'photosync.change': "Change", + 'photosync.turn_off': "Turn off", + 'photosync.now': "Back up now", + 'photosync.permission_needed': "MeshBay needs access to this phone's photos.", + 'photosync.permission_allow': "Allow access", + 'photosync.permission_partial': "Access is limited to the photos you selected: new photos will not be backed up until you allow access to all of them.", + 'photosync.group': "Group", + 'photosync.choose_group': "Choose a group", + 'photosync.checking_group': "Looking at the group's folders…", + 'photosync.group_offline': "No node hosting this group is online right now. Try again when it is.", + 'photosync.folder': "Folder", + 'photosync.albums': "Albums on this phone", + 'photosync.album_camera': "Camera", + 'photosync.album_count': "{n} photos · {size}", + 'photosync.videos_not_included': "Videos are not backed up: “Change” to add them.", + 'photosync.videos_included': "Videos are backed up too.", + 'photosync.include_videos': "Videos too", + 'photosync.include_videos_hint': "Videos are large: they go on Wi-Fi like photos, and the first backup can take a while.", + 'photosync.album_count_videos': "{n} photos, {v} videos · {size}", + 'photosync.confirm_videos': "{count} photos and videos ({size}), including {videos} videos ({videoSize}), will be sent to {dir}, then new ones once a day.", + 'photosync.video_permission_needed': "MeshBay needs access to this phone's videos too.", + 'photosync.scope_existing': "The photos already on this phone, then new ones", + 'photosync.scope_new': "Only photos taken from now on", + 'photosync.start': "Start backup", + 'photosync.confirm': "{count} photos ({size}) will be sent to {dir}, then new ones once a day.", + 'photosync.confirm_new': "New photos will be sent to {dir} once a day.", + 'photosync.metered_confirm': "You are on mobile data — {count} photos, {size}. Send them anyway?", + 'photosync.other_account': "Set up for @{account}. Sign in as @{account} to continue it, or set it up again here.", + 'photosync.sent_total': "Photos sent: {n}", + 'photosync.last_run': "Last backup: {when}", + 'photosync.never': "Not backed up yet", + 'photosync.state_waiting_wifi': "Waiting for Wi-Fi", + 'photosync.state_connecting': "Connecting to the group…", + 'photosync.state_sending': "Sending {done} / {total}", + 'photosync.state_offline': "No node hosting the group is online; it will try again later", + 'photosync.state_interrupted': "Interrupted — it will carry on at the next chance", + 'photosync.state_up_to_date': "Up to date", + 'photosync.notif_progress': "Backing up photos — {done} / {total}", + 'photosync.fail_disk_full': "Photo backup stopped: the node's disk is full.", + 'photosync.fail_read_only': "Photo backup stopped: the folder no longer accepts uploads.", + 'photosync.fail_no_folder': "Photo backup stopped: the folder no longer exists in the group.", + 'photosync.fail_unavailable': "Photo backup stopped: the folder's drive is not connected to the node.", + 'photosync.fail_not_member': "Photo backup stopped: you are no longer a member of this group.", + 'photosync.fail_permission': "Photo backup stopped: MeshBay no longer has access to the photos.", + 'photosync.fail_other': "Photo backup stopped.", + 'contactsync.heading': "Contacts backup", + 'contactsync.intro': "Send a copy of this phone's contacts once a day when they have changed. Each copy is a .vcf file any phone can import.", + 'contactsync.permission_needed': "MeshBay needs access to this phone's contacts.", + 'calendarsync.heading': "Calendar backup", + 'calendarsync.intro': "Send a copy of this phone's calendars once a day when they have changed: the ones you can edit, not those you only subscribe to. Each copy is an .ics file any calendar can import.", + 'calendarsync.permission_needed': "MeshBay needs access to this phone's calendars.", + 'messagesync.heading': "Messages backup", + 'messagesync.intro': "Send the text messages on this phone once a day: the first copy holds them all, each next one only the new ones. The files are in the XML format SMS backup applications restore. Multimedia messages are not included.", + 'messagesync.permission_needed': "MeshBay needs access to this phone's text messages.", + 'messagesync.restricted_hint': "If Android says this is a restricted setting: open the application's settings, tap ⋮ at the top, “Allow restricted settings”, then come back and turn this on again. Android asks this of applications installed outside a store.", + 'phonesync.state_sending': "Sending…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Copies sent: {n}", + 'phonesync.last_file': "Last copy: {name}", + 'phonesync.checking_groups': "Looking for groups you own and are the only member of…", + 'phonesync.no_private_group': "You have no group that you own and are the only member of. Create one just for yourself, then come back here.", + 'phonesync.no_folder': "This group has no folder you can add to.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Stopped: the node's disk is full.", + 'phonesync.fail_read_only': "Stopped: the folder no longer accepts uploads.", + 'phonesync.fail_no_folder': "Stopped: the folder no longer exists in the group.", + 'phonesync.fail_unavailable': "Stopped: the folder's drive is not connected to the node.", + 'phonesync.fail_not_member': "Stopped: you are no longer a member of this group.", + 'phonesync.fail_not_private': "Stopped: somebody else has joined the group.", + 'phonesync.fail_permission': "Stopped: MeshBay no longer has access.", + 'phonesync.fail_other': "Stopped.", + 'phonesync.open_settings': "Open the application's settings", + 'drivesync.heading': "Files backup", + 'drivesync.intro': "Send the files of folders you choose on this phone, once a day, on Wi-Fi. A file changed on the phone is sent again beside the earlier copy; nothing is ever replaced.", + 'drivesync.folders': "Folders backed up", + 'drivesync.no_folders': "No folder chosen yet.", + 'drivesync.folders_hint': "Photos and videos are left to the photo backup: DCIM, Pictures and Movies cannot be chosen. Android does not let an application take the whole of Download, only folders inside it.", + 'drivesync.add_folder': "Add a folder", + 'drivesync.remove': "Remove", + 'drivesync.refused_media': "This folder holds photos and videos, which the photo backup sends: choose another one.", + 'drivesync.refused_root': "Android does not let a whole storage be chosen: choose a folder inside it.", + 'drivesync.notif_progress': "Backing up files: {done} / {total}", + 'drivesync.metered_confirm': "You are on mobile data. Send the files anyway?", + 'drivesync.sent_total': "Files sent: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Copy WhatsApp's own chat backups, once a day on Wi-Fi, so they can be restored onto a new phone. They stay encrypted by WhatsApp: they cannot be read here, only restored.", + 'whatsappsync.folder_needed': "WhatsApp's folder is not chosen yet.", + 'whatsappsync.folder_chosen': "WhatsApp's folder is chosen.", + 'whatsappsync.folder_choose': "Choose WhatsApp's folder", + 'whatsappsync.folder_hint': "The picker opens on it: Android/media/com.whatsapp/WhatsApp. Press “Use this folder”.", + 'whatsappsync.media': "Media too", + 'whatsappsync.media_hint': "Photos, videos, voice notes and documents received and sent: often several gigabytes. Those the photo backup already sends are not sent twice.", + 'whatsappsync.refused': "This is not WhatsApp's folder: choose Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "To restore on a new phone: copy the Databases and Backups folders of the latest copy into Android/media/com.whatsapp/WhatsApp before installing WhatsApp, then restore with the same phone number (and the password or 64-digit key if end-to-end backup is on).", + 'whatsappsync.notif_progress': "Backing up WhatsApp: {done} / {total}", + 'androidsync.dest_heading': "Where backups go", + 'androidsync.dest_intro': "Backups go into a folder of a group you own and are the only member of. Each kind of backup gets its own folder there.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Folders used: {dirs}", + 'androidsync.dest_change_confirm': "Every backup will start again in {folder} of {group}. What was already sent stays where it is.", + 'androidsync.dest_not_in_photos': "The group's Photos tab does not show {dir}: photos will be backed up but not shown there until it is one of the tab's folders (group settings).", + 'androidsync.dest_needed': "Choose where backups go first, at the top of this page.", + 'androidsync.dest_save': "Save", + 'phonesync.turn_on': "Turn on", + 'photosync.fail_not_private': "Photo backup stopped: somebody else has joined the group.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js index a35aa96..9bb26e1 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js @@ -65,6 +65,7 @@ export default { 'register.submit': 'Crear la cuenta', 'register.loading': 'Creando la cuenta...', 'register.has_account': '¿Ya tiene una cuenta?', + 'register.legal_notice': "Al crear una cuenta, acepta las condiciones de uso de este hub. La ley le obliga a conservar durante un año el registro de sus conexiones (dirección IP, fecha, acción), incluso después de eliminar su cuenta.", 'register.login_link': 'Iniciar sesión', 'register.recovery_title': 'Guarde su clave de recuperación', 'register.recovery_intro': 'Esta clave restaura sus identidades de grupo si alguna vez olvida su frase de contraseña. Guárdela en un gestor de contraseñas o en un lugar seguro.', @@ -122,6 +123,7 @@ export default { 'welcome.docs_devel': 'Docs de desarrollo', 'welcome.docs_design': 'Diseño', 'welcome.docs_protocol': 'Protocolo', + 'welcome.docs_api': 'API', 'welcome.download': 'Descargar (beta)', 'welcome.legal': 'Información legal', 'register.err_mismatch': 'Las contraseñas no coinciden', @@ -207,6 +209,11 @@ export default { 'group.mkdir_prompt': 'Nombre de la nueva carpeta', 'group.mkdir_offline': 'Sin conexión con el nodo.', 'group.download_offline': 'Sin conexión con el nodo — la descarga no puede empezar. Se reconecta sola; inténtelo de nuevo en un momento.', + 'group.link_unknown': "Este enlace nombra un grupo del que no eres miembro, o que ya no se llama así.", + 'group.link_path_unknown': "No hay nada en {path} en este grupo: puede que el archivo se haya movido, renombrado o eliminado.", + 'link.copy': "Copiar enlace", + 'link.copied': "Enlace copiado", + 'link.copy_failed': "No se pudo copiar: el enlace es {url}", 'group.download_write_stalled': 'El archivo dejó de escribirse en el disco ({seconds} s sin avance). La descarga se detuvo en lugar de quedarse colgada; inténtelo de nuevo.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -275,6 +282,7 @@ export default { 'group.upload_indexing': 'indexando…', 'video.err_transport': 'Transporte no conectado', 'video.err_mse': 'Códec no compatible con la reproducción en continuo: {codec}', + 'video.err_no_mse': 'Este navegador no puede reproducir vídeo en continuo (un iPhone necesita iOS 17.1 o posterior)', 'video.mode_poster': 'Pósteres', 'video.mode_flat': 'Lista plana', 'video.filter_all': 'All', @@ -371,10 +379,17 @@ export default { one: '{n} foto', other: '{n} fotos', }, + 'photo.n_videos': { + one: "{n} vídeo", + other: "{n} vídeos", + }, + 'photo.play_video': "Reproducir el vídeo", 'photo.back': 'Atrás', 'photo.prev': 'Anterior (←)', 'photo.next': 'Siguiente (→)', 'photo.zip_album': 'Descargar álbum como zip', + 'photo.slideshow': 'Presentación', + 'photo.slideshow_stop': 'Detener la presentación', 'photo.zoom_in': 'Acercar', 'photo.zoom_out': 'Alejar', 'photo.zoom_fit_title': 'Ajustar a la ventana', @@ -388,6 +403,13 @@ export default { 'cast.copied': 'URL copiada', 'cast.scanning': 'Buscando dispositivos…', 'cast.no_devices': 'No se encontraron dispositivos', + 'cast.casting_to': 'Transmitiendo a', + 'cast.seek': 'Posición en la película', + 'cast.waiting': 'Esperando al televisor…', + 'cast.back30': 'Retroceder 30 segundos', + 'cast.fwd30': 'Avanzar 30 segundos', + 'cast.play': 'Reproducir', + 'cast.pause': 'Pausa', // Settings 'settings.title': 'Ajustes', @@ -418,6 +440,15 @@ export default { 'settings.email_verified': 'Dirección de correo cambiada con éxito.', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'Notificaciones en este teléfono', + 'settings.push_off': 'Desactivadas. Actívalas para enterarte de nuevos mensajes e invitaciones con MeshBay cerrado.', + 'settings.push_pending': 'Esperando la respuesta del distribuidor…', + 'settings.push_blocked': 'Android bloquea las notificaciones de MeshBay: permítelas en los ajustes del sistema.', + 'settings.push_ready': 'Activadas. Las nuevas notificaciones llegan a este teléfono a través del distribuidor, cifradas para que no pueda leerlas.', + 'settings.push_poll': 'Activadas. Este teléfono busca notificaciones nuevas cada quince minutos aproximadamente. Para recibirlas al instante, puedes instalar una app distribuidora de UnifiedPush como ntfy (opcional).', + 'settings.push_global_off': 'No se envía nada mientras todas las notificaciones estén desactivadas.', + 'push.channel_chat': 'Mensajes', + 'push.channel_other': 'Invitaciones y cuenta', 'settings.defaults': 'Valores predeterminados', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -490,12 +521,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -513,12 +543,14 @@ export default { 'settings.node_key_placeholder': 'Pegue la clave pública Ed25519 del node (base64)', 'settings.node_key_submit': 'Vincular el node', 'settings.node_key_success': 'Node vinculado correctamente', + 'settings.node_key_unlink': "Desvincular", + 'settings.node_key_unlink_confirm': "¿Desvincular el nodo de tu cuenta? Dejará de servir tus grupos hasta que se vuelva a vincular un nodo.", + 'settings.node_key_unlinked': "Nodo desvinculado", 'settings.node_key_current': 'Clave del node vinculado', // Sidebar 'sidebar.create_group': 'Crear un grupo', 'sidebar.settings': 'Ajustes', - 'sidebar.admin': 'Administración', // User menu 'usermenu.language': 'Idioma', @@ -754,6 +786,7 @@ export default { 'transfers.eta_minutes': 'quedan {n} min', 'transfers.eta_hours': 'quedan {n} h', 'transfers.failed': 'Fallida', + 'transfers.disk_full': 'El disco del node está lleno', 'group.select': 'Seleccionar', 'group.select_done': 'Listo', 'group.actions': 'Acciones ({n})', @@ -840,6 +873,7 @@ export default { 'indexdock.next_count': "En espera: {count}", 'indexdock.open': "Abrir los ajustes de este grupo", 'indexdock.hide': "Ocultar hasta la próxima indexación", + 'indexdock.pause': "Pausar la indexación de esta carpeta", 'chat.load_older': 'Cargar {n} mensajes anteriores', 'chat.start_of_history': 'Inicio de la conversación', 'chat.today': 'Hoy', @@ -886,7 +920,7 @@ export default { 'lazy.reload': 'Recargar la página', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -911,6 +945,7 @@ export default { 'node.startup_mode_service': 'Como servicio en segundo plano (se inicia al arrancar)', 'node.startup_mode_updating': 'Cambiando de modo — compruebe si aparece un aviso de administrador…', 'node.startup_mode_service_unavailable_hint': 'El modo de servicio en segundo plano requiere una versión instalada. Para pruebas locales, ejecute "meshbay-node service install" desde una PowerShell con privilegios de administrador.', + 'node.startup_mode_service_store_hint': 'Iniciar al arrancar, antes de que nadie inicie sesión, requiere el instalador de MeshBay (.exe) en lugar de la versión de Microsoft Store.', 'node.not_operator': 'No se pudo contactar con su node. Asegúrese de que esté en ejecución.', 'node.offline': 'Node sin conexión', 'node.retry': 'Reintentar', @@ -918,6 +953,13 @@ export default { 'node.pair_code_placeholder': 'Código de emparejamiento', 'node.pair_button': 'Emparejar este navegador', 'node.pair_success': 'Emparejamiento exitoso.', + 'node.pair_pending': 'Código de emparejamiento listo: se usará la próxima vez que abra uno de los grupos de este Node.', + 'node.link_other_node': "Tu cuenta está vinculada al nodo de otra máquina, así que este nodo no puede servir tus grupos.", + 'node.link_here': "Vincular este nodo en su lugar", + 'node.link_here_confirm': "¿Vincular este nodo a tu cuenta? El nodo vinculado ahora, en otra máquina, dejará de servir tus grupos hasta que se vuelva a vincular.", + 'node.link_other_account': "Este nodo está configurado para {account}, no para ti, así que no puede servir tus grupos.", + 'node.link_take_over': "Usar este nodo para mi cuenta", + 'node.link_linking': "Vinculando…", 'node.reload': 'Recargar configuración', 'node.reloaded': 'Configuración recargada. Los cambios de directorios en los grupos existentes ya están activos.', 'node.restart_needed': 'Después de añadir: inicialice la clave de grupo (meshbay-node gek-init --group <nombre>).', @@ -936,6 +978,8 @@ export default { 'node.setting_max_uploads': 'Subidas simultáneas máximas', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Subida individual máxima', + 'node.setting_connection_processes': 'Núcleos de CPU para las conexiones', + 'node.setting_unit_of': 'de {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -949,6 +993,9 @@ export default { 'node.remove_root': 'Eliminar', 'node.root_no_signing_key': 'No hay clave de firma disponible: empareja primero este dispositivo con el nodo', 'node.root_no_route': 'No hay ruta al nodo: conéctate a él o usa la aplicación en la máquina que lo aloja', + 'node.root_pause': "Pausar la indexación", + 'node.root_resume': "Reanudar la indexación", + 'node.root_paused': "indexación en pausa", 'node.root_remove_last': 'Un grupo necesita al menos un directorio', 'node.root_path': 'Ruta', 'node.directory': 'Directorio', @@ -1068,6 +1115,8 @@ export default { 'settings_app.chat_encrypted_always': 'El chat de este grupo siempre está cifrado. No se puede desactivar.', 'settings_app.chat_rotate_epoch': 'Renovar la clave del chat', 'settings_app.chat_rotate_epoch_hint': 'Los miembros siguen leyendo todo el historial. Quien haya sido expulsado del grupo no podrá leer lo que se escriba a partir de ahora. Quitar a un miembro o un dispositivo ya lo hace por sí solo.', + 'settings_app.chat_purge': 'Vaciar el chat', + 'settings_app.chat_purge_hint': 'Borra todos los mensajes del chat de este grupo en este nodo, para todos los miembros. Los adjuntos se quedan en su carpeta. No se puede deshacer.', 'settings_app.tmdb_token_prompt': 'Regístrate en TMDB para generar tu propia clave de API.', 'settings_app.tmdb_token_link': 'Obtener una clave', 'settings_node.roots_offline_hint': 'Sin conexión con el nodo: los cambios pasan por el nodo local y se aplican en su próxima recarga.', @@ -1222,6 +1271,7 @@ export default { 'home.accept': "Aceptar", 'home.decline': "Rechazar", 'members.invited': "invitado", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Anfitriones", 'hosts.hint': "Sus propios nodes sirven este grupo sin preguntar. Otro node lo sirve solo cuando usted lo aprueba aquí; un node que lo pide aparece abajo.", 'hosts.none': "Ningún otro node ha pedido alojar este grupo.", @@ -1247,4 +1297,114 @@ export default { 'native.node_account_confirm': 'El node de este ordenador está configurado para {current}. ¿Configurarlo para {next} en su lugar? Dejará de servir los grupos que aloja para {current}.', 'native.browser_access_confirm': '¿Permitir el acceso desde un navegador? La aplicación dejará su identidad en cada node que use, sellada de modo que solo su frase de contraseña, junto con su cuenta del hub, pueda abrirla.', 'native.declined': 'Cancelado: no se ha cambiado nada.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Copia de seguridad de fotos", + 'photosync.intro': "Envía las fotos tomadas con este teléfono a una carpeta de uno de tus grupos, una vez al día, por Wi-Fi. Las fotos borradas del teléfono se quedan en el grupo.", + 'photosync.setup': "Configurar", + 'photosync.change': "Cambiar", + 'photosync.turn_off': "Desactivar", + 'photosync.now': "Hacer copia ahora", + 'photosync.permission_needed': "MeshBay necesita acceso a las fotos de este teléfono.", + 'photosync.permission_allow': "Permitir acceso", + 'photosync.permission_partial': "El acceso está limitado a las fotos que seleccionaste: las fotos nuevas no se copiarán hasta que permitas el acceso a todas.", + 'photosync.group': "Grupo", + 'photosync.choose_group': "Elegir un grupo", + 'photosync.checking_group': "Leyendo las carpetas del grupo…", + 'photosync.group_offline': "Ningún node que aloje este grupo está en línea ahora. Vuelve a intentarlo cuando lo esté.", + 'photosync.folder': "Carpeta", + 'photosync.albums': "Álbumes de este teléfono", + 'photosync.album_camera': "Cámara", + 'photosync.album_count': "{n} fotos · {size}", + 'photosync.videos_not_included': "No se hace copia de los vídeos: «Cambiar» para añadirlos.", + 'photosync.videos_included': "También se hace copia de los vídeos.", + 'photosync.include_videos': "También los vídeos", + 'photosync.include_videos_hint': "Los vídeos ocupan mucho: se envían por Wi-Fi como las fotos, y la primera copia puede tardar.", + 'photosync.album_count_videos': "{n} fotos, {v} vídeos · {size}", + 'photosync.confirm_videos': "Se enviarán {count} fotos y vídeos ({size}), de ellos {videos} vídeos ({videoSize}), a {dir} y luego los nuevos una vez al día.", + 'photosync.video_permission_needed': "MeshBay también necesita acceso a los vídeos de este teléfono.", + 'photosync.scope_existing': "Las fotos que ya están en este teléfono y luego las nuevas", + 'photosync.scope_new': "Solo las fotos tomadas a partir de ahora", + 'photosync.start': "Iniciar la copia", + 'photosync.confirm': "Se enviarán {count} fotos ({size}) a {dir} y luego las nuevas una vez al día.", + 'photosync.confirm_new': "Las fotos nuevas se enviarán a {dir} una vez al día.", + 'photosync.metered_confirm': "Estás usando datos móviles — {count} fotos, {size}. ¿Enviarlas de todos modos?", + 'photosync.other_account': "Configurada para @{account}. Inicia sesión como @{account} para continuarla, o vuelve a configurarla aquí.", + 'photosync.sent_total': "Fotos enviadas: {n}", + 'photosync.last_run': "Última copia: {when}", + 'photosync.never': "Aún sin copia", + 'photosync.state_waiting_wifi': "Esperando Wi-Fi", + 'photosync.state_connecting': "Conectando con el grupo…", + 'photosync.state_sending': "Enviando {done} / {total}", + 'photosync.state_offline': "Ningún node del grupo está en línea; se volverá a intentar más tarde", + 'photosync.state_interrupted': "Interrumpida — continuará en la próxima ocasión", + 'photosync.state_up_to_date': "Al día", + 'photosync.notif_progress': "Copia de fotos — {done} / {total}", + 'photosync.fail_disk_full': "La copia de fotos se detuvo: el disco del node está lleno.", + 'photosync.fail_read_only': "La copia de fotos se detuvo: la carpeta ya no acepta subidas.", + 'photosync.fail_no_folder': "La copia de fotos se detuvo: la carpeta ya no existe en el grupo.", + 'photosync.fail_unavailable': "La copia de fotos se detuvo: el disco de la carpeta no está conectado al node.", + 'photosync.fail_not_member': "La copia de fotos se detuvo: ya no eres miembro de este grupo.", + 'photosync.fail_permission': "La copia de fotos se detuvo: MeshBay ya no tiene acceso a las fotos.", + 'photosync.fail_other': "La copia de fotos se detuvo.", + 'contactsync.heading': "Copia de seguridad de contactos", + 'contactsync.intro': "Enviar una copia de los contactos de este teléfono una vez al día si han cambiado. Cada copia es un archivo .vcf que cualquier teléfono puede importar.", + 'contactsync.permission_needed': "MeshBay necesita acceso a los contactos de este teléfono.", + 'calendarsync.heading': "Copia de seguridad del calendario", + 'calendarsync.intro': "Enviar una copia de los calendarios de este teléfono una vez al día si han cambiado: los que puedes editar, no aquellos a los que solo estás suscrito. Cada copia es un archivo .ics que cualquier calendario puede importar.", + 'calendarsync.permission_needed': "MeshBay necesita acceso a los calendarios de este teléfono.", + 'messagesync.heading': "Copia de seguridad de SMS", + 'messagesync.intro': "Enviar los SMS de este teléfono una vez al día: la primera copia los contiene todos y cada una de las siguientes solo los nuevos. Los archivos están en el formato XML que restauran las aplicaciones de copia de seguridad de SMS. Los MMS no se incluyen.", + 'messagesync.permission_needed': "MeshBay necesita acceso a los SMS de este teléfono.", + 'messagesync.restricted_hint': "Si Android habla de un ajuste restringido: abre los ajustes de la aplicación, toca ⋮ arriba, «Permitir ajustes restringidos» y vuelve para activarlo. Android lo exige a las aplicaciones instaladas fuera de una tienda.", + 'phonesync.state_sending': "Enviando…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Copias enviadas: {n}", + 'phonesync.last_file': "Última copia: {name}", + 'phonesync.checking_groups': "Buscando grupos de los que eres propietario y único miembro…", + 'phonesync.no_private_group': "No tienes ningún grupo del que seas propietario y único miembro. Crea uno solo para ti y vuelve aquí.", + 'phonesync.no_folder': "Este grupo no tiene ninguna carpeta en la que puedas añadir archivos.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Detenida: el disco del node está lleno.", + 'phonesync.fail_read_only': "Detenida: la carpeta ya no acepta envíos.", + 'phonesync.fail_no_folder': "Detenida: la carpeta ya no existe en el grupo.", + 'phonesync.fail_unavailable': "Detenida: la unidad de la carpeta no está conectada al node.", + 'phonesync.fail_not_member': "Detenida: ya no eres miembro de este grupo.", + 'phonesync.fail_not_private': "Detenida: otra persona se ha unido al grupo.", + 'phonesync.fail_permission': "Detenida: MeshBay ya no tiene acceso.", + 'phonesync.fail_other': "Detenida.", + 'phonesync.open_settings': "Abrir los ajustes de la aplicación", + 'drivesync.heading': "Copia de seguridad de archivos", + 'drivesync.intro': "Enviar los archivos de las carpetas que elijas en este teléfono, una vez al día, por Wi-Fi. Un archivo modificado en el teléfono se envía de nuevo junto a la copia anterior; nunca se reemplaza nada.", + 'drivesync.folders': "Carpetas con copia", + 'drivesync.no_folders': "Aún no has elegido ninguna carpeta.", + 'drivesync.folders_hint': "Las fotos y los vídeos son cosa de la copia de fotos: no se pueden elegir DCIM, Pictures ni Movies. Android no deja que una aplicación tome todo Download, solo carpetas dentro.", + 'drivesync.add_folder': "Añadir una carpeta", + 'drivesync.remove': "Quitar", + 'drivesync.refused_media': "Esta carpeta contiene fotos y vídeos, que envía la copia de fotos: elige otra.", + 'drivesync.refused_root': "Android no permite elegir un almacenamiento entero: elige una carpeta dentro.", + 'drivesync.notif_progress': "Copia de archivos: {done} / {total}", + 'drivesync.metered_confirm': "Estás usando datos móviles. ¿Enviar los archivos de todos modos?", + 'drivesync.sent_total': "Archivos enviados: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Copiar las copias de seguridad de chats que hace WhatsApp, una vez al día por Wi-Fi, para poder restaurarlas en un teléfono nuevo. Siguen cifradas por WhatsApp: aquí no se pueden leer, solo restaurar.", + 'whatsappsync.folder_needed': "Aún no se ha elegido la carpeta de WhatsApp.", + 'whatsappsync.folder_chosen': "La carpeta de WhatsApp está elegida.", + 'whatsappsync.folder_choose': "Elegir la carpeta de WhatsApp", + 'whatsappsync.folder_hint': "El selector se abre en ella: Android/media/com.whatsapp/WhatsApp. Pulsa «Usar esta carpeta».", + 'whatsappsync.media': "También los archivos multimedia", + 'whatsappsync.media_hint': "Fotos, vídeos, notas de voz y documentos recibidos y enviados: a menudo varios gigabytes. Los que ya envía la copia de fotos no se envían dos veces.", + 'whatsappsync.refused': "Esta no es la carpeta de WhatsApp: elige Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Para restaurar en un teléfono nuevo: copia las carpetas Databases y Backups de la última copia en Android/media/com.whatsapp/WhatsApp antes de instalar WhatsApp y restaura con el mismo número (y la contraseña o la clave de 64 dígitos si el cifrado de extremo a extremo está activado).", + 'whatsappsync.notif_progress': "Copia de WhatsApp: {done} / {total}", + 'androidsync.dest_heading': "Destino de las copias de seguridad", + 'androidsync.dest_intro': "Las copias de seguridad van a una carpeta de un grupo del que eres propietario y único miembro. Cada tipo de copia tiene allí su propia carpeta.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Carpetas usadas: {dirs}", + 'androidsync.dest_change_confirm': "Todas las copias de seguridad empezarán de nuevo en {folder} de {group}. Lo ya enviado se queda donde está.", + 'androidsync.dest_not_in_photos': "La pestaña Fotos del grupo no muestra {dir}: las fotos se guardarán, pero no se mostrarán allí hasta que esa carpeta sea una de las de la pestaña (ajustes del grupo).", + 'androidsync.dest_needed': "Elige primero el destino de las copias de seguridad, arriba en esta página.", + 'androidsync.dest_save': "Guardar", + 'phonesync.turn_on': "Activar", + 'photosync.fail_not_private': "Copia de seguridad de fotos detenida: otra persona se ha unido al grupo.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js index 2e823cd..9f32a19 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js @@ -65,6 +65,7 @@ export default { 'register.submit': 'Créer le compte', 'register.loading': 'Création du compte...', 'register.has_account': 'Vous avez déjà un compte ?', + 'register.legal_notice': "En créant un compte, vous acceptez les conditions d'utilisation de ce hub. La loi l'oblige à conserver un an le journal de vos connexions (adresse IP, date, action), même après la suppression de votre compte.", 'register.login_link': 'Se connecter', 'register.recovery_title': 'Enregistrez votre clé de récupération', 'register.recovery_intro': "Cette clé restaure vos identités de groupe si vous oubliez un jour votre phrase secrète. Conservez-la dans un gestionnaire de mots de passe ou en lieu sûr.", @@ -122,6 +123,7 @@ export default { 'welcome.docs_devel': 'Docs développeur', 'welcome.docs_design': 'Conception', 'welcome.docs_protocol': 'Protocole', + 'welcome.docs_api': 'API', 'welcome.download': 'Télécharger (bêta)', 'welcome.legal': 'Informations légales', 'register.err_mismatch': 'Les mots de passe ne correspondent pas', @@ -208,6 +210,11 @@ export default { 'group.mkdir_prompt': 'Nom du nouveau dossier', 'group.mkdir_offline': 'Non connecté au nœud.', 'group.download_offline': 'Pas de connexion au node — le téléchargement ne peut pas démarrer. La reconnexion est automatique, réessayez dans un instant.', + 'group.link_unknown': "Ce lien désigne un groupe dont vous n'êtes pas membre, ou qui ne porte plus ce nom.", + 'group.link_path_unknown': "Rien à l'emplacement {path} dans ce groupe — le fichier a peut-être été déplacé, renommé ou supprimé.", + 'link.copy': "Copier le lien", + 'link.copied': "Lien copié", + 'link.copy_failed': "Copie impossible — le lien est {url}", 'group.download_write_stalled': 'L\'écriture du fichier sur le disque s\'est arrêtée ({seconds} s sans progression). Le téléchargement a été interrompu plutôt que laissé en suspens ; réessayez.', 'device.add_title': 'Ce navigateur n’est pas encore lié à ce nœud', 'device.add_hint': 'Votre compte est connu ici, mais ce navigateur détient une autre clé. Approuvez-le depuis un appareil déjà lié — sans passer par l’opérateur.', @@ -276,6 +283,7 @@ export default { 'group.upload_indexing': 'indexation…', 'video.err_transport': 'Transport non connecté', 'video.err_mse': 'Codec non pris en charge pour la diffusion : {codec}', + 'video.err_no_mse': 'Ce navigateur ne sait pas diffuser de vidéo (un iPhone doit être en iOS 17.1 ou plus récent)', 'video.mode_poster': 'Affiches', 'video.mode_flat': 'Liste à plat', 'video.filter_all': 'Tous', @@ -372,10 +380,17 @@ export default { one: '{n} photo', other: '{n} photos', }, + 'photo.n_videos': { + one: "{n} vidéo", + other: "{n} vidéos", + }, + 'photo.play_video': "Lire la vidéo", 'photo.back': 'Retour', 'photo.prev': 'Précédent (←)', 'photo.next': 'Suivant (→)', 'photo.zip_album': "Télécharger l'album en zip", + 'photo.slideshow': 'Diaporama', + 'photo.slideshow_stop': 'Arrêter le diaporama', 'photo.zoom_in': 'Zoomer', 'photo.zoom_out': 'Dézoomer', 'photo.zoom_fit_title': 'Ajuster à la fenêtre', @@ -389,6 +404,13 @@ export default { 'cast.copied': 'URL copiée', 'cast.scanning': "Recherche d'appareils…", 'cast.no_devices': 'Aucun appareil trouvé', + 'cast.casting_to': 'Diffusion sur', + 'cast.seek': 'Position dans le film', + 'cast.waiting': 'En attente de la télévision…', + 'cast.back30': 'Reculer de 30 secondes', + 'cast.fwd30': 'Avancer de 30 secondes', + 'cast.play': 'Lecture', + 'cast.pause': 'Pause', // Settings 'settings.title': 'Paramètres', @@ -419,6 +441,15 @@ export default { 'settings.email_verified': 'Adresse e-mail modifiée avec succès.', 'settings.notif_global_disable': 'Désactiver toutes les notifications', 'settings.notif_global_hint': 'Quand activé, aucune notification n\x27est créée pour aucun groupe.', + 'settings.push_label': 'Notifications sur ce téléphone', + 'settings.push_off': 'Désactivées. Activez-les pour être prévenu des nouveaux messages et invitations quand MeshBay est fermé.', + 'settings.push_pending': 'En attente de la réponse du distributeur…', + 'settings.push_blocked': 'Android bloque les notifications de MeshBay : autorisez-les dans les paramètres du système.', + 'settings.push_ready': 'Activées. Les nouvelles notifications arrivent sur ce téléphone par le distributeur, chiffrées pour qu’il ne puisse pas les lire.', + 'settings.push_poll': 'Activées. Ce téléphone vérifie les nouvelles notifications environ toutes les quinze minutes. Pour les recevoir immédiatement, vous pouvez installer une application de distribution UnifiedPush comme ntfy (facultatif).', + 'settings.push_global_off': 'Rien n’est envoyé tant que toutes les notifications sont désactivées.', + 'push.channel_chat': 'Messages', + 'push.channel_other': 'Invitations et compte', 'settings.defaults': 'Valeurs par défaut', 'settings.default_tab': 'Onglet par défaut', 'settings.default_tab_hint': 'L\'onglet qui s\'ouvre en premier quand vous entrez dans un groupe.', @@ -493,12 +524,11 @@ export default { 'firstrun.hint': 'Un hub détient votre compte et vous met en relation avec les nœuds. Il ne voit ni vos fichiers, ni vos messages, ni vos clés.', 'firstrun.btn': 'Continuer', 'firstrun.checking': 'Vérification…', - 'firstrun.note': 'Il n’y a volontairement pas de valeur par défaut : cette application ne fait confiance à un hub que pour son API, jamais pour l’interface, qui est livrée avec l’application.', 'device.this_device': 'Cet appareil', 'settings.keys_heading': 'Clés sur cet appareil', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Actuellement', - 'settings.hub_hint': 'Changer cette adresse vous déconnecte et redémarre la fenêtre.', + 'settings.hub_hint': 'Le hub auquel cette application se connecte. En changer vous déconnecte : votre compte reste sur ce hub.', 'settings.hub_change': 'Changer', 'settings.keys_where': 'Protégées par', 'settings.keys_unprotected': 'Aucun trousseau système ne fonctionne : vos clés sont chiffrées avec une clé qui n’est pas secrète. Quiconque peut lire les fichiers de cette machine peut les lire. Démarrez un trousseau, ou considérez cet appareil comme non fiable.', @@ -516,12 +546,14 @@ export default { 'settings.node_key_placeholder': 'Collez la clé publique Ed25519 du node (base64)', 'settings.node_key_submit': 'Associer le node', 'settings.node_key_success': 'Node associé avec succès', + 'settings.node_key_unlink': "Délier", + 'settings.node_key_unlink_confirm': "Délier le node de votre compte ? Il cessera de servir vos groupes jusqu'à ce qu'un node soit lié de nouveau.", + 'settings.node_key_unlinked': "Node délié", 'settings.node_key_current': 'Clé du node associé', // Sidebar 'sidebar.create_group': 'Créer un groupe', 'sidebar.settings': 'Paramètres', - 'sidebar.admin': 'Administration', // User menu 'usermenu.language': 'Langue', @@ -757,6 +789,7 @@ export default { 'transfers.eta_minutes': '{n} min restantes', 'transfers.eta_hours': '{n} h restantes', 'transfers.failed': 'Échec', + 'transfers.disk_full': 'Le disque du node est plein', 'group.select': 'Sélectionner', 'group.select_done': 'Terminé', 'group.actions': 'Actions ({n})', @@ -843,6 +876,7 @@ export default { 'indexdock.next_count': "En attente : {count}", 'indexdock.open': "Ouvrir les paramètres de ce groupe", 'indexdock.hide': "Masquer jusqu'à la prochaine indexation", + 'indexdock.pause': "Mettre en pause l'indexation de ce dossier", 'chat.load_older': 'Charger {n} messages plus anciens', 'chat.start_of_history': 'Début de la conversation', 'chat.today': 'Aujourd’hui', @@ -889,7 +923,7 @@ export default { 'lazy.reload': 'Recharger la page', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -914,6 +948,7 @@ export default { 'node.startup_mode_service': 'Comme service en arrière-plan (démarre au boot)', 'node.startup_mode_updating': 'Changement de mode — vérifiez une invite d\'administrateur…', 'node.startup_mode_service_unavailable_hint': 'Le mode service en arrière-plan nécessite une version installée. Pour un test local, exécutez "meshbay-node service install" depuis un PowerShell administrateur.', + 'node.startup_mode_service_store_hint': 'Démarrer au boot, avant toute ouverture de session, nécessite l\'installeur MeshBay (.exe) plutôt que la version du Microsoft Store.', 'node.not_operator': 'Impossible de joindre votre node. Vérifiez qu\'il est en cours d\'exécution.', 'node.offline': 'Node hors ligne', 'node.retry': 'Réessayer', @@ -921,6 +956,13 @@ export default { 'node.pair_code_placeholder': "Code d'appairage", 'node.pair_button': 'Appairer ce navigateur', 'node.pair_success': 'Appairage réussi.', + 'node.pair_pending': "Code d'appairage prêt : il sera utilisé à la prochaine ouverture d'un des groupes de ce node.", + 'node.link_other_node': "Votre compte est lié au node d'une autre machine : ce node-ci ne peut pas servir vos groupes.", + 'node.link_here': "Lier ce node à la place", + 'node.link_here_confirm': "Lier ce node à votre compte ? Le node lié actuellement, sur une autre machine, cessera de servir vos groupes jusqu'à ce qu'il soit lié de nouveau.", + 'node.link_other_account': "Ce node est configuré pour {account}, pas pour vous : il ne peut pas servir vos groupes.", + 'node.link_take_over': "Utiliser ce node pour mon compte", + 'node.link_linking': "Liaison…", 'node.reload': 'Recharger la configuration', 'node.reloaded': 'Configuration rechargée. Les modifications de répertoires sur les groupes existants sont maintenant actives.', 'node.restart_needed': 'Après l\'ajout : initialisez la clé de groupe (meshbay-node gek-init --group <name>).', @@ -939,6 +981,8 @@ export default { 'node.setting_max_uploads': 'Téléversements simultanés max', 'node.setting_transcode': 'Transcoder les vidéos incompatibles', 'node.setting_max_upload': 'Taille maximale d\'un envoi', + 'node.setting_connection_processes': 'Cœurs CPU pour les connexions', + 'node.setting_unit_of': 'sur {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'heures', 'node.setting_unit_minutes': 'min', @@ -958,6 +1002,9 @@ export default { 'node.remove_root': 'Retirer', 'node.root_no_signing_key': 'Aucune clé de signature disponible — appairez d\'abord cet appareil avec le nœud', 'node.root_no_route': 'Aucune route vers le nœud — connectez-vous à lui, ou utilisez l\'application sur la machine qui l\'héberge', + 'node.root_pause': "Mettre l'indexation en pause", + 'node.root_resume': "Reprendre l'indexation", + 'node.root_paused': "indexation en pause", 'node.root_remove_last': 'Un groupe a besoin d\'au moins un répertoire', 'node.root_path': 'Chemin', 'node.root_added': 'Répertoire ajouté.', @@ -1086,6 +1133,8 @@ export default { 'settings_app.chat_encrypted_always': 'La discussion de ce groupe est toujours chiffrée. Cela ne peut pas être désactivé.', 'settings_app.chat_rotate_epoch': 'Faire tourner la clé de discussion', 'settings_app.chat_rotate_epoch_hint': 'Les membres continuent de lire tout l\'historique. Quiconque a été retiré du groupe ne peut plus lire ce qui sera écrit. Retirer un membre ou un appareil le fait déjà tout seul.', + 'settings_app.chat_purge': 'Purger la discussion', + 'settings_app.chat_purge_hint': 'Supprime tous les messages de la discussion de ce groupe sur ce nœud, pour tous les membres. Les pièces jointes restent dans leur dossier. C\'est irréversible.', 'settings_app.tmdb_token_prompt': 'Créez un compte TMDB pour générer votre propre clé d\'API.', 'settings_app.tmdb_token_link': 'Obtenir une clé', 'settings_node.roots_offline_hint': 'Non connecté au nœud — les changements passent par le nœud local et prennent effet à son prochain rechargement.', @@ -1237,6 +1286,7 @@ export default { 'home.accept': "Accepter", 'home.decline': "Refuser", 'members.invited': "invité", + 'members.awaiting_code': "en attente du code", 'hosts.title': "Hôtes", 'hosts.hint': "Vos propres nodes servent ce groupe sans rien demander. Un autre node ne le sert qu'une fois approuvé ici ; un node qui le demande apparaît ci-dessous.", 'hosts.none': "Aucun autre node n'a demandé à héberger ce groupe.", @@ -1262,4 +1312,114 @@ export default { 'native.node_account_confirm': 'Le node de cet ordinateur est configuré pour {current}. Le configurer pour {next} à la place ? Il cessera de servir les groupes qu\'il héberge pour {current}.', 'native.browser_access_confirm': 'Autoriser la connexion depuis un navigateur ? L\'application déposera votre identité sur chaque node que vous utilisez, scellée de sorte que seule votre phrase secrète, avec votre compte sur le hub, puisse l\'ouvrir.', 'native.declined': 'Annulé — rien n\'a été modifié.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Sauvegarde des photos", + 'photosync.intro': "Envoyer les photos prises avec ce téléphone dans un dossier d'un de vos groupes, une fois par jour, en Wi-Fi. Les photos supprimées du téléphone restent dans le groupe.", + 'photosync.setup': "Configurer", + 'photosync.change': "Modifier", + 'photosync.turn_off': "Désactiver", + 'photosync.now': "Sauvegarder maintenant", + 'photosync.permission_needed': "MeshBay a besoin d'accéder aux photos de ce téléphone.", + 'photosync.permission_allow': "Autoriser l'accès", + 'photosync.permission_partial': "L'accès est limité aux photos que vous avez sélectionnées : les nouvelles photos ne seront pas sauvegardées tant que vous n'autorisez pas l'accès à toutes.", + 'photosync.group': "Groupe", + 'photosync.choose_group': "Choisir un groupe", + 'photosync.checking_group': "Lecture des dossiers du groupe…", + 'photosync.group_offline': "Aucun node hébergeant ce groupe n'est en ligne pour le moment. Réessayez quand il le sera.", + 'photosync.folder': "Dossier", + 'photosync.albums': "Albums de ce téléphone", + 'photosync.album_camera': "Appareil photo", + 'photosync.album_count': "{n} photos · {size}", + 'photosync.videos_not_included': "Les vidéos ne sont pas sauvegardées : « Modifier » pour les ajouter.", + 'photosync.videos_included': "Les vidéos sont sauvegardées aussi.", + 'photosync.include_videos': "Les vidéos aussi", + 'photosync.include_videos_hint': "Les vidéos sont lourdes : elles partent en Wi-Fi comme les photos, et la première sauvegarde peut être longue.", + 'photosync.album_count_videos': "{n} photos, {v} vidéos · {size}", + 'photosync.confirm_videos': "{count} photos et vidéos ({size}), dont {videos} vidéos ({videoSize}), seront envoyées dans {dir}, puis les nouvelles une fois par jour.", + 'photosync.video_permission_needed': "MeshBay a aussi besoin d'accéder aux vidéos de ce téléphone.", + 'photosync.scope_existing': "Les photos déjà sur ce téléphone, puis les nouvelles", + 'photosync.scope_new': "Seulement les photos prises à partir de maintenant", + 'photosync.start': "Lancer la sauvegarde", + 'photosync.confirm': "{count} photos ({size}) seront envoyées dans {dir}, puis les nouvelles une fois par jour.", + 'photosync.confirm_new': "Les nouvelles photos seront envoyées dans {dir} une fois par jour.", + 'photosync.metered_confirm': "Vous êtes en données mobiles — {count} photos, {size}. Les envoyer quand même ?", + 'photosync.other_account': "Configurée pour @{account}. Connectez-vous en tant que @{account} pour la poursuivre, ou configurez-la à nouveau ici.", + 'photosync.sent_total': "Photos envoyées : {n}", + 'photosync.last_run': "Dernière sauvegarde : {when}", + 'photosync.never': "Pas encore sauvegardé", + 'photosync.state_waiting_wifi': "En attente du Wi-Fi", + 'photosync.state_connecting': "Connexion au groupe…", + 'photosync.state_sending': "Envoi {done} / {total}", + 'photosync.state_offline': "Aucun node hébergeant le groupe n'est en ligne ; nouvel essai plus tard", + 'photosync.state_interrupted': "Interrompue — elle reprendra à la prochaine occasion", + 'photosync.state_up_to_date': "À jour", + 'photosync.notif_progress': "Sauvegarde des photos — {done} / {total}", + 'photosync.fail_disk_full': "Sauvegarde des photos arrêtée : le disque du node est plein.", + 'photosync.fail_read_only': "Sauvegarde des photos arrêtée : le dossier n'accepte plus les dépôts.", + 'photosync.fail_no_folder': "Sauvegarde des photos arrêtée : le dossier n'existe plus dans le groupe.", + 'photosync.fail_unavailable': "Sauvegarde des photos arrêtée : le disque du dossier n'est pas branché sur le node.", + 'photosync.fail_not_member': "Sauvegarde des photos arrêtée : vous n'êtes plus membre de ce groupe.", + 'photosync.fail_permission': "Sauvegarde des photos arrêtée : MeshBay n'a plus accès aux photos.", + 'photosync.fail_other': "Sauvegarde des photos arrêtée.", + 'contactsync.heading': "Sauvegarde des contacts", + 'contactsync.intro': "Envoyer une copie des contacts de ce téléphone une fois par jour s'ils ont changé. Chaque copie est un fichier .vcf que tout téléphone sait importer.", + 'contactsync.permission_needed': "MeshBay a besoin d'accéder aux contacts de ce téléphone.", + 'calendarsync.heading': "Sauvegarde de l'agenda", + 'calendarsync.intro': "Envoyer une copie des agendas de ce téléphone une fois par jour s'ils ont changé : ceux que vous pouvez modifier, pas ceux auxquels vous êtes seulement abonné. Chaque copie est un fichier .ics que tout agenda sait importer.", + 'calendarsync.permission_needed': "MeshBay a besoin d'accéder aux agendas de ce téléphone.", + 'messagesync.heading': "Sauvegarde des SMS", + 'messagesync.intro': "Envoyer les SMS de ce téléphone une fois par jour : la première copie les contient tous, les suivantes seulement les nouveaux. Les fichiers sont au format XML que les applis de sauvegarde SMS savent restaurer. Les MMS ne sont pas inclus.", + 'messagesync.permission_needed': "MeshBay a besoin d'accéder aux SMS de ce téléphone.", + 'messagesync.restricted_hint': "Si Android parle d'un paramètre restreint : ouvrez les réglages de l'appli, touchez ⋮ en haut, « Autoriser les paramètres restreints », puis revenez l'activer. Android l'exige des applis installées hors d'un store.", + 'phonesync.state_sending': "Envoi…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Copies envoyées : {n}", + 'phonesync.last_file': "Dernière copie : {name}", + 'phonesync.checking_groups': "Recherche des groupes dont vous êtes le propriétaire et le seul membre…", + 'phonesync.no_private_group': "Vous n'avez aucun groupe dont vous êtes le propriétaire et le seul membre. Créez-en un rien que pour vous, puis revenez ici.", + 'phonesync.no_folder': "Ce groupe n'a aucun dossier où vous pouvez ajouter des fichiers.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Arrêtée : le disque du node est plein.", + 'phonesync.fail_read_only': "Arrêtée : le dossier n'accepte plus d'envois.", + 'phonesync.fail_no_folder': "Arrêtée : le dossier n'existe plus dans le groupe.", + 'phonesync.fail_unavailable': "Arrêtée : le disque du dossier n'est pas branché au node.", + 'phonesync.fail_not_member': "Arrêtée : vous n'êtes plus membre de ce groupe.", + 'phonesync.fail_not_private': "Arrêtée : quelqu'un d'autre a rejoint le groupe.", + 'phonesync.fail_permission': "Arrêtée : MeshBay n'y a plus accès.", + 'phonesync.fail_other': "Arrêtée.", + 'phonesync.open_settings': "Ouvrir les réglages de l'appli", + 'drivesync.heading': "Sauvegarde des fichiers", + 'drivesync.intro': "Envoyer les fichiers des dossiers que vous choisissez sur ce téléphone, une fois par jour, en Wi-Fi. Un fichier modifié sur le téléphone est renvoyé à côté de la copie précédente ; rien n'est jamais remplacé.", + 'drivesync.folders': "Dossiers sauvegardés", + 'drivesync.no_folders': "Aucun dossier choisi pour l'instant.", + 'drivesync.folders_hint': "Les photos et vidéos relèvent de la sauvegarde des photos : DCIM, Pictures et Movies ne peuvent pas être choisis. Android ne laisse pas une appli prendre tout Download, seulement des dossiers à l'intérieur.", + 'drivesync.add_folder': "Ajouter un dossier", + 'drivesync.remove': "Retirer", + 'drivesync.refused_media': "Ce dossier contient des photos et vidéos, que la sauvegarde des photos envoie : choisissez-en un autre.", + 'drivesync.refused_root': "Android ne permet pas de choisir un stockage entier : choisissez un dossier à l'intérieur.", + 'drivesync.notif_progress': "Sauvegarde des fichiers : {done} / {total}", + 'drivesync.metered_confirm': "Vous êtes en données mobiles. Envoyer les fichiers quand même ?", + 'drivesync.sent_total': "Fichiers envoyés : {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Copier les sauvegardes de conversations que fait WhatsApp, une fois par jour en Wi-Fi, pour pouvoir les restaurer sur un nouveau téléphone. Elles restent chiffrées par WhatsApp : on ne peut pas les lire ici, seulement les restaurer.", + 'whatsappsync.folder_needed': "Le dossier de WhatsApp n'est pas encore choisi.", + 'whatsappsync.folder_chosen': "Le dossier de WhatsApp est choisi.", + 'whatsappsync.folder_choose': "Choisir le dossier de WhatsApp", + 'whatsappsync.folder_hint': "Le sélecteur s'ouvre dessus : Android/media/com.whatsapp/WhatsApp. Appuyez sur « Utiliser ce dossier ».", + 'whatsappsync.media': "Les médias aussi", + 'whatsappsync.media_hint': "Photos, vidéos, messages vocaux et documents reçus et envoyés : souvent plusieurs gigaoctets. Ceux que la sauvegarde des photos envoie déjà ne partent pas deux fois.", + 'whatsappsync.refused': "Ce n'est pas le dossier de WhatsApp : choisissez Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Pour restaurer sur un nouveau téléphone : copiez les dossiers Databases et Backups de la dernière copie dans Android/media/com.whatsapp/WhatsApp avant d'installer WhatsApp, puis restaurez avec le même numéro (et le mot de passe ou la clé de 64 chiffres si la sauvegarde chiffrée de bout en bout est activée).", + 'whatsappsync.notif_progress': "Sauvegarde de WhatsApp : {done} / {total}", + 'androidsync.dest_heading': "Destination des sauvegardes", + 'androidsync.dest_intro': "Les sauvegardes vont dans un dossier d'un groupe dont vous êtes le propriétaire et le seul membre. Chaque type de sauvegarde y a son propre dossier.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Dossiers utilisés : {dirs}", + 'androidsync.dest_change_confirm': "Toutes les sauvegardes recommenceront dans {folder} de {group}. Ce qui a déjà été envoyé reste où il est.", + 'androidsync.dest_not_in_photos': "L'onglet Photos du groupe n'affiche pas {dir} : les photos seront sauvegardées mais pas affichées tant que ce dossier ne fait pas partie de ceux de l'onglet (paramètres du groupe).", + 'androidsync.dest_needed': "Choisissez d'abord la destination des sauvegardes, en haut de cette page.", + 'androidsync.dest_save': "Enregistrer", + 'phonesync.turn_on': "Activer", + 'photosync.fail_not_private': "Sauvegarde des photos arrêtée : quelqu'un d'autre a rejoint le groupe.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js index 84879e8..5578028 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js @@ -66,6 +66,7 @@ export default { 'register.submit': "Crea l'account", 'register.loading': "Creazione dell'account...", 'register.has_account': 'Ha già un account?', + 'register.legal_notice': "Creando un account, accetta le condizioni d'uso di questo hub. La legge gli impone di conservare per un anno il registro delle sue connessioni (indirizzo IP, data, azione), anche dopo l'eliminazione dell'account.", 'register.login_link': 'Accedi', 'register.recovery_title': 'Salvi la sua chiave di recupero', 'register.recovery_intro': 'Questa chiave ripristina le sue identità di gruppo se dovesse dimenticare la passphrase. La conservi in un gestore di password o in un luogo sicuro.', @@ -123,6 +124,7 @@ export default { 'welcome.docs_devel': 'Documentazione tecnica', 'welcome.docs_design': 'Architettura', 'welcome.docs_protocol': 'Protocollo', + 'welcome.docs_api': 'API', 'welcome.download': 'Scarica (beta)', 'welcome.legal': 'Note legali', 'register.err_mismatch': 'Le password non coincidono', @@ -208,6 +210,11 @@ export default { 'group.mkdir_prompt': 'Nome della nuova cartella', 'group.mkdir_offline': 'Non connesso al nodo.', 'group.download_offline': 'Nessuna connessione al nodo — il download non può iniziare. La riconnessione è automatica, riprovi tra poco.', + 'group.link_unknown': "Questo link indica un gruppo di cui non sei membro, o che non ha più questo nome.", + 'group.link_path_unknown': "Non c'è nulla in {path} in questo gruppo: il file potrebbe essere stato spostato, rinominato o eliminato.", + 'link.copy': "Copia link", + 'link.copied': "Link copiato", + 'link.copy_failed': "Impossibile copiare — il link è {url}", 'group.download_write_stalled': 'Il file ha smesso di essere scritto su disco ({seconds} s senza progressi). Il download è stato interrotto invece di restare bloccato; riprovi.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -276,6 +283,7 @@ export default { 'group.upload_indexing': 'indicizzazione…', 'video.err_transport': 'Trasporto non connesso', 'video.err_mse': 'Codec non supportato per lo streaming: {codec}', + 'video.err_no_mse': 'Questo browser non può riprodurre video in streaming (un iPhone richiede iOS 17.1 o successivo)', 'video.mode_poster': 'Locandine', 'video.mode_flat': 'Elenco semplice', 'video.filter_all': 'All', @@ -372,10 +380,17 @@ export default { one: '{n} foto', other: '{n} foto', }, + 'photo.n_videos': { + one: "{n} video", + other: "{n} video", + }, + 'photo.play_video': "Riproduci il video", 'photo.back': 'Indietro', 'photo.prev': 'Precedente (←)', 'photo.next': 'Successiva (→)', 'photo.zip_album': "Scarica l'album come zip", + 'photo.slideshow': 'Presentazione', + 'photo.slideshow_stop': 'Interrompi la presentazione', 'photo.zoom_in': 'Ingrandisci', 'photo.zoom_out': 'Riduci', 'photo.zoom_fit_title': 'Adatta alla finestra', @@ -389,6 +404,13 @@ export default { 'cast.copied': 'URL copiato', 'cast.scanning': 'Ricerca dispositivi…', 'cast.no_devices': 'Nessun dispositivo trovato', + 'cast.casting_to': 'Trasmissione su', + 'cast.seek': 'Posizione nel film', + 'cast.waiting': 'In attesa del televisore…', + 'cast.back30': 'Indietro di 30 secondi', + 'cast.fwd30': 'Avanti di 30 secondi', + 'cast.play': 'Riproduci', + 'cast.pause': 'Pausa', // Settings 'settings.title': 'Impostazioni', @@ -419,6 +441,15 @@ export default { 'settings.email_verified': 'Indirizzo e-mail modificato con successo.', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'Notifiche su questo telefono', + 'settings.push_off': 'Disattivate. Attivale per essere avvisato di nuovi messaggi e inviti quando MeshBay è chiuso.', + 'settings.push_pending': 'In attesa della risposta del distributore…', + 'settings.push_blocked': 'Android blocca le notifiche di MeshBay: consentile nelle impostazioni di sistema.', + 'settings.push_ready': 'Attivate. Le nuove notifiche arrivano su questo telefono tramite il distributore, cifrate in modo che non possa leggerle.', + 'settings.push_poll': 'Attivate. Questo telefono controlla le nuove notifiche circa ogni quindici minuti. Per riceverle subito, puoi installare un’app distributore UnifiedPush come ntfy (facoltativo).', + 'settings.push_global_off': 'Non viene inviato nulla finché tutte le notifiche sono disattivate.', + 'push.channel_chat': 'Messaggi', + 'push.channel_other': 'Inviti e account', 'settings.defaults': 'Valori predefiniti', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -493,12 +524,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -516,12 +546,14 @@ export default { 'settings.node_key_placeholder': 'Incolli la chiave pubblica Ed25519 del node (base64)', 'settings.node_key_submit': 'Collega il node', 'settings.node_key_success': 'Node collegato correttamente', + 'settings.node_key_unlink': "Scollega", + 'settings.node_key_unlink_confirm': "Scollegare il node dal tuo account? Smetterà di servire i tuoi gruppi finché non verrà collegato di nuovo un node.", + 'settings.node_key_unlinked': "Node scollegato", 'settings.node_key_current': 'Chiave del node collegato', // Sidebar 'sidebar.create_group': 'Crea un gruppo', 'sidebar.settings': 'Impostazioni', - 'sidebar.admin': 'Amministrazione', // User menu 'usermenu.language': 'Lingua', @@ -757,6 +789,7 @@ export default { 'transfers.eta_minutes': '{n} min rimanenti', 'transfers.eta_hours': '{n} h rimanenti', 'transfers.failed': 'Non riuscito', + 'transfers.disk_full': 'Il disco del node è pieno', 'group.select': 'Seleziona', 'group.select_done': 'Fine', 'group.actions': 'Azioni ({n})', @@ -842,6 +875,7 @@ export default { 'indexdock.next_count': "In attesa: {count}", 'indexdock.open': "Apri le impostazioni di questo gruppo", 'indexdock.hide': "Nascondi fino alla prossima indicizzazione", + 'indexdock.pause': "Sospendi l'indicizzazione di questa cartella", 'chat.load_older': 'Carica {n} messaggi precedenti', 'chat.start_of_history': 'Inizio della conversazione', 'chat.today': 'Oggi', @@ -888,7 +922,7 @@ export default { 'lazy.reload': 'Ricarica la pagina', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -913,6 +947,7 @@ export default { 'node.startup_mode_service': 'Come servizio in background (si avvia all\'avvio del sistema)', 'node.startup_mode_updating': 'Cambio modalità — controlli se compare una richiesta di amministratore…', 'node.startup_mode_service_unavailable_hint': 'La modalità servizio in background richiede una build installata. Per test locali, eseguire "meshbay-node service install" da un PowerShell con privilegi di amministratore.', + 'node.startup_mode_service_store_hint': 'L\'avvio all\'accensione, prima che qualcuno acceda, richiede il programma di installazione di MeshBay (.exe) anziché la versione del Microsoft Store.', 'node.not_operator': 'Impossibile raggiungere il suo node. Si assicuri che sia in esecuzione.', 'node.offline': 'Node non in linea', 'node.retry': 'Riprova', @@ -920,6 +955,13 @@ export default { 'node.pair_code_placeholder': 'Codice di associazione', 'node.pair_button': 'Associa questo browser', 'node.pair_success': 'Associazione riuscita.', + 'node.pair_pending': 'Codice di associazione pronto: verrà usato la prossima volta che apri uno dei gruppi di questo Node.', + 'node.link_other_node': "Il tuo account è collegato al node di un'altra macchina, quindi questo node non può servire i tuoi gruppi.", + 'node.link_here': "Collega invece questo node", + 'node.link_here_confirm': "Collegare questo node al tuo account? Il node collegato ora, su un'altra macchina, smetterà di servire i tuoi gruppi finché non verrà ricollegato.", + 'node.link_other_account': "Questo node è configurato per {account}, non per te, quindi non può servire i tuoi gruppi.", + 'node.link_take_over': "Usa questo node per il mio account", + 'node.link_linking': "Collegamento…", 'node.reload': 'Ricarica configurazione', 'node.reloaded': 'Configurazione ricaricata. Le modifiche alle directory dei gruppi esistenti sono ora attive.', 'node.restart_needed': "Dopo l'aggiunta: inizializzi la chiave di gruppo (meshbay-node gek-init --group <nome>).", @@ -938,6 +980,8 @@ export default { 'node.setting_max_uploads': 'Caricamenti simultanei massimi', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Caricamento singolo massimo', + 'node.setting_connection_processes': 'Core CPU per le connessioni', + 'node.setting_unit_of': 'su {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -957,6 +1001,9 @@ export default { 'node.remove_root': 'Rimuovi', 'node.root_no_signing_key': 'Nessuna chiave di firma disponibile: associa prima questo dispositivo al nodo', 'node.root_no_route': 'Nessuna via verso il nodo: connettiti a esso oppure usa l\'applicazione sulla macchina che lo ospita', + 'node.root_pause': "Sospendi l'indicizzazione", + 'node.root_resume': "Riprendi l'indicizzazione", + 'node.root_paused': "indicizzazione sospesa", 'node.root_remove_last': 'Un gruppo ha bisogno di almeno una directory', 'node.root_path': 'Percorso', 'node.directory': 'Directory', @@ -1082,6 +1129,8 @@ export default { 'settings_app.chat_encrypted_always': 'La chat di questo gruppo è sempre cifrata. Non può essere disattivata.', 'settings_app.chat_rotate_epoch': 'Ruota la chiave della chat', 'settings_app.chat_rotate_epoch_hint': 'I membri continuano a leggere tutta la cronologia. Chi è stato rimosso dal gruppo non potrà leggere ciò che verrà scritto d\'ora in poi. Rimuovere un membro o un dispositivo lo fa già da solo.', + 'settings_app.chat_purge': 'Svuota la chat', + 'settings_app.chat_purge_hint': 'Elimina tutti i messaggi della chat di questo gruppo su questo nodo, per tutti i membri. Gli allegati restano nella loro cartella. Non si può annullare.', 'settings_app.tmdb_token_prompt': 'Registrati su TMDB per generare la tua chiave API.', 'settings_app.tmdb_token_link': 'Ottieni una chiave', 'settings_node.roots_offline_hint': 'Non connesso al nodo: le modifiche passano dal nodo locale e hanno effetto al successivo ricaricamento.', @@ -1236,6 +1285,7 @@ export default { 'home.accept': "Accetta", 'home.decline': "Rifiuta", 'members.invited': "invitato", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Host", 'hosts.hint': "I tuoi node servono questo gruppo senza chiedere. Un altro node lo serve solo dopo che lo approvi qui; un node che lo chiede compare qui sotto.", 'hosts.none': "Nessun altro node ha chiesto di ospitare questo gruppo.", @@ -1261,4 +1311,114 @@ export default { 'native.node_account_confirm': 'Il node di questo computer è configurato per {current}. Configurarlo invece per {next}? Smetterà di servire i gruppi che ospita per {current}.', 'native.browser_access_confirm': 'Consentire l\'accesso da un browser? L\'applicazione lascerà la tua identità su ogni node che usi, sigillata in modo che solo la tua passphrase, insieme al tuo account sull\'hub, possa aprirla.', 'native.declined': 'Annullato: non è stato modificato nulla.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Backup delle foto", + 'photosync.intro': "Invia le foto scattate con questo telefono in una cartella di uno dei tuoi gruppi, una volta al giorno, in Wi-Fi. Le foto eliminate dal telefono restano nel gruppo.", + 'photosync.setup': "Configura", + 'photosync.change': "Modifica", + 'photosync.turn_off': "Disattiva", + 'photosync.now': "Esegui ora il backup", + 'photosync.permission_needed': "MeshBay ha bisogno di accedere alle foto di questo telefono.", + 'photosync.permission_allow': "Consenti l'accesso", + 'photosync.permission_partial': "L'accesso è limitato alle foto che hai selezionato: le nuove foto non verranno salvate finché non consenti l'accesso a tutte.", + 'photosync.group': "Gruppo", + 'photosync.choose_group': "Scegli un gruppo", + 'photosync.checking_group': "Lettura delle cartelle del gruppo…", + 'photosync.group_offline': "Nessun node che ospita questo gruppo è online ora. Riprova quando lo sarà.", + 'photosync.folder': "Cartella", + 'photosync.albums': "Album su questo telefono", + 'photosync.album_camera': "Fotocamera", + 'photosync.album_count': "{n} foto · {size}", + 'photosync.videos_not_included': "I video non vengono salvati: «Modifica» per aggiungerli.", + 'photosync.videos_included': "Anche i video vengono salvati.", + 'photosync.include_videos': "Anche i video", + 'photosync.include_videos_hint': "I video sono pesanti: partono in Wi-Fi come le foto, e il primo backup può richiedere tempo.", + 'photosync.album_count_videos': "{n} foto, {v} video · {size}", + 'photosync.confirm_videos': "{count} foto e video ({size}), di cui {videos} video ({videoSize}), verranno inviati in {dir}, poi quelli nuovi una volta al giorno.", + 'photosync.video_permission_needed': "MeshBay ha bisogno di accedere anche ai video di questo telefono.", + 'photosync.scope_existing': "Le foto già su questo telefono, poi quelle nuove", + 'photosync.scope_new': "Solo le foto scattate da ora in poi", + 'photosync.start': "Avvia il backup", + 'photosync.confirm': "{count} foto ({size}) verranno inviate in {dir}, poi quelle nuove una volta al giorno.", + 'photosync.confirm_new': "Le nuove foto verranno inviate in {dir} una volta al giorno.", + 'photosync.metered_confirm': "Stai usando i dati mobili — {count} foto, {size}. Inviarle comunque?", + 'photosync.other_account': "Configurato per @{account}. Accedi come @{account} per continuarlo, oppure configuralo di nuovo qui.", + 'photosync.sent_total': "Foto inviate: {n}", + 'photosync.last_run': "Ultimo backup: {when}", + 'photosync.never': "Nessun backup ancora", + 'photosync.state_waiting_wifi': "In attesa del Wi-Fi", + 'photosync.state_connecting': "Connessione al gruppo…", + 'photosync.state_sending': "Invio {done} / {total}", + 'photosync.state_offline': "Nessun node del gruppo è online; nuovo tentativo più tardi", + 'photosync.state_interrupted': "Interrotto — riprenderà alla prossima occasione", + 'photosync.state_up_to_date': "Aggiornato", + 'photosync.notif_progress': "Backup delle foto — {done} / {total}", + 'photosync.fail_disk_full': "Backup delle foto interrotto: il disco del node è pieno.", + 'photosync.fail_read_only': "Backup delle foto interrotto: la cartella non accetta più caricamenti.", + 'photosync.fail_no_folder': "Backup delle foto interrotto: la cartella non esiste più nel gruppo.", + 'photosync.fail_unavailable': "Backup delle foto interrotto: il disco della cartella non è collegato al node.", + 'photosync.fail_not_member': "Backup delle foto interrotto: non sei più membro di questo gruppo.", + 'photosync.fail_permission': "Backup delle foto interrotto: MeshBay non ha più accesso alle foto.", + 'photosync.fail_other': "Backup delle foto interrotto.", + 'contactsync.heading': "Backup dei contatti", + 'contactsync.intro': "Invia una copia dei contatti di questo telefono una volta al giorno se sono cambiati. Ogni copia è un file .vcf che qualsiasi telefono può importare.", + 'contactsync.permission_needed': "MeshBay ha bisogno di accedere ai contatti di questo telefono.", + 'calendarsync.heading': "Backup del calendario", + 'calendarsync.intro': "Invia una copia dei calendari di questo telefono una volta al giorno se sono cambiati: quelli che puoi modificare, non quelli a cui sei solo iscritto. Ogni copia è un file .ics che qualsiasi calendario può importare.", + 'calendarsync.permission_needed': "MeshBay ha bisogno di accedere ai calendari di questo telefono.", + 'messagesync.heading': "Backup degli SMS", + 'messagesync.intro': "Invia gli SMS di questo telefono una volta al giorno: la prima copia li contiene tutti, le successive solo quelli nuovi. I file sono nel formato XML che le app di backup degli SMS sanno ripristinare. Gli MMS non sono inclusi.", + 'messagesync.permission_needed': "MeshBay ha bisogno di accedere agli SMS di questo telefono.", + 'messagesync.restricted_hint': "Se Android parla di un'impostazione con restrizioni: apri le impostazioni dell'app, tocca ⋮ in alto, «Consenti impostazioni con restrizioni», poi torna qui ad attivarlo. Android lo richiede alle app installate fuori da uno store.", + 'phonesync.state_sending': "Invio…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Copie inviate: {n}", + 'phonesync.last_file': "Ultima copia: {name}", + 'phonesync.checking_groups': "Ricerca dei gruppi di cui sei proprietario e unico membro…", + 'phonesync.no_private_group': "Non hai un gruppo di cui sei proprietario e unico membro. Creane uno solo per te, poi torna qui.", + 'phonesync.no_folder': "Questo gruppo non ha cartelle in cui puoi aggiungere file.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Interrotto: il disco del node è pieno.", + 'phonesync.fail_read_only': "Interrotto: la cartella non accetta più caricamenti.", + 'phonesync.fail_no_folder': "Interrotto: la cartella non esiste più nel gruppo.", + 'phonesync.fail_unavailable': "Interrotto: l'unità della cartella non è collegata al node.", + 'phonesync.fail_not_member': "Interrotto: non sei più membro di questo gruppo.", + 'phonesync.fail_not_private': "Interrotto: qualcun altro si è unito al gruppo.", + 'phonesync.fail_permission': "Interrotto: MeshBay non ha più accesso.", + 'phonesync.fail_other': "Interrotto.", + 'phonesync.open_settings': "Apri le impostazioni dell'app", + 'drivesync.heading': "Backup dei file", + 'drivesync.intro': "Invia i file delle cartelle che scegli su questo telefono, una volta al giorno, in Wi-Fi. Un file modificato sul telefono viene inviato di nuovo accanto alla copia precedente; non viene mai sostituito nulla.", + 'drivesync.folders': "Cartelle salvate", + 'drivesync.no_folders': "Nessuna cartella scelta per ora.", + 'drivesync.folders_hint': "Foto e video spettano al backup delle foto: DCIM, Pictures e Movies non si possono scegliere. Android non lascia che un'app prenda tutto Download, solo le cartelle al suo interno.", + 'drivesync.add_folder': "Aggiungi una cartella", + 'drivesync.remove': "Rimuovi", + 'drivesync.refused_media': "Questa cartella contiene foto e video, che invia il backup delle foto: scegline un'altra.", + 'drivesync.refused_root': "Android non permette di scegliere un'intera memoria: scegli una cartella al suo interno.", + 'drivesync.notif_progress': "Backup dei file: {done} / {total}", + 'drivesync.metered_confirm': "Stai usando i dati mobili. Inviare comunque i file?", + 'drivesync.sent_total': "File inviati: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Copia i backup delle chat creati da WhatsApp, una volta al giorno in Wi-Fi, per poterli ripristinare su un nuovo telefono. Restano cifrati da WhatsApp: qui non si possono leggere, solo ripristinare.", + 'whatsappsync.folder_needed': "La cartella di WhatsApp non è ancora scelta.", + 'whatsappsync.folder_chosen': "La cartella di WhatsApp è scelta.", + 'whatsappsync.folder_choose': "Scegli la cartella di WhatsApp", + 'whatsappsync.folder_hint': "Il selettore si apre su di essa: Android/media/com.whatsapp/WhatsApp. Premi «Usa questa cartella».", + 'whatsappsync.media': "Anche i media", + 'whatsappsync.media_hint': "Foto, video, note vocali e documenti ricevuti e inviati: spesso diversi gigabyte. Quelli che il backup delle foto invia già non partono due volte.", + 'whatsappsync.refused': "Questa non è la cartella di WhatsApp: scegli Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Per ripristinare su un nuovo telefono: copia le cartelle Databases e Backups dell'ultima copia in Android/media/com.whatsapp/WhatsApp prima di installare WhatsApp, poi ripristina con lo stesso numero (e la password o la chiave di 64 cifre se il backup crittografato end-to-end è attivo).", + 'whatsappsync.notif_progress': "Backup di WhatsApp: {done} / {total}", + 'androidsync.dest_heading': "Destinazione dei backup", + 'androidsync.dest_intro': "I backup vanno in una cartella di un gruppo di cui sei proprietario e unico membro. Ogni tipo di backup vi ha la sua cartella.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Cartelle usate: {dirs}", + 'androidsync.dest_change_confirm': "Tutti i backup ricominceranno in {folder} di {group}. Ciò che è già stato inviato resta dov'è.", + 'androidsync.dest_not_in_photos': "La scheda Foto del gruppo non mostra {dir}: le foto verranno salvate ma non mostrate lì finché la cartella non è tra quelle della scheda (impostazioni del gruppo).", + 'androidsync.dest_needed': "Scegli prima la destinazione dei backup, in cima a questa pagina.", + 'androidsync.dest_save': "Salva", + 'phonesync.turn_on': "Attiva", + 'photosync.fail_not_private': "Backup delle foto interrotto: qualcun altro si è unito al gruppo.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js index 9167efe..b5e091c 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js @@ -66,6 +66,7 @@ export default { 'register.submit': 'アカウントを作成', 'register.loading': 'アカウントを作成しています…', 'register.has_account': 'すでにアカウントをお持ちですか?', + 'register.legal_notice': "アカウントを作成すると、この hub の利用規約に同意したことになります。法律により、hub は接続ログ(IP アドレス、日時、操作)を、アカウント削除後も含めて 1 年間保存します。", 'register.login_link': 'ログイン', 'register.recovery_title': 'リカバリーキーを保存してください', 'register.recovery_intro': 'このキーは、パスフレーズを忘れた場合にグループの identity を復元します。パスワードマネージャーや安全な場所に保管してください。', @@ -123,6 +124,7 @@ export default { 'welcome.docs_devel': '開発者向け', 'welcome.docs_design': '設計', 'welcome.docs_protocol': 'プロトコル', + 'welcome.docs_api': 'API', 'welcome.download': 'ダウンロード(ベータ版)', 'welcome.legal': '法的情報', 'register.err_mismatch': 'パスワードが一致しません', @@ -206,6 +208,11 @@ export default { 'group.mkdir_prompt': '新しいフォルダー名', 'group.mkdir_offline': 'ノードに接続していません。', 'group.download_offline': 'ノードに接続していません — ダウンロードを開始できません。再接続は自動で行われます。少し待って再試行してください。', + 'group.link_unknown': "このリンクは、あなたがメンバーでないグループ、またはもうその名前ではないグループを指しています。", + 'group.link_path_unknown': "このグループの {path} には何もありません。ファイルが移動、名前変更、または削除された可能性があります。", + 'link.copy': "リンクをコピー", + 'link.copied': "リンクをコピーしました", + 'link.copy_failed': "コピーできませんでした。リンク: {url}", 'group.download_write_stalled': 'ファイルのディスクへの書き込みが止まりました({seconds} 秒間進みません)。ぶら下がったままにせず中止しました。もう一度お試しください。', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -273,6 +280,7 @@ export default { 'group.upload_indexing': 'インデックスを作成中…', 'video.err_transport': 'トランスポートが接続されていません', 'video.err_mse': 'ストリーミング再生に対応していないコーデックです:{codec}', + 'video.err_no_mse': 'このブラウザーは動画のストリーミング再生に対応していません(iPhone では iOS 17.1 以降が必要です)', 'video.mode_poster': 'ポスター表示', 'video.mode_flat': 'フラット表示', 'video.filter_all': 'All', @@ -369,10 +377,17 @@ export default { one: '{n}枚', other: '{n}枚', }, + 'photo.n_videos': { + one: "動画 {n} 本", + other: "動画 {n} 本", + }, + 'photo.play_video': "動画を再生", 'photo.back': '戻る', 'photo.prev': '前へ(←)', 'photo.next': '次へ(→)', 'photo.zip_album': 'アルバムをzipでダウンロード', + 'photo.slideshow': 'スライドショー', + 'photo.slideshow_stop': 'スライドショーを停止', 'photo.zoom_in': '拡大', 'photo.zoom_out': '縮小', 'photo.zoom_fit_title': 'ウィンドウに合わせる', @@ -386,6 +401,13 @@ export default { 'cast.copied': 'URLをコピーしました', 'cast.scanning': 'デバイスを検索中…', 'cast.no_devices': 'デバイスが見つかりません', + 'cast.casting_to': 'キャスト先', + 'cast.seek': '再生位置', + 'cast.waiting': 'テレビを待っています…', + 'cast.back30': '30秒戻る', + 'cast.fwd30': '30秒進む', + 'cast.play': '再生', + 'cast.pause': '一時停止', // Settings 'settings.title': '設定', @@ -416,6 +438,15 @@ export default { 'settings.email_verified': 'メールアドレスが正常に変更されました。', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'この端末の通知', + 'settings.push_off': 'オフ。オンにすると、MeshBay を閉じていても新着メッセージや招待が通知されます。', + 'settings.push_pending': 'ディストリビューターの応答を待っています…', + 'settings.push_blocked': 'Android が MeshBay の通知をブロックしています。システム設定で許可してください。', + 'settings.push_ready': 'オン。新しい通知はディストリビューター経由でこの端末に届きます。暗号化されているため、ディストリビューターは内容を読めません。', + 'settings.push_poll': 'オン。この端末は約15分ごとに新しい通知を確認します。すぐに受け取りたい場合は、ntfy などの UnifiedPush ディストリビューターアプリをインストールできます(任意)。', + 'settings.push_global_off': 'すべての通知がオフの間は何も送信されません。', + 'push.channel_chat': 'メッセージ', + 'push.channel_other': '招待とアカウント', 'settings.defaults': 'デフォルト', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -487,12 +518,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -510,12 +540,14 @@ export default { 'settings.node_key_placeholder': 'node の Ed25519 公開鍵を貼り付け(base64)', 'settings.node_key_submit': 'node を連携', 'settings.node_key_success': 'node を連携しました', + 'settings.node_key_unlink': "リンク解除", + 'settings.node_key_unlink_confirm': "アカウントからノードのリンクを解除しますか?再びノードがリンクされるまで、グループを提供しなくなります。", + 'settings.node_key_unlinked': "ノードのリンクを解除しました", 'settings.node_key_current': '連携済みの node 鍵', // Sidebar 'sidebar.create_group': 'グループを作成', 'sidebar.settings': '設定', - 'sidebar.admin': '管理', // User menu 'usermenu.language': '言語', @@ -749,6 +781,7 @@ export default { 'transfers.eta_minutes': '残り {n} 分', 'transfers.eta_hours': '残り {n} 時間', 'transfers.failed': '失敗', + 'transfers.disk_full': 'node のディスクがいっぱいです', 'group.select': '選択', 'group.select_done': '完了', 'group.actions': '操作({n})', @@ -830,6 +863,7 @@ export default { 'indexdock.next_count': "待機中: {count}", 'indexdock.open': "このグループの設定を開く", 'indexdock.hide': "次のインデックスまで隠す", + 'indexdock.pause': "このフォルダーのインデックス作成を一時停止", 'chat.load_older': '以前のメッセージを {n} 件読み込む', 'chat.start_of_history': '会話のはじまり', 'chat.today': '今日', @@ -876,7 +910,7 @@ export default { 'lazy.reload': 'ページを再読み込み', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -901,6 +935,7 @@ export default { 'node.startup_mode_service': 'バックグラウンドサービスとして(起動時に開始)', 'node.startup_mode_updating': 'モードを切り替え中 — 管理者の確認ダイアログをご確認ください…', 'node.startup_mode_service_unavailable_hint': 'バックグラウンドサービスモードにはインストール済みのビルドが必要です。ローカルでテストする場合は、管理者権限の PowerShell で "meshbay-node service install" を実行してください。', + 'node.startup_mode_service_store_hint': 'サインイン前の起動時に開始するには、Microsoft Store 版ではなく MeshBay インストーラー (.exe) が必要です。', 'node.not_operator': 'node に接続できませんでした。node が実行中であることをご確認ください。', 'node.offline': 'Node はオフラインです', 'node.retry': '再試行', @@ -908,6 +943,13 @@ export default { 'node.pair_code_placeholder': 'ペアリングコード', 'node.pair_button': 'このブラウザをペアリング', 'node.pair_success': 'ペアリングに成功しました。', + 'node.pair_pending': 'ペアリングコードの準備ができました。この Node のグループを次に開いたときに使用されます。', + 'node.link_other_node': "アカウントは別のマシンのノードにリンクされているため、このノードではグループを提供できません。", + 'node.link_here': "代わりにこのノードをリンク", + 'node.link_here_confirm': "このノードをアカウントにリンクしますか?現在リンクされている別のマシンのノードは、再びリンクされるまでグループを提供しなくなります。", + 'node.link_other_account': "このノードはあなたではなく {account} 用に設定されているため、グループを提供できません。", + 'node.link_take_over': "このノードを自分のアカウントで使う", + 'node.link_linking': "リンク中…", 'node.reload': '設定を再読み込み', 'node.reloaded': '設定を再読み込みしました。既存グループのルート変更が反映されました。', 'node.restart_needed': '追加後、グループ鍵を初期化してください(meshbay-node gek-init --group <name>)。', @@ -926,6 +968,8 @@ export default { 'node.setting_max_uploads': '同時アップロードの上限', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': '1ファイルあたりの上限', + 'node.setting_connection_processes': '接続に使う CPU コア数', + 'node.setting_unit_of': '/ {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -943,6 +987,9 @@ export default { 'node.remove_root': '削除', 'node.root_no_signing_key': '署名鍵がありません — 先にこの端末をノードとペアリングしてください', 'node.root_no_route': 'ノードへの経路がありません — 接続するか、ノードを動かしているマシンでアプリを使ってください', + 'node.root_pause': "インデックス作成を一時停止", + 'node.root_resume': "インデックス作成を再開", + 'node.root_paused': "インデックス作成を一時停止中", 'node.root_remove_last': 'グループには少なくとも 1 つのディレクトリが必要です', 'node.root_path': 'パス', 'node.directory': 'ディレクトリ', @@ -1066,6 +1113,8 @@ export default { 'settings_app.chat_encrypted_always': 'このグループのチャットは常に暗号化されています。無効にはできません。', 'settings_app.chat_rotate_epoch': 'チャット鍵を更新する', 'settings_app.chat_rotate_epoch_hint': 'メンバーは履歴全体を引き続き読めます。グループから外された相手は、これ以降に書かれた内容を読めません。メンバーや端末を削除すると、これは自動的に行われます。', + 'settings_app.chat_purge': 'チャットを消去する', + 'settings_app.chat_purge_hint': 'このノードに保存されたこのグループのチャットのメッセージを、全メンバー分すべて削除します。添付ファイルはフォルダーに残ります。元に戻せません。', 'settings_app.tmdb_token_prompt': 'TMDB に登録して、自分の API キーを発行してください。', 'settings_app.tmdb_token_link': 'キーを取得', 'settings_node.roots_offline_hint': 'ノードに接続していません — 変更はローカルノード経由で行われ、次回の再読み込みで反映されます。', @@ -1220,6 +1269,7 @@ export default { 'home.accept': "承諾", 'home.decline': "辞退", 'members.invited': "招待中", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "ホスト", 'hosts.hint': "あなた自身の node は確認なしでこのグループを提供します。他の node は、ここで承認した後にのみ提供します。申請した node は下に表示されます。", 'hosts.none': "このグループのホストを申請した node は他にありません。", @@ -1245,4 +1295,114 @@ export default { 'native.node_account_confirm': 'このコンピューターの node は {current} 用に設定されています。代わりに {next} 用に設定しますか?{current} のためにホストしているグループは提供されなくなります。', 'native.browser_access_confirm': 'ブラウザーからのサインインを許可しますか?アプリは、利用中のすべての node にあなたの ID を残します。これは、パスフレーズと hub のアカウントの両方がそろった場合にのみ開けるよう封印されます。', 'native.declined': 'キャンセルしました。何も変更されていません。', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "写真のバックアップ", + 'photosync.intro': "この電話で撮った写真を、1 日 1 回 Wi-Fi で、グループのいずれかのフォルダーに送ります。電話から削除した写真はグループに残ります。", + 'photosync.setup': "設定する", + 'photosync.change': "変更", + 'photosync.turn_off': "オフにする", + 'photosync.now': "今すぐバックアップ", + 'photosync.permission_needed': "MeshBay がこの電話の写真にアクセスする必要があります。", + 'photosync.permission_allow': "アクセスを許可", + 'photosync.permission_partial': "アクセスは選択した写真に限られています。すべての写真へのアクセスを許可するまで、新しい写真はバックアップされません。", + 'photosync.group': "グループ", + 'photosync.choose_group': "グループを選択", + 'photosync.checking_group': "グループのフォルダーを確認しています…", + 'photosync.group_offline': "このグループをホストしている node は現在オンラインではありません。オンラインになってから再度お試しください。", + 'photosync.folder': "フォルダー", + 'photosync.albums': "この電話のアルバム", + 'photosync.album_camera': "カメラ", + 'photosync.album_count': "{n} 枚 · {size}", + 'photosync.videos_not_included': "動画はバックアップされていません。追加するには「変更」を押してください。", + 'photosync.videos_included': "動画もバックアップされます。", + 'photosync.include_videos': "動画も含める", + 'photosync.include_videos_hint': "動画はサイズが大きいため、写真と同じく Wi-Fi で送信され、最初のバックアップには時間がかかることがあります。", + 'photosync.album_count_videos': "写真 {n} 枚、動画 {v} 本 · {size}", + 'photosync.confirm_videos': "写真と動画 {count} 件 ({size}、うち動画 {videos} 本 {videoSize}) を {dir} に送り、その後は新しいものを1日1回送ります。", + 'photosync.video_permission_needed': "MeshBay にこのスマートフォンの動画へのアクセスも許可してください。", + 'photosync.scope_existing': "この電話にすでにある写真と、これからの写真", + 'photosync.scope_new': "これから撮る写真のみ", + 'photosync.start': "バックアップを開始", + 'photosync.confirm': "{count} 枚の写真 ({size}) を {dir} に送り、その後は新しい写真を1日1回送ります。", + 'photosync.confirm_new': "新しい写真を1日1回 {dir} に送ります。", + 'photosync.metered_confirm': "モバイルデータ通信中です — {count} 枚、{size}。それでも送信しますか?", + 'photosync.other_account': "@{account} 用に設定されています。続けるには @{account} でサインインするか、ここで設定し直してください。", + 'photosync.sent_total': "送信済みの写真: {n}", + 'photosync.last_run': "前回のバックアップ: {when}", + 'photosync.never': "まだバックアップしていません", + 'photosync.state_waiting_wifi': "Wi-Fi を待っています", + 'photosync.state_connecting': "グループに接続しています…", + 'photosync.state_sending': "送信中 {done} / {total}", + 'photosync.state_offline': "グループの node がオンラインではありません。後で再試行します", + 'photosync.state_interrupted': "中断しました — 次の機会に続行します", + 'photosync.state_up_to_date': "最新です", + 'photosync.notif_progress': "写真をバックアップ中 — {done} / {total}", + 'photosync.fail_disk_full': "写真のバックアップを停止しました: node のディスクがいっぱいです。", + 'photosync.fail_read_only': "写真のバックアップを停止しました: フォルダーがアップロードを受け付けなくなりました。", + 'photosync.fail_no_folder': "写真のバックアップを停止しました: フォルダーがグループに存在しなくなりました。", + 'photosync.fail_unavailable': "写真のバックアップを停止しました: フォルダーのドライブが node に接続されていません。", + 'photosync.fail_not_member': "写真のバックアップを停止しました: このグループのメンバーではなくなりました。", + 'photosync.fail_permission': "写真のバックアップを停止しました: MeshBay が写真にアクセスできなくなりました。", + 'photosync.fail_other': "写真のバックアップを停止しました。", + 'contactsync.heading': "連絡先のバックアップ", + 'contactsync.intro': "このスマートフォンの連絡先のコピーを、変更があった日に1日1回送ります。各コピーはどのスマートフォンでも読み込める .vcf ファイルです。", + 'contactsync.permission_needed': "MeshBay にこのスマートフォンの連絡先へのアクセスを許可してください。", + 'calendarsync.heading': "カレンダーのバックアップ", + 'calendarsync.intro': "このスマートフォンのカレンダーのコピーを、変更があった日に1日1回送ります。対象は編集できるカレンダーで、購読しているだけのものは含みません。各コピーはどのカレンダーでも読み込める .ics ファイルです。", + 'calendarsync.permission_needed': "MeshBay にこのスマートフォンのカレンダーへのアクセスを許可してください。", + 'messagesync.heading': "SMS のバックアップ", + 'messagesync.intro': "このスマートフォンの SMS を1日1回送ります。最初のコピーにはすべてが含まれ、以降は新しいものだけが含まれます。ファイルは SMS バックアップアプリで復元できる XML 形式です。MMS は含まれません。", + 'messagesync.permission_needed': "MeshBay にこのスマートフォンの SMS へのアクセスを許可してください。", + 'messagesync.restricted_hint': "Android が制限付き設定と表示した場合は、アプリの設定を開き、上部の ⋮ から「制限付き設定を許可」を選び、ここに戻ってもう一度オンにしてください。ストア以外からインストールしたアプリには Android がこれを求めます。", + 'phonesync.state_sending': "送信中…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "送信したコピー: {n}", + 'phonesync.last_file': "最後のコピー: {name}", + 'phonesync.checking_groups': "あなたが所有者で唯一のメンバーのグループを探しています…", + 'phonesync.no_private_group': "あなたが所有者で唯一のメンバーのグループがありません。自分専用のグループを作成してから、ここに戻ってください。", + 'phonesync.no_folder': "このグループには、ファイルを追加できるフォルダーがありません。", + 'phonesync.notice': "{what}。{reason}", + 'phonesync.fail_disk_full': "停止しました: node のディスクがいっぱいです。", + 'phonesync.fail_read_only': "停止しました: フォルダーがアップロードを受け付けなくなりました。", + 'phonesync.fail_no_folder': "停止しました: フォルダーがグループにもうありません。", + 'phonesync.fail_unavailable': "停止しました: フォルダーのドライブが node に接続されていません。", + 'phonesync.fail_not_member': "停止しました: このグループのメンバーではなくなりました。", + 'phonesync.fail_not_private': "停止しました: 他の人がグループに参加しました。", + 'phonesync.fail_permission': "停止しました: MeshBay はアクセスできなくなりました。", + 'phonesync.fail_other': "停止しました。", + 'phonesync.open_settings': "アプリの設定を開く", + 'drivesync.heading': "ファイルのバックアップ", + 'drivesync.intro': "このスマートフォンで選んだフォルダーのファイルを、1日1回 Wi-Fi で送ります。スマートフォンで変更したファイルは、以前のコピーの横にもう一度送られます。何も置き換えられません。", + 'drivesync.folders': "バックアップするフォルダー", + 'drivesync.no_folders': "まだフォルダーが選ばれていません。", + 'drivesync.folders_hint': "写真と動画は写真のバックアップが扱います。DCIM、Pictures、Movies は選べません。Android ではアプリが Download 全体を選ぶことはできず、その中のフォルダーだけを選べます。", + 'drivesync.add_folder': "フォルダーを追加", + 'drivesync.remove': "削除", + 'drivesync.refused_media': "このフォルダーには写真のバックアップが送る写真や動画が入っています。別のフォルダーを選んでください。", + 'drivesync.refused_root': "Android ではストレージ全体を選べません。その中のフォルダーを選んでください。", + 'drivesync.notif_progress': "ファイルをバックアップ中: {done} / {total}", + 'drivesync.metered_confirm': "モバイルデータ通信中です。それでもファイルを送りますか?", + 'drivesync.sent_total': "送信したファイル: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "WhatsApp が作成するチャットのバックアップを1日1回 Wi-Fi でコピーし、新しいスマートフォンで復元できるようにします。WhatsApp による暗号化はそのままで、ここでは読めず、復元だけができます。", + 'whatsappsync.folder_needed': "WhatsApp のフォルダーはまだ選ばれていません。", + 'whatsappsync.folder_chosen': "WhatsApp のフォルダーが選ばれています。", + 'whatsappsync.folder_choose': "WhatsApp のフォルダーを選ぶ", + 'whatsappsync.folder_hint': "選択画面はそのフォルダーで開きます: Android/media/com.whatsapp/WhatsApp。「このフォルダを使用」を押してください。", + 'whatsappsync.media': "メディアも含める", + 'whatsappsync.media_hint': "送受信した写真、動画、ボイスメッセージ、ドキュメント。数ギガバイトになることもあります。写真のバックアップがすでに送っているものは二重に送りません。", + 'whatsappsync.refused': "これは WhatsApp のフォルダーではありません。Android/media/com.whatsapp/WhatsApp を選んでください。", + 'whatsappsync.restore_hint': "新しいスマートフォンで復元するには、WhatsApp をインストールする前に、最新のコピーの Databases と Backups フォルダーを Android/media/com.whatsapp/WhatsApp にコピーし、同じ電話番号で復元します (エンドツーエンド暗号化バックアップが有効な場合はパスワードか 64 桁の暗号鍵も必要です)。", + 'whatsappsync.notif_progress': "WhatsApp をバックアップ中: {done} / {total}", + 'androidsync.dest_heading': "バックアップの保存先", + 'androidsync.dest_intro': "バックアップは、あなたが所有者で唯一のメンバーであるグループのフォルダーに保存されます。バックアップの種類ごとに専用のフォルダーが作られます。", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "使用するフォルダー: {dirs}", + 'androidsync.dest_change_confirm': "すべてのバックアップが {group} の {folder} で最初からやり直されます。送信済みのものはそのまま残ります。", + 'androidsync.dest_not_in_photos': "グループの写真タブには {dir} が表示されません。写真はバックアップされますが、このフォルダーがタブのフォルダーに含まれるまで (グループ設定) そこには表示されません。", + 'androidsync.dest_needed': "まず、このページの上部でバックアップの保存先を選んでください。", + 'androidsync.dest_save': "保存", + 'phonesync.turn_on': "オンにする", + 'photosync.fail_not_private': "写真のバックアップを停止しました: 他の人がグループに参加しました。", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js index 4845c03..86e01a2 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js @@ -66,6 +66,7 @@ export default { 'register.submit': 'Account aanmaken', 'register.loading': 'Account wordt aangemaakt...', 'register.has_account': 'Hebt u al een account?', + 'register.legal_notice': "Door een account aan te maken, aanvaardt u de gebruiksvoorwaarden van deze hub. De wet verplicht hem een logboek van uw verbindingen (IP-adres, datum, handeling) een jaar lang te bewaren, ook nadat uw account is verwijderd.", 'register.login_link': 'Aanmelden', 'register.recovery_title': 'Bewaar uw herstelsleutel', 'register.recovery_intro': 'Deze sleutel herstelt uw groepsidentiteiten als u ooit uw wachtwoordzin vergeet. Bewaar hem in een wachtwoordmanager of op een veilige plek.', @@ -123,6 +124,7 @@ export default { 'welcome.docs_devel': 'Ontwikkelaarsdocs', 'welcome.docs_design': 'Ontwerp', 'welcome.docs_protocol': 'Protocol', + 'welcome.docs_api': 'API', 'welcome.download': 'Downloaden (bèta)', 'welcome.legal': 'Juridische informatie', 'register.err_mismatch': 'De wachtwoorden komen niet overeen', @@ -209,6 +211,11 @@ export default { 'group.mkdir_prompt': 'Naam van de nieuwe map', 'group.mkdir_offline': 'Niet verbonden met de node.', 'group.download_offline': 'Geen verbinding met de node — de download kan niet starten. Er wordt automatisch opnieuw verbonden; probeer het zo weer.', + 'group.link_unknown': "Deze link verwijst naar een groep waarvan je geen lid bent, of die niet meer zo heet.", + 'group.link_path_unknown': "Er staat niets op {path} in deze groep — het bestand is misschien verplaatst, hernoemd of verwijderd.", + 'link.copy': "Link kopiëren", + 'link.copied': "Link gekopieerd", + 'link.copy_failed': "Kopiëren mislukt — de link is {url}", 'group.download_write_stalled': 'Het bestand wordt niet meer naar schijf geschreven ({seconds} s zonder voortgang). De download is gestopt in plaats van te blijven hangen; probeer het opnieuw.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -277,6 +284,7 @@ export default { 'group.upload_indexing': 'indexeren…', 'video.err_transport': 'Transport niet verbonden', 'video.err_mse': 'Codec wordt niet ondersteund voor streamen: {codec}', + 'video.err_no_mse': 'Deze browser kan geen video streamen (een iPhone heeft iOS 17.1 of nieuwer nodig)', 'video.mode_poster': 'Posters', 'video.mode_flat': 'Platte lijst', 'video.filter_all': 'All', @@ -373,10 +381,17 @@ export default { one: '{n} foto', other: "{n} foto's", }, + 'photo.n_videos': { + one: "{n} video", + other: "{n} video's", + }, + 'photo.play_video': "Video afspelen", 'photo.back': 'Terug', 'photo.prev': 'Vorige (←)', 'photo.next': 'Volgende (→)', 'photo.zip_album': 'Album downloaden als zip', + 'photo.slideshow': 'Diavoorstelling', + 'photo.slideshow_stop': 'Diavoorstelling stoppen', 'photo.zoom_in': 'Inzoomen', 'photo.zoom_out': 'Uitzoomen', 'photo.zoom_fit_title': 'Passend maken', @@ -390,6 +405,13 @@ export default { 'cast.copied': 'URL gekopieerd', 'cast.scanning': 'Apparaten zoeken…', 'cast.no_devices': 'Geen apparaten gevonden', + 'cast.casting_to': 'Casten naar', + 'cast.seek': 'Positie in de film', + 'cast.waiting': 'Wachten op de televisie…', + 'cast.back30': '30 seconden terug', + 'cast.fwd30': '30 seconden vooruit', + 'cast.play': 'Afspelen', + 'cast.pause': 'Pauzeren', // Settings 'settings.title': 'Instellingen', @@ -420,6 +442,15 @@ export default { 'settings.email_verified': 'E-mailadres succesvol gewijzigd.', 'settings.notif_global_disable': 'Alle meldingen uitschakelen', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.push_label': 'Meldingen op deze telefoon', + 'settings.push_off': 'Uit. Zet aan om over nieuwe berichten en uitnodigingen te horen terwijl MeshBay gesloten is.', + 'settings.push_pending': 'Wachten op het antwoord van de distributor…', + 'settings.push_blocked': 'Android blokkeert de meldingen van MeshBay: sta ze toe in de systeeminstellingen.', + 'settings.push_ready': 'Aan. Nieuwe meldingen bereiken deze telefoon via de distributor, versleuteld zodat die ze niet kan lezen.', + 'settings.push_poll': 'Aan. Deze telefoon kijkt ongeveer elk kwartier of er nieuwe meldingen zijn. Wil je ze meteen ontvangen, installeer dan een UnifiedPush-distributor-app zoals ntfy (optioneel).', + 'settings.push_global_off': 'Er wordt niets verzonden zolang alle meldingen uit staan.', + 'push.channel_chat': 'Berichten', + 'push.channel_other': 'Uitnodigingen en account', 'settings.defaults': 'Standaardwaarden', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -494,12 +525,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -517,12 +547,14 @@ export default { 'settings.node_key_placeholder': 'Plak de openbare Ed25519-sleutel van de node (base64)', 'settings.node_key_submit': 'Node koppelen', 'settings.node_key_success': 'Node gekoppeld', + 'settings.node_key_unlink': "Ontkoppelen", + 'settings.node_key_unlink_confirm': "De node van je account ontkoppelen? Hij bedient je groepen niet meer tot er weer een node is gekoppeld.", + 'settings.node_key_unlinked': "Node ontkoppeld", 'settings.node_key_current': 'Sleutel van de gekoppelde node', // Sidebar 'sidebar.create_group': 'Groep aanmaken', 'sidebar.settings': 'Instellingen', - 'sidebar.admin': 'Beheer', // User menu 'usermenu.language': 'Taal', @@ -758,6 +790,7 @@ export default { 'transfers.eta_minutes': 'nog {n} min', 'transfers.eta_hours': 'nog {n} u', 'transfers.failed': 'Mislukt', + 'transfers.disk_full': 'De schijf van de node is vol', 'group.select': 'Selecteren', 'group.select_done': 'Klaar', 'group.actions': 'Acties ({n})', @@ -844,6 +877,7 @@ export default { 'indexdock.next_count': "Wachtend: {count}", 'indexdock.open': "Instellingen van deze groep openen", 'indexdock.hide': "Verbergen tot de volgende indexering", + 'indexdock.pause': "Indexeren van deze map pauzeren", 'chat.load_older': '{n} oudere berichten laden', 'chat.start_of_history': 'Begin van het gesprek', 'chat.today': 'Vandaag', @@ -890,7 +924,7 @@ export default { 'lazy.reload': 'Pagina opnieuw laden', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -915,6 +949,7 @@ export default { 'node.startup_mode_service': 'Als achtergrondservice (start bij het opstarten)', 'node.startup_mode_updating': 'Modus wijzigen — let op een beheerdersprompt…', 'node.startup_mode_service_unavailable_hint': 'Achtergrondservice-modus vereist een geïnstalleerde build. Voer voor lokaal testen "meshbay-node service install" uit vanuit een PowerShell met beheerdersrechten.', + 'node.startup_mode_service_store_hint': 'Starten bij het opstarten, voordat iemand zich aanmeldt, vereist het MeshBay-installatieprogramma (.exe) in plaats van de Microsoft Store-versie.', 'node.not_operator': 'Uw node is niet bereikbaar. Controleer of hij draait.', 'node.offline': 'Node is offline', 'node.retry': 'Opnieuw proberen', @@ -922,6 +957,13 @@ export default { 'node.pair_code_placeholder': 'Koppelingscode', 'node.pair_button': 'Deze browser koppelen', 'node.pair_success': 'Succesvol gekoppeld.', + 'node.pair_pending': 'Koppelingscode klaar: die wordt gebruikt zodra u een van de groepen van deze Node opent.', + 'node.link_other_node': "Je account is gekoppeld aan de node van een andere computer, dus deze node kan je groepen niet bedienen.", + 'node.link_here': "Koppel in plaats daarvan deze node", + 'node.link_here_confirm': "Deze node aan je account koppelen? De nu gekoppelde node op een andere computer bedient je groepen niet meer tot hij opnieuw wordt gekoppeld.", + 'node.link_other_account': "Deze node is ingesteld voor {account}, niet voor jou, dus hij kan je groepen niet bedienen.", + 'node.link_take_over': "Deze node voor mijn account gebruiken", + 'node.link_linking': "Koppelen…", 'node.reload': 'Configuratie herladen', 'node.reloaded': 'Configuratie herladen. Mapwijzigingen op bestaande groepen zijn nu actief.', 'node.restart_needed': 'Na het toevoegen: initialiseer de groepssleutel (meshbay-node gek-init --group <naam>).', @@ -940,6 +982,8 @@ export default { 'node.setting_max_uploads': 'Max. gelijktijdige uploads', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Grootste enkele upload', + 'node.setting_connection_processes': 'CPU-kernen voor verbindingen', + 'node.setting_unit_of': 'van {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -959,6 +1003,9 @@ export default { 'node.remove_root': 'Verwijderen', 'node.root_no_signing_key': 'Geen ondertekeningssleutel beschikbaar — koppel dit apparaat eerst aan de node', 'node.root_no_route': 'Geen route naar de node — maak verbinding, of gebruik de app op de machine die hem host', + 'node.root_pause': "Indexeren pauzeren", + 'node.root_resume': "Indexeren hervatten", + 'node.root_paused': "indexeren gepauzeerd", 'node.root_remove_last': 'Een groep heeft minstens één map nodig', 'node.root_path': 'Pad', 'node.directory': 'Map', @@ -1084,6 +1131,8 @@ export default { 'settings_app.chat_encrypted_always': 'De chat van deze groep is altijd versleuteld. Dit kan niet worden uitgezet.', 'settings_app.chat_rotate_epoch': 'Chatsleutel doordraaien', 'settings_app.chat_rotate_epoch_hint': 'Leden blijven de hele geschiedenis lezen. Wie uit de groep is verwijderd, kan niet lezen wat er vanaf nu wordt geschreven. Een lid of apparaat verwijderen doet dit al vanzelf.', + 'settings_app.chat_purge': 'Chat leegmaken', + 'settings_app.chat_purge_hint': 'Verwijdert alle berichten in de chat van deze groep op deze node, voor alle leden. Bijlagen blijven in hun map. Dit kan niet ongedaan worden gemaakt.', 'settings_app.tmdb_token_prompt': 'Meld u aan bij TMDB om uw eigen API-sleutel te maken.', 'settings_app.tmdb_token_link': 'Sleutel ophalen', 'settings_node.roots_offline_hint': 'Niet verbonden met de node — wijzigingen gaan via de lokale node en worden bij de volgende herlaadbeurt actief.', @@ -1238,6 +1287,7 @@ export default { 'home.accept': "Accepteren", 'home.decline': "Weigeren", 'members.invited': "uitgenodigd", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Hosts", 'hosts.hint': "Uw eigen nodes bedienen deze groep zonder te vragen. Een andere node doet dat pas nadat u hem hier goedkeurt; een node die erom vraagt, staat hieronder.", 'hosts.none': "Geen andere node heeft gevraagd deze groep te hosten.", @@ -1263,4 +1313,114 @@ export default { 'native.node_account_confirm': 'De node op deze computer is ingesteld voor {current}. In plaats daarvan instellen voor {next}? Hij stopt dan met het aanbieden van de groepen die hij voor {current} host.', 'native.browser_access_confirm': 'Aanmelden vanuit een browser toestaan? De toepassing laat je identiteit achter op elke node die je gebruikt, zo verzegeld dat alleen je wachtzin samen met je hub-account haar kan openen.', 'native.declined': 'Geannuleerd — er is niets gewijzigd.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Fotoback-up", + 'photosync.intro': "Stuur de foto's die met deze telefoon zijn gemaakt eenmaal per dag via wifi naar een map van een van je groepen. Foto's die van de telefoon worden verwijderd, blijven in de groep.", + 'photosync.setup': "Instellen", + 'photosync.change': "Wijzigen", + 'photosync.turn_off': "Uitschakelen", + 'photosync.now': "Nu back-uppen", + 'photosync.permission_needed': "MeshBay heeft toegang nodig tot de foto's op deze telefoon.", + 'photosync.permission_allow': "Toegang toestaan", + 'photosync.permission_partial': "De toegang is beperkt tot de foto's die je hebt geselecteerd: nieuwe foto's worden pas geback-upt als je toegang tot alle foto's toestaat.", + 'photosync.group': "Groep", + 'photosync.choose_group': "Kies een groep", + 'photosync.checking_group': "Mappen van de groep worden gelezen…", + 'photosync.group_offline': "Er is nu geen node online die deze groep host. Probeer het opnieuw als dat wel zo is.", + 'photosync.folder': "Map", + 'photosync.albums': "Albums op deze telefoon", + 'photosync.album_camera': "Camera", + 'photosync.album_count': "{n} foto's · {size}", + 'photosync.videos_not_included': "Video's worden niet geback-upt: ‘Wijzigen’ om ze toe te voegen.", + 'photosync.videos_included': "Video's worden ook geback-upt.", + 'photosync.include_videos': "Ook video's", + 'photosync.include_videos_hint': "Video's zijn groot: ze gaan net als foto's via wifi, en de eerste back-up kan even duren.", + 'photosync.album_count_videos': "{n} foto's, {v} video's · {size}", + 'photosync.confirm_videos': "{count} foto's en video's ({size}), waarvan {videos} video's ({videoSize}), worden naar {dir} gestuurd, daarna eenmaal per dag de nieuwe.", + 'photosync.video_permission_needed': "MeshBay heeft ook toegang nodig tot de video's op deze telefoon.", + 'photosync.scope_existing': "De foto's die al op deze telefoon staan, daarna nieuwe", + 'photosync.scope_new': "Alleen foto's die vanaf nu worden gemaakt", + 'photosync.start': "Back-up starten", + 'photosync.confirm': "{count} foto's ({size}) worden naar {dir} gestuurd, daarna eenmaal per dag de nieuwe.", + 'photosync.confirm_new': "Nieuwe foto's worden eenmaal per dag naar {dir} gestuurd.", + 'photosync.metered_confirm': "Je gebruikt mobiele data — {count} foto's, {size}. Toch versturen?", + 'photosync.other_account': "Ingesteld voor @{account}. Log in als @{account} om verder te gaan, of stel het hier opnieuw in.", + 'photosync.sent_total': "Verstuurde foto's: {n}", + 'photosync.last_run': "Laatste back-up: {when}", + 'photosync.never': "Nog geen back-up", + 'photosync.state_waiting_wifi': "Wacht op wifi", + 'photosync.state_connecting': "Verbinden met de groep…", + 'photosync.state_sending': "Versturen {done} / {total}", + 'photosync.state_offline': "Geen node van de groep is online; later nieuwe poging", + 'photosync.state_interrupted': "Onderbroken — gaat bij de volgende gelegenheid verder", + 'photosync.state_up_to_date': "Bijgewerkt", + 'photosync.notif_progress': "Foto's back-uppen — {done} / {total}", + 'photosync.fail_disk_full': "Fotoback-up gestopt: de schijf van de node is vol.", + 'photosync.fail_read_only': "Fotoback-up gestopt: de map accepteert geen uploads meer.", + 'photosync.fail_no_folder': "Fotoback-up gestopt: de map bestaat niet meer in de groep.", + 'photosync.fail_unavailable': "Fotoback-up gestopt: de schijf van de map is niet aangesloten op de node.", + 'photosync.fail_not_member': "Fotoback-up gestopt: je bent geen lid meer van deze groep.", + 'photosync.fail_permission': "Fotoback-up gestopt: MeshBay heeft geen toegang meer tot de foto's.", + 'photosync.fail_other': "Fotoback-up gestopt.", + 'contactsync.heading': "Back-up van contacten", + 'contactsync.intro': "Stuur eenmaal per dag, als ze veranderd zijn, een kopie van de contacten op deze telefoon. Elke kopie is een .vcf-bestand dat elke telefoon kan importeren.", + 'contactsync.permission_needed': "MeshBay heeft toegang nodig tot de contacten op deze telefoon.", + 'calendarsync.heading': "Back-up van de agenda", + 'calendarsync.intro': "Stuur eenmaal per dag, als ze veranderd zijn, een kopie van de agenda's op deze telefoon: de agenda's die je kunt bewerken, niet de agenda's waarop je alleen geabonneerd bent. Elke kopie is een .ics-bestand dat elke agenda kan importeren.", + 'calendarsync.permission_needed': "MeshBay heeft toegang nodig tot de agenda's op deze telefoon.", + 'messagesync.heading': "Back-up van sms'jes", + 'messagesync.intro': "Stuur de sms'jes op deze telefoon eenmaal per dag: de eerste kopie bevat ze allemaal, elke volgende alleen de nieuwe. De bestanden zijn in het XML-formaat dat sms-back-upapps kunnen terugzetten. Mms'jes zijn niet inbegrepen.", + 'messagesync.permission_needed': "MeshBay heeft toegang nodig tot de sms'jes op deze telefoon.", + 'messagesync.restricted_hint': "Als Android het over een beperkte instelling heeft: open de instellingen van de app, tik bovenaan op ⋮, ‘Beperkte instellingen toestaan’, en zet het daarna hier weer aan. Android vraagt dit van apps die buiten een winkel zijn geïnstalleerd.", + 'phonesync.state_sending': "Bezig met verzenden…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Verzonden kopieën: {n}", + 'phonesync.last_file': "Laatste kopie: {name}", + 'phonesync.checking_groups': "Zoeken naar groepen waarvan jij eigenaar en het enige lid bent…", + 'phonesync.no_private_group': "Je hebt geen groep waarvan jij eigenaar en het enige lid bent. Maak er een alleen voor jezelf en kom dan hier terug.", + 'phonesync.no_folder': "Deze groep heeft geen map waaraan je bestanden kunt toevoegen.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Gestopt: de schijf van de node is vol.", + 'phonesync.fail_read_only': "Gestopt: de map accepteert geen uploads meer.", + 'phonesync.fail_no_folder': "Gestopt: de map bestaat niet meer in de groep.", + 'phonesync.fail_unavailable': "Gestopt: de schijf van de map is niet aangesloten op de node.", + 'phonesync.fail_not_member': "Gestopt: je bent geen lid meer van deze groep.", + 'phonesync.fail_not_private': "Gestopt: iemand anders is lid geworden van de groep.", + 'phonesync.fail_permission': "Gestopt: MeshBay heeft geen toegang meer.", + 'phonesync.fail_other': "Gestopt.", + 'phonesync.open_settings': "Instellingen van de app openen", + 'drivesync.heading': "Back-up van bestanden", + 'drivesync.intro': "Stuur de bestanden van mappen die je op deze telefoon kiest, eenmaal per dag, via wifi. Een bestand dat op de telefoon is gewijzigd, wordt opnieuw verstuurd naast de eerdere kopie; er wordt nooit iets vervangen.", + 'drivesync.folders': "Geback-upte mappen", + 'drivesync.no_folders': "Nog geen map gekozen.", + 'drivesync.folders_hint': "Foto's en video's zijn voor de fotoback-up: DCIM, Pictures en Movies kunnen niet gekozen worden. Android laat een app niet de hele map Download nemen, alleen mappen daarin.", + 'drivesync.add_folder': "Map toevoegen", + 'drivesync.remove': "Verwijderen", + 'drivesync.refused_media': "Deze map bevat foto's en video's, die de fotoback-up verstuurt: kies een andere.", + 'drivesync.refused_root': "Android laat niet toe een hele opslag te kiezen: kies een map daarin.", + 'drivesync.notif_progress': "Bestanden back-uppen: {done} / {total}", + 'drivesync.metered_confirm': "Je gebruikt mobiele data. De bestanden toch versturen?", + 'drivesync.sent_total': "Verzonden bestanden: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Kopieer de chatback-ups die WhatsApp maakt, eenmaal per dag via wifi, zodat ze op een nieuwe telefoon teruggezet kunnen worden. Ze blijven door WhatsApp versleuteld: hier kunnen ze niet gelezen worden, alleen teruggezet.", + 'whatsappsync.folder_needed': "De map van WhatsApp is nog niet gekozen.", + 'whatsappsync.folder_chosen': "De map van WhatsApp is gekozen.", + 'whatsappsync.folder_choose': "Map van WhatsApp kiezen", + 'whatsappsync.folder_hint': "De kiezer opent erop: Android/media/com.whatsapp/WhatsApp. Tik op ‘Deze map gebruiken’.", + 'whatsappsync.media': "Ook media", + 'whatsappsync.media_hint': "Ontvangen en verstuurde foto's, video's, spraakberichten en documenten: vaak enkele gigabytes. Wat de fotoback-up al verstuurt, gaat niet twee keer.", + 'whatsappsync.refused': "Dit is niet de map van WhatsApp: kies Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Terugzetten op een nieuwe telefoon: kopieer de mappen Databases en Backups van de laatste kopie naar Android/media/com.whatsapp/WhatsApp voordat je WhatsApp installeert, en zet terug met hetzelfde nummer (en het wachtwoord of de sleutel van 64 cijfers als end-to-end-versleutelde back-up aanstaat).", + 'whatsappsync.notif_progress': "WhatsApp back-uppen: {done} / {total}", + 'androidsync.dest_heading': "Bestemming van back-ups", + 'androidsync.dest_intro': "Back-ups gaan naar een map van een groep waarvan jij eigenaar en het enige lid bent. Elk soort back-up krijgt daar een eigen map.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Gebruikte mappen: {dirs}", + 'androidsync.dest_change_confirm': "Alle back-ups beginnen opnieuw in {folder} van {group}. Wat al verzonden is, blijft waar het is.", + 'androidsync.dest_not_in_photos': "Het tabblad Foto's van de groep toont {dir} niet: foto's worden geback-upt maar daar pas getoond als de map bij de mappen van het tabblad hoort (groepsinstellingen).", + 'androidsync.dest_needed': "Kies eerst bovenaan deze pagina waar back-ups naartoe gaan.", + 'androidsync.dest_save': "Opslaan", + 'phonesync.turn_on': "Inschakelen", + 'photosync.fail_not_private': "Fotoback-up gestopt: iemand anders is lid geworden van de groep.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js index e3f21d3..090be3f 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js @@ -69,6 +69,7 @@ export default { 'register.submit': 'Załóż konto', 'register.loading': 'Tworzenie konta...', 'register.has_account': 'Konto już istnieje?', + 'register.legal_notice': "Zakładając konto, akceptujesz warunki korzystania z tego huba. Prawo zobowiązuje go do przechowywania przez rok dziennika Twoich połączeń (adres IP, data, czynność), także po usunięciu konta.", 'register.login_link': 'Zaloguj', 'register.recovery_title': 'Zapisz swój klucz odzyskiwania', 'register.recovery_intro': 'Ten klucz przywraca Twoje tożsamości grupowe, jeśli kiedykolwiek zapomnisz hasło-frazę. Przechowuj go w menedżerze haseł lub w bezpiecznym miejscu.', @@ -126,6 +127,7 @@ export default { 'welcome.docs_devel': 'Dla programistów', 'welcome.docs_design': 'Architektura', 'welcome.docs_protocol': 'Protokół', + 'welcome.docs_api': 'API', 'welcome.download': 'Pobierz (beta)', 'welcome.legal': 'Informacje prawne', 'register.err_mismatch': 'Hasła nie są zgodne', @@ -212,6 +214,11 @@ export default { 'group.mkdir_prompt': 'Nazwa nowego folderu', 'group.mkdir_offline': 'Brak połączenia z węzłem.', 'group.download_offline': 'Brak połączenia z węzłem — pobieranie nie może się rozpocząć. Połączenie wróci samo; proszę spróbować za chwilę.', + 'group.link_unknown': "Ten link wskazuje grupę, do której nie należysz, lub która nie nosi już tej nazwy.", + 'group.link_path_unknown': "W tej grupie nie ma niczego pod {path} — plik mógł zostać przeniesiony, zmieniony lub usunięty.", + 'link.copy': "Kopiuj link", + 'link.copied': "Link skopiowany", + 'link.copy_failed': "Nie udało się skopiować — link to {url}", 'group.download_write_stalled': 'Plik przestał być zapisywany na dysk ({seconds} s bez postępu). Pobieranie zostało przerwane, zamiast wisieć w nieskończoność; proszę spróbować ponownie.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -282,6 +289,7 @@ export default { 'group.upload_indexing': 'indeksowanie…', 'video.err_transport': 'Transport nie jest połączony', 'video.err_mse': 'Kodek nieobsługiwany przy odtwarzaniu strumieniowym: {codec}', + 'video.err_no_mse': 'Ta przeglądarka nie obsługuje strumieniowania wideo (iPhone wymaga iOS 17.1 lub nowszego)', 'video.mode_poster': 'Plakaty', 'video.mode_flat': 'Lista płaska', 'video.filter_all': 'All', @@ -384,10 +392,19 @@ export default { many: '{n} zdjęć', other: '{n} zdjęcia', }, + 'photo.n_videos': { + one: "{n} film", + few: "{n} filmy", + many: "{n} filmów", + other: "{n} filmu", + }, + 'photo.play_video': "Odtwórz film", 'photo.back': 'Wstecz', 'photo.prev': 'Poprzednie (←)', 'photo.next': 'Następne (→)', 'photo.zip_album': 'Pobierz album jako zip', + 'photo.slideshow': 'Pokaz slajdów', + 'photo.slideshow_stop': 'Zatrzymaj pokaz slajdów', 'photo.zoom_in': 'Powiększ', 'photo.zoom_out': 'Pomniejsz', 'photo.zoom_fit_title': 'Dopasuj do okna', @@ -401,6 +418,13 @@ export default { 'cast.copied': 'URL skopiowany', 'cast.scanning': 'Wyszukiwanie urządzeń…', 'cast.no_devices': 'Nie znaleziono urządzeń', + 'cast.casting_to': 'Przesyłanie do', + 'cast.seek': 'Pozycja w filmie', + 'cast.waiting': 'Czekam na telewizor…', + 'cast.back30': '30 sekund wstecz', + 'cast.fwd30': '30 sekund do przodu', + 'cast.play': 'Odtwórz', + 'cast.pause': 'Wstrzymaj', // Settings 'settings.title': 'Ustawienia', @@ -431,6 +455,15 @@ export default { 'settings.email_verified': 'Adres e-mail został pomyślnie zmieniony.', 'settings.notif_global_disable': 'Wyłącz wszystkie powiadomienia', 'settings.notif_global_hint': 'Po włączeniu nie będą tworzone żadne powiadomienia dla żadnej grupy.', + 'settings.push_label': 'Powiadomienia na tym telefonie', + 'settings.push_off': 'Wyłączone. Włącz, aby dowiadywać się o nowych wiadomościach i zaproszeniach, gdy MeshBay jest zamknięty.', + 'settings.push_pending': 'Oczekiwanie na odpowiedź dystrybutora…', + 'settings.push_blocked': 'Android blokuje powiadomienia MeshBay: zezwól na nie w ustawieniach systemu.', + 'settings.push_ready': 'Włączone. Nowe powiadomienia docierają na ten telefon przez dystrybutora, zaszyfrowane tak, że nie może ich odczytać.', + 'settings.push_poll': 'Włączone. Ten telefon sprawdza nowe powiadomienia mniej więcej co piętnaście minut. Aby otrzymywać je od razu, możesz zainstalować aplikację dystrybutora UnifiedPush, np. ntfy (opcjonalnie).', + 'settings.push_global_off': 'Nic nie jest wysyłane, dopóki wszystkie powiadomienia są wyłączone.', + 'push.channel_chat': 'Wiadomości', + 'push.channel_other': 'Zaproszenia i konto', 'settings.defaults': 'Wartości domyślne', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -506,12 +539,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -529,12 +561,14 @@ export default { 'settings.node_key_placeholder': 'Wklej klucz publiczny Ed25519 node (base64)', 'settings.node_key_submit': 'Powiąż node', 'settings.node_key_success': 'Node został powiązany', + 'settings.node_key_unlink': "Odłącz", + 'settings.node_key_unlink_confirm': "Odłączyć węzeł od twojego konta? Przestanie obsługiwać twoje grupy, dopóki nie zostanie ponownie powiązany węzeł.", + 'settings.node_key_unlinked': "Węzeł odłączony", 'settings.node_key_current': 'Klucz powiązanego node', // Sidebar 'sidebar.create_group': 'Utwórz grupę', 'sidebar.settings': 'Ustawienia', - 'sidebar.admin': 'Administracja', // User menu 'usermenu.language': 'Język', @@ -770,6 +804,7 @@ export default { 'transfers.eta_minutes': 'pozostało {n} min', 'transfers.eta_hours': 'pozostało {n} godz.', 'transfers.failed': 'Nie powiódł się', + 'transfers.disk_full': 'Dysk, na którym działa node, jest pełny', 'group.select': 'Zaznacz', 'group.select_done': 'Gotowe', 'group.actions': 'Działania ({n})', @@ -862,6 +897,7 @@ export default { 'indexdock.next_count': "W kolejce: {count}", 'indexdock.open': "Otwórz ustawienia tej grupy", 'indexdock.hide': "Ukryj do następnego indeksowania", + 'indexdock.pause': "Wstrzymaj indeksowanie tego folderu", 'chat.load_older': 'Wczytaj {n} starszych wiadomości', 'chat.start_of_history': 'Początek rozmowy', 'chat.today': 'Dziś', @@ -908,7 +944,7 @@ export default { 'lazy.reload': 'Wczytaj stronę ponownie', // Sidebar (supplementary) - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -933,6 +969,7 @@ export default { 'node.startup_mode_service': 'Jako usługa w tle (uruchamia się przy starcie systemu)', 'node.startup_mode_updating': 'Zmiana trybu — proszę sprawdzić, czy pojawiło się okno uprawnień administratora…', 'node.startup_mode_service_unavailable_hint': 'Tryb usługi w tle wymaga zainstalowanej wersji. Aby przetestować lokalnie, uruchom "meshbay-node service install" w PowerShell z uprawnieniami administratora.', + 'node.startup_mode_service_store_hint': 'Uruchamianie przy starcie systemu, zanim ktokolwiek się zaloguje, wymaga instalatora MeshBay (.exe) zamiast wersji ze sklepu Microsoft Store.', 'node.not_operator': 'Nie udało się połączyć z Pana/Pani node. Upewnij się, że działa.', 'node.offline': 'Node jest niedostępny', 'node.retry': 'Ponów', @@ -940,6 +977,13 @@ export default { 'node.pair_code_placeholder': 'Kod parowania', 'node.pair_button': 'Sparuj tę przeglądarkę', 'node.pair_success': 'Parowanie zakończone sukcesem.', + 'node.pair_pending': 'Kod parowania gotowy: zostanie użyty przy następnym otwarciu jednej z grup tego Node.', + 'node.link_other_node': "Twoje konto jest powiązane z węzłem innego komputera, więc ten węzeł nie może obsługiwać twoich grup.", + 'node.link_here': "Powiąż zamiast tego ten węzeł", + 'node.link_here_confirm': "Powiązać ten węzeł z twoim kontem? Węzeł powiązany teraz, na innym komputerze, przestanie obsługiwać twoje grupy, dopóki nie zostanie ponownie powiązany.", + 'node.link_other_account': "Ten węzeł jest skonfigurowany dla {account}, nie dla ciebie, więc nie może obsługiwać twoich grup.", + 'node.link_take_over': "Użyj tego węzła dla mojego konta", + 'node.link_linking': "Wiązanie…", 'node.reload': 'Przeładuj konfigurację', 'node.reloaded': 'Konfiguracja przeładowana. Zmiany katalogów w istniejących grupach są teraz aktywne.', 'node.restart_needed': 'Po dodaniu: zainicjalizuj klucz grupy (meshbay-node gek-init --group <nazwa>).', @@ -958,6 +1002,8 @@ export default { 'node.setting_max_uploads': 'Maks. równoczesnych wysyłek', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Największa pojedyncza wysyłka', + 'node.setting_connection_processes': 'Rdzenie CPU dla połączeń', + 'node.setting_unit_of': 'z {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -981,6 +1027,9 @@ export default { 'node.remove_root': 'Usuń', 'node.root_no_signing_key': 'Brak klucza podpisu — najpierw sparuj to urządzenie z węzłem', 'node.root_no_route': 'Brak połączenia z węzłem — połącz się z nim albo użyj aplikacji na komputerze, który go hostuje', + 'node.root_pause': "Wstrzymaj indeksowanie", + 'node.root_resume': "Wznów indeksowanie", + 'node.root_paused': "indeksowanie wstrzymane", 'node.root_remove_last': 'Grupa wymaga co najmniej jednego katalogu', 'node.root_path': 'Ścieżka', 'node.directory': 'Katalog', @@ -1110,6 +1159,8 @@ export default { 'settings_app.chat_encrypted_always': 'Czat w tej grupie jest zawsze szyfrowany. Nie da się tego wyłączyć.', 'settings_app.chat_rotate_epoch': 'Zmień klucz czatu', 'settings_app.chat_rotate_epoch_hint': 'Członkowie nadal czytają całą historię. Osoba usunięta z grupy nie odczyta tego, co zostanie napisane od teraz. Usunięcie członka lub urządzenia robi to już samo.', + 'settings_app.chat_purge': 'Wyczyść czat', + 'settings_app.chat_purge_hint': 'Usuwa wszystkie wiadomości czatu tej grupy na tym węźle, dla wszystkich członków. Załączniki zostają w swoim folderze. Tego nie można cofnąć.', 'settings_app.tmdb_token_prompt': 'Zarejestruj się w TMDB, aby wygenerować własny klucz API.', 'settings_app.tmdb_token_link': 'Pobierz klucz', 'settings_node.roots_offline_hint': 'Brak połączenia z węzłem — zmiany przechodzą przez węzeł lokalny i zaczną działać po jego następnym przeładowaniu.', @@ -1264,6 +1315,7 @@ export default { 'home.accept': "Akceptuj", 'home.decline': "Odrzuć", 'members.invited': "zaproszony", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Hosty", 'hosts.hint': "Twoje własne node'y obsługują tę grupę bez pytania. Inny node robi to dopiero po Twojej akceptacji tutaj; node, który o to prosi, jest widoczny poniżej.", 'hosts.none': "Żaden inny node nie prosił o hostowanie tej grupy.", @@ -1289,4 +1341,114 @@ export default { 'native.node_account_confirm': 'Node na tym komputerze jest skonfigurowany dla {current}. Skonfigurować go zamiast tego dla {next}? Przestanie obsługiwać grupy, które hostuje dla {current}.', 'native.browser_access_confirm': 'Zezwolić na logowanie z przeglądarki? Aplikacja pozostawi Twoją tożsamość na każdym używanym node, zapieczętowaną tak, by otworzyć ją mogło tylko Twoje hasło wraz z kontem na hubie.', 'native.declined': 'Anulowano — nic nie zostało zmienione.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Kopia zdjęć", + 'photosync.intro': "Wysyłaj zdjęcia zrobione tym telefonem do folderu jednej z Twoich grup, raz dziennie, przez Wi-Fi. Zdjęcia usunięte z telefonu zostają w grupie.", + 'photosync.setup': "Skonfiguruj", + 'photosync.change': "Zmień", + 'photosync.turn_off': "Wyłącz", + 'photosync.now': "Utwórz kopię teraz", + 'photosync.permission_needed': "MeshBay potrzebuje dostępu do zdjęć na tym telefonie.", + 'photosync.permission_allow': "Zezwól na dostęp", + 'photosync.permission_partial': "Dostęp jest ograniczony do wybranych zdjęć: nowe zdjęcia nie będą kopiowane, dopóki nie zezwolisz na dostęp do wszystkich.", + 'photosync.group': "Grupa", + 'photosync.choose_group': "Wybierz grupę", + 'photosync.checking_group': "Odczytywanie folderów grupy…", + 'photosync.group_offline': "Żaden node hostujący tę grupę nie jest teraz dostępny. Spróbuj ponownie, gdy będzie.", + 'photosync.folder': "Folder", + 'photosync.albums': "Albumy na tym telefonie", + 'photosync.album_camera': "Aparat", + 'photosync.album_count': "Zdjęcia: {n} · {size}", + 'photosync.videos_not_included': "Filmy nie są kopiowane: „Zmień”, aby je dodać.", + 'photosync.videos_included': "Filmy też są kopiowane.", + 'photosync.include_videos': "Również filmy", + 'photosync.include_videos_hint': "Filmy są duże: wysyłane są przez Wi-Fi jak zdjęcia, a pierwsza kopia może potrwać.", + 'photosync.album_count_videos': "Zdjęcia: {n}, filmy: {v} · {size}", + 'photosync.confirm_videos': "Zdjęcia i filmy ({count}, {size}), w tym filmy: {videos} ({videoSize}), zostaną wysłane do {dir}, a potem nowe raz dziennie.", + 'photosync.video_permission_needed': "MeshBay potrzebuje też dostępu do filmów w tym telefonie.", + 'photosync.scope_existing': "Zdjęcia, które już są na tym telefonie, a potem nowe", + 'photosync.scope_new': "Tylko zdjęcia zrobione od teraz", + 'photosync.start': "Rozpocznij kopię", + 'photosync.confirm': "{count} zdjęć ({size}) zostanie wysłanych do {dir}, a potem nowe raz dziennie.", + 'photosync.confirm_new': "Nowe zdjęcia będą wysyłane do {dir} raz dziennie.", + 'photosync.metered_confirm': "Korzystasz z danych komórkowych — zdjęcia: {count}, {size}. Wysłać mimo to?", + 'photosync.other_account': "Skonfigurowano dla @{account}. Zaloguj się jako @{account}, aby ją kontynuować, albo skonfiguruj ją tu ponownie.", + 'photosync.sent_total': "Wysłane zdjęcia: {n}", + 'photosync.last_run': "Ostatnia kopia: {when}", + 'photosync.never': "Jeszcze bez kopii", + 'photosync.state_waiting_wifi': "Oczekiwanie na Wi-Fi", + 'photosync.state_connecting': "Łączenie z grupą…", + 'photosync.state_sending': "Wysyłanie {done} / {total}", + 'photosync.state_offline': "Żaden node grupy nie jest dostępny; kolejna próba później", + 'photosync.state_interrupted': "Przerwano — będzie kontynuowana przy następnej okazji", + 'photosync.state_up_to_date': "Aktualna", + 'photosync.notif_progress': "Kopia zdjęć — {done} / {total}", + 'photosync.fail_disk_full': "Kopia zdjęć zatrzymana: dysk, na którym działa node, jest pełny.", + 'photosync.fail_read_only': "Kopia zdjęć zatrzymana: folder nie przyjmuje już plików.", + 'photosync.fail_no_folder': "Kopia zdjęć zatrzymana: folder już nie istnieje w grupie.", + 'photosync.fail_unavailable': "Kopia zdjęć zatrzymana: dysk z folderem nie jest podłączony do node.", + 'photosync.fail_not_member': "Kopia zdjęć zatrzymana: nie jesteś już członkiem tej grupy.", + 'photosync.fail_permission': "Kopia zdjęć zatrzymana: MeshBay nie ma już dostępu do zdjęć.", + 'photosync.fail_other': "Kopia zdjęć zatrzymana.", + 'contactsync.heading': "Kopia kontaktów", + 'contactsync.intro': "Wysyłaj kopię kontaktów z tego telefonu raz dziennie, jeśli się zmieniły. Każda kopia to plik .vcf, który zaimportuje każdy telefon.", + 'contactsync.permission_needed': "MeshBay potrzebuje dostępu do kontaktów w tym telefonie.", + 'calendarsync.heading': "Kopia kalendarza", + 'calendarsync.intro': "Wysyłaj kopię kalendarzy z tego telefonu raz dziennie, jeśli się zmieniły: tych, które możesz edytować, a nie tylko subskrybowanych. Każda kopia to plik .ics, który zaimportuje każdy kalendarz.", + 'calendarsync.permission_needed': "MeshBay potrzebuje dostępu do kalendarzy w tym telefonie.", + 'messagesync.heading': "Kopia SMS-ów", + 'messagesync.intro': "Wysyłaj SMS-y z tego telefonu raz dziennie: pierwsza kopia zawiera wszystkie, każda kolejna tylko nowe. Pliki są w formacie XML, który przywracają aplikacje do kopii SMS-ów. MMS-y nie są uwzględniane.", + 'messagesync.permission_needed': "MeshBay potrzebuje dostępu do SMS-ów w tym telefonie.", + 'messagesync.restricted_hint': "Jeśli Android mówi o ustawieniu z ograniczeniami: otwórz ustawienia aplikacji, dotknij ⋮ u góry, „Zezwól na ustawienia z ograniczeniami”, a potem wróć i włącz to ponownie. Android wymaga tego od aplikacji zainstalowanych spoza sklepu.", + 'phonesync.state_sending': "Wysyłanie…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Wysłane kopie: {n}", + 'phonesync.last_file': "Ostatnia kopia: {name}", + 'phonesync.checking_groups': "Szukanie grup, których jesteś właścicielem i jedynym członkiem…", + 'phonesync.no_private_group': "Nie masz grupy, której jesteś właścicielem i jedynym członkiem. Utwórz taką tylko dla siebie i wróć tutaj.", + 'phonesync.no_folder': "Ta grupa nie ma folderu, do którego możesz dodawać pliki.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Zatrzymano: dysk node'a jest pełny.", + 'phonesync.fail_read_only': "Zatrzymano: folder nie przyjmuje już plików.", + 'phonesync.fail_no_folder': "Zatrzymano: folder nie istnieje już w grupie.", + 'phonesync.fail_unavailable': "Zatrzymano: dysk folderu nie jest podłączony do node'a.", + 'phonesync.fail_not_member': "Zatrzymano: nie jesteś już członkiem tej grupy.", + 'phonesync.fail_not_private': "Zatrzymano: ktoś inny dołączył do grupy.", + 'phonesync.fail_permission': "Zatrzymano: MeshBay nie ma już dostępu.", + 'phonesync.fail_other': "Zatrzymano.", + 'phonesync.open_settings': "Otwórz ustawienia aplikacji", + 'drivesync.heading': "Kopia plików", + 'drivesync.intro': "Wysyłaj pliki z folderów wybranych w tym telefonie raz dziennie przez Wi-Fi. Plik zmieniony w telefonie jest wysyłany ponownie obok wcześniejszej kopii; nic nie jest nigdy zastępowane.", + 'drivesync.folders': "Kopiowane foldery", + 'drivesync.no_folders': "Nie wybrano jeszcze żadnego folderu.", + 'drivesync.folders_hint': "Zdjęcia i filmy należą do kopii zdjęć: nie można wybrać DCIM, Pictures ani Movies. Android nie pozwala aplikacji wziąć całego folderu Download, tylko foldery w nim.", + 'drivesync.add_folder': "Dodaj folder", + 'drivesync.remove': "Usuń", + 'drivesync.refused_media': "Ten folder zawiera zdjęcia i filmy, które wysyła kopia zdjęć: wybierz inny.", + 'drivesync.refused_root': "Android nie pozwala wybrać całej pamięci: wybierz folder w niej.", + 'drivesync.notif_progress': "Kopia plików: {done} / {total}", + 'drivesync.metered_confirm': "Używasz danych komórkowych. Wysłać pliki mimo to?", + 'drivesync.sent_total': "Wysłane pliki: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Kopiuj kopie zapasowe czatów tworzone przez WhatsApp raz dziennie przez Wi-Fi, aby można je było przywrócić na nowym telefonie. Pozostają zaszyfrowane przez WhatsApp: nie da się ich tu odczytać, tylko przywrócić.", + 'whatsappsync.folder_needed': "Folder WhatsApp nie jest jeszcze wybrany.", + 'whatsappsync.folder_chosen': "Folder WhatsApp jest wybrany.", + 'whatsappsync.folder_choose': "Wybierz folder WhatsApp", + 'whatsappsync.folder_hint': "Okno wyboru otworzy się na nim: Android/media/com.whatsapp/WhatsApp. Naciśnij „Użyj tego folderu”.", + 'whatsappsync.media': "Również multimedia", + 'whatsappsync.media_hint': "Odebrane i wysłane zdjęcia, filmy, wiadomości głosowe i dokumenty: często kilka gigabajtów. To, co wysyła już kopia zdjęć, nie jest wysyłane drugi raz.", + 'whatsappsync.refused': "To nie jest folder WhatsApp: wybierz Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Aby przywrócić na nowym telefonie: skopiuj foldery Databases i Backups z ostatniej kopii do Android/media/com.whatsapp/WhatsApp przed instalacją WhatsApp, a potem przywróć z tym samym numerem (i hasłem lub 64-cyfrowym kluczem, jeśli włączona jest kopia szyfrowana end-to-end).", + 'whatsappsync.notif_progress': "Kopia WhatsApp: {done} / {total}", + 'androidsync.dest_heading': "Miejsce kopii zapasowych", + 'androidsync.dest_intro': "Kopie trafiają do folderu grupy, której jesteś właścicielem i jedynym członkiem. Każdy rodzaj kopii ma tam własny folder.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Używane foldery: {dirs}", + 'androidsync.dest_change_confirm': "Wszystkie kopie zaczną się od nowa w {folder} grupy {group}. To, co już wysłano, zostaje na miejscu.", + 'androidsync.dest_not_in_photos': "Karta Zdjęcia tej grupy nie pokazuje {dir}: zdjęcia będą kopiowane, ale nie pojawią się tam, dopóki ten folder nie będzie jednym z folderów karty (ustawienia grupy).", + 'androidsync.dest_needed': "Najpierw wybierz miejsce kopii zapasowych, na górze tej strony.", + 'androidsync.dest_save': "Zapisz", + 'phonesync.turn_on': "Włącz", + 'photosync.fail_not_private': "Kopia zdjęć zatrzymana: ktoś inny dołączył do grupy.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js index 00510c6..bfac600 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js @@ -67,6 +67,7 @@ export default { 'register.submit': 'Criar a conta', 'register.loading': 'Criando a conta...', 'register.has_account': 'Já tem uma conta?', + 'register.legal_notice': "Ao criar uma conta, você aceita os termos de uso deste hub. A lei o obriga a manter por um ano o registro das suas conexões (endereço IP, data, ação), mesmo depois que sua conta for excluída.", 'register.login_link': 'Entrar', 'register.recovery_title': 'Guarde sua chave de recuperação', 'register.recovery_intro': 'Esta chave restaura suas identidades de grupo caso você esqueça sua frase secreta. Guarde-a em um gerenciador de senhas ou em local seguro.', @@ -124,6 +125,7 @@ export default { 'welcome.docs_devel': 'Docs de desenvolvimento', 'welcome.docs_design': 'Arquitetura', 'welcome.docs_protocol': 'Protocolo', + 'welcome.docs_api': 'API', 'welcome.download': 'Baixar (beta)', 'welcome.legal': 'Informações legais', 'register.err_mismatch': 'As senhas não coincidem', @@ -209,6 +211,11 @@ export default { 'group.mkdir_prompt': 'Nome da nova pasta', 'group.mkdir_offline': 'Sem conexão com o nó.', 'group.download_offline': 'Sem conexão com o nó — o download não pode começar. Ele reconecta sozinho; tente de novo em instantes.', + 'group.link_unknown': "Este link aponta para um grupo do qual você não é membro, ou que não tem mais esse nome.", + 'group.link_path_unknown': "Não há nada em {path} neste grupo — o arquivo pode ter sido movido, renomeado ou excluído.", + 'link.copy': "Copiar link", + 'link.copied': "Link copiado", + 'link.copy_failed': "Não foi possível copiar — o link é {url}", 'group.download_write_stalled': 'O arquivo parou de ser gravado no disco ({seconds}s sem progresso). O download foi interrompido em vez de ficar travado; tente de novo.', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -277,6 +284,7 @@ export default { 'group.upload_indexing': 'indexando…', 'video.err_transport': 'Transporte não conectado', 'video.err_mse': 'Codec sem suporte para transmissão: {codec}', + 'video.err_no_mse': 'Este navegador não consegue transmitir vídeo (um iPhone precisa do iOS 17.1 ou mais recente)', 'video.mode_poster': 'Pôsteres', 'video.mode_flat': 'Lista simples', 'video.filter_all': 'All', @@ -373,10 +381,17 @@ export default { one: '{n} foto', other: '{n} fotos', }, + 'photo.n_videos': { + one: "{n} vídeo", + other: "{n} vídeos", + }, + 'photo.play_video': "Reproduzir o vídeo", 'photo.back': 'Voltar', 'photo.prev': 'Anterior (←)', 'photo.next': 'Próxima (→)', 'photo.zip_album': 'Baixar álbum como zip', + 'photo.slideshow': 'Apresentação de slides', + 'photo.slideshow_stop': 'Parar a apresentação', 'photo.zoom_in': 'Aumentar zoom', 'photo.zoom_out': 'Diminuir zoom', 'photo.zoom_fit_title': 'Ajustar à janela', @@ -390,6 +405,13 @@ export default { 'cast.copied': 'URL copiada', 'cast.scanning': 'Procurando dispositivos…', 'cast.no_devices': 'Nenhum dispositivo encontrado', + 'cast.casting_to': 'Transmitindo para', + 'cast.seek': 'Posição no filme', + 'cast.waiting': 'Aguardando a TV…', + 'cast.back30': 'Voltar 30 segundos', + 'cast.fwd30': 'Avançar 30 segundos', + 'cast.play': 'Reproduzir', + 'cast.pause': 'Pausar', // Settings 'settings.title': 'Configurações', @@ -420,6 +442,15 @@ export default { 'settings.email_verified': 'Endereço de e-mail alterado com sucesso.', 'settings.notif_global_disable': 'Desativar todas as notificações', 'settings.notif_global_hint': 'Quando ativado, nenhuma notificação é criada para nenhum grupo.', + 'settings.push_label': 'Notificações neste telefone', + 'settings.push_off': 'Desativadas. Ative para saber de novas mensagens e convites com o MeshBay fechado.', + 'settings.push_pending': 'Aguardando a resposta do distribuidor…', + 'settings.push_blocked': 'O Android está bloqueando as notificações do MeshBay: permita-as nas configurações do sistema.', + 'settings.push_ready': 'Ativadas. Novas notificações chegam a este telefone pelo distribuidor, criptografadas para que ele não possa lê-las.', + 'settings.push_poll': 'Ativadas. Este telefone verifica novas notificações a cada quinze minutos, aproximadamente. Para recebê-las na hora, você pode instalar um app distribuidor UnifiedPush como o ntfy (opcional).', + 'settings.push_global_off': 'Nada é enviado enquanto todas as notificações estiverem desativadas.', + 'push.channel_chat': 'Mensagens', + 'push.channel_other': 'Convites e conta', 'settings.defaults': 'Padrões', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -492,12 +523,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -515,12 +545,14 @@ export default { 'settings.node_key_placeholder': 'Cole a chave pública Ed25519 do node (base64)', 'settings.node_key_submit': 'Vincular o node', 'settings.node_key_success': 'Node vinculado com sucesso', + 'settings.node_key_unlink': "Desvincular", + 'settings.node_key_unlink_confirm': "Desvincular o node da sua conta? Ele deixará de servir seus grupos até que um node seja vinculado novamente.", + 'settings.node_key_unlinked': "Node desvinculado", 'settings.node_key_current': 'Chave do node vinculado', // Sidebar 'sidebar.create_group': 'Criar um grupo', 'sidebar.settings': 'Configurações', - 'sidebar.admin': 'Administração', // User menu 'usermenu.language': 'Idioma', @@ -756,6 +788,7 @@ export default { 'transfers.eta_minutes': 'faltam {n} min', 'transfers.eta_hours': 'faltam {n} h', 'transfers.failed': 'Falhou', + 'transfers.disk_full': 'O disco do node está cheio', 'group.select': 'Selecionar', 'group.select_done': 'Concluir', 'group.actions': 'Ações ({n})', @@ -841,6 +874,7 @@ export default { 'indexdock.next_count': "Na fila: {count}", 'indexdock.open': "Abrir as configurações deste grupo", 'indexdock.hide': "Ocultar até a próxima indexação", + 'indexdock.pause': "Pausar a indexação desta pasta", 'chat.load_older': 'Carregar {n} mensagens anteriores', 'chat.start_of_history': 'Início da conversa', 'chat.today': 'Hoje', @@ -887,7 +921,7 @@ export default { 'lazy.reload': 'Recarregar a página', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -912,6 +946,7 @@ export default { 'node.startup_mode_service': 'Como serviço em segundo plano (inicia na inicialização)', 'node.startup_mode_updating': 'Alternando modo — verifique se aparece um aviso de administrador…', 'node.startup_mode_service_unavailable_hint': 'O modo de serviço em segundo plano requer uma versão instalada. Para testes locais, execute "meshbay-node service install" em um PowerShell com privilégios de administrador.', + 'node.startup_mode_service_store_hint': 'Iniciar com o sistema, antes de qualquer login, exige o instalador do MeshBay (.exe) em vez da versão da Microsoft Store.', 'node.not_operator': 'Não foi possível alcançar seu node. Verifique se ele está em execução.', 'node.offline': 'Node está off-line', 'node.retry': 'Tentar novamente', @@ -919,6 +954,13 @@ export default { 'node.pair_code_placeholder': 'Código de pareamento', 'node.pair_button': 'Parear este navegador', 'node.pair_success': 'Pareamento realizado com sucesso.', + 'node.pair_pending': 'Código de pareamento pronto: ele será usado na próxima vez que você abrir um dos grupos deste Node.', + 'node.link_other_node': "Sua conta está vinculada ao node de outra máquina, então este node não pode servir seus grupos.", + 'node.link_here': "Vincular este node no lugar", + 'node.link_here_confirm': "Vincular este node à sua conta? O node vinculado agora, em outra máquina, deixará de servir seus grupos até ser vinculado novamente.", + 'node.link_other_account': "Este node está configurado para {account}, não para você, então não pode servir seus grupos.", + 'node.link_take_over': "Usar este node na minha conta", + 'node.link_linking': "Vinculando…", 'node.reload': 'Recarregar configuração', 'node.reloaded': 'Configuração recarregada. Alterações de diretórios em grupos existentes estão ativas.', 'node.restart_needed': 'Após adicionar: inicialize a chave do grupo (meshbay-node gek-init --group <nome>).', @@ -937,6 +979,8 @@ export default { 'node.setting_max_uploads': 'Máximo de envios simultâneos', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': 'Maior envio individual', + 'node.setting_connection_processes': 'Núcleos de CPU para as conexões', + 'node.setting_unit_of': 'de {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -950,6 +994,9 @@ export default { 'node.remove_root': 'Remover', 'node.root_no_signing_key': 'Nenhuma chave de assinatura disponível — pareie este dispositivo com o nó primeiro', 'node.root_no_route': 'Sem rota até o nó — conecte-se a ele ou use o aplicativo na máquina que o hospeda', + 'node.root_pause': "Pausar a indexação", + 'node.root_resume': "Retomar a indexação", + 'node.root_paused': "indexação pausada", 'node.root_remove_last': 'Um grupo precisa de pelo menos um diretório', 'node.root_path': 'Caminho', 'node.directory': 'Diretório', @@ -1069,6 +1116,8 @@ export default { 'settings_app.chat_encrypted_always': 'O chat deste grupo é sempre criptografado. Não é possível desativar.', 'settings_app.chat_rotate_epoch': 'Girar a chave do chat', 'settings_app.chat_rotate_epoch_hint': 'Os membros continuam lendo todo o histórico. Quem foi removido do grupo não conseguirá ler o que for escrito daqui em diante. Remover um membro ou dispositivo já faz isso sozinho.', + 'settings_app.chat_purge': 'Limpar o chat', + 'settings_app.chat_purge_hint': 'Apaga todas as mensagens do chat deste grupo neste nó, para todos os membros. Os anexos ficam na pasta deles. Não é possível desfazer.', 'settings_app.tmdb_token_prompt': 'Cadastre-se no TMDB para gerar sua própria chave de API.', 'settings_app.tmdb_token_link': 'Obter uma chave', 'settings_node.roots_offline_hint': 'Sem conexão com o nó — as alterações passam pelo nó local e entram em vigor no próximo recarregamento.', @@ -1223,6 +1272,7 @@ export default { 'home.accept': "Aceitar", 'home.decline': "Recusar", 'members.invited': "convidado", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "Hosts", 'hosts.hint': "Seus próprios nodes servem este grupo sem perguntar. Outro node só o serve depois que você o aprova aqui; um node que pede aparece abaixo.", 'hosts.none': "Nenhum outro node pediu para hospedar este grupo.", @@ -1248,4 +1298,114 @@ export default { 'native.node_account_confirm': 'O node deste computador está configurado para {current}. Configurá-lo para {next} em vez disso? Ele deixará de servir os grupos que hospeda para {current}.', 'native.browser_access_confirm': 'Permitir o acesso por um navegador? O aplicativo deixará sua identidade em cada node que você usa, selada de forma que apenas sua frase secreta, junto com sua conta no hub, possa abri-la.', 'native.declined': 'Cancelado — nada foi alterado.', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "Backup de fotos", + 'photosync.intro': "Envie as fotos tiradas com este celular para uma pasta de um dos seus grupos, uma vez por dia, pelo Wi-Fi. Fotos apagadas do celular continuam no grupo.", + 'photosync.setup': "Configurar", + 'photosync.change': "Alterar", + 'photosync.turn_off': "Desativar", + 'photosync.now': "Fazer backup agora", + 'photosync.permission_needed': "O MeshBay precisa de acesso às fotos deste celular.", + 'photosync.permission_allow': "Permitir acesso", + 'photosync.permission_partial': "O acesso está limitado às fotos que você selecionou: novas fotos não serão salvas até você permitir o acesso a todas.", + 'photosync.group': "Grupo", + 'photosync.choose_group': "Escolha um grupo", + 'photosync.checking_group': "Lendo as pastas do grupo…", + 'photosync.group_offline': "Nenhum node que hospeda este grupo está on-line agora. Tente de novo quando estiver.", + 'photosync.folder': "Pasta", + 'photosync.albums': "Álbuns deste celular", + 'photosync.album_camera': "Câmera", + 'photosync.album_count': "{n} fotos · {size}", + 'photosync.videos_not_included': "Os vídeos não têm backup: “Alterar” para adicioná-los.", + 'photosync.videos_included': "Os vídeos também têm backup.", + 'photosync.include_videos': "Vídeos também", + 'photosync.include_videos_hint': "Vídeos são pesados: vão pelo Wi-Fi como as fotos, e o primeiro backup pode demorar.", + 'photosync.album_count_videos': "{n} fotos, {v} vídeos · {size}", + 'photosync.confirm_videos': "{count} fotos e vídeos ({size}), sendo {videos} vídeos ({videoSize}), serão enviados para {dir} e depois os novos uma vez por dia.", + 'photosync.video_permission_needed': "O MeshBay também precisa de acesso aos vídeos deste celular.", + 'photosync.scope_existing': "As fotos que já estão neste celular, depois as novas", + 'photosync.scope_new': "Somente as fotos tiradas a partir de agora", + 'photosync.start': "Iniciar backup", + 'photosync.confirm': "{count} fotos ({size}) serão enviadas para {dir} e depois as novas uma vez por dia.", + 'photosync.confirm_new': "As fotos novas serão enviadas para {dir} uma vez por dia.", + 'photosync.metered_confirm': "Você está usando dados móveis — {count} fotos, {size}. Enviar mesmo assim?", + 'photosync.other_account': "Configurado para @{account}. Entre como @{account} para continuar, ou configure de novo aqui.", + 'photosync.sent_total': "Fotos enviadas: {n}", + 'photosync.last_run': "Último backup: {when}", + 'photosync.never': "Ainda sem backup", + 'photosync.state_waiting_wifi': "Aguardando Wi-Fi", + 'photosync.state_connecting': "Conectando ao grupo…", + 'photosync.state_sending': "Enviando {done} / {total}", + 'photosync.state_offline': "Nenhum node do grupo está on-line; nova tentativa mais tarde", + 'photosync.state_interrupted': "Interrompido — continuará na próxima oportunidade", + 'photosync.state_up_to_date': "Atualizado", + 'photosync.notif_progress': "Backup de fotos — {done} / {total}", + 'photosync.fail_disk_full': "Backup de fotos parado: o disco do node está cheio.", + 'photosync.fail_read_only': "Backup de fotos parado: a pasta não aceita mais envios.", + 'photosync.fail_no_folder': "Backup de fotos parado: a pasta não existe mais no grupo.", + 'photosync.fail_unavailable': "Backup de fotos parado: o disco da pasta não está conectado ao node.", + 'photosync.fail_not_member': "Backup de fotos parado: você não é mais membro deste grupo.", + 'photosync.fail_permission': "Backup de fotos parado: o MeshBay não tem mais acesso às fotos.", + 'photosync.fail_other': "Backup de fotos parado.", + 'contactsync.heading': "Backup de contatos", + 'contactsync.intro': "Enviar uma cópia dos contatos deste celular uma vez por dia se tiverem mudado. Cada cópia é um arquivo .vcf que qualquer celular consegue importar.", + 'contactsync.permission_needed': "O MeshBay precisa de acesso aos contatos deste celular.", + 'calendarsync.heading': "Backup da agenda", + 'calendarsync.intro': "Enviar uma cópia das agendas deste celular uma vez por dia se tiverem mudado: as que você pode editar, não as que você só assina. Cada cópia é um arquivo .ics que qualquer agenda consegue importar.", + 'calendarsync.permission_needed': "O MeshBay precisa de acesso às agendas deste celular.", + 'messagesync.heading': "Backup de SMS", + 'messagesync.intro': "Enviar os SMS deste celular uma vez por dia: a primeira cópia contém todos, cada uma das seguintes só os novos. Os arquivos estão no formato XML que os apps de backup de SMS conseguem restaurar. MMS não são incluídos.", + 'messagesync.permission_needed': "O MeshBay precisa de acesso aos SMS deste celular.", + 'messagesync.restricted_hint': "Se o Android falar de uma configuração restrita: abra as configurações do app, toque em ⋮ no alto, “Permitir configurações restritas” e volte para ativar. O Android exige isso de apps instalados fora de uma loja.", + 'phonesync.state_sending': "Enviando…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "Cópias enviadas: {n}", + 'phonesync.last_file': "Última cópia: {name}", + 'phonesync.checking_groups': "Procurando grupos dos quais você é dono e único membro…", + 'phonesync.no_private_group': "Você não tem nenhum grupo do qual seja dono e único membro. Crie um só para você e volte aqui.", + 'phonesync.no_folder': "Este grupo não tem nenhuma pasta onde você possa adicionar arquivos.", + 'phonesync.notice': "{what}. {reason}", + 'phonesync.fail_disk_full': "Parado: o disco do node está cheio.", + 'phonesync.fail_read_only': "Parado: a pasta não aceita mais envios.", + 'phonesync.fail_no_folder': "Parado: a pasta não existe mais no grupo.", + 'phonesync.fail_unavailable': "Parado: o disco da pasta não está conectado ao node.", + 'phonesync.fail_not_member': "Parado: você não é mais membro deste grupo.", + 'phonesync.fail_not_private': "Parado: outra pessoa entrou no grupo.", + 'phonesync.fail_permission': "Parado: o MeshBay não tem mais acesso.", + 'phonesync.fail_other': "Parado.", + 'phonesync.open_settings': "Abrir as configurações do app", + 'drivesync.heading': "Backup de arquivos", + 'drivesync.intro': "Enviar os arquivos das pastas que você escolher neste celular, uma vez por dia, pelo Wi-Fi. Um arquivo alterado no celular é enviado de novo ao lado da cópia anterior; nada é substituído.", + 'drivesync.folders': "Pastas com backup", + 'drivesync.no_folders': "Nenhuma pasta escolhida ainda.", + 'drivesync.folders_hint': "Fotos e vídeos ficam com o backup de fotos: DCIM, Pictures e Movies não podem ser escolhidas. O Android não deixa um app pegar toda a pasta Download, só pastas dentro dela.", + 'drivesync.add_folder': "Adicionar uma pasta", + 'drivesync.remove': "Remover", + 'drivesync.refused_media': "Esta pasta contém fotos e vídeos, que o backup de fotos envia: escolha outra.", + 'drivesync.refused_root': "O Android não permite escolher um armazenamento inteiro: escolha uma pasta dentro dele.", + 'drivesync.notif_progress': "Backup de arquivos: {done} / {total}", + 'drivesync.metered_confirm': "Você está usando dados móveis. Enviar os arquivos mesmo assim?", + 'drivesync.sent_total': "Arquivos enviados: {n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "Copiar os backups de conversas que o WhatsApp faz, uma vez por dia pelo Wi-Fi, para poder restaurá-los em um celular novo. Eles continuam criptografados pelo WhatsApp: não dá para lê-los aqui, só restaurar.", + 'whatsappsync.folder_needed': "A pasta do WhatsApp ainda não foi escolhida.", + 'whatsappsync.folder_chosen': "A pasta do WhatsApp está escolhida.", + 'whatsappsync.folder_choose': "Escolher a pasta do WhatsApp", + 'whatsappsync.folder_hint': "O seletor abre nela: Android/media/com.whatsapp/WhatsApp. Toque em “Usar esta pasta”.", + 'whatsappsync.media': "Mídia também", + 'whatsappsync.media_hint': "Fotos, vídeos, mensagens de voz e documentos recebidos e enviados: muitas vezes vários gigabytes. O que o backup de fotos já envia não é enviado duas vezes.", + 'whatsappsync.refused': "Esta não é a pasta do WhatsApp: escolha Android/media/com.whatsapp/WhatsApp.", + 'whatsappsync.restore_hint': "Para restaurar em um celular novo: copie as pastas Databases e Backups da última cópia para Android/media/com.whatsapp/WhatsApp antes de instalar o WhatsApp e restaure com o mesmo número (e a senha ou a chave de 64 dígitos se o backup criptografado de ponta a ponta estiver ativado).", + 'whatsappsync.notif_progress': "Backup do WhatsApp: {done} / {total}", + 'androidsync.dest_heading': "Destino dos backups", + 'androidsync.dest_intro': "Os backups vão para uma pasta de um grupo do qual você é dono e único membro. Cada tipo de backup tem a sua própria pasta lá.", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "Pastas usadas: {dirs}", + 'androidsync.dest_change_confirm': "Todos os backups vão recomeçar em {folder} de {group}. O que já foi enviado fica onde está.", + 'androidsync.dest_not_in_photos': "A aba Fotos do grupo não mostra {dir}: as fotos serão salvas, mas não aparecerão lá até que essa pasta seja uma das pastas da aba (configurações do grupo).", + 'androidsync.dest_needed': "Escolha primeiro o destino dos backups, no topo desta página.", + 'androidsync.dest_save': "Salvar", + 'phonesync.turn_on': "Ativar", + 'photosync.fail_not_private': "Backup de fotos parado: outra pessoa entrou no grupo.", }; diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js index 51a6572..367efa0 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js @@ -66,6 +66,7 @@ export default { 'register.submit': '注册', 'register.loading': '正在创建账户…', 'register.has_account': '已经有账户了?', + 'register.legal_notice': "创建账户即表示您接受此 hub 的使用条款。依照法律,它须将您的连接日志(IP 地址、日期、操作)保存一年,即使您的账户已被删除。", 'register.login_link': '登录', 'register.recovery_title': '保存您的恢复密钥', 'register.recovery_intro': '如果您忘记了密码短语,此密钥可恢复您的群组身份。请将其保存在密码管理器或安全的地方。', @@ -123,6 +124,7 @@ export default { 'welcome.docs_devel': '开发文档', 'welcome.docs_design': '设计', 'welcome.docs_protocol': '协议', + 'welcome.docs_api': 'API', 'welcome.download': '下载(测试版)', 'welcome.legal': '法律信息', 'register.err_mismatch': '两次输入的密码不一致', @@ -205,6 +207,11 @@ export default { 'group.mkdir_prompt': '新文件夹名称', 'group.mkdir_offline': '未连接到节点。', 'group.download_offline': '未连接到节点 — 无法开始下载。连接会自动恢复,请稍后重试。', + 'group.link_unknown': "此链接指向一个您不是其成员的群组,或该群组已不再使用此名称。", + 'group.link_path_unknown': "此群组中 {path} 处没有内容——文件可能已被移动、重命名或删除。", + 'link.copy': "复制链接", + 'link.copied': "链接已复制", + 'link.copy_failed': "无法复制——链接为 {url}", 'group.download_write_stalled': '文件停止写入磁盘({seconds} 秒无进展)。已中止下载而不是让它一直卡住,请重试。', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', @@ -270,6 +277,7 @@ export default { 'group.upload_indexing': '建立索引中…', 'video.err_transport': '传输未连接', 'video.err_mse': '该编解码器不支持流式播放:{codec}', + 'video.err_no_mse': '此浏览器不支持视频流式播放(iPhone 需要 iOS 17.1 或更高版本)', 'video.mode_poster': '海报视图', 'video.mode_flat': '平铺列表', 'video.filter_all': 'All', @@ -366,10 +374,17 @@ export default { one: '{n} 张照片', other: '{n} 张照片', }, + 'photo.n_videos': { + one: "{n} 个视频", + other: "{n} 个视频", + }, + 'photo.play_video': "播放视频", 'photo.back': '返回', 'photo.prev': '上一张(←)', 'photo.next': '下一张(→)', 'photo.zip_album': '将相册下载为 zip', + 'photo.slideshow': '幻灯片放映', + 'photo.slideshow_stop': '停止幻灯片放映', 'photo.zoom_in': '放大', 'photo.zoom_out': '缩小', 'photo.zoom_fit_title': '适应窗口', @@ -383,6 +398,13 @@ export default { 'cast.copied': '链接已复制', 'cast.scanning': '正在搜索设备…', 'cast.no_devices': '未找到设备', + 'cast.casting_to': '投放到', + 'cast.seek': '播放位置', + 'cast.waiting': '正在等待电视…', + 'cast.back30': '后退 30 秒', + 'cast.fwd30': '前进 30 秒', + 'cast.play': '播放', + 'cast.pause': '暂停', // Settings 'settings.title': '设置', @@ -412,6 +434,15 @@ export default { 'settings.email_verified': '邮箱地址修改成功。', 'settings.notif_global_disable': '关闭所有通知', 'settings.notif_global_hint': '启用后,所有群组都不会创建通知。', + 'settings.push_label': '此手机上的通知', + 'settings.push_off': '已关闭。开启后,即使 MeshBay 已关闭,也会收到新消息和邀请的通知。', + 'settings.push_pending': '正在等待分发应用的响应…', + 'settings.push_blocked': 'Android 正在阻止 MeshBay 的通知:请在系统设置中允许。', + 'settings.push_ready': '已开启。新通知通过分发应用送达此手机,并经过加密,分发应用无法读取。', + 'settings.push_poll': '已开启。此手机大约每十五分钟检查一次新通知。如需即时收到,可以安装 UnifiedPush 分发应用,例如 ntfy(可选)。', + 'settings.push_global_off': '所有通知关闭期间不会发送任何内容。', + 'push.channel_chat': '消息', + 'push.channel_other': '邀请与账户', 'settings.defaults': '默认值', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -481,12 +512,11 @@ export default { 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', - 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', - 'settings.hub_hint': 'Changing this signs you out and restarts the window.', + 'settings.hub_hint': 'The hub this application connects to. Changing it signs you out: your account stays on this hub.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', @@ -504,12 +534,14 @@ export default { 'settings.node_key_placeholder': '粘贴 node 的 Ed25519 公钥(base64)', 'settings.node_key_submit': '关联 node', 'settings.node_key_success': 'node 关联成功', + 'settings.node_key_unlink': "取消关联", + 'settings.node_key_unlink_confirm': "要从你的账户取消关联该节点吗?在再次关联节点之前,它将停止为你的群组提供服务。", + 'settings.node_key_unlinked': "已取消关联节点", 'settings.node_key_current': '已关联的 node 密钥', // Sidebar 'sidebar.create_group': '创建群组', 'sidebar.settings': '设置', - 'sidebar.admin': '管理', // User menu 'usermenu.language': '语言', @@ -738,6 +770,7 @@ export default { 'transfers.eta_minutes': '剩余 {n} 分钟', 'transfers.eta_hours': '剩余 {n} 小时', 'transfers.failed': '失败', + 'transfers.disk_full': 'node 的磁盘已满', 'group.select': '选择', 'group.select_done': '完成', 'group.actions': '操作({n})', @@ -818,6 +851,7 @@ export default { 'indexdock.next_count': "等待中:{count}", 'indexdock.open': "打开此群组的设置", 'indexdock.hide': "隐藏,直到下一次索引", + 'indexdock.pause': "暂停索引此文件夹", 'chat.load_older': '加载更早的 {n} 条消息', 'chat.start_of_history': '对话开头', 'chat.today': '今天', @@ -864,7 +898,7 @@ export default { 'lazy.reload': '重新加载页面', // Sidebar - 'sidebar.node': 'Node', + 'androidsync.title': 'Android Sync', // Node admin 'node.title': 'Node', @@ -889,6 +923,7 @@ export default { 'node.startup_mode_service': '作为后台服务(开机时启动)', 'node.startup_mode_updating': '正在切换模式 — 请留意管理员权限提示…', 'node.startup_mode_service_unavailable_hint': '后台服务模式需要已安装的版本。如需本地测试,请在具有管理员权限的 PowerShell 中运行 "meshbay-node service install"。', + 'node.startup_mode_service_store_hint': '在任何人登录之前随系统启动,需要使用 MeshBay 安装程序 (.exe),而不是 Microsoft Store 版本。', 'node.not_operator': '无法连接到您的 node。请确保它正在运行。', 'node.offline': 'Node 已离线', 'node.retry': '重试', @@ -896,6 +931,13 @@ export default { 'node.pair_code_placeholder': '配对码', 'node.pair_button': '配对此浏览器', 'node.pair_success': '配对成功。', + 'node.pair_pending': '配对码已就绪:下次打开此 Node 的任一群组时将自动使用。', + 'node.link_other_node': "你的账户已关联到另一台机器的节点,因此此节点无法为你的群组提供服务。", + 'node.link_here': "改为关联此节点", + 'node.link_here_confirm': "将此节点关联到你的账户?当前关联的另一台机器上的节点将停止为你的群组提供服务,直到再次关联。", + 'node.link_other_account': "此节点是为 {account} 而不是为你设置的,因此无法为你的群组提供服务。", + 'node.link_take_over': "将此节点用于我的账户", + 'node.link_linking': "正在关联…", 'node.reload': '重新加载配置', 'node.reloaded': '配置已重新加载。对现有群组的目录更改现已生效。', 'node.restart_needed': '添加后请初始化群组密钥(meshbay-node gek-init --group <名称>)。', @@ -914,6 +956,8 @@ export default { 'node.setting_max_uploads': '最大同时上传数', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_max_upload': '单个上传的最大大小', + 'node.setting_connection_processes': '用于连接的 CPU 核心数', + 'node.setting_unit_of': '/ {n}', 'node.setting_unit_gb': 'GB', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', @@ -931,6 +975,9 @@ export default { 'node.remove_root': '移除', 'node.root_no_signing_key': '没有可用的签名密钥 — 请先将本设备与节点配对', 'node.root_no_route': '无法连接到节点 — 请先连接,或在运行该节点的机器上使用应用', + 'node.root_pause': "暂停索引", + 'node.root_resume': "继续索引", + 'node.root_paused': "索引已暂停", 'node.root_remove_last': '每个群组至少需要一个目录', 'node.root_path': '路径', 'node.directory': '目录', @@ -1054,6 +1101,8 @@ export default { 'settings_app.chat_encrypted_always': '本群组的聊天始终加密,无法关闭。', 'settings_app.chat_rotate_epoch': '更换聊天密钥', 'settings_app.chat_rotate_epoch_hint': '成员仍可阅读全部历史记录。已被移出群组的人无法阅读此后写入的内容。移除成员或设备时已自动执行此操作。', + 'settings_app.chat_purge': '清空聊天', + 'settings_app.chat_purge_hint': '删除此节点上该群组聊天的全部消息,对所有成员生效。附件保留在其文件夹中。此操作无法撤销。', 'settings_app.tmdb_token_prompt': '在 TMDB 注册以生成你自己的 API 密钥。', 'settings_app.tmdb_token_link': '获取密钥', 'settings_node.roots_offline_hint': '未连接到节点 — 变更将通过本地节点进行,并在其下次重新加载时生效。', @@ -1209,6 +1258,7 @@ export default { 'home.accept': "接受", 'home.decline': "拒绝", 'members.invited': "已邀请", + 'members.awaiting_code': "waiting for their code", 'hosts.title': "主机", 'hosts.hint': "你自己的 node 无需询问即可提供此群组。其他 node 只有在你于此处批准后才会提供;提出申请的 node 列在下方。", 'hosts.none': "没有其他 node 申请托管此群组。", @@ -1234,4 +1284,114 @@ export default { 'native.node_account_confirm': '这台电脑上的 node 已为 {current} 设置。改为为 {next} 设置吗?它将不再为 {current} 提供其托管的群组。', 'native.browser_access_confirm': '允许从浏览器登录吗?应用会在您使用的每个 node 上留下您的身份,并加以封存,只有您的密码短语配合您的 hub 账户才能打开。', 'native.declined': '已取消,未做任何更改。', + + // Photo backup, Android only (photo-sync.js, photo-sync-settings.js). + 'photosync.heading': "照片备份", + 'photosync.intro': "每天一次,通过 Wi-Fi 将这部手机拍摄的照片发送到您某个群组的文件夹。从手机删除的照片会保留在群组中。", + 'photosync.setup': "设置", + 'photosync.change': "更改", + 'photosync.turn_off': "关闭", + 'photosync.now': "立即备份", + 'photosync.permission_needed': "MeshBay 需要访问这部手机上的照片。", + 'photosync.permission_allow': "允许访问", + 'photosync.permission_partial': "访问权限仅限于您选择的照片:在您允许访问全部照片之前,新照片不会被备份。", + 'photosync.group': "群组", + 'photosync.choose_group': "选择群组", + 'photosync.checking_group': "正在读取群组的文件夹…", + 'photosync.group_offline': "目前没有托管此群组的 node 在线。请在其上线后重试。", + 'photosync.folder': "文件夹", + 'photosync.albums': "这部手机上的相册", + 'photosync.album_camera': "相机", + 'photosync.album_count': "{n} 张照片 · {size}", + 'photosync.videos_not_included': "视频未备份:点“更改”添加。", + 'photosync.videos_included': "视频也会备份。", + 'photosync.include_videos': "包括视频", + 'photosync.include_videos_hint': "视频体积较大:它们和照片一样通过 Wi-Fi 发送,首次备份可能需要一些时间。", + 'photosync.album_count_videos': "{n} 张照片,{v} 个视频 · {size}", + 'photosync.confirm_videos': "将把 {count} 个照片和视频({size},其中 {videos} 个视频,{videoSize})发送到 {dir},之后每天发送一次新的。", + 'photosync.video_permission_needed': "MeshBay 还需要访问本机的视频。", + 'photosync.scope_existing': "手机上已有的照片,然后是新照片", + 'photosync.scope_new': "仅从现在起拍摄的照片", + 'photosync.start': "开始备份", + 'photosync.confirm': "将把 {count} 张照片({size})发送到 {dir},之后每天发送一次新照片。", + 'photosync.confirm_new': "新照片将每天一次发送到 {dir}。", + 'photosync.metered_confirm': "您正在使用移动数据 — {count} 张照片,{size}。仍要发送吗?", + 'photosync.other_account': "已为 @{account} 设置。请以 @{account} 登录以继续,或在此重新设置。", + 'photosync.sent_total': "已发送照片:{n}", + 'photosync.last_run': "上次备份:{when}", + 'photosync.never': "尚未备份", + 'photosync.state_waiting_wifi': "正在等待 Wi-Fi", + 'photosync.state_connecting': "正在连接群组…", + 'photosync.state_sending': "正在发送 {done} / {total}", + 'photosync.state_offline': "群组的 node 均不在线;稍后重试", + 'photosync.state_interrupted': "已中断 — 将在下次有机会时继续", + 'photosync.state_up_to_date': "已是最新", + 'photosync.notif_progress': "正在备份照片 — {done} / {total}", + 'photosync.fail_disk_full': "照片备份已停止:node 的磁盘已满。", + 'photosync.fail_read_only': "照片备份已停止:该文件夹不再接受上传。", + 'photosync.fail_no_folder': "照片备份已停止:该文件夹已不在群组中。", + 'photosync.fail_unavailable': "照片备份已停止:该文件夹所在的磁盘未连接到 node。", + 'photosync.fail_not_member': "照片备份已停止:您已不再是此群组的成员。", + 'photosync.fail_permission': "照片备份已停止:MeshBay 已无法访问照片。", + 'photosync.fail_other': "照片备份已停止。", + 'contactsync.heading': "联系人备份", + 'contactsync.intro': "在联系人有变动的日子里,每天一次发送本机联系人的副本。每份副本都是任何手机都能导入的 .vcf 文件。", + 'contactsync.permission_needed': "MeshBay 需要访问本机的联系人。", + 'calendarsync.heading': "日历备份", + 'calendarsync.intro': "在日历有变动的日子里,每天一次发送本机日历的副本:包括你可以编辑的日历,不包括仅订阅的日历。每份副本都是任何日历都能导入的 .ics 文件。", + 'calendarsync.permission_needed': "MeshBay 需要访问本机的日历。", + 'messagesync.heading': "短信备份", + 'messagesync.intro': "每天一次发送本机的短信:第一份副本包含全部短信,之后每份只包含新短信。文件采用短信备份应用可以恢复的 XML 格式。不包括彩信。", + 'messagesync.permission_needed': "MeshBay 需要访问本机的短信。", + 'messagesync.restricted_hint': "如果 Android 提示这是受限设置:打开应用设置,点按顶部的 ⋮,选择“允许受限设置”,然后回到这里再次开启。Android 对不是从应用商店安装的应用有此要求。", + 'phonesync.state_sending': "正在发送…", + 'phonesync.summary': "{group} → {dir}", + 'phonesync.copies_sent': "已发送副本:{n}", + 'phonesync.last_file': "最近一份副本:{name}", + 'phonesync.checking_groups': "正在查找由你创建且只有你一个成员的群组…", + 'phonesync.no_private_group': "你没有由你创建且只有你一个成员的群组。请创建一个只属于你自己的群组,然后回到这里。", + 'phonesync.no_folder': "这个群组没有你可以添加文件的文件夹。", + 'phonesync.notice': "{what}。{reason}", + 'phonesync.fail_disk_full': "已停止:node 的磁盘已满。", + 'phonesync.fail_read_only': "已停止:该文件夹不再接受上传。", + 'phonesync.fail_no_folder': "已停止:该文件夹在群组中已不存在。", + 'phonesync.fail_unavailable': "已停止:该文件夹所在的磁盘未连接到 node。", + 'phonesync.fail_not_member': "已停止:你已不再是这个群组的成员。", + 'phonesync.fail_not_private': "已停止:有其他人加入了群组。", + 'phonesync.fail_permission': "已停止:MeshBay 已无法访问。", + 'phonesync.fail_other': "已停止。", + 'phonesync.open_settings': "打开应用设置", + 'drivesync.heading': "文件备份", + 'drivesync.intro': "每天一次通过 Wi-Fi 发送你在本机选择的文件夹中的文件。在手机上修改过的文件会在之前的副本旁边再次发送;不会替换任何内容。", + 'drivesync.folders': "已备份的文件夹", + 'drivesync.no_folders': "尚未选择文件夹。", + 'drivesync.folders_hint': "照片和视频由照片备份负责:不能选择 DCIM、Pictures 和 Movies。Android 不允许应用选择整个 Download 文件夹,只能选择其中的文件夹。", + 'drivesync.add_folder': "添加文件夹", + 'drivesync.remove': "移除", + 'drivesync.refused_media': "这个文件夹包含照片备份会发送的照片和视频:请选择其他文件夹。", + 'drivesync.refused_root': "Android 不允许选择整个存储空间:请选择其中的文件夹。", + 'drivesync.notif_progress': "正在备份文件:{done} / {total}", + 'drivesync.metered_confirm': "你正在使用移动数据。仍要发送这些文件吗?", + 'drivesync.sent_total': "已发送文件:{n}", + 'whatsappsync.heading': "WhatsApp", + 'whatsappsync.intro': "每天一次通过 Wi-Fi 复制 WhatsApp 自己生成的聊天备份,以便在新手机上恢复。它们仍由 WhatsApp 加密:这里无法读取,只能用于恢复。", + 'whatsappsync.folder_needed': "尚未选择 WhatsApp 的文件夹。", + 'whatsappsync.folder_chosen': "已选择 WhatsApp 的文件夹。", + 'whatsappsync.folder_choose': "选择 WhatsApp 的文件夹", + 'whatsappsync.folder_hint': "选择器会直接打开它:Android/media/com.whatsapp/WhatsApp。点按“使用此文件夹”。", + 'whatsappsync.media': "包括媒体", + 'whatsappsync.media_hint': "收发的照片、视频、语音消息和文档:常常有好几 GB。照片备份已发送的内容不会重复发送。", + 'whatsappsync.refused': "这不是 WhatsApp 的文件夹:请选择 Android/media/com.whatsapp/WhatsApp。", + 'whatsappsync.restore_hint': "在新手机上恢复:安装 WhatsApp 之前,把最新副本中的 Databases 和 Backups 文件夹复制到 Android/media/com.whatsapp/WhatsApp,然后用同一个手机号恢复(如果开启了端到端加密备份,还需要密码或 64 位密钥)。", + 'whatsappsync.notif_progress': "正在备份 WhatsApp:{done} / {total}", + 'androidsync.dest_heading': "备份保存位置", + 'androidsync.dest_intro': "备份会保存到一个由你创建且只有你一个成员的群组的文件夹中。每种备份在那里都有自己的文件夹。", + 'androidsync.dest_summary': "{group} → {folder}", + 'androidsync.dest_dirs': "使用的文件夹:{dirs}", + 'androidsync.dest_change_confirm': "所有备份将在 {group} 的 {folder} 中重新开始。已发送的内容保留在原处。", + 'androidsync.dest_not_in_photos': "该群组的照片标签页不显示 {dir}:照片会被备份,但在该文件夹加入标签页的文件夹之前(群组设置)不会在那里显示。", + 'androidsync.dest_needed': "请先在本页顶部选择备份保存位置。", + 'androidsync.dest_save': "保存", + 'phonesync.turn_on': "开启", + 'photosync.fail_not_private': "照片备份已停止:有其他人加入了群组。", }; |