Search selfstore
v1.8.21

Every label key

Every string a widget renders is a key with a default. This page is the lookup: which keys exist, and what they say in English. How to override them, how a language is chosen, and what {placeholders} do is on wording and localization.

French ships with every widget, so an app in French writes none of this.

selfstore-connect

58 keys.

Key English default
connect.title Where should we save your data?
connect.recommended Recommended
connect.drive Google Drive
connect.drive.sub Available on all your devices
connect.file A file on this device
connect.file.sub Offline, you keep the file
connect.file.new New backup
connect.file.open Load an existing file
connect.webdav My own server (WebDAV)
connect.webdav.sub Nextcloud, ownCloud, yours
connect.s3 My own bucket (S3)
connect.s3.sub Amazon S3, R2, B2, MinIO
connect.server My own server
connect.server.sub WebDAV or an S3 bucket you control
connect.tab.webdav WebDAV
connect.tab.s3 S3
connect.s3.endpoint Endpoint URL
connect.s3.region Region
connect.s3.bucket Bucket
connect.s3.key Object key (path)
connect.s3.accessKeyId Access key ID
connect.s3.secret Secret access key
connect.s3.submit Connect
connect.connecting Connecting…
connect.connecting.drive Authorise access in the Google window.
connect.cancel Cancel
connect.retry Try again
connect.password.title This backup is protected
connect.password.hint Enter its password to open it.
connect.password.placeholder Password
connect.password.wrong Wrong password. Try again.
connect.password.submit Open
connect.password.show Show password
connect.password.hide Hide password
connect.password.forgot Forgot the password?
connect.password.forgot.warn Without the password, this backup cannot be opened. You can erase it and start from an empty one. The old backup is lost for good.
connect.password.forgot.confirm Overwrite the backup
connect.password.forgot.back Back
connect.conflict.title This destination already holds a backup
connect.conflict.merge Merge both
connect.conflict.merge.sub Keep everything from both sides
connect.conflict.resume Use the backup
connect.conflict.resume.sub This device adopts it
connect.conflict.replace Replace the backup
connect.conflict.replace.sub This device wins, the backup is overwritten
connect.webdav.url Server URL
connect.webdav.user Username
connect.webdav.password Password
connect.webdav.submit Connect
connect.webdav.signup Create an account
connect.webdav.help.more How?
connect.done Connected. Your data is saved.
connect.done.manual Download mode: save the file after each change.
error.generic That did not work. Check the connection and try again.
error.targetUnavailable The destination did not answer. Try again in a moment.
error.authExpired Access expired: reconnect to continue.
error.decryptFailed This backup could not be opened with that password.
error.badFormat This file does not look like a readable backup.

Labels

58 keys. French ships with the widget; override any subset to reword.

selfstore-backups

55 keys.

Key English default
backups.mine.heading My backups
backups.mine.personal Main backup
backups.active Active
backups.pill.encrypted Encrypted
backups.pill.plain Not encrypted
backups.pill.shared Shared
backups.pill.private Not shared
backups.modified modified {when}
backups.replaceHint Opening replaces the data on this device.
backups.loading Opening…
backups.menu Backup actions
backups.open Open
backups.encrypt Encrypt
backups.share Share
backups.rename Rename
backups.delete Delete
backups.new + New backup
backups.newTitle New backup
backups.startsBlank It starts empty.
backups.namePh Its name
backups.willBe File: {file}
backups.taken This name is already taken.
backups.create Create
backups.renameTitle Rename this backup
backups.pwHint This backup is protected: enter its password.
backups.pwShow Show the password
backups.pwHide Hide the password
backups.cancel Cancel
backups.shared.heading Shared with me
backups.shared.by Shared by {who}
backups.shared.leave Leave
backups.replica.add Backup copy
backups.replica.title Backup copy
backups.replica.intro The same encrypted file, also written to a second destination. If one fails, the other remains.
backups.replica.dest.drive Google Drive
backups.replica.dest.file A file on this device
backups.replica.dest.webdav A WebDAV server
backups.replica.dest.s3 An S3 bucket
backups.replica.card Backup copy - {label}
backups.replica.uptodate Up to date, {when}
backups.replica.pending First copy at the next save
backups.replica.error Unreachable - will retry at the next save
backups.replica.remove Remove
backups.replica.save Add the copy
backups.replica.webdav.url File URL on the server (https://host:8443/dav/file.zip)
backups.replica.webdav.help The full URL of the backup file, including a custom port if any. The server must allow this app to reach it (CORS) - some hosted drives do not, and will not connect from a browser.
backups.replica.webdav.user Username
backups.replica.webdav.password Password
backups.replica.s3.endpoint Endpoint URL
backups.replica.s3.region Region
backups.replica.s3.bucket Bucket
backups.replica.s3.key Object key (file name)
backups.replica.s3.accessKeyId Access key ID
backups.replica.s3.secret Secret access key
error.generic That did not work. Check the connection and try again.

Labels

55 keys. {when}, {file}, {who} and {label} are filled from the state.

selfstore-share

18 keys.

Key English default
share.title Sharing
share.create.read Create a view link
share.create.write Create an edit link
share.creating Creating…
share.level.read Can view
share.level.write Can edit
share.copy Copy
share.copied Copied
share.revoke Revoke
share.members People with access
share.member.you you
share.member.owner owner
share.remove Remove
share.stop Stop sharing
share.empty Nobody else has access yet.
share.stale Connection hiccup: this view may be behind.
error.generic That did not work. Check the connection and try again.
error.targetUnavailable The share service did not answer. Try again in a moment.

Labels

share.title accepts the empty string, which removes the heading when your page already carries one. share.stale is not an error: it says the list on screen may be behind, which matters before someone concludes a revoke did not work.

selfstore-join

14 keys.

Key English default
join.previewing Reading the invitation…
join.title You are invited
join.from Shared by {from}
join.level.read You will be able to view it.
join.level.write You will be able to view and edit it.
join.accept Join
join.joining Joining…
join.joined You are in. The shared data now syncs on this device.
join.mismatch This device already follows another share. Leave it first, or use another profile.
join.noInvite This invitation is spent, or meant for another account.
join.switchAccount Use another account
join.retry Try again
error.generic That did not work. Check the connection and try again.
error.targetUnavailable The invitation could not be read. Try again in a moment.

Labels

join.switchAccount only renders when the engine offers an account switch - the switch is part of the journey, not a separate screen your app has to build.

selfstore-status

12 keys.

Key English default
status.ephemeral Nothing is saved
status.cacheOnly Never saved anywhere yet
status.saving Saving…
status.saved Saved to {label}, at every change
status.saved.placeless Saved
status.needsAttention Reconnect to continue
status.locked Locked
status.pendingDownload Changes to download
status.action.choose-destination Choose a destination
status.action.download Download
status.action.reconnect Reconnect
status.action.unlock Unlock

Labels

Why {label} and a .placeless twin

status.saved names where it saved. A status that cannot say where has to be read twice - the state on one line, the destination on another - and that split was imposed by the widget, not by the language. With interpolation a translation writes one sentence and puts the place where its own grammar wants it. status.saved.placeless covers the case where a destination is attached but has no name to give. The other keys never mention a place, so they need no twin.

The browser is not a place

status.cacheOnly deliberately does not describe the browser as where the data lives. It is not one: it holds a working copy that a cleared profile takes with it. Saying “only on this device” reads as an address and reassures about something that has no durability, so the copy names what is missing - nothing has been saved out yet. Override it if your product has a better sentence, but keep that distinction: it is the difference between a user who backs up and one who finds out too late.

selfstore-gate

5 keys.

Key English default
gate.title Where should your data live?
gate.hint It is encrypted on this device. Choose where to keep it and it gets saved there for you from now on.
gate.fine (empty - your fine print goes here)
gate.defer Later - keep it in this browser only
gate.defer.note Data kept only in this browser is lost if its storage is cleared.

Labels

French ships with the widget. The connect journey inside carries its own 58 keys. Set labels before the gate opens. While it is open the frame stands and only cosmetics are pushed into the child, so a late assignment reaches the journey but not the frame’s own title. The gate blanks the child’s heading on purpose - its own title already asks the question, and the child’s would repeat it. Put it back with labels = { 'connect.title': 'Where should we save your data?' } if you want both.