chore: Update translations
continuous-integration/drone/push Build is failing Details

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">
<head>
<meta charset="utf-8" />

View File

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

View File

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

View File

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

View File

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

View File

@ -261,7 +261,9 @@ export default function Nip5Service(props: Nip05ServiceProps) {
/>
&nbsp;@&nbsp;
<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>
</div>
)}

View File

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

View File

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

View File

@ -76,8 +76,8 @@ export function NoteCreator() {
setError(
formatMessage({
defaultMessage: "Invalid LNURL",
}),
),
})
)
);
return;
}
@ -256,9 +256,9 @@ export function NoteCreator() {
? false
: // otherwise return selectedCustomRelays with target relay added / removed
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,
},
}
);
function hasReacted(emoji: string) {

View File

@ -47,15 +47,15 @@ export default function Poll(props: PollProps) {
},
{
amount,
},
),
}
)
);
}
setVoting(opt);
const r = Object.keys(relays.item);
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;
@ -68,7 +68,7 @@ export default function Poll(props: PollProps) {
throw new Error(
formatMessage({
defaultMessage: "Can't vote because LNURL service does not support zaps",
}),
})
);
}
@ -85,7 +85,7 @@ export default function Poll(props: PollProps) {
setError(
formatMessage({
defaultMessage: "Failed to send vote",
}),
})
);
}
} finally {

View File

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

View File

@ -55,9 +55,9 @@ export function ReBroadcaster() {
? false
: // otherwise return selectedCustomRelays with target relay added / removed
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,
},
]
: [],
: []
);
const [tab, setTab] = useState(tabs[0]);

View File

@ -22,7 +22,7 @@ export default function Relay(props: RelayProps) {
const navigate = useNavigate();
const login = useLogin();
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 name = useMemo(() => getRelayName(props.addr), [props.addr]);
@ -34,7 +34,7 @@ export default function Relay(props: RelayProps) {
...login.relays.item,
[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.NonZap,
<FormattedMessage defaultMessage="Non-Zap" description="Non-Zap, Regular LN payment" />,
<FormattedMessage defaultMessage="Non-Zap" description="Non-Zap, Regular LN payment" />
)}
</div>
</>

View File

@ -243,7 +243,7 @@ export default function Thread() {
if (t?.root?.key === "a" && t?.root?.value) {
const parsed = t.root.value.split(":");
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;
}
if (replyTo) {
@ -264,7 +264,7 @@ export default function Thread() {
thread.data?.find(
ne =>
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);
if (currentNote) {
const currentThread = EventExt.extractThread(currentNote);
@ -280,7 +280,7 @@ export default function Thread() {
if (replyTo.key === "a" && replyTo.value) {
const parsed = replyTo.value.split(":");
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) {
@ -348,7 +348,7 @@ export default function Thread() {
notes={replies}
related={getAllReactions(
thread.data,
replies.map(a => a.id),
replies.map(a => a.id)
)}
chains={chains}
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.ignoreModeration || !isMuted(a.pubkey));
},
[props.postsOnly, muted, props.ignoreModeration],
[props.postsOnly, muted, props.ignoreModeration]
);
const mainFeed = useMemo(() => {
@ -60,7 +60,7 @@ const Timeline = (props: TimelineProps) => {
(id: u256) => {
return (feed.related ?? []).filter(a => findTag(a, "e") === id);
},
[feed.related],
[feed.related]
);
const liveStreams = useMemo(() => {
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 feed = useSyncExternalStore(
cb => FollowsFeed.hook(cb, "*"),
() => FollowsFeed.snapshot(),
() => FollowsFeed.snapshot()
);
const reactions = useReactions(
"follows-feed-reactions",
feed.map(a => a.id),
feed.map(a => a.id)
);
const system = useContext(SnortContext);
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 => !isMuted(a.pubkey) && login.follows.item.includes(a.pubkey));
},
[props.postsOnly, muted, login.follows.timestamp],
[props.postsOnly, muted, login.follows.timestamp]
);
const mainFeed = useMemo(() => {
@ -63,7 +63,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => {
(id: u256) => {
return (reactions?.data ?? []).filter(a => findTag(a, "e") === id);
},
[reactions],
[reactions]
);
const liveStreams = useMemo(() => {

View File

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

View File

@ -23,7 +23,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
if (profileBadges.data) {
return chunks(
profileBadges.data.tags.filter(t => t[0] === "a" || t[0] === "e"),
2,
2
).reduce((acc, [a, e]) => {
return {
...acc,
@ -44,7 +44,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
}
return acc;
},
{ pubkeys: [], ds: [] } as BadgeAwards,
{ pubkeys: [], ds: [] } as BadgeAwards
) as BadgeAwards;
}, [profile]);
@ -77,7 +77,7 @@ export default function useProfileBadges(pubkey?: HexKey) {
})
.filter(
({ 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));
}

View File

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

View File

@ -14,7 +14,7 @@ export default function useFollowersFeed(pubkey?: HexKey) {
const followers = useMemo(() => {
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))];
}, [followersFeed, pubkey]);

View File

@ -85,7 +85,7 @@ export default function useLoginFeed() {
Nip4Chats.onEvent(loginFeed.data);
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(
subs.map(async a => {
@ -97,7 +97,7 @@ export default function useLoginFeed() {
...ex,
} as SubscriptionEvent;
}
}),
})
).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap)));
}
}, [loginFeed, publisher]);
@ -106,7 +106,7 @@ export default function useLoginFeed() {
useEffect(() => {
if (loginFeed.data) {
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 => {
const n = await makeNotification(nx);

View File

@ -35,11 +35,11 @@ export default function useThreadFeed(link: NostrLink) {
.kinds(
pref.enableReactions
? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt]
: [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost],
: [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost]
)
.tag(
"e",
allEvents.map(a => a.id),
allEvents.map(a => a.id)
);
}
if (trackingATags.length > 0) {
@ -50,7 +50,7 @@ export default function useThreadFeed(link: NostrLink) {
.authors(parsed.map(a => a[1]))
.tag(
"d",
parsed.map(a => a[2]),
parsed.map(a => a[2])
);
sub.withFilter().tag("a", trackingATags);
}
@ -85,7 +85,7 @@ export default function useThreadFeed(link: NostrLink) {
id: b[1],
relay: b[2],
};
}),
})
)
.flat();
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(
subject.type === "profile_keyword"
? [EventKind.SetMetadata]
: [EventKind.TextNote, EventKind.Repost, EventKind.Polls],
: [EventKind.TextNote, EventKind.Repost, EventKind.Polls]
);
if (subject.relay) {
@ -149,7 +149,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
.map(a => unwrap(a)[1]);
const repostsByKind1 = main.data
.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)))
.filter(a => a)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -89,7 +89,7 @@ export default function Layout() {
useEffect(() => {
const osTheme = window.matchMedia("(prefers-color-scheme: light)");
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 => {
@ -174,7 +174,7 @@ const AccountHeader = () => {
const hasNotifications = useMemo(
() => latestNotification > readNotifications,
[latestNotification, readNotifications],
[latestNotification, readNotifications]
);
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> {
const [username, domain] = addr.split("@");
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) {
const data = await rsp.json();
@ -103,7 +103,7 @@ export default function LoginPage() {
setError(
formatMessage({
defaultMessage: "Unknown login error",
}),
})
);
}
console.error(e);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -116,7 +116,7 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author,
length: params[0].length,
value: params[0],
} as TLVEntry,
} as TLVEntry
)}`;
}
case ChatType.PrivateDirectMessage: {
@ -127,7 +127,7 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author,
length: params[0].length,
value: params[0],
} as TLVEntry,
} as TLVEntry
)}`;
}
case ChatType.PrivateGroupChat: {
@ -139,8 +139,8 @@ export function createChatLink(type: ChatType, ...params: Array<string>) {
type: TLVEntryType.Author,
length: a.length,
value: a,
}) as TLVEntry,
),
} as TLVEntry)
)
)}`;
}
}
@ -161,14 +161,14 @@ export function useNip4Chat() {
const { publicKey } = useLogin();
return useSyncExternalStore(
c => Nip4Chats.hook(c),
() => Nip4Chats.snapshot(publicKey),
() => Nip4Chats.snapshot(publicKey)
);
}
export function useNip29Chat() {
return useSyncExternalStore(
c => Nip29Chats.hook(c),
() => Nip29Chats.snapshot(),
() => Nip29Chats.snapshot()
);
}
@ -176,7 +176,7 @@ export function useNip24Chat() {
const { publicKey } = useLogin();
return useSyncExternalStore(
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,
type: TLVEntryType.Author,
length: v.length,
}) as TLVEntry,
),
} as TLVEntry)
)
);
};
return dedupe(messages.map(a => chatId(a))).map(a => {
@ -72,7 +72,7 @@ export class Nip24ChatSystem extends ExternalStore<Array<Chat>> implements ChatS
} as {
t: number;
title: string | undefined;
},
}
);
return {
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"))
.filter(a => a !== undefined)
.map(a => unwrap(a))
.map(a => `${a[2]}${a[1]}`),
.map(a => `${a[2]}${a[1]}`)
);
return groups.map(g => {
const [relay, channel] = g.split("/", 2);
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);
return {

View File

@ -34,7 +34,7 @@ export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSy
const dms = this.#cache.snapshot();
const dmSince = dms.reduce(
(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));
@ -49,15 +49,12 @@ export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSy
listChats(pk: string): Chat[] {
const myDms = this.#nip4Events();
const chats = myDms.reduce(
(acc, v) => {
const chatId = inChatWith(v, pk);
acc[chatId] ??= [];
acc[chatId].push(v);
return acc;
},
{} as Record<string, Array<NostrEvent>>,
);
const chats = myDms.reduce((acc, v) => {
const chatId = inChatWith(v, pk);
acc[chatId] ??= [];
acc[chatId].push(v);
return acc;
}, {} as Record<string, Array<NostrEvent>>);
return [...Object.entries(chats)].map(([k, v]) => Nip4ChatSystem.createChatObj(k, v));
}

View File

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

View File

@ -90,10 +90,10 @@
"BGCM48": "Write access to Snort relay, with 1 year of event retention",
"BOUMjw": "No nostr users found for {twitterUsername}",
"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.",
"C5xzTC": "Premium",
"C81/uG": "Logout",
"C81/uG": "Çıxış",
"C8HhVE": "Suggested Follows",
"CHTbO3": "Failed to load invoice",
"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",
"+Vxixo": "Geheimer Gruppenchat",
"+aZY2h": "Zap Typ",
"+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",
"+xliwN": "{name} hat gerepostet",
"/4tOwT": "Überspringen",
"/JE/X+": "Konto Hilfe",
"/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.",
"/d6vEc": "Machen Sie Ihr Profil einfacher auffind- und teilbar",
"/d6vEc": "Mach dein Profil leichter zu finden und zu teilen",
"/n5KSF": "{n} ms",
"00LcfG": "Mehr laden",
"08zn6O": "Schlüssel exportieren",
@ -25,7 +25,7 @@
"1R43+L": "Nostr Wallet Connect Konfiguration eingeben",
"1c4YST": "Verbunden mit: {node}🎉",
"1iQ8GN": "Vorschau ein/aus",
"1nYUGC": "{n} folgen",
"1nYUGC": "{n} Folgen",
"1udzha": "Unterhaltungen",
"2/2yg+": "Hinzufügen",
"25V4l1": "Banner",
@ -39,20 +39,20 @@
"3gOsZq": "Übersetzer",
"3qnJlS": "Du stimmst mit {amount} sats ab",
"3t3kok": "{n,plural,one {}=1{{n} neues Event} other{{n} neue Events}}",
"3tVy+Z": "{n} Folgende",
"3tVy+Z": "{n} Follower",
"3xCwbZ": "oder",
"3yk8fB": "Wallet",
"450Fty": "Keine",
"47FYwb": "Abbrechen",
"4IPzdn": "Primäre Entwickler",
"4L2vUY": "Dein neuer NIP-05 Name ist:",
"4L2vUY": "Dein neuer NIP-05-Handle ist:",
"4OB335": "Gefällt nicht",
"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",
"4rYCjn": "Notiz an mich selbst",
"5JcXdV": "Benutzerkonto anlegen",
"5JcXdV": "Konto erstellen",
"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",
"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",
@ -74,7 +74,7 @@
"9SvQep": "Folgt {n}",
"9WRlF4": "Senden",
"9gqH2W": "Anmelden",
"9pMqYs": "Nostr Adresse",
"9pMqYs": "Nostr-Adresse",
"9wO4wJ": "Lightning Zahlungsanforderung",
"ADmfQT": "Vorherige",
"AGNz71": "Zap {n} sats an Alle",
@ -109,7 +109,7 @@
"DtYelJ": "Transferieren",
"E8a4yq": "Folgen Sie einigen beliebten Konten",
"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",
"Ebl/B2": "Auf {lang} Übersetzen",
"EcZF24": "Benutzerdefinierte Relays",
@ -117,10 +117,10 @@
"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.",
"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",
"FP+D3H": "LNURL zum Weiterleiten der Zaps",
"FS3b54": "Feritg!",
"FS3b54": "Fertig!",
"FSYL8G": "Angesagte Benutzer",
"FdhSU2": "Jetzt abholen",
"FfYsOb": "Ein Fehler ist aufgetreten!",
@ -130,10 +130,10 @@
"GFOoEE": "Salt",
"GL8aXW": "Lesezeichen ({n})",
"GSye7T": "Lightning-Adresse",
"GUlSVG": "Beanspruche deine enthaltene Snort Nostr Adresse",
"GUlSVG": "Beanspruche deine enthaltene Snort Nostr-Adresse",
"Gcn9NQ": "Magnet Link",
"GspYR7": "{n} Gefällt nicht",
"H+vHiz": "Hex Schlüssel..",
"H+vHiz": "Hex-Schlüssel...",
"H0JBH6": "Abmelden",
"H6/kLh": "Bestellung bezahlt!",
"HAlOn1": "Name",
@ -145,7 +145,7 @@
"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?",
"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.",
"Ig9/a1": "Sende {n} sats an {name}",
"Ix8l+B": "Angesagte Notes",
@ -174,7 +174,7 @@
"MBAYRO": "Zeigt \"ID kopieren\" und \"Event JSON kopieren\" im Kontextmenu jeder Nachricht an",
"MI2jkA": "Nicht verfügbar:",
"MP54GY": "Wallet Passwort",
"MRp6Ly": "Twitter Benutzername",
"MRp6Ly": "Twitter-Benutzername",
"MWTx65": "Standardseite",
"Mrpkot": "Abonnement bezahlen",
"MuVeKe": "Nostr-Adresse kaufen",
@ -203,7 +203,7 @@
"PrsIg7": "Reaktionen werden auf jeder Seite angezeigt, wenn Reaktionen deaktiviert sind, werden sie nicht angezeigt",
"QDFTjG": "{n} Relais",
"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}",
"Qxv0B2": "Du hast aktuell {number} sats in deinem Zap Pool.",
"R/6nsx": "Abonnement",
@ -217,10 +217,10 @@
"RoOyAh": "Relais",
"Rs4kCE": "Lesezeichen",
"RwFaYs": "Sortieren",
"SOqbe9": "Lightning Adresse aktualisieren",
"SOqbe9": "Lightning-Adresse aktualisieren",
"SP0+yi": "Abonnement kaufen",
"SX58hM": "Kopieren",
"SYQtZ7": "LN Adresse Proxy",
"SYQtZ7": "LN-Adressen-Proxy",
"ShdEie": "Alle als gelesen markieren",
"Sjo1P4": "Benutzerdefiniert",
"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:",
"Y31HTH": "Unterstütze die Entwicklung von Snort",
"YDURw6": "URL des Dienstes",
"YXA3AH": "Reaktionen einschalten",
"YXA3AH": "Reaktionen aktivieren",
"Z0FDj+": "Abonniere Snort {plan} für {price} und erhalte folgende Belohnungen",
"Z4BMCZ": "Verbindungs-Passphrase eingeben",
"ZKORll": "Jetzt aktivieren",
@ -266,14 +266,14 @@
"a7TDNm": "Notes werden in Echtzeit in Global- und Notes-Tab gestreamt",
"aWpBzj": "Mehr anzeigen",
"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",
"bep9C3": "Öffentlicher Schlüssel",
"bfvyfs": "Anon",
"brAXSu": "Wählen Sie einen Benutzernamen",
"bxv59V": "Gerade eben",
"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",
"cFbU1B": "Du benutzt Alby? Gehe zu {link} um deine NWC Konfiguration zu erhalten!",
"cPIKU2": "Folge ich",
@ -284,7 +284,7 @@
"cuV2gK": "Name ist registriert",
"cyR7Kh": "Zurück",
"d6CyG5": "Verlauf",
"d7d0/x": "LN Adresse",
"d7d0/x": "LN-Adresse",
"dOQCL8": "Anzeigename",
"e61Jf3": "Kommt bald",
"e7qqly": "Alle als gelesen markieren",
@ -295,14 +295,14 @@
"fBI91o": "Zap",
"fOksnD": "Abstimmung nicht möglich, da der LNURL-Dienst keine Zaps unterstützt",
"fWZYP5": "Angeheftet",
"filwqD": "Gelesen",
"filwqD": "Lesen",
"flnGvv": "Was ist gerade los?",
"fsB/4p": "Gespeichert",
"g5pX+a": "Über uns",
"g5pX+a": "Über mich",
"g985Wp": "Fehler beim Senden der Bewertung",
"gBdUXk": "Speicher deine Schlüssel!",
"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",
"gczcC5": "Abonnieren",
"gjBiyj": "Lädt...",
@ -319,12 +319,12 @@
"iDGAbc": "Holen dir einen Snort Identifikator",
"iEoXYx": "DeepL Übersetzungen",
"iGT1eE": "Verhindere, dass gefälschte Konten dich imitieren",
"iNWbVV": "Name",
"iNWbVV": "Handle",
"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",
"ieGrWo": "Folgen",
"itPgxd": "Profil",
"izWS4J": "Nicht mehr folgen",
"izWS4J": "Entfolgen",
"jA3OE/": "{n,plural,one {}=1{{n} sat} other{{n} sats}}",
"jCA7Cw": "Vorschau auf Snort",
"jMzO1S": "Interner Fehler: {msg}",
@ -333,7 +333,7 @@
"jvo0vs": "Speichern",
"jzgQ2z": "{n} Reaktionen",
"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}}",
"kaaf1E": "jetzt",
"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!",
"lCILNz": "Jetzt kaufen",
"lD3+8a": "Bezahlen",
"lPWASz": "Snort Nostr Adresse",
"lPWASz": "Snort Nostr-Adresse",
"lTbT3s": "Wallet Passwort",
"lgg1KN": "Kontoseite",
"ll3xBp": "Bild Proxy Dienst",
@ -364,7 +364,7 @@
"nn1qb3": "Deine Spenden werden sehr geschätzt",
"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.",
"o7e+nJ": "{n} Folgende",
"o7e+nJ": "{n} Follower",
"oJ+JJN": "Keine Treffer :/",
"odFwjL": "Nur für Folgende",
"odhABf": "Anmelden",
@ -375,8 +375,8 @@
"p85Uwy": "Aktive Abonnements",
"pI+77w": "Herunterladbare Backups von Snort Relais",
"puLNUJ": "Pin",
"pzTOmv": "Folgende",
"qD9EUF": "E-Mail <> DM Brücke für deine Snort Nostr Adresse",
"pzTOmv": "Follower",
"qD9EUF": "E-Mail <> DM Brücke für deine Snort Nostr-Adresse",
"qDwvZ4": "Unbekannter Fehler",
"qMx1sA": "Standard Zap Betrag",
"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.",
"rudscU": "Abonnements konnten nicht geladen werden, bitte versuchen Sie es später erneut",
"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",
"th5lxp": "Sende Note zu einer Untergruppe deiner Schreib-Relays",
"thnRpU": "Eine NIP-05 Verifizierung kann helfen:",
@ -415,7 +415,7 @@
"wEQDC6": "Anpassen",
"wLtRCF": "Dein Schlüssel",
"wWLwvh": "Anon",
"wYSD2L": "Nostr Adresse",
"wYSD2L": "Nostr-Adresse",
"wih7iJ": "Name ist blockiert",
"wqyN/i": "Erfahren Sie mehr über {service} auf {link}",
"wtLjP6": "ID kopieren",
@ -431,7 +431,7 @@
"xhQMeQ": "Ablaufdatum",
"xmcVZ0": "Suche",
"y1Z3or": "Sprache",
"yCLnBC": "LNURL oder Lightning Adresse",
"yCLnBC": "LNURL oder Lightning-Adresse",
"yCmnnm": "Global lesen von",
"zFegDD": "Kontakt",
"zINlao": "Eigentümer",

View File

@ -5,10 +5,10 @@
"+aZY2h": "Type de Zap",
"+vA//S": "Connexions",
"+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é",
"/4tOwT": "Passer",
"/JE/X+": "Prise en charge du compte",
"/JE/X+": "Support de compte",
"/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.",
"/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 ?",
"1R43+L": "Accéder à la configuration de Nostr Wallet Connect",
"1c4YST": "Connecté à : {node} 🎉",
"1iQ8GN": "Prévisualisation du changement de fenêtre",
"1iQ8GN": "Activer/désactiver la prévisualisation",
"1nYUGC": "{n} Abonnements",
"1udzha": "Conversations",
"2/2yg+": "Ajouter",
@ -49,14 +49,14 @@
"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",
"4Z3t5i": "Utiliser imgproxy pour compresser les images",
"4rYCjn": "Note pour moi-même",
"4rYCjn": "Note à Soi-même",
"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.",
"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.",
"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",
"6ewQqw": "Aime ({n})",
"6uMqL1": "Non payé",
@ -64,7 +64,7 @@
"7BX/yC": "Changer de compte",
"7hp70g": "NIP-05",
"7xzTiH": "{action} à {target}",
"8/vBbP": "Republie ({n})",
"8/vBbP": "Reposte ({n})",
"89q5wc": "Confirmer la republication",
"8QDesP": "Zapper {n} sats",
"8g2vyB": "le nom est trop long",
@ -78,25 +78,25 @@
"9wO4wJ": "Facture Lightning",
"ADmfQT": "Parent",
"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",
"Ai8VHU": "Unlimited note retention on Snort relay",
"Ai8VHU": "Conservation illimitée des notes sur le relais Snort",
"AkCxS/": "Raison",
"AnLrRC": "Non-Zap",
"AyGauy": "Se Connecter",
"B4C47Y": "le nom est trop court",
"B6+XJy": "zappé",
"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}",
"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.",
"C5xzTC": "Premium",
"C81/uG": "Se déconnecter",
"C8HhVE": "Suggested Follows",
"C8HhVE": "Utilisateurs recommandés",
"CHTbO3": "Échec du chargement de la facture",
"CVWeJ6": "Personnes en tendance",
"CVWeJ6": "Personnes tendances",
"CmZ9ls": "{n} Mis en sourdine",
"CsCUYo": "{n} sats",
"Cu/K85": "Traduit de {lang}",
@ -108,21 +108,21 @@
"Dh3hbq": "Zap automatique",
"DtYelJ": "Transférer",
"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.",
"EWyQH5": "Global",
"Ebl/B2": "Traduire en {lang}",
"EcZF24": "Relais personnalisés",
"EcglP9": "Clé",
"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.",
"F+B3x1": "Nous nous sommes également associés à nosrplebs.com pour vous offrir plus d&#39;options",
"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'options",
"F3l7xL": "Ajouter un Compte",
"FDguSC": "{n} Zaps",
"FP+D3H": "LNRURL où transférer les Zap",
"FP+D3H": "LNURL où transférer les Zap",
"FS3b54": "Fait!",
"FSYL8G": "Utilisateurs en tendance",
"FdhSU2": "Réclamer maintenant",
"FSYL8G": "Utilisateurs tendances",
"FdhSU2": "Obtenir maintenant",
"FfYsOb": "Une erreur est survenue!",
"FmXUJg": "vous suit",
"G/yZLu": "Retirer",
@ -144,13 +144,13 @@
"HbefNb": "Ouvrir le Wallet",
"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?",
"IKKHqV": "Follows",
"INSqIz": "Nom d&#39;utilisateur Twitter...",
"IKKHqV": "Abonnements",
"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.",
"Ig9/a1": "Sent {n} sats to {name}",
"Ix8l+B": "Notes en tendances",
"Ig9/a1": "Envoyé {n} sats à {name}",
"Ix8l+B": "Notes tendances",
"J+dIsA": "Abonnements",
"JCIgkj": "Nom d&#39;utilisateur",
"JCIgkj": "Nom dutilisateur",
"JHEHCk": "Zaps ({n})",
"JPFYIM": "Aucune adresse Lightning",
"JeoS4y": "Reposter",
@ -164,25 +164,25 @@
"KQvWvD": "Supprimé",
"KWuDfz": "J'ai enregistré mes clés, continuer",
"KahimY": "Type d'événement inconnu : {kind}",
"KoFlZg": "Enter mint URL",
"KoFlZg": "Saisir l'URL de mint",
"LF5kYT": "Autres Connexions",
"LXxsbk": "Anonyme",
"LgbKvU": "Commenter",
"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",
"MBAYRO": "Affiche \"Copy ID\" et \"Copy Event JSON\" dans le menu contextuel de chaque message",
"MI2jkA": "Pas disponible:",
"MP54GY": "Mot de passe du portefeuille",
"MRp6Ly": "Nom d&#39;utilisateur Twitter",
"MWTx65": "Page par défaut",
"Mrpkot": "Pay for subscription",
"Mrpkot": "Payer pour l'abonnement",
"MuVeKe": "Acheter une adresse nostr",
"MzRYWH": "Acheter {item}",
"N2IrpM": "Confirmer",
"NAuFNH": "You already have a subscription of this type, please renew or pay",
"NNSu3d": "Import Twitter Follows",
"NdOYJJ": "Hmm rien ici .. Essayez {newUsersPage} pour suivre quelques recommandations de naustriches!",
"NAuFNH": "Vous avez déjà un abonnement de ce type, veuillez renouveler ou payer",
"NNSu3d": "Importer des abonnements Twitter",
"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",
"NfNk2V": "Votre clé privée",
"NndBJE": "Page des nouveaux utilisateurs",
@ -202,10 +202,10 @@
"Pe0ogR": "Thème",
"PrsIg7": "Les réactions seront affichées sur chaque page, si désactivées aucune réaction ne sera affichée",
"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.",
"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",
"R1fEdZ": "Zaps transféré",
"R81upa": "Personnes que vous suivez",
@ -224,7 +224,7 @@
"ShdEie": "Tout marquer comme lu",
"Sjo1P4": "Personnaliser",
"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",
"TpgeGw": "Sel Hex..",
"Tpy00S": "Personnes",
@ -263,10 +263,10 @@
"ZUZedV": "Don éclair :",
"Zr5TMx": "Configurer le profil",
"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",
"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",
"bep9C3": "Clé publique",
"bfvyfs": "Anonyme",
@ -334,9 +334,9 @@
"jzgQ2z": "{n} Réactions",
"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 !",
"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",
"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}",
"lBboHo": "Si vous voulez en essayer d'autres, consultez {link} pour en savoir plus!",
"lCILNz": "Acheter Maintenant",
@ -397,7 +397,7 @@
"tOdNiY": "Sombre",
"th5lxp": "Envoyer la note à un sous-ensemble de vos relais d'écriture",
"thnRpU": "Obtenir la vérification NIP-05 peut aider :",
"ttxS0b": "Supporter Badge",
"ttxS0b": "Badge de Supporter",
"u/vOPu": "Payé",
"u4bHcR": "Découvrez le code ici : {link}",
"uD/N6c": "Zapper {target} {n} sats",