aboutsummaryrefslogtreecommitdiffstats
path: root/src/i18n.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/i18n.js')
-rw-r--r--src/i18n.js142
1 files changed, 133 insertions, 9 deletions
diff --git a/src/i18n.js b/src/i18n.js
index 5fb2cb1..194ce40 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -68,6 +68,20 @@ const STR = {
logoutAll: 'Log out of all accounts',
clearAllWarn: '⚠ This removes every account from this device. Any account whose recovery phrase or key you have not backed up will be lost for good.',
removeWalletTitle: 'Remove account',
+ delAcctTitle: 'Delete account',
+ delAcctBlurb: 'Give up your Coinos name, have our servers forget this account, and remove it from this device.',
+ delAcctChecking: 'Checking your account…',
+ delAcctName: '{name} is released. Anyone can claim it afterwards, and payments sent to it will no longer reach you.',
+ delAcctRecords: 'Our servers delete what they hold for this account: its payment address, notification registrations, scheduled posts, hats, point-of-sale and receipt records.',
+ delAcctDevice: '“{name}” is removed from this device.',
+ delAcctStays: 'Not deleted: your coins, which only your recovery phrase controls, and what you have published to nostr relays (profile, posts, messages).',
+ delAcctOwed: '⚠ {sat} sats are still on their way to you or held in your withdraw links. Wait for payments to arrive, take back your withdraw links (Send → Withdraw link), then try again.',
+ delAcctFunds: '⚠ This account still holds {sat} sats. Deleting does not move them. Send them somewhere first, or make sure you have the recovery phrase: without it they are lost for good.',
+ delAcctSure: 'I understand this cannot be undone.',
+ delAcctSureFunds: 'I have moved my funds or saved my recovery phrase, and I understand this cannot be undone.',
+ delAcctGo: 'Delete account',
+ delAcctDone: 'Account deleted',
+ delAcctUnlockFirst: 'Lock Coinos and unlock it with your password first, then try again',
removeWalletWarn: '⚠ Remove “{name}” from this device? It will be gone from this browser. Make sure you have its recovery phrase. Other accounts aren’t affected.',
rename: 'Rename',
remove: 'Remove',
@@ -109,6 +123,17 @@ const STR = {
profDisplayName: 'Display name',
profPublicKey: 'Nostr public key',
profKeyLink: 'Public key',
+ profHistDesc: 'If another app replaced your profile, an older copy may still be on a relay that keeps history. Using one fills only the fields that are empty here.',
+ profHistLook: 'Look for older copies',
+ profHistUse: 'Use',
+ profHistNoName: '(no name)',
+ profHistNone: 'No older copy has anything this one is missing.',
+ profHistNothing: 'Everything in that copy is already here.',
+ profHistFilled: 'Filled {n} fields from the older copy. Save to publish.',
+ profHist_name: 'name',
+ profHist_about: 'bio',
+ profHist_picture: 'picture',
+ profHist_banner: 'banner',
followHistTitle: 'Follow list',
followHistDesc: 'You follow {n} people. If another app replaced your follow list, an older copy may still be on a relay that keeps history. Restoring adds everyone from it back; nobody is removed.',
followHistLook: 'Look for older copies',
@@ -186,6 +211,19 @@ const STR = {
skipVerification: 'Skip verification',
confirmBackupIntro: 'Confirm your backup by entering the requested words.',
wordN: 'Word #{n}',
+ seedIntroBody: 'Next you’ll see your seed phrase: {n} words that are your wallet. Write them down on paper, in order, and keep them somewhere safe. They’re the only way to get your coins back if you lose this device.',
+ seedIntroPrivate: 'Anyone who sees them can take your coins, so make sure no one is looking at your screen.',
+ seedIntroShow: 'Show seed phrase',
+ next: 'Next',
+ passStepTitle: 'Add a passphrase?',
+ passStepBody: 'A passphrase is an extra secret you choose yourself, on top of your {n} words. Anyone who finds your seed phrase still can’t open your wallet without it.',
+ passStepNote: 'It’s optional, but recommended. Write it down with your seed phrase: you’ll need both to recover your wallet, exactly as written, and nobody can reset it for you.',
+ passStepNone: 'Continue without one',
+ skip: 'Skip',
+ quizPrompt: 'Which one is word #{n}?',
+ quizWrong: 'Not that one. Check what you wrote down.',
+ quizBack: 'Show the words again',
+ onbBackupShow: 'Show seed phrase',
reenterPassphrase: 'Re-enter passphrase',
back: '← Back',
cancel: 'Cancel',
@@ -197,12 +235,15 @@ const STR = {
seedPlaceholder: 'enter your seed words separated by spaces',
passphrase: 'Passphrase',
passWhatsThis: 'What’s this?',
+ addPassphrase: 'Add passphrase',
+ passphraseOptional: 'Passphrase (optional)',
+ passOptionalHint: 'Leave it empty unless you want one. Most wallets have none.',
passInfo: 'An optional 13th word: if someone gets hold of your 12 seed words, they still can’t open your wallet without this one. It’s not a login password and it doesn’t encrypt anything: each passphrase opens its own separate wallet, so to recover your funds you’ll need your seed words and this passphrase, exactly as written.',
show: 'Show',
hide: 'Hide',
invalidSeed: 'Invalid seed phrase. Check the spelling and word order.',
- importLabel: 'Recovery phrase or key',
- importPlaceholder: 'Your seed words, or an xpub / xprv',
+ importLabel: 'Seed phrase',
+ importPlaceholder: 'Your seed words',
invalidImport: 'That is not a valid recovery phrase, xpub, or xprv.',
importedKey: 'Imported key',
importedKeyNote: 'This wallet was imported from an extended private key, so there is no recovery phrase. Back up that key itself to keep the wallet.',
@@ -282,6 +323,8 @@ const STR = {
clipsAll: 'All shapes',
clipsToggleTitle: 'Which clips to show: the ones that fit the screen, or all',
videoTapToPlay: "Tap to play",
+ videoPlay: "Play",
+ videoPause: "Pause",
pagerFetchingVideo: "Fetching the next video…",
pagerFetchingPictures: "Fetching more pictures…",
pagerCaughtUp: "That’s everything for now",
@@ -290,6 +333,7 @@ const STR = {
pagerPrevPic: 'Previous picture',
pagerNextPic: 'Next picture',
videoNoPicture: "This browser can’t show this video’s picture",
+ videoGone: "This video couldn’t be loaded from its host",
videoOpenFile: "Open the file",
wnDevicesTitle: 'Group invitations',
wnDevicesHelp: 'White Noise and other Marmot apps invite one of your devices, and only that device gets the group. Keep the invitations coming to the device you actually use.',
@@ -315,6 +359,7 @@ const STR = {
feedTitle: 'Feed',
feedFollowingName: 'Following',
noteReplyingTo: 'Replying to',
+ noteCommentOn: 'Comment on {where}',
feedNew: 'New feed',
feedNewName: 'New feed',
feedEdit: 'Edit feed',
@@ -438,6 +483,7 @@ const STR = {
listNew: 'New list…',
profLists: 'Lists',
searchTopicRow: 'Posts on this topic',
+ searchPostsRow: 'Posts and replies that say this',
searchTopicFor: 'Posts tagged #{q}',
relayLinkOpen: 'See what’s posted on this relay',
alertsTitle: 'Notifications',
@@ -445,6 +491,8 @@ const STR = {
alertsNew: '{n} new',
alertsEmpty: 'Nothing yet. Zaps, reactions and replies to your posts will show up here.',
alertZap: 'zapped you {sats}',
+ alertZapApp: 'zapped your app {name} {sats}',
+ alertZapAppAnon: 'zapped your app {sats}',
alertReact: 'reacted {emoji}',
alertBoost: 'boosted your post',
alertReply: 'replied to you',
@@ -666,12 +714,26 @@ const STR = {
profComposePh: "What's on your mind?",
profPostBtn: 'Post',
profPosted: 'Posted',
+ schedToggle: 'Schedule for later',
+ schedAt: 'Post at',
+ schedBtn: 'Schedule',
+ schedDone: 'Scheduled for {when}',
+ schedTooSoon: 'Pick a time at least two minutes from now',
+ schedListTitle: 'Scheduled ({n})',
+ schedCancelled: 'Scheduled post cancelled',
publicChatTitle: '{name} community',
publicChatDesc: 'Live chat: read along, sign in to join the conversation',
publicChatSignIn: 'Sign in to chat',
- publicChatOpenApp: 'Open coinos',
+ publicChatDescMember: 'Live chat: open the chat in Coinos to join the conversation',
+ publicChatOpenApp: 'Join the chat',
publicChatLoading: 'Loading messages…',
msgDelete: 'Delete message',
+ msgBan: 'Remove {name} and their messages',
+ msgBanConfirm: 'Remove {name} for everyone? Tap again',
+ msgBanned: '{name} removed',
+ msgUnbanned: '{name} restored',
+ msgBannedHead: 'Removed from this community',
+ msgUnban: 'Restore',
msgNoIdentity: "Your nostr signer isn't connected. Reconnect it to send as yourself",
msgSendFailed: 'No relay accepted the message',
msgLockedChat: 'Your wallet is locked, so it can’t sign messages.',
@@ -685,8 +747,8 @@ const STR = {
addrRead: '{min} min read',
addrList: 'A list by {name}',
msgSignerOff: "Your nostr signer isn't connected, so you can't post as yourself yet.",
- msgAmberDms: 'Signed in with Amber, messages sent to you can’t be opened here, only ones you sent from this device.',
- msgAmberConnect: 'Connect Amber',
+ msgAmberDms: 'Signed in with a signer app, messages sent to you can’t be opened here, only ones you sent from this device.',
+ msgAmberConnect: 'Connect signer',
postRepostedBy: '{name} reposted',
gifBtnTitle: 'Add a GIF',
gifSearchPh: 'Search GIFs',
@@ -728,6 +790,13 @@ const STR = {
msgGroupProtoWn: 'Marmot (MLS)',
msgGroupProtoCd: 'Cordn',
msgGroupProtoCdHint: 'Cordn groups work with Amethyst and the Cordn app; messages travel through a coordinator server that cannot read them.',
+ msgGroupProtoN29: 'Relay group',
+ msgGroupProtoN29Hint: 'Join a NIP-29 group made in Chachi, Flotilla, 0xchat or another client: paste its address (relay\'id) or a link to it. Relay groups are not encrypted; the relay keeps the members and can read the messages.',
+ msgNip29Address: 'relay.example.com\'groupid or a link',
+ msgNip29BadAddress: 'That isn\'t a group address. It looks like relay.example.com\'groupid',
+ msgNip29JoinRefused: 'The relay didn\'t let you in yet ({why}). You can still read the group if it\'s open.',
+ msgNip29Info: 'Relay group {relay} · not encrypted · the relay keeps the members',
+ msgNip29CopyAddress: 'Copy group address',
msgCordnInfo: 'Cordn group · end-to-end encrypted · delivered by a coordinator',
msgCordnNoFiles: 'Attachments are not available in Cordn groups yet',
msgRouteTitle: 'Send messages by',
@@ -1057,6 +1126,10 @@ const STR = {
giftWelcome: 'You’ve been sent Bitcoin',
giftBackedUp: 'I’ve written it down',
giftLink: 'Gift some Bitcoin',
+ giftNotePlaceholder: 'Add a note (optional)',
+ giftFromMe: 'Show it’s from me (whoever claims it follows you)',
+ giftFrom: 'From',
+ giftClaimFollows: 'Claiming it follows them',
giftLinkDesc: 'Presign an amount as a link. Whoever opens it claims the Bitcoin into a brand-new wallet that only they control.',
giftLinkWarn: '⚠ Anyone who opens this link can claim the amount, so share it only with the person you are gifting. Keep amounts small.',
giftLinkReveal: 'Create gift link',
@@ -1120,6 +1193,7 @@ const STR = {
claimOr: 'or',
goToWallet: 'Go to wallet',
claimBtn: 'Claim it',
+ claimNowBtn: 'Claim it now',
claimFeeNote: '~{n} fee',
claimFailed: 'This gift has already been claimed or is no longer available.',
claimNotVisibleBody: 'The coins funding this gift aren\u2019t visible from this wallet\u2019s network/data source. Make sure this wallet uses the same network and data source as the sender, then try again.',
@@ -1150,6 +1224,9 @@ const STR = {
explorerUrlHint: 'Esplora / electrs REST base, e.g. https://mempool.space/api',
walletName: 'Account name',
walletSettings: 'Account settings',
+ balanceSettingsTitle: 'Balance settings',
+ spendingSettingsDesc: 'Coins, renewals, who holds them, moving them out',
+ savingsSettingsDesc: 'Lock, password, recovery phrase, public key',
securityTitle: 'Security',
walletSettingsDesc: 'Name, recovery phrase, public key, and auto-logout for this account.',
autolockTitle: 'Log out automatically',
@@ -1208,7 +1285,10 @@ const STR = {
arkRenewForecast: 'Coins renew in ~{when} for {fee}.',
arkRenewForecastNow: 'Coins renew shortly for {fee}.',
arkBoardStuck: 'Moving money hit a snag and will keep retrying: {error}',
- arkRenewWarnPush: 'Your Spending balance is too small to renew itself and expires around {date}. Receive any amount or spend it to keep it alive.',
+ // the push's words are measured against Chrome's spam model (src/notify-text.js):
+ // 'too small to renew itself and expires around' scored 98, this 11
+ arkRenewWarnTitle: 'Spending balance',
+ arkRenewWarnPush: 'Receive or spend sats before {date} to keep it alive.',
giftArkOutstanding: '{n} unclaimed instant gift(s)',
giftArkRevoked: 'Gift swept back into Spending.',
claimArkFree: 'instant, no fee',
@@ -1329,6 +1409,8 @@ const STR = {
arkLnFromSavingsShort: 'Spending can’t cover this one. Move funds over from Savings first. That takes an on-chain confirmation, so ask for a fresh invoice afterwards.',
arkLnUseSpending: 'Switch to Spending and continue',
arkLnMoveFirst: 'Move Savings into Spending first',
+ arkLnSavingsTooSmall: 'Savings holds {have}, and a move into Spending needs at least {min} plus the on-chain fee. Receive over Lightning to fund Spending directly, or add to Savings first.',
+ arkLnReceiveInstead: 'Receive over Lightning instead',
arkLnFee: 'Fee',
arkLnPaying: 'Paying invoice…',
arkLnRetrying: 'Route failed. Retrying with a bigger fee budget ({n}/{of})…',
@@ -1369,6 +1451,13 @@ const STR = {
backupReminder: 'Your recovery phrase is still unwritten.',
backupReminderGo: 'Write it down',
onbSeedTitle: 'Set up your wallet',
+ onbRestoreTitle: 'Enter seed phrase',
+ onbRestoreDoor: 'Seed phrase',
+ doorPasskey: 'Passkey',
+ doorGoogle: 'Google',
+ doorNostr: 'Nostr',
+ addAccountTitle: 'Add an account',
+ onbSignInExisting: 'Sign in to an existing account',
onbSigninTitle: 'Sign in',
onbLegacyTitle: 'Move your coinos.io account',
onbLegacyBody: 'The original coinos. We can move your balance over and point your username here. Your old account keeps working, it just stops receiving payments.',
@@ -1386,6 +1475,8 @@ const STR = {
onbSpendBody: 'Claim a username and get your own payment address. People can send you bitcoin instantly, with just your name.',
onbNameWait: 'Getting things ready…',
onbNotNow: 'Not now',
+ onbGiftNameTitle: 'Now pick a username',
+ onbGiftNameBody: 'Claim a name and get your own payment address, so people can send you bitcoin with just your name. Then choose a picture and a cover.',
onbAvatarTitle: 'Choose your look',
onbAvatarBody: 'Pick a cover and an avatar, or upload your own. You can change them anytime.',
onbCover: 'Cover image',
@@ -1409,7 +1500,7 @@ const STR = {
nlSignInNostr: 'Sign in with Nostr',
nlDesc: 'Use your Nostr account to open your wallet, on any device, with the same account.',
nlExtension: 'Use browser extension',
- nlAmber: 'Sign in with Amber (Android)',
+ nlAmber: 'Sign in with a signer app (Android)',
nlAmberWait: 'Waiting for your signer app… approve there, then come back here.',
nlAmberTap: 'Your signer app has another request to answer. Open it to continue.',
nlAmberOpen: 'Open signer app',
@@ -1421,7 +1512,7 @@ const STR = {
nlPasskey: 'Sign in with a passkey',
nlKeyOrBunker: 'nsec, private key, or bunker://…',
nlGo: 'Log in',
- nlHint: 'Works with Amber, Amethyst and other remote signers (paste their bunker:// address), or a browser extension. A pasted key is used once and never stored.',
+ nlHint: 'Works with remote signer apps (paste their bunker:// address) or a browser extension. A pasted key is used once and never stored.',
nlApprove: 'Approve the request in your signer →',
nlUnrecognized: 'That doesn’t look like a private key or a bunker:// address.',
nlNewTitle: 'Create a wallet for this account',
@@ -1442,7 +1533,7 @@ const STR = {
nlReconnectDesc: "Your signer isn't connected, so this app can't sign as you. Reconnect it to post and update your profile. Your wallet and balance aren't affected.",
nlReconnectTitle: 'Reconnect your signer',
nlAmberUpgradeTitle: 'Read your messages',
- nlAmberUpgradeBody: 'Amber can only open messages here when it’s connected as a remote signer. Tap below, approve in Amber (allow decrypting), and your messages will load. Signing works as before.',
+ nlAmberUpgradeBody: 'Your signer app can only open messages here when it’s connected as a remote signer. Tap below, approve in the signer app (allow decrypting), and your messages will load. Signing works as before.',
nlReconnectBody: 'Your Nostr signer isn’t connected on this device. Reconnect to keep acting as {npub}…',
nlWrongAccount: 'That signer is a different Nostr account. Reconnect with {npub}.',
nlLinked: 'Wallet linked to your Nostr account',
@@ -1474,6 +1565,7 @@ const STR = {
namesClaim: 'Claim',
namesClaimed: 'You are now {name}',
namesCopy: 'Copy address',
+ namesChangeTo: 'Change to {addr}',
namesMoreOpen: 'More options',
namesMoreTitle: 'More ways to get paid',
namesMoreBolt11: 'Lightning invoice (BOLT 11)',
@@ -1597,6 +1689,9 @@ const STR = {
notifChatHint: 'Community chat is opt-in per room. Turn it on from a room’s menu.',
notifPaySent: 'Payments sent by connected apps',
notifPaySentHint: 'A heads-up when a connected app (a nostr client zapping, for example) spends from this wallet while it’s closed.',
+ nwcWorkerLog: 'Background activity log',
+ nwcWorkerLogHint: 'What the wallet did while it was closed: wake-ups, payments, notifications. Copy it when reporting a problem.',
+ nwcWorkerLogEmpty: 'Nothing recorded yet',
nwcNotifHint: 'You’ll be asked to allow notifications. The connection uses them to answer when Coinos is closed.',
nwcNotifNeeded: 'Without notifications the connection couldn’t answer when Coinos is closed, so it wasn’t added. Allow notifications and try again.',
nwcNotifBlocked: 'Notifications are blocked for this site. Allow them in your browser settings, then add the connection again.',
@@ -1682,6 +1777,35 @@ const STR = {
lnWithdrawPaid: 'Received {amount}',
lnWithdrawNotPaid: 'They took the invoice but the payment didn’t arrive. Check with them before trying again.',
lnWithdrawNoInvoice: 'Couldn’t make an invoice to be paid to.',
+ wlTitle: 'Withdraw link',
+ wlReady: 'Your withdraw link is ready',
+ wlDesc: 'A Lightning link or QR code that anyone can withdraw sats from, like a voucher. It works with most Lightning wallets, even while your phone is off. You pay for it up front; Coinos holds the sats until they’re claimed, and you can take back whatever is left at any time.',
+ wlAmount: 'Amount per withdrawal',
+ wlUses: 'How many withdrawals',
+ wlNote: 'Description (optional)',
+ wlPayNow: 'Paid now from Spending.',
+ wlPayNowMany: '{total} paid now from Spending: {n} withdrawals of up to {amount}.',
+ wlCreate: 'Create withdraw link',
+ wlCreateFor: 'Create link for {amount}',
+ wlAmountInvalid: 'Enter an amount.',
+ wlUsesInvalid: 'Between 1 and 1000 withdrawals.',
+ wlNoFunds: 'Not enough in Spending for {amount}.',
+ wlNotConfirmed: 'Paid, but the link isn’t confirmed yet. It will appear under your links in a moment.',
+ wlTermsOne: 'Up to {amount}, once',
+ wlTermsMany: 'Up to {amount} each, {n} of {total} withdrawals left',
+ wlLeft: '{amount} left',
+ wlCopy: 'Copy LNURL',
+ wlBearer: 'Anyone with this link or QR code can withdraw from it. Share it only with whoever it’s for.',
+ wlTakeBack: 'Take back {amount}',
+ wlTakeBackMemo: 'Withdraw link taken back',
+ wlTakenBack: '{amount} is back in Spending',
+ wlTakeBackFailed: 'Couldn’t pay it back just now. The link stays open; try again in a moment.',
+ wlClosed: 'This link is closed.',
+ wlUsedUp: 'This link has been used up.',
+ wlClosedTag: 'closed',
+ wlUsedUpTag: 'used up',
+ wlYours: 'Your withdraw links',
+ wlMainnetOnly: 'Withdraw links are only available on mainnet.',
lnWithdrawWatchOnly: 'This device can’t receive: the wallet is watch-only here.',
lnWithdrawMemo: 'Withdrawal from {domain}',
lnPayAmount: 'Amount',