diff --git a/fonts/inter-cyrillic.woff2 b/fonts/inter-cyrillic.woff2
new file mode 100644
index 0000000..d750914
Binary files /dev/null and b/fonts/inter-cyrillic.woff2 differ
diff --git a/i18n.js b/i18n.js
index 0be2d3d..0af21ea 100644
--- a/i18n.js
+++ b/i18n.js
@@ -2,58 +2,18 @@ var I18n = (function () {
'use strict';
var languages = {
- de: { name: 'Deutsch', flag: 'DE' },
- en: { name: 'English', flag: 'EN' }
+ en: { name: 'English' },
+ de: { name: 'Deutsch' },
+ fr: { name: 'Français' },
+ it: { name: 'Italiano' },
+ es: { name: 'Español' },
+ pt: { name: 'Português' },
+ ru: { name: 'Русский' }
};
+ var footer = 'Open Source · No Backend · No KYC · Source · Onion';
+
var translations = {
- de: {
- subtitle: 'Monero-Zahlungsanforderung in Sekunden',
- label_addr: 'XMR-Adresse',
- placeholder_addr: '8...',
- label_amount: 'Betrag',
- label_desc: 'Beschreibung (optional)',
- placeholder_desc: 'z.B. Rechnung #42, Freelance-Arbeit...',
- label_timer: 'Zahlungsfrist (optional)',
- days: 'Tage',
- placeholder_timer_custom: 'Tage',
- btn_generate: 'Zahlungsanforderung erstellen',
- btn_open_wallet: 'In Wallet öffnen',
- btn_copy_addr: 'Adresse kopieren',
- btn_download_pdf: 'PDF Rechnung',
- pdf_title: 'Zahlungsanforderung',
- pdf_address: 'XMR-Adresse',
- pdf_amount: 'Betrag',
- pdf_desc: 'Beschreibung',
- pdf_deadline: 'Zahlungsfrist',
- pdf_deadline_days: '{d} Tage',
- pdf_date: 'Datum',
- pdf_scan_qr: 'QR-Code scannen zum Bezahlen',
- pdf_footer: 'Erstellt mit xmrpay.link — Keine Registrierung, kein KYC',
- qr_hint: 'Klick auf QR zum Speichern',
- footer: 'Open Source · Kein Backend · Kein KYC · Source · Onion',
- aria_currency: 'Währung',
- label_uri_details: 'Monero-URI anzeigen',
- label_share_link: 'Teilbarer Link',
- btn_new_request: 'Neue Zahlungsanforderung',
- toast_copied: 'Kopiert!',
- countdown_expired: 'Zahlungsfrist abgelaufen',
- countdown_remaining_days: 'Zahlungsfrist: {d} Tage, {h} Std.',
- countdown_remaining_hours: 'Zahlungsfrist: {h}:{m} Std.',
- rates_offline: 'Kurse nicht verfügbar — nur XMR-Betrag möglich',
- btn_prove_payment: 'Zahlung nachweisen',
- label_tx_hash: 'Transaction ID (TX Hash)',
- placeholder_tx_hash: '64 Hex-Zeichen...',
- label_tx_key: 'Transaction Key (TX Key)',
- placeholder_tx_key: '64 Hex-Zeichen...',
- btn_verify_proof: 'Zahlung verifizieren',
- proof_verifying: 'Verifiziere...',
- proof_verified: 'Zahlung bestätigt: {amount} XMR',
- proof_no_match: 'Kein passender Output gefunden — TX Key oder Adresse stimmt nicht',
- proof_tx_not_found: 'Transaktion nicht gefunden',
- proof_error: 'Fehler bei der Verifizierung',
- status_paid: 'Bezahlt'
- },
en: {
subtitle: 'Monero payment request in seconds',
label_addr: 'XMR Address',
@@ -76,11 +36,10 @@ var I18n = (function () {
pdf_deadline_days: '{d} days',
pdf_date: 'Date',
pdf_scan_qr: 'Scan QR code to pay',
- pdf_footer: 'Created with xmrpay.link — No registration, no KYC',
+ pdf_footer: 'Created with xmrpay.link',
qr_hint: 'Click QR to save',
- footer: 'Open Source · No Backend · No KYC · Source · Onion',
+ footer: footer,
aria_currency: 'Currency',
- label_uri_details: 'Show Monero URI',
label_share_link: 'Shareable link',
btn_new_request: 'New payment request',
toast_copied: 'Copied!',
@@ -96,21 +55,297 @@ var I18n = (function () {
btn_verify_proof: 'Verify payment',
proof_verifying: 'Verifying...',
proof_verified: 'Payment confirmed: {amount} XMR',
- proof_no_match: 'No matching output found — TX key or address mismatch',
+ proof_no_match: 'No matching output — TX key or address mismatch',
proof_tx_not_found: 'Transaction not found',
proof_error: 'Verification error',
status_paid: 'Paid'
+ },
+ de: {
+ subtitle: 'Monero-Zahlungsanforderung in Sekunden',
+ label_addr: 'XMR-Adresse',
+ placeholder_addr: '8...',
+ label_amount: 'Betrag',
+ label_desc: 'Beschreibung (optional)',
+ placeholder_desc: 'z.B. Rechnung #42, Freelance-Arbeit...',
+ label_timer: 'Zahlungsfrist (optional)',
+ days: 'Tage',
+ placeholder_timer_custom: 'Tage',
+ btn_generate: 'Zahlungsanforderung erstellen',
+ btn_open_wallet: 'In Wallet öffnen',
+ btn_copy_addr: 'Adresse kopieren',
+ btn_download_pdf: 'PDF Rechnung',
+ pdf_title: 'Zahlungsanforderung',
+ pdf_address: 'XMR-Adresse',
+ pdf_amount: 'Betrag',
+ pdf_desc: 'Beschreibung',
+ pdf_deadline: 'Zahlungsfrist',
+ pdf_deadline_days: '{d} Tage',
+ pdf_date: 'Datum',
+ pdf_scan_qr: 'QR-Code scannen zum Bezahlen',
+ pdf_footer: 'Erstellt mit xmrpay.link',
+ qr_hint: 'Klick auf QR zum Speichern',
+ footer: footer,
+ aria_currency: 'Währung',
+ label_share_link: 'Teilbarer Link',
+ btn_new_request: 'Neue Zahlungsanforderung',
+ toast_copied: 'Kopiert!',
+ countdown_expired: 'Zahlungsfrist abgelaufen',
+ countdown_remaining_days: 'Zahlungsfrist: {d} Tage, {h} Std.',
+ countdown_remaining_hours: 'Zahlungsfrist: {h}:{m} Std.',
+ rates_offline: 'Kurse nicht verfügbar — nur XMR-Betrag möglich',
+ btn_prove_payment: 'Zahlung nachweisen',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 Hex-Zeichen...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 Hex-Zeichen...',
+ btn_verify_proof: 'Zahlung verifizieren',
+ proof_verifying: 'Verifiziere...',
+ proof_verified: 'Zahlung bestätigt: {amount} XMR',
+ proof_no_match: 'Kein passender Output — TX Key oder Adresse stimmt nicht',
+ proof_tx_not_found: 'Transaktion nicht gefunden',
+ proof_error: 'Fehler bei der Verifizierung',
+ status_paid: 'Bezahlt'
+ },
+ fr: {
+ subtitle: 'Demande de paiement Monero en quelques secondes',
+ label_addr: 'Adresse XMR',
+ placeholder_addr: '8...',
+ label_amount: 'Montant',
+ label_desc: 'Description (facultatif)',
+ placeholder_desc: 'ex. Facture #42, travail freelance...',
+ label_timer: 'Date limite de paiement (facultatif)',
+ days: 'jours',
+ placeholder_timer_custom: 'Jours',
+ btn_generate: 'Créer une demande de paiement',
+ btn_open_wallet: 'Ouvrir dans le wallet',
+ btn_copy_addr: 'Copier l\'adresse',
+ btn_download_pdf: 'Facture PDF',
+ pdf_title: 'Demande de paiement',
+ pdf_address: 'Adresse XMR',
+ pdf_amount: 'Montant',
+ pdf_desc: 'Description',
+ pdf_deadline: 'Date limite de paiement',
+ pdf_deadline_days: '{d} jours',
+ pdf_date: 'Date',
+ pdf_scan_qr: 'Scanner le QR code pour payer',
+ pdf_footer: 'Créé avec xmrpay.link',
+ qr_hint: 'Cliquez sur le QR pour enregistrer',
+ footer: footer,
+ aria_currency: 'Devise',
+ label_share_link: 'Lien partageable',
+ btn_new_request: 'Nouvelle demande de paiement',
+ toast_copied: 'Copié !',
+ countdown_expired: 'Délai de paiement expiré',
+ countdown_remaining_days: 'Délai : {d} jours, {h} h',
+ countdown_remaining_hours: 'Délai : {h}:{m} h',
+ rates_offline: 'Taux indisponibles — montant en XMR uniquement',
+ btn_prove_payment: 'Prouver le paiement',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 caractères hexadécimaux...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 caractères hexadécimaux...',
+ btn_verify_proof: 'Vérifier le paiement',
+ proof_verifying: 'Vérification...',
+ proof_verified: 'Paiement confirmé : {amount} XMR',
+ proof_no_match: 'Aucun output correspondant — TX Key ou adresse incorrecte',
+ proof_tx_not_found: 'Transaction introuvable',
+ proof_error: 'Erreur de vérification',
+ status_paid: 'Payé'
+ },
+ it: {
+ subtitle: 'Richiesta di pagamento Monero in pochi secondi',
+ label_addr: 'Indirizzo XMR',
+ placeholder_addr: '8...',
+ label_amount: 'Importo',
+ label_desc: 'Descrizione (facoltativo)',
+ placeholder_desc: 'es. Fattura #42, lavoro freelance...',
+ label_timer: 'Scadenza pagamento (facoltativo)',
+ days: 'giorni',
+ placeholder_timer_custom: 'Giorni',
+ btn_generate: 'Crea richiesta di pagamento',
+ btn_open_wallet: 'Apri nel wallet',
+ btn_copy_addr: 'Copia indirizzo',
+ btn_download_pdf: 'Fattura PDF',
+ pdf_title: 'Richiesta di pagamento',
+ pdf_address: 'Indirizzo XMR',
+ pdf_amount: 'Importo',
+ pdf_desc: 'Descrizione',
+ pdf_deadline: 'Scadenza pagamento',
+ pdf_deadline_days: '{d} giorni',
+ pdf_date: 'Data',
+ pdf_scan_qr: 'Scansiona il QR per pagare',
+ pdf_footer: 'Creato con xmrpay.link',
+ qr_hint: 'Clicca sul QR per salvare',
+ footer: footer,
+ aria_currency: 'Valuta',
+ label_share_link: 'Link condivisibile',
+ btn_new_request: 'Nuova richiesta di pagamento',
+ toast_copied: 'Copiato!',
+ countdown_expired: 'Scadenza pagamento superata',
+ countdown_remaining_days: 'Scadenza: {d} giorni, {h} ore',
+ countdown_remaining_hours: 'Scadenza: {h}:{m} ore',
+ rates_offline: 'Tassi non disponibili — solo importo in XMR',
+ btn_prove_payment: 'Dimostra pagamento',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 caratteri esadecimali...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 caratteri esadecimali...',
+ btn_verify_proof: 'Verifica pagamento',
+ proof_verifying: 'Verifica in corso...',
+ proof_verified: 'Pagamento confermato: {amount} XMR',
+ proof_no_match: 'Nessun output corrispondente — TX Key o indirizzo errato',
+ proof_tx_not_found: 'Transazione non trovata',
+ proof_error: 'Errore di verifica',
+ status_paid: 'Pagato'
+ },
+ es: {
+ subtitle: 'Solicitud de pago Monero en segundos',
+ label_addr: 'Dirección XMR',
+ placeholder_addr: '8...',
+ label_amount: 'Monto',
+ label_desc: 'Descripción (opcional)',
+ placeholder_desc: 'ej. Factura #42, trabajo freelance...',
+ label_timer: 'Plazo de pago (opcional)',
+ days: 'días',
+ placeholder_timer_custom: 'Días',
+ btn_generate: 'Crear solicitud de pago',
+ btn_open_wallet: 'Abrir en wallet',
+ btn_copy_addr: 'Copiar dirección',
+ btn_download_pdf: 'Factura PDF',
+ pdf_title: 'Solicitud de pago',
+ pdf_address: 'Dirección XMR',
+ pdf_amount: 'Monto',
+ pdf_desc: 'Descripción',
+ pdf_deadline: 'Plazo de pago',
+ pdf_deadline_days: '{d} días',
+ pdf_date: 'Fecha',
+ pdf_scan_qr: 'Escanear QR para pagar',
+ pdf_footer: 'Creado con xmrpay.link',
+ qr_hint: 'Clic en QR para guardar',
+ footer: footer,
+ aria_currency: 'Moneda',
+ label_share_link: 'Enlace compartible',
+ btn_new_request: 'Nueva solicitud de pago',
+ toast_copied: '¡Copiado!',
+ countdown_expired: 'Plazo de pago vencido',
+ countdown_remaining_days: 'Plazo: {d} días, {h} h',
+ countdown_remaining_hours: 'Plazo: {h}:{m} h',
+ rates_offline: 'Tasas no disponibles — solo monto en XMR',
+ btn_prove_payment: 'Demostrar pago',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 caracteres hexadecimales...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 caracteres hexadecimales...',
+ btn_verify_proof: 'Verificar pago',
+ proof_verifying: 'Verificando...',
+ proof_verified: 'Pago confirmado: {amount} XMR',
+ proof_no_match: 'Ningún output coincidente — TX Key o dirección incorrecta',
+ proof_tx_not_found: 'Transacción no encontrada',
+ proof_error: 'Error de verificación',
+ status_paid: 'Pagado'
+ },
+ pt: {
+ subtitle: 'Pedido de pagamento Monero em segundos',
+ label_addr: 'Endereço XMR',
+ placeholder_addr: '8...',
+ label_amount: 'Valor',
+ label_desc: 'Descrição (opcional)',
+ placeholder_desc: 'ex. Fatura #42, trabalho freelance...',
+ label_timer: 'Prazo de pagamento (opcional)',
+ days: 'dias',
+ placeholder_timer_custom: 'Dias',
+ btn_generate: 'Criar pedido de pagamento',
+ btn_open_wallet: 'Abrir na wallet',
+ btn_copy_addr: 'Copiar endereço',
+ btn_download_pdf: 'Fatura PDF',
+ pdf_title: 'Pedido de pagamento',
+ pdf_address: 'Endereço XMR',
+ pdf_amount: 'Valor',
+ pdf_desc: 'Descrição',
+ pdf_deadline: 'Prazo de pagamento',
+ pdf_deadline_days: '{d} dias',
+ pdf_date: 'Data',
+ pdf_scan_qr: 'Digitalizar QR para pagar',
+ pdf_footer: 'Criado com xmrpay.link',
+ qr_hint: 'Clique no QR para guardar',
+ footer: footer,
+ aria_currency: 'Moeda',
+ label_share_link: 'Link partilhável',
+ btn_new_request: 'Novo pedido de pagamento',
+ toast_copied: 'Copiado!',
+ countdown_expired: 'Prazo de pagamento expirado',
+ countdown_remaining_days: 'Prazo: {d} dias, {h} h',
+ countdown_remaining_hours: 'Prazo: {h}:{m} h',
+ rates_offline: 'Taxas indisponíveis — apenas valor em XMR',
+ btn_prove_payment: 'Comprovar pagamento',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 caracteres hexadecimais...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 caracteres hexadecimais...',
+ btn_verify_proof: 'Verificar pagamento',
+ proof_verifying: 'A verificar...',
+ proof_verified: 'Pagamento confirmado: {amount} XMR',
+ proof_no_match: 'Nenhum output correspondente — TX Key ou endereço incorreto',
+ proof_tx_not_found: 'Transação não encontrada',
+ proof_error: 'Erro de verificação',
+ status_paid: 'Pago'
+ },
+ ru: {
+ subtitle: 'Запрос на оплату Monero за секунды',
+ label_addr: 'Адрес XMR',
+ placeholder_addr: '8...',
+ label_amount: 'Сумма',
+ label_desc: 'Описание (необязательно)',
+ placeholder_desc: 'напр. Счёт #42, фриланс...',
+ label_timer: 'Срок оплаты (необязательно)',
+ days: 'дней',
+ placeholder_timer_custom: 'Дней',
+ btn_generate: 'Создать запрос на оплату',
+ btn_open_wallet: 'Открыть в кошельке',
+ btn_copy_addr: 'Копировать адрес',
+ btn_download_pdf: 'PDF счёт',
+ pdf_title: 'Запрос на оплату',
+ pdf_address: 'Адрес XMR',
+ pdf_amount: 'Сумма',
+ pdf_desc: 'Описание',
+ pdf_deadline: 'Срок оплаты',
+ pdf_deadline_days: '{d} дней',
+ pdf_date: 'Дата',
+ pdf_scan_qr: 'Сканируйте QR для оплаты',
+ pdf_footer: 'Создано с помощью xmrpay.link',
+ qr_hint: 'Нажмите на QR для сохранения',
+ footer: footer,
+ aria_currency: 'Валюта',
+ label_share_link: 'Ссылка для отправки',
+ btn_new_request: 'Новый запрос на оплату',
+ toast_copied: 'Скопировано!',
+ countdown_expired: 'Срок оплаты истёк',
+ countdown_remaining_days: 'Срок: {d} дней, {h} ч',
+ countdown_remaining_hours: 'Срок: {h}:{m} ч',
+ rates_offline: 'Курсы недоступны — только сумма в XMR',
+ btn_prove_payment: 'Подтвердить оплату',
+ label_tx_hash: 'Transaction ID (TX Hash)',
+ placeholder_tx_hash: '64 шестнадцатеричных символа...',
+ label_tx_key: 'Transaction Key (TX Key)',
+ placeholder_tx_key: '64 шестнадцатеричных символа...',
+ btn_verify_proof: 'Проверить оплату',
+ proof_verifying: 'Проверка...',
+ proof_verified: 'Оплата подтверждена: {amount} XMR',
+ proof_no_match: 'Соответствующий выход не найден — неверный TX Key или адрес',
+ proof_tx_not_found: 'Транзакция не найдена',
+ proof_error: 'Ошибка проверки',
+ status_paid: 'Оплачено'
}
};
- var currentLang = 'de';
+ var currentLang = 'en';
function detectLang() {
var saved = null;
try { saved = localStorage.getItem('xmrpay_lang'); } catch (e) {}
if (saved && translations[saved]) return saved;
- var navLangs = navigator.languages || [navigator.language || 'de'];
+ var navLangs = navigator.languages || [navigator.language || 'en'];
for (var i = 0; i < navLangs.length; i++) {
var code = navLangs[i].substring(0, 2).toLowerCase();
if (translations[code]) return code;
@@ -143,7 +378,7 @@ var I18n = (function () {
// Update toggle label
var cur = document.getElementById('langCurrent');
- if (cur) cur.textContent = languages[lang].flag;
+ if (cur) cur.textContent = languages[lang].name;
// Update dropdown active state
document.querySelectorAll('.lang-option').forEach(function (btn) {
diff --git a/i18n.min.js b/i18n.min.js
index e2139de..d9edd57 100644
--- a/i18n.min.js
+++ b/i18n.min.js
@@ -1 +1 @@
-var I18n=(function(){"use strict";var d={de:{name:"Deutsch",flag:"DE"},en:{name:"English",flag:"EN"}},i={de:{subtitle:"Monero-Zahlungsanforderung in Sekunden",label_addr:"XMR-Adresse",placeholder_addr:"8...",label_amount:"Betrag",label_desc:"Beschreibung (optional)",placeholder_desc:"z.B. Rechnung #42, Freelance-Arbeit...",label_timer:"Zahlungsfrist (optional)",days:"Tage",placeholder_timer_custom:"Tage",btn_generate:"Zahlungsanforderung erstellen",btn_open_wallet:"In Wallet \xF6ffnen",btn_copy_addr:"Adresse kopieren",btn_download_pdf:"PDF Rechnung",pdf_title:"Zahlungsanforderung",pdf_address:"XMR-Adresse",pdf_amount:"Betrag",pdf_desc:"Beschreibung",pdf_deadline:"Zahlungsfrist",pdf_deadline_days:"{d} Tage",pdf_date:"Datum",pdf_scan_qr:"QR-Code scannen zum Bezahlen",pdf_footer:"Erstellt mit xmrpay.link \u2014 Keine Registrierung, kein KYC",qr_hint:"Klick auf QR zum Speichern",footer:'Open Source · Kein Backend · Kein KYC · Source · Onion',aria_currency:"W\xE4hrung",label_uri_details:"Monero-URI anzeigen",label_share_link:"Teilbarer Link",btn_new_request:"Neue Zahlungsanforderung",toast_copied:"Kopiert!",countdown_expired:"Zahlungsfrist abgelaufen",countdown_remaining_days:"Zahlungsfrist: {d} Tage, {h} Std.",countdown_remaining_hours:"Zahlungsfrist: {h}:{m} Std.",rates_offline:"Kurse nicht verf\xFCgbar \u2014 nur XMR-Betrag m\xF6glich",btn_prove_payment:"Zahlung nachweisen",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 Hex-Zeichen...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 Hex-Zeichen...",btn_verify_proof:"Zahlung verifizieren",proof_verifying:"Verifiziere...",proof_verified:"Zahlung best\xE4tigt: {amount} XMR",proof_no_match:"Kein passender Output gefunden \u2014 TX Key oder Adresse stimmt nicht",proof_tx_not_found:"Transaktion nicht gefunden",proof_error:"Fehler bei der Verifizierung",status_paid:"Bezahlt"},en:{subtitle:"Monero payment request in seconds",label_addr:"XMR Address",placeholder_addr:"8...",label_amount:"Amount",label_desc:"Description (optional)",placeholder_desc:"e.g. Invoice #42, freelance work...",label_timer:"Payment deadline (optional)",days:"days",placeholder_timer_custom:"Days",btn_generate:"Create payment request",btn_open_wallet:"Open in wallet",btn_copy_addr:"Copy address",btn_download_pdf:"PDF Invoice",pdf_title:"Payment Request",pdf_address:"XMR Address",pdf_amount:"Amount",pdf_desc:"Description",pdf_deadline:"Payment deadline",pdf_deadline_days:"{d} days",pdf_date:"Date",pdf_scan_qr:"Scan QR code to pay",pdf_footer:"Created with xmrpay.link \u2014 No registration, no KYC",qr_hint:"Click QR to save",footer:'Open Source · No Backend · No KYC · Source · Onion',aria_currency:"Currency",label_uri_details:"Show Monero URI",label_share_link:"Shareable link",btn_new_request:"New payment request",toast_copied:"Copied!",countdown_expired:"Payment deadline expired",countdown_remaining_days:"Deadline: {d} days, {h} hrs",countdown_remaining_hours:"Deadline: {h}:{m} hrs",rates_offline:"Rates unavailable \u2014 XMR amount only",btn_prove_payment:"Prove payment",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 hex characters...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 hex characters...",btn_verify_proof:"Verify payment",proof_verifying:"Verifying...",proof_verified:"Payment confirmed: {amount} XMR",proof_no_match:"No matching output found \u2014 TX key or address mismatch",proof_tx_not_found:"Transaction not found",proof_error:"Verification error",status_paid:"Paid"}},o="de";function u(){var e=null;try{e=localStorage.getItem("xmrpay_lang")}catch{}if(e&&i[e])return e;for(var n=navigator.languages||[navigator.language||"de"],t=0;tSource · Onion',d={en:{subtitle:"Monero payment request in seconds",label_addr:"XMR Address",placeholder_addr:"8...",label_amount:"Amount",label_desc:"Description (optional)",placeholder_desc:"e.g. Invoice #42, freelance work...",label_timer:"Payment deadline (optional)",days:"days",placeholder_timer_custom:"Days",btn_generate:"Create payment request",btn_open_wallet:"Open in wallet",btn_copy_addr:"Copy address",btn_download_pdf:"PDF Invoice",pdf_title:"Payment Request",pdf_address:"XMR Address",pdf_amount:"Amount",pdf_desc:"Description",pdf_deadline:"Payment deadline",pdf_deadline_days:"{d} days",pdf_date:"Date",pdf_scan_qr:"Scan QR code to pay",pdf_footer:"Created with xmrpay.link",qr_hint:"Click QR to save",footer:t,aria_currency:"Currency",label_share_link:"Shareable link",btn_new_request:"New payment request",toast_copied:"Copied!",countdown_expired:"Payment deadline expired",countdown_remaining_days:"Deadline: {d} days, {h} hrs",countdown_remaining_hours:"Deadline: {h}:{m} hrs",rates_offline:"Rates unavailable \u2014 XMR amount only",btn_prove_payment:"Prove payment",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 hex characters...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 hex characters...",btn_verify_proof:"Verify payment",proof_verifying:"Verifying...",proof_verified:"Payment confirmed: {amount} XMR",proof_no_match:"No matching output \u2014 TX key or address mismatch",proof_tx_not_found:"Transaction not found",proof_error:"Verification error",status_paid:"Paid"},de:{subtitle:"Monero-Zahlungsanforderung in Sekunden",label_addr:"XMR-Adresse",placeholder_addr:"8...",label_amount:"Betrag",label_desc:"Beschreibung (optional)",placeholder_desc:"z.B. Rechnung #42, Freelance-Arbeit...",label_timer:"Zahlungsfrist (optional)",days:"Tage",placeholder_timer_custom:"Tage",btn_generate:"Zahlungsanforderung erstellen",btn_open_wallet:"In Wallet \xF6ffnen",btn_copy_addr:"Adresse kopieren",btn_download_pdf:"PDF Rechnung",pdf_title:"Zahlungsanforderung",pdf_address:"XMR-Adresse",pdf_amount:"Betrag",pdf_desc:"Beschreibung",pdf_deadline:"Zahlungsfrist",pdf_deadline_days:"{d} Tage",pdf_date:"Datum",pdf_scan_qr:"QR-Code scannen zum Bezahlen",pdf_footer:"Erstellt mit xmrpay.link",qr_hint:"Klick auf QR zum Speichern",footer:t,aria_currency:"W\xE4hrung",label_share_link:"Teilbarer Link",btn_new_request:"Neue Zahlungsanforderung",toast_copied:"Kopiert!",countdown_expired:"Zahlungsfrist abgelaufen",countdown_remaining_days:"Zahlungsfrist: {d} Tage, {h} Std.",countdown_remaining_hours:"Zahlungsfrist: {h}:{m} Std.",rates_offline:"Kurse nicht verf\xFCgbar \u2014 nur XMR-Betrag m\xF6glich",btn_prove_payment:"Zahlung nachweisen",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 Hex-Zeichen...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 Hex-Zeichen...",btn_verify_proof:"Zahlung verifizieren",proof_verifying:"Verifiziere...",proof_verified:"Zahlung best\xE4tigt: {amount} XMR",proof_no_match:"Kein passender Output \u2014 TX Key oder Adresse stimmt nicht",proof_tx_not_found:"Transaktion nicht gefunden",proof_error:"Fehler bei der Verifizierung",status_paid:"Bezahlt"},fr:{subtitle:"Demande de paiement Monero en quelques secondes",label_addr:"Adresse XMR",placeholder_addr:"8...",label_amount:"Montant",label_desc:"Description (facultatif)",placeholder_desc:"ex. Facture #42, travail freelance...",label_timer:"Date limite de paiement (facultatif)",days:"jours",placeholder_timer_custom:"Jours",btn_generate:"Cr\xE9er une demande de paiement",btn_open_wallet:"Ouvrir dans le wallet",btn_copy_addr:"Copier l'adresse",btn_download_pdf:"Facture PDF",pdf_title:"Demande de paiement",pdf_address:"Adresse XMR",pdf_amount:"Montant",pdf_desc:"Description",pdf_deadline:"Date limite de paiement",pdf_deadline_days:"{d} jours",pdf_date:"Date",pdf_scan_qr:"Scanner le QR code pour payer",pdf_footer:"Cr\xE9\xE9 avec xmrpay.link",qr_hint:"Cliquez sur le QR pour enregistrer",footer:t,aria_currency:"Devise",label_share_link:"Lien partageable",btn_new_request:"Nouvelle demande de paiement",toast_copied:"Copi\xE9 !",countdown_expired:"D\xE9lai de paiement expir\xE9",countdown_remaining_days:"D\xE9lai : {d} jours, {h} h",countdown_remaining_hours:"D\xE9lai : {h}:{m} h",rates_offline:"Taux indisponibles \u2014 montant en XMR uniquement",btn_prove_payment:"Prouver le paiement",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 caract\xE8res hexad\xE9cimaux...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 caract\xE8res hexad\xE9cimaux...",btn_verify_proof:"V\xE9rifier le paiement",proof_verifying:"V\xE9rification...",proof_verified:"Paiement confirm\xE9 : {amount} XMR",proof_no_match:"Aucun output correspondant \u2014 TX Key ou adresse incorrecte",proof_tx_not_found:"Transaction introuvable",proof_error:"Erreur de v\xE9rification",status_paid:"Pay\xE9"},it:{subtitle:"Richiesta di pagamento Monero in pochi secondi",label_addr:"Indirizzo XMR",placeholder_addr:"8...",label_amount:"Importo",label_desc:"Descrizione (facoltativo)",placeholder_desc:"es. Fattura #42, lavoro freelance...",label_timer:"Scadenza pagamento (facoltativo)",days:"giorni",placeholder_timer_custom:"Giorni",btn_generate:"Crea richiesta di pagamento",btn_open_wallet:"Apri nel wallet",btn_copy_addr:"Copia indirizzo",btn_download_pdf:"Fattura PDF",pdf_title:"Richiesta di pagamento",pdf_address:"Indirizzo XMR",pdf_amount:"Importo",pdf_desc:"Descrizione",pdf_deadline:"Scadenza pagamento",pdf_deadline_days:"{d} giorni",pdf_date:"Data",pdf_scan_qr:"Scansiona il QR per pagare",pdf_footer:"Creato con xmrpay.link",qr_hint:"Clicca sul QR per salvare",footer:t,aria_currency:"Valuta",label_share_link:"Link condivisibile",btn_new_request:"Nuova richiesta di pagamento",toast_copied:"Copiato!",countdown_expired:"Scadenza pagamento superata",countdown_remaining_days:"Scadenza: {d} giorni, {h} ore",countdown_remaining_hours:"Scadenza: {h}:{m} ore",rates_offline:"Tassi non disponibili \u2014 solo importo in XMR",btn_prove_payment:"Dimostra pagamento",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 caratteri esadecimali...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 caratteri esadecimali...",btn_verify_proof:"Verifica pagamento",proof_verifying:"Verifica in corso...",proof_verified:"Pagamento confermato: {amount} XMR",proof_no_match:"Nessun output corrispondente \u2014 TX Key o indirizzo errato",proof_tx_not_found:"Transazione non trovata",proof_error:"Errore di verifica",status_paid:"Pagato"},es:{subtitle:"Solicitud de pago Monero en segundos",label_addr:"Direcci\xF3n XMR",placeholder_addr:"8...",label_amount:"Monto",label_desc:"Descripci\xF3n (opcional)",placeholder_desc:"ej. Factura #42, trabajo freelance...",label_timer:"Plazo de pago (opcional)",days:"d\xEDas",placeholder_timer_custom:"D\xEDas",btn_generate:"Crear solicitud de pago",btn_open_wallet:"Abrir en wallet",btn_copy_addr:"Copiar direcci\xF3n",btn_download_pdf:"Factura PDF",pdf_title:"Solicitud de pago",pdf_address:"Direcci\xF3n XMR",pdf_amount:"Monto",pdf_desc:"Descripci\xF3n",pdf_deadline:"Plazo de pago",pdf_deadline_days:"{d} d\xEDas",pdf_date:"Fecha",pdf_scan_qr:"Escanear QR para pagar",pdf_footer:"Creado con xmrpay.link",qr_hint:"Clic en QR para guardar",footer:t,aria_currency:"Moneda",label_share_link:"Enlace compartible",btn_new_request:"Nueva solicitud de pago",toast_copied:"\xA1Copiado!",countdown_expired:"Plazo de pago vencido",countdown_remaining_days:"Plazo: {d} d\xEDas, {h} h",countdown_remaining_hours:"Plazo: {h}:{m} h",rates_offline:"Tasas no disponibles \u2014 solo monto en XMR",btn_prove_payment:"Demostrar pago",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 caracteres hexadecimales...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 caracteres hexadecimales...",btn_verify_proof:"Verificar pago",proof_verifying:"Verificando...",proof_verified:"Pago confirmado: {amount} XMR",proof_no_match:"Ning\xFAn output coincidente \u2014 TX Key o direcci\xF3n incorrecta",proof_tx_not_found:"Transacci\xF3n no encontrada",proof_error:"Error de verificaci\xF3n",status_paid:"Pagado"},pt:{subtitle:"Pedido de pagamento Monero em segundos",label_addr:"Endere\xE7o XMR",placeholder_addr:"8...",label_amount:"Valor",label_desc:"Descri\xE7\xE3o (opcional)",placeholder_desc:"ex. Fatura #42, trabalho freelance...",label_timer:"Prazo de pagamento (opcional)",days:"dias",placeholder_timer_custom:"Dias",btn_generate:"Criar pedido de pagamento",btn_open_wallet:"Abrir na wallet",btn_copy_addr:"Copiar endere\xE7o",btn_download_pdf:"Fatura PDF",pdf_title:"Pedido de pagamento",pdf_address:"Endere\xE7o XMR",pdf_amount:"Valor",pdf_desc:"Descri\xE7\xE3o",pdf_deadline:"Prazo de pagamento",pdf_deadline_days:"{d} dias",pdf_date:"Data",pdf_scan_qr:"Digitalizar QR para pagar",pdf_footer:"Criado com xmrpay.link",qr_hint:"Clique no QR para guardar",footer:t,aria_currency:"Moeda",label_share_link:"Link partilh\xE1vel",btn_new_request:"Novo pedido de pagamento",toast_copied:"Copiado!",countdown_expired:"Prazo de pagamento expirado",countdown_remaining_days:"Prazo: {d} dias, {h} h",countdown_remaining_hours:"Prazo: {h}:{m} h",rates_offline:"Taxas indispon\xEDveis \u2014 apenas valor em XMR",btn_prove_payment:"Comprovar pagamento",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 caracteres hexadecimais...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 caracteres hexadecimais...",btn_verify_proof:"Verificar pagamento",proof_verifying:"A verificar...",proof_verified:"Pagamento confirmado: {amount} XMR",proof_no_match:"Nenhum output correspondente \u2014 TX Key ou endere\xE7o incorreto",proof_tx_not_found:"Transa\xE7\xE3o n\xE3o encontrada",proof_error:"Erro de verifica\xE7\xE3o",status_paid:"Pago"},ru:{subtitle:"\u0417\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u043E\u043F\u043B\u0430\u0442\u0443 Monero \u0437\u0430 \u0441\u0435\u043A\u0443\u043D\u0434\u044B",label_addr:"\u0410\u0434\u0440\u0435\u0441 XMR",placeholder_addr:"8...",label_amount:"\u0421\u0443\u043C\u043C\u0430",label_desc:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",placeholder_desc:"\u043D\u0430\u043F\u0440. \u0421\u0447\u0451\u0442 #42, \u0444\u0440\u0438\u043B\u0430\u043D\u0441...",label_timer:"\u0421\u0440\u043E\u043A \u043E\u043F\u043B\u0430\u0442\u044B (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",days:"\u0434\u043D\u0435\u0439",placeholder_timer_custom:"\u0414\u043D\u0435\u0439",btn_generate:"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u043E\u043F\u043B\u0430\u0442\u0443",btn_open_wallet:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u043A\u043E\u0448\u0435\u043B\u044C\u043A\u0435",btn_copy_addr:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0434\u0440\u0435\u0441",btn_download_pdf:"PDF \u0441\u0447\u0451\u0442",pdf_title:"\u0417\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u043E\u043F\u043B\u0430\u0442\u0443",pdf_address:"\u0410\u0434\u0440\u0435\u0441 XMR",pdf_amount:"\u0421\u0443\u043C\u043C\u0430",pdf_desc:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",pdf_deadline:"\u0421\u0440\u043E\u043A \u043E\u043F\u043B\u0430\u0442\u044B",pdf_deadline_days:"{d} \u0434\u043D\u0435\u0439",pdf_date:"\u0414\u0430\u0442\u0430",pdf_scan_qr:"\u0421\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR \u0434\u043B\u044F \u043E\u043F\u043B\u0430\u0442\u044B",pdf_footer:"\u0421\u043E\u0437\u0434\u0430\u043D\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E xmrpay.link",qr_hint:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u043D\u0430 QR \u0434\u043B\u044F \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F",footer:t,aria_currency:"\u0412\u0430\u043B\u044E\u0442\u0430",label_share_link:"\u0421\u0441\u044B\u043B\u043A\u0430 \u0434\u043B\u044F \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438",btn_new_request:"\u041D\u043E\u0432\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u043E\u043F\u043B\u0430\u0442\u0443",toast_copied:"\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E!",countdown_expired:"\u0421\u0440\u043E\u043A \u043E\u043F\u043B\u0430\u0442\u044B \u0438\u0441\u0442\u0451\u043A",countdown_remaining_days:"\u0421\u0440\u043E\u043A: {d} \u0434\u043D\u0435\u0439, {h} \u0447",countdown_remaining_hours:"\u0421\u0440\u043E\u043A: {h}:{m} \u0447",rates_offline:"\u041A\u0443\u0440\u0441\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0443\u043C\u043C\u0430 \u0432 XMR",btn_prove_payment:"\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043E\u043F\u043B\u0430\u0442\u0443",label_tx_hash:"Transaction ID (TX Hash)",placeholder_tx_hash:"64 \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u0430...",label_tx_key:"Transaction Key (TX Key)",placeholder_tx_key:"64 \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u0430...",btn_verify_proof:"\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043E\u043F\u043B\u0430\u0442\u0443",proof_verifying:"\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430...",proof_verified:"\u041E\u043F\u043B\u0430\u0442\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0430: {amount} XMR",proof_no_match:"\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0432\u044B\u0445\u043E\u0434 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u2014 \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 TX Key \u0438\u043B\u0438 \u0430\u0434\u0440\u0435\u0441",proof_tx_not_found:"\u0422\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u044F \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430",proof_error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438",status_paid:"\u041E\u043F\u043B\u0430\u0447\u0435\u043D\u043E"}},i="en";function p(){var e=null;try{e=localStorage.getItem("xmrpay_lang")}catch{}if(e&&d[e])return e;for(var a=navigator.languages||[navigator.language||"en"],n=0;n
- DE
+ English
diff --git a/style.css b/style.css
index dc2e083..b8da7ac 100644
--- a/style.css
+++ b/style.css
@@ -7,6 +7,15 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 100 900;
+ font-display: swap;
+ src: url('fonts/inter-cyrillic.woff2') format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+
@font-face {
font-family: 'JetBrains Mono';
font-style: normal;