chore: Update translations
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Kieran 2023-09-12 14:15:07 +00:00
parent 15ffa7d4b4
commit e77b9928d0
63 changed files with 191 additions and 193 deletions

View File

@ -1,4 +1,4 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />

View File

@ -1,4 +1,4 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />

View File

@ -38,7 +38,7 @@ export class GiftWrapCache extends RefreshFeedCache<UnwrappedGift> {
} catch (e) { } catch (e) {
console.debug(e, v); console.debug(e, v);
} }
}), })
) )
) )
.filter(a => a !== undefined) .filter(a => a !== undefined)

View File

@ -26,7 +26,7 @@ export default function CashuNuts({ token }: { token: string }) {
e.stopPropagation(); e.stopPropagation();
const lnurl = profile?.lud16 ?? ""; const lnurl = profile?.lud16 ?? "";
const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent( const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent(
lnurl, lnurl
)}&autopay=yes`; )}&autopay=yes`;
window.open(url, "_blank"); window.open(url, "_blank");
} }

View File

@ -34,7 +34,7 @@ export default function FollowButton(props: FollowButtonProps) {
if (publisher) { if (publisher) {
const ev = await publisher.contactList( const ev = await publisher.contactList(
follows.item.filter(a => a !== pubkey), follows.item.filter(a => a !== pubkey),
relays.item, relays.item
); );
System.BroadcastEvent(ev); System.BroadcastEvent(ev);
} }

View File

@ -261,7 +261,9 @@ export default function Nip5Service(props: Nip05ServiceProps) {
/> />
&nbsp;@&nbsp; &nbsp;@&nbsp;
<select value={domain} onChange={onDomainChange}> <select value={domain} onChange={onDomainChange}>
{serviceConfig?.domains.map(a => <option key={a.name}>{a.name}</option>)} {serviceConfig?.domains.map(a => (
<option key={a.name}>{a.name}</option>
))}
</select> </select>
</div> </div>
)} )}

View File

@ -135,7 +135,7 @@ export function NoteInner(props: NoteProps) {
{ {
[Reaction.Positive]: [] as TaggedNostrEvent[], [Reaction.Positive]: [] as TaggedNostrEvent[],
[Reaction.Negative]: [] as TaggedNostrEvent[], [Reaction.Negative]: [] as TaggedNostrEvent[],
}, }
); );
return { return {
[Reaction.Positive]: dedupeByPubkey(result[Reaction.Positive]), [Reaction.Positive]: dedupeByPubkey(result[Reaction.Positive]),
@ -150,7 +150,7 @@ export function NoteInner(props: NoteProps) {
...getReactions(related, ev.id, EventKind.TextNote).filter(e => e.tags.some(tagFilterOfTextRepost(e, ev.id))), ...getReactions(related, ev.id, EventKind.TextNote).filter(e => e.tags.some(tagFilterOfTextRepost(e, ev.id))),
...getReactions(related, ev.id, EventKind.Repost), ...getReactions(related, ev.id, EventKind.Repost),
]), ]),
[related, ev], [related, ev]
); );
const zaps = useMemo(() => { const zaps = useMemo(() => {
const sortedZaps = getReactions(related, ev.id, EventKind.ZapReceipt) const sortedZaps = getReactions(related, ev.id, EventKind.ZapReceipt)
@ -241,7 +241,7 @@ export function NoteInner(props: NoteProps) {
function goToEvent( function goToEvent(
e: React.MouseEvent, e: React.MouseEvent,
eTarget: TaggedNostrEvent, eTarget: TaggedNostrEvent,
isTargetAllowed: boolean = e.target === e.currentTarget, isTargetAllowed: boolean = e.target === e.currentTarget
) { ) {
if (!isTargetAllowed || opt?.canClick === false) { if (!isTargetAllowed || opt?.canClick === false) {
return; return;

View File

@ -2,8 +2,7 @@
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 12px; border-radius: 12px;
box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3); box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3);
background: background: linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box; linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box;
} }

View File

@ -76,8 +76,8 @@ export function NoteCreator() {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Invalid LNURL", defaultMessage: "Invalid LNURL",
}), })
), )
); );
return; return;
} }
@ -256,9 +256,9 @@ export function NoteCreator() {
? false ? false
: // otherwise return selectedCustomRelays with target relay added / removed : // otherwise return selectedCustomRelays with target relay added / removed
a.filter(el => a.filter(el =>
el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el)
), )
), )
) )
} }
/> />

View File

@ -71,7 +71,7 @@ export default function NoteFooter(props: NoteFooterProps) {
}, },
{ {
captureEvent: true, captureEvent: true,
}, }
); );
function hasReacted(emoji: string) { function hasReacted(emoji: string) {

View File

@ -47,15 +47,15 @@ export default function Poll(props: PollProps) {
}, },
{ {
amount, amount,
}, }
), )
); );
} }
setVoting(opt); setVoting(opt);
const r = Object.keys(relays.item); const r = Object.keys(relays.item);
const zap = await publisher.zap(amount * 1000, props.ev.pubkey, r, props.ev.id, undefined, eb => const zap = await publisher.zap(amount * 1000, props.ev.pubkey, r, props.ev.id, undefined, eb =>
eb.tag(["poll_option", opt.toString()]), eb.tag(["poll_option", opt.toString()])
); );
const lnurl = props.ev.tags.find(a => a[0] === "zap")?.[1] || pollerProfile?.lud16 || pollerProfile?.lud06; const lnurl = props.ev.tags.find(a => a[0] === "zap")?.[1] || pollerProfile?.lud16 || pollerProfile?.lud06;
@ -68,7 +68,7 @@ export default function Poll(props: PollProps) {
throw new Error( throw new Error(
formatMessage({ formatMessage({
defaultMessage: "Can't vote because LNURL service does not support zaps", defaultMessage: "Can't vote because LNURL service does not support zaps",
}), })
); );
} }
@ -85,7 +85,7 @@ export default function Poll(props: PollProps) {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Failed to send vote", defaultMessage: "Failed to send vote",
}), })
); );
} }
} finally { } finally {

View File

@ -34,7 +34,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
pk, pk,
Object.keys(login.relays.item), Object.keys(login.relays.item),
undefined, undefined,
`Zap from ${hexToBech32("note", ev.id)}`, `Zap from ${hexToBech32("note", ev.id)}`
); );
const invoice = await svc.getInvoice(amtSend, undefined, zap); const invoice = await svc.getInvoice(amtSend, undefined, zap);
if (invoice.pr) { if (invoice.pr) {

View File

@ -55,9 +55,9 @@ export function ReBroadcaster() {
? false ? false
: // otherwise return selectedCustomRelays with target relay added / removed : // otherwise return selectedCustomRelays with target relay added / removed
a.filter(el => a.filter(el =>
el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el)
), )
), )
) )
} }
/> />

View File

@ -60,7 +60,7 @@ const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: Reactio
value: 3, value: 3,
}, },
] ]
: [], : []
); );
const [tab, setTab] = useState(tabs[0]); const [tab, setTab] = useState(tabs[0]);

View File

@ -22,7 +22,7 @@ export default function Relay(props: RelayProps) {
const navigate = useNavigate(); const navigate = useNavigate();
const login = useLogin(); const login = useLogin();
const relaySettings = unwrap( const relaySettings = unwrap(
login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {}, login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {}
); );
const state = useRelayState(props.addr); const state = useRelayState(props.addr);
const name = useMemo(() => getRelayName(props.addr), [props.addr]); const name = useMemo(() => getRelayName(props.addr), [props.addr]);
@ -34,7 +34,7 @@ export default function Relay(props: RelayProps) {
...login.relays.item, ...login.relays.item,
[props.addr]: o, [props.addr]: o,
}, },
unixNowMs(), unixNowMs()
); );
} }

View File

@ -285,7 +285,7 @@ export default function SendSats(props: SendSatsProps) {
{makeTab(ZapType.AnonZap, <FormattedMessage defaultMessage="Anon" description="Anonymous Zap" />)} {makeTab(ZapType.AnonZap, <FormattedMessage defaultMessage="Anon" description="Anonymous Zap" />)}
{makeTab( {makeTab(
ZapType.NonZap, ZapType.NonZap,
<FormattedMessage defaultMessage="Non-Zap" description="Non-Zap, Regular LN payment" />, <FormattedMessage defaultMessage="Non-Zap" description="Non-Zap, Regular LN payment" />
)} )}
</div> </div>
</> </>

View File

@ -243,7 +243,7 @@ export default function Thread() {
if (t?.root?.key === "a" && t?.root?.value) { if (t?.root?.key === "a" && t?.root?.value) {
const parsed = t.root.value.split(":"); const parsed = t.root.value.split(":");
replyTo = thread.data?.find( replyTo = thread.data?.find(
a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2]
)?.id; )?.id;
} }
if (replyTo) { if (replyTo) {
@ -264,7 +264,7 @@ export default function Thread() {
thread.data?.find( thread.data?.find(
ne => ne =>
ne.id === currentId || ne.id === currentId ||
(link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author), (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author)
) ?? (location.state && "sig" in location.state ? (location.state as TaggedNostrEvent) : undefined); ) ?? (location.state && "sig" in location.state ? (location.state as TaggedNostrEvent) : undefined);
if (currentNote) { if (currentNote) {
const currentThread = EventExt.extractThread(currentNote); const currentThread = EventExt.extractThread(currentNote);
@ -280,7 +280,7 @@ export default function Thread() {
if (replyTo.key === "a" && replyTo.value) { if (replyTo.key === "a" && replyTo.value) {
const parsed = replyTo.value.split(":"); const parsed = replyTo.value.split(":");
return thread.data?.find( return thread.data?.find(
a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2]
); );
} }
if (replyTo.value) { if (replyTo.value) {
@ -348,7 +348,7 @@ export default function Thread() {
notes={replies} notes={replies}
related={getAllReactions( related={getAllReactions(
thread.data, thread.data,
replies.map(a => a.id), replies.map(a => a.id)
)} )}
chains={chains} chains={chains}
onNavigate={navigateThread} onNavigate={navigateThread}

View File

@ -47,7 +47,7 @@ const Timeline = (props: TimelineProps) => {
?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true))
.filter(a => props.ignoreModeration || !isMuted(a.pubkey)); .filter(a => props.ignoreModeration || !isMuted(a.pubkey));
}, },
[props.postsOnly, muted, props.ignoreModeration], [props.postsOnly, muted, props.ignoreModeration]
); );
const mainFeed = useMemo(() => { const mainFeed = useMemo(() => {
@ -60,7 +60,7 @@ const Timeline = (props: TimelineProps) => {
(id: u256) => { (id: u256) => {
return (feed.related ?? []).filter(a => findTag(a, "e") === id); return (feed.related ?? []).filter(a => findTag(a, "e") === id);
}, },
[feed.related], [feed.related]
); );
const liveStreams = useMemo(() => { const liveStreams = useMemo(() => {
return (feed.main ?? []).filter(a => a.kind === EventKind.LiveEvent && findTag(a, "status") === "live"); return (feed.main ?? []).filter(a => a.kind === EventKind.LiveEvent && findTag(a, "status") === "live");

View File

@ -28,11 +28,11 @@ const TimelineFollows = (props: TimelineFollowsProps) => {
const [latest, setLatest] = useState(unixNow()); const [latest, setLatest] = useState(unixNow());
const feed = useSyncExternalStore( const feed = useSyncExternalStore(
cb => FollowsFeed.hook(cb, "*"), cb => FollowsFeed.hook(cb, "*"),
() => FollowsFeed.snapshot(), () => FollowsFeed.snapshot()
); );
const reactions = useReactions( const reactions = useReactions(
"follows-feed-reactions", "follows-feed-reactions",
feed.map(a => a.id), feed.map(a => a.id)
); );
const system = useContext(SnortContext); const system = useContext(SnortContext);
const login = useLogin(); const login = useLogin();
@ -48,7 +48,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => {
?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true))
.filter(a => !isMuted(a.pubkey) && login.follows.item.includes(a.pubkey)); .filter(a => !isMuted(a.pubkey) && login.follows.item.includes(a.pubkey));
}, },
[props.postsOnly, muted, login.follows.timestamp], [props.postsOnly, muted, login.follows.timestamp]
); );
const mainFeed = useMemo(() => { const mainFeed = useMemo(() => {
@ -63,7 +63,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => {
(id: u256) => { (id: u256) => {
return (reactions?.data ?? []).filter(a => findTag(a, "e") === id); return (reactions?.data ?? []).filter(a => findTag(a, "e") === id);
}, },
[reactions], [reactions]
); );
const liveStreams = useMemo(() => { const liveStreams = useMemo(() => {

View File

@ -17,7 +17,7 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) {
ev.tags.find(a => a[0] === "d")?.[1] ?? "", ev.tags.find(a => a[0] === "d")?.[1] ?? "",
undefined, undefined,
ev.kind, ev.kind,
ev.pubkey, ev.pubkey
); );
return ( return (
<> <>

View File

@ -23,7 +23,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
if (profileBadges.data) { if (profileBadges.data) {
return chunks( return chunks(
profileBadges.data.tags.filter(t => t[0] === "a" || t[0] === "e"), profileBadges.data.tags.filter(t => t[0] === "a" || t[0] === "e"),
2, 2
).reduce((acc, [a, e]) => { ).reduce((acc, [a, e]) => {
return { return {
...acc, ...acc,
@ -44,7 +44,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
} }
return acc; return acc;
}, },
{ pubkeys: [], ds: [] } as BadgeAwards, { pubkeys: [], ds: [] } as BadgeAwards
) as BadgeAwards; ) as BadgeAwards;
}, [profile]); }, [profile]);
@ -77,7 +77,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
}) })
.filter( .filter(
({ award, badge }) => ({ award, badge }) =>
badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey), badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey)
) )
.map(({ badge }) => unwrap(badge)); .map(({ badge }) => unwrap(badge));
} }

View File

@ -13,7 +13,7 @@ export function useReactions(subId: string, ids: Array<string>, others?: (rb: Re
.kinds( .kinds(
pref.enableReactions pref.enableReactions
? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt] ? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt]
: [EventKind.ZapReceipt, EventKind.Repost], : [EventKind.ZapReceipt, EventKind.Repost]
) )
.tag("e", ids); .tag("e", ids);
} }

View File

@ -14,7 +14,7 @@ export default function useFollowersFeed(pubkey?: HexKey) {
const followers = useMemo(() => { const followers = useMemo(() => {
const contactLists = followersFeed.data?.filter( const contactLists = followersFeed.data?.filter(
a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey), a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey)
); );
return [...new Set(contactLists?.map(a => a.pubkey))]; return [...new Set(contactLists?.map(a => a.pubkey))];
}, [followersFeed, pubkey]); }, [followersFeed, pubkey]);

View File

@ -85,7 +85,7 @@ export default function useLoginFeed() {
Nip4Chats.onEvent(loginFeed.data); Nip4Chats.onEvent(loginFeed.data);
const subs = loginFeed.data.filter( const subs = loginFeed.data.filter(
a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey), a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey)
); );
Promise.all( Promise.all(
subs.map(async a => { subs.map(async a => {
@ -97,7 +97,7 @@ export default function useLoginFeed() {
...ex, ...ex,
} as SubscriptionEvent; } as SubscriptionEvent;
} }
}), })
).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap))); ).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap)));
} }
}, [loginFeed, publisher]); }, [loginFeed, publisher]);
@ -106,7 +106,7 @@ export default function useLoginFeed() {
useEffect(() => { useEffect(() => {
if (loginFeed.data) { if (loginFeed.data) {
const replies = loginFeed.data.filter( const replies = loginFeed.data.filter(
a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications, a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications
); );
replies.forEach(async nx => { replies.forEach(async nx => {
const n = await makeNotification(nx); const n = await makeNotification(nx);

View File

@ -35,11 +35,11 @@ export default function useThreadFeed(link: NostrLink) {
.kinds( .kinds(
pref.enableReactions pref.enableReactions
? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt] ? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt]
: [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost], : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost]
) )
.tag( .tag(
"e", "e",
allEvents.map(a => a.id), allEvents.map(a => a.id)
); );
} }
if (trackingATags.length > 0) { if (trackingATags.length > 0) {
@ -50,7 +50,7 @@ export default function useThreadFeed(link: NostrLink) {
.authors(parsed.map(a => a[1])) .authors(parsed.map(a => a[1]))
.tag( .tag(
"d", "d",
parsed.map(a => a[2]), parsed.map(a => a[2])
); );
sub.withFilter().tag("a", trackingATags); sub.withFilter().tag("a", trackingATags);
} }
@ -85,7 +85,7 @@ export default function useThreadFeed(link: NostrLink) {
id: b[1], id: b[1],
relay: b[2], relay: b[2],
}; };
}), })
) )
.flat(); .flat();
const eTagsMissing = eTags.filter(a => !mainNotes.some(b => b.id === a.id)); const eTagsMissing = eTags.filter(a => !mainNotes.some(b => b.id === a.id));

View File

@ -43,7 +43,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
.kinds( .kinds(
subject.type === "profile_keyword" subject.type === "profile_keyword"
? [EventKind.SetMetadata] ? [EventKind.SetMetadata]
: [EventKind.TextNote, EventKind.Repost, EventKind.Polls], : [EventKind.TextNote, EventKind.Repost, EventKind.Polls]
); );
if (subject.relay) { if (subject.relay) {
@ -149,7 +149,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
.map(a => unwrap(a)[1]); .map(a => unwrap(a)[1]);
const repostsByKind1 = main.data const repostsByKind1 = main.data
.filter( .filter(
a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a)), a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a))
) )
.map(a => a.tags.find(tagFilterOfTextRepost(a))) .map(a => a.tags.find(tagFilterOfTextRepost(a)))
.filter(a => a) .filter(a => a)

View File

@ -21,7 +21,7 @@ export default function useImgProxy() {
const result = hmacSha256( const result = hmacSha256(
utils.hexToBytes(unwrap(settings).key), utils.hexToBytes(unwrap(settings).key),
utils.hexToBytes(unwrap(settings).salt), utils.hexToBytes(unwrap(settings).salt),
te.encode(u), te.encode(u)
); );
return urlSafe(base64.encode(result)); return urlSafe(base64.encode(result));
} }

View File

@ -15,7 +15,7 @@ export function useInteractionCache(pubkey?: HexKey, event?: u256) {
const data = const data =
useSyncExternalStore( useSyncExternalStore(
c => InteractionCache.hook(c, id), c => InteractionCache.hook(c, id),
() => InteractionCache.snapshot().find(a => a.id === id), () => InteractionCache.snapshot().find(a => a.id === id)
) || EmptyInteraction; ) || EmptyInteraction;
return { return {
data: data, data: data,

View File

@ -4,6 +4,6 @@ import { useSyncExternalStore } from "react";
export default function useLogin() { export default function useLogin() {
return useSyncExternalStore( return useSyncExternalStore(
s => LoginStore.hook(s), s => LoginStore.hook(s),
() => LoginStore.snapshot(), () => LoginStore.snapshot()
); );
} }

View File

@ -96,7 +96,7 @@ export class MultiAccountStore extends ExternalStore<LoginSession> {
type: LoginSessionType, type: LoginSessionType,
relays?: Record<string, RelaySettings>, relays?: Record<string, RelaySettings>,
remoteSignerRelays?: Array<string>, remoteSignerRelays?: Array<string>,
privateKey?: string, privateKey?: string
) { ) {
if (this.#accounts.has(key)) { if (this.#accounts.has(key)) {
throw new Error("Already logged in with this pubkey"); throw new Error("Already logged in with this pubkey");

View File

@ -97,7 +97,7 @@ export class ServiceProvider {
path: string, path: string,
method?: "GET" | string, method?: "GET" | string,
body?: unknown, body?: unknown,
headers?: { [key: string]: string }, headers?: { [key: string]: string }
): Promise<T | ServiceError> { ): Promise<T | ServiceError> {
try { try {
const rsp = await fetch(`${this.url}${path}`, { const rsp = await fetch(`${this.url}${path}`, {

View File

@ -54,7 +54,7 @@ export default class SnortServiceProvider extends ServiceProvider {
path: string, path: string,
method?: "GET" | string, method?: "GET" | string,
body?: unknown, body?: unknown,
headers?: { [key: string]: string }, headers?: { [key: string]: string }
): Promise<T | ServiceError> { ): Promise<T | ServiceError> {
const auth = await this.#publisher.generic(eb => { const auth = await this.#publisher.generic(eb => {
eb.kind(EventKind.HttpAuthentication); eb.kind(EventKind.HttpAuthentication);

View File

@ -25,7 +25,7 @@ const ErrorPage = () => {
{JSON.stringify( {JSON.stringify(
error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : error, error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : error,
undefined, undefined,
" ", " "
)} )}
</pre> </pre>
} }

View File

@ -89,7 +89,7 @@ export default function Layout() {
useEffect(() => { useEffect(() => {
const osTheme = window.matchMedia("(prefers-color-scheme: light)"); const osTheme = window.matchMedia("(prefers-color-scheme: light)");
setTheme( setTheme(
preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark", preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark"
); );
osTheme.onchange = e => { osTheme.onchange = e => {
@ -174,7 +174,7 @@ const AccountHeader = () => {
const hasNotifications = useMemo( const hasNotifications = useMemo(
() => latestNotification > readNotifications, () => latestNotification > readNotifications,
[latestNotification, readNotifications], [latestNotification, readNotifications]
); );
const unreadDms = useMemo(() => (publicKey ? 0 : 0), [publicKey]); const unreadDms = useMemo(() => (publicKey ? 0 : 0), [publicKey]);

View File

@ -55,7 +55,7 @@ const Artwork: Array<ArtworkEntry> = [
export async function getNip05PubKey(addr: string): Promise<string> { export async function getNip05PubKey(addr: string): Promise<string> {
const [username, domain] = addr.split("@"); const [username, domain] = addr.split("@");
const rsp = await fetch( const rsp = await fetch(
`https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}`, `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}`
); );
if (rsp.ok) { if (rsp.ok) {
const data = await rsp.json(); const data = await rsp.json();
@ -103,7 +103,7 @@ export default function LoginPage() {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown login error", defaultMessage: "Unknown login error",
}), })
); );
} }
console.error(e); console.error(e);

View File

@ -75,7 +75,7 @@ export default function NotificationsPage() {
const notifications = useSyncExternalStore( const notifications = useSyncExternalStore(
c => Notifications.hook(c, "*"), c => Notifications.hook(c, "*"),
() => Notifications.snapshot(), () => Notifications.snapshot()
); );
const timeKey = (ev: NostrEvent) => { const timeKey = (ev: NostrEvent) => {
@ -119,7 +119,7 @@ function NotificationGroup({ evs }: { evs: Array<TaggedNostrEvent> }) {
return zap.anonZap ? "anon" : zap.sender ?? a.pubkey; return zap.anonZap ? "anon" : zap.sender ?? a.pubkey;
} }
return a.pubkey; return a.pubkey;
}), })
); );
const firstPubkey = pubkeys[0]; const firstPubkey = pubkeys[0];
const firstPubkeyProfile = useUserProfile(inView ? (firstPubkey === "anon" ? "" : firstPubkey) : ""); const firstPubkeyProfile = useUserProfile(inView ? (firstPubkey === "anon" ? "" : firstPubkey) : "");
@ -213,7 +213,7 @@ function NotificationGroup({ evs }: { evs: Array<TaggedNostrEvent> }) {
pubkeys.length - 1, pubkeys.length - 1,
firstPubkey === "anon" firstPubkey === "anon"
? formatMessage({ defaultMessage: "Anon" }) ? formatMessage({ defaultMessage: "Anon" })
: getDisplayName(firstPubkeyProfile, firstPubkey), : getDisplayName(firstPubkeyProfile, firstPubkey)
)} )}
</div> </div>
)} )}

View File

@ -221,7 +221,7 @@ export default function ProfilePage() {
} as { [key: string]: Tab }; } as { [key: string]: Tab };
const [tab, setTab] = useState<Tab>(ProfileTab.Notes); const [tab, setTab] = useState<Tab>(ProfileTab.Notes);
const optionalTabs = [ProfileTab.Zaps, ProfileTab.Relays, ProfileTab.Bookmarks, ProfileTab.Muted].filter(a => const optionalTabs = [ProfileTab.Zaps, ProfileTab.Relays, ProfileTab.Bookmarks, ProfileTab.Muted].filter(a =>
unwrap(a), unwrap(a)
) as Tab[]; ) as Tab[];
const horizontalScroll = useHorizontalScroll(); const horizontalScroll = useHorizontalScroll();
@ -433,7 +433,7 @@ export default function ProfilePage() {
type: TLVEntryType.Author, type: TLVEntryType.Author,
length: 64, length: 64,
value: id, value: id,
})}`, })}`
) )
}> }>
<Icon name="envelope" size={16} /> <Icon name="envelope" size={16} />

View File

@ -73,7 +73,7 @@ export default function ZapPoolPage() {
const login = useLogin(); const login = useLogin();
const zapPool = useSyncExternalStore( const zapPool = useSyncExternalStore(
c => ZapPoolController.hook(c), c => ZapPoolController.hook(c),
() => ZapPoolController.snapshot(), () => ZapPoolController.snapshot()
); );
const { wallet } = useWallet(); const { wallet } = useWallet();

View File

@ -27,7 +27,7 @@ export default function AccountsPage() {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown login error", defaultMessage: "Unknown login error",
}), })
); );
} }
console.error(e); console.error(e);

View File

@ -29,7 +29,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Invalid LNURL", defaultMessage: "Invalid LNURL",
}), })
); );
return; return;
} }

View File

@ -39,7 +39,7 @@ const ConnectCashu = () => {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown error", defaultMessage: "Unknown error",
}), })
); );
} }
} }

View File

@ -32,7 +32,7 @@ const ConnectLNC = () => {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown error", defaultMessage: "Unknown error",
}), })
); );
} }
} }

View File

@ -37,7 +37,7 @@ const ConnectLNDHub = () => {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown error", defaultMessage: "Unknown error",
}), })
); );
} }
} }

View File

@ -37,7 +37,7 @@ const ConnectNostrWallet = () => {
setError( setError(
formatMessage({ formatMessage({
defaultMessage: "Unknown error", defaultMessage: "Unknown error",
}), })
); );
} }
} }

View File

@ -88,7 +88,7 @@ export default class SnortApi {
path: string, path: string,
method?: "GET" | string, method?: "GET" | string,
body?: { [key: string]: string }, body?: { [key: string]: string },
headers?: { [key: string]: string }, headers?: { [key: string]: string }
): Promise<T> { ): Promise<T> {
if (!this.#publisher) { if (!this.#publisher) {
throw new Error("Publisher not set"); throw new Error("Publisher not set");
@ -110,7 +110,7 @@ export default class SnortApi {
path: string, path: string,
method?: "GET" | string, method?: "GET" | string,
body?: { [key: string]: string }, body?: { [key: string]: string },
headers?: { [key: string]: string }, headers?: { [key: string]: string }
): Promise<T> { ): Promise<T> {
const rsp = await fetch(`${this.#url}${path}`, { const rsp = await fetch(`${this.#url}${path}`, {
method: method, method: method,

View File

@ -50,7 +50,7 @@ export async function openFile(): Promise<File | undefined> {
} }
}, 300); }, 300);
}, },
{ once: true }, { once: true }
); );
}); });
} }
@ -209,7 +209,7 @@ export function dedupeByPubkey(events: TaggedNostrEvent[]) {
list: [...list, ev], list: [...list, ev],
}; };
}, },
{ list: [], seen: new Set([]) }, { list: [], seen: new Set([]) }
); );
return deduped.list as TaggedNostrEvent[]; return deduped.list as TaggedNostrEvent[];
} }
@ -226,7 +226,7 @@ export function dedupeById<T extends { id: string }>(events: Array<T>) {
list: [...list, ev], list: [...list, ev],
}; };
}, },
{ list: [], seen: new Set([]) }, { list: [], seen: new Set([]) }
); );
return deduped.list as Array<T>; return deduped.list as Array<T>;
} }
@ -487,7 +487,7 @@ export function kvToObject<T>(o: string, sep?: string) {
return [match[1], match[2]]; return [match[1], match[2]];
} }
return []; return [];
}), })
) as T; ) as T;
} }

View File

@ -39,7 +39,7 @@ export const Toastore = new ToasterSlots();
export default function Toaster() { export default function Toaster() {
const toast = useSyncExternalStore( const toast = useSyncExternalStore(
c => Toastore.hook(c), c => Toastore.hook(c),
() => Toastore.snapshot(), () => Toastore.snapshot()
); );
return ( return (

View File

@ -12,7 +12,7 @@ import { magnetURIDecode } from "SnortUtils";
export default async function VoidCatUpload( export default async function VoidCatUpload(
file: File | Blob, file: File | Blob,
filename: string, filename: string,
publisher?: EventPublisher, publisher?: EventPublisher
): Promise<UploadResult> { ): Promise<UploadResult> {
const api = new VoidApi(VoidCatHost); const api = new VoidApi(VoidCatHost);
const uploader = api.getUploader(file); const uploader = api.getUploader(file);

View File

@ -57,6 +57,6 @@ export interface NutStashBackup {
mints: [ mints: [
{ {
mintURL: string; mintURL: string;
}, }
]; ];
} }

View File

@ -126,7 +126,7 @@ export class LNCWallet implements LNWallet {
err => { err => {
this.#log(err); this.#log(err);
reject(err); reject(err);
}, }
); );
}); });
} }

View File

@ -182,7 +182,7 @@ export class NostrConnectWallet implements LNWallet {
], ],
() => { () => {
// ignored // ignored
}, }
); );
await this.#conn.SendAsync(evCommand); await this.#conn.SendAsync(evCommand);
return await new Promise<T>((resolve, reject) => { return await new Promise<T>((resolve, reject) => {

View File

@ -84,7 +84,7 @@ export class WebLNWallet implements LNWallet {
await window.webln?.makeInvoice({ await window.webln?.makeInvoice({
amount: req.amount, amount: req.amount,
defaultMemo: req.memo, defaultMemo: req.memo,
}), })
); );
if (rsp) { if (rsp) {
const invoice = prToWalletInvoice(rsp.paymentRequest); const invoice = prToWalletInvoice(rsp.paymentRequest);

View File

@ -248,7 +248,7 @@ window.document.addEventListener("close", () => {
export function useWallet() { export function useWallet() {
const wallet = useSyncExternalStore<WalletStoreSnapshot>( const wallet = useSyncExternalStore<WalletStoreSnapshot>(
h => Wallets.hook(h), h => Wallets.hook(h),
() => Wallets.snapshot(), () => Wallets.snapshot()
); );
useEffect(() => { useEffect(() => {
if (wallet.wallet?.isReady() === false && wallet.wallet.canAutoLogin()) { if (wallet.wallet?.isReady() === false && wallet.wallet.canAutoLogin()) {

View File

@ -54,7 +54,7 @@ class ZapPool extends ExternalStore<Array<ZapPoolRecipient>> {
Toastore.push({ Toastore.push({
element: `Sent ${amtSend.toLocaleString()} sats to ${getDisplayName( element: `Sent ${amtSend.toLocaleString()} sats to ${getDisplayName(
profile, profile,
x.pubkey, x.pubkey
)} from your zap pool`, )} from your zap pool`,
expire: unixNow() + 10, expire: unixNow() + 10,
icon: "zap", icon: "zap",

View File

@ -51,7 +51,7 @@ const testGetDiff = (q: QueryOptimizer) => {
kinds: [1, 2, 3, 4, 5], kinds: [1, 2, 3, 4, 5],
authors: randomPubkeys, authors: randomPubkeys,
}, },
], ]
); );
}; };
const testFlatMerge = (q: QueryOptimizer) => { const testFlatMerge = (q: QueryOptimizer) => {
@ -59,7 +59,7 @@ const testFlatMerge = (q: QueryOptimizer) => {
q.expandFilter({ q.expandFilter({
kinds: [1, 6, 7, 6969], kinds: [1, 6, 7, 6969],
authors: randomPubkeys, authors: randomPubkeys,
}), })
); );
}; };
const testCompress = (q: QueryOptimizer) => { const testCompress = (q: QueryOptimizer) => {

View File

@ -116,7 +116,7 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author, type: TLVEntryType.Author,
length: params[0].length, length: params[0].length,
value: params[0], value: params[0],
} as TLVEntry, } as TLVEntry
)}`; )}`;
} }
case ChatType.PrivateDirectMessage: { case ChatType.PrivateDirectMessage: {
@ -127,7 +127,7 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author, type: TLVEntryType.Author,
length: params[0].length, length: params[0].length,
value: params[0], value: params[0],
} as TLVEntry, } as TLVEntry
)}`; )}`;
} }
case ChatType.PrivateGroupChat: { case ChatType.PrivateGroupChat: {
@ -139,8 +139,8 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author, type: TLVEntryType.Author,
length: a.length, length: a.length,
value: a, value: a,
}) as TLVEntry, } as TLVEntry)
), )
)}`; )}`;
} }
} }
@ -161,14 +161,14 @@ export function useNip4Chat() {
const { publicKey } = useLogin(); const { publicKey } = useLogin();
return useSyncExternalStore( return useSyncExternalStore(
c => Nip4Chats.hook(c), c => Nip4Chats.hook(c),
() => Nip4Chats.snapshot(publicKey), () => Nip4Chats.snapshot(publicKey)
); );
} }
export function useNip29Chat() { export function useNip29Chat() {
return useSyncExternalStore( return useSyncExternalStore(
c => Nip29Chats.hook(c), c => Nip29Chats.hook(c),
() => Nip29Chats.snapshot(), () => Nip29Chats.snapshot()
); );
} }
@ -176,7 +176,7 @@ export function useNip24Chat() {
const { publicKey } = useLogin(); const { publicKey } = useLogin();
return useSyncExternalStore( return useSyncExternalStore(
c => Nip24Chats.hook(c), c => Nip24Chats.hook(c),
() => Nip24Chats.snapshot(publicKey), () => Nip24Chats.snapshot(publicKey)
); );
} }

View File

@ -39,8 +39,8 @@ export class Nip24ChatSystem extends ExternalStore<Array<Chat>> implements ChatS
value: v, value: v,
type: TLVEntryType.Author, type: TLVEntryType.Author,
length: v.length, length: v.length,
}) as TLVEntry, } as TLVEntry)
), )
); );
}; };
return dedupe(messages.map(a => chatId(a))).map(a => { return dedupe(messages.map(a => chatId(a))).map(a => {
@ -72,7 +72,7 @@ export class Nip24ChatSystem extends ExternalStore<Array<Chat>> implements ChatS
} as { } as {
t: number; t: number;
title: string | undefined; title: string | undefined;
}, }
); );
return { return {
type: ChatType.PrivateDirectMessage, type: ChatType.PrivateDirectMessage,

View File

@ -46,12 +46,12 @@ export class Nip29ChatSystem extends ExternalStore<Array<Chat>> implements ChatS
.map(a => a.tags.find(b => b[0] === "g")) .map(a => a.tags.find(b => b[0] === "g"))
.filter(a => a !== undefined) .filter(a => a !== undefined)
.map(a => unwrap(a)) .map(a => unwrap(a))
.map(a => `${a[2]}${a[1]}`), .map(a => `${a[2]}${a[1]}`)
); );
return groups.map(g => { return groups.map(g => {
const [relay, channel] = g.split("/", 2); const [relay, channel] = g.split("/", 2);
const messages = allMessages.filter( const messages = allMessages.filter(
a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g, a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g
); );
const lastRead = lastReadInChat(g); const lastRead = lastReadInChat(g);
return { return {

View File

@ -34,7 +34,7 @@ export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSy
const dms = this.#cache.snapshot(); const dms = this.#cache.snapshot();
const dmSince = dms.reduce( const dmSince = dms.reduce(
(acc, v) => (v.created_at > acc && v.kind === EventKind.DirectMessage ? (acc = v.created_at) : acc), (acc, v) => (v.created_at > acc && v.kind === EventKind.DirectMessage ? (acc = v.created_at) : acc),
0, 0
); );
this.#log("Loading DMS since %s", new Date(dmSince * 1000)); this.#log("Loading DMS since %s", new Date(dmSince * 1000));
@ -49,15 +49,12 @@ export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSy
listChats(pk: string): Chat[] { listChats(pk: string): Chat[] {
const myDms = this.#nip4Events(); const myDms = this.#nip4Events();
const chats = myDms.reduce( const chats = myDms.reduce((acc, v) => {
(acc, v) => { const chatId = inChatWith(v, pk);
const chatId = inChatWith(v, pk); acc[chatId] ??= [];
acc[chatId] ??= []; acc[chatId].push(v);
acc[chatId].push(v); return acc;
return acc; }, {} as Record<string, Array<NostrEvent>>);
},
{} as Record<string, Array<NostrEvent>>,
);
return [...Object.entries(chats)].map(([k, v]) => Nip4ChatSystem.createChatObj(k, v)); return [...Object.entries(chats)].map(([k, v]) => Nip4ChatSystem.createChatObj(k, v));
} }

View File

@ -202,5 +202,5 @@ root.render(
</SnortContext.Provider> </SnortContext.Provider>
</IntlProvider> </IntlProvider>
</Provider> </Provider>
</StrictMode>, </StrictMode>
); );

View File

@ -90,10 +90,10 @@
"BGCM48": "Write access to Snort relay, with 1 year of event retention", "BGCM48": "Write access to Snort relay, with 1 year of event retention",
"BOUMjw": "No nostr users found for {twitterUsername}", "BOUMjw": "No nostr users found for {twitterUsername}",
"BOr9z/": "Snort is an open source project built by passionate people in their free time", "BOr9z/": "Snort is an open source project built by passionate people in their free time",
"BWpuKl": "Update", "BWpuKl": "Yenilə",
"BcGMo+": "Notes hold text content, the most popular usage of these notes is to store \"tweet like\" messages.", "BcGMo+": "Notes hold text content, the most popular usage of these notes is to store \"tweet like\" messages.",
"C5xzTC": "Premium", "C5xzTC": "Premium",
"C81/uG": "Logout", "C81/uG": "Çıxış",
"C8HhVE": "Suggested Follows", "C8HhVE": "Suggested Follows",
"CHTbO3": "Failed to load invoice", "CHTbO3": "Failed to load invoice",
"CVWeJ6": "Trending People", "CVWeJ6": "Trending People",

View File

@ -1,17 +1,17 @@
{ {
"+D82kt": "Sind Sie sicher, dass Sie {id} teilen möchten?", "+D82kt": "Bist du sicher, dass du {id} teilen möchtest?",
"+PzQ9Y": "Jetzt auszahlen", "+PzQ9Y": "Jetzt auszahlen",
"+Vxixo": "Geheimer Gruppenchat", "+Vxixo": "Geheimer Gruppenchat",
"+aZY2h": "Zap Typ", "+aZY2h": "Zap Typ",
"+vA//S": "Anmeldungen", "+vA//S": "Anmeldungen",
"+vIQlC": "Bitte speichern Sie dieses Passwort, um in der Zukunft Ihren Benutzernamen verwalten zu können", "+vIQlC": "Bitte sichere dir das folgende Passwort, um dein Handle in Zukunft verwalten zu können",
"+vVZ/G": "Verbinden", "+vVZ/G": "Verbinden",
"+xliwN": "{name} hat gerepostet", "+xliwN": "{name} hat gerepostet",
"/4tOwT": "Überspringen", "/4tOwT": "Überspringen",
"/JE/X+": "Konto Hilfe", "/JE/X+": "Konto Hilfe",
"/PCavi": "Öffentlich", "/PCavi": "Öffentlich",
"/RD0e2": "Nostr nutzt digitale Signaturen, um manipulationssichere Notes zu erstellen, welche sicher auf viele Relays repliziert werden können, um eine redundante Speicherung deiner Inhalte zu bieten.", "/RD0e2": "Nostr nutzt digitale Signaturen, um manipulationssichere Notes zu erstellen, welche sicher auf viele Relays repliziert werden können, um eine redundante Speicherung deiner Inhalte zu bieten.",
"/d6vEc": "Machen Sie Ihr Profil einfacher auffind- und teilbar", "/d6vEc": "Mach dein Profil leichter zu finden und zu teilen",
"/n5KSF": "{n} ms", "/n5KSF": "{n} ms",
"00LcfG": "Mehr laden", "00LcfG": "Mehr laden",
"08zn6O": "Schlüssel exportieren", "08zn6O": "Schlüssel exportieren",
@ -25,7 +25,7 @@
"1R43+L": "Nostr Wallet Connect Konfiguration eingeben", "1R43+L": "Nostr Wallet Connect Konfiguration eingeben",
"1c4YST": "Verbunden mit: {node}🎉", "1c4YST": "Verbunden mit: {node}🎉",
"1iQ8GN": "Vorschau ein/aus", "1iQ8GN": "Vorschau ein/aus",
"1nYUGC": "{n} folgen", "1nYUGC": "{n} Folgen",
"1udzha": "Unterhaltungen", "1udzha": "Unterhaltungen",
"2/2yg+": "Hinzufügen", "2/2yg+": "Hinzufügen",
"25V4l1": "Banner", "25V4l1": "Banner",
@ -39,20 +39,20 @@
"3gOsZq": "Übersetzer", "3gOsZq": "Übersetzer",
"3qnJlS": "Du stimmst mit {amount} sats ab", "3qnJlS": "Du stimmst mit {amount} sats ab",
"3t3kok": "{n,plural,one {}=1{{n} neues Event} other{{n} neue Events}}", "3t3kok": "{n,plural,one {}=1{{n} neues Event} other{{n} neue Events}}",
"3tVy+Z": "{n} Folgende", "3tVy+Z": "{n} Follower",
"3xCwbZ": "oder", "3xCwbZ": "oder",
"3yk8fB": "Wallet", "3yk8fB": "Wallet",
"450Fty": "Keine", "450Fty": "Keine",
"47FYwb": "Abbrechen", "47FYwb": "Abbrechen",
"4IPzdn": "Primäre Entwickler", "4IPzdn": "Primäre Entwickler",
"4L2vUY": "Dein neuer NIP-05 Name ist:", "4L2vUY": "Dein neuer NIP-05-Handle ist:",
"4OB335": "Gefällt nicht", "4OB335": "Gefällt nicht",
"4Vmpt4": "Nostr Plebs ist einer der ersten NIP-05 Anbieter und bietet eine gute Auswahl von Domains zu fairen Preisen", "4Vmpt4": "Nostr Plebs ist einer der ersten NIP-05 Anbieter und bietet eine gute Auswahl von Domains zu fairen Preisen",
"4Z3t5i": "Verwende imgproxy um Bilder zu komprimieren", "4Z3t5i": "Verwende imgproxy um Bilder zu komprimieren",
"4rYCjn": "Notiz an mich selbst", "4rYCjn": "Notiz an mich selbst",
"5JcXdV": "Benutzerkonto anlegen", "5JcXdV": "Konto erstellen",
"5oTnfy": "Handle kaufen", "5oTnfy": "Handle kaufen",
"5rOdPG": "Sobald Sie Ihre Schlüssel-Manager-Erweiterung eingerichtet haben und einen Schlüssel generiert haben, können Sie unserem neuen Setup Prozess folgen, um Ihr Profil einzurichten und ein paar interessante Profile zu entdecken.", "5rOdPG": "Sobald du deine Erweiterung für die Schlüsselverwaltung eingerichtet und einen Schlüssel generiert hast, kannst du unserem Prozess für neue Benutzer folgen, um dein Profil einzurichten und einige interessante Leute auf Nostr zu finden, denen du folgen kannst.",
"5u6iEc": "An öffentlichen Schlüssel übertragen", "5u6iEc": "An öffentlichen Schlüssel übertragen",
"5vMmmR": "Benutzernamen sind auf Nostr nicht einzigartig. Die Nostr-Adresse ist deine eindeutige, menschenlesbare Adresse, die dir bei der Registrierung eindeutig zugeordnet ist.", "5vMmmR": "Benutzernamen sind auf Nostr nicht einzigartig. Die Nostr-Adresse ist deine eindeutige, menschenlesbare Adresse, die dir bei der Registrierung eindeutig zugeordnet ist.",
"5ykRmX": "Zap senden", "5ykRmX": "Zap senden",
@ -74,7 +74,7 @@
"9SvQep": "Folgt {n}", "9SvQep": "Folgt {n}",
"9WRlF4": "Senden", "9WRlF4": "Senden",
"9gqH2W": "Anmelden", "9gqH2W": "Anmelden",
"9pMqYs": "Nostr Adresse", "9pMqYs": "Nostr-Adresse",
"9wO4wJ": "Lightning Zahlungsanforderung", "9wO4wJ": "Lightning Zahlungsanforderung",
"ADmfQT": "Vorherige", "ADmfQT": "Vorherige",
"AGNz71": "Zap {n} sats an Alle", "AGNz71": "Zap {n} sats an Alle",
@ -109,7 +109,7 @@
"DtYelJ": "Transferieren", "DtYelJ": "Transferieren",
"E8a4yq": "Folgen Sie einigen beliebten Konten", "E8a4yq": "Folgen Sie einigen beliebten Konten",
"ELbg9p": "Datenanbieter", "ELbg9p": "Datenanbieter",
"EPYwm7": "Ihr Privatschlüssel ist ihr Passwort. Falls Sie Ihn verlieren, werden Sie den Zugriff zu Ihrem Konto verlieren! Bewahren Sie ihn an einem sicheren Ort auf. Es gibt keine Wiederherstellungsmöglichkeit für Ihren Privatschlüssel.", "EPYwm7": "Dein privater Schlüssel ist dein Passwort. Wenn du diesen Schlüssel verlierst, hast du keinen Zugang mehr zu deinem Konto! Kopiere ihn und bewahre ihn an einem sicheren Ort auf. Es gibt keine Möglichkeit, deinen privaten Schlüssel wiederherzustellen.",
"EWyQH5": "Global", "EWyQH5": "Global",
"Ebl/B2": "Auf {lang} Übersetzen", "Ebl/B2": "Auf {lang} Übersetzen",
"EcZF24": "Benutzerdefinierte Relays", "EcZF24": "Benutzerdefinierte Relays",
@ -117,10 +117,10 @@
"EnCOBJ": "Kaufen", "EnCOBJ": "Kaufen",
"Eqjl5K": "Nur Snort und unsere integrierten Partner bieten farbige Domainnamen als NIP-05 Kennzeichen. Sie können aber auch gerne andere Dienste nutzen.", "Eqjl5K": "Nur Snort und unsere integrierten Partner bieten farbige Domainnamen als NIP-05 Kennzeichen. Sie können aber auch gerne andere Dienste nutzen.",
"F+B3x1": "Wir sind auch eine Partnerschaft mit nostrplebs.com eingegangen, um Ihnen mehr Optionen anbieten zu können.", "F+B3x1": "Wir sind auch eine Partnerschaft mit nostrplebs.com eingegangen, um Ihnen mehr Optionen anbieten zu können.",
"F3l7xL": "Benutzerkonto hinzufügen", "F3l7xL": "Konto hinzufügen",
"FDguSC": "{n} Zaps", "FDguSC": "{n} Zaps",
"FP+D3H": "LNURL zum Weiterleiten der Zaps", "FP+D3H": "LNURL zum Weiterleiten der Zaps",
"FS3b54": "Feritg!", "FS3b54": "Fertig!",
"FSYL8G": "Angesagte Benutzer", "FSYL8G": "Angesagte Benutzer",
"FdhSU2": "Jetzt abholen", "FdhSU2": "Jetzt abholen",
"FfYsOb": "Ein Fehler ist aufgetreten!", "FfYsOb": "Ein Fehler ist aufgetreten!",
@ -130,10 +130,10 @@
"GFOoEE": "Salt", "GFOoEE": "Salt",
"GL8aXW": "Lesezeichen ({n})", "GL8aXW": "Lesezeichen ({n})",
"GSye7T": "Lightning-Adresse", "GSye7T": "Lightning-Adresse",
"GUlSVG": "Beanspruche deine enthaltene Snort Nostr Adresse", "GUlSVG": "Beanspruche deine enthaltene Snort Nostr-Adresse",
"Gcn9NQ": "Magnet Link", "Gcn9NQ": "Magnet Link",
"GspYR7": "{n} Gefällt nicht", "GspYR7": "{n} Gefällt nicht",
"H+vHiz": "Hex Schlüssel..", "H+vHiz": "Hex-Schlüssel...",
"H0JBH6": "Abmelden", "H0JBH6": "Abmelden",
"H6/kLh": "Bestellung bezahlt!", "H6/kLh": "Bestellung bezahlt!",
"HAlOn1": "Name", "HAlOn1": "Name",
@ -145,7 +145,7 @@
"IDjHJ6": "Danke für die Verwendung von Snort. Wir würden uns über eine Spende freuen.", "IDjHJ6": "Danke für die Verwendung von Snort. Wir würden uns über eine Spende freuen.",
"IEwZvs": "Sind sie sicher, dass sie diese Notiz entpinnen möchten?", "IEwZvs": "Sind sie sicher, dass sie diese Notiz entpinnen möchten?",
"IKKHqV": "Folgt", "IKKHqV": "Folgt",
"INSqIz": "Twitter Benuzername...", "INSqIz": "Twitter-Benutzername...",
"IUZC+0": "Das bedeutet, dass niemand die von dir erstellten Notes ändern kann und jeder kann leicht überprüfen, ob die Note, die er liest, von dir erstellt wurde.", "IUZC+0": "Das bedeutet, dass niemand die von dir erstellten Notes ändern kann und jeder kann leicht überprüfen, ob die Note, die er liest, von dir erstellt wurde.",
"Ig9/a1": "Sende {n} sats an {name}", "Ig9/a1": "Sende {n} sats an {name}",
"Ix8l+B": "Angesagte Notes", "Ix8l+B": "Angesagte Notes",
@ -174,7 +174,7 @@
"MBAYRO": "Zeigt \"ID kopieren\" und \"Event JSON kopieren\" im Kontextmenu jeder Nachricht an", "MBAYRO": "Zeigt \"ID kopieren\" und \"Event JSON kopieren\" im Kontextmenu jeder Nachricht an",
"MI2jkA": "Nicht verfügbar:", "MI2jkA": "Nicht verfügbar:",
"MP54GY": "Wallet Passwort", "MP54GY": "Wallet Passwort",
"MRp6Ly": "Twitter Benutzername", "MRp6Ly": "Twitter-Benutzername",
"MWTx65": "Standardseite", "MWTx65": "Standardseite",
"Mrpkot": "Abonnement bezahlen", "Mrpkot": "Abonnement bezahlen",
"MuVeKe": "Nostr-Adresse kaufen", "MuVeKe": "Nostr-Adresse kaufen",
@ -203,7 +203,7 @@
"PrsIg7": "Reaktionen werden auf jeder Seite angezeigt, wenn Reaktionen deaktiviert sind, werden sie nicht angezeigt", "PrsIg7": "Reaktionen werden auf jeder Seite angezeigt, wenn Reaktionen deaktiviert sind, werden sie nicht angezeigt",
"QDFTjG": "{n} Relais", "QDFTjG": "{n} Relais",
"QWhotP": "Zap Pool funktioniert nur, wenn du eine der unterstützten Wallet-Verbindungen verwenden (WebLN, LNC, LNDHub oder Nostr Wallet Connect)", "QWhotP": "Zap Pool funktioniert nur, wenn du eine der unterstützten Wallet-Verbindungen verwenden (WebLN, LNC, LNDHub oder Nostr Wallet Connect)",
"QawghE": "Sie können Ihren Benutzernamen jederzeit ändern.", "QawghE": "Du kannst deinen Benutzernamen jederzeit ändern.",
"QxCuTo": "Kunst von {name}", "QxCuTo": "Kunst von {name}",
"Qxv0B2": "Du hast aktuell {number} sats in deinem Zap Pool.", "Qxv0B2": "Du hast aktuell {number} sats in deinem Zap Pool.",
"R/6nsx": "Abonnement", "R/6nsx": "Abonnement",
@ -217,10 +217,10 @@
"RoOyAh": "Relais", "RoOyAh": "Relais",
"Rs4kCE": "Lesezeichen", "Rs4kCE": "Lesezeichen",
"RwFaYs": "Sortieren", "RwFaYs": "Sortieren",
"SOqbe9": "Lightning Adresse aktualisieren", "SOqbe9": "Lightning-Adresse aktualisieren",
"SP0+yi": "Abonnement kaufen", "SP0+yi": "Abonnement kaufen",
"SX58hM": "Kopieren", "SX58hM": "Kopieren",
"SYQtZ7": "LN Adresse Proxy", "SYQtZ7": "LN-Adressen-Proxy",
"ShdEie": "Alle als gelesen markieren", "ShdEie": "Alle als gelesen markieren",
"Sjo1P4": "Benutzerdefiniert", "Sjo1P4": "Benutzerdefiniert",
"Ss0sWu": "Jetzt bezahlen", "Ss0sWu": "Jetzt bezahlen",
@ -255,7 +255,7 @@
"XzF0aC": "Schlüssel-Manager-Erweiterungen sind sicherer und erlauben es Ihnen, sich ganz einfach bei jedem Nostr-Client anzumelden. Hier sind einige bekannte Erweiterungen:", "XzF0aC": "Schlüssel-Manager-Erweiterungen sind sicherer und erlauben es Ihnen, sich ganz einfach bei jedem Nostr-Client anzumelden. Hier sind einige bekannte Erweiterungen:",
"Y31HTH": "Unterstütze die Entwicklung von Snort", "Y31HTH": "Unterstütze die Entwicklung von Snort",
"YDURw6": "URL des Dienstes", "YDURw6": "URL des Dienstes",
"YXA3AH": "Reaktionen einschalten", "YXA3AH": "Reaktionen aktivieren",
"Z0FDj+": "Abonniere Snort {plan} für {price} und erhalte folgende Belohnungen", "Z0FDj+": "Abonniere Snort {plan} für {price} und erhalte folgende Belohnungen",
"Z4BMCZ": "Verbindungs-Passphrase eingeben", "Z4BMCZ": "Verbindungs-Passphrase eingeben",
"ZKORll": "Jetzt aktivieren", "ZKORll": "Jetzt aktivieren",
@ -266,14 +266,14 @@
"a7TDNm": "Notes werden in Echtzeit in Global- und Notes-Tab gestreamt", "a7TDNm": "Notes werden in Echtzeit in Global- und Notes-Tab gestreamt",
"aWpBzj": "Mehr anzeigen", "aWpBzj": "Mehr anzeigen",
"b12Goz": "Mnemonik", "b12Goz": "Mnemonik",
"b5vAk0": "Dein Handle ist wie eine Lightning-Adresse leitet dich zu deiner gewählten LNURL oder Lightning-Adresse weiter", "b5vAk0": "Dein Handle ist wie eine Lightning-Adresse und leitet dich zu deiner gewählten LNURL oder Lightning-Adresse weiter",
"bQdA2k": "Empfindlicher Inhalt", "bQdA2k": "Empfindlicher Inhalt",
"bep9C3": "Öffentlicher Schlüssel", "bep9C3": "Öffentlicher Schlüssel",
"bfvyfs": "Anon", "bfvyfs": "Anon",
"brAXSu": "Wählen Sie einen Benutzernamen", "brAXSu": "Wählen Sie einen Benutzernamen",
"bxv59V": "Gerade eben", "bxv59V": "Gerade eben",
"c+oiJe": "Erweiterung installieren", "c+oiJe": "Erweiterung installieren",
"c35bj2": "Wenn Sie eine Frage zu Ihrer NIP-05-Bestellung haben, wenden Sie sich bitte per Direktnachricht an {link}", "c35bj2": "Wenn du eine Anfrage zu deiner NIP-05-Bestellung hast, schreibe bitte eine DM an {link}",
"c3g2hL": "Erneut verbreiten", "c3g2hL": "Erneut verbreiten",
"cFbU1B": "Du benutzt Alby? Gehe zu {link} um deine NWC Konfiguration zu erhalten!", "cFbU1B": "Du benutzt Alby? Gehe zu {link} um deine NWC Konfiguration zu erhalten!",
"cPIKU2": "Folge ich", "cPIKU2": "Folge ich",
@ -284,7 +284,7 @@
"cuV2gK": "Name ist registriert", "cuV2gK": "Name ist registriert",
"cyR7Kh": "Zurück", "cyR7Kh": "Zurück",
"d6CyG5": "Verlauf", "d6CyG5": "Verlauf",
"d7d0/x": "LN Adresse", "d7d0/x": "LN-Adresse",
"dOQCL8": "Anzeigename", "dOQCL8": "Anzeigename",
"e61Jf3": "Kommt bald", "e61Jf3": "Kommt bald",
"e7qqly": "Alle als gelesen markieren", "e7qqly": "Alle als gelesen markieren",
@ -295,14 +295,14 @@
"fBI91o": "Zap", "fBI91o": "Zap",
"fOksnD": "Abstimmung nicht möglich, da der LNURL-Dienst keine Zaps unterstützt", "fOksnD": "Abstimmung nicht möglich, da der LNURL-Dienst keine Zaps unterstützt",
"fWZYP5": "Angeheftet", "fWZYP5": "Angeheftet",
"filwqD": "Gelesen", "filwqD": "Lesen",
"flnGvv": "Was ist gerade los?", "flnGvv": "Was ist gerade los?",
"fsB/4p": "Gespeichert", "fsB/4p": "Gespeichert",
"g5pX+a": "Über uns", "g5pX+a": "Über mich",
"g985Wp": "Fehler beim Senden der Bewertung", "g985Wp": "Fehler beim Senden der Bewertung",
"gBdUXk": "Speicher deine Schlüssel!", "gBdUXk": "Speicher deine Schlüssel!",
"gDZkld": "Snort ist eine Nostr Benutzeroberfläche, Nostr ist ein dezentralisiertes Protokoll zur Distribution von \"Notes\" (Text).", "gDZkld": "Snort ist eine Nostr Benutzeroberfläche, Nostr ist ein dezentralisiertes Protokoll zur Distribution von \"Notes\" (Text).",
"gDzDRs": "Emoji, das gesendet werden soll, wenn auf eine Notiz reagiert wird", "gDzDRs": "Emoji, das gesendet werden soll, wenn auf eine Note reagiert wird",
"gXgY3+": "Nicht alle Clients unterstützen das", "gXgY3+": "Nicht alle Clients unterstützen das",
"gczcC5": "Abonnieren", "gczcC5": "Abonnieren",
"gjBiyj": "Lädt...", "gjBiyj": "Lädt...",
@ -319,12 +319,12 @@
"iDGAbc": "Holen dir einen Snort Identifikator", "iDGAbc": "Holen dir einen Snort Identifikator",
"iEoXYx": "DeepL Übersetzungen", "iEoXYx": "DeepL Übersetzungen",
"iGT1eE": "Verhindere, dass gefälschte Konten dich imitieren", "iGT1eE": "Verhindere, dass gefälschte Konten dich imitieren",
"iNWbVV": "Name", "iNWbVV": "Handle",
"iUsU2x": "Mint: {url}", "iUsU2x": "Mint: {url}",
"iXPL0Z": "Anmeldung mit privatem Schlüssel bei einer unsicheren Verbindung nicht möglich, bitte verwenden Sie stattdessen eine Nostr Schlüssel Manager Erweiterung", "iXPL0Z": "Anmeldung mit privatem Schlüssel bei einer unsicheren Verbindung nicht möglich, bitte verwenden Sie stattdessen eine Nostr Schlüssel Manager Erweiterung",
"ieGrWo": "Folgen", "ieGrWo": "Folgen",
"itPgxd": "Profil", "itPgxd": "Profil",
"izWS4J": "Nicht mehr folgen", "izWS4J": "Entfolgen",
"jA3OE/": "{n,plural,one {}=1{{n} sat} other{{n} sats}}", "jA3OE/": "{n,plural,one {}=1{{n} sat} other{{n} sats}}",
"jCA7Cw": "Vorschau auf Snort", "jCA7Cw": "Vorschau auf Snort",
"jMzO1S": "Interner Fehler: {msg}", "jMzO1S": "Interner Fehler: {msg}",
@ -333,7 +333,7 @@
"jvo0vs": "Speichern", "jvo0vs": "Speichern",
"jzgQ2z": "{n} Reaktionen", "jzgQ2z": "{n} Reaktionen",
"k2veDA": "Schreiben", "k2veDA": "Schreiben",
"k7sKNy": "Unser eigener NIP-05-Verifizierungsdienst unterstützt die Entwicklung dieser Website und gibt Ihnen ein glänzendes Sonderabzeichen auf unserer Webseite!", "k7sKNy": "Unser eigener NIP-05-Verifizierungsdienst unterstützt die Entwicklung dieser Website. Unterstütze uns und erhalte ein Sonderabzeichen für deine Webseite!",
"kJYo0u": "{n,plural,=0{{name} hat gerepostet} other{{name} & {n} andere haben gerepostet}}", "kJYo0u": "{n,plural,=0{{name} hat gerepostet} other{{name} & {n} andere haben gerepostet}}",
"kaaf1E": "jetzt", "kaaf1E": "jetzt",
"kuPHYE": "{n,plural,=0{{name} gefällt das} other{{name} & {n} anderen gefällt das}}", "kuPHYE": "{n,plural,=0{{name} gefällt das} other{{name} & {n} anderen gefällt das}}",
@ -341,7 +341,7 @@
"lBboHo": "Wenn du ein paar andere ausprobieren möchtest, besuche {link} für mehr!", "lBboHo": "Wenn du ein paar andere ausprobieren möchtest, besuche {link} für mehr!",
"lCILNz": "Jetzt kaufen", "lCILNz": "Jetzt kaufen",
"lD3+8a": "Bezahlen", "lD3+8a": "Bezahlen",
"lPWASz": "Snort Nostr Adresse", "lPWASz": "Snort Nostr-Adresse",
"lTbT3s": "Wallet Passwort", "lTbT3s": "Wallet Passwort",
"lgg1KN": "Kontoseite", "lgg1KN": "Kontoseite",
"ll3xBp": "Bild Proxy Dienst", "ll3xBp": "Bild Proxy Dienst",
@ -364,7 +364,7 @@
"nn1qb3": "Deine Spenden werden sehr geschätzt", "nn1qb3": "Deine Spenden werden sehr geschätzt",
"nwZXeh": "{n} blockiert", "nwZXeh": "{n} blockiert",
"o6Uy3d": "Nur der Privatschlüssel kann genutzt werden um zu veröffentlichen (Events signieren), alles andere wird im schreibgeschützten Modus geladen.", "o6Uy3d": "Nur der Privatschlüssel kann genutzt werden um zu veröffentlichen (Events signieren), alles andere wird im schreibgeschützten Modus geladen.",
"o7e+nJ": "{n} Folgende", "o7e+nJ": "{n} Follower",
"oJ+JJN": "Keine Treffer :/", "oJ+JJN": "Keine Treffer :/",
"odFwjL": "Nur für Folgende", "odFwjL": "Nur für Folgende",
"odhABf": "Anmelden", "odhABf": "Anmelden",
@ -375,8 +375,8 @@
"p85Uwy": "Aktive Abonnements", "p85Uwy": "Aktive Abonnements",
"pI+77w": "Herunterladbare Backups von Snort Relais", "pI+77w": "Herunterladbare Backups von Snort Relais",
"puLNUJ": "Pin", "puLNUJ": "Pin",
"pzTOmv": "Folgende", "pzTOmv": "Follower",
"qD9EUF": "E-Mail <> DM Brücke für deine Snort Nostr Adresse", "qD9EUF": "E-Mail <> DM Brücke für deine Snort Nostr-Adresse",
"qDwvZ4": "Unbekannter Fehler", "qDwvZ4": "Unbekannter Fehler",
"qMx1sA": "Standard Zap Betrag", "qMx1sA": "Standard Zap Betrag",
"qUJTsT": "Blockiert", "qUJTsT": "Blockiert",
@ -393,7 +393,7 @@
"rrfdTe": "Dies ist die gleiche Technologie, die auch von Bitcoin verwendet wird, und sich als äußerst sicher erwiesen hat.", "rrfdTe": "Dies ist die gleiche Technologie, die auch von Bitcoin verwendet wird, und sich als äußerst sicher erwiesen hat.",
"rudscU": "Abonnements konnten nicht geladen werden, bitte versuchen Sie es später erneut", "rudscU": "Abonnements konnten nicht geladen werden, bitte versuchen Sie es später erneut",
"sWnYKw": "Snort wurde darauf konzipiert ein Twitter ähnliches Erlebnis zu bieten.", "sWnYKw": "Snort wurde darauf konzipiert ein Twitter ähnliches Erlebnis zu bieten.",
"svOoEH": "Namesquatting und Nachahmung sind nicht erlaubt. Snort und unsere Partner behalten sich das Recht vor, Ihren Identifikator (nicht Ihr Konto, niemand kann Ihnen das wegnehmen) wegen Verstoßes gegen diese Regel zu kündigen.", "svOoEH": "Namens-Squatting und Impersonation sind nicht erlaubt. Snort und unsere Partner behalten sich das Recht vor, bei einem Verstoß gegen diese Regel dein Handle zu löschen (nicht dein Konto - das kann dir niemand wegnehmen).",
"tOdNiY": "Dunkel", "tOdNiY": "Dunkel",
"th5lxp": "Sende Note zu einer Untergruppe deiner Schreib-Relays", "th5lxp": "Sende Note zu einer Untergruppe deiner Schreib-Relays",
"thnRpU": "Eine NIP-05 Verifizierung kann helfen:", "thnRpU": "Eine NIP-05 Verifizierung kann helfen:",
@ -415,7 +415,7 @@
"wEQDC6": "Anpassen", "wEQDC6": "Anpassen",
"wLtRCF": "Dein Schlüssel", "wLtRCF": "Dein Schlüssel",
"wWLwvh": "Anon", "wWLwvh": "Anon",
"wYSD2L": "Nostr Adresse", "wYSD2L": "Nostr-Adresse",
"wih7iJ": "Name ist blockiert", "wih7iJ": "Name ist blockiert",
"wqyN/i": "Erfahren Sie mehr über {service} auf {link}", "wqyN/i": "Erfahren Sie mehr über {service} auf {link}",
"wtLjP6": "ID kopieren", "wtLjP6": "ID kopieren",
@ -431,7 +431,7 @@
"xhQMeQ": "Ablaufdatum", "xhQMeQ": "Ablaufdatum",
"xmcVZ0": "Suche", "xmcVZ0": "Suche",
"y1Z3or": "Sprache", "y1Z3or": "Sprache",
"yCLnBC": "LNURL oder Lightning Adresse", "yCLnBC": "LNURL oder Lightning-Adresse",
"yCmnnm": "Global lesen von", "yCmnnm": "Global lesen von",
"zFegDD": "Kontakt", "zFegDD": "Kontakt",
"zINlao": "Eigentümer", "zINlao": "Eigentümer",

View File

@ -5,10 +5,10 @@
"+aZY2h": "Type de Zap", "+aZY2h": "Type de Zap",
"+vA//S": "Connexions", "+vA//S": "Connexions",
"+vIQlC": "Assurez-vous d'enregistrer le mot de passe suivant afin de gérer votre identifiant à l'avenir", "+vIQlC": "Assurez-vous d'enregistrer le mot de passe suivant afin de gérer votre identifiant à l'avenir",
"+vVZ/G": "Connexion", "+vVZ/G": "Connecter",
"+xliwN": "{name} a reposté", "+xliwN": "{name} a reposté",
"/4tOwT": "Passer", "/4tOwT": "Passer",
"/JE/X+": "Prise en charge du compte", "/JE/X+": "Support de compte",
"/PCavi": "Publique", "/PCavi": "Publique",
"/RD0e2": "Nostr utilise la technologie de signature numérique pour fournir des notes inviolables qui peuvent être répliquées en toute sécurité sur de nombreux relais pour fournir un stockage redondant de votre contenu.", "/RD0e2": "Nostr utilise la technologie de signature numérique pour fournir des notes inviolables qui peuvent être répliquées en toute sécurité sur de nombreux relais pour fournir un stockage redondant de votre contenu.",
"/d6vEc": "Rendez votre profil plus facile à trouver et à partager", "/d6vEc": "Rendez votre profil plus facile à trouver et à partager",
@ -24,7 +24,7 @@
"1Mo59U": "Êtes-vous sûr de vouloir supprimer cette note de vos favoris ?", "1Mo59U": "Êtes-vous sûr de vouloir supprimer cette note de vos favoris ?",
"1R43+L": "Accéder à la configuration de Nostr Wallet Connect", "1R43+L": "Accéder à la configuration de Nostr Wallet Connect",
"1c4YST": "Connecté à : {node} 🎉", "1c4YST": "Connecté à : {node} 🎉",
"1iQ8GN": "Prévisualisation du changement de fenêtre", "1iQ8GN": "Activer/désactiver la prévisualisation",
"1nYUGC": "{n} Abonnements", "1nYUGC": "{n} Abonnements",
"1udzha": "Conversations", "1udzha": "Conversations",
"2/2yg+": "Ajouter", "2/2yg+": "Ajouter",
@ -49,14 +49,14 @@
"4OB335": "Ne pas aimer", "4OB335": "Ne pas aimer",
"4Vmpt4": "Nostr Plebs est l'un des premiers fournisseurs NIP-05 dans l'espace et offre une bonne collection de domaines à des prix raisonnables", "4Vmpt4": "Nostr Plebs est l'un des premiers fournisseurs NIP-05 dans l'espace et offre une bonne collection de domaines à des prix raisonnables",
"4Z3t5i": "Utiliser imgproxy pour compresser les images", "4Z3t5i": "Utiliser imgproxy pour compresser les images",
"4rYCjn": "Note pour moi-même", "4rYCjn": "Note à Soi-même",
"5JcXdV": "Créer un compte", "5JcXdV": "Créer un compte",
"5oTnfy": "Buy Handle", "5oTnfy": "Acheter Identifiant",
"5rOdPG": "Une fois que vous avez configuré votre extension de gestionnaire de clés et généré une clé, vous pouvez suivre notre flux d'utilisateurs pour configurer votre profil et vous aider à trouver des personnes intéressantes à suivre sur Nostr.", "5rOdPG": "Une fois que vous avez configuré votre extension de gestionnaire de clés et généré une clé, vous pouvez suivre notre flux d'utilisateurs pour configurer votre profil et vous aider à trouver des personnes intéressantes à suivre sur Nostr.",
"5u6iEc": "Transférer vers la clé publique", "5u6iEc": "Transférer vers la clé publique",
"5vMmmR": "Les noms d'utilisateur ne sont pas uniques sur Nostr. L'adresse nostr est votre adresse unique lisible par l'homme qui vous est unique lors de votre inscription.", "5vMmmR": "Les noms d'utilisateur ne sont pas uniques sur Nostr. L'adresse nostr est votre adresse unique lisible par l'homme qui vous est unique lors de votre inscription.",
"5ykRmX": "Envoyer zap", "5ykRmX": "Envoyer zap",
"65BmHb": "Failed to proxy image from {host}, click here to load directly", "65BmHb": "Échec du proxy de l'image de {host}, cliquez ici pour la charger directement",
"6Yfvvp": "Obtenir un identifiant", "6Yfvvp": "Obtenir un identifiant",
"6ewQqw": "Aime ({n})", "6ewQqw": "Aime ({n})",
"6uMqL1": "Non payé", "6uMqL1": "Non payé",
@ -64,7 +64,7 @@
"7BX/yC": "Changer de compte", "7BX/yC": "Changer de compte",
"7hp70g": "NIP-05", "7hp70g": "NIP-05",
"7xzTiH": "{action} à {target}", "7xzTiH": "{action} à {target}",
"8/vBbP": "Republie ({n})", "8/vBbP": "Reposte ({n})",
"89q5wc": "Confirmer la republication", "89q5wc": "Confirmer la republication",
"8QDesP": "Zapper {n} sats", "8QDesP": "Zapper {n} sats",
"8g2vyB": "le nom est trop long", "8g2vyB": "le nom est trop long",
@ -78,25 +78,25 @@
"9wO4wJ": "Facture Lightning", "9wO4wJ": "Facture Lightning",
"ADmfQT": "Parent", "ADmfQT": "Parent",
"AGNz71": "Zapper tous les sats {n}", "AGNz71": "Zapper tous les sats {n}",
"ASRK0S": "Cet auteur a été mis en sourdine", "ASRK0S": "Cet auteur a été rendu muet",
"Adk34V": "Configurer votre profil", "Adk34V": "Configurer votre profil",
"Ai8VHU": "Unlimited note retention on Snort relay", "Ai8VHU": "Conservation illimitée des notes sur le relais Snort",
"AkCxS/": "Raison", "AkCxS/": "Raison",
"AnLrRC": "Non-Zap", "AnLrRC": "Non-Zap",
"AyGauy": "Se Connecter", "AyGauy": "Se Connecter",
"B4C47Y": "le nom est trop court", "B4C47Y": "le nom est trop court",
"B6+XJy": "zappé", "B6+XJy": "zappé",
"B6H7eJ": "nsec, npub, nip-05, hex", "B6H7eJ": "nsec, npub, nip-05, hex",
"BGCM48": "Write access to Snort relay, with 1 year of event retention", "BGCM48": "Accès en écriture au relais Snort, avec conservation des évènements pendant 1 an",
"BOUMjw": "Aucun utilisateur nostr trouvé pour {twitterUsername}", "BOUMjw": "Aucun utilisateur nostr trouvé pour {twitterUsername}",
"BOr9z/": "Snort est un projet open source construit par des passionnés pendant leur temps libre", "BOr9z/": "Snort est un projet open source construit par des passionnés pendant leur temps libre",
"BWpuKl": "Update", "BWpuKl": "Actualiser",
"BcGMo+": "Les notes contiennent du texte, l'utilisation la plus courante de ces notes est de stocker des messages similaires à des tweets.", "BcGMo+": "Les notes contiennent du texte, l'utilisation la plus courante de ces notes est de stocker des messages similaires à des tweets.",
"C5xzTC": "Premium", "C5xzTC": "Premium",
"C81/uG": "Se déconnecter", "C81/uG": "Se déconnecter",
"C8HhVE": "Suggested Follows", "C8HhVE": "Utilisateurs recommandés",
"CHTbO3": "Échec du chargement de la facture", "CHTbO3": "Échec du chargement de la facture",
"CVWeJ6": "Personnes en tendance", "CVWeJ6": "Personnes tendances",
"CmZ9ls": "{n} Mis en sourdine", "CmZ9ls": "{n} Mis en sourdine",
"CsCUYo": "{n} sats", "CsCUYo": "{n} sats",
"Cu/K85": "Traduit de {lang}", "Cu/K85": "Traduit de {lang}",
@ -108,21 +108,21 @@
"Dh3hbq": "Zap automatique", "Dh3hbq": "Zap automatique",
"DtYelJ": "Transférer", "DtYelJ": "Transférer",
"E8a4yq": "Suivez quelques comptes populaires", "E8a4yq": "Suivez quelques comptes populaires",
"ELbg9p": "Data Providers", "ELbg9p": "Fournisseurs de données",
"EPYwm7": "Votre clé privée est votre mot de passe. Si vous perdez cette clé, vous perdrez l&#39;accès à votre compte ! Copiez-le et conservez-le en lieu sûr. Il n&#39;y a aucun moyen de réinitialiser votre clé privée.", "EPYwm7": "Votre clé privée est votre mot de passe. Si vous perdez cette clé, vous perdrez l&#39;accès à votre compte ! Copiez-le et conservez-le en lieu sûr. Il n&#39;y a aucun moyen de réinitialiser votre clé privée.",
"EWyQH5": "Global", "EWyQH5": "Global",
"Ebl/B2": "Traduire en {lang}", "Ebl/B2": "Traduire en {lang}",
"EcZF24": "Relais personnalisés", "EcZF24": "Relais personnalisés",
"EcglP9": "Clé", "EcglP9": "Clé",
"EnCOBJ": "Acheter", "EnCOBJ": "Acheter",
"Eqjl5K": "Seuls Snort et notre identifiant de partenaire d&#39;intégration vous donnent un nom de domaine coloré, mais vous pouvez également utiliser d&#39;autres services.", "Eqjl5K": "Seul Snort et l'identifiant de notre partenaire d'intégration vous donnent un nom de domaine coloré, mais vous pouvez également utiliser d'autres services.",
"F+B3x1": "Nous nous sommes également associés à nosrplebs.com pour vous offrir plus d&#39;options", "F+B3x1": "Nous nous sommes également associés à nosrplebs.com pour vous offrir plus d'options",
"F3l7xL": "Ajouter un Compte", "F3l7xL": "Ajouter un Compte",
"FDguSC": "{n} Zaps", "FDguSC": "{n} Zaps",
"FP+D3H": "LNRURL où transférer les Zap", "FP+D3H": "LNURL où transférer les Zap",
"FS3b54": "Fait!", "FS3b54": "Fait!",
"FSYL8G": "Utilisateurs en tendance", "FSYL8G": "Utilisateurs tendances",
"FdhSU2": "Réclamer maintenant", "FdhSU2": "Obtenir maintenant",
"FfYsOb": "Une erreur est survenue!", "FfYsOb": "Une erreur est survenue!",
"FmXUJg": "vous suit", "FmXUJg": "vous suit",
"G/yZLu": "Retirer", "G/yZLu": "Retirer",
@ -144,13 +144,13 @@
"HbefNb": "Ouvrir le Wallet", "HbefNb": "Ouvrir le Wallet",
"IDjHJ6": "Merci d'utiliser Snort, envisagez de faire un don si vous pouvez.", "IDjHJ6": "Merci d'utiliser Snort, envisagez de faire un don si vous pouvez.",
"IEwZvs": "Êtes-vous sûr de vouloir désépingler cette note?", "IEwZvs": "Êtes-vous sûr de vouloir désépingler cette note?",
"IKKHqV": "Follows", "IKKHqV": "Abonnements",
"INSqIz": "Nom d&#39;utilisateur Twitter...", "INSqIz": "Nom d'utilisateur Twitter...",
"IUZC+0": "Cela signifie que personne ne peut modifier les notes que vous avez créées et que tout le monde peut facilement vérifier que les notes qu&#39;ils lisent sont créées par vous.", "IUZC+0": "Cela signifie que personne ne peut modifier les notes que vous avez créées et que tout le monde peut facilement vérifier que les notes qu&#39;ils lisent sont créées par vous.",
"Ig9/a1": "Sent {n} sats to {name}", "Ig9/a1": "Envoyé {n} sats à {name}",
"Ix8l+B": "Notes en tendances", "Ix8l+B": "Notes tendances",
"J+dIsA": "Abonnements", "J+dIsA": "Abonnements",
"JCIgkj": "Nom d&#39;utilisateur", "JCIgkj": "Nom dutilisateur",
"JHEHCk": "Zaps ({n})", "JHEHCk": "Zaps ({n})",
"JPFYIM": "Aucune adresse Lightning", "JPFYIM": "Aucune adresse Lightning",
"JeoS4y": "Reposter", "JeoS4y": "Reposter",
@ -164,25 +164,25 @@
"KQvWvD": "Supprimé", "KQvWvD": "Supprimé",
"KWuDfz": "J'ai enregistré mes clés, continuer", "KWuDfz": "J'ai enregistré mes clés, continuer",
"KahimY": "Type d'événement inconnu : {kind}", "KahimY": "Type d'événement inconnu : {kind}",
"KoFlZg": "Enter mint URL", "KoFlZg": "Saisir l'URL de mint",
"LF5kYT": "Autres Connexions", "LF5kYT": "Autres Connexions",
"LXxsbk": "Anonyme", "LXxsbk": "Anonyme",
"LgbKvU": "Commenter", "LgbKvU": "Commenter",
"Lu5/Bj": "Ouvrir avec Zapstr", "Lu5/Bj": "Ouvrir avec Zapstr",
"Lw+I+J": "{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}", "Lw+I+J": "{n,plural,=0{{name} a zappé} other{{name} & {n} autres ont zappé}}",
"M3Oirc": "Menus de débogage", "M3Oirc": "Menus de débogage",
"MBAYRO": "Affiche \"Copy ID\" et \"Copy Event JSON\" dans le menu contextuel de chaque message", "MBAYRO": "Affiche \"Copy ID\" et \"Copy Event JSON\" dans le menu contextuel de chaque message",
"MI2jkA": "Pas disponible:", "MI2jkA": "Pas disponible:",
"MP54GY": "Mot de passe du portefeuille", "MP54GY": "Mot de passe du portefeuille",
"MRp6Ly": "Nom d&#39;utilisateur Twitter", "MRp6Ly": "Nom d&#39;utilisateur Twitter",
"MWTx65": "Page par défaut", "MWTx65": "Page par défaut",
"Mrpkot": "Pay for subscription", "Mrpkot": "Payer pour l'abonnement",
"MuVeKe": "Acheter une adresse nostr", "MuVeKe": "Acheter une adresse nostr",
"MzRYWH": "Acheter {item}", "MzRYWH": "Acheter {item}",
"N2IrpM": "Confirmer", "N2IrpM": "Confirmer",
"NAuFNH": "You already have a subscription of this type, please renew or pay", "NAuFNH": "Vous avez déjà un abonnement de ce type, veuillez renouveler ou payer",
"NNSu3d": "Import Twitter Follows", "NNSu3d": "Importer des abonnements Twitter",
"NdOYJJ": "Hmm rien ici .. Essayez {newUsersPage} pour suivre quelques recommandations de naustriches!", "NdOYJJ": "Hmm rien ici.. Essayez {newUsersPage} pour suivre quelques recommandations de nostriches!",
"NepkXH": "Impossible de voter avec {amount} sats, veuillez définir un autre montant zap par défaut", "NepkXH": "Impossible de voter avec {amount} sats, veuillez définir un autre montant zap par défaut",
"NfNk2V": "Votre clé privée", "NfNk2V": "Votre clé privée",
"NndBJE": "Page des nouveaux utilisateurs", "NndBJE": "Page des nouveaux utilisateurs",
@ -202,10 +202,10 @@
"Pe0ogR": "Thème", "Pe0ogR": "Thème",
"PrsIg7": "Les réactions seront affichées sur chaque page, si désactivées aucune réaction ne sera affichée", "PrsIg7": "Les réactions seront affichées sur chaque page, si désactivées aucune réaction ne sera affichée",
"QDFTjG": "{n} Relais", "QDFTjG": "{n} Relais",
"QWhotP": "Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)", "QWhotP": "Zap Pool ne fonctionne que si vous utilisez l'une des connexions de portefeuille supportées (WebLN, LNC, LNDHub ou Nostr Wallet Connect)",
"QawghE": "Vous pouvez modifier votre nom d'utilisateur à tout moment.", "QawghE": "Vous pouvez modifier votre nom d'utilisateur à tout moment.",
"QxCuTo": "Illustration par {name}", "QxCuTo": "Illustration par {name}",
"Qxv0B2": "You currently have {number} sats in your zap pool.", "Qxv0B2": "Vous avez actuellement {number} sats dans votre réserve de zap.",
"R/6nsx": "Abonnement", "R/6nsx": "Abonnement",
"R1fEdZ": "Zaps transféré", "R1fEdZ": "Zaps transféré",
"R81upa": "Personnes que vous suivez", "R81upa": "Personnes que vous suivez",
@ -224,7 +224,7 @@
"ShdEie": "Tout marquer comme lu", "ShdEie": "Tout marquer comme lu",
"Sjo1P4": "Personnaliser", "Sjo1P4": "Personnaliser",
"Ss0sWu": "Payer maintenant", "Ss0sWu": "Payer maintenant",
"TDR5ge": "Media in notes will automatically be shown for selected people, otherwise only the link will show", "TDR5ge": "Les médias dans les notes seront automatiquement affichés pour les personnes sélectionnées, sinon seul le lien sera affiché",
"TMfYfY": "Cashu token", "TMfYfY": "Cashu token",
"TpgeGw": "Sel Hex..", "TpgeGw": "Sel Hex..",
"Tpy00S": "Personnes", "Tpy00S": "Personnes",
@ -263,10 +263,10 @@
"ZUZedV": "Don éclair :", "ZUZedV": "Don éclair :",
"Zr5TMx": "Configurer le profil", "Zr5TMx": "Configurer le profil",
"a5UPxh": "Financer les développeurs et plateformes fournissant des services de vérification NIP-05", "a5UPxh": "Financer les développeurs et plateformes fournissant des services de vérification NIP-05",
"a7TDNm": "Notes will stream in real time into global and notes tab", "a7TDNm": "Les notes seront diffusées en temps réel dans l'onglet global et dans l'onglet notes",
"aWpBzj": "Montrer plus", "aWpBzj": "Montrer plus",
"b12Goz": "Mnémonique", "b12Goz": "Mnémonique",
"b5vAk0": "Your handle will act like a lightning address and will redirect to your chosen LNURL or Lightning address", "b5vAk0": "Votre identifiant agira comme une adresse Lightning et redirigera vers l'adresse LNURL ou Lightning de votre choix",
"bQdA2k": "Contenu sensible", "bQdA2k": "Contenu sensible",
"bep9C3": "Clé publique", "bep9C3": "Clé publique",
"bfvyfs": "Anonyme", "bfvyfs": "Anonyme",
@ -334,9 +334,9 @@
"jzgQ2z": "{n} Réactions", "jzgQ2z": "{n} Réactions",
"k2veDA": "Écrire", "k2veDA": "Écrire",
"k7sKNy": "Notre propre service de vérification NIP-05, aidez à soutenir le développement de ce site et obtenez un badge spécial brillant sur notre site !", "k7sKNy": "Notre propre service de vérification NIP-05, aidez à soutenir le développement de ce site et obtenez un badge spécial brillant sur notre site !",
"kJYo0u": "{n,plural,=0{{name} reposted} other{{name} & {n} others reposted}}", "kJYo0u": "{n,plural,=0{{name} a reposté} other{{name} & {n} autres ont reposté}}",
"kaaf1E": "maintenant", "kaaf1E": "maintenant",
"kuPHYE": "{n,plural,=0{{name} liked} other{{name} & {n} others liked}}", "kuPHYE": "{n,plural,=0{{name} a liké} other{{name} & {n} autres ont liké}}",
"l+ikU1": "Tout dans {plan}", "l+ikU1": "Tout dans {plan}",
"lBboHo": "Si vous voulez en essayer d'autres, consultez {link} pour en savoir plus!", "lBboHo": "Si vous voulez en essayer d'autres, consultez {link} pour en savoir plus!",
"lCILNz": "Acheter Maintenant", "lCILNz": "Acheter Maintenant",
@ -397,7 +397,7 @@
"tOdNiY": "Sombre", "tOdNiY": "Sombre",
"th5lxp": "Envoyer la note à un sous-ensemble de vos relais d'écriture", "th5lxp": "Envoyer la note à un sous-ensemble de vos relais d'écriture",
"thnRpU": "Obtenir la vérification NIP-05 peut aider :", "thnRpU": "Obtenir la vérification NIP-05 peut aider :",
"ttxS0b": "Supporter Badge", "ttxS0b": "Badge de Supporter",
"u/vOPu": "Payé", "u/vOPu": "Payé",
"u4bHcR": "Découvrez le code ici : {link}", "u4bHcR": "Découvrez le code ici : {link}",
"uD/N6c": "Zapper {target} {n} sats", "uD/N6c": "Zapper {target} {n} sats",