aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js
diff options
context:
space:
mode:
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.js231
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.",
};