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.