diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/locales/en.js')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/locales/en.js | 231 |
1 files changed, 224 insertions, 7 deletions
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 0c9cb19..a4e07a1 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js @@ -95,7 +95,7 @@ export default { 'login.invalid': "Wrong username or passphrase.", 'login.locked': "Too many wrong passphrases for this account. Try again in {minutes} min, or reset your passphrase.", // Sign-in page: what MeshBay is (browser only) - 'welcome.title': 'The Internet as it was meant to be.', + 'welcome.title': 'The network that relies only on you.', 'welcome.lead': 'Your photos, music, videos and conversations stay at home, on your own computer. MeshBay lets you enjoy them from anywhere, and share them with the people you choose.', 'welcome.app_chat': 'Chat', 'welcome.app_photos': 'Photos', @@ -126,6 +126,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 +210,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 +281,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 +378,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 +402,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 +438,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 +516,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,6 +535,9 @@ 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 @@ -775,9 +807,12 @@ 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.', + 'settings_node.roots_local_only_hint': 'Adding a directory, and switching read-write or removable, are done on the machine running the node — in the desktop application, or with meshbay-node root.', 'settings_node.directories_title': 'App directories', 'settings_node.directories_hint': 'Which shared folders the Videos, Music and Photos apps use as their entry point(s).', @@ -875,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})', @@ -984,10 +1020,14 @@ export default { 'group.mute': 'Mute notifications', 'group.unmute': 'Unmute notifications', 'group.retry': 'Retry', + 'lazy.load_failed': 'This part of the interface could not be loaded. The hub may have been updated since this page was opened.', + 'lazy.reload': 'Reload the page', 'profile.title': 'Profile', 'usermenu.profile': 'Profile', // Node management (D5) + 'sidebar.phone': 'Phone', + 'androidsync.title': 'Android Sync', 'sidebar.node': 'Node', 'node.title': 'Node', 'node.service_checking': 'Checking node service…', @@ -1006,11 +1046,12 @@ export default { 'node.service_restarting': 'Restarting…', 'node.service_mode_hint': 'Running as a background service — it starts at boot, before sign-in.', 'node.startup_mode_label': 'Start automatically:', - 'node.startup_mode_off': 'Off (start manually)', + 'node.startup_mode_off': 'Only while MeshBay is open', 'node.startup_mode_signin': 'At sign-in', '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', @@ -1028,8 +1069,6 @@ export default { '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_remove_last': 'A group needs at least one directory', - 'node.root_path_hint': 'The path as the node sees it, on the machine hosting this group.', - 'node.root_path_placeholder': '/home/user/Media', 'node.root_path': 'Path', 'node.root_added': 'Directory added.', 'node.root_removed': 'Directory removed. Restart recommended to update the index.', @@ -1037,7 +1076,6 @@ export default { 'node.not_operator': 'Could not reach your node. Make sure it is running.', 'node.gek': 'Group key', 'node.gek_rotate': 'Rotate group key', - 'node.gek_rotate_confirm': 'Rotate the group key? Connected members will receive the new key automatically. Content already downloaded is unaffected.', 'node.gek_rotated': 'Group key rotated.', 'node.gek_init_hint': 'No group key yet. Run GEK init from the CLI to set one up.', 'node.gek_public_hint': 'Key rotation is not available for public groups.', @@ -1064,6 +1102,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', @@ -1173,4 +1218,176 @@ export default { // In-page confirm/alert (ask.js) 'dialog.ok': 'OK', 'dialog.cancel': 'Cancel', + + // Content reports (report.js, admin-page.js) + 'report.action': "Report", + 'report.title': "Report this file", + 'report.hint': "An administrator of this hub will review it.", + 'report.reason_illegal': "Illegal content", + 'report.reason_spam': "Spam", + 'report.reason_copyright': "Copyright infringement", + 'report.reason_other': "Other", + 'report.detail_placeholder': "Details (optional)", + 'report.send': "Send report", + 'report.sent': "Thank you. Your report has been recorded.", + 'admin.tab_reports': "Reports", + 'admin.no_reports': "Nothing is waiting for a decision", + 'admin.col_reporters': "Reporters", + 'admin.btn_dismiss': "Dismiss", + 'admin.report_block_confirm': "Block this file? Every node hosting a public group will stop serving it there.", + 'admin.reports_heading': "Content reports", + 'admin.reports_hint': "Who may report a file in a public group, how often, and what happens once enough members have.", + 'admin.reports_min_account_age_hours': "Minimum account age (hours)", + 'admin.reports_daily_per_account': "Reports per account per day", + 'admin.reports_review_threshold': "Members before review", + 'admin.reports_auto_block': "Block without review (1 = yes, 0 = no)", + 'admin.reports_save': "Save report settings", + + // Names made writable everywhere when saved (portable-name.js) + 'transfers.renamed': "Renamed: “{name}” is not a valid name on every system", + 'transfers.renamed_n': "Names changed to be valid on every system: {n}", + + // Invitations waiting for an answer, and the nodes a group owner approves + 'home.invitations': "Invitations", + 'home.invitation_hint': "Somebody added you to these groups. Accept only the ones you expect: a group you join can see your address when you open it.", + 'home.invited_by': "invited by {name}", + '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.", + 'hosts.from': "A node of {name}", + 'hosts.status_pending': "waiting for your answer", + 'hosts.status_approved': "approved", + 'hosts.status_refused': "refused", + 'hosts.approve': "Approve", + 'hosts.refuse': "Refuse", + 'hosts.online': "online", + + 'group.bundle_format_retired': 'This node holds your identity in a format this version no longer reads. Ask its operator to run “meshbay-node member unpin” for your account and send you a new invitation code.', + + 'settings.browser_access': 'Browser access', + 'settings.browser_access_on_hint': 'A browser can open your groups with your passphrase: this application leaves your identity on each node, sealed so that only your passphrase together with your hub account can open it.', + 'settings.browser_access_off_hint': 'Your identities stay on this device. Nothing of them is left on any node, and a browser cannot open your groups with your passphrase alone. A browser you approve from this application gets identities of its own.', + 'settings.browser_access_turn_on': 'Allow browsers', + 'settings.browser_access_turn_off': 'Keep identities on this device only', + 'settings.browser_access_next_open': 'Applied to each group the next time it opens.', + 'settings.browser_access_off_in_browser': 'Browser access is off for this account. It is turned on in the MeshBay desktop application, which can also approve this browser for itself.', + 'group.browser_access_off': 'Browser access is off for this account. Turn it on in the MeshBay desktop application (Profile), or approve this browser from it.', + // Worded by the desktop main process for its own dialogs (main.js). + '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.", }; |