# Every label key Source: https://selfstore.dev/docs/widget-labels The full list of strings the widgets render, per element, with their English defaults. A lookup table - how overriding and language selection work is on the wording page. 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](https://selfstore.dev/docs/widgets-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](https://selfstore.dev/docs/widget-connect). **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. Map of this site for a model: https://selfstore.dev/llms.txt Every page in one file: https://selfstore.dev/llms-full.txt