tmp disable sw, add FormattedMessage ids via eslint

This commit is contained in:
Martti Malmi 2023-11-20 13:35:51 +02:00
parent 7063ae3584
commit 042e776fed
96 changed files with 646 additions and 592 deletions

View File

@ -1,7 +1,15 @@
module.exports = {
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
plugins: ["@typescript-eslint", "formatjs"],
rules: {
"formatjs/enforce-id": [
"error",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]"
}
]
},
root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: {

View File

@ -107,6 +107,7 @@
"css-loader": "^6.7.3",
"css-minimizer-webpack-plugin": "^5.0.0",
"eslint": "^8.48.0",
"eslint-plugin-formatjs": "^4.11.3",
"eslint-webpack-plugin": "^4.0.1",
"html-webpack-plugin": "^5.5.1",
"jest": "^29.5.0",

View File

@ -61,7 +61,7 @@ export default function DM(props: DMProps) {
{content ? (
<Text id={msg.id} content={content} tags={[]} creator={otherPubkey} />
) : (
<FormattedMessage defaultMessage="Loading..." />
<FormattedMessage defaultMessage="Loading..." id="gjBiyj" />
)}
</div>
<div>

View File

@ -22,7 +22,7 @@ export default function DmWindow({ id }: { id: string }) {
{chat.participants.map(v => (
<ProfileImage pubkey={v.id} showUsername={false} />
))}
{chat.title ?? <FormattedMessage defaultMessage="Secret Group Chat" />}
{chat.title ?? <FormattedMessage defaultMessage="Secret Group Chat" id="+Vxixo" />}
</div>
);
}

View File

@ -107,7 +107,7 @@ export default function CashuNuts({ token }: { token: string }) {
</defs>
</svg>
<FormattedMessage
defaultMessage="<h1>{n}</h1> Cashu sats"
defaultMessage="<h1>{n}</h1> Cashu sats" id="6/SF6e"
values={{
h1: c => <h1>{c}</h1>,
n: <FormattedNumber value={amount} />,
@ -116,7 +116,7 @@ export default function CashuNuts({ token }: { token: string }) {
</div>
<small className="xs w-max">
<FormattedMessage
defaultMessage="<b>Mint:</b> {url}"
defaultMessage="<b>Mint:</b> {url}" id="zwb6LR"
values={{
b: c => <b>{c}</b>,
url: new URL(cashu.token[0].mint).hostname,
@ -129,7 +129,7 @@ export default function CashuNuts({ token }: { token: string }) {
<Icon name="copy" />
</button>
<button onClick={e => redeemToken(e, token)}>
<FormattedMessage defaultMessage="Redeem" description="Button: Redeem Cashu token" />
<FormattedMessage defaultMessage="Redeem" id="XrSk2j" description="Button: Redeem Cashu token" />
</button>
</div>
</div>

View File

@ -76,7 +76,7 @@ export default function Invoice(props: InvoiceProps) {
{description && <p>{description}</p>}
{isPaid ? (
<div className="paid">
<FormattedMessage defaultMessage="Paid" />
<FormattedMessage defaultMessage="Paid" id="u/vOPu" />
</div>
) : (
<button disabled={isExpired} type="button" onClick={payInvoice}>

View File

@ -10,7 +10,7 @@ const MagnetLink = ({ magnet }: MagnetLinkProps) => {
return (
<div className="note-invoice">
<h4>
<FormattedMessage defaultMessage="Magnet Link" />
<FormattedMessage defaultMessage="Magnet Link" id="Gcn9NQ" />
</h4>
<a href={magnet.raw} rel="noreferrer">
{magnet.dn ?? magnet.infoHash}

View File

@ -42,7 +42,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
Toastore.push({
element: (
<FormattedMessage
defaultMessage="Sent {n} sats to {name}"
defaultMessage="Sent {n} sats to {name}" id="Ig9/a1"
values={{
n: amtSend,
name: getDisplayName(profile, pk),
@ -70,7 +70,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
<>
<AsyncButton className="mr5 secondary" onClick={() => zapAll()}>
<FormattedMessage
defaultMessage="Zap all {n} sats"
defaultMessage="Zap all {n} sats" id="IVbtTS"
values={{
n: <FormattedNumber value={login.appData.item.preferences.defaultZapAmount * ids.length} />,
}}

View File

@ -31,7 +31,7 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) {
</div>
<Link to={`https://zapstr.live/?track=${link}`} target="_blank">
<button>
<FormattedMessage defaultMessage="Open on Zapstr" />
<FormattedMessage defaultMessage="Open on Zapstr" id="Lu5/Bj" />
</button>
</Link>
</>

View File

@ -10,7 +10,7 @@ const HiddenNote = ({ children }: { children: React.ReactNode }) => {
<div className="card note hidden-note">
<div className="header">
<p>
<FormattedMessage defaultMessage="This note has been muted" />
<FormattedMessage defaultMessage="This note has been muted" id="qfmMQh" />
</p>
<button type="button" onClick={() => setShow(true)}>
<FormattedMessage {...messages.Show} />

View File

@ -93,7 +93,7 @@ export function LongFormText(props: LongFormTextProps) {
<div className="flex g8">
<div>
<FormattedMessage
defaultMessage="{n} mins to read"
defaultMessage="{n} mins to read" id="zm6qS1"
values={{
n: <FormattedNumber value={readTime().mins} />,
}}
@ -102,12 +102,12 @@ export function LongFormText(props: LongFormTextProps) {
<div></div>
{!reading && (
<div className="pointer" onClick={() => readArticle()}>
<FormattedMessage defaultMessage="Listen to this article" />
<FormattedMessage defaultMessage="Listen to this article" id="nihgfo" />
</div>
)}
{reading && (
<div className="pointer" onClick={() => stopReading()}>
<FormattedMessage defaultMessage="Stop listening" />
<FormattedMessage defaultMessage="Stop listening" id="U1aPPi" />
</div>
)}
</div>

View File

@ -26,14 +26,14 @@ export function NostrFileElement({ ev }: { ev: NostrEvent }) {
if (u && m) {
return (
<Reveal message={<FormattedMessage defaultMessage="Click to load content from {link}" values={{ link: u }} />}>
<Reveal message={<FormattedMessage defaultMessage="Click to load content from {link}" id="lsNFM1" values={{ link: u }} />}>
<MediaElement mime={m} url={u} sha256={x} magnet={magnet} blurHash={blurHash} />
</Reveal>
);
} else {
return (
<b className="error">
<FormattedMessage defaultMessage="Unknown file header: {name}" values={{ name: ev.content }} />
<FormattedMessage defaultMessage="Unknown file header: {name}" id="PamNxw" values={{ name: ev.content }} />
</b>
);
}

View File

@ -73,7 +73,7 @@ export function NoteBroadcaster({
return (
<div className="flex flex-col g16">
<h3>
<FormattedMessage defaultMessage="Sending notes and other stuff" />
<FormattedMessage defaultMessage="Sending notes and other stuff" id="ugyJnE" />
</h3>
{results
.filter(a => a.message !== "Duplicate request")
@ -91,7 +91,7 @@ export function NoteBroadcaster({
onClick={() => retryPublish(r)}
className="p4 br-compact flex items-center secondary"
title={formatMessage({
defaultMessage: "Retry publishing",
defaultMessage: "Retry publishing", id: '9kSari',
})}>
<Icon name="refresh-ccw-01" />
</AsyncButton>
@ -99,7 +99,7 @@ export function NoteBroadcaster({
onClick={() => removeRelayFromResult(r)}
className="p4 br-compact flex items-center secondary"
title={formatMessage({
defaultMessage: "Remove from my relays",
defaultMessage: "Remove from my relays", id: 'UJTWqI',
})}>
<Icon name="trash-01" className="trash-icon" />
</AsyncButton>
@ -109,7 +109,7 @@ export function NoteBroadcaster({
))}
<div className="flex-row g8">
<button type="button" onClick={() => onClose()}>
<FormattedMessage defaultMessage="Close" />
<FormattedMessage defaultMessage="Close" id="rbrahO" />
</button>
</div>
</div>

View File

@ -170,7 +170,7 @@ export function NoteContextMenu({ ev, ...props }: NosteContextMenuProps) {
)}
<MenuItem onClick={handleReBroadcastButtonClick}>
<Icon name="relay" />
<FormattedMessage defaultMessage="Broadcast Event" />
<FormattedMessage defaultMessage="Broadcast Event" id="Gxcr08" />
</MenuItem>
{ev.pubkey !== login.publicKey && !login.readonly && (
<MenuItem onClick={() => block(ev.pubkey)}>

View File

@ -52,7 +52,7 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Failed to parse zap split: {input}",
defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ',
},
{
input: s.value,
@ -69,7 +69,7 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Failed to parse zap split: {input}",
defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ',
},
{
input: s.value,
@ -81,7 +81,7 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Invalid zap split: {input}",
defaultMessage: "Invalid zap split: {input}", id: '8Y6bZQ',
},
{
input: s.value,
@ -258,12 +258,12 @@ export function NoteCreator() {
return (
<>
<h4>
<FormattedMessage defaultMessage="Poll Options" />
<FormattedMessage defaultMessage="Poll Options" id="vhlWFg" />
</h4>
{note.pollOptions?.map((a, i) => (
<div className="form-group w-max" key={`po-${i}`}>
<div>
<FormattedMessage defaultMessage="Option: {n}" values={{ n: i + 1 }} />
<FormattedMessage defaultMessage="Option: {n}" id="mfe8RW" values={{ n: i + 1 }} />
</div>
<div>
<input type="text" value={a} onChange={e => changePollOption(i, e.target.value)} />
@ -353,24 +353,24 @@ export function NoteCreator() {
<>
<div>
<h4>
<FormattedMessage defaultMessage="Custom Relays" />
<FormattedMessage defaultMessage="Custom Relays" id="EcZF24" />
</h4>
<p>
<FormattedMessage defaultMessage="Send note to a subset of your write relays" />
<FormattedMessage defaultMessage="Send note to a subset of your write relays" id="th5lxp" />
</p>
{renderRelayCustomisation()}
</div>
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Zap Splits" />
<FormattedMessage defaultMessage="Zap Splits" id="5CB6zB" />
</h4>
<FormattedMessage defaultMessage="Zaps on this note will be split to the following users." />
<FormattedMessage defaultMessage="Zaps on this note will be split to the following users." id="LwYmVi" />
<div className="flex flex-col g8">
{[...(note.zapSplits ?? [])].map((v, i, arr) => (
<div className="flex items-center g8">
<div className="flex flex-col f-4 g4">
<h4>
<FormattedMessage defaultMessage="Recipient" />
<FormattedMessage defaultMessage="Recipient" id="8Rkoyb" />
</h4>
<input
type="text"
@ -380,12 +380,12 @@ export function NoteCreator() {
v => (v.zapSplits = arr.map((vv, ii) => (ii === i ? { ...vv, value: e.target.value } : vv))),
)
}
placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address" })}
placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address", id: 'WvGmZT' })}
/>
</div>
<div className="flex flex-col f-1 g4">
<h4>
<FormattedMessage defaultMessage="Weight" />
<FormattedMessage defaultMessage="Weight" id="zCb8fX" />
</h4>
<input
type="number"
@ -415,18 +415,18 @@ export function NoteCreator() {
onClick={() =>
note.update(v => (v.zapSplits = [...(v.zapSplits ?? []), { type: "pubkey", value: "", weight: 1 }]))
}>
<FormattedMessage defaultMessage="Add" />
<FormattedMessage defaultMessage="Add" id="2/2yg+" />
</button>
</div>
<span className="warning">
<FormattedMessage defaultMessage="Not all clients support this, you may still receive some zaps as if zap splits was not configured" />
<FormattedMessage defaultMessage="Not all clients support this, you may still receive some zaps as if zap splits was not configured" id="6bgpn+" />
</span>
</div>
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Sensitive Content" />
<FormattedMessage defaultMessage="Sensitive Content" id="bQdA2k" />
</h4>
<FormattedMessage defaultMessage="Users must accept the content warning to show the content of your note." />
<FormattedMessage defaultMessage="Users must accept the content warning to show the content of your note." id="UUPFlt" />
<input
className="w-max"
type="text"
@ -435,11 +435,11 @@ export function NoteCreator() {
maxLength={50}
minLength={1}
placeholder={formatMessage({
defaultMessage: "Reason",
defaultMessage: "Reason", id: 'AkCxS/',
})}
/>
<span className="warning">
<FormattedMessage defaultMessage="Not all clients support this yet" />
<FormattedMessage defaultMessage="Not all clients support this yet" id="gXgY3+" />
</span>
</div>
</>
@ -473,7 +473,7 @@ export function NoteCreator() {
className={classNames("note-creator-icon", { active: note.advanced })}
/>
<span className="sm:inline hidden">
<FormattedMessage defaultMessage="Preview" />
<FormattedMessage defaultMessage="Preview" id="TJo5E6" />
</span>
<ToggleSwitch
onClick={() => loadPreview()}
@ -483,10 +483,10 @@ export function NoteCreator() {
</div>
<div className="flex g8">
<button className="secondary" onClick={cancel}>
<FormattedMessage defaultMessage="Cancel" />
<FormattedMessage defaultMessage="Cancel" id="47FYwb" />
</button>
<AsyncButton onClick={onSubmit} className="primary">
{note.replyTo ? <FormattedMessage defaultMessage="Reply" /> : <FormattedMessage defaultMessage="Send" />}
{note.replyTo ? <FormattedMessage defaultMessage="Reply" id="9HU8vw" /> : <FormattedMessage defaultMessage="Send" id="9WRlF4" />}
</AsyncButton>
</div>
</div>
@ -536,7 +536,7 @@ export function NoteCreator() {
{note.replyTo && (
<>
<h4>
<FormattedMessage defaultMessage="Reply To" />
<FormattedMessage defaultMessage="Reply To" id="8ED/4u" />
</h4>
<Note
data={note.replyTo}
@ -555,7 +555,7 @@ export function NoteCreator() {
{note.quote && (
<>
<h4>
<FormattedMessage defaultMessage="Quote Repost" />
<FormattedMessage defaultMessage="Quote Repost" id="C7642/" />
</h4>
<Note
data={note.quote}
@ -597,13 +597,13 @@ export function NoteCreator() {
value={note.hashTags}
onChange={e => note.update(s => (s.hashTags = e))}
placeHolder={formatMessage({
defaultMessage: "Add up to 4 hashtags",
defaultMessage: "Add up to 4 hashtags", id: 'AIgmDy',
})}
separators={["Enter", ","]}
/>
{note.hashTags.length > 4 && (
<small className="warning">
<FormattedMessage defaultMessage="Try to use less than 5 hashtags to stay on topic 🙏" />
<FormattedMessage defaultMessage="Try to use less than 5 hashtags to stay on topic 🙏" id="d8gpCh" />
</small>
)}
<TrendingHashTagsLine onClick={t => note.update(s => (s.hashTags = appendDedupe(s.hashTags, [t])))} />
@ -652,7 +652,7 @@ function TrendingHashTagsLine(props: { onClick: (tag: string) => void }) {
return (
<div className="flex flex-col g4">
<small>
<FormattedMessage defaultMessage="Popular Hashtags" />
<FormattedMessage defaultMessage="Popular Hashtags" id="ddd3JX" />
</small>
<div className="flex g4 flex-wrap">
{hashtags.slice(0, 5).map(a => (

View File

@ -187,7 +187,7 @@ export default function NoteFooter(props: NoteFooterProps) {
const pow = findTag(ev, "nonce") ? countLeadingZeros(ev.id) : undefined;
if (pow) {
return (
<AsyncFooterIcon title={formatMessage({ defaultMessage: "Proof of Work" })} iconName="diamond" value={pow} />
<AsyncFooterIcon title={formatMessage({ defaultMessage: "Proof of Work", id: 'grQ+mI' })} iconName="diamond" value={pow} />
);
}
}
@ -199,7 +199,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={didZap ? "reacted text-nostr-orange" : "hover:text-nostr-orange"}
{...longPress()}
title={formatMessage({ defaultMessage: "Zap" })}
title={formatMessage({ defaultMessage: "Zap", id: 'fBI91o' })}
iconName={canFastZap ? "zapFast" : "zap"}
value={zapTotal}
onClick={e => fastZap(e)}
@ -217,7 +217,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={hasReposted() ? "reacted text-nostr-blue" : "hover:text-nostr-blue"}
iconName="repeat"
title={formatMessage({ defaultMessage: "Repost" })}
title={formatMessage({ defaultMessage: "Repost", id: 'JeoS4y' })}
value={reposts.length}
/>
}
@ -232,7 +232,7 @@ export default function NoteFooter(props: NoteFooterProps) {
</div>
<MenuItem onClick={() => repost()} disabled={hasReposted()}>
<Icon name="repeat" />
<FormattedMessage defaultMessage="Repost" />
<FormattedMessage defaultMessage="Repost" id="JeoS4y" />
</MenuItem>
<MenuItem
onClick={() =>
@ -243,7 +243,7 @@ export default function NoteFooter(props: NoteFooterProps) {
})
}>
<Icon name="edit" />
<FormattedMessage defaultMessage="Quote Repost" />
<FormattedMessage defaultMessage="Quote Repost" id="C7642/" />
</MenuItem>
</Menu>
);
@ -258,7 +258,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={reacted ? "reacted text-nostr-red" : "hover:text-nostr-red"}
iconName={reacted ? "heart-solid" : "heart"}
title={formatMessage({ defaultMessage: "Like" })}
title={formatMessage({ defaultMessage: "Like", id: 'qtWLmt' })}
value={positive.length}
onClick={async () => {
if (readonly) return;
@ -274,7 +274,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={note.show ? "reacted text-nostr-purple" : "hover:text-nostr-purple"}
iconName="reply"
title={formatMessage({ defaultMessage: "Reply" })}
title={formatMessage({ defaultMessage: "Reply", id: '9HU8vw' })}
value={props.replies ?? 0}
onClick={async () => handleReplyButtonClick()}
/>

View File

@ -118,7 +118,7 @@ export function NoteInner(props: NoteProps) {
message={
<>
<FormattedMessage
defaultMessage="The author has marked this note as a <i>sensitive topic</i>"
defaultMessage="The author has marked this note as a <i>sensitive topic</i>" id="StKzTE"
values={{
i: c => <i>{c}</i>,
}}
@ -127,7 +127,7 @@ export function NoteInner(props: NoteProps) {
<>
&nbsp;
<FormattedMessage
defaultMessage="Reason: <i>{reason}</i>"
defaultMessage="Reason: <i>{reason}</i>" id="6OSOXl"
values={{
i: c => <i>{c}</i>,
reason: contentWarning[1],
@ -136,7 +136,7 @@ export function NoteInner(props: NoteProps) {
</>
)}
&nbsp;
<FormattedMessage defaultMessage="Click here to load anyway" />
<FormattedMessage defaultMessage="Click here to load anyway" id="IoQq+a" />
</>
}>
{innerContent}

View File

@ -79,7 +79,7 @@ export default function NoteReaction(props: NoteReactionProps) {
<div className="flex g4">
<Icon name="repeat" size={18} />
<FormattedMessage
defaultMessage="{name} reposted"
defaultMessage="{name} reposted" id="+xliwN"
values={{
name: getDisplayName(profile, ev.pubkey),
}}

View File

@ -51,7 +51,7 @@ export default function Poll(props: PollProps) {
throw new Error(
formatMessage(
{
defaultMessage: "Can't vote with {amount} sats, please set a different default zap amount",
defaultMessage: "Can't vote with {amount} sats, please set a different default zap amount", id: 'NepkXH',
},
{
amount,
@ -75,7 +75,7 @@ export default function Poll(props: PollProps) {
if (!svc.canZap) {
throw new Error(
formatMessage({
defaultMessage: "Can't vote because LNURL service does not support zaps",
defaultMessage: "Can't vote because LNURL service does not support zaps", id: 'fOksnD',
}),
);
}
@ -92,7 +92,7 @@ export default function Poll(props: PollProps) {
} else {
setError(
formatMessage({
defaultMessage: "Failed to send vote",
defaultMessage: "Failed to send vote", id: 'g985Wp',
}),
);
}
@ -115,7 +115,7 @@ export default function Poll(props: PollProps) {
<div className="flex justify-between p">
<small>
<FormattedMessage
defaultMessage="You are voting with {amount} sats"
defaultMessage="You are voting with {amount} sats" id="3qnJlS"
values={{
amount: formatShort(prefs.defaultZapAmount),
}}
@ -123,13 +123,13 @@ export default function Poll(props: PollProps) {
</small>
<button type="button" onClick={() => setTallyBy(s => (s !== "zaps" ? "zaps" : "pubkeys"))}>
<FormattedMessage
defaultMessage="Votes by {type}"
defaultMessage="Votes by {type}" id="xIcAOU"
values={{
type:
tallyBy === "zaps" ? (
<FormattedMessage defaultMessage="zap" />
<FormattedMessage defaultMessage="zap" id="5BVs2e" />
) : (
<FormattedMessage defaultMessage="user" />
<FormattedMessage defaultMessage="user" id="sUNhQE" />
),
}}
/>

View File

@ -105,7 +105,7 @@ const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: Reactio
pubkey={z.anonZap ? "" : z.sender}
subHeader={<div title={z.content}>{z.content}</div>}
link={z.anonZap ? "" : undefined}
overrideUsername={z.anonZap ? formatMessage({ defaultMessage: "Anonymous" }) : undefined}
overrideUsername={z.anonZap ? formatMessage({ defaultMessage: "Anonymous", id: 'LXxsbk' }) : undefined}
/>
</div>
)

View File

@ -57,7 +57,7 @@ export default function RevealMedia(props: RevealMediaProps) {
<Reveal
message={
<FormattedMessage
defaultMessage="You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody."
defaultMessage="You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody." id="HhcAVH"
values={{
i: i => <i>{i}</i>,
a: a => <Link to="/settings/preferences">{a}</Link>,

View File

@ -14,7 +14,7 @@ const ShowMore = ({ text, onClick, className = "" }: ShowMoreProps) => {
return (
<div className="show-more-container">
<button className={classNames("show-more", className)} onClick={onClick}>
{text || <FormattedMessage defaultMessage="Show More" />}
{text || <FormattedMessage defaultMessage="Show More" id="O8Z8t9" />}
</button>
</div>
);

View File

@ -303,11 +303,11 @@ export function Thread(props: { onBack?: () => void; disableSpotlight?: boolean
}
const parentText = formatMessage({
defaultMessage: "Parent",
defaultMessage: "Parent", id: 'ADmfQT',
description: "Link to parent note in thread",
});
const backText = formatMessage({
defaultMessage: "Back",
defaultMessage: "Back", id: 'jfV8Wr',
description: "Navigate back button on threads view",
});

View File

@ -60,7 +60,7 @@ export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => {
<ProfileImage
pubkey={anonZap ? "" : sender}
showFollowDistance={false}
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous" }) : undefined}
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous", id: 'LXxsbk' }) : undefined}
/>
)}
{restZaps.length > 0 ? (

View File

@ -84,7 +84,7 @@ const Timeline = (props: TimelineProps) => {
{(props.loadMore === undefined || props.loadMore === true) && (
<div className="flex items-center">
<button type="button" onClick={() => feed.loadMore()}>
<FormattedMessage defaultMessage="Load more" />
<FormattedMessage defaultMessage="Load more" id="00LcfG" />
</button>
</div>
)}

View File

@ -39,7 +39,7 @@ export function TimelineRenderer(props: TimelineRendererProps) {
return <ProfileImage pubkey={p} showUsername={false} link={""} showFollowDistance={false} />;
})}
<FormattedMessage
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}"
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}" id="3t3kok"
values={{ n: props.latest.length }}
/>
<Icon name="arrowUp" />
@ -52,7 +52,7 @@ export function TimelineRenderer(props: TimelineRendererProps) {
return <ProfileImage pubkey={p} showUsername={false} link={""} showFollowDistance={false} />;
})}
<FormattedMessage
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}"
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}" id="3t3kok"
values={{ n: props.latest.length }}
/>
<Icon name="arrowUp" />

View File

@ -6,10 +6,10 @@ export default function AccountName({ name = "", link = true }) {
return (
<>
<div>
<FormattedMessage defaultMessage="Username" />: <b>{name}</b>
<FormattedMessage defaultMessage="Username" id="JCIgkj" />: <b>{name}</b>
</div>
<div>
<FormattedMessage defaultMessage="Short link" />:{" "}
<FormattedMessage defaultMessage="Short link" id="rx1i0i" />:{" "}
{link ? (
<a
href={`https://iris.to/${name}`}
@ -24,7 +24,7 @@ export default function AccountName({ name = "", link = true }) {
)}
</div>
<div>
<FormattedMessage defaultMessage="Nostr address (nip05)" />: <b>{name}@iris.to</b>
<FormattedMessage defaultMessage="Nostr address (nip05)" id="BjNwZW" />: <b>{name}@iris.to</b>
</div>
</>
);

View File

@ -61,12 +61,12 @@ export default function ActiveAccount({ name = "", setAsPrimary = () => {} }) {
return (
<div>
<div className="negative">
<FormattedMessage defaultMessage="You have an active iris.to account" />:
<FormattedMessage defaultMessage="You have an active iris.to account" id="UrKTqQ" />:
<AccountName name={name} />
</div>
<p>
<button type="button" onClick={onClick}>
<FormattedMessage defaultMessage="Set as primary Nostr address (nip05)" />
<FormattedMessage defaultMessage="Set as primary Nostr address (nip05)" id="MiMipu" />
</button>
</p>
</div>

View File

@ -71,7 +71,7 @@ class IrisAccount extends Component<Props> {
view = (
<div>
<p>
<FormattedMessage defaultMessage="Register an Iris username" /> (iris.to/username)
<FormattedMessage defaultMessage="Register an Iris username" id="kEZUR8" /> (iris.to/username)
</p>
<form onSubmit={e => this.showChallenge(e)}>
<div className="flex g8">
@ -83,14 +83,14 @@ class IrisAccount extends Component<Props> {
onInput={e => this.onNewUserNameChange(e)}
/>
<button type="submit">
<FormattedMessage defaultMessage="Register" />
<FormattedMessage defaultMessage="Register" id="deEeEI" />
</button>
</div>
<div>
{this.state.newUserNameValid ? (
<>
<span className="success">
<FormattedMessage defaultMessage="Username is available" />
<FormattedMessage defaultMessage="Username is available" id="EcfIwB" />
</span>
<AccountName name={this.state.newUserName} link={false} />
</>
@ -106,7 +106,7 @@ class IrisAccount extends Component<Props> {
return (
<>
<h3>
<FormattedMessage defaultMessage="Iris.to account" />
<FormattedMessage defaultMessage="Iris.to account" id="Mzizei" />
</h3>
{view}
<p>

View File

@ -6,19 +6,19 @@ export default function ReservedAccount({ name = "", enableReserved = () => {},
<div>
<p className="success">
<FormattedMessage
defaultMessage="Username iris.to/<b>{name}</b> is reserved for you!"
defaultMessage="Username iris.to/<b>{name}</b> is reserved for you!" id="Zff6lu"
values={{ name, b: s => <b>{s}</b> }}
/>
</p>
<AccountName name={name} link={false} />
<p>
<button className="btn btn-sm btn-primary" onClick={() => enableReserved()}>
<FormattedMessage defaultMessage="Yes please" />
<FormattedMessage defaultMessage="Yes please" id="VcwrfF" />
</button>
</p>
<p>
<button className="btn btn-sm btn-neutral" onClick={() => declineReserved()}>
<FormattedMessage defaultMessage="No thanks" />
<FormattedMessage defaultMessage="No thanks" id="c+JYNI" />
</button>
</p>
</div>

View File

@ -19,7 +19,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
<div className="flex g4">
<Icon name="signal-01" />
<b className="uppercase">
<FormattedMessage defaultMessage="Live" />
<FormattedMessage defaultMessage="Live" id="Dn82AL" />
</b>
</div>
);
@ -27,7 +27,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
case "ended": {
return (
<b className="uppercase">
<FormattedMessage defaultMessage="Ended" />
<FormattedMessage defaultMessage="Ended" id="TP/cMX" />
</b>
);
}
@ -50,7 +50,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
return (
<Link to={link} target="_blank">
<button type="button">
<FormattedMessage defaultMessage="Join Stream" />
<FormattedMessage defaultMessage="Join Stream" id="GQPtfk" />
</button>
</Link>
);
@ -60,7 +60,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
return (
<Link to={link} target="_blank">
<button type="button">
<FormattedMessage defaultMessage="Watch Replay" />
<FormattedMessage defaultMessage="Watch Replay" id="6/hB3S" />
</button>
</Link>
);

View File

@ -283,7 +283,7 @@ export default function Nip5Service(props: Nip05ServiceProps) {
: startBuy(handle, domain)
}>
{props.forSubscription ? (
<FormattedMessage defaultMessage="Claim Now" />
<FormattedMessage defaultMessage="Claim Now" id="FdhSU2" />
) : (
<FormattedMessage {...messages.BuyNow} />
)}

View File

@ -8,11 +8,11 @@ export function Offline({ onRetry, className }: { onRetry?: () => void | Promise
<div className={classNames("flex items-center g8", className)}>
<Icon name="wifi-off" className="error" />
<div className="error">
<FormattedMessage defaultMessage="Offline" />
<FormattedMessage defaultMessage="Offline" id="7UOvbT" />
</div>
{onRetry && (
<AsyncButton onClick={onRetry}>
<FormattedMessage defaultMessage="Retry" />
<FormattedMessage defaultMessage="Retry" id="62nsdy" />
</AsyncButton>
)}
</div>

View File

@ -29,7 +29,7 @@ export function PinPrompt({
if (pin.length < 4) {
setError(
formatMessage({
defaultMessage: "Pin too short",
defaultMessage: "Pin too short", id: 'LR1XjT',
}),
);
return;
@ -43,7 +43,7 @@ export function PinPrompt({
if (e instanceof InvalidPinError) {
setError(
formatMessage({
defaultMessage: "Incorrect pin",
defaultMessage: "Incorrect pin", id: 'qz9fty',
}),
);
} else if (e instanceof Error) {
@ -65,7 +65,7 @@ export function PinPrompt({
}}>
<div className="flex flex-col g12">
<h2>
<FormattedMessage defaultMessage="Enter Pin" />
<FormattedMessage defaultMessage="Enter Pin" id="KtsyO0" />
</h2>
{subTitle ? <div>{subTitle}</div> : null}
<input
@ -79,10 +79,10 @@ export function PinPrompt({
{error && <b className="error">{error}</b>}
<div className="flex g8">
<button type="button" onClick={() => onCancel()}>
<FormattedMessage defaultMessage="Cancel" />
<FormattedMessage defaultMessage="Cancel" id="47FYwb" />
</button>
<AsyncButton ref={submitButtonRef} onClick={() => submitPin()} type="submit">
<FormattedMessage defaultMessage="Submit" />
<FormattedMessage defaultMessage="Submit" id="wSZR47" />
</AsyncButton>
</div>
</div>
@ -143,7 +143,7 @@ export function LoginUnlock() {
subTitle={
<p>
<FormattedMessage
defaultMessage="Enter a pin to encrypt your private key, you must enter this pin every time you open {site}."
defaultMessage="Enter a pin to encrypt your private key, you must enter this pin every time you open {site}." id="SLZGPn"
values={{
site: CONFIG.appNameCapitalized,
}}
@ -161,7 +161,7 @@ export function LoginUnlock() {
<PinPrompt
subTitle={
<p>
<FormattedMessage defaultMessage="Enter pin to unlock your private key" />
<FormattedMessage defaultMessage="Enter pin to unlock your private key" id="e7VmYP" />
</p>
}
onResult={unlockSession}

View File

@ -24,7 +24,7 @@ export const ProxyImg = (props: ProxyImgProps) => {
setBypass(true);
}}>
<FormattedMessage
defaultMessage="Failed to proxy image from {host}, click here to load directly"
defaultMessage="Failed to proxy image from {host}, click here to load directly" id="65BmHb"
values={{
host: getUrlHostname(props.src),
}}

View File

@ -30,7 +30,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="user-v2" />
<FormattedMessage defaultMessage="Following" />
<FormattedMessage defaultMessage="Following" id="cPIKU2" />
</>
),
},
@ -41,7 +41,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="fire" />
<FormattedMessage defaultMessage="Trending Notes" />
<FormattedMessage defaultMessage="Trending Notes" id="Ix8l+B" />
</>
),
},
@ -52,7 +52,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="message-chat-circle" />
<FormattedMessage defaultMessage="Conversations" />
<FormattedMessage defaultMessage="Conversations" id="1udzha" />
</>
),
},
@ -63,7 +63,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="user-up" />
<FormattedMessage defaultMessage="Trending People" />
<FormattedMessage defaultMessage="Trending People" id="CVWeJ6" />
</>
),
},
@ -74,7 +74,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="thumbs-up" />
<FormattedMessage defaultMessage="Suggested Follows" />
<FormattedMessage defaultMessage="Suggested Follows" id="C8HhVE" />
</>
),
},
@ -85,7 +85,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="hash" />
<FormattedMessage defaultMessage="Trending Hashtags" />
<FormattedMessage defaultMessage="Trending Hashtags" id="XXm7jJ" />
</>
),
},
@ -96,7 +96,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="globe" />
<FormattedMessage defaultMessage="Global" />
<FormattedMessage defaultMessage="Global" id="EWyQH5" />
</>
),
},
@ -107,7 +107,7 @@ export function RootTabs({ base }: { base?: string }) {
element: (
<>
<Icon name="hash" />
<FormattedMessage defaultMessage="Topics" />
<FormattedMessage defaultMessage="Topics" id="kc79d3" />
</>
),
},

View File

@ -116,7 +116,7 @@ export default function SearchBox() {
<div className="search relative">
<input
type="text"
placeholder={formatMessage({ defaultMessage: "Search" })}
placeholder={formatMessage({ defaultMessage: "Search", id: 'xmcVZ0' })}
className="w-max"
value={search}
onChange={handleChange}
@ -141,7 +141,7 @@ export default function SearchBox() {
}`}
onMouseEnter={() => setActiveIndex(0)}
onClick={() => navigate(`/search/${encodeURIComponent(search)}`, { state: { forceRefresh: true } })}>
<FormattedMessage defaultMessage="Search notes" />: <b>{search}</b>
<FormattedMessage defaultMessage="Search notes" id="EJbFi7" />: <b>{search}</b>
</div>
{main?.slice(0, MAX_RESULTS).map((result, idx) => (
<div

View File

@ -104,7 +104,7 @@ export default function SendSats(props: SendSatsProps) {
<div className="flex items-center">
<p className="flex g12">
<Icon name="check" className="success" />
{success?.description ?? <FormattedMessage defaultMessage="Paid" />}
{success?.description ?? <FormattedMessage defaultMessage="Paid" id="u/vOPu" />}
</p>
{success.url && (
<p>
@ -123,9 +123,9 @@ export default function SendSats(props: SendSatsProps) {
<>
<h2>
{zapper?.canZap() ? (
<FormattedMessage defaultMessage="Send zap" />
<FormattedMessage defaultMessage="Send zap" id="5ykRmX" />
) : (
<FormattedMessage defaultMessage="Send sats" />
<FormattedMessage defaultMessage="Send sats" id="DKnriN" />
)}
</h2>
</>
@ -141,9 +141,9 @@ export default function SendSats(props: SendSatsProps) {
{t.zap?.pubkey && <ProfileImage pubkey={t.zap.pubkey} showUsername={false} />}
<h2>
{zapper?.canZap() ? (
<FormattedMessage defaultMessage="Send zap to {name}" values={values} />
<FormattedMessage defaultMessage="Send zap to {name}" id="SMO+on" values={values} />
) : (
<FormattedMessage defaultMessage="Send sats to {name}" values={values} />
<FormattedMessage defaultMessage="Send sats to {name}" id="JGrt9q" values={values} />
)}
</h2>
</>
@ -156,9 +156,9 @@ export default function SendSats(props: SendSatsProps) {
<div className="flex flex-col g12">
<h2>
{zapper?.canZap() ? (
<FormattedMessage defaultMessage="Send zap splits to" />
<FormattedMessage defaultMessage="Send zap splits to" id="ZS+jRE" />
) : (
<FormattedMessage defaultMessage="Send sats splits to" />
<FormattedMessage defaultMessage="Send sats splits to" id="uc0din" />
)}
</h2>
<div className="flex g4 f-wrap">
@ -330,7 +330,7 @@ function SendSatsInput(props: {
<div className="flex flex-col g24">
<div className="flex flex-col g8">
<h3>
<FormattedMessage defaultMessage="Zap amount in sats" />
<FormattedMessage defaultMessage="Zap amount in sats" id="zcaOTs" />
</h3>
{renderAmounts()}
{custom()}
@ -348,7 +348,7 @@ function SendSatsInput(props: {
{(amount ?? 0) > 0 && (
<AsyncButton onClick={() => props.onNextStage(getValue())}>
<Icon name="zap" />
<FormattedMessage defaultMessage="Zap {n} sats" values={{ n: formatShort(amount) }} />
<FormattedMessage defaultMessage="Zap {n} sats" id="8QDesP" values={{ n: formatShort(amount) }} />
</AsyncButton>
)}
</div>
@ -365,15 +365,15 @@ function SendSatsZapTypeSelector({ zapType, setZapType }: { zapType: ZapType; se
return (
<div className="flex flex-col g8">
<h3>
<FormattedMessage defaultMessage="Zap Type" />
<FormattedMessage defaultMessage="Zap Type" id="+aZY2h" />
</h3>
<div className="flex g8">
{!readonly && makeTab(ZapType.PublicZap, <FormattedMessage defaultMessage="Public" description="Public Zap" />)}
{!readonly && makeTab(ZapType.PublicZap, <FormattedMessage defaultMessage="Public" id="/PCavi" description="Public Zap" />)}
{/*makeTab(ZapType.PrivateZap, "Private")*/}
{makeTab(ZapType.AnonZap, <FormattedMessage defaultMessage="Anon" description="Anonymous Zap" />)}
{makeTab(ZapType.AnonZap, <FormattedMessage defaultMessage="Anon" id="wWLwvh" description="Anonymous Zap" />)}
{makeTab(
ZapType.NonZap,
<FormattedMessage defaultMessage="Non-Zap" description="Non-Zap, Regular LN payment" />,
<FormattedMessage defaultMessage="Non-Zap" id="AnLrRC" description="Non-Zap, Regular LN payment" />,
)}
</div>
</div>
@ -396,7 +396,7 @@ function SendSatsInvoice(props: {
<Copy text={v.pr} maxSize={26} className="items-center" />
<a href={`lightning:${v.pr}`}>
<button type="button">
<FormattedMessage defaultMessage="Open Wallet" />
<FormattedMessage defaultMessage="Open Wallet" id="HbefNb" />
</button>
</a>
</div>

View File

@ -57,7 +57,7 @@ export default function SuggestedProfiles() {
return (
<>
<div className="flex items-center justify-between bg-superdark p br">
<FormattedMessage defaultMessage="Provider" />
<FormattedMessage defaultMessage="Provider" id="xaj9Ba" />
<select onChange={e => setProvider(Number(e.target.value))}>
<option value={Provider.NostrBand}>nostr.band</option>
{/*<option value={Provider.SemisolDev}>semisol.dev</option>*/}

View File

@ -42,7 +42,7 @@ export default function BadgeList({ badges }: { badges: TaggedNostrEvent[] }) {
</div>
<div className="reactions-header">
<h2>
<FormattedMessage defaultMessage="Badges" />
<FormattedMessage defaultMessage="Badges" id="h8XMJL" />
</h2>
</div>
<div className="body">
@ -55,7 +55,7 @@ export default function BadgeList({ badges }: { badges: TaggedNostrEvent[] }) {
<p>{description}</p>
<p>
<FormattedMessage
defaultMessage="By: {author}"
defaultMessage="By: {author}" id="RfhLwC"
values={{ author: <Username pubkey={pubkey} onLinkVisit={() => setShowModal(false)} /> }}
/>
</p>

View File

@ -12,7 +12,7 @@ export function FollowingMark({ pubkey }: { pubkey: string }) {
return (
<span className="following flex g4">
<Icon name="check" className="success" size={12} />
<FormattedMessage defaultMessage="following" />
<FormattedMessage defaultMessage="following" id="+tShPg" />
</span>
);
}

View File

@ -1,103 +1,103 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Cancel: { defaultMessage: "Cancel" },
Reply: { defaultMessage: "Reply" },
Send: { defaultMessage: "Send" },
NotePlaceholder: { defaultMessage: "What's on your mind?" },
Back: { defaultMessage: "Back" },
Block: { defaultMessage: "Block" },
Unblock: { defaultMessage: "Unblock" },
MuteCount: { defaultMessage: "{n} muted" },
Mute: { defaultMessage: "Mute" },
MutedAuthor: { defaultMessage: "This author has been muted" },
Others: { defaultMessage: ` & {n} {n, plural, =1 {other} other {others}}` },
Show: { defaultMessage: "Show" },
Delete: { defaultMessage: "Delete" },
Deleted: { defaultMessage: "Deleted" },
Unmute: { defaultMessage: "Unmute" },
MuteAll: { defaultMessage: "Mute all" },
BlockCount: { defaultMessage: "{n} blocked" },
JustNow: { defaultMessage: "Just now" },
Follow: { defaultMessage: "Follow" },
FollowAll: { defaultMessage: "Follow all" },
Unfollow: { defaultMessage: "Unfollow" },
FollowerCount: { defaultMessage: "{n} followers" },
FollowingCount: { defaultMessage: "Follows {n}" },
FollowsYou: { defaultMessage: "follows you" },
Invoice: { defaultMessage: "Lightning Invoice" },
PayInvoice: { defaultMessage: "Pay Invoice" },
Expired: { defaultMessage: "Expired" },
Pay: { defaultMessage: "Pay" },
Loading: { defaultMessage: "Loading..." },
Logout: { defaultMessage: "Logout" },
ShowMore: { defaultMessage: "Show more" },
TranslateTo: { defaultMessage: "Translate to {lang}" },
TranslatedFrom: { defaultMessage: "Translated from {lang}" },
TranslationFailed: { defaultMessage: "Translation failed" },
UnknownEventKind: { defaultMessage: "Unknown event kind: {kind}" },
ConfirmDeletion: { defaultMessage: `Are you sure you want to delete {id}` },
ConfirmRepost: { defaultMessage: `Are you sure you want to repost: {id}` },
Reactions: { defaultMessage: "Reactions" },
ReactionsCount: { defaultMessage: "Reactions ({n})" },
Share: { defaultMessage: "Share" },
CopyID: { defaultMessage: "Copy ID" },
CopyJSON: { defaultMessage: "Copy Event JSON" },
Dislike: { defaultMessage: "{n} Dislike" },
DislikeAction: { defaultMessage: "Dislike" },
Sats: { defaultMessage: `{n} {n, plural, =1 {sat} other {sats}}` },
Zapped: { defaultMessage: "zapped" },
OthersZapped: { defaultMessage: `{n, plural, =0 {} =1 {zapped} other {zapped}}` },
Likes: { defaultMessage: "Likes ({n})" },
Zaps: { defaultMessage: "Zaps ({n})" },
Dislikes: { defaultMessage: "Dislikes ({n})" },
Reposts: { defaultMessage: "Reposts ({n})" },
NoteToSelf: { defaultMessage: "Note to Self" },
Read: { defaultMessage: "Read" },
Write: { defaultMessage: "Write" },
Seconds: { defaultMessage: "{n} secs" },
Milliseconds: { defaultMessage: "{n} ms" },
ShowLatest: { defaultMessage: "Show latest {n} notes" },
LNURLFail: { defaultMessage: "Failed to load LNURL service" },
InvalidLNURL: { defaultMessage: "Invalid LNURL" },
InvoiceFail: { defaultMessage: "Failed to load invoice" },
Custom: { defaultMessage: "Custom" },
Confirm: { defaultMessage: "Confirm" },
Comment: { defaultMessage: "Comment" },
SendZap: { defaultMessage: "Send zap" },
ShowReplies: { defaultMessage: "Show replies" },
TooShort: { defaultMessage: "name too short" },
TooLong: { defaultMessage: "name too long" },
Regex: { defaultMessage: "name has disallowed characters" },
Registered: { defaultMessage: "name is registered" },
Disallowed: { defaultMessage: "name is blocked" },
DisalledLater: { defaultMessage: "name will be available later" },
BuyNow: { defaultMessage: "Buy Now" },
NotAvailable: { defaultMessage: "Not available:" },
Buying: { defaultMessage: "Buying {item}" },
OrderPaid: { defaultMessage: "Order Paid!" },
NewNip: { defaultMessage: "Your new NIP-05 handle is:" },
ActivateNow: { defaultMessage: "Activate Now" },
AddToProfile: { defaultMessage: "Add to Profile" },
AccountPage: { defaultMessage: "account page" },
AccountSupport: { defaultMessage: "Account Support" },
GoTo: { defaultMessage: "Go to" },
FindMore: { defaultMessage: "Find out more info about {service} at {link}" },
Cancel: { defaultMessage: "Cancel", id: '47FYwb' },
Reply: { defaultMessage: "Reply", id: '9HU8vw' },
Send: { defaultMessage: "Send", id: '9WRlF4' },
NotePlaceholder: { defaultMessage: "What's on your mind?", id: 'flnGvv' },
Back: { defaultMessage: "Back", id: 'cyR7Kh' },
Block: { defaultMessage: "Block", id: 'Up5U7K' },
Unblock: { defaultMessage: "Unblock", id: 'nDejmx' },
MuteCount: { defaultMessage: "{n} muted", id: 'VlJkSk' },
Mute: { defaultMessage: "Mute", id: 'x82IOl' },
MutedAuthor: { defaultMessage: "This author has been muted", id: 'ASRK0S' },
Others: { defaultMessage: ` & {n} {n, plural, =1 {other} other {others}}`, id: 'egib+2' },
Show: { defaultMessage: "Show", id: 'K7AkdL' },
Delete: { defaultMessage: "Delete", id: 'K3r6DQ' },
Deleted: { defaultMessage: "Deleted", id: 'KQvWvD' },
Unmute: { defaultMessage: "Unmute", id: 'W9355R' },
MuteAll: { defaultMessage: "Mute all", id: 'cWx9t8' },
BlockCount: { defaultMessage: "{n} blocked", id: 'nwZXeh' },
JustNow: { defaultMessage: "Just now", id: 'bxv59V' },
Follow: { defaultMessage: "Follow", id: 'ieGrWo' },
FollowAll: { defaultMessage: "Follow all", id: 'mKAr6h' },
Unfollow: { defaultMessage: "Unfollow", id: 'izWS4J' },
FollowerCount: { defaultMessage: "{n} followers", id: 'o7e+nJ' },
FollowingCount: { defaultMessage: "Follows {n}", id: '9SvQep' },
FollowsYou: { defaultMessage: "follows you", id: 'FmXUJg' },
Invoice: { defaultMessage: "Lightning Invoice", id: '9wO4wJ' },
PayInvoice: { defaultMessage: "Pay Invoice", id: 'lvlPhZ' },
Expired: { defaultMessage: "Expired", id: 'RahCRH' },
Pay: { defaultMessage: "Pay", id: 'lD3+8a' },
Loading: { defaultMessage: "Loading...", id: 'gjBiyj' },
Logout: { defaultMessage: "Logout", id: 'C81/uG' },
ShowMore: { defaultMessage: "Show more", id: 'aWpBzj' },
TranslateTo: { defaultMessage: "Translate to {lang}", id: 'Ebl/B2' },
TranslatedFrom: { defaultMessage: "Translated from {lang}", id: 'Cu/K85' },
TranslationFailed: { defaultMessage: "Translation failed", id: 'qmJ8kD' },
UnknownEventKind: { defaultMessage: "Unknown event kind: {kind}", id: 'KahimY' },
ConfirmDeletion: { defaultMessage: `Are you sure you want to delete {id}`, id: 'RhDAoS' },
ConfirmRepost: { defaultMessage: `Are you sure you want to repost: {id}`, id: '+D82kt' },
Reactions: { defaultMessage: "Reactions", id: 'XgWvGA' },
ReactionsCount: { defaultMessage: "Reactions ({n})", id: 'iCqGww' },
Share: { defaultMessage: "Share", id: 'OKhRC6' },
CopyID: { defaultMessage: "Copy ID", id: 'wtLjP6' },
CopyJSON: { defaultMessage: "Copy Event JSON", id: 'P61BTu' },
Dislike: { defaultMessage: "{n} Dislike", id: 'GspYR7' },
DislikeAction: { defaultMessage: "Dislike", id: '4OB335' },
Sats: { defaultMessage: `{n} {n, plural, =1 {sat} other {sats}}`, id: 'jA3OE/' },
Zapped: { defaultMessage: "zapped", id: 'B6+XJy' },
OthersZapped: { defaultMessage: `{n, plural, =0 {} =1 {zapped} other {zapped}}`, id: 'mKhgP9' },
Likes: { defaultMessage: "Likes ({n})", id: '6ewQqw' },
Zaps: { defaultMessage: "Zaps ({n})", id: 'JHEHCk' },
Dislikes: { defaultMessage: "Dislikes ({n})", id: '2k0Cv+' },
Reposts: { defaultMessage: "Reposts ({n})", id: '8/vBbP' },
NoteToSelf: { defaultMessage: "Note to Self", id: '4rYCjn' },
Read: { defaultMessage: "Read", id: 'filwqD' },
Write: { defaultMessage: "Write", id: 'k2veDA' },
Seconds: { defaultMessage: "{n} secs", id: '0yO7wF' },
Milliseconds: { defaultMessage: "{n} ms", id: '/n5KSF' },
ShowLatest: { defaultMessage: "Show latest {n} notes", id: 'DZzCem' },
LNURLFail: { defaultMessage: "Failed to load LNURL service", id: 'zonsdq' },
InvalidLNURL: { defaultMessage: "Invalid LNURL", id: '0jOEtS' },
InvoiceFail: { defaultMessage: "Failed to load invoice", id: 'CHTbO3' },
Custom: { defaultMessage: "Custom", id: 'Sjo1P4' },
Confirm: { defaultMessage: "Confirm", id: 'N2IrpM' },
Comment: { defaultMessage: "Comment", id: 'LgbKvU' },
SendZap: { defaultMessage: "Send zap", id: '5ykRmX' },
ShowReplies: { defaultMessage: "Show replies", id: 'hicxcO' },
TooShort: { defaultMessage: "name too short", id: 'B4C47Y' },
TooLong: { defaultMessage: "name too long", id: '8g2vyB' },
Regex: { defaultMessage: "name has disallowed characters", id: '0mch2Y' },
Registered: { defaultMessage: "name is registered", id: 'cuV2gK' },
Disallowed: { defaultMessage: "name is blocked", id: 'wih7iJ' },
DisalledLater: { defaultMessage: "name will be available later", id: 'HFls6j' },
BuyNow: { defaultMessage: "Buy Now", id: 'lCILNz' },
NotAvailable: { defaultMessage: "Not available:", id: 'MI2jkA' },
Buying: { defaultMessage: "Buying {item}", id: 'MzRYWH' },
OrderPaid: { defaultMessage: "Order Paid!", id: 'H6/kLh' },
NewNip: { defaultMessage: "Your new NIP-05 handle is:", id: '4L2vUY' },
ActivateNow: { defaultMessage: "Activate Now", id: 'ZKORll' },
AddToProfile: { defaultMessage: "Add to Profile", id: 'qkvYUb' },
AccountPage: { defaultMessage: "account page", id: 'lgg1KN' },
AccountSupport: { defaultMessage: "Account Support", id: '/JE/X+' },
GoTo: { defaultMessage: "Go to", id: 'xIoGG9' },
FindMore: { defaultMessage: "Find out more info about {service} at {link}", id: 'wqyN/i' },
SavePassword: {
defaultMessage: "Please make sure to save the following password in order to manage your handle in the future",
defaultMessage: "Please make sure to save the following password in order to manage your handle in the future", id: '+vIQlC',
},
Handle: { defaultMessage: "Handle" },
Pin: { defaultMessage: "Pin" },
Pinned: { defaultMessage: "Pinned" },
Bookmark: { defaultMessage: "Bookmark" },
Bookmarks: { defaultMessage: "Bookmarks" },
BookmarksCount: { defaultMessage: "Bookmarks ({n})" },
Bookmarked: { defaultMessage: "Saved" },
All: { defaultMessage: "All" },
ConfirmUnbookmark: { defaultMessage: "Are you sure you want to remove this note from bookmarks?" },
ConfirmUnpin: { defaultMessage: "Are you sure you want to unpin this note?" },
ReactionsLink: { defaultMessage: "{n} Reactions" },
ReBroadcast: { defaultMessage: "Broadcast Again" },
IrisUserNameLengthError: { defaultMessage: "Name must be between 1 and 32 characters" },
IrisUserNameFormatError: { defaultMessage: "Username must only contain lowercase letters and numbers" },
Handle: { defaultMessage: "Handle", id: 'iNWbVV' },
Pin: { defaultMessage: "Pin", id: 'puLNUJ' },
Pinned: { defaultMessage: "Pinned", id: 'fWZYP5' },
Bookmark: { defaultMessage: "Bookmark", id: 'Rs4kCE' },
Bookmarks: { defaultMessage: "Bookmarks", id: 'nGBrvw' },
BookmarksCount: { defaultMessage: "Bookmarks ({n})", id: 'GL8aXW' },
Bookmarked: { defaultMessage: "Saved", id: 'fsB/4p' },
All: { defaultMessage: "All", id: 'zQvVDJ' },
ConfirmUnbookmark: { defaultMessage: "Are you sure you want to remove this note from bookmarks?", id: '1Mo59U' },
ConfirmUnpin: { defaultMessage: "Are you sure you want to unpin this note?", id: 'IEwZvs' },
ReactionsLink: { defaultMessage: "{n} Reactions", id: 'jzgQ2z' },
ReBroadcast: { defaultMessage: "Broadcast Again", id: 'c3g2hL' },
IrisUserNameLengthError: { defaultMessage: "Name must be between 1 and 32 characters", id: '4MBtMa' },
IrisUserNameFormatError: { defaultMessage: "Username must only contain lowercase letters and numbers", id: 'RSr2uB' },
});

View File

@ -14,7 +14,7 @@ export default function useLoginHandler() {
async function doLogin(key: string, pin: (key: string) => Promise<KeyStorage>) {
const insecureMsg = formatMessage({
defaultMessage:
"Can't login with private key on an insecure connection, please use a Nostr key manager extension instead",
"Can't login with private key on an insecure connection, please use a Nostr key manager extension instead", id: 'iXPL0Z',
});
// private key logins
if (key.startsWith("nsec")) {

View File

@ -19,7 +19,7 @@ export function AboutPage() {
return (
<>
<h1>
<FormattedMessage defaultMessage="About" />
<FormattedMessage defaultMessage="About" id="g5pX+a" />
</h1>
Version: <b>{GIT_VERSION}</b>
<Markdown content={changelog} tags={[]} />

View File

@ -128,7 +128,7 @@ function NotesCol() {
<div className="deck-col-header flex">
<div className="flex f-1 g8">
<Icon name="rows-01" size={24} />
<FormattedMessage defaultMessage="Notes" />
<FormattedMessage defaultMessage="Notes" id="7+Domh" />
</div>
<div className="f-1">
<RootTabs base="/deck" />
@ -146,7 +146,7 @@ function ArticlesCol() {
<div>
<div className="deck-col-header flex g8">
<Icon name="file-06" size={24} />
<FormattedMessage defaultMessage="Articles" />
<FormattedMessage defaultMessage="Articles" id="3KNMbJ" />
</div>
<div>
<Articles />
@ -161,7 +161,7 @@ function MediaCol({ setThread }: { setThread: (e: NostrLink) => void }) {
<div>
<div className="deck-col-header flex g8">
<Icon name="camera-lens" size={24} />
<FormattedMessage defaultMessage="Media" />
<FormattedMessage defaultMessage="Media" id="hmZ3Bz" />
</div>
<div className="image-grid p">
<TimelineFollows
@ -199,7 +199,7 @@ function NotificationsCol({ setThread }: { setThread: (e: NostrLink) => void })
<div>
<div className="deck-col-header flex g8">
<Icon name="bell-02" size={24} />
<FormattedMessage defaultMessage="Notifications" />
<FormattedMessage defaultMessage="Notifications" id="NAidKb" />
</div>
<div>
<NotificationsPage onClick={setThread} />

View File

@ -9,9 +9,9 @@ export default function Discover() {
const { formatMessage } = useIntl();
// tabs
const Tabs = {
Follows: { text: formatMessage({ defaultMessage: "Suggested Follows" }), value: 0 },
Posts: { text: formatMessage({ defaultMessage: "Trending Notes" }), value: 1 },
Profiles: { text: formatMessage({ defaultMessage: "Trending People" }), value: 2 },
Follows: { text: formatMessage({ defaultMessage: "Suggested Follows", id: 'C8HhVE' }), value: 0 },
Posts: { text: formatMessage({ defaultMessage: "Trending Notes", id: 'Ix8l+B' }), value: 1 },
Profiles: { text: formatMessage({ defaultMessage: "Trending People", id: 'CVWeJ6' }), value: 2 },
};
const [tab, setTab] = useState<Tab>(Tabs.Follows);

View File

@ -87,22 +87,22 @@ const DonatePage = () => {
<div className="main-content p">
<h2>
<FormattedMessage
defaultMessage="Help fund the development of {site}"
defaultMessage="Help fund the development of {site}" id="yNBPJp"
values={{ site: CONFIG.appNameCapitalized }}
/>
</h2>
<p>
<FormattedMessage
defaultMessage="{site} is an open source project built by passionate people in their free time"
defaultMessage="{site} is an open source project built by passionate people in their free time" id="6TfgXX"
values={{ site: CONFIG.appNameCapitalized }}
/>
</p>
<p>
<FormattedMessage defaultMessage="Your donations are greatly appreciated" />
<FormattedMessage defaultMessage="Your donations are greatly appreciated" id="nn1qb3" />
</p>
<p>
<FormattedMessage
defaultMessage={"Check out the code here: {link}"}
defaultMessage="Check out the code here: {link}" id="u4bHcR"
values={{
link: (
<a className="highlight" href="https://git.v0l.io/Kieran/snort" rel="noreferrer" target="_blank">
@ -113,20 +113,20 @@ const DonatePage = () => {
/>
</p>
<p>
<FormattedMessage defaultMessage="Each contributor will get paid a percentage of all donations and NIP-05 orders, you can see the split amounts below" />
<FormattedMessage defaultMessage="Each contributor will get paid a percentage of all donations and NIP-05 orders, you can see the split amounts below" id="mH91FY" />
</p>
<div className="flex flex-col g12">
<div className="b br p">
<div className="flex justify-between">
<FormattedMessage defaultMessage="Lightning Donation" />
<FormattedMessage defaultMessage="Lightning Donation" id="C1LjMx" />
<ZapButton pubkey={bech32ToHex(SnortPubKey)} lnurl={DonateLNURL}>
<FormattedMessage defaultMessage="Donate" />
<FormattedMessage defaultMessage="Donate" id="2IFGap" />
</ZapButton>
</div>
{today && (
<small>
<FormattedMessage
defaultMessage="Total today (UTC): {amount} sats"
defaultMessage="Total today (UTC): {amount} sats" id="P7nJT9"
values={{ amount: today.donations.toLocaleString() }}
/>
</small>
@ -134,9 +134,9 @@ const DonatePage = () => {
</div>
<div className="b br p">
<div className="flex justify-between">
<FormattedMessage defaultMessage="On-chain Donation" />
<FormattedMessage defaultMessage="On-chain Donation" id="fqwcJ1" />
<AsyncButton type="button" onClick={getOnChainAddress}>
<FormattedMessage defaultMessage="Get Address" />
<FormattedMessage defaultMessage="Get Address" id="bLZL5a" />
</AsyncButton>
</div>
</div>
@ -145,7 +145,7 @@ const DonatePage = () => {
<Modal onClose={() => setOnChain("")} id="donate-on-chain">
<div className="flex flex-col items-center g12">
<h2>
<FormattedMessage defaultMessage="On-chain Donation Address" />
<FormattedMessage defaultMessage="On-chain Donation Address" id="EjFyoR" />
</h2>
<QrCode data={onChain} link={`bitcoin:${onChain}`} />
<Copy text={onChain} />
@ -153,19 +153,19 @@ const DonatePage = () => {
</Modal>
)}
<h3>
<FormattedMessage defaultMessage="Primary Developers" />
<FormattedMessage defaultMessage="Primary Developers" id="4IPzdn" />
</h3>
{DeveloperAccounts.map(a => (
<ProfilePreview pubkey={a} key={a} actions={actions(a)} />
))}
<h4>
<FormattedMessage defaultMessage="Contributors" />
<FormattedMessage defaultMessage="Contributors" id="ZLmyG9" />
</h4>
{Contributors.map(a => (
<ProfilePreview pubkey={a} key={a} actions={actions(a)} />
))}
<h4>
<FormattedMessage defaultMessage="Translators" />
<FormattedMessage defaultMessage="Translators" id="3gOsZq" />
</h4>
{Translators.map(a => (
<ProfilePreview pubkey={a} key={a} actions={actions(a)} />

View File

@ -10,7 +10,7 @@ const ErrorPage = () => {
return (
<div className="main-content page">
<h4>
<FormattedMessage defaultMessage="An error has occured!" id="error.title" />
<FormattedMessage defaultMessage="An error has occured!" id="FfYsOb" />
</h4>
<AsyncButton
onClick={async () => {
@ -18,7 +18,7 @@ const ErrorPage = () => {
globalThis.localStorage.clear();
globalThis.location.href = "/";
}}>
<FormattedMessage defaultMessage="Clear cache and reload" id="error.clear-cache" />
<FormattedMessage defaultMessage="Clear cache and reload" id="HWbkEK" />
</AsyncButton>
{
<pre>

View File

@ -7,7 +7,7 @@ export default function FreeNostrAddressPage() {
return (
<div className="main-content p">
<h2>
<FormattedMessage defaultMessage="Get a free nostr address" />
<FormattedMessage defaultMessage="Get a free nostr address" id="OQSOJF" />
</h2>
<p>
<FormattedMessage {...messages.Nip05} />

View File

@ -71,7 +71,7 @@ export function HashTagHeader({ tag, events, className }: { tag: string; events?
{events && (
<small>
<FormattedMessage
defaultMessage="{n} notes"
defaultMessage="{n} notes" id="un1nGw"
values={{
n: formatShort(events),
}}
@ -81,11 +81,11 @@ export function HashTagHeader({ tag, events, className }: { tag: string; events?
</div>
{isFollowing ? (
<AsyncButton className="secondary" onClick={() => followTags(login.tags.item.filter(t => t !== tag))}>
<FormattedMessage defaultMessage="Unfollow" />
<FormattedMessage defaultMessage="Unfollow" id="izWS4J" />
</AsyncButton>
) : (
<AsyncButton onClick={() => followTags(login.tags.item.concat([tag]))}>
<FormattedMessage defaultMessage="Follow" />
<FormattedMessage defaultMessage="Follow" id="ieGrWo" />
</AsyncButton>
)}
</div>

View File

@ -8,11 +8,11 @@ export default function HelpPage() {
return (
<>
<h2>
<FormattedMessage defaultMessage="NIP-05" />
<FormattedMessage defaultMessage="NIP-05" id="7hp70g" />
</h2>
<p>
<FormattedMessage
defaultMessage="If you have an enquiry about your NIP-05 order please DM {link}"
defaultMessage="If you have an enquiry about your NIP-05 order please DM {link}" id="c35bj2"
values={{
link: (
<Link

View File

@ -151,7 +151,7 @@ const AccountHeader = () => {
if (!publicKey) {
return (
<button type="button" onClick={() => navigate("/login/sign-up")}>
<FormattedMessage defaultMessage="Sign Up" />
<FormattedMessage defaultMessage="Sign Up" id="39AHJm" />
</button>
);
}

View File

@ -17,7 +17,7 @@ export function ListFeedPage() {
if (data.kind !== EventKind.ContactList && data.kind !== EventKind.CategorizedPeople) {
return (
<b>
<FormattedMessage defaultMessage="Must be a contact list or pubkey list" />
<FormattedMessage defaultMessage="Must be a contact list or pubkey list" id="vB3oQ/" />
</b>
);
}

View File

@ -68,7 +68,7 @@ export default function MessagesPage() {
{cx.participants.map(v => (
<ProfileImage pubkey={v.id} link="" showUsername={false} profile={v.profile} />
))}
{cx.title ?? <FormattedMessage defaultMessage="Group Chat" />}
{cx.title ?? <FormattedMessage defaultMessage="Group Chat" id="eXT2QQ" />}
</div>
);
}
@ -88,7 +88,7 @@ export default function MessagesPage() {
{conversationIdent(cx)}
<div className="nowrap">
<small>
<NoteTime from={cx.lastMessage * 1000} fallback={formatMessage({ defaultMessage: "Just now" })} />
<NoteTime from={cx.lastMessage * 1000} fallback={formatMessage({ defaultMessage: "Just now", id: 'bxv59V' })} />
</small>
{cx.unread > 0 && <UnreadCount unread={cx.unread} />}
</div>
@ -102,7 +102,7 @@ export default function MessagesPage() {
<div className="chat-list">
<div className="flex items-center p justify-between">
<button disabled={unreadCount <= 0} type="button">
<FormattedMessage defaultMessage="Mark all read" />
<FormattedMessage defaultMessage="Mark all read" id="ShdEie" />
</button>
<NewChatWindow />
</div>
@ -161,7 +161,7 @@ function ProfileDmActions({ id }: { id: string }) {
<div className="settings-row" onClick={() => (blocked ? unblock(pubkey) : block(pubkey))}>
<Icon name="block" />
{blocked ? <FormattedMessage defaultMessage="Unblock" /> : <FormattedMessage defaultMessage="Block" />}
{blocked ? <FormattedMessage defaultMessage="Unblock" id="nDejmx" /> : <FormattedMessage defaultMessage="Block" id="Up5U7K" />}
</div>
</>
);
@ -215,15 +215,15 @@ function NewChatWindow() {
<div className="flex flex-col g16">
<div className="flex justify-between">
<h2>
<FormattedMessage defaultMessage="New Chat" />
<FormattedMessage defaultMessage="New Chat" id="UT7Nkj" />
</h2>
<button onClick={startChat}>
<FormattedMessage defaultMessage="Start chat" />
<FormattedMessage defaultMessage="Start chat" id="v8lolG" />
</button>
</div>
<div className="flex flex-col g8">
<h3>
<FormattedMessage defaultMessage="Search users" />
<FormattedMessage defaultMessage="Search users" id="JjGgXI" />
</h3>
<input
type="text"
@ -245,7 +245,7 @@ function NewChatWindow() {
</div>
<div>
<p>
<FormattedMessage defaultMessage="People you follow" />
<FormattedMessage defaultMessage="People you follow" id="R81upa" />
</p>
<div className="user-list flex flex-col g2">
{results.map(a => {

View File

@ -26,7 +26,7 @@ export default function NostrAddressPage() {
return (
<div className="main-content p">
<h2>
<FormattedMessage defaultMessage="Buy nostr address" />
<FormattedMessage defaultMessage="Buy nostr address" id="MuVeKe" />
</h2>
<p>
<FormattedMessage {...messages.Nip05} />

View File

@ -61,7 +61,7 @@ export default function NostrLinkHandler() {
<Spinner width={50} height={50} />
) : (
<b className="error">
<FormattedMessage defaultMessage="Nothing found :/" />
<FormattedMessage defaultMessage="Nothing found :/" id="oJ+JJN" />
</b>
)}
</div>

View File

@ -105,7 +105,7 @@ export default function NotificationsPage({ onClick }: { onClick?: (link: NostrL
<div className="main-content p flex g12 items-center">
<Icon name="bell" />
<h3 className="my-0">
<FormattedMessage defaultMessage="Notifications" />
<FormattedMessage defaultMessage="Notifications" id="NAidKb" />
</h3>
</div>
<div className="main-content">
@ -152,11 +152,11 @@ function NotificationSummary({ evs }: { evs: Array<TaggedNostrEvent> }) {
const periodTabs = [
{
value: NotificationSummaryPeriod.Daily,
text: <FormattedMessage defaultMessage="Daily" />,
text: <FormattedMessage defaultMessage="Daily" id="zxvhnE" />,
},
{
value: NotificationSummaryPeriod.Weekly,
text: <FormattedMessage defaultMessage="Weekly" />,
text: <FormattedMessage defaultMessage="Weekly" id="/clOBU" />,
},
] as Array<Tab>;
@ -225,7 +225,7 @@ function NotificationSummary({ evs }: { evs: Array<TaggedNostrEvent> }) {
<div className="flex flex-col g12 p bb">
<div className="flex justify-between">
<h2>
<FormattedMessage defaultMessage="Summary" description="Notifications summary" />
<FormattedMessage defaultMessage="Summary" id="PJeJFc" description="Notifications summary" />
</h2>
<div className="flex items-center g8">
{filterIcon(NotificationSummaryFilter.Reactions, "heart-solid", "text-heart")}
@ -333,7 +333,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.Reaction: {
return (
<FormattedMessage
defaultMessage={"{n,plural,=0{{name} liked} other{{name} & {n} others liked}}"}
defaultMessage="{n,plural,=0{{name} liked} other{{name} & {n} others liked}}" id="kuPHYE"
values={{
n,
name,
@ -344,7 +344,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.Repost: {
return (
<FormattedMessage
defaultMessage={"{n,plural,=0{{name} reposted} other{{name} & {n} others reposted}}"}
defaultMessage="{n,plural,=0{{name} reposted} other{{name} & {n} others reposted}}" id="kJYo0u"
values={{
n,
name,
@ -355,7 +355,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.ZapReceipt: {
return (
<FormattedMessage
defaultMessage={"{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}"}
defaultMessage="{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}" id="Lw+I+J"
values={{
n,
name,
@ -388,7 +388,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
showUsername={kind === EventKind.TextNote}
pubkey={v}
size={40}
overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon" }) : undefined}
overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' }) : undefined}
/>
))}
</div>
@ -397,7 +397,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
{actionName(
pubkeys.length - 1,
firstPubkey === "anon"
? formatMessage({ defaultMessage: "Anon" })
? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' })
: getDisplayName(firstPubkeyProfile, firstPubkey),
)}
</div>

View File

@ -70,7 +70,7 @@ const ProfileTab = {
text: (
<>
<Icon name="pencil" size={16} />
<FormattedMessage defaultMessage="Notes" />
<FormattedMessage defaultMessage="Notes" id="7+Domh" />
</>
),
value: ProfileTabType.NOTES,
@ -79,7 +79,7 @@ const ProfileTab = {
text: (
<>
<Icon name="reaction" size={16} />
<FormattedMessage defaultMessage="Reactions" />
<FormattedMessage defaultMessage="Reactions" id="XgWvGA" />
</>
),
value: ProfileTabType.REACTIONS,
@ -88,7 +88,7 @@ const ProfileTab = {
text: (
<>
<Icon name="user-v2" size={16} />
<FormattedMessage defaultMessage="Followers" />
<FormattedMessage defaultMessage="Followers" id="pzTOmv" />
</>
),
value: ProfileTabType.FOLLOWERS,
@ -97,7 +97,7 @@ const ProfileTab = {
text: (
<>
<Icon name="stars" size={16} />
<FormattedMessage defaultMessage="Follows" />
<FormattedMessage defaultMessage="Follows" id="IKKHqV" />
</>
),
value: ProfileTabType.FOLLOWS,
@ -106,7 +106,7 @@ const ProfileTab = {
text: (
<>
<Icon name="zap-solid" size={16} />
<FormattedMessage defaultMessage="Zaps" />
<FormattedMessage defaultMessage="Zaps" id="OEW7yJ" />
</>
),
value: ProfileTabType.ZAPS,
@ -115,7 +115,7 @@ const ProfileTab = {
text: (
<>
<Icon name="mute" size={16} />
<FormattedMessage defaultMessage="Muted" />
<FormattedMessage defaultMessage="Muted" id="HOzFdo" />
</>
),
value: ProfileTabType.MUTED,
@ -124,7 +124,7 @@ const ProfileTab = {
text: (
<>
<Icon name="block" size={16} />
<FormattedMessage defaultMessage="Blocked" />
<FormattedMessage defaultMessage="Blocked" id="qUJTsT" />
</>
),
value: ProfileTabType.BLOCKED,
@ -133,7 +133,7 @@ const ProfileTab = {
text: (
<>
<Icon name="wifi" size={16} />
<FormattedMessage defaultMessage="Relays" />
<FormattedMessage defaultMessage="Relays" id="RoOyAh" />
</>
),
value: ProfileTabType.RELAYS,
@ -142,7 +142,7 @@ const ProfileTab = {
text: (
<>
<Icon name="bookmark-solid" size={16} />
<FormattedMessage defaultMessage="Bookmarks" />
<FormattedMessage defaultMessage="Bookmarks" id="nGBrvw" />
</>
),
value: ProfileTabType.BOOKMARKS,

View File

@ -75,7 +75,7 @@ export const GlobalTab = () => {
return (
<div className="flex items-center g8 justify-end nowrap">
<h3>
<FormattedMessage defaultMessage="Relay" description="Label for reading global feed from specific relays" />
<FormattedMessage defaultMessage="Relay" id="KHK8B9" description="Label for reading global feed from specific relays" />
</h3>
<select
className="f-ellipsis"

View File

@ -20,8 +20,8 @@ const SearchPage = () => {
const [sortPopular, setSortPopular] = useState<boolean>(true);
// tabs
const SearchTab = [
{ text: formatMessage({ defaultMessage: "Notes" }), value: NOTES },
{ text: formatMessage({ defaultMessage: "People" }), value: PROFILES },
{ text: formatMessage({ defaultMessage: "Notes", id: '7+Domh' }), value: NOTES },
{ text: formatMessage({ defaultMessage: "People", id: 'Tpy00S' }), value: PROFILES },
];
const [tab, setTab] = useState<Tab>(SearchTab[0]);
@ -73,13 +73,13 @@ const SearchPage = () => {
if (tab.value != PROFILES) return null;
return (
<div className="flex items-center justify-end g8">
<FormattedMessage defaultMessage="Sort" description="Label for sorting options for people search" />
<FormattedMessage defaultMessage="Sort" id="RwFaYs" description="Label for sorting options for people search" />
<select onChange={e => setSortPopular(e.target.value == "true")} value={sortPopular ? "true" : "false"}>
<option value={"true"}>
<FormattedMessage defaultMessage="Popular" description="Sort order name" />
<FormattedMessage defaultMessage="Popular" id="mTJFgF" description="Sort order name" />
</option>
<option value={"false"}>
<FormattedMessage defaultMessage="Recent" description="Sort order name" />
<FormattedMessage defaultMessage="Recent" id="RjpoYG" description="Sort order name" />
</option>
</select>
</div>
@ -90,12 +90,12 @@ const SearchPage = () => {
<div className="main-content">
<div className="p flex flex-col g8">
<h2>
<FormattedMessage defaultMessage="Search" />
<FormattedMessage defaultMessage="Search" id="xmcVZ0" />
</h2>
<input
type="text"
className="w-max"
placeholder={formatMessage({ defaultMessage: "Search..." })}
placeholder={formatMessage({ defaultMessage: "Search...", id: '0BUTMv' })}
value={search}
onChange={e => setSearch(e.target.value)}
autoFocus={true}

View File

@ -41,7 +41,7 @@ export default function WalletPage() {
if (e instanceof Error) {
setError((e as Error).message);
} else {
setError(formatMessage({ defaultMessage: "Unknown error" }));
setError(formatMessage({ defaultMessage: "Unknown error", id: 'qDwvZ4' }));
}
}
}
@ -83,14 +83,14 @@ export default function WalletPage() {
return (
<>
<h3>
<FormattedMessage defaultMessage="Enter wallet password" />
<FormattedMessage defaultMessage="Enter wallet password" id="r5srDR" />
</h3>
<div className="flex w-max">
<div className="grow mr10">
<input
type="password"
placeholder={formatMessage({
defaultMessage: "Wallet password",
defaultMessage: "Wallet password", id: 'MP54GY',
description: "Wallet password input placeholder",
})}
className="w-max"
@ -99,7 +99,7 @@ export default function WalletPage() {
/>
</div>
<AsyncButton onClick={() => loginWallet(unwrap(walletPassword))} disabled={(walletPassword?.length ?? 0) < 8}>
<FormattedMessage defaultMessage="Unlock" description="Unlock wallet" />
<FormattedMessage defaultMessage="Unlock" id="xQtL3v" description="Unlock wallet" />
</AsyncButton>
</div>
</>
@ -110,14 +110,14 @@ export default function WalletPage() {
if (walletState.configs.length === 0) {
return (
<button onClick={() => navigate("/settings/wallet")}>
<FormattedMessage defaultMessage="Connect Wallet" />
<FormattedMessage defaultMessage="Connect Wallet" id="cg1VJ2" />
</button>
);
}
return (
<div className="flex w-max">
<h4 className="f-1">
<FormattedMessage defaultMessage="Select Wallet" />
<FormattedMessage defaultMessage="Select Wallet" id="G1BGCg" />
</h4>
<div className="f-1">
<select className="w-max" onChange={e => Wallets.switch(e.target.value)} value={walletState.config?.id}>
@ -136,12 +136,12 @@ export default function WalletPage() {
return (
<>
<h3>
<FormattedMessage defaultMessage="History" description="Wallet transation history" />
<FormattedMessage defaultMessage="History" id="d6CyG5" description="Wallet transation history" />
</h3>
{history?.map(a => (
<div className="card flex wallet-history-item" key={a.timestamp}>
<div className="grow flex-col">
<NoteTime from={a.timestamp * 1000} fallback={formatMessage({ defaultMessage: "now" })} />
<NoteTime from={a.timestamp * 1000} fallback={formatMessage({ defaultMessage: "now", id: 'kaaf1E' })} />
<div>{(a.memo ?? "").length === 0 ? <>&nbsp;</> : a.memo}</div>
</div>
<div
@ -159,7 +159,7 @@ export default function WalletPage() {
})()}`}>
{stateIcon(a.state)}
<FormattedMessage
defaultMessage="{amount} sats"
defaultMessage="{amount} sats" id="vrTOHJ"
values={{
amount: <FormattedNumber value={a.amount / 1e3} />,
}}
@ -176,7 +176,7 @@ export default function WalletPage() {
return (
<small>
<FormattedMessage
defaultMessage="Balance: {amount} sats"
defaultMessage="Balance: {amount} sats" id="VN0+Fz"
values={{
amount: <FormattedNumber value={balance ?? 0} />,
}}

View File

@ -43,7 +43,7 @@ function ZapTarget({ target }: { target: ZapPoolRecipient }) {
<div>
<div>
<FormattedNumber value={target.split} />% (
<FormattedMessage defaultMessage="{n} sats" values={{ n: defaultZapMount }} />)
<FormattedMessage defaultMessage="{n} sats" id="CsCUYo" values={{ n: defaultZapMount }} />)
</div>
<input
type="range"
@ -59,7 +59,7 @@ function ZapTarget({ target }: { target: ZapPoolRecipient }) {
/>
</div>
) : (
<FormattedMessage defaultMessage="No lightning address" />
<FormattedMessage defaultMessage="No lightning address" id="JPFYIM" />
)
}
/>
@ -93,17 +93,17 @@ export default function ZapPoolPage() {
return (
<div className="zap-pool main-content p">
<h1>
<FormattedMessage defaultMessage="Zap Pool" />
<FormattedMessage defaultMessage="Zap Pool" id="i/dBAR" />
</h1>
<p>
<FormattedMessage defaultMessage="Fund the services that you use by splitting a portion of all your zaps into a pool of funds!" />
<FormattedMessage defaultMessage="Fund the services that you use by splitting a portion of all your zaps into a pool of funds!" id="x/Fx2P" />
</p>
<p>
<FormattedMessage defaultMessage="Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)" />
<FormattedMessage defaultMessage="Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)" id="QWhotP" />
</p>
<p>
<FormattedMessage
defaultMessage="Your default zap amount is {number} sats, example values are calculated from this."
defaultMessage="Your default zap amount is {number} sats, example values are calculated from this." id="Xopqkl"
values={{
number: (
<b>
@ -115,7 +115,7 @@ export default function ZapPoolPage() {
</p>
<p>
<FormattedMessage
defaultMessage="A single zap of {nIn} sats will allocate {nOut} sats to the zap pool."
defaultMessage="A single zap of {nIn} sats will allocate {nOut} sats to the zap pool." id="eSzf2G"
values={{
nIn: (
<b>
@ -134,7 +134,7 @@ export default function ZapPoolPage() {
</p>
<p>
<FormattedMessage
defaultMessage="You currently have {number} sats in your zap pool."
defaultMessage="You currently have {number} sats in your zap pool." id="Qxv0B2"
values={{
number: (
<b>
@ -147,7 +147,7 @@ export default function ZapPoolPage() {
<p>
{wallet && (
<AsyncButton onClick={() => ZapPoolController?.payout(wallet)}>
<FormattedMessage defaultMessage="Payout Now" />
<FormattedMessage defaultMessage="Payout Now" id="+PzQ9Y" />
</AsyncButton>
)}
</p>
@ -164,7 +164,7 @@ export default function ZapPoolPage() {
/>
</div>
<h3>
<FormattedMessage defaultMessage="Relays" />
<FormattedMessage defaultMessage="Relays" id="RoOyAh" />
</h3>
{relayConnections.map(a => (
<div>
@ -182,7 +182,7 @@ export default function ZapPoolPage() {
</div>
))}
<h3>
<FormattedMessage defaultMessage="File hosts" />
<FormattedMessage defaultMessage="File hosts" id="XICsE8" />
</h3>
{UploaderServices.map(a => (
<div>
@ -200,7 +200,7 @@ export default function ZapPoolPage() {
</div>
))}
<h3>
<FormattedMessage defaultMessage="Data Providers" />
<FormattedMessage defaultMessage="Data Providers" id="ELbg9p" />
</h3>
{DataProviders.map(a => (
<div>

View File

@ -1,45 +1,45 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Login: { defaultMessage: "Login" },
Global: { defaultMessage: "Global" },
NewUsers: { defaultMessage: "New users page" },
NoFollows: { defaultMessage: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!" },
Reactions: { defaultMessage: "Reactions" },
Followers: { defaultMessage: "Followers" },
FollowersCount: { defaultMessage: "{n} Followers" },
Follows: { defaultMessage: "Following" },
FollowsCount: { defaultMessage: "{n} Following" },
Zaps: { defaultMessage: "Zaps" },
ZapsCount: { defaultMessage: "{n} Zaps" },
Muted: { defaultMessage: "Muted" },
MutedCount: { defaultMessage: "{n} Muted" },
Blocked: { defaultMessage: "Blocked" },
BlockedCount: { defaultMessage: "{n} Blocked" },
Sats: { defaultMessage: "{n} {n, plural, =1 {sat} other {sats}}" },
Following: { defaultMessage: "Following {n}" },
Settings: { defaultMessage: "Settings" },
Messages: { defaultMessage: "Messages" },
MarkAllRead: { defaultMessage: "Mark All Read" },
GetVerified: { defaultMessage: "Get Verified" },
Nip05: { defaultMessage: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.` },
Nip05Pros: { defaultMessage: `Getting NIP-05 verified can help:` },
AvoidImpersonators: { defaultMessage: "Prevent fake accounts from imitating you" },
EasierToFind: { defaultMessage: "Make your profile easier to find and share" },
Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services" },
Login: { defaultMessage: "Login", id: 'AyGauy' },
Global: { defaultMessage: "Global", id: 'EWyQH5' },
NewUsers: { defaultMessage: "New users page", id: 'NndBJE' },
NoFollows: { defaultMessage: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!", id: 'NdOYJJ' },
Reactions: { defaultMessage: "Reactions", id: 'XgWvGA' },
Followers: { defaultMessage: "Followers", id: 'pzTOmv' },
FollowersCount: { defaultMessage: "{n} Followers", id: '3tVy+Z' },
Follows: { defaultMessage: "Following", id: 'cPIKU2' },
FollowsCount: { defaultMessage: "{n} Following", id: '1nYUGC' },
Zaps: { defaultMessage: "Zaps", id: 'OEW7yJ' },
ZapsCount: { defaultMessage: "{n} Zaps", id: 'FDguSC' },
Muted: { defaultMessage: "Muted", id: 'HOzFdo' },
MutedCount: { defaultMessage: "{n} Muted", id: 'CmZ9ls' },
Blocked: { defaultMessage: "Blocked", id: 'qUJTsT' },
BlockedCount: { defaultMessage: "{n} Blocked", id: 'W2PiAr' },
Sats: { defaultMessage: "{n} {n, plural, =1 {sat} other {sats}}", id: 'jA3OE/' },
Following: { defaultMessage: "Following {n}", id: 'lnaT9F' },
Settings: { defaultMessage: "Settings", id: 'D3idYv' },
Messages: { defaultMessage: "Messages", id: 'hMzcSq' },
MarkAllRead: { defaultMessage: "Mark All Read", id: 'e7qqly' },
GetVerified: { defaultMessage: "Get Verified", id: 'eJj8HD' },
Nip05: { defaultMessage: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.`, id: 'vZ4quW' },
Nip05Pros: { defaultMessage: `Getting NIP-05 verified can help:`, id: 'thnRpU' },
AvoidImpersonators: { defaultMessage: "Prevent fake accounts from imitating you", id: 'iGT1eE' },
EasierToFind: { defaultMessage: "Make your profile easier to find and share", id: '/d6vEc' },
Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services", id: 'a5UPxh' },
SnortSocialNip: {
defaultMessage: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`,
defaultMessage: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`, id: 'k7sKNy',
},
NostrPlebsNip: {
defaultMessage: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`,
defaultMessage: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`, id: '4Vmpt4',
},
Relays: {
defaultMessage: "Relays",
defaultMessage: "Relays", id: 'RoOyAh',
},
RelaysCount: {
defaultMessage: "{n} Relays",
defaultMessage: "{n} Relays", id: 'QDFTjG',
},
Bookmarks: { defaultMessage: "Bookmarks" },
BookmarksCount: { defaultMessage: "{n} Bookmarks" },
KeyPlaceholder: { defaultMessage: "nsec, npub, nip-05, hex" },
Bookmarks: { defaultMessage: "Bookmarks", id: 'nGBrvw' },
BookmarksCount: { defaultMessage: "{n} Bookmarks", id: '2a2YiP' },
KeyPlaceholder: { defaultMessage: "nsec, npub, nip-05, hex", id: 'B6H7eJ' },
});

View File

@ -13,7 +13,7 @@ export function Discover() {
<div className="flex flex-col g24">
<h1 className="text-center">
<FormattedMessage
defaultMessage="{site} is more fun together!"
defaultMessage="{site} is more fun together!" id="h7jvCs"
values={{
site: CONFIG.appNameCapitalized,
}}
@ -23,7 +23,7 @@ export function Discover() {
<TrendingUsers
title={
<h3>
<FormattedMessage defaultMessage="Trending Users" />
<FormattedMessage defaultMessage="Trending Users" id="FSYL8G" />
</h3>
}
/>
@ -35,7 +35,7 @@ export function Discover() {
state,
})
}>
<FormattedMessage defaultMessage="Next" />
<FormattedMessage defaultMessage="Next" id="9+Ddtu" />
</AsyncButton>
</div>
);

View File

@ -21,7 +21,7 @@ export const FixedModeration = {
canEdit: false,
},*/
nsfw: {
title: <FormattedMessage defaultMessage="NSFW" />,
title: <FormattedMessage defaultMessage="NSFW" id="w6qrwX" />,
words: [
"adult content",
"explicit",
@ -48,7 +48,7 @@ export const FixedModeration = {
canEdit: false,
},
crypto: {
title: <FormattedMessage defaultMessage="Crypto" />,
title: <FormattedMessage defaultMessage="Crypto" id="TdtZQ5" />,
words: [
"bitcoin",
"btc",
@ -76,7 +76,7 @@ export const FixedModeration = {
canEdit: false,
},
politics: {
title: <FormattedMessage defaultMessage="Politics" />,
title: <FormattedMessage defaultMessage="Politics" id="0siT4z" />,
words: [
"politics",
"election",
@ -123,17 +123,17 @@ export function Moderation() {
<div className="flex flex-col g24">
<div className="flex flex-col g8 text-center">
<h1>
<FormattedMessage defaultMessage="Clean up your feed" />
<FormattedMessage defaultMessage="Clean up your feed" id="jHa/ko" />
</h1>
<FormattedMessage defaultMessage="Your space the way you want it 😌" />
<FormattedMessage defaultMessage="Your space the way you want it 😌" id="/B8zwF" />
</div>
<div className="flex flex-col g8">
<div className="flex g8 items-center">
<small className="grow uppercase font-semibold">
<FormattedMessage defaultMessage="Lists to mute:" />
<FormattedMessage defaultMessage="Lists to mute:" id="d+6YsV" />
</small>
<span className="font-medium">
<FormattedMessage defaultMessage="Toggle all" />
<FormattedMessage defaultMessage="Toggle all" id="Dx4ey3" />
</span>
<ToggleSwitch
size={50}
@ -150,7 +150,7 @@ export function Moderation() {
<div className="font-semibold grow">{v.title}</div>
{v.canEdit && (
<div>
<FormattedMessage defaultMessage="edit" />
<FormattedMessage defaultMessage="edit" id="+vj0U3" />
</div>
)}
<ToggleSwitch
@ -163,10 +163,10 @@ export function Moderation() {
</div>
<div className="flex flex-col g8">
<span className="font-semibold">
<FormattedMessage defaultMessage="Additional Terms:" />
<FormattedMessage defaultMessage="Additional Terms:" id="xl4s/X" />
</span>
<small className="font-medium">
<FormattedMessage defaultMessage="Use commas to separate words e.g. word1, word2, word3" />
<FormattedMessage defaultMessage="Use commas to separate words e.g. word1, word2, word3" id="J2HeQ+" />
</small>
<textarea onChange={e => setExtraTerms(e.target.value)} value={extraTerms}></textarea>
</div>
@ -196,7 +196,7 @@ export function Moderation() {
}
navigate("/");
}}>
<FormattedMessage defaultMessage="Finish" />
<FormattedMessage defaultMessage="Finish" id="2O2sfp" />
</AsyncButton>
</div>
);

View File

@ -36,11 +36,11 @@ export function Profile() {
return (
<div className="flex flex-col g24 text-center">
<h1>
<FormattedMessage defaultMessage="Profile Image" />
<FormattedMessage defaultMessage="Profile Image" id="vN5UH8" />
</h1>
<AvatarEditor picture={picture} onPictureChange={p => setPicture(p)} />
<AsyncButton className="primary" onClick={() => makeRandomKey()}>
<FormattedMessage defaultMessage="Next" />
<FormattedMessage defaultMessage="Next" id="9+Ddtu" />
</AsyncButton>
{error && <b className="error">{error}</b>}
</div>

View File

@ -43,7 +43,7 @@ export function SignIn() {
} else {
setError(
formatMessage({
defaultMessage: "Unknown login error",
defaultMessage: "Unknown login error", id: 'OLEm6z',
}),
);
}
@ -57,9 +57,9 @@ export function SignIn() {
<img src={CONFIG.appleTouchIconUrl} width={48} height={48} className="br mr-auto ml-auto" />
<div className="flex flex-col g16 items-center">
<h1>
<FormattedMessage defaultMessage="Sign In" />
<FormattedMessage defaultMessage="Sign In" id="Ub+AGc" />
</h1>
{nip7Login && <FormattedMessage defaultMessage="Use a nostr signer extension to sign in" />}
{nip7Login && <FormattedMessage defaultMessage="Use a nostr signer extension to sign in" id="eF0Re7" />}
</div>
<div className={classNames("flex flex-col g16", { "items-center": nip7Login })}>
{hasNip7 && !useKey && (
@ -68,13 +68,13 @@ export function SignIn() {
<div className="circle bg-warning p12 text-white">
<Icon name="key" />
</div>
<FormattedMessage defaultMessage="Sign in with Nostr Extension" />
<FormattedMessage defaultMessage="Sign in with Nostr Extension" id="TaeBqw" />
</AsyncButton>
<Link to="" className="highlight">
<FormattedMessage defaultMessage="Supported Extensions" />
<FormattedMessage defaultMessage="Supported Extensions" id="aMaLBK" />
</Link>
<AsyncButton onClick={() => setUseKey(true)}>
<FormattedMessage defaultMessage="Sign in with key" />
<FormattedMessage defaultMessage="Sign in with key" id="X6tipZ" />
</AsyncButton>
</>
)}
@ -83,7 +83,7 @@ export function SignIn() {
<input
type="text"
placeholder={formatMessage({
defaultMessage: "nsec, npub, nip-05, hex, mnemonic",
defaultMessage: "nsec, npub, nip-05, hex, mnemonic", id: 'X7xU8J',
})}
value={key}
onChange={e => setKey(e.target.value)}
@ -91,15 +91,15 @@ export function SignIn() {
/>
{error && <b className="error">{error}</b>}
<AsyncButton onClick={doLogin} className="primary">
<FormattedMessage defaultMessage="Login" />
<FormattedMessage defaultMessage="Login" id="AyGauy" />
</AsyncButton>
</>
)}
</div>
<div className="flex flex-col g16 items-center">
<FormattedMessage defaultMessage="Don't have an account?" />
<FormattedMessage defaultMessage="Don't have an account?" id="25WwxF" />
<AsyncButton className="secondary" onClick={() => navigate("/login/sign-up")}>
<FormattedMessage defaultMessage="Sign Up" />
<FormattedMessage defaultMessage="Sign Up" id="39AHJm" />
</AsyncButton>
</div>
</div>
@ -116,16 +116,16 @@ export function SignUp() {
<img src={CONFIG.appleTouchIconUrl} width={48} height={48} className="br mr-auto ml-auto" />
<div className="flex flex-col g16 items-center">
<h1>
<FormattedMessage defaultMessage="Sign Up" />
<FormattedMessage defaultMessage="Sign Up" id="39AHJm" />
</h1>
<FormattedMessage defaultMessage="What should we call you?" />
<FormattedMessage defaultMessage="What should we call you?" id="SmuYUd" />
</div>
<div className="flex flex-col g16">
<input
type="text"
autoFocus={true}
placeholder={formatMessage({
defaultMessage: "Name or nym",
defaultMessage: "Name or nym", id: 'aHje0o',
})}
value={name}
onChange={e => setName(e.target.value)}
@ -141,13 +141,13 @@ export function SignUp() {
} as NewUserState,
})
}>
<FormattedMessage defaultMessage="Next" />
<FormattedMessage defaultMessage="Next" id="9+Ddtu" />
</AsyncButton>
</div>
<div className="flex flex-col g16 items-center">
<FormattedMessage defaultMessage="Already have an account?" />
<FormattedMessage defaultMessage="Already have an account?" id="uCk8r+" />
<AsyncButton className="secondary" onClick={() => navigate("/login")}>
<FormattedMessage defaultMessage="Sign In" />
<FormattedMessage defaultMessage="Sign In" id="Ub+AGc" />
</AsyncButton>
</div>
</div>

View File

@ -9,7 +9,7 @@ import { NostrHashtagLink } from "@snort/system";
export const FixedTopics = {
life: {
text: <FormattedMessage defaultMessage="Life" />,
text: <FormattedMessage defaultMessage="Life" id="4MjsHk" />,
tags: [
"life",
"lifestyle",
@ -44,7 +44,7 @@ export const FixedTopics = {
],
},
science: {
text: <FormattedMessage defaultMessage="Science" />,
text: <FormattedMessage defaultMessage="Science" id="qydxOd" />,
tags: [
"science",
"research",
@ -79,7 +79,7 @@ export const FixedTopics = {
],
},
nature: {
text: <FormattedMessage defaultMessage="Nature" />,
text: <FormattedMessage defaultMessage="Nature" id="1ozeyg" />,
tags: [
"nature",
"wildlife",
@ -114,7 +114,7 @@ export const FixedTopics = {
],
},
business: {
text: <FormattedMessage defaultMessage="Business" />,
text: <FormattedMessage defaultMessage="Business" id="w1Fanr" />,
tags: [
"business",
"entrepreneurship",
@ -149,7 +149,7 @@ export const FixedTopics = {
],
},
game: {
text: <FormattedMessage defaultMessage="Game" />,
text: <FormattedMessage defaultMessage="Game" id="Am8glJ" />,
tags: [
"gaming",
"videogames",
@ -184,7 +184,7 @@ export const FixedTopics = {
],
},
sport: {
text: <FormattedMessage defaultMessage="Sport" />,
text: <FormattedMessage defaultMessage="Sport" id="JIVWWA" />,
tags: [
"sports",
"athletics",
@ -219,7 +219,7 @@ export const FixedTopics = {
],
},
photography: {
text: <FormattedMessage defaultMessage="Photography" />,
text: <FormattedMessage defaultMessage="Photography" id="cHCwbF" />,
tags: [
"photography",
"landscape",
@ -274,7 +274,7 @@ export function Topics() {
return (
<div className="flex flex-col g24 text-center">
<h1>
<FormattedMessage defaultMessage="Pick a few topics of interest" />
<FormattedMessage defaultMessage="Pick a few topics of interest" id="fX5RYm" />
</h1>
<div className="tabs flex-wrap justify-center">{Object.entries(FixedTopics).map(([k, v]) => tab(k, v.text))}</div>
<AsyncButton
@ -294,7 +294,7 @@ export function Topics() {
}
navigate("/login/sign-up/discover");
}}>
<FormattedMessage defaultMessage="Next" />
<FormattedMessage defaultMessage="Next" id="9+Ddtu" />
</AsyncButton>
</div>
);

View File

@ -12,7 +12,7 @@ export default function AccountsPage() {
return (
<div className="flex flex-col g12">
<h3>
<FormattedMessage defaultMessage="Logins" />
<FormattedMessage defaultMessage="Logins" id="+vA//S" />
</h3>
{logins.map(a => (
<div className="card flex" key={a.id}>
@ -24,10 +24,10 @@ export default function AccountsPage() {
actions={
<div className="f-1">
<button className="mb10" onClick={() => LoginStore.switchAccount(a.id)}>
<FormattedMessage defaultMessage="Switch" />
<FormattedMessage defaultMessage="Switch" id="n1Whvj" />
</button>
<button onClick={() => LoginStore.removeSession(a.id)}>
<FormattedMessage defaultMessage="Logout" />
<FormattedMessage defaultMessage="Logout" id="C81/uG" />
</button>
</div>
}
@ -38,7 +38,7 @@ export default function AccountsPage() {
{sub && (
<Link to={"/login"}>
<button type="button">
<FormattedMessage defaultMessage="Add Account" />
<FormattedMessage defaultMessage="Add Account" id="F3l7xL" />
</button>
</Link>
)}

View File

@ -18,17 +18,17 @@ export function CacheSettings() {
return (
<div className="flex flex-col g8">
<h3>
<FormattedMessage defaultMessage="Cache" />
<FormattedMessage defaultMessage="Cache" id="DBiVK1" />
</h3>
<CacheDetails cache={UserCache} name={<FormattedMessage defaultMessage="Profiles" />} />
<CacheDetails cache={UserRelays} name={<FormattedMessage defaultMessage="Relay Lists" />} />
<CacheDetails cache={Notifications} name={<FormattedMessage defaultMessage="Notifications" />} />
<CacheDetails cache={FollowsFeed} name={<FormattedMessage defaultMessage="Follows Feed" />} />
<CacheDetails cache={Chats} name={<FormattedMessage defaultMessage="Chats" />} />
<CacheDetails cache={RelayMetrics} name={<FormattedMessage defaultMessage="Relay Metrics" />} />
<CacheDetails cache={PaymentsCache} name={<FormattedMessage defaultMessage="Payments" />} />
<CacheDetails cache={InteractionCache} name={<FormattedMessage defaultMessage="Interactions" />} />
<CacheDetails cache={GiftsCache} name={<FormattedMessage defaultMessage="Gift Wraps" />} />
<CacheDetails cache={UserCache} name={<FormattedMessage defaultMessage="Profiles" id="2zJXeA" />} />
<CacheDetails cache={UserRelays} name={<FormattedMessage defaultMessage="Relay Lists" id="tGXF0Q" />} />
<CacheDetails cache={Notifications} name={<FormattedMessage defaultMessage="Notifications" id="NAidKb" />} />
<CacheDetails cache={FollowsFeed} name={<FormattedMessage defaultMessage="Follows Feed" id="uKqSN+" />} />
<CacheDetails cache={Chats} name={<FormattedMessage defaultMessage="Chats" id="ABAQyo" />} />
<CacheDetails cache={RelayMetrics} name={<FormattedMessage defaultMessage="Relay Metrics" id="tjpYlr" />} />
<CacheDetails cache={PaymentsCache} name={<FormattedMessage defaultMessage="Payments" id="iYc3Ld" />} />
<CacheDetails cache={InteractionCache} name={<FormattedMessage defaultMessage="Interactions" id="u+LyXc" />} />
<CacheDetails cache={GiftsCache} name={<FormattedMessage defaultMessage="Gift Wraps" id="fjAcWo" />} />
</div>
);
}
@ -45,7 +45,7 @@ function CacheDetails<T>({ cache, name }: { cache: FeedCache<T>; name: ReactNode
{name}
<small>
<FormattedMessage
defaultMessage="{count} ({count2} in memory)"
defaultMessage="{count} ({count2} in memory)" id="geppt8"
values={{
count: <FormattedNumber value={cache.keysOnTable().length} />,
count2: <FormattedNumber value={snapshot.length} />,
@ -55,7 +55,7 @@ function CacheDetails<T>({ cache, name }: { cache: FeedCache<T>; name: ReactNode
</div>
<div>
<AsyncButton onClick={() => cache.clear()}>
<FormattedMessage defaultMessage="Clear" />
<FormattedMessage defaultMessage="Clear" id="/GCoTA" />
</AsyncButton>
</div>
</div>

View File

@ -12,14 +12,14 @@ export default function ExportKeys() {
return (
<div className="flex flex-col g12">
<h2>
<FormattedMessage defaultMessage="Public Key" />
<FormattedMessage defaultMessage="Public Key" id="bep9C3" />
</h2>
<Copy text={hexToBech32("npub", publicKey ?? "")} className="dashed" />
<Copy text={encodeTLV(NostrPrefix.Profile, publicKey ?? "")} className="dashed" />
{privateKeyData instanceof KeyStorage && (
<>
<h2>
<FormattedMessage defaultMessage="Private Key" />
<FormattedMessage defaultMessage="Private Key" id="JymXbw" />
</h2>
<Copy text={hexToBech32("nsec", privateKeyData.value)} className="dashed" />
</>
@ -27,7 +27,7 @@ export default function ExportKeys() {
{generatedEntropy && (
<>
<h2>
<FormattedMessage defaultMessage="Mnemonic" />
<FormattedMessage defaultMessage="Mnemonic" id="b12Goz" />
</h2>
<div className="mnemonic-grid">
{hexToMnemonic(generatedEntropy ?? "")

View File

@ -34,7 +34,7 @@ export function ModerationSettings() {
return (
<>
<h2>
<FormattedMessage defaultMessage="Muted Words" />
<FormattedMessage defaultMessage="Muted Words" id="AN0Z7Q" />
</h2>
<div className="flex flex-col g12">
<div className="flex g8">
@ -46,14 +46,14 @@ export function ModerationSettings() {
onChange={e => setMuteWord(e.target.value.toLowerCase())}
/>
<button type="button" onClick={addMutedWord}>
<FormattedMessage defaultMessage="Add" />
<FormattedMessage defaultMessage="Add" id="2/2yg+" />
</button>
</div>
{login.appData.item.mutedWords.map(v => (
<div className="p br b flex items-center justify-between">
<div>{v}</div>
<button type="button" onClick={() => removeMutedWord(v)}>
<FormattedMessage defaultMessage="Delete" />
<FormattedMessage defaultMessage="Delete" id="K3r6DQ" />
</button>
</div>
))}

View File

@ -46,7 +46,7 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<h4>
<FormattedMessage defaultMessage="Language" />
<FormattedMessage defaultMessage="Language" id="y1Z3or" />
</h4>
<div>
<select
@ -107,7 +107,7 @@ const PreferencesPage = () => {
} as UserPreferences)
}>
<option value="notes">
<FormattedMessage defaultMessage="Notes" />
<FormattedMessage defaultMessage="Notes" id="7+Domh" />
</option>
<option value="conversations">
<FormattedMessage {...messages.Conversations} />
@ -121,10 +121,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Send usage metrics" />
<FormattedMessage defaultMessage="Send usage metrics" id="XECMfW" />
</h4>
<small>
<FormattedMessage defaultMessage="Send anonymous usage metrics" />
<FormattedMessage defaultMessage="Send anonymous usage metrics" id="/Xf4UW" />
</small>
</div>
<div>
@ -169,10 +169,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Check Signatures" />
<FormattedMessage defaultMessage="Check Signatures" id="1o2BgB" />
</h4>
<small>
<FormattedMessage defaultMessage="Check all event signatures received from relays" />
<FormattedMessage defaultMessage="Check all event signatures received from relays" id="UNjfWJ" />
</small>
</div>
<div>
@ -186,10 +186,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Auto Translate" />
<FormattedMessage defaultMessage="Auto Translate" id="IWz1ta" />
</h4>
<small>
<FormattedMessage defaultMessage="Automatically translate notes to your local language" />
<FormattedMessage defaultMessage="Automatically translate notes to your local language" id="WmZhfL" />
</small>
</div>
<div>
@ -203,10 +203,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Proof of Work" />
<FormattedMessage defaultMessage="Proof of Work" id="grQ+mI" />
</h4>
<small>
<FormattedMessage defaultMessage="Amount of work to apply to all published events" />
<FormattedMessage defaultMessage="Amount of work to apply to all published events" id="vxwnbh" />
</small>
</div>
<div>
@ -220,7 +220,7 @@ const PreferencesPage = () => {
</div>
<div className="flex justify-between w-max">
<h4>
<FormattedMessage defaultMessage="Default Zap amount" />
<FormattedMessage defaultMessage="Default Zap amount" id="qMx1sA" />
</h4>
<div>
<input
@ -234,10 +234,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Show Badges" />
<FormattedMessage defaultMessage="Show Badges" id="sKDn4e" />
</h4>
<small>
<FormattedMessage defaultMessage="Show badges on profile pages" />
<FormattedMessage defaultMessage="Show badges on profile pages" id="EQKRE4" />
</small>
</div>
<div>
@ -251,10 +251,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Show Status" />
<FormattedMessage defaultMessage="Show Status" id="0uoY11" />
</h4>
<small>
<FormattedMessage defaultMessage="Show status messages on profile pages" />
<FormattedMessage defaultMessage="Show status messages on profile pages" id="FMfjrl" />
</small>
</div>
<div>
@ -268,10 +268,10 @@ const PreferencesPage = () => {
<div className="flex justify-between w-max">
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Auto Zap" />
<FormattedMessage defaultMessage="Auto Zap" id="Dh3hbq" />
</h4>
<small>
<FormattedMessage defaultMessage="Automatically zap every note when loaded" />
<FormattedMessage defaultMessage="Automatically zap every note when loaded" id="D+KzKd" />
</small>
</div>
<div>
@ -316,7 +316,7 @@ const PreferencesPage = () => {
type="text"
value={perf.imgProxyConfig?.url}
placeholder={formatMessage({
defaultMessage: "URL..",
defaultMessage: "URL..", id: 'cQfLWb',
description: "Placeholder text for imgproxy url textbox",
})}
onChange={e =>
@ -340,7 +340,7 @@ const PreferencesPage = () => {
type="password"
value={perf.imgProxyConfig?.key}
placeholder={formatMessage({
defaultMessage: "Hex Key..",
defaultMessage: "Hex Key..", id: 'H+vHiz',
description: "Hexidecimal 'key' input for improxy",
})}
onChange={e =>
@ -364,7 +364,7 @@ const PreferencesPage = () => {
type="password"
value={perf.imgProxyConfig?.salt}
placeholder={formatMessage({
defaultMessage: "Hex Salt..",
defaultMessage: "Hex Salt..", id: 'TpgeGw',
description: "Hexidecimal 'salt' input for imgproxy",
})}
onChange={e =>

View File

@ -117,7 +117,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
<div className="flex flex-col g24">
<div className="flex flex-col w-max g8">
<h4>
<FormattedMessage defaultMessage="Name" />
<FormattedMessage defaultMessage="Name" id="HAlOn1" />
</h4>
<input
className="w-max"
@ -129,7 +129,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
</div>
<div className="flex flex-col w-max g8">
<h4>
<FormattedMessage defaultMessage="About" />
<FormattedMessage defaultMessage="About" id="g5pX+a" />
</h4>
<textarea
className="w-max"
@ -139,7 +139,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
</div>
<div className="flex flex-col w-max g8">
<h4>
<FormattedMessage defaultMessage="Website" />
<FormattedMessage defaultMessage="Website" id="JkLHGw" />
</h4>
<input
className="w-max"
@ -151,7 +151,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
</div>
<div className="flex flex-col w-max g8">
<h4>
<FormattedMessage defaultMessage="Nostr Address" />
<FormattedMessage defaultMessage="Nostr Address" id="9pMqYs" />
</h4>
<div className="flex flex-col g8 w-max">
<input
@ -162,24 +162,24 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
disabled={readonly}
/>
<small>
<FormattedMessage defaultMessage="Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration." />
<FormattedMessage defaultMessage="Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration." id="5vMmmR" />
</small>
<div className="flex g12">
<button className="flex items-center" type="button" onClick={() => navigate("/nostr-address")}>
<FormattedMessage defaultMessage="Buy nostr address" />
<FormattedMessage defaultMessage="Buy nostr address" id="MuVeKe" />
</button>
<button
className="flex items-center secondary"
type="button"
onClick={() => navigate("/free-nostr-address")}>
<FormattedMessage defaultMessage="Get a free one" />
<FormattedMessage defaultMessage="Get a free one" id="vlbWtt" />
</button>
</div>
</div>
</div>
<div className="flex flex-col w-max g8">
<h4>
<FormattedMessage defaultMessage="Lightning Address" />
<FormattedMessage defaultMessage="Lightning Address" id="GSye7T" />
</h4>
<input
className="w-max"
@ -190,7 +190,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
/>
</div>
<AsyncButton className="primary" onClick={() => saveProfile()} disabled={readonly}>
<FormattedMessage defaultMessage="Save" />
<FormattedMessage defaultMessage="Save" id="jvo0vs" />
</AsyncButton>
</div>
);
@ -208,7 +208,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
}}
className="banner">
<AsyncButton type="button" onClick={() => setNewBanner()} disabled={readonly}>
<FormattedMessage defaultMessage="Upload" />
<FormattedMessage defaultMessage="Upload" id="p4N05H" />
</AsyncButton>
</div>
)}

View File

@ -83,7 +83,7 @@ const RelayInfo = () => {
</>
)}
<h4>
<FormattedMessage defaultMessage="Active Subscriptions" />
<FormattedMessage defaultMessage="Active Subscriptions" id="p85Uwy" />
</h4>
<div className="grow">
{stats?.activeRequests.map(a => (
@ -93,7 +93,7 @@ const RelayInfo = () => {
))}
</div>
<h4>
<FormattedMessage defaultMessage="Pending Subscriptions" />
<FormattedMessage defaultMessage="Pending Subscriptions" id="UDYlxu" />
</h4>
<div className="grow">
{stats?.pendingRequests.map(a => (

View File

@ -89,7 +89,7 @@ const RelaySettingsPage = () => {
</AsyncButton>
{addRelay()}
<h3>
<FormattedMessage defaultMessage="Other Connections" />
<FormattedMessage defaultMessage="Other Connections" id="LF5kYT" />
</h3>
<div className="flex flex-col g8">
{otherConnections.map(a => (

View File

@ -48,30 +48,30 @@ const SettingsIndex = () => {
</div>
<div className="settings-row" onClick={() => navigate("keys")}>
<Icon name="key" size={24} />
<FormattedMessage defaultMessage="Export Keys" />
<FormattedMessage defaultMessage="Export Keys" id="08zn6O" />
<Icon name="arrowFront" size={16} />
</div>
<div className="settings-row" onClick={() => navigate("moderation")}>
<Icon name="shield-tick" size={24} />
<FormattedMessage defaultMessage="Moderation" />
<FormattedMessage defaultMessage="Moderation" id="wofVHy" />
<Icon name="arrowFront" size={16} />
</div>
<div className="settings-row" onClick={() => navigate("handle")}>
<Icon name="badge" size={24} />
<FormattedMessage defaultMessage="Nostr Address" />
<FormattedMessage defaultMessage="Nostr Address" id="9pMqYs" />
<Icon name="arrowFront" size={16} />
</div>
{CONFIG.features.subscriptions && (
<div className="settings-row" onClick={() => navigate("/subscribe/manage")}>
<Icon name="diamond" size={24} />
<FormattedMessage defaultMessage="Subscription" />
<FormattedMessage defaultMessage="Subscription" id="R/6nsx" />
<Icon name="arrowFront" size={16} />
</div>
)}
{sub && (
<div className="settings-row" onClick={() => navigate("accounts")}>
<Icon name="code-circle" size={24} />
<FormattedMessage defaultMessage="Account Switcher" />
<FormattedMessage defaultMessage="Account Switcher" id="7BX/yC" />
<Icon name="arrowFront" size={16} />
</div>
)}
@ -84,7 +84,7 @@ const SettingsIndex = () => {
<div className="settings-row" onClick={() => navigate("wallet")}>
<Icon name="wallet" size={24} />
<FormattedMessage defaultMessage="Wallet" />
<FormattedMessage defaultMessage="Wallet" id="3yk8fB" />
<Icon name="arrowFront" size={16} />
</div>
<div className="settings-row" onClick={() => navigate("/donate")}>
@ -95,13 +95,13 @@ const SettingsIndex = () => {
{CONFIG.features.zapPool && (
<div className="settings-row" onClick={() => navigate("/zap-pool")}>
<Icon name="piggy-bank" size={24} />
<FormattedMessage defaultMessage="Zap Pool" />
<FormattedMessage defaultMessage="Zap Pool" id="i/dBAR" />
<Icon name="arrowFront" size={16} />
</div>
)}
<div className="settings-row" onClick={() => navigate("cache")}>
<Icon name="hard-drive" size={24} />
<FormattedMessage defaultMessage="Cache" />
<FormattedMessage defaultMessage="Cache" id="DBiVK1" />
<Icon name="arrowFront" size={16} />
</div>
<div className="settings-row" onClick={() => navigate("/graph")}>

View File

@ -17,11 +17,11 @@ const WalletSettings = () => {
<>
<Link to="/wallet">
<button type="button">
<FormattedMessage defaultMessage="View Wallets" />
<FormattedMessage defaultMessage="View Wallets" id="VvaJst" />
</button>
</Link>
<h3>
<FormattedMessage defaultMessage="Connect Wallet" />
<FormattedMessage defaultMessage="Connect Wallet" id="cg1VJ2" />
</h3>
<div className="wallet-grid">
<div onClick={() => navigate("/settings/wallet/lnc")}>

View File

@ -30,7 +30,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
} catch {
setError(
formatMessage({
defaultMessage: "Invalid LNURL",
defaultMessage: "Invalid LNURL", id: '0jOEtS',
}),
);
return;
@ -46,17 +46,17 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
return (
<div>
<h4>
<FormattedMessage defaultMessage="Update Lightning Address" />
<FormattedMessage defaultMessage="Update Lightning Address" id="SOqbe9" />
</h4>
<p>
<FormattedMessage defaultMessage="Your handle will act like a lightning address and will redirect to your chosen LNURL or Lightning address" />
<FormattedMessage defaultMessage="Your handle will act like a lightning address and will redirect to your chosen LNURL or Lightning address" id="b5vAk0" />
</p>
<p>
<small>
<FormattedMessage defaultMessage="Redirect issues HTTP redirect to the supplied lightning address" />
<FormattedMessage defaultMessage="Redirect issues HTTP redirect to the supplied lightning address" id="FcNSft" />
<br />
<FormattedMessage defaultMessage="Proxy uses HODL invoices to forward the payment, which hides the pubkey of your node" />
<FormattedMessage defaultMessage="Proxy uses HODL invoices to forward the payment, which hides the pubkey of your node" id="712i26" />
</small>
</p>
<div className="flex g8">
@ -64,7 +64,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
type="text"
className="w-max"
placeholder={formatMessage({
defaultMessage: "LNURL or Lightning Address",
defaultMessage: "LNURL or Lightning Address", id: 'yCLnBC',
})}
value={newAddress}
onChange={e => setNewAddress(e.target.value)}
@ -74,7 +74,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
<option value={ForwardType.ProxyDirect}>Proxy</option>
</select>
<AsyncButton onClick={() => startUpdate()}>
<FormattedMessage defaultMessage="Update" />
<FormattedMessage defaultMessage="Update" id="BWpuKl" />
</AsyncButton>
</div>
{error && <b className="error">{error}</b>}

View File

@ -32,11 +32,11 @@ export default function ListHandles() {
<>
{handles.length === 0 && (
<FormattedMessage
defaultMessage="It looks like you dont have any, check {link} to buy one!"
defaultMessage="It looks like you dont have any, check {link} to buy one!" id="mErPop"
values={{
link: (
<Link to="/nostr-address">
<FormattedMessage defaultMessage="Buy Handle" />
<FormattedMessage defaultMessage="Buy Handle" id="5oTnfy" />
</Link>
),
}}
@ -57,13 +57,13 @@ export default function ListHandles() {
state: a,
})
}>
<FormattedMessage defaultMessage="Manage" />
<FormattedMessage defaultMessage="Manage" id="0Azlrb" />
</button>
</div>
))}
{handles.length > 0 && (
<button type="button" onClick={() => navigate("/nostr-address")}>
<FormattedMessage defaultMessage="Buy Handle" />
<FormattedMessage defaultMessage="Buy Handle" id="5oTnfy" />
</button>
)}
{error && <ErrorOrOffline error={error} onRetry={loadHandles} />}

View File

@ -31,7 +31,7 @@ export default function TransferHandle({ handle }: { handle: ManageHandle }) {
return (
<div>
<h4>
<FormattedMessage defaultMessage="Transfer to Pubkey" />
<FormattedMessage defaultMessage="Transfer to Pubkey" id="5u6iEc" />
</h4>
<div className="flex">
<div className="grow">
@ -39,14 +39,14 @@ export default function TransferHandle({ handle }: { handle: ManageHandle }) {
type="text"
className="w-max mr10"
placeholder={formatMessage({
defaultMessage: "Public key (npub/nprofile)",
defaultMessage: "Public key (npub/nprofile)", id: 'VR5eHw',
})}
value={newKey}
onChange={e => setNewKey(e.target.value)}
/>
</div>
<AsyncButton onClick={() => startTransfer()}>
<FormattedMessage defaultMessage="Transfer" />
<FormattedMessage defaultMessage="Transfer" id="DtYelJ" />
</AsyncButton>
</div>
{error && <b className="error">{error}</b>}

View File

@ -10,7 +10,7 @@ export default function ManageHandlePage() {
return (
<>
<h3 onClick={() => navigate("/settings/handle")} className="pointer">
<FormattedMessage defaultMessage="Nostr Address" />
<FormattedMessage defaultMessage="Nostr Address" id="9pMqYs" />
</h3>
<Outlet />
</>

View File

@ -1,64 +1,64 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Profile: { defaultMessage: "Profile" },
Relays: { defaultMessage: "Relays" },
Owner: { defaultMessage: "Owner" },
Software: { defaultMessage: "Software" },
Contact: { defaultMessage: "Contact" },
Supports: { defaultMessage: "Supports" },
Remove: { defaultMessage: "Remove" },
Preferences: { defaultMessage: "Preferences" },
Donate: { defaultMessage: "Donate" },
LogOut: { defaultMessage: "Log Out" },
Theme: { defaultMessage: "Theme" },
System: { defaultMessage: "System (Default)" },
Light: { defaultMessage: "Light" },
Dark: { defaultMessage: "Dark" },
DefaultRootTab: { defaultMessage: "Default Page" },
Conversations: { defaultMessage: "Conversations" },
Global: { defaultMessage: "Global" },
AutoloadMedia: { defaultMessage: "Automatically load media" },
Profile: { defaultMessage: "Profile", id: 'itPgxd' },
Relays: { defaultMessage: "Relays", id: 'RoOyAh' },
Owner: { defaultMessage: "Owner", id: 'zINlao' },
Software: { defaultMessage: "Software", id: 'r3C4x/' },
Contact: { defaultMessage: "Contact", id: 'zFegDD' },
Supports: { defaultMessage: "Supports", id: 'hY4lzx' },
Remove: { defaultMessage: "Remove", id: 'G/yZLu' },
Preferences: { defaultMessage: "Preferences", id: 'PCSt5T' },
Donate: { defaultMessage: "Donate", id: '2IFGap' },
LogOut: { defaultMessage: "Log Out", id: 'H0JBH6' },
Theme: { defaultMessage: "Theme", id: 'Pe0ogR' },
System: { defaultMessage: "System (Default)", id: 'P7FD0F' },
Light: { defaultMessage: "Light", id: '3cc4Ct' },
Dark: { defaultMessage: "Dark", id: 'tOdNiY' },
DefaultRootTab: { defaultMessage: "Default Page", id: 'MWTx65' },
Conversations: { defaultMessage: "Conversations", id: '1udzha' },
Global: { defaultMessage: "Global", id: 'EWyQH5' },
AutoloadMedia: { defaultMessage: "Automatically load media", id: 'xbVgIm' },
AutoloadMediaHelp: {
defaultMessage: "Media in notes will automatically be shown for selected people, otherwise only the link will show",
defaultMessage: "Media in notes will automatically be shown for selected people, otherwise only the link will show", id: 'TDR5ge',
},
None: { defaultMessage: "None" },
FollowsOnly: { defaultMessage: "Follows only" },
All: { defaultMessage: "All" },
ImgProxy: { defaultMessage: "Image proxy service" },
ImgProxyHelp: { defaultMessage: "Use imgproxy to compress images" },
ServiceUrl: { defaultMessage: "Service URL" },
ServiceKey: { defaultMessage: "Key" },
ServiceSalt: { defaultMessage: "Salt" },
EnableReactions: { defaultMessage: "Enable reactions" },
None: { defaultMessage: "None", id: '450Fty' },
FollowsOnly: { defaultMessage: "Follows only", id: 'odFwjL' },
All: { defaultMessage: "All", id: 'zQvVDJ' },
ImgProxy: { defaultMessage: "Image proxy service", id: 'll3xBp' },
ImgProxyHelp: { defaultMessage: "Use imgproxy to compress images", id: '4Z3t5i' },
ServiceUrl: { defaultMessage: "Service URL", id: 'YDURw6' },
ServiceKey: { defaultMessage: "Key", id: 'EcglP9' },
ServiceSalt: { defaultMessage: "Salt", id: 'GFOoEE' },
EnableReactions: { defaultMessage: "Enable reactions", id: 'YXA3AH' },
EnableReactionsHelp: {
defaultMessage: "Reactions will be shown on every page, if disabled no reactions will be shown",
defaultMessage: "Reactions will be shown on every page, if disabled no reactions will be shown", id: 'PrsIg7',
},
ConfirmReposts: { defaultMessage: "Confirm Reposts" },
ConfirmRepostsHelp: { defaultMessage: "Reposts need to be manually confirmed" },
ShowLatest: { defaultMessage: "Automatically show latest notes" },
ShowLatestHelp: { defaultMessage: "Notes will stream in real time into global and notes tab" },
FileUpload: { defaultMessage: "File upload service" },
FileUploadHelp: { defaultMessage: "Pick which upload service you want to upload attachments to" },
Default: { defaultMessage: "(Default)" },
DebugMenus: { defaultMessage: "Debug Menus" },
DebugMenusHelp: { defaultMessage: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message` },
EditProfile: { defaultMessage: "Edit Profile" },
About: { defaultMessage: "About" },
LnAddress: { defaultMessage: "LN Address" },
Avatar: { defaultMessage: "Avatar" },
Banner: { defaultMessage: "Banner" },
Edit: { defaultMessage: "Edit" },
PrivateKey: { defaultMessage: "Your Private Key Is (do not share this with anyone)" },
Add: { defaultMessage: "Add" },
AddRelays: { defaultMessage: "Add Relays" },
Name: { defaultMessage: "Name" },
Website: { defaultMessage: "Website" },
Save: { defaultMessage: "Save" },
DisplayName: { defaultMessage: "Display name" },
Buy: { defaultMessage: "Buy" },
Nip05: { defaultMessage: "NIP-05" },
ReactionEmoji: { defaultMessage: "Reaction emoji" },
ReactionEmojiHelp: { defaultMessage: "Emoji to send when reactiong to a note" },
SocialGraph: { defaultMessage: "Social Graph" },
ConfirmReposts: { defaultMessage: "Confirm Reposts", id: '89q5wc' },
ConfirmRepostsHelp: { defaultMessage: "Reposts need to be manually confirmed", id: 'uSV4Ti' },
ShowLatest: { defaultMessage: "Automatically show latest notes", id: 'zvCDao' },
ShowLatestHelp: { defaultMessage: "Notes will stream in real time into global and notes tab", id: 'a7TDNm' },
FileUpload: { defaultMessage: "File upload service", id: 'mKh2HS' },
FileUploadHelp: { defaultMessage: "Pick which upload service you want to upload attachments to", id: 'VOjC1i' },
Default: { defaultMessage: "(Default)", id: 'rfuMjE' },
DebugMenus: { defaultMessage: "Debug Menus", id: 'M3Oirc' },
DebugMenusHelp: { defaultMessage: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message`, id: 'MBAYRO' },
EditProfile: { defaultMessage: "Edit Profile", id: 'usAvMr' },
About: { defaultMessage: "About", id: 'g5pX+a' },
LnAddress: { defaultMessage: "LN Address", id: 'd7d0/x' },
Avatar: { defaultMessage: "Avatar", id: 'VnXp8Z' },
Banner: { defaultMessage: "Banner", id: '25V4l1' },
Edit: { defaultMessage: "Edit", id: 'wEQDC6' },
PrivateKey: { defaultMessage: "Your Private Key Is (do not share this with anyone)", id: 'qdGuQo' },
Add: { defaultMessage: "Add", id: '2/2yg+' },
AddRelays: { defaultMessage: "Add Relays", id: 'rT14Ow' },
Name: { defaultMessage: "Name", id: 'HAlOn1' },
Website: { defaultMessage: "Website", id: 'JkLHGw' },
Save: { defaultMessage: "Save", id: 'jvo0vs' },
DisplayName: { defaultMessage: "Display name", id: 'dOQCL8' },
Buy: { defaultMessage: "Buy", id: 'EnCOBJ' },
Nip05: { defaultMessage: "NIP-05", id: '7hp70g' },
ReactionEmoji: { defaultMessage: "Reaction emoji", id: 'eHAneD' },
ReactionEmojiHelp: { defaultMessage: "Emoji to send when reactiong to a note", id: 'gDzDRs' },
SocialGraph: { defaultMessage: "Social Graph", id: 'CzHZoc' },
});

View File

@ -38,7 +38,7 @@ const ConnectCashu = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error",
defaultMessage: "Unknown error", id: 'qDwvZ4',
}),
);
}
@ -48,7 +48,7 @@ const ConnectCashu = () => {
return (
<>
<h4>
<FormattedMessage defaultMessage="Enter mint URL" />
<FormattedMessage defaultMessage="Enter mint URL" id="KoFlZg" />
</h4>
<div className="flex">
<div className="grow mr10">
@ -61,7 +61,7 @@ const ConnectCashu = () => {
/>
</div>
<AsyncButton onClick={() => tryConnect(unwrap(mintUrl))} disabled={!mintUrl}>
<FormattedMessage defaultMessage="Connect" />
<FormattedMessage defaultMessage="Connect" id="+vVZ/G" />
</AsyncButton>
</div>
{error && <b className="error p10">{error}</b>}

View File

@ -31,7 +31,7 @@ const ConnectLNC = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error",
defaultMessage: "Unknown error", id: 'qDwvZ4',
}),
);
}
@ -54,20 +54,20 @@ const ConnectLNC = () => {
return (
<>
<h4>
<FormattedMessage defaultMessage="Enter pairing phrase" />
<FormattedMessage defaultMessage="Enter pairing phrase" id="Z4BMCZ" />
</h4>
<div className="flex">
<div className="grow mr10">
<input
type="text"
placeholder={formatMessage({ defaultMessage: "Pairing phrase" })}
placeholder={formatMessage({ defaultMessage: "Pairing phrase", id: '8v1NN+' })}
className="w-max"
value={pairingPhrase}
onChange={e => setPairingPhrase(e.target.value)}
/>
</div>
<AsyncButton onClick={() => tryConnect(unwrap(pairingPhrase))} disabled={!pairingPhrase}>
<FormattedMessage defaultMessage="Connect" />
<FormattedMessage defaultMessage="Connect" id="+vVZ/G" />
</AsyncButton>
</div>
{error && <b className="error p10">{error}</b>}
@ -81,20 +81,20 @@ const ConnectLNC = () => {
<div className="flex flex-col">
<h3>
<FormattedMessage
defaultMessage="Connected to: {node} 🎉"
defaultMessage="Connected to: {node} 🎉" id="1c4YST"
values={{
node: walletInfo?.alias,
}}
/>
</h3>
<h4>
<FormattedMessage defaultMessage="Enter password" />
<FormattedMessage defaultMessage="Enter password" id="2LbrkB" />
</h4>
<div className="flex w-max">
<div className="grow mr10">
<input
type="password"
placeholder={formatMessage({ defaultMessage: "Wallet password" })}
placeholder={formatMessage({ defaultMessage: "Wallet password", id: 'lTbT3s' })}
className="w-max"
value={walletPassword}
onChange={e => setWalletPassword(e.target.value)}
@ -103,7 +103,7 @@ const ConnectLNC = () => {
<AsyncButton
onClick={() => setLNCPassword(unwrap(walletPassword))}
disabled={(walletPassword?.length ?? 0) < 8}>
<FormattedMessage defaultMessage="Save" />
<FormattedMessage defaultMessage="Save" id="jvo0vs" />
</AsyncButton>
</div>
</div>

View File

@ -36,7 +36,7 @@ const ConnectLNDHub = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error",
defaultMessage: "Unknown error", id: 'qDwvZ4',
}),
);
}
@ -46,7 +46,7 @@ const ConnectLNDHub = () => {
return (
<>
<h4>
<FormattedMessage defaultMessage="Enter LNDHub config" />
<FormattedMessage defaultMessage="Enter LNDHub config" id="KAhAcM" />
</h4>
<div className="flex">
<div className="grow mr10">
@ -59,7 +59,7 @@ const ConnectLNDHub = () => {
/>
</div>
<AsyncButton onClick={() => tryConnect(unwrap(config))} disabled={!config}>
<FormattedMessage defaultMessage="Connect" />
<FormattedMessage defaultMessage="Connect" id="+vVZ/G" />
</AsyncButton>
</div>
{error && <b className="error p10">{error}</b>}

View File

@ -36,7 +36,7 @@ const ConnectNostrWallet = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error",
defaultMessage: "Unknown error", id: 'qDwvZ4',
}),
);
}
@ -46,7 +46,7 @@ const ConnectNostrWallet = () => {
return (
<>
<h4>
<FormattedMessage defaultMessage="Enter Nostr Wallet Connect config" />
<FormattedMessage defaultMessage="Enter Nostr Wallet Connect config" id="1R43+L" />
</h4>
<div className="flex">
<div className="grow mr10">
@ -59,13 +59,13 @@ const ConnectNostrWallet = () => {
/>
</div>
<AsyncButton onClick={() => tryConnect(unwrap(config))} disabled={!config}>
<FormattedMessage defaultMessage="Connect" />
<FormattedMessage defaultMessage="Connect" id="+vVZ/G" />
</AsyncButton>
</div>
{error && <b className="error p10">{error}</b>}
<p>
<FormattedMessage
defaultMessage="Using Alby? Go to {link} to get your NWC config!"
defaultMessage="Using Alby? Go to {link} to get your NWC config!" id="cFbU1B"
values={{
link: (
<Link to="https://nwc.getalby.com/" target="_blank">

View File

@ -40,24 +40,24 @@ export default function ManageSubscriptionPage() {
return (
<div className="main-content p flex flex-col g16">
<h2>
<FormattedMessage defaultMessage="Subscriptions" />
<FormattedMessage defaultMessage="Subscriptions" id="J+dIsA" />
</h2>
{subs.map(a => (
<SubscriptionCard sub={a} key={a.id} />
))}
{subs.length !== 0 && (
<button className="primary" onClick={() => navigate("/subscribe")}>
<FormattedMessage defaultMessage="Buy Subscription" />
<FormattedMessage defaultMessage="Buy Subscription" id="SP0+yi" />
</button>
)}
{subs.length === 0 && (
<p>
<FormattedMessage
defaultMessage="It looks like you dont have any subscriptions, you can get one {link}"
defaultMessage="It looks like you dont have any subscriptions, you can get one {link}" id="W1yoZY"
values={{
link: (
<Link to="/subscribe">
<FormattedMessage defaultMessage="here" />
<FormattedMessage defaultMessage="here" id="hniz8Z" />
</Link>
),
}}

View File

@ -50,7 +50,7 @@ export function RenewSub({ sub: s }: { sub?: Subscription }) {
<div className="flex g8">
<div className="flex flex-col g4">
<small>
<FormattedMessage defaultMessage="Months" />
<FormattedMessage defaultMessage="Months" id="AxDOiG" />
</small>
<input type="number" value={months} onChange={e => setMonths(Number(e.target.value))} min={1} />
</div>
@ -60,13 +60,13 @@ export function RenewSub({ sub: s }: { sub?: Subscription }) {
<AsyncButton onClick={() => renew(sub.id, months)}>
{sub.state === "expired" ? (
<FormattedMessage
defaultMessage="Renew {tier}"
defaultMessage="Renew {tier}" id="qZsKBR"
values={{
tier: mapPlanName(sub.type),
}}
/>
) : (
<FormattedMessage defaultMessage="Pay Now" />
<FormattedMessage defaultMessage="Pay Now" id="Ss0sWu" />
)}
</AsyncButton>
</div>
@ -76,7 +76,7 @@ export function RenewSub({ sub: s }: { sub?: Subscription }) {
show={invoice !== ""}
onClose={() => setInvoice("")}
title={formatMessage({
defaultMessage: "Pay for subscription",
defaultMessage: "Pay for subscription", id: 'Mrpkot',
})}
/>
{error && <b className="error">{mapSubscriptionErrorCode(error)}</b>}

View File

@ -24,7 +24,7 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
{!sub.handle && (
<>
<h3>
<FormattedMessage defaultMessage="Claim your included Snort nostr address" />
<FormattedMessage defaultMessage="Claim your included Snort nostr address" id="GUlSVG" />
</h3>
<Nip5Service
{...SnortNostrAddressService}
@ -48,7 +48,7 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
</div>
<div className="flex">
<p className="f-1">
<FormattedMessage defaultMessage="Created" />
<FormattedMessage defaultMessage="Created" id="ORGv1Q" />
:&nbsp;
<time dateTime={created.toISOString()}>
<FormattedDate value={created} dateStyle="full" />
@ -56,11 +56,11 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
</p>
{daysToExpire >= 1 && (
<p className="f-1">
<FormattedMessage defaultMessage="Expires" />
<FormattedMessage defaultMessage="Expires" id="xhQMeQ" />
:&nbsp;
<time dateTime={expires.toISOString()}>
<FormattedMessage
defaultMessage="{n} days"
defaultMessage="{n} days" id="rmdsT4"
values={{
n: <FormattedNumber value={daysToExpire} maximumFractionDigits={0} />,
}}
@ -70,11 +70,11 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
)}
{daysToExpire >= 0 && daysToExpire < 1 && (
<p className="f-1">
<FormattedMessage defaultMessage="Expires" />
<FormattedMessage defaultMessage="Expires" id="xhQMeQ" />
:&nbsp;
<time dateTime={expires.toISOString()}>
<FormattedMessage
defaultMessage="{n} hours"
defaultMessage="{n} hours" id="2ukA4d"
values={{
n: <FormattedNumber value={hoursToExpire} maximumFractionDigits={0} />,
}}
@ -84,12 +84,12 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
)}
{isExpired && (
<p className="f-1 error">
<FormattedMessage defaultMessage="Expired" />
<FormattedMessage defaultMessage="Expired" id="RahCRH" />
</p>
)}
{isNew && (
<p className="f-1">
<FormattedMessage defaultMessage="Unpaid" />
<FormattedMessage defaultMessage="Unpaid" id="6uMqL1" />
</p>
)}
</div>

View File

@ -16,43 +16,43 @@ import classNames from "classnames";
export function mapPlanName(id: number) {
switch (id) {
case SubscriptionType.Supporter:
return <FormattedMessage defaultMessage="Supporter" />;
return <FormattedMessage defaultMessage="Supporter" id="DcL8P+" />;
case SubscriptionType.Premium:
return <FormattedMessage defaultMessage="PRO" />;
return <FormattedMessage defaultMessage="PRO" id="hRTfTR" />;
}
}
export function mapFeatureName(k: LockedFeatures) {
switch (k) {
case LockedFeatures.MultiAccount:
return <FormattedMessage defaultMessage="Multi account support" />;
return <FormattedMessage defaultMessage="Multi account support" id="cuP16y" />;
case LockedFeatures.NostrAddress:
return <FormattedMessage defaultMessage="Snort nostr address" />;
return <FormattedMessage defaultMessage="Snort nostr address" id="lPWASz" />;
case LockedFeatures.Badge:
return <FormattedMessage defaultMessage="Supporter Badge" />;
return <FormattedMessage defaultMessage="Supporter Badge" id="ttxS0b" />;
case LockedFeatures.DeepL:
return <FormattedMessage defaultMessage="DeepL translations" />;
return <FormattedMessage defaultMessage="DeepL translations" id="iEoXYx" />;
case LockedFeatures.RelayRetention:
return <FormattedMessage defaultMessage="Unlimited note retention on Snort relay" />;
return <FormattedMessage defaultMessage="Unlimited note retention on Snort relay" id="Ai8VHU" />;
case LockedFeatures.RelayBackup:
return <FormattedMessage defaultMessage="Downloadable backups from Snort relay" />;
return <FormattedMessage defaultMessage="Downloadable backups from Snort relay" id="pI+77w" />;
case LockedFeatures.RelayAccess:
return <FormattedMessage defaultMessage="Write access to Snort relay, with 1 year of event retention" />;
return <FormattedMessage defaultMessage="Write access to Snort relay, with 1 year of event retention" id="BGCM48" />;
case LockedFeatures.LNProxy:
return <FormattedMessage defaultMessage="LN Address Proxy" />;
return <FormattedMessage defaultMessage="LN Address Proxy" id="SYQtZ7" />;
case LockedFeatures.EmailBridge:
return <FormattedMessage defaultMessage="Email <> DM bridge for your Snort nostr address" />;
return <FormattedMessage defaultMessage="Email <> DM bridge for your Snort nostr address" id="qD9EUF" />;
}
}
export function mapSubscriptionErrorCode(c: SubscriptionError) {
switch (c.code) {
case SubscriptionErrorCode.InternalError:
return <FormattedMessage defaultMessage="Internal error: {msg}" values={{ msg: c.message }} />;
return <FormattedMessage defaultMessage="Internal error: {msg}" id="jMzO1S" values={{ msg: c.message }} />;
case SubscriptionErrorCode.SubscriptionActive:
return <FormattedMessage defaultMessage="You subscription is still active, you can't renew yet" />;
return <FormattedMessage defaultMessage="You subscription is still active, you can't renew yet" id="OQXnew" />;
case SubscriptionErrorCode.Duplicate:
return <FormattedMessage defaultMessage="You already have a subscription of this type, please renew or pay" />;
return <FormattedMessage defaultMessage="You already have a subscription of this type, please renew or pay" id="NAuFNH" />;
default:
return c.message;
}
@ -87,7 +87,7 @@ export function SubscribePage() {
<h2>{mapPlanName(a.id)}</h2>
<p>
<FormattedMessage
defaultMessage="Subscribe to {site_name} {plan} for {price} and receive the following rewards"
defaultMessage="Subscribe to {site_name} {plan} for {price} and receive the following rewards" id="JSx7y9"
values={{
site_name: CONFIG.appNameCapitalized,
plan: mapPlanName(a.id),
@ -103,7 +103,7 @@ export function SubscribePage() {
{lower.map(b => (
<li>
<FormattedMessage
defaultMessage="Everything in {plan}"
defaultMessage="Everything in {plan}" id="l+ikU1"
values={{
plan: mapPlanName(b.id),
}}
@ -115,9 +115,9 @@ export function SubscribePage() {
<div className="flex justify-center">
<AsyncButton className="button" disabled={a.disabled} onClick={() => subscribe(a.id)}>
{a.disabled ? (
<FormattedMessage defaultMessage="Coming soon" />
<FormattedMessage defaultMessage="Coming soon" id="e61Jf3" />
) : (
<FormattedMessage defaultMessage="Subscribe" />
<FormattedMessage defaultMessage="Subscribe" id="gczcC5" />
)}
</AsyncButton>
</div>

View File

@ -14,13 +14,13 @@ export class DonateTask extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="Thanks for using {site}, please consider donating if you can."
defaultMessage="Thanks for using {site}, please consider donating if you can." id="fBlba3"
values={{ site: CONFIG.appNameCapitalized }}
/>
</p>
<Link to="/donate">
<button>
<FormattedMessage defaultMessage="Donate" />
<FormattedMessage defaultMessage="Donate" id="2IFGap" />
</button>
</Link>
</>

View File

@ -14,11 +14,11 @@ export class Nip5Task extends BaseUITask {
return (
<p>
<FormattedMessage
defaultMessage="Hey, it looks like you dont have a Nostr Address yet, you should get one! Check out {link}"
defaultMessage="Hey, it looks like you dont have a Nostr Address yet, you should get one! Check out {link}" id="ojzbwv"
values={{
link: (
<Link to="/nostr-address">
<FormattedMessage defaultMessage="Buy nostr address" />
<FormattedMessage defaultMessage="Buy nostr address" id="MuVeKe" />
</Link>
),
}}

View File

@ -14,7 +14,7 @@ export class NoticeZapPoolDefault extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="A default Zap Pool split of {n} has been configured for {site} developers, you can disable it at any time in {link}"
defaultMessage="A default Zap Pool split of {n} has been configured for {site} developers, you can disable it at any time in {link}" id="dmsiLv"
values={{
site: CONFIG.appNameCapitalized,
n: (
@ -26,7 +26,7 @@ export class NoticeZapPoolDefault extends BaseUITask {
),
link: (
<Link to="/zap-pool">
<FormattedMessage defaultMessage="Zap Pool" />
<FormattedMessage defaultMessage="Zap Pool" id="i/dBAR" />
</Link>
),
}}

View File

@ -19,7 +19,7 @@ export class RenewSubTask extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="Your {site_name} subscription is expired"
defaultMessage="Your {site_name} subscription is expired" id="jAmfGl"
values={{
site_name: CONFIG.appName,
}}

View File

@ -2230,7 +2230,7 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/ts-transformer@npm:^3.13.3":
"@formatjs/ts-transformer@npm:3.13.9, @formatjs/ts-transformer@npm:^3.13.3":
version: 3.13.9
resolution: "@formatjs/ts-transformer@npm:3.13.9"
dependencies:
@ -3436,6 +3436,7 @@ __metadata:
dexie: ^3.2.4
emojilib: ^3.0.10
eslint: ^8.48.0
eslint-plugin-formatjs: ^4.11.3
eslint-webpack-plugin: ^4.0.1
highlight.js: ^11.8.0
html-webpack-plugin: ^5.5.1
@ -4005,7 +4006,7 @@ __metadata:
languageName: node
linkType: hard
"@types/eslint@npm:*, @types/eslint@npm:^8.37.0":
"@types/eslint@npm:*, @types/eslint@npm:7 || 8, @types/eslint@npm:^8.37.0":
version: 8.44.7
resolution: "@types/eslint@npm:8.44.7"
dependencies:
@ -4258,6 +4259,13 @@ __metadata:
languageName: node
linkType: hard
"@types/picomatch@npm:^2.3.0":
version: 2.3.3
resolution: "@types/picomatch@npm:2.3.3"
checksum: 1bf1a1d80296a585d3310c97be87e67e16da6f5c168e01ce27eef835abfc5bcca8e395afd6ae8b2b73eb72540d1587da7a468e4dfe7277ea208cf43cae096854
languageName: node
linkType: hard
"@types/prop-types@npm:*":
version: 15.7.10
resolution: "@types/prop-types@npm:15.7.10"
@ -4589,7 +4597,7 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/utils@npm:6.11.0":
"@typescript-eslint/utils@npm:6.11.0, @typescript-eslint/utils@npm:^6.5.0":
version: 6.11.0
resolution: "@typescript-eslint/utils@npm:6.11.0"
dependencies:
@ -7335,6 +7343,13 @@ __metadata:
languageName: node
linkType: hard
"emoji-regex@npm:10.3.0, emoji-regex@npm:^10.2.1":
version: 10.3.0
resolution: "emoji-regex@npm:10.3.0"
checksum: 5da48edfeb9462fb1ae5495cff2d79129974c696853fb0ce952cbf560f29a2756825433bf51cfd5157ec7b9f93f46f31d712e896d63e3d8ac9c3832bdb45ab73
languageName: node
linkType: hard
"emoji-regex@npm:^8.0.0":
version: 8.0.0
resolution: "emoji-regex@npm:8.0.0"
@ -7641,6 +7656,27 @@ __metadata:
languageName: node
linkType: hard
"eslint-plugin-formatjs@npm:^4.11.3":
version: 4.11.3
resolution: "eslint-plugin-formatjs@npm:4.11.3"
dependencies:
"@formatjs/icu-messageformat-parser": 2.7.3
"@formatjs/ts-transformer": 3.13.9
"@types/eslint": 7 || 8
"@types/picomatch": ^2.3.0
"@typescript-eslint/utils": ^6.5.0
emoji-regex: ^10.2.1
magic-string: ^0.30.0
picomatch: ^2.3.1
tslib: 2.6.2
typescript: 5
unicode-emoji-utils: ^1.1.1
peerDependencies:
eslint: 7 || 8
checksum: 2840fef201bb8b0ba1bc0a37a4e1748279c0810d2d827f8dabe777347414ff3a758584b2e1788fcbdc59266de52d7ea7cdaacf95b7348e670e0e4602e0be689e
languageName: node
linkType: hard
"eslint-scope@npm:5.1.1":
version: 5.1.1
resolution: "eslint-scope@npm:5.1.1"
@ -10603,7 +10639,7 @@ __metadata:
languageName: node
linkType: hard
"magic-string@npm:^0.30.4":
"magic-string@npm:^0.30.0, magic-string@npm:^0.30.4":
version: 0.30.5
resolution: "magic-string@npm:0.30.5"
dependencies:
@ -15324,7 +15360,7 @@ __metadata:
languageName: node
linkType: hard
"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2":
"tslib@npm:2.6.2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2":
version: 2.6.2
resolution: "tslib@npm:2.6.2"
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
@ -15496,6 +15532,15 @@ __metadata:
languageName: node
linkType: hard
"unicode-emoji-utils@npm:^1.1.1":
version: 1.2.0
resolution: "unicode-emoji-utils@npm:1.2.0"
dependencies:
emoji-regex: 10.3.0
checksum: a659831614f2d6c6942ff97ad63b8ba276af8b3e82c5aa07b8b4f42aa2428e7f2b4585750a0f10809f6bfa40514454463b491a6446078907c1160090fc1531b0
languageName: node
linkType: hard
"unicode-match-property-ecmascript@npm:^2.0.0":
version: 2.0.0
resolution: "unicode-match-property-ecmascript@npm:2.0.0"