diff options
Diffstat (limited to 'src/i18n.js')
| -rw-r--r-- | src/i18n.js | 216 |
1 files changed, 204 insertions, 12 deletions
diff --git a/src/i18n.js b/src/i18n.js index e561e5d..636362e 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -35,6 +35,9 @@ export const isRTL = (l) => RTL.has(l || lang); const STR = { en: { + mediaSeek: 'Seek', + mediaMomentDrop: 'About the whole post, not this moment', + mediaCommentAt: 'Comment at', arkHistoryIncomplete: 'History incomplete', arkDetailsNotSynced: 'Payment details not synced', arkHistoryIncompleteHelp: 'These coins have been used, but the payment details and any remaining change have not synced to this device. Open the wallet that made the payments and let it sync.', @@ -106,6 +109,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', @@ -224,6 +238,9 @@ const STR = { moveToSavingDesc: 'Park money in ordinary on-chain Bitcoin.', moveToSavingBtn: 'Move to Savings', spendingLabel: 'Spending', + historyExportTitle: 'Transaction history', + historyExportDesc: 'Download every payment in Spending and Savings as a CSV file, for a spreadsheet or your accountant.', + historyExportBtn: 'Export CSV', savingLabel: 'Savings', balanceSwitch: 'Switch to {name}', movingLabel: 'Moving…', @@ -249,6 +266,7 @@ const STR = { msgUploadFailed: 'Upload failed. Check your connection and try again', mediaUploadTooBig: 'That file is too big for the available media hosts', mediaUploadUnsupported: 'That file format is not supported', + mediaUploadUnauthorized: 'The media server denied this upload. Check that your Nostr identity is allowed to upload there.', msgPhoto: 'Photo', searchPeopleFor: 'Search people for {q}', msgEmojiSearch: 'Search emoji…', @@ -270,7 +288,13 @@ const STR = { close: 'Close', playVideo: 'Play', videoUnmute: 'Unmute', + clipsTall: 'Tall only', + clipsWide: 'Wide only', + 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", @@ -303,10 +327,6 @@ const STR = { currencyLabel: 'Show amounts in', feedTitle: 'Feed', feedFollowingName: 'Following', - feedConversations: 'Conversations', - feedRepliesToggle: 'Replies instead of posts', - feedRepliesHelp: 'A conversations feed: what these people reply, each under the post it answers. Their own posts stay out of it.', - feedSumReplies: 'replies', noteReplyingTo: 'Replying to', feedNew: 'New feed', feedNewName: 'New feed', @@ -344,13 +364,16 @@ const STR = { askSignInCreate: 'Create a new account', askNotNow: 'Not now', feedLangLabel: 'Language', - mediaAll: "All", + mediaAll: "Notes", + mediaConversations: "Conversations", mediaImages: "Images", mediaVideos: "Videos", + mediaLive: "Live", mediaArticles: "Articles", mediaNoArticles: "No articles in this feed yet.", mediaNoImages: "No pictures in this feed yet.", mediaNoVideos: "No vertical videos in this feed yet.", + mediaNoLive: "Nobody in this feed is live right now.", feedRelays: 'Relays', feedRelaysFormHelp: 'Read this feed from these relays only. Leave empty for the usual ones.', feedAllToggle: 'Every post on these relays (a firehose)', @@ -429,6 +452,7 @@ const STR = { profLists: 'Lists', searchTopicRow: 'Posts on this topic', searchTopicFor: 'Posts tagged #{q}', + relayLinkOpen: 'See what’s posted on this relay', alertsTitle: 'Notifications', alertsSub: 'Zaps, reactions and replies to your posts', alertsNew: '{n} new', @@ -452,6 +476,118 @@ const STR = { feedEmpty: 'Nothing posted yet.', feedLoadingMore: 'Loading more posts…', feedEnd: 'You’re all caught up.', + liveBadge: 'LIVE', + livePlanned: 'SOON', + liveEnded: 'ENDED', + livePast: 'Past streams', + liveReport: 'Report this stream', + liveReportTitle: 'Report this stream', + liveReportDesc: 'coinos carries this stream. Tell us what’s wrong and we’ll look at it right away.', + liveReason_csam: 'Sexual content involving a minor', + liveReason_sexual: 'Sexual content', + liveReason_violence: 'Violence or gore', + liveReason_illegal: 'Something else illegal', + liveReason_spam: 'Spam or a scam', + liveReason_other: 'Something else', + liveReportTextPh: 'Anything we should know (optional)', + liveReportSend: 'Send report', + liveReported: 'Reported. Thank you.', + liveTakeDown: 'Take down', + liveTakeDownAsk: 'Take this stream down? It ends now, and its recording is kept from everyone (preserved for reporting).', + liveBanAsk: 'Also stop this account from streaming again?', + liveTakenDown: 'Taken down.', + liveTakenDownBanned: 'Taken down, and the account can’t stream again.', + liveRemoved: 'This stream was taken down.', + liveDelete: 'Delete recording', + liveDeleteAsk: 'Delete this stream’s recording? Nobody will be able to watch it again.', + liveDeleted: 'Recording deleted.', + liveDeletedSay: 'The streamer deleted this recording.', + goLiveNewName: 'Your name can go live a day after you claimed it: from {when}.', + goLiveBanned: 'This account can’t go live on coinos.', + liveWatchRecording: 'Watch the recording', + liveStaleMine: '“{title}” still says live, but nothing is going out.', + liveNotYours: 'Only the account that started this stream can end it.', + liveRecordingBadge: 'RECORDING', + liveUntitled: 'Live stream', + liveWatching: '{n} watching', + liveWatch: 'Watch', + liveZap: 'Zap', + liveChat: 'Chat', + liveChatEmpty: 'No messages yet.', + liveChatHint: 'Say something', + liveSend: 'Send', + liveZapped: 'zapped {n} sats', + liveSomeone: 'Someone', + liveOffline: 'The stream isn’t playing right now.', + liveNoPlayer: 'This browser can’t play the stream.', + liveOver: 'This stream has ended.', + liveStartsAt: 'Starts {when}', + liveNotFound: 'Couldn’t find that stream.', + goLive: 'Go live', + goLiveCamera: 'Camera', + goLiveScreen: 'Screen', + goLiveFlip: 'Flip', + goLiveTitlePh: 'What’s your stream about?', + goLiveDefaultTitle: '{name} is live', + goLiveStart: 'Go live', + goLiveStarting: 'Starting…', + goLiveAsking: 'Asking for the camera…', + goLiveNoCamera: 'The camera isn’t available. Check that the browser may use it.', + goLiveNoScreen: 'Screen sharing was cancelled or isn’t available.', + goLiveNeedsName: 'Going live needs a coinos name: claim one in Settings first.', + goLiveRefused: 'The live server didn’t take the stream.', + goLiveHint: 'Your stream is public: anyone can watch it and its recording, kept for a week. Keep this page open while you’re live.', + goLiveEnd: 'End', + goLiveEndAsk: 'End your stream?', + goLiveEnded: 'Your stream has ended.', + goLiveReconnecting: 'Reconnecting…', + goLiveBehind: 'Your connection is falling behind', + goLiveLost: 'Lost the connection to the live server.', + goLiveRestarted: 'The stream had to start over.', + callVoice: 'Voice call', + callVideo: 'Video call', + callIncomingVoice: 'Voice call', + callIncomingVideo: 'Video call', + callIncomingFrom: '{name} is calling', + callCalling: 'Calling…', + callConnecting: 'Connecting…', + callAccept: 'Answer', + callDecline: 'Decline', + callHangUp: 'Hang up', + callMute: 'Mute', + callUnmute: 'Unmute', + callCamOff: 'Turn camera off', + callCamOn: 'Turn camera on', + goLiveToCamera: 'Back to camera', + callShare: 'Share screen', + callStopShare: 'Stop sharing', + callAddVideo: 'Turn on camera', + callFlip: 'Switch camera', + callMinimize: 'Minimize', + callEnded: 'Call ended', + callNoAnswer: 'No answer', + callDeclined: 'Declined', + callBusy: 'They’re on another call', + callFailed: 'Couldn’t connect', + callNoPermission: 'The microphone or camera isn’t allowed', + callMissed: 'Missed call', + callAnsweredElsewhere: 'Answered on another device', + callDeclinedElsewhere: 'Declined on another device', + callUnsupported: 'This browser can’t make calls.', + notifCall: 'Calls', + callLogVoice: 'voice call', + callLogVideo: 'video call', + callLogOut: 'Outgoing {what}', + callLogIn: 'Incoming {what}', + callLogMissed: 'Missed {what}', + callLogDeclined: 'Declined {what}', + callLogTheyDeclined: 'Outgoing {what} · Declined', + callLogNoAnswer: 'Outgoing {what} · No answer', + callLogCancelled: 'Cancelled {what}', + callLogBusy: 'Outgoing {what} · Busy', + callLogFailed: '{what} · Couldn’t connect', + callLogUnrung: 'This didn’t ring: calls ring from people you follow or have written to.', + callLogUnrungWas: 'This didn’t ring: you didn’t follow them then.', feedAttach: 'Attach a picture or video', postLike: 'Like', postBoost: 'Boost', @@ -543,6 +679,13 @@ 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', @@ -562,8 +705,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', @@ -654,6 +797,31 @@ const STR = { arkFeeChain: 'On-chain fee', arkFeeService: 'Service fee', arkCoinsExpired: 'expired', + arkCoinsHeld: 'held by Coinos', + arkCoopSelected: 'Only the {n} coins ticked above will move.', + arkCoopSelectedOne: 'Only the coin ticked above will move.', + arkCoopSelectedAmt: '{n} selected coins · {amount}', + arkCoopSelectedAmtOne: '1 selected coin · {amount}', + arkCustodyTitle: 'Custody strategy', + safeBootTitle: 'Coinos opened in safe mode', + safeBootBody: 'The app was closed {n} times in a row before it finished opening, so automatic connections are paused this time. Your coins and keys are untouched. Last step reached: {phase}.', + safeBootOpen: 'Open normally', + safeBootCopy: 'Copy report', + safeBootCopied: 'Copied', + arkCustodyDesc: 'Each coin expires about {days} days after it was made. Until then you can bring it on-chain yourself, without Coinos; after that, Coinos keeps honoring it. Renewing before expiry keeps your own exit, for a fee, so it is a choice:', + arkCustodyCustodial: 'Allow coins to expire', + arkCustodyCustodialDesc: 'Nothing renews and no renewal fees are paid. A coin keeps its own exit until it expires. After that, paying still works, but bringing it on-chain needs Coinos’s cooperation. The one exception: a coin whose payment history has grown very long is renewed free of the base fee, so it stays spendable.', + arkCustodySelf: 'Minimize renewal cost', + arkCustodySelfDesc: 'Coins renew in the last hours before they expire, when renewal is cheapest, so you can always exit on your own without Coinos. Roughly once every {days} days per coin. Coins too small to be worth the fee are left alone.', + arkCustodyExit: 'Minimize exit cost', + arkCustodyExitDesc: 'Every transfer adds a hop to a coin’s history, and a unilateral exit pays one on-chain transaction per hop. This renews a coin before it expires, and also as soon as its history is {hops} hops deep, so bringing any coin on-chain stays close to a fresh coin’s price. Only for coins worth it: never more than a tenth of a coin on its renewal.', + arkCustodyCostNone: 'no fees', + arkCustodyCostSelf: '{base} per renewal', + arkCustodyCostExit: '{base} near expiry, {pct} + {base} when early', + arkCustodySaved: 'Custody choice saved', + arkCustodyNotHere: 'This server does not honor expired coins, so they renew automatically here.', + arkExitNoneExitable: 'Every coin has expired, so there is nothing a unilateral exit can take on-chain: Coinos holds them now. Renewing restores your own exit; withdrawing with Coinos’s cooperation works as before.', + arkCoinsRenewDescCustodial: 'With “Allow coins to expire”, nothing renews on its own. A renewal replaces the selected coins with a single fresh one and restores your own exit for them. Every renewal costs a flat {base} toward its on-chain fee, plus a share that depends on how close each coin is to expiry. The closer, the cheaper:', noteForeignKind: 'A kind {kind} event this app doesn’t show.', zapRowText: 'zapped {n} sats', pollVoter: '{n} vote', @@ -677,8 +845,10 @@ const STR = { arkRenewStageRetry: 'The last check with the server didn’t go through; the wallet keeps trying.', arkRenewingHistory: 'Renewing', arkRenewingOpen: 'See the coins', - arkCoinsExitTitle: 'Unilateral exit', - arkCoinsCoopTitle: 'Co-operative exit', + arkCoinsExitTitle: 'Exit', + arkCoinsCoopTitle: 'Withdraw', + arkCoinsWithdrawBtn: 'Withdraw {amount}', + arkCoinsExitBtnAmt: 'Exit {amount}', arkOffboardBadAddress: 'Enter a valid on-chain address for this network.', arkCoinsExitBtn: 'Exit now', arkExitConfirmTitle: 'Start a unilateral exit?', @@ -771,6 +941,7 @@ const STR = { profNotesNone: 'No recent posts found.', profTabPosts: 'Posts', profTabReplies: 'Replies', + profTabStreams: 'Streams', profRepliesNone: 'No recent replies found.', profReplyTag: 'reply', msgSearching: 'Searching…', @@ -791,6 +962,12 @@ const STR = { msgBadInvite: 'Not a valid invite link', msgInviteLoading: 'Fetching invite…', msgInviteNotFound: 'Invite not found on its relays', + mediaServersTitle: 'Media servers', + mediaServersHow: 'Blossom servers for chat attachments and post media, including videos. Enter up to 6 HTTPS server addresses, one per line. Custom servers replace the public upload defaults. Saved on this device; existing uploads stay where they are.', + mediaServersDefault: 'Using public media servers', + mediaServersSaved: 'Media servers saved', + mediaServersInvalid: 'Enter 1–6 HTTPS server addresses without paths, credentials, queries or fragments.', + mediaServersSaveFailed: 'Could not save media servers on this device.', syncStorageTitle: 'Sync storage', syncStorageHow: 'Wallet state too large for a relay event is encrypted and stored as a blob on these Blossom servers (one per line). Any Blossom server works. Run your own or use another provider.', syncStorageSave: 'Save servers', @@ -900,6 +1077,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', @@ -963,6 +1144,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.', @@ -1229,6 +1411,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', @@ -1252,8 +1436,10 @@ 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', nlAmberPasteHint: 'The answer is read from the clipboard when you return. If nothing happens, paste it here:', nlAmberPastePh: 'Paste the signer’s answer', nlAmberPasteBtn: 'Use it', @@ -1262,7 +1448,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', @@ -1283,7 +1469,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', @@ -1315,6 +1501,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)', @@ -1331,6 +1518,8 @@ const STR = { namesInvMemoPh: 'Description (optional)', namesInvCreate: 'Create invoice', namesInvNew: 'New invoice', + namesInvKeepOpen: 'Keep coinos open until this is paid. If it\u2019s paid while coinos is closed, the money goes back to the sender. It expires in an hour.', + namesInvExpired: 'This invoice has expired. Make a new one when you\u2019re ready to be paid.', namesInvBadAmount: 'Enter an amount in sats', namesOfferMemoPh: 'Label (e.g. Ocean payout)', namesOfferCreate: 'Create', @@ -1436,6 +1625,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.', |
