${results.map((item) => `
${escapeHtml(item.relay)}:
- ${item.ok ? "OK" : escapeHtml(item.message || "failed")}
+ ${item.ok ? "OK" : escapeHtml(item.message || nostrLabel("failed", currentUiLang()))}
`).join("")}
`;
}
async function copyTextFromElement(targetId, button) {
const value = el(targetId).textContent.trim();
- if (!value || value === "Not published" || value === "Not generated") return;
+ const target = el(targetId);
+ if (!value || isEmptyOutput(target)) return;
await navigator.clipboard.writeText(value);
const oldText = button.textContent;
- button.textContent = "Copied";
+ button.textContent = nostrLabel("copied", currentUiLang());
setTimeout(() => {
button.textContent = oldText;
}, 1200);
@@ -1187,12 +1661,12 @@ Join us in a revolution that values truth and transparency. Together, we can bui
async function fetchAndRenderFromInput(eventInput, relaysValue, statusElement = el("viewer-status")) {
const parsed = parseEventReference(eventInput);
- if (!parsed) throw new Error("Enter an naddr, event id, note1, or nevent1.");
+ if (!parsed) throw new Error(nostrLabel("event_reference_required", currentUiLang()));
const relays = parseRelays(`${relaysValue}\n${(parsed.relays || []).join("\n")}`);
- if (!relays.length) throw new Error("Enter at least one wss:// relay.");
+ if (!relays.length) throw new Error(nostrLabel("relay_required", currentUiLang()));
el("viewer-event-id").value = eventInput;
el("viewer-relays").value = relays.join("\n");
- statusElement.textContent = "Fetching...";
+ statusElement.textContent = nostrLabel("fetching", currentUiLang());
const nostrEvent = parsed.type === "address"
? await fetchReplaceable(parsed.address, relays)
: await fetchEvent(parsed.id, relays);
@@ -1203,7 +1677,7 @@ Join us in a revolution that values truth and transparency. Together, we can bui
el("field-lang").value = config.lang;
el("viewer-config-output").value = JSON.stringify(config, null, 2);
renderPreview(config);
- statusElement.textContent = `Fetched ${parsed.type === "address" ? parsed.address.identifier : parsed.id}`;
+ statusElement.textContent = `${nostrLabel("fetched", config.lang)} ${parsed.type === "address" ? parsed.address.identifier : parsed.id}`;
closeViewerDrawer();
}
@@ -1239,6 +1713,7 @@ Join us in a revolution that values truth and transparency. Together, we can bui
"field-headline",
"field-content",
"field-url-message",
+ "field-url",
"field-footer-message"
].forEach((fieldId) => {
const field = el(fieldId);
@@ -1262,9 +1737,9 @@ Join us in a revolution that values truth and transparency. Together, we can bui
el("generate-anon-identity").addEventListener("click", () => {
try {
const identity = getOrCreateAnonIdentity(true);
- el("author-npub-output").textContent = identity.npub;
+ setRealOutput("author-npub-output", identity.npub);
refreshIdentityState();
- el("publish-status").textContent = `Anonymous npub generated: ${identity.npub}`;
+ el("publish-status").textContent = `${nostrLabel("npub_generated", currentUiLang())} ${identity.npub}`;
} catch (error) {
el("publish-status").textContent = error.message;
}
@@ -1273,7 +1748,7 @@ Join us in a revolution that values truth and transparency. Together, we can bui
el("preview-editor").addEventListener("click", () => {
try {
formToPreview();
- el("publish-status").textContent = "Preview updated.";
+ el("publish-status").textContent = nostrLabel("preview_updated", currentUiLang());
} catch (error) {
el("publish-status").textContent = error.message;
}
@@ -1286,9 +1761,9 @@ Join us in a revolution that values truth and transparency. Together, we can bui
const identity = getOrCreateAnonIdentity(false);
const poster = withPosterUrl(payload, identity, relays);
const event = buildUnsignedEvent(poster.payload);
- el("author-npub-output").textContent = identity.npub;
- el("naddr-output").textContent = poster.naddr;
- el("poster-url-output").textContent = poster.posterUrl;
+ setRealOutput("author-npub-output", identity.npub);
+ setRealOutput("naddr-output", poster.naddr);
+ setRealOutput("poster-url-output", poster.posterUrl);
el("event-json-output").value = JSON.stringify(event, null, 2);
downloadJson(`${poster.payload.folder_name}-voxvera-event-unsigned.json`, event);
} catch (error) {
@@ -1301,10 +1776,10 @@ Join us in a revolution that values truth and transparency. Together, we can bui
try {
const payload = buildPayloadFromForm();
const relays = parseRelays(el("editor-relays").value);
- if (!relays.length) throw new Error("Enter at least one wss:// relay.");
- el("publish-status").textContent = "Signing and publishing...";
+ if (!relays.length) throw new Error(nostrLabel("relay_required", currentUiLang()));
+ el("publish-status").textContent = nostrLabel("signing_publishing", currentUiLang());
const result = await signAndPublish(payload, relays);
- el("event-id-output").textContent = result.event.id;
+ setRealOutput("event-id-output", result.event.id);
el("event-json-output").value = JSON.stringify(result.event, null, 2);
el("viewer-event-id").value = result.naddr;
el("publish-status").innerHTML = renderRelayResults(result.results);
@@ -1327,7 +1802,7 @@ Join us in a revolution that values truth and transparency. Together, we can bui
const value = el("viewer-config-output").value;
if (!value) return;
await navigator.clipboard.writeText(value);
- el("viewer-status").textContent = "Config copied.";
+ el("viewer-status").textContent = nostrLabel("config_copied", currentUiLang());
});
el("print-preview").addEventListener("click", () => window.print());