/** * English — the source catalogue. * * Every other locale is a translation of this file and carries the same keys. * A value may be a string, or an object of Intl.PluralRules categories * (`one`, `few`, `many`, `other`) when it is rendered with a count. * * Product vocabulary stays in English everywhere: `hub`, `node` and `GEK` name * the CLI (`meshbay-node`), node.toml and the docs, so translating them would * cut the interface off from everything an operator reads and types. */ export default { // Nav 'nav.toggle_menu': 'Toggle menu', 'nav.light_mode': 'Light mode', 'nav.dark_mode': 'Dark mode', 'nav.logout': 'Logout', 'nav.login': 'Login', // Sidebar 'sidebar.my_groups': 'My Groups', 'sidebar.no_groups': 'No groups yet', 'sidebar.discover': 'Discover', 'sidebar.public_groups': 'Public groups', // Login 'login.title': 'Login', 'login.username': 'Username', 'login.password': 'Password', 'login.submit': 'Login', 'login.loading': 'Logging in...', 'login.no_account': 'No account?', 'login.register_link': 'Register', // Register 'register.title': 'Register', 'register.username': 'Username', 'register.email': 'Email', 'register.password': 'Passphrase (min 12 chars)', 'register.confirm': 'Confirm password', 'register.submit': 'Register', 'register.loading': 'Creating account...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Login', 'register.success_title': 'Account created', 'register.success_msg': 'You can now log in with your credentials.', 'register.go_login': 'Go to login', 'register.err_mismatch': 'Passwords do not match', 'register.err_min_len': { one: 'Use at least {n} character', other: 'Use at least {n} characters', }, 'register.err_too_weak': 'Too easy to guess. Your passphrase is what protects ' + 'your keys where they are stored — a few unrelated words work well.', 'register.strength': 'Strength: about {bits} bits. This protects the copy of ' + 'your keys kept on the nodes you join, so it is worth getting right.', // Home 'home.welcome': 'Welcome to MeshBay', 'home.no_groups': 'You are not a member of any group yet.', 'home.browse_prefix': 'Browse ', 'home.browse_link': 'public groups', 'home.browse_suffix': ' or ask a group admin to invite you.', 'home.my_groups': 'My Groups', // Explore 'explore.title': 'Public Groups', 'explore.search': 'Search groups...', 'explore.loading': 'Loading...', 'explore.empty': 'No public groups available.', 'explore.create_group': 'Create group', 'explore.join': 'Join', 'explore.member': 'Joined', // Group page 'group.default_name': 'Group', 'group.tab_files': 'Files', 'group.tab_chat': 'Chat', 'group.tab_video': 'Videos', 'group.tab_music': 'Music', 'group.tab_photos': 'Photos', 'group.tab_members': 'Members', 'group.tab_settings': "Settings", 'members.danger_leave_hint': "You will lose access to this group's files and chat.", 'members.uploads_title': "Uploads", 'members.uploads_on': "Members can add files", 'members.uploads_off': "Only you can add files", 'members.uploads_disable': "Turn off", 'members.uploads_enable': "Turn on", 'members.uploads_hint': "Applies to everyone but you. The node refuses the upload itself, so this is not a matter of hiding a button.", 'members.apps_title': "Applications", 'members.apps_hint': "Which parts of this group members see. At least one must stay on.", 'members.apps_need_one': "At least one application must stay enabled.", 'members.danger_delete_hint': "This removes the group for every member. It cannot be undone.", 'group.filter': 'Filter files...', 'group.col_name': 'Name', 'group.col_size': 'Size', 'group.col_type': 'Type', 'group.col_date': 'Date', 'group.empty_filter': 'No files match the filter', 'group.empty_dir': 'This directory is empty', 'group.download': 'Download', 'group.play': 'Play', 'group.offline_title': 'No nodes are currently online for this group.', 'group.offline_hint': 'Files will appear when a node hosting this group connects.', 'group.upload': 'Upload', 'group.mkdir': 'New folder', 'group.mkdir_prompt': 'Name of the new folder:', '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.', 'device.add_btn': 'Get a linking code', 'device.add_show': 'Type this code into a device already linked to this node, within the hour:', 'device.mine_title': 'Your devices on this node', 'device.mine_hint': 'Each browser or client you use here holds its own key. They are separate from your devices on other nodes.', 'device.mine_empty': 'No device is linked here yet.', 'device.this_one': 'this one', 'device.revoke': 'Remove', 'device.revoke_confirm': 'Remove this device? It will lose access to this node until it is linked again.', 'device.approve_hint': 'Linking a new device? Enter the code it is showing.', 'device.approve_btn': 'Approve', 'device.approved': 'Device linked.', 'group.root_unavailable': '(unavailable — the drive is disconnected)', 'group.view': 'View', 'group.delete': 'Delete', 'group.delete_confirm': 'Delete {name}?', 'group.delete_group': 'Delete group', 'group.delete_group_confirm': 'Permanently delete "{name}" and remove all members? Files on the node are preserved.', 'group.err_transport': 'Transport module not loaded', // Status 'status.idle': 'Idle', 'status.discovering': 'Finding nodes...', 'status.connecting': 'Connecting...', 'status.connecting_short': 'Connecting...', 'status.fetching': 'Fetching index...', 'status.files': { one: '{n} file', other: '{n} files', }, 'status.offline': 'No nodes online', 'status.error': 'Connection failed', // Chat 'chat.empty': 'No messages yet. Start the conversation!', 'chat.placeholder': 'Type a message...', 'chat.send': 'Send', 'chat.attach': 'Attach file', // Video player 'video.loading': 'Loading {name}...', 'video.buffering': 'Buffering...', 'video.resumed_at': "Resumed at {time}", 'video.from_start': "Start from the beginning", 'video.close': 'Close (Esc)', 'preview.pdf_fallback': 'This browser will not display the PDF inline. Download it instead — it was decrypted here either way.', 'group.upload_indexing': 'indexing…', 'video.err_transport': 'Transport not connected', 'video.err_mse': 'Codec not supported for streaming: {codec}', 'video.mode_poster': 'Posters', 'video.mode_flat': 'Flat list', 'video.empty': 'No videos found.', 'video.no_root_configured': 'No Videos root folder is set for this group yet — an operator can choose one in Settings.', 'music.no_root_configured': 'No Music root folder is set for this group yet — an operator can choose one in Settings.', 'video.director': 'Director', 'video.specials': 'Specials', 'video.season_n': 'Season {n}', 'video.episode_n': 'Episode {n}', 'video.n_episodes': { one: '{n} episode', other: '{n} episodes', }, 'video.fix_match': 'Fix match…', 'video.search_title': 'Correct the TMDB match', 'video.search_placeholder': 'Search TMDB…', 'video.search_button': 'Search', 'video.search_no_results': 'No matches found.', 'video.search_apply_hint': 'Applies to every file currently grouped under this title.', // Music 'music.mode_grid': 'Albums', 'music.mode_flat': 'Flat list', 'music.empty': 'No music found.', 'music.unknown_album': 'Unknown album', 'music.various': 'Various', 'music.play_all': 'Play all', 'music.n_tracks': { one: '{n} track', other: '{n} tracks', }, 'music.err_transport': 'Transport not connected', 'music.err_playback': 'Playback error', 'music.err_transcode': 'Format conversion failed', 'music.player_play': 'Play', 'music.player_pause': 'Pause', 'music.player_prev': 'Previous', 'music.player_next': 'Next', 'music.player_shuffle': 'Shuffle', 'music.player_repeat_off': 'Repeat off', 'music.player_repeat_all': 'Repeat all', 'music.player_repeat_one': 'Repeat one', 'music.player_volume': 'Volume', 'music.player_close': 'Close player', 'music.player_queue': 'Current queue', 'music.queue_title': 'Playing now', // Photos 'photo.empty': 'No photos found.', 'photo.no_roots_configured': 'No Photos root folders are set for this group yet — an operator can choose some in Settings.', 'photo.root_album': '(top level)', 'photo.n_photos': { one: '{n} photo', other: '{n} photos', }, 'photo.back': 'Back', 'photo.prev': 'Previous (←)', 'photo.next': 'Next (→)', 'photo.zip_album': 'Download album as zip', 'photo.zoom_in': 'Zoom in', 'photo.zoom_out': 'Zoom out', 'photo.zoom_fit_title': 'Fit to window', 'photo.zoom_fit_label': 'Fit', 'photo.zoom_100': 'Actual size (100%)', // LAN cast 'cast.start': 'Cast to device', 'cast.stop': 'Stop casting', 'cast.copy_url': 'Copy stream URL', 'cast.copied': 'URL copied', 'cast.scanning': 'Scanning for devices…', 'cast.no_devices': 'No devices found', // Settings 'settings.title': 'Settings', 'settings.coming_soon': 'Coming soon.', 'settings.downloads': 'Downloads', 'settings.dl_auto': 'Save automatically', 'settings.dl_auto_hint': 'Files go straight into the folder you choose below, ' + 'with no dialog. Downloading twenty files puts twenty files there.', 'settings.dl_ask': 'Ask every time', 'settings.dl_ask_hint': 'A Save As dialog for each file — one per file, ' + 'including when you download a selection.', 'settings.dl_folder': 'Folder: {name}', 'settings.dl_no_folder': 'No folder chosen — downloads go wherever your browser ' + 'puts them', 'settings.dl_choose': 'Choose folder', 'settings.dl_change': 'Change', 'settings.dl_forget': 'Forget', 'settings.profile': 'Profile', 'settings.username': 'Username', 'settings.email': 'Email', 'settings.email_save': 'Save', 'settings.email_saved': 'Email updated', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', 'settings.defaults': 'Defaults', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', 'settings.music_keep_screen_on': 'Keep screen on during music playback', 'settings.music_keep_screen_on_hint': 'Prevents the phone from locking on its own while a track is playing. Off by default — most people want their phone to lock normally while listening, like Spotify or Deezer.', 'settings.node_pins': 'Node identities', 'settings.node_pins_hint': "Each node's identity key is remembered the first time you connect. If it changes, the connection is refused — that is expected only when an operator reinstalls a node. Verify with them before clearing.", 'settings.node_pins_count': { one: '{n} pinned', other: '{n} pinned', }, 'settings.node_pins_clear': 'Clear pinned identities', 'settings.danger': 'Delete account', 'settings.delete_hint': 'Removes your account, your group memberships and your ' + 'notifications from the hub, and frees your username. It cannot reach what ' + 'lives on nodes: files you uploaded stay where their operator keeps them, ' + 'and each node keeps the identity it pinned for you until its operator ' + 'unpins it. Connection logs are kept for a year, as the law requires.', 'settings.delete_account': 'Delete my account', 'settings.delete_confirm': 'Enter your passphrase to confirm. This cannot be undone.', 'settings.delete_confirm_btn': 'Delete for good', 'settings.cancel': 'Cancel', 'settings.appearance': 'Appearance', 'settings.theme': 'Theme', 'settings.theme_light': 'Light', 'settings.theme_dark': 'Dark', 'settings.theme_system': 'System', 'settings.language': 'Language', 'settings.about': 'About', 'firstrun.title': 'Which hub?', '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. A hub on your own machine is usually http, not https.', '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.', 'settings.keys_unavailable': 'This system offers no key storage at all, so this device cannot be remembered — you will be asked for your passphrase each time. That is the safe outcome: nothing was stored unprotected.', 'settings.version': 'Version', 'settings.protocol': 'Protocol', 'settings.role': 'Role', 'settings.groups': 'Group notifications', 'settings.notifications': 'Notifications', 'settings.node_key': 'Link Node', 'settings.node_key_desc': 'If you operate a MeshBay node, paste its Ed25519 public key here to link it to your account. You can find this key in your node\'s admin dashboard.', '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_current': 'Linked node key', // Sidebar 'sidebar.create_group': 'Create group', 'sidebar.settings': 'Settings', 'sidebar.admin': 'Admin', // User menu 'usermenu.language': 'Language', 'usermenu.settings': 'Settings', 'usermenu.theme_light': 'Light mode', 'usermenu.theme_dark': 'Dark mode', 'usermenu.logout': 'Logout', // Admin panel 'admin.title': 'Administration', 'admin.tab_stats': 'Stats', 'admin.tab_users': 'Users', 'admin.tab_groups': 'Groups', 'admin.tab_nodes': 'Nodes', 'admin.tab_logs': 'Logs', 'admin.col_observed_ip': 'Seen from', 'admin.col_hint': 'Announced hint', 'admin.col_last_seen': 'Last announce', 'admin.node_online': 'online', 'admin.node_offline': 'offline', 'admin.no_nodes': 'No nodes registered', 'admin.nodes_hint': '"Seen from" is the address the announcement arrived from, ' + 'on a request signed with the node key — that is the one to answer a ' + 'question with. The hint is what the node believes its own address to be, ' + 'learned from a STUN server and sent to us; it is useful for reaching the ' + 'node and is not evidence of anything.', 'admin.tab_blocklist': 'Blocklist', // Admin stats 'admin.stat_users': 'Users', 'admin.stat_groups': 'Groups', 'admin.stat_nodes': 'Nodes', 'admin.stat_online': 'Online Nodes', // Admin users 'admin.users_search': 'Search users...', 'admin.col_username': 'Username', 'admin.col_role': 'Role', 'admin.col_status': 'Status', 'admin.col_created': 'Created', 'admin.col_actions': 'Actions', 'admin.col_email': 'Email', 'admin.col_groups': 'Groups', 'admin.no_users': 'No users found', 'admin.btn_suspend': 'Suspend', 'admin.btn_unsuspend': 'Unsuspend', 'admin.btn_details': 'Details', 'admin.btn_delete': 'Delete', 'admin.delete_confirm': 'Delete the account "{user}"? This cannot be undone. ' + 'Files they uploaded stay on the nodes that host them, and each node keeps ' + 'the identity it pinned until its operator unpins it. Suspending is the ' + 'reversible option.', 'admin.user_detail': 'User details', 'admin.btn_close': 'Close', 'admin.self_note': '(you)', // Admin groups 'admin.col_name': 'Name', 'admin.col_visibility': 'Visibility', 'admin.col_members': 'Members', 'admin.no_groups': 'No groups found', // Admin logs 'admin.col_time': 'Time', 'admin.col_event': 'Event', 'admin.col_user': 'User', 'admin.col_ip': 'IP', 'admin.col_detail': 'Detail', 'admin.filter_all': 'All events', 'admin.no_logs': 'No logs found', 'admin.btn_load_more': 'Load more', // Admin blocklist 'admin.col_hash': 'Hash', 'admin.col_reason': 'Reason', 'admin.col_date': 'Date', 'admin.col_added_by': 'Added by', 'admin.no_blocked': 'No blocked hashes', 'admin.add_hash': 'Add hash to blocklist', 'admin.hash_placeholder': 'blake3 hash (64 hex chars)', 'admin.reason_placeholder': 'Reason', 'admin.btn_block': 'Block', 'admin.btn_unblock': 'Unblock', // Notifications // Create group 'create_group.title': 'Create Group', 'create_group.name': 'Group name', 'create_group.name_placeholder': 'e.g. Family Photos, Project Files...', 'create_group.join_policy': 'Join policy', 'create_group.invite': 'Invite only', 'create_group.invite_desc': "Members must be invited by an admin. The group is not listed publicly.", 'create_group.open': 'Open (anyone can join)', 'create_group.open_desc': "Listed in public groups — anyone can find it and join without approval.", 'create_group.description': 'Description', 'create_group.description_hint': 'What is this group about? (optional)', 'create_group.submit': 'Create', 'create_group.hint': 'A group needs a node to host files. You can create the group now and connect a node later.', 'create_group.creating': 'Creating...', // Create Group Wizard (Electron-only) 'wizard.title': 'Create Group', 'wizard.detecting': 'Detecting local node...', 'wizard.node_not_found': 'No local node detected. Make sure meshbay-node is running.', 'wizard.retry': 'Retry', 'wizard.skip_node': 'Continue without node', 'wizard.node_offline_warning': 'Node is not running. The group will be created on the hub only. You can connect the node later from the Node page.', 'wizard.directories': 'Shared directories', 'wizard.directories_hint': 'Choose the directories this group will share. At least one is required.', 'wizard.add_directory': 'Add directory', 'wizard.upload_target': 'upload target', 'wizard.set_upload': 'Set as upload target', 'wizard.remove': 'Remove', 'wizard.create_and_setup': 'Create and set up', 'wizard.create_hub_only': 'Create on hub only', 'wizard.setting_up': 'Setting up your group...', 'wizard.step_create_hub': 'Creating group on hub', 'wizard.step_attach': 'Attaching to node', 'wizard.step_apps': 'Choosing applications', 'wizard.step_add_roots': 'Adding directories', 'wizard.step_gek': 'Initializing encryption key', 'wizard.step_pair': 'Setting up pairing', 'wizard.step_index': 'Indexing files', 'wizard.indexing_progress': 'Indexing… {pct}%', 'wizard.indexing_current_dir': 'Scanning: {dir}', 'wizard.finish_later': 'Finish setup later', 'wizard.done_title': 'Group created', 'wizard.done_message': 'Your group is ready. Your node is hosting it and encryption is set up.', 'wizard.go_to_group': 'Go to group', // First-run setup wizard (Electron-only) 'setup.welcome_title': 'Welcome to MeshBay', 'setup.welcome_message': 'Your node hosts your files — encrypted, on your machine. Let’s get it running and create your first group.', 'setup.node_detected': 'Local node detected and running.', 'setup.node_not_running': 'Your node is installed but not running.', 'setup.node_start': 'Start node', 'setup.node_starting': 'Starting node…', 'setup.node_started': 'Node started.', 'setup.node_not_installed': 'meshbay-node is not installed on this machine.', 'setup.node_install_hint': 'Install it with your package manager, then come back here.', 'setup.skip': 'Skip — create a group without a local node', 'setup.create_group': 'Create your first group', 'setup.dismiss': 'Skip setup', // Unified Group Settings (node sections) 'settings_node.roots': 'Shared directories', 'settings_node.detach_failed_continue': 'Could not detach the group from the node. Delete on hub anyway?', 'settings_node.scan_title': 'Scanning', 'settings_node.scan_hint': 'How often the node re-checks its directories for changes it may have missed, and how long it waits after a file changes before indexing it.', 'settings_node.scan_reconcile_label': 'Re-check interval (minutes)', 'settings_node.scan_debounce_label': 'Wait after a change (seconds)', 'settings_node.scan_save': 'Save', 'settings_node.scan_saving': 'Saving…', 'settings_node.scan_saved': 'Saved.', 'settings_node.tmdb_title': 'TMDB metadata', 'settings_node.tmdb_hint': 'Lets the Videos app show posters, overviews and cast from TMDB. Off means thumbnail-only browsing, with no request to a third party.', 'settings_node.tmdb_enabled': 'Enabled', 'settings_node.tmdb_disabled': 'Disabled', 'settings_node.tmdb_token_label': 'Custom API token (optional)', 'settings_node.tmdb_token_placeholder': 'Leave blank to use the shipped default', 'settings_node.tmdb_token_customized': 'A custom token is set.', 'settings_node.tmdb_token_default': 'Using the shipped default token.', 'settings_node.tmdb_save': 'Save', 'settings_node.tmdb_language_label': 'Language', 'settings_node.tmdb_language_hint': 'Applies to everyone — one shared cache, not a per-viewer request.', 'settings_node.video_root_title': 'Videos root folder', 'settings_node.video_root_hint': 'Which folder (or subfolder) the Videos app treats as its entry point for this group. Nothing shows in Videos, and no TMDB lookups run, until one is chosen.', 'settings_node.video_root_none': '— none chosen —', 'settings_node.musicbrainz_title': 'MusicBrainz metadata', 'settings_node.musicbrainz_hint': 'Lets the Music app show cover art and canonical naming from MusicBrainz when a track has no usable embedded cover. Off means tag/filename-only browsing, with no request to a third party.', 'settings_node.musicbrainz_enabled': 'Enabled', 'settings_node.musicbrainz_disabled': 'Disabled', 'settings_node.musicbrainz_contact_label': 'Contact (required for MusicBrainz to answer requests)', 'settings_node.musicbrainz_contact_placeholder': 'you@example.com or a project URL', 'settings_node.musicbrainz_contact_set': 'A contact is configured.', 'settings_node.musicbrainz_contact_unset': 'No contact configured — MusicBrainz lookups stay off until one is set.', 'settings_node.musicbrainz_save': 'Save', 'settings_node.video_root_save': 'Save', 'settings_node.video_root_change_confirm': 'Changing the Videos root replaces what every member sees in the Videos tab. Continue?', 'settings_node.audio_root_title': 'Music root folder', 'settings_node.audio_root_hint': 'Which folder (or subfolder) the Music app treats as its entry point for this group. Nothing shows in Music, and no tag/cover reading runs, until one is chosen.', 'settings_node.audio_root_none': '— none chosen —', 'settings_node.audio_root_save': 'Save', 'settings_node.audio_root_change_confirm': 'Changing the Music root replaces what every member sees in the Music tab. Continue?', 'settings_node.photo_roots_title': 'Photos root folders', 'settings_node.photo_roots_hint': 'Which folder(s) the Photos app treats as entry points for this group — a photo library is often scattered across several folders, so more than one may be chosen. Nothing shows in Photos until at least one is added.', 'settings_node.photo_roots_none': '— none chosen —', 'settings_node.photo_roots_add_placeholder': 'Add a folder…', 'settings_node.photo_roots_add': 'Add', 'settings_node.photo_roots_remove': 'Remove', 'settings_node.photo_roots_save': 'Save', 'settings_node.directories_title': 'Directories', 'settings_node.directories_hint': 'Shared folders, and which of them the Videos, Music and Photos apps use as their own entry point(s).', // Members 'members.col_role': 'Role', 'members.group_role': 'Group role', 'members.admin': 'Admin', 'members.group_admin': 'Group admin', 'members.owner': 'Owner', 'members.member': 'Member', 'members.invite_title': 'Invite member', 'members.username_placeholder': 'Username', 'members.invite_btn': 'Invite', 'members.invite_needs_pairing': 'Invitations are signed with the key this node ' + 'pinned for your browser, so pair it below before inviting anyone.', 'members.invite_ask_operator': 'Only the operator of the node hosting this group can ' + 'invite, from a browser paired with it.', 'members.remove': 'Remove', 'members.remove_confirm': 'Remove {user} from this group? Their account, their ' + 'other groups and the files they uploaded are not affected.', 'members.remove_hint': 'Removing someone takes away their membership and stops ' + 'the node serving them the group key. It does not delete their account, and ' + 'it does not take back the key they already hold — rotate it on the node ' + '(meshbay-node gek-init) if that matters.', 'members.pair_title': 'Pair this browser with your node', 'members.pair_hint': 'Your node only accepts operator actions — invites, file ' + 'deletion — from a browser it has been paired with. Run ' + '`meshbay-node operator pair` on the node and type the code here. The code ' + 'never passes through the hub.', 'members.pair_btn': 'Pair', 'members.pair_success': 'This browser is now paired with the node.', 'members.invite_code_ready': 'Invitation code for {user} — send it to them the way ' + 'you normally talk. It works once, and it never passes through the hub.', 'members.invite_code_hint': 'They enter it the first time they open this group. ' + 'You do not need to be online then.', 'transfers.title': 'Transfers', 'transfers.clear': 'Clear finished', 'transfers.cancel': 'Cancel', 'transfers.open': 'Open', 'transfers.done': 'Finished', 'transfers.cancelled': 'Cancelled', 'transfers.failed': 'Failed', 'group.select': 'Select', 'group.select_done': 'Done', 'group.actions': 'Actions ({n})', 'group.download_n': 'Download ({n})', 'group.download_zip_n': 'Download folders as zip ({n})', 'group.delete_n': 'Delete ({n})', 'group.delete_n_confirm': { one: 'Delete {n} item? {names}', other: 'Delete {n} items? {names}', }, 'group.download_zip': { one: 'Download as zip ({n} file)', other: 'Download as zip ({n} files)', }, 'group.zip_empty': 'That folder has nothing in it to download.', 'group.zip_no_stream': 'This browser cannot write a download straight to disk, ' + 'so {name} ({size}) has to be built in memory first. On a large archive ' + 'that may fail. Continue?', 'group.rmdir': 'Delete folder', 'group.rmdir_confirm': 'Delete the folder "{name}"? It must be empty.', 'group.rmdir_not_empty': 'That folder is not empty. Delete what is in it first — ' + 'nothing here removes files you cannot see.', 'group.desc_edit': 'Edit description', 'group.desc_add': 'Add a description', 'group.desc_save': 'Save', 'group.desc_cancel': 'Cancel', 'group.desc_placeholder': 'What this group is for — members see it on their home page.', 'group.join_code_title': 'This node needs to recognise you', 'group.join_code_hint': 'Ask whoever invited you for the one-time code, and enter ' + 'it here. After that this browser is recognised and you will not be asked again.', 'group.join_code_btn': 'Join', 'notif.purge': 'Clear all', 'notif.title': 'Notifications', 'notif.empty': 'No notifications', 'notif.mark_all_read': 'Mark all read', // Sidebar 'sidebar.search': 'Search files', // Status // Search 'search.title': 'Search Files', 'search.placeholder': 'Search across all groups...', 'search.no_results': 'No files match your search.', 'search.synced': 'synced {ago}', 'search.cache_note': 'Search reads what each group looked like the last time you ' + 'opened it. Open a group to bring its files up to date here.', 'search.col_group': 'Group', 'search.result_count': { one: '{n} file found', other: '{n} files found', }, 'search.hint': 'Search file names across all cached group indexes.', // Presence, chat paging, leaving a group, the profile page 'presence.online': 'A node serving this group is online', 'presence.offline': 'No node is reachable for this group', 'presence.unknown': 'Not checked yet', 'presence.indexing': 'Indexing — {pct}% done', 'chat.load_older': 'Load {n} older messages', 'chat.start_of_history': 'Beginning of the conversation', 'chat.today': 'Today', 'chat.yesterday': 'Yesterday', 'chat.unread': 'New messages', 'chat.jump_latest': 'Jump to latest', 'chat.jump_new': 'New messages', 'group.leave': 'Leave group', 'group.leave_confirm': 'Leave “{name}”? You will lose access to its files and chat. Files you uploaded stay on the node, and the node keeps the identity it pinned for you until its operator removes it.', 'group.mute': 'Mute notifications', 'group.unmute': 'Unmute notifications', 'group.retry': 'Retry', 'profile.title': 'Profile', 'usermenu.profile': 'Profile', // Node management (D5) 'sidebar.node': 'Node', 'node.title': 'Node', 'node.service_checking': 'Checking node service…', 'node.service_not_installed': 'Not installed as a service', 'node.service_state_active': 'Running', 'node.service_state_inactive': 'Stopped', 'node.service_state_failed': 'Failed', 'node.service_state_activating': 'Starting…', 'node.service_state_deactivating': 'Stopping…', 'node.service_state_unknown': 'Unknown', 'node.service_start': 'Start', 'node.service_starting': 'Starting…', 'node.service_stop': 'Stop', 'node.service_stopping': 'Stopping…', 'node.service_restart': 'Restart', 'node.service_restarting': 'Restarting…', 'node.offline': 'Node is offline', 'node.no_groups': 'No groups configured on this node.', 'node.retry': 'Retry', 'node.files': { one: '1 file', other: '{n} files' }, 'node.peers': { one: '1 peer', other: '{n} peers' }, 'node.no_gek': 'No group key', 'node.roots': 'Directories', 'node.upload_root': 'uploads', 'node.unavailable': 'unavailable', 'node.add_root': 'Add directory', 'node.remove_root': 'Remove', 'node.root_added': 'Directory added.', 'node.root_removed': 'Directory removed. Restart recommended to update the index.', 'node.root_remove_confirm': 'Remove "{name}" from this group?', '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.', 'node.roster': 'Roster', 'node.roster_load': 'Load roster', 'node.roster_empty': 'No members pinned yet.', 'node.roster_user': 'User', 'node.roster_role': 'Role', 'node.roster_status': 'Status', 'node.roster_via': 'Pinned via', 'node.roster_invites': { one: '1 pending invite', other: '{n} pending invites' }, 'node.unpin': 'Unpin', 'node.unpin_confirm': 'Unpin "{name}"? They will need to pair again.', 'node.unpin_done': 'Identity unpinned.', 'node.denylist': 'Denylist', 'node.denylist_load': 'Load denylist', 'node.denylist_empty': 'Denylist is empty.', 'node.denylist_count': { one: '1 entry', other: '{n} entries' }, 'node.denylist_remove': 'Remove', 'node.denylist_clear_all': 'Clear all', 'node.denylist_clear_confirm': 'Remove "{subject}" from the denylist?', 'node.denylist_cleared': 'Denylist entry removed.', 'node.reload': 'Reload config', 'node.reloaded': 'Config reloaded. Root changes on existing groups are now active.', 'node.attach_group': 'Add group', 'node.attach_pick': 'Group to host', 'node.attach_dir': 'Shared directory', 'node.attach_upload_label': 'Upload directory (for file uploads and chat attachments)', 'node.attach_upload_dir': 'Upload directory', 'node.attached': 'Group added and loaded. Run meshbay-node gek-init --group {name} if not done yet.', 'node.restart_needed': 'After adding: initialise the group key (meshbay-node gek-init --group ).', 'node.detach_group': 'Remove group', 'node.detach_confirm': 'Remove "{name}" from this node?', 'node.detached': 'Group removed.', 'node.stale': 'not on hub', };