chore: meku fixes
This commit is contained in:
parent
9abb236ede
commit
a591a3c176
@ -0,0 +1,8 @@
|
||||
{
|
||||
"version": 1,
|
||||
"description": "Generated by wrangler@3.52.0",
|
||||
"include": [
|
||||
"/*"
|
||||
],
|
||||
"exclude": []
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"routes": [
|
||||
{
|
||||
"routePath": "/",
|
||||
"mountPath": "/",
|
||||
"method": "",
|
||||
"middleware": [
|
||||
"_middleware.ts:onRequest"
|
||||
]
|
||||
}
|
||||
],
|
||||
"baseURL": "/"
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
import { onRequest as ___middleware_ts_onRequest } from "/home/kieran/git/snort/functions/_middleware.ts"
|
||||
|
||||
export const routes = [
|
||||
{
|
||||
routePath: "/",
|
||||
mountPath: "/",
|
||||
method: "",
|
||||
middlewares: [___middleware_ts_onRequest],
|
||||
modules: [],
|
||||
},
|
||||
]
|
478
.wrangler/tmp/pages-aYZOs0/functionsWorker-0.9785740899176378.js
Normal file
478
.wrangler/tmp/pages-aYZOs0/functionsWorker-0.9785740899176378.js
Normal file
@ -0,0 +1,478 @@
|
||||
// _middleware.ts
|
||||
var HOST = "snort.social";
|
||||
var onRequest = async (context) => {
|
||||
const u = new URL(context.request.url);
|
||||
const prefixes = ["npub1", "nprofile1", "naddr1", "nevent1", "note1"];
|
||||
const isEntityPath = prefixes.some(
|
||||
(a) => u.pathname.startsWith(`/${a}`) || u.pathname.startsWith(`/e/${a}`) || u.pathname.startsWith(`/p/${a}`)
|
||||
);
|
||||
const nostrAddress = u.pathname.match(/^\/([a-zA-Z0-9_]+)$/i);
|
||||
const next = await context.next();
|
||||
if (u.pathname != "/" && (isEntityPath || nostrAddress)) {
|
||||
try {
|
||||
let id = u.pathname.split("/").at(-1);
|
||||
if (!isEntityPath && nostrAddress) {
|
||||
id = `${id}@${HOST}`;
|
||||
}
|
||||
const fetchApi = `https://nostr.api.v0l.io/api/v1/opengraph/${id}?canonical=${encodeURIComponent(
|
||||
`https://${HOST}/%s`
|
||||
)}`;
|
||||
console.log("Fetching tags from: ", fetchApi);
|
||||
const rsp = await fetch(fetchApi, {
|
||||
method: "POST",
|
||||
body: await next.arrayBuffer(),
|
||||
headers: {
|
||||
"user-agent": `SnortFunctions/1.0 (https://${HOST})`,
|
||||
"content-type": "text/html",
|
||||
accept: "text/html"
|
||||
}
|
||||
});
|
||||
if (rsp.ok) {
|
||||
const body = await rsp.text();
|
||||
if (body.length > 0) {
|
||||
return new Response(body, {
|
||||
headers: {
|
||||
...Object.fromEntries(rsp.headers.entries()),
|
||||
"cache-control": "public, max-age=60"
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
return next;
|
||||
};
|
||||
|
||||
// ../.wrangler/tmp/pages-aYZOs0/functionsRoutes-0.08773921858373512.mjs
|
||||
var routes = [
|
||||
{
|
||||
routePath: "/",
|
||||
mountPath: "/",
|
||||
method: "",
|
||||
middlewares: [onRequest],
|
||||
modules: []
|
||||
}
|
||||
];
|
||||
|
||||
// ../../../.npm/_npx/32026684e21afda6/node_modules/path-to-regexp/dist.es2015/index.js
|
||||
function lexer(str) {
|
||||
var tokens = [];
|
||||
var i = 0;
|
||||
while (i < str.length) {
|
||||
var char = str[i];
|
||||
if (char === "*" || char === "+" || char === "?") {
|
||||
tokens.push({ type: "MODIFIER", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "\\") {
|
||||
tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "{") {
|
||||
tokens.push({ type: "OPEN", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "}") {
|
||||
tokens.push({ type: "CLOSE", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === ":") {
|
||||
var name = "";
|
||||
var j = i + 1;
|
||||
while (j < str.length) {
|
||||
var code = str.charCodeAt(j);
|
||||
if (
|
||||
// `0-9`
|
||||
code >= 48 && code <= 57 || // `A-Z`
|
||||
code >= 65 && code <= 90 || // `a-z`
|
||||
code >= 97 && code <= 122 || // `_`
|
||||
code === 95
|
||||
) {
|
||||
name += str[j++];
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!name)
|
||||
throw new TypeError("Missing parameter name at ".concat(i));
|
||||
tokens.push({ type: "NAME", index: i, value: name });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
if (char === "(") {
|
||||
var count = 1;
|
||||
var pattern = "";
|
||||
var j = i + 1;
|
||||
if (str[j] === "?") {
|
||||
throw new TypeError('Pattern cannot start with "?" at '.concat(j));
|
||||
}
|
||||
while (j < str.length) {
|
||||
if (str[j] === "\\") {
|
||||
pattern += str[j++] + str[j++];
|
||||
continue;
|
||||
}
|
||||
if (str[j] === ")") {
|
||||
count--;
|
||||
if (count === 0) {
|
||||
j++;
|
||||
break;
|
||||
}
|
||||
} else if (str[j] === "(") {
|
||||
count++;
|
||||
if (str[j + 1] !== "?") {
|
||||
throw new TypeError("Capturing groups are not allowed at ".concat(j));
|
||||
}
|
||||
}
|
||||
pattern += str[j++];
|
||||
}
|
||||
if (count)
|
||||
throw new TypeError("Unbalanced pattern at ".concat(i));
|
||||
if (!pattern)
|
||||
throw new TypeError("Missing pattern at ".concat(i));
|
||||
tokens.push({ type: "PATTERN", index: i, value: pattern });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
tokens.push({ type: "CHAR", index: i, value: str[i++] });
|
||||
}
|
||||
tokens.push({ type: "END", index: i, value: "" });
|
||||
return tokens;
|
||||
}
|
||||
function parse(str, options) {
|
||||
if (options === void 0) {
|
||||
options = {};
|
||||
}
|
||||
var tokens = lexer(str);
|
||||
var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a;
|
||||
var defaultPattern = "[^".concat(escapeString(options.delimiter || "/#?"), "]+?");
|
||||
var result = [];
|
||||
var key = 0;
|
||||
var i = 0;
|
||||
var path = "";
|
||||
var tryConsume = function(type) {
|
||||
if (i < tokens.length && tokens[i].type === type)
|
||||
return tokens[i++].value;
|
||||
};
|
||||
var mustConsume = function(type) {
|
||||
var value2 = tryConsume(type);
|
||||
if (value2 !== void 0)
|
||||
return value2;
|
||||
var _a2 = tokens[i], nextType = _a2.type, index = _a2.index;
|
||||
throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type));
|
||||
};
|
||||
var consumeText = function() {
|
||||
var result2 = "";
|
||||
var value2;
|
||||
while (value2 = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) {
|
||||
result2 += value2;
|
||||
}
|
||||
return result2;
|
||||
};
|
||||
while (i < tokens.length) {
|
||||
var char = tryConsume("CHAR");
|
||||
var name = tryConsume("NAME");
|
||||
var pattern = tryConsume("PATTERN");
|
||||
if (name || pattern) {
|
||||
var prefix = char || "";
|
||||
if (prefixes.indexOf(prefix) === -1) {
|
||||
path += prefix;
|
||||
prefix = "";
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
result.push({
|
||||
name: name || key++,
|
||||
prefix,
|
||||
suffix: "",
|
||||
pattern: pattern || defaultPattern,
|
||||
modifier: tryConsume("MODIFIER") || ""
|
||||
});
|
||||
continue;
|
||||
}
|
||||
var value = char || tryConsume("ESCAPED_CHAR");
|
||||
if (value) {
|
||||
path += value;
|
||||
continue;
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
var open = tryConsume("OPEN");
|
||||
if (open) {
|
||||
var prefix = consumeText();
|
||||
var name_1 = tryConsume("NAME") || "";
|
||||
var pattern_1 = tryConsume("PATTERN") || "";
|
||||
var suffix = consumeText();
|
||||
mustConsume("CLOSE");
|
||||
result.push({
|
||||
name: name_1 || (pattern_1 ? key++ : ""),
|
||||
pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
|
||||
prefix,
|
||||
suffix,
|
||||
modifier: tryConsume("MODIFIER") || ""
|
||||
});
|
||||
continue;
|
||||
}
|
||||
mustConsume("END");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
function match(str, options) {
|
||||
var keys = [];
|
||||
var re = pathToRegexp(str, keys, options);
|
||||
return regexpToFunction(re, keys, options);
|
||||
}
|
||||
function regexpToFunction(re, keys, options) {
|
||||
if (options === void 0) {
|
||||
options = {};
|
||||
}
|
||||
var _a = options.decode, decode = _a === void 0 ? function(x) {
|
||||
return x;
|
||||
} : _a;
|
||||
return function(pathname) {
|
||||
var m = re.exec(pathname);
|
||||
if (!m)
|
||||
return false;
|
||||
var path = m[0], index = m.index;
|
||||
var params = /* @__PURE__ */ Object.create(null);
|
||||
var _loop_1 = function(i2) {
|
||||
if (m[i2] === void 0)
|
||||
return "continue";
|
||||
var key = keys[i2 - 1];
|
||||
if (key.modifier === "*" || key.modifier === "+") {
|
||||
params[key.name] = m[i2].split(key.prefix + key.suffix).map(function(value) {
|
||||
return decode(value, key);
|
||||
});
|
||||
} else {
|
||||
params[key.name] = decode(m[i2], key);
|
||||
}
|
||||
};
|
||||
for (var i = 1; i < m.length; i++) {
|
||||
_loop_1(i);
|
||||
}
|
||||
return { path, index, params };
|
||||
};
|
||||
}
|
||||
function escapeString(str) {
|
||||
return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
|
||||
}
|
||||
function flags(options) {
|
||||
return options && options.sensitive ? "" : "i";
|
||||
}
|
||||
function regexpToRegexp(path, keys) {
|
||||
if (!keys)
|
||||
return path;
|
||||
var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g;
|
||||
var index = 0;
|
||||
var execResult = groupsRegex.exec(path.source);
|
||||
while (execResult) {
|
||||
keys.push({
|
||||
// Use parenthesized substring match if available, index otherwise
|
||||
name: execResult[1] || index++,
|
||||
prefix: "",
|
||||
suffix: "",
|
||||
modifier: "",
|
||||
pattern: ""
|
||||
});
|
||||
execResult = groupsRegex.exec(path.source);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
function arrayToRegexp(paths, keys, options) {
|
||||
var parts = paths.map(function(path) {
|
||||
return pathToRegexp(path, keys, options).source;
|
||||
});
|
||||
return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options));
|
||||
}
|
||||
function stringToRegexp(path, keys, options) {
|
||||
return tokensToRegexp(parse(path, options), keys, options);
|
||||
}
|
||||
function tokensToRegexp(tokens, keys, options) {
|
||||
if (options === void 0) {
|
||||
options = {};
|
||||
}
|
||||
var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function(x) {
|
||||
return x;
|
||||
} : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f;
|
||||
var endsWithRe = "[".concat(escapeString(endsWith), "]|$");
|
||||
var delimiterRe = "[".concat(escapeString(delimiter), "]");
|
||||
var route = start ? "^" : "";
|
||||
for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
|
||||
var token = tokens_1[_i];
|
||||
if (typeof token === "string") {
|
||||
route += escapeString(encode(token));
|
||||
} else {
|
||||
var prefix = escapeString(encode(token.prefix));
|
||||
var suffix = escapeString(encode(token.suffix));
|
||||
if (token.pattern) {
|
||||
if (keys)
|
||||
keys.push(token);
|
||||
if (prefix || suffix) {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
var mod = token.modifier === "*" ? "?" : "";
|
||||
route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod);
|
||||
} else {
|
||||
route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
} else {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
route += "((?:".concat(token.pattern, ")").concat(token.modifier, ")");
|
||||
} else {
|
||||
route += "(".concat(token.pattern, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (end) {
|
||||
if (!strict)
|
||||
route += "".concat(delimiterRe, "?");
|
||||
route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")");
|
||||
} else {
|
||||
var endToken = tokens[tokens.length - 1];
|
||||
var isEndDelimited = typeof endToken === "string" ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1 : endToken === void 0;
|
||||
if (!strict) {
|
||||
route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?");
|
||||
}
|
||||
if (!isEndDelimited) {
|
||||
route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")");
|
||||
}
|
||||
}
|
||||
return new RegExp(route, flags(options));
|
||||
}
|
||||
function pathToRegexp(path, keys, options) {
|
||||
if (path instanceof RegExp)
|
||||
return regexpToRegexp(path, keys);
|
||||
if (Array.isArray(path))
|
||||
return arrayToRegexp(path, keys, options);
|
||||
return stringToRegexp(path, keys, options);
|
||||
}
|
||||
|
||||
// ../../../.npm/_npx/32026684e21afda6/node_modules/wrangler/templates/pages-template-worker.ts
|
||||
var escapeRegex = /[.+?^${}()|[\]\\]/g;
|
||||
function* executeRequest(request) {
|
||||
const requestPath = new URL(request.url).pathname;
|
||||
for (const route of [...routes].reverse()) {
|
||||
if (route.method && route.method !== request.method) {
|
||||
continue;
|
||||
}
|
||||
const routeMatcher = match(route.routePath.replace(escapeRegex, "\\$&"), {
|
||||
end: false
|
||||
});
|
||||
const mountMatcher = match(route.mountPath.replace(escapeRegex, "\\$&"), {
|
||||
end: false
|
||||
});
|
||||
const matchResult = routeMatcher(requestPath);
|
||||
const mountMatchResult = mountMatcher(requestPath);
|
||||
if (matchResult && mountMatchResult) {
|
||||
for (const handler of route.middlewares.flat()) {
|
||||
yield {
|
||||
handler,
|
||||
params: matchResult.params,
|
||||
path: mountMatchResult.path
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const route of routes) {
|
||||
if (route.method && route.method !== request.method) {
|
||||
continue;
|
||||
}
|
||||
const routeMatcher = match(route.routePath.replace(escapeRegex, "\\$&"), {
|
||||
end: true
|
||||
});
|
||||
const mountMatcher = match(route.mountPath.replace(escapeRegex, "\\$&"), {
|
||||
end: false
|
||||
});
|
||||
const matchResult = routeMatcher(requestPath);
|
||||
const mountMatchResult = mountMatcher(requestPath);
|
||||
if (matchResult && mountMatchResult && route.modules.length) {
|
||||
for (const handler of route.modules.flat()) {
|
||||
yield {
|
||||
handler,
|
||||
params: matchResult.params,
|
||||
path: matchResult.path
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var pages_template_worker_default = {
|
||||
async fetch(originalRequest, env, workerContext) {
|
||||
let request = originalRequest;
|
||||
const handlerIterator = executeRequest(request);
|
||||
let data = {};
|
||||
let isFailOpen = false;
|
||||
const next = async (input, init) => {
|
||||
if (input !== void 0) {
|
||||
let url = input;
|
||||
if (typeof input === "string") {
|
||||
url = new URL(input, request.url).toString();
|
||||
}
|
||||
request = new Request(url, init);
|
||||
}
|
||||
const result = handlerIterator.next();
|
||||
if (result.done === false) {
|
||||
const { handler, params, path } = result.value;
|
||||
const context = {
|
||||
request: new Request(request.clone()),
|
||||
functionPath: path,
|
||||
next,
|
||||
params,
|
||||
get data() {
|
||||
return data;
|
||||
},
|
||||
set data(value) {
|
||||
if (typeof value !== "object" || value === null) {
|
||||
throw new Error("context.data must be an object");
|
||||
}
|
||||
data = value;
|
||||
},
|
||||
env,
|
||||
waitUntil: workerContext.waitUntil.bind(workerContext),
|
||||
passThroughOnException: () => {
|
||||
isFailOpen = true;
|
||||
}
|
||||
};
|
||||
const response = await handler(context);
|
||||
if (!(response instanceof Response)) {
|
||||
throw new Error("Your Pages function should return a Response");
|
||||
}
|
||||
return cloneResponse(response);
|
||||
} else if ("ASSETS") {
|
||||
const response = await env["ASSETS"].fetch(request);
|
||||
return cloneResponse(response);
|
||||
} else {
|
||||
const response = await fetch(request);
|
||||
return cloneResponse(response);
|
||||
}
|
||||
};
|
||||
try {
|
||||
return await next();
|
||||
} catch (error) {
|
||||
if (isFailOpen) {
|
||||
const response = await env["ASSETS"].fetch(request);
|
||||
return cloneResponse(response);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
var cloneResponse = (response) => (
|
||||
// https://fetch.spec.whatwg.org/#null-body-status
|
||||
new Response(
|
||||
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
||||
response
|
||||
)
|
||||
);
|
||||
export {
|
||||
pages_template_worker_default as default
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"appName": "meku.app",
|
||||
"appName": "めく",
|
||||
"appNameCapitalized": "めく",
|
||||
"appTitle": "めく",
|
||||
"hostname": "meku.app",
|
||||
@ -26,7 +26,8 @@
|
||||
},
|
||||
"defaultPreferences": {
|
||||
"hideMutedNotes": false,
|
||||
"defaultRootTab": "following"
|
||||
"defaultRootTab": "following",
|
||||
"language": "ja"
|
||||
},
|
||||
"media": {
|
||||
"bypassImgProxyError": false,
|
||||
|
@ -109,6 +109,9 @@ export default function NavSidebar({ narrow = false }: { narrow?: boolean }) {
|
||||
if ((CONFIG.hideFromNavbar ?? []).includes(a.link)) {
|
||||
return false;
|
||||
}
|
||||
if (!CONFIG.features.deck && a.link === "/deck") {
|
||||
return false;
|
||||
}
|
||||
if (readonly && a.hideReadOnly) {
|
||||
return false;
|
||||
}
|
||||
|
@ -5,6 +5,9 @@
|
||||
"+PzQ9Y": {
|
||||
"defaultMessage": "Payout Now"
|
||||
},
|
||||
"+QM0PJ": {
|
||||
"defaultMessage": "Sync all events for your profile into local cache"
|
||||
},
|
||||
"+UjDmN": {
|
||||
"defaultMessage": "Logged in with write access"
|
||||
},
|
||||
@ -41,10 +44,6 @@
|
||||
"/JE/X+": {
|
||||
"defaultMessage": "Account Support"
|
||||
},
|
||||
"/PCavi": {
|
||||
"defaultMessage": "Public",
|
||||
"description": "Public Zap"
|
||||
},
|
||||
"/Xf4UW": {
|
||||
"defaultMessage": "Send anonymous usage metrics"
|
||||
},
|
||||
@ -63,9 +62,6 @@
|
||||
"01iNut": {
|
||||
"defaultMessage": "Nostr address does not belong to you"
|
||||
},
|
||||
"08zn6O": {
|
||||
"defaultMessage": "Export Keys"
|
||||
},
|
||||
"0Azlrb": {
|
||||
"defaultMessage": "Manage"
|
||||
},
|
||||
@ -181,9 +177,6 @@
|
||||
"3tVy+Z": {
|
||||
"defaultMessage": "{n} Followers"
|
||||
},
|
||||
"3yk8fB": {
|
||||
"defaultMessage": "Wallet"
|
||||
},
|
||||
"450Fty": {
|
||||
"defaultMessage": "None"
|
||||
},
|
||||
@ -235,9 +228,6 @@
|
||||
"5ykRmX": {
|
||||
"defaultMessage": "Send zap"
|
||||
},
|
||||
"6/SF6e": {
|
||||
"defaultMessage": "<h1>{n}</h1> Cashu sats"
|
||||
},
|
||||
"6/hB3S": {
|
||||
"defaultMessage": "Watch Replay"
|
||||
},
|
||||
@ -356,10 +346,6 @@
|
||||
"Am8glJ": {
|
||||
"defaultMessage": "Game"
|
||||
},
|
||||
"AnLrRC": {
|
||||
"defaultMessage": "Non-Zap",
|
||||
"description": "Non-Zap, Regular LN payment"
|
||||
},
|
||||
"Aujn2T": {
|
||||
"defaultMessage": "Count"
|
||||
},
|
||||
@ -522,9 +508,6 @@
|
||||
"FmXUJg": {
|
||||
"defaultMessage": "follows you"
|
||||
},
|
||||
"FvanT6": {
|
||||
"defaultMessage": "Accounts"
|
||||
},
|
||||
"G/yZLu": {
|
||||
"defaultMessage": "Remove"
|
||||
},
|
||||
@ -589,15 +572,15 @@
|
||||
"HhcAVH": {
|
||||
"defaultMessage": "You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody."
|
||||
},
|
||||
"HqRNN8": {
|
||||
"defaultMessage": "Support"
|
||||
},
|
||||
"I1AoOu": {
|
||||
"defaultMessage": "Last post {time}"
|
||||
},
|
||||
"IEwZvs": {
|
||||
"defaultMessage": "Are you sure you want to unpin this note?"
|
||||
},
|
||||
"IIOul1": {
|
||||
"defaultMessage": "Account Data"
|
||||
},
|
||||
"IKKHqV": {
|
||||
"defaultMessage": "Follows"
|
||||
},
|
||||
@ -673,19 +656,12 @@
|
||||
"KAhAcM": {
|
||||
"defaultMessage": "Enter LNDHub config"
|
||||
},
|
||||
"KHK8B9": {
|
||||
"defaultMessage": "Relay",
|
||||
"description": "Label for reading global feed from specific relays"
|
||||
},
|
||||
"KQvWvD": {
|
||||
"defaultMessage": "Deleted"
|
||||
},
|
||||
"KahimY": {
|
||||
"defaultMessage": "Unknown event kind: {kind}"
|
||||
},
|
||||
"KoFlZg": {
|
||||
"defaultMessage": "Enter mint URL"
|
||||
},
|
||||
"KtsyO0": {
|
||||
"defaultMessage": "Enter Pin"
|
||||
},
|
||||
@ -798,6 +774,12 @@
|
||||
"ORGv1Q": {
|
||||
"defaultMessage": "Created"
|
||||
},
|
||||
"OoZgbB": {
|
||||
"defaultMessage": "Failed to update, please try again"
|
||||
},
|
||||
"OxPdQ0": {
|
||||
"defaultMessage": "Scanning {date}"
|
||||
},
|
||||
"P2o+ZZ": {
|
||||
"defaultMessage": "Invalid Nostr Address"
|
||||
},
|
||||
@ -813,10 +795,6 @@
|
||||
"PCSt5T": {
|
||||
"defaultMessage": "Preferences"
|
||||
},
|
||||
"PJeJFc": {
|
||||
"defaultMessage": "Summary",
|
||||
"description": "Notifications summary"
|
||||
},
|
||||
"PXQ0z0": {
|
||||
"defaultMessage": "Receiving to <b>{wallet}</b>"
|
||||
},
|
||||
@ -832,15 +810,15 @@
|
||||
"QDFTjG": {
|
||||
"defaultMessage": "{n} Relays"
|
||||
},
|
||||
"QJfhKt": {
|
||||
"defaultMessage": "The private key is like a password, but it cannot be reset. Guard it carefully and never show it to anyone. Once someone has your private key, they will have access to your account forever."
|
||||
},
|
||||
"QWhotP": {
|
||||
"defaultMessage": "Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)"
|
||||
},
|
||||
"Qxv0B2": {
|
||||
"defaultMessage": "You currently have {number} sats in your zap pool."
|
||||
},
|
||||
"R/6nsx": {
|
||||
"defaultMessage": "Subscription"
|
||||
},
|
||||
"R81upa": {
|
||||
"defaultMessage": "People you follow"
|
||||
},
|
||||
@ -862,6 +840,9 @@
|
||||
"RoOyAh": {
|
||||
"defaultMessage": "Relays"
|
||||
},
|
||||
"RrCui3": {
|
||||
"defaultMessage": "Summary"
|
||||
},
|
||||
"Rs4kCE": {
|
||||
"defaultMessage": "Bookmark"
|
||||
},
|
||||
@ -926,9 +907,6 @@
|
||||
"TvKqBp": {
|
||||
"defaultMessage": "liked"
|
||||
},
|
||||
"TwyMau": {
|
||||
"defaultMessage": "Account"
|
||||
},
|
||||
"U1aPPi": {
|
||||
"defaultMessage": "Stop listening"
|
||||
},
|
||||
@ -1019,6 +997,9 @@
|
||||
"XQiFEl": {
|
||||
"defaultMessage": "Follows Relay Health"
|
||||
},
|
||||
"XSdWHA": {
|
||||
"defaultMessage": "Redeem"
|
||||
},
|
||||
"XXm7jJ": {
|
||||
"defaultMessage": "Trending Hashtags"
|
||||
},
|
||||
@ -1031,10 +1012,6 @@
|
||||
"Xopqkl": {
|
||||
"defaultMessage": "Your default zap amount is {number} sats, example values are calculated from this."
|
||||
},
|
||||
"XrSk2j": {
|
||||
"defaultMessage": "Redeem",
|
||||
"description": "Button: Redeem Cashu token"
|
||||
},
|
||||
"YDURw6": {
|
||||
"defaultMessage": "Service URL"
|
||||
},
|
||||
@ -1168,6 +1145,9 @@
|
||||
"d7d0/x": {
|
||||
"defaultMessage": "LN Address"
|
||||
},
|
||||
"dK2CcV": {
|
||||
"defaultMessage": "The public key is like your username, you can share it with anyone."
|
||||
},
|
||||
"dOQCL8": {
|
||||
"defaultMessage": "Display name"
|
||||
},
|
||||
@ -1294,6 +1274,9 @@
|
||||
"hF6IN2": {
|
||||
"defaultMessage": "Prune Follow List"
|
||||
},
|
||||
"hMQmIw": {
|
||||
"defaultMessage": "Sync Account"
|
||||
},
|
||||
"hMzcSq": {
|
||||
"defaultMessage": "Messages"
|
||||
},
|
||||
@ -1303,9 +1286,6 @@
|
||||
"hY4lzx": {
|
||||
"defaultMessage": "Supports"
|
||||
},
|
||||
"hYOE+U": {
|
||||
"defaultMessage": "Invite"
|
||||
},
|
||||
"ha8JKG": {
|
||||
"defaultMessage": "Show graph"
|
||||
},
|
||||
@ -1318,9 +1298,6 @@
|
||||
"hniz8Z": {
|
||||
"defaultMessage": "here"
|
||||
},
|
||||
"hvFRBo": {
|
||||
"defaultMessage": "Interaction"
|
||||
},
|
||||
"i/dBAR": {
|
||||
"defaultMessage": "Zap Pool"
|
||||
},
|
||||
@ -1345,6 +1322,9 @@
|
||||
"iXPL0Z": {
|
||||
"defaultMessage": "Can't login with private key on an insecure connection, please use a Nostr key manager extension instead"
|
||||
},
|
||||
"iYc3Ld": {
|
||||
"defaultMessage": "Payments"
|
||||
},
|
||||
"ieGrWo": {
|
||||
"defaultMessage": "Follow"
|
||||
},
|
||||
@ -1420,12 +1400,18 @@
|
||||
"lD3+8a": {
|
||||
"defaultMessage": "Pay"
|
||||
},
|
||||
"lEnclp": {
|
||||
"defaultMessage": "My events: {n}"
|
||||
},
|
||||
"lPWASz": {
|
||||
"defaultMessage": "Snort nostr address"
|
||||
},
|
||||
"lTbT3s": {
|
||||
"defaultMessage": "Wallet password"
|
||||
},
|
||||
"lfOesV": {
|
||||
"defaultMessage": "Non-Zap"
|
||||
},
|
||||
"lgg1KN": {
|
||||
"defaultMessage": "account page"
|
||||
},
|
||||
@ -1453,6 +1439,9 @@
|
||||
"mKhgP9": {
|
||||
"defaultMessage": "{n,plural,=0{} =1{zapped} other{zapped}}"
|
||||
},
|
||||
"mOFG3K": {
|
||||
"defaultMessage": "Start"
|
||||
},
|
||||
"mfe8RW": {
|
||||
"defaultMessage": "Option: {n}"
|
||||
},
|
||||
@ -1474,6 +1463,9 @@
|
||||
"nUT0Lv": {
|
||||
"defaultMessage": "Tools"
|
||||
},
|
||||
"nWQFic": {
|
||||
"defaultMessage": "Renew"
|
||||
},
|
||||
"nihgfo": {
|
||||
"defaultMessage": "Listen to this article"
|
||||
},
|
||||
@ -1513,10 +1505,6 @@
|
||||
"puLNUJ": {
|
||||
"defaultMessage": "Pin"
|
||||
},
|
||||
"pukxg/": {
|
||||
"defaultMessage": "Payments",
|
||||
"description": "Wallet transation history"
|
||||
},
|
||||
"pzTOmv": {
|
||||
"defaultMessage": "Followers"
|
||||
},
|
||||
@ -1535,6 +1523,9 @@
|
||||
"qUJTsT": {
|
||||
"defaultMessage": "Blocked"
|
||||
},
|
||||
"qXCbgZ": {
|
||||
"defaultMessage": "Unlock"
|
||||
},
|
||||
"qZsKBR": {
|
||||
"defaultMessage": "Renew {tier}"
|
||||
},
|
||||
@ -1634,6 +1625,12 @@
|
||||
"uc0din": {
|
||||
"defaultMessage": "Send sats splits to"
|
||||
},
|
||||
"ufvXH1": {
|
||||
"defaultMessage": "Found {n} events"
|
||||
},
|
||||
"uhu5aG": {
|
||||
"defaultMessage": "Public"
|
||||
},
|
||||
"un1nGw": {
|
||||
"defaultMessage": "{n} notes"
|
||||
},
|
||||
@ -1679,10 +1676,6 @@
|
||||
"wSZR47": {
|
||||
"defaultMessage": "Submit"
|
||||
},
|
||||
"wWLwvh": {
|
||||
"defaultMessage": "Anon",
|
||||
"description": "Anonymous Zap"
|
||||
},
|
||||
"whSrs+": {
|
||||
"defaultMessage": "Nostr Public Chat"
|
||||
},
|
||||
@ -1713,10 +1706,6 @@
|
||||
"xIoGG9": {
|
||||
"defaultMessage": "Go to"
|
||||
},
|
||||
"xQtL3v": {
|
||||
"defaultMessage": "Unlock",
|
||||
"description": "Unlock wallet"
|
||||
},
|
||||
"xSoIUU": {
|
||||
"defaultMessage": "Worker Relay"
|
||||
},
|
||||
@ -1744,6 +1733,9 @@
|
||||
"y1Z3or": {
|
||||
"defaultMessage": "Language"
|
||||
},
|
||||
"yAztTU": {
|
||||
"defaultMessage": "{n} eSats"
|
||||
},
|
||||
"yCLnBC": {
|
||||
"defaultMessage": "LNURL or Lightning Address"
|
||||
},
|
||||
@ -1771,9 +1763,6 @@
|
||||
"zvCDao": {
|
||||
"defaultMessage": "Automatically show latest notes"
|
||||
},
|
||||
"zwb6LR": {
|
||||
"defaultMessage": "<b>Mint:</b> {url}"
|
||||
},
|
||||
"zxvhnE": {
|
||||
"defaultMessage": "Daily"
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"+D82kt": "Are you sure you want to repost: {id}",
|
||||
"+PzQ9Y": "Payout Now",
|
||||
"+QM0PJ": "Sync all events for your profile into local cache",
|
||||
"+UjDmN": "Logged in with write access",
|
||||
"+Vxixo": "Secret Group Chat",
|
||||
"+aZY2h": "Zap Type",
|
||||
@ -13,14 +14,12 @@
|
||||
"/B8zwF": "Your space the way you want it 😌",
|
||||
"/GCoTA": "Clear",
|
||||
"/JE/X+": "Account Support",
|
||||
"/PCavi": "Public",
|
||||
"/Xf4UW": "Send anonymous usage metrics",
|
||||
"/clOBU": "Weekly",
|
||||
"/d6vEc": "Make your profile easier to find and share",
|
||||
"/n5KSF": "{n} ms",
|
||||
"00LcfG": "Load more",
|
||||
"01iNut": "Nostr address does not belong to you",
|
||||
"08zn6O": "Export Keys",
|
||||
"0Azlrb": "Manage",
|
||||
"0BUTMv": "Search...",
|
||||
"0HFX0T": "Use Exact Location",
|
||||
@ -59,7 +58,6 @@
|
||||
"3qnJlS": "You are voting with {amount} sats",
|
||||
"3t3kok": "{n,plural,=1{{n} new note} other{{n} new notes}}",
|
||||
"3tVy+Z": "{n} Followers",
|
||||
"3yk8fB": "Wallet",
|
||||
"450Fty": "None",
|
||||
"47FYwb": "Cancel",
|
||||
"4IPzdn": "Primary Developers",
|
||||
@ -77,7 +75,6 @@
|
||||
"5u6iEc": "Transfer to Pubkey",
|
||||
"5vMmmR": "Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration.",
|
||||
"5ykRmX": "Send zap",
|
||||
"6/SF6e": "<h1>{n}</h1> Cashu sats",
|
||||
"6/hB3S": "Watch Replay",
|
||||
"62nsdy": "Retry",
|
||||
"6559gb": "New follow list length {length}",
|
||||
@ -117,7 +114,6 @@
|
||||
"Ai8VHU": "Unlimited note retention on Snort relay",
|
||||
"AkCxS/": "Reason",
|
||||
"Am8glJ": "Game",
|
||||
"AnLrRC": "Non-Zap",
|
||||
"Aujn2T": "Count",
|
||||
"Awq32I": "Push notifications",
|
||||
"AxDOiG": "Months",
|
||||
@ -172,7 +168,6 @@
|
||||
"FdhSU2": "Claim Now",
|
||||
"FfYsOb": "An error has occured!",
|
||||
"FmXUJg": "follows you",
|
||||
"FvanT6": "Accounts",
|
||||
"G/yZLu": "Remove",
|
||||
"G1BGCg": "Select Wallet",
|
||||
"G3A56c": "Subscribed to Push",
|
||||
@ -194,9 +189,9 @@
|
||||
"HWbkEK": "Clear cache and reload",
|
||||
"HbefNb": "Open Wallet",
|
||||
"HhcAVH": "You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody.",
|
||||
"HqRNN8": "Support",
|
||||
"I1AoOu": "Last post {time}",
|
||||
"IEwZvs": "Are you sure you want to unpin this note?",
|
||||
"IIOul1": "Account Data",
|
||||
"IKKHqV": "Follows",
|
||||
"IOu4Xh": "You must be a {tier} subscriber to access {app} deck",
|
||||
"IVbtTS": "Zap all {n} sats",
|
||||
@ -222,10 +217,8 @@
|
||||
"K3r6DQ": "Delete",
|
||||
"K7AkdL": "Show",
|
||||
"KAhAcM": "Enter LNDHub config",
|
||||
"KHK8B9": "Relay",
|
||||
"KQvWvD": "Deleted",
|
||||
"KahimY": "Unknown event kind: {kind}",
|
||||
"KoFlZg": "Enter mint URL",
|
||||
"KtsyO0": "Enter Pin",
|
||||
"LBAnc7": "View as user?",
|
||||
"LF5kYT": "Other Connections",
|
||||
@ -263,20 +256,21 @@
|
||||
"OQSOJF": "Get a free nostr address",
|
||||
"OQXnew": "You subscription is still active, you can't renew yet",
|
||||
"ORGv1Q": "Created",
|
||||
"OoZgbB": "Failed to update, please try again",
|
||||
"OxPdQ0": "Scanning {date}",
|
||||
"P2o+ZZ": "Invalid Nostr Address",
|
||||
"P61BTu": "Copy Event JSON",
|
||||
"P7FD0F": "System (Default)",
|
||||
"P7nJT9": "Total today (UTC): {amount} sats",
|
||||
"PCSt5T": "Preferences",
|
||||
"PJeJFc": "Summary",
|
||||
"PXQ0z0": "Receiving to <b>{wallet}</b>",
|
||||
"PamNxw": "Unknown file header: {name}",
|
||||
"Pe0ogR": "Theme",
|
||||
"PrsIg7": "Reactions will be shown on every page, if disabled no reactions will be shown",
|
||||
"QDFTjG": "{n} Relays",
|
||||
"QJfhKt": "The private key is like a password, but it cannot be reset. Guard it carefully and never show it to anyone. Once someone has your private key, they will have access to your account forever.",
|
||||
"QWhotP": "Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)",
|
||||
"Qxv0B2": "You currently have {number} sats in your zap pool.",
|
||||
"R/6nsx": "Subscription",
|
||||
"R81upa": "People you follow",
|
||||
"RDha9y": "Service Worker Not Running",
|
||||
"RSr2uB": "Username must only contain lowercase letters and numbers",
|
||||
@ -284,6 +278,7 @@
|
||||
"RfhLwC": "By: {author}",
|
||||
"RhDAoS": "Are you sure you want to delete {id}",
|
||||
"RoOyAh": "Relays",
|
||||
"RrCui3": "Summary",
|
||||
"Rs4kCE": "Bookmark",
|
||||
"SLZGPn": "Enter a pin to encrypt your private key, you must enter this pin every time you open {site}.",
|
||||
"SMO+on": "Send zap to {name}",
|
||||
@ -305,7 +300,6 @@
|
||||
"TpgeGw": "Hex Salt..",
|
||||
"Tpy00S": "People",
|
||||
"TvKqBp": "liked",
|
||||
"TwyMau": "Account",
|
||||
"U1aPPi": "Stop listening",
|
||||
"UDYlxu": "Pending Subscriptions",
|
||||
"UJTWqI": "Remove from my relays",
|
||||
@ -336,11 +330,11 @@
|
||||
"XICsE8": "File hosts",
|
||||
"XPB8VV": "Alby wallet connection",
|
||||
"XQiFEl": "Follows Relay Health",
|
||||
"XSdWHA": "Redeem",
|
||||
"XXm7jJ": "Trending Hashtags",
|
||||
"XgWvGA": "Reactions",
|
||||
"Xnimz0": "Sending from <b>{wallet}</b>",
|
||||
"Xopqkl": "Your default zap amount is {number} sats, example values are calculated from this.",
|
||||
"XrSk2j": "Redeem",
|
||||
"YDURw6": "Service URL",
|
||||
"YR2I9M": "No keys, no {app}, There is no way to reset it if you don't back up. It only takes a minute.",
|
||||
"YXA3AH": "Enable reactions",
|
||||
@ -385,6 +379,7 @@
|
||||
"d+6YsV": "Lists to mute:",
|
||||
"d2ebEu": "Not Subscribed to Push",
|
||||
"d7d0/x": "LN Address",
|
||||
"dK2CcV": "The public key is like your username, you can share it with anyone.",
|
||||
"dOQCL8": "Display name",
|
||||
"deEeEI": "Register",
|
||||
"djLctd": "Amount in sats",
|
||||
@ -427,15 +422,14 @@
|
||||
"h7jvCs": "{site} is more fun together!",
|
||||
"h8XMJL": "Badges",
|
||||
"hF6IN2": "Prune Follow List",
|
||||
"hMQmIw": "Sync Account",
|
||||
"hMzcSq": "Messages",
|
||||
"hRTfTR": "PRO",
|
||||
"hY4lzx": "Supports",
|
||||
"hYOE+U": "Invite",
|
||||
"ha8JKG": "Show graph",
|
||||
"hicxcO": "Show replies",
|
||||
"hmZ3Bz": "Media",
|
||||
"hniz8Z": "here",
|
||||
"hvFRBo": "Interaction",
|
||||
"i/dBAR": "Zap Pool",
|
||||
"i5gBFz": "Your sent and received payments will show up here.",
|
||||
"iCqGww": "Reactions ({n})",
|
||||
@ -444,6 +438,7 @@
|
||||
"iICVoL": "{x} follows ({y} duplicates)",
|
||||
"iNWbVV": "Handle",
|
||||
"iXPL0Z": "Can't login with private key on an insecure connection, please use a Nostr key manager extension instead",
|
||||
"iYc3Ld": "Payments",
|
||||
"ieGrWo": "Follow",
|
||||
"ipHVx5": "Generate Invoice",
|
||||
"itPgxd": "Profile",
|
||||
@ -469,8 +464,10 @@
|
||||
"l3H1EK": "Invite your friends",
|
||||
"lCILNz": "Buy Now",
|
||||
"lD3+8a": "Pay",
|
||||
"lEnclp": "My events: {n}",
|
||||
"lPWASz": "Snort nostr address",
|
||||
"lTbT3s": "Wallet password",
|
||||
"lfOesV": "Non-Zap",
|
||||
"lgg1KN": "account page",
|
||||
"ll3xBp": "Image proxy service",
|
||||
"lnaT9F": "Following {n}",
|
||||
@ -480,6 +477,7 @@
|
||||
"mKAr6h": "Follow all",
|
||||
"mKh2HS": "File upload service",
|
||||
"mKhgP9": "{n,plural,=0{} =1{zapped} other{zapped}}",
|
||||
"mOFG3K": "Start",
|
||||
"mfe8RW": "Option: {n}",
|
||||
"n1Whvj": "Switch",
|
||||
"nDejmx": "Unblock",
|
||||
@ -487,6 +485,7 @@
|
||||
"nGGDsi": "Notifications Allowed",
|
||||
"nIchMQ": "Searching for account activity ({progress})",
|
||||
"nUT0Lv": "Tools",
|
||||
"nWQFic": "Renew",
|
||||
"nihgfo": "Listen to this article",
|
||||
"nwZXeh": "{n} blocked",
|
||||
"o/gK53": "Deck",
|
||||
@ -500,13 +499,13 @@
|
||||
"pI+77w": "Downloadable backups from Snort relay",
|
||||
"pRess9": "ZapPool",
|
||||
"puLNUJ": "Pin",
|
||||
"pukxg/": "Payments",
|
||||
"pzTOmv": "Followers",
|
||||
"qD9EUF": "Email <> DM bridge for your Snort nostr address",
|
||||
"qDwvZ4": "Unknown error",
|
||||
"qMePPG": "Note",
|
||||
"qMx1sA": "Default Zap amount",
|
||||
"qUJTsT": "Blocked",
|
||||
"qXCbgZ": "Unlock",
|
||||
"qZsKBR": "Renew {tier}",
|
||||
"qcJFEJ": "Notifications API Disabled",
|
||||
"qdGuQo": "Your Private Key Is (do not share this with anyone)",
|
||||
@ -540,6 +539,8 @@
|
||||
"uCk8r+": "Already have an account?",
|
||||
"uSV4Ti": "Reposts need to be manually confirmed",
|
||||
"uc0din": "Send sats splits to",
|
||||
"ufvXH1": "Found {n} events",
|
||||
"uhu5aG": "Public",
|
||||
"un1nGw": "{n} notes",
|
||||
"usAvMr": "Edit Profile",
|
||||
"v8lolG": "Start chat",
|
||||
@ -555,7 +556,6 @@
|
||||
"w6qrwX": "NSFW",
|
||||
"wEQDC6": "Edit",
|
||||
"wSZR47": "Submit",
|
||||
"wWLwvh": "Anon",
|
||||
"whSrs+": "Nostr Public Chat",
|
||||
"wih7iJ": "name is blocked",
|
||||
"wofVHy": "Moderation",
|
||||
@ -566,7 +566,6 @@
|
||||
"xEjBS7": "For you",
|
||||
"xIcAOU": "Votes by {type}",
|
||||
"xIoGG9": "Go to",
|
||||
"xQtL3v": "Unlock",
|
||||
"xSoIUU": "Worker Relay",
|
||||
"xaj9Ba": "Provider",
|
||||
"xbVgIm": "Automatically load media",
|
||||
@ -576,6 +575,7 @@
|
||||
"xybOUv": "FAN",
|
||||
"y/bmsG": "Allow",
|
||||
"y1Z3or": "Language",
|
||||
"yAztTU": "{n} eSats",
|
||||
"yCLnBC": "LNURL or Lightning Address",
|
||||
"zCb8fX": "Weight",
|
||||
"zFegDD": "Contact",
|
||||
@ -585,6 +585,5 @@
|
||||
"zm6qS1": "{n} mins to read",
|
||||
"zonsdq": "Failed to load LNURL service",
|
||||
"zvCDao": "Automatically show latest notes",
|
||||
"zwb6LR": "<b>Mint:</b> {url}",
|
||||
"zxvhnE": "Daily"
|
||||
}
|
||||
|
@ -400,7 +400,7 @@
|
||||
"eSzf2G": "{nIn} satsを1回ザップすると、{nOut} satsがZap Poolに割り当てられます。",
|
||||
"eXT2QQ": "グループチャット",
|
||||
"egib+2": "{n,plural,=1{と他 {n} 人} other{と他 {n} 人}}",
|
||||
"ejEGdx": "Home",
|
||||
"ejEGdx": "ホーム",
|
||||
"f1OxTe": "コミュニティーリーダーとは、ローカルコミュニティーで積極的に活動し、新しいユーザーの参加を支援することで、nostrのエコシステムを成長させる個人のことです。コミュニティーリーダーには誰でもなることができますが、現在の名誉ある称号を持つ人はほとんどいません。",
|
||||
"f2CAxA": "出力",
|
||||
"fBI91o": "ザップ",
|
||||
|
Loading…
x
Reference in New Issue
Block a user