tmp disable sw, add FormattedMessage ids via eslint
This commit is contained in:
parent
6d706717c8
commit
ef85b47b58
@ -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: {
|
||||
|
@ -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",
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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}>
|
||||
|
@ -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}
|
||||
|
@ -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} />,
|
||||
}}
|
||||
|
@ -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>
|
||||
</>
|
||||
|
@ -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} />
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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)}>
|
||||
|
@ -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 => (
|
||||
|
@ -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()}
|
||||
/>
|
||||
|
@ -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) {
|
||||
<>
|
||||
|
||||
<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) {
|
||||
</>
|
||||
)}
|
||||
|
||||
<FormattedMessage defaultMessage="Click here to load anyway" />
|
||||
<FormattedMessage defaultMessage="Click here to load anyway" id="IoQq+a" />
|
||||
</>
|
||||
}>
|
||||
{innerContent}
|
||||
|
@ -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),
|
||||
}}
|
||||
|
@ -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" />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
|
@ -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>
|
||||
)
|
||||
|
@ -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>,
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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",
|
||||
});
|
||||
|
||||
|
@ -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 ? (
|
||||
|
@ -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>
|
||||
)}
|
||||
|
@ -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" />
|
||||
|
@ -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>
|
||||
</>
|
||||
);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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} />
|
||||
)}
|
||||
|
@ -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>
|
||||
|
@ -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}
|
||||
|
@ -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),
|
||||
}}
|
||||
|
@ -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" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>*/}
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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' },
|
||||
});
|
||||
|
@ -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")) {
|
||||
|
@ -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={[]} />
|
||||
|
@ -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} />
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)} />
|
||||
|
@ -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>
|
||||
|
@ -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} />
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
@ -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 => {
|
||||
|
@ -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} />
|
||||
|
@ -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>
|
||||
|
@ -117,7 +117,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">
|
||||
@ -164,11 +164,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>;
|
||||
|
||||
@ -237,7 +237,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")}
|
||||
@ -345,7 +345,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,
|
||||
@ -356,7 +356,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,
|
||||
@ -367,7 +367,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,
|
||||
@ -400,7 +400,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>
|
||||
@ -409,7 +409,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>
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
|
@ -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}
|
||||
|
@ -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 ? <> </> : 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} />,
|
||||
}}
|
||||
|
@ -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>
|
||||
|
@ -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' },
|
||||
});
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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>
|
||||
)}
|
||||
|
@ -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>
|
||||
|
@ -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 ?? "")
|
||||
|
@ -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>
|
||||
))}
|
||||
|
@ -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 =>
|
||||
|
@ -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>
|
||||
)}
|
||||
|
@ -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 => (
|
||||
|
@ -92,7 +92,7 @@ const RelaySettingsPage = () => {
|
||||
{addRelay()}
|
||||
<CloseRelays />
|
||||
<h3>
|
||||
<FormattedMessage defaultMessage="Other Connections" />
|
||||
<FormattedMessage defaultMessage="Other Connections" id="LF5kYT" />
|
||||
</h3>
|
||||
<div className="flex flex-col g8">
|
||||
{otherConnections.map(a => (
|
||||
|
@ -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")}>
|
||||
|
@ -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")}>
|
||||
|
@ -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>}
|
||||
|
@ -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} />}
|
||||
|
@ -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>}
|
||||
|
@ -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 />
|
||||
</>
|
||||
|
@ -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' },
|
||||
});
|
||||
|
@ -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>}
|
||||
|
@ -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>
|
||||
|
@ -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>}
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
),
|
||||
}}
|
||||
|
@ -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>}
|
||||
|
@ -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" />
|
||||
:
|
||||
<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" />
|
||||
:
|
||||
<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" />
|
||||
:
|
||||
<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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
</>
|
||||
|
@ -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>
|
||||
),
|
||||
}}
|
||||
|
@ -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>
|
||||
),
|
||||
}}
|
||||
|
@ -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,
|
||||
}}
|
||||
|
55
yarn.lock
55
yarn.lock
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user