From 849c7eb4b95610d3cd4d40f652659268cd859e9e Mon Sep 17 00:00:00 2001 From: Silberengel Date: Mon, 30 Mar 2026 10:21:13 +0200 Subject: [PATCH] update locales --- .gitignore | 3 + package.json | 2 + scripts/sync-i18n-locales.ts | 16 +- src/i18n/locales/ar.ts | 396 +++++++++++++++++- src/i18n/locales/de.ts | 175 +++++++- src/i18n/locales/en.ts | 51 ++- src/i18n/locales/es.ts | 396 +++++++++++++++++- src/i18n/locales/fa.ts | 396 +++++++++++++++++- src/i18n/locales/fr.ts | 395 ++++++++++++++++- src/i18n/locales/hi.ts | 396 +++++++++++++++++- src/i18n/locales/it.ts | 396 +++++++++++++++++- src/i18n/locales/ja.ts | 396 +++++++++++++++++- src/i18n/locales/ko.ts | 396 +++++++++++++++++- src/i18n/locales/pl.ts | 395 ++++++++++++++++- src/i18n/locales/pt-BR.ts | 396 +++++++++++++++++- src/i18n/locales/pt-PT.ts | 396 +++++++++++++++++- src/i18n/locales/ru.ts | 396 +++++++++++++++++- src/i18n/locales/th.ts | 396 +++++++++++++++++- src/i18n/locales/zh.ts | 396 +++++++++++++++++- .../FavoriteRelaysActivityProvider.tsx | 45 +- src/providers/LiveActivitiesProvider.tsx | 5 +- 21 files changed, 5729 insertions(+), 110 deletions(-) diff --git a/.gitignore b/.gitignore index ae47bc6b..36876ce0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ dev-dist *.sw? .vercel + +.venv-i18n +scripts/i18n-overrides/.gaps diff --git a/package.json b/package.json index 77e1f98b..d553f7cf 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "test:run": "vitest run", "i18n:sync": "npx tsx scripts/sync-i18n-locales.ts && prettier --write \"src/i18n/locales/*.ts\"", "i18n:audit": "npx tsx scripts/i18n-audit.ts", + "i18n:gaps": "npx tsx scripts/export-en-parity-gaps.ts", + "i18n:translate-de": "PYTHONUNBUFFERED=1 .venv-i18n/bin/python scripts/auto_translate_i18n.py de", "electron:dev": "concurrently -k -n vite,electron -c blue,green \"vite --host\" \"wait-on http://127.0.0.1:5173 && cross-env NODE_ENV=development electron .\"", "build:electron": "tsc -b && vite build --base ./", "electron:pack": "npm run build:electron && electron-builder" diff --git a/scripts/sync-i18n-locales.ts b/scripts/sync-i18n-locales.ts index cbfc3f13..f3c31eb8 100644 --- a/scripts/sync-i18n-locales.ts +++ b/scripts/sync-i18n-locales.ts @@ -27,6 +27,18 @@ import zh from '../src/i18n/locales/zh' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const srcDir = path.join(__dirname, '..', 'src') const localesDir = path.join(__dirname, '..', 'src/i18n/locales') +const overridesDir = path.join(__dirname, 'i18n-overrides') + +function loadOverrides(localeFile: string): Record { + if (localeFile === 'en.ts') return {} + const p = path.join(overridesDir, localeFile.replace(/\.ts$/, '.json')) + if (!fs.existsSync(p)) return {} + try { + return JSON.parse(fs.readFileSync(p, 'utf8')) as Record + } catch { + return {} + } +} const PACKAGES: { file: string; translation: Record; header?: string }[] = [ { file: 'ar.ts', translation: ar.translation }, @@ -121,9 +133,11 @@ for (const k of keyOrder) { for (const pkg of PACKAGES) { const prev = pkg.translation as Record + const patch = loadOverrides(pkg.file) const out: Record = {} for (const k of keyOrder) { - out[k] = prev[k] !== undefined ? prev[k] : mergedEn[k] + const base = prev[k] !== undefined ? prev[k] : mergedEn[k] + out[k] = patch[k] !== undefined ? patch[k] : base } const body = emitLocaleFile(out, keyOrder, pkg.header) fs.writeFileSync(path.join(localesDir, pkg.file), body, 'utf8') diff --git a/src/i18n/locales/ar.ts b/src/i18n/locales/ar.ts index 3ad467a0..061da6b5 100644 --- a/src/i18n/locales/ar.ts +++ b/src/i18n/locales/ar.ts @@ -7,6 +7,18 @@ export default { Home: 'الرئيسية', Feed: 'Feed', 'Favorite Relays': 'الريلايات المفضلة', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'جميع الريلايات المفضلة', 'Pinned note': 'Pinned note', 'Relay settings': 'إعدادات الريلاي', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'الريلايات', Refresh: 'تحديث', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'الملف الشخصي', Logout: 'تسجيل الخروج', Following: 'المتابعون', followings: 'المتابعين', boosted: 'قوّى', + 'Boosted by:': 'Boosted by:', 'just now': 'الآن', 'n minutes ago': 'منذ {{n}} دقيقة', 'n m': '{{n}} دقيقة', @@ -85,6 +100,7 @@ export default { "username's used relays": 'الريلايات المستخدمة لـ {{username}}', "username's muted": '{{username}} تم كتمه', Login: 'تسجيل الدخول', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'يتابعك', 'Relay Settings': 'إعدادات الريلاي', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -275,16 +331,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'قراءة وكتابة', Read: 'قراءة', Write: 'كتابة', @@ -334,6 +400,9 @@ export default { 'Calculate optimal read relays': 'حساب أفضل ريلايات للقراءة', 'Login to set': 'تسجيل الدخول للوصول إلى المجموعة', 'Please login to view following feed': 'يرجى تسجيل الدخول لعرض خلاصات المتابعة', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'إرسال فقط إلى {{r}}', 'Send only to these relays': 'إرسال فقط إلى هذه الريلايات', Explore: 'استكشاف', @@ -371,6 +440,43 @@ export default { Topics: 'Topics', 'Open in a': 'فتح في {{a}}', 'Cannot handle event of kind k': 'لا يمكن معالجة الحدث من النوع {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'عذراً! لا يمكن العثور على الملاحظة 😔', 'This user has been muted': 'تم كتم هذا المستخدم', Wallet: 'المحفظة', @@ -388,6 +494,9 @@ export default { All: 'الكل', Reactions: 'التفاعلات', Zaps: 'Zaps', + Boosts: 'Boosts', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'هل تستمتع بـ Jumble؟', 'Your donation helps me maintain Jumble and make it better! 😊': 'تبرعك يساعد في صيانة Jumble وتحسينه! 😊', @@ -431,6 +540,11 @@ export default { 'no more relays': 'لا توجد مزيد من الريلايات', 'Favorited by': 'المفضلة من قبل', 'Post settings': 'إعدادات النشر', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'خدمة تحميل الوسائط', 'Choose a relay': 'اختر ريلاي', 'no relays found': 'لم يتم العثور على ريلايات', @@ -444,6 +558,15 @@ export default { Bookmarks: 'الإشارات المرجعية', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -457,11 +580,26 @@ export default { General: 'عام', Autoplay: 'التشغيل التلقائي', 'Enable video autoplay on this device': 'تمكين التشغيل التلقائي للفيديو على هذا الجهاز', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -481,9 +619,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'الصق أو اسحب ملفات الوسائط لتحميلها', Preview: 'معاينة', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -523,6 +686,11 @@ export default { Pay: 'دفع', interactions: 'التفاعلات', notifications: 'الإشعارات', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'إظهار {{type}} غير الموثوق', 'Hide untrusted {type}': 'إخفاء {{type}} غير الموثوق', 'Currently hiding {type} from untrusted users.': @@ -575,8 +743,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'عناوين المرحلات (اختياري، مفصولة بفواصل)', 'Remove poll': 'إزالة الاستطلاع', 'Refresh results': 'تحديث النتائج', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'استطلاع', Media: 'الوسائط', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -587,6 +788,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'إعادة النشر إلى ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -623,7 +828,6 @@ export default { 'No more boosts': 'لا مزيد من الـ Boosts', 'No boosts yet': 'لا توجد Boosts بعد', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosts', FollowListNotFoundConfirmation: 'لم يتم العثور على قائمة المتابعة. هل تريد إنشاء واحدة جديدة؟ إذا كنت قد تابعت مستخدمين من قبل، يرجى عدم التأكيد لأن هذه العملية ستؤدي إلى فقدان قائمة المتابعة السابقة.', MuteListNotFoundConfirmation: @@ -653,12 +857,45 @@ export default { Highlights: 'التمييز', 'A note from': 'A note from', Polls: 'الاستطلاعات', + 'Zap polls': 'Zap polls', 'Voice Posts': 'المشاركات الصوتية', 'Photo Posts': 'مشاركات الصور', 'Video Posts': 'مشاركات الفيديو', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'تحديد الكل', 'Clear All': 'مسح الكل', 'Set as default filter': 'تعيين كمرشح افتراضي', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'تطبيق', Reset: 'إعادة تعيين', 'Share something on this Relay': 'شارك شيئاً على هذا الريلاي', @@ -669,8 +906,56 @@ export default { 'Hide content mentioning muted users': 'إخفاء المحتوى الذي يذكر المستخدمين المكتومين', 'This note mentions a user you muted': 'هذه الملاحظة تذكر مستخدماً قمت بكتمه', Filter: 'مرشح', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'ذكرك في ملاحظة', 'quoted your note': 'اقتبس ملاحظتك', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'صوت في استطلاعك', 'reacted to your note': 'تفاعل مع ملاحظتك', 'boosted your note': 'قوّى ملاحظتك', @@ -726,6 +1011,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -915,6 +1204,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -977,6 +1268,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1087,6 +1379,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1140,6 +1434,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1171,7 +1466,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1180,6 +1476,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1203,6 +1500,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1212,7 +1511,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1265,6 +1618,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1275,6 +1629,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1319,6 +1677,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1428,6 +1794,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/de.ts b/src/i18n/locales/de.ts index d6b156bf..60517970 100644 --- a/src/i18n/locales/de.ts +++ b/src/i18n/locales/de.ts @@ -19,7 +19,8 @@ export default { 'Kind-0-Profile für npubs, die in der letzten Stunde auf deinen Lieblingsrelais auftauchten (gleiche Stichprobe wie Relay-Puls).', 'Relay pulse drawer following': 'Folge ich', 'Relay pulse drawer others': 'Andere', - 'Relay pulse drawer no profiles': 'Für diese Stichprobe wurden noch keine Kind-0-Profile geladen.', + 'Relay pulse drawer no profiles': + 'Für diese Stichprobe wurden noch keine Kind-0-Profile geladen.', 'See the newest notes from your follows': 'Neueste Notizen von deinen Abos anzeigen', 'All favorite relays': 'Alle Lieblingsrelais', 'Pinned note': 'Angehefteter Beitrag', @@ -28,6 +29,8 @@ export default { 'Account menu': 'Kontomenü', SidebarRelays: 'Relays', Refresh: 'Aktualisieren', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Profil', Logout: 'Abmelden', Following: 'Folgende', @@ -336,16 +339,26 @@ export default { 'Upload Image': 'Bild hochladen', 'Insert emoji': 'Emoji einfügen', 'Insert GIF': 'GIF einfügen', + 'Insert meme': 'Insert meme', 'Search GIFs': 'GIFs suchen', + 'Search memes': 'Search memes', 'Choose a GIF': 'GIF auswählen', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Bei GifBuddy nach weiteren GIFs suchen', 'Add your own GIFs': 'Eigene GIFs hinzufügen', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Beschreibung (optional, für Suche)', 'e.g. happy birthday, thumbs up': 'z. B. happy birthday, Daumen hoch', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Wird hochgeladen...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'Keine GIFs gefunden. Suche oder füge eigene hinzu. GIFs stammen von Nostr-Kind-1063-Events (NIP-94) auf GIF-Relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} ist keine GIF-Datei', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'R & W', Read: 'Lesen', Write: 'Schreiben', @@ -438,6 +451,22 @@ export default { Topics: 'Themen', 'Open in a': 'Öffnen in {{a}}', 'Cannot handle event of kind k': 'Ereignis des Typs {{k}} kann nicht verarbeitet werden', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Referenz-Tags (e, p, q, a)', + 'Starred spells': 'Markierte Sprüche', + 'Spell star add title': 'Spruch markieren (wird zu deinen Nostr-Lesezeichen hinzugefügt)', + 'Spell star remove title': 'Markierung aufheben (aus Nostr-Lesezeichen entfernen)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', 'Notification reaction summary': 'hat auf diese Notiz reagiert.', 'Notification discussion upvote summary': 'hat in dieser Diskussion positiv bewertet.', 'Notification discussion downvote summary': 'hat in dieser Diskussion negativ bewertet.', @@ -448,6 +477,9 @@ export default { 'Jumble Imwald synthetic event': 'Jumble Imwald – synthetisches Ereignis', '+ Add a URL to this list': 'URL zur Liste hinzufügen', 'Add a web URL': 'Web-URL hinzufügen', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', 'Open any https page in the side panel to reply, react, and discuss on Nostr.': 'Beliebige https-Seite im Seitenpanel öffnen, um auf Nostr zu antworten, zu reagieren und zu diskutieren.', 'Enter a valid http(s) URL': 'Bitte eine gültige http(s)-URL eingeben', @@ -545,6 +577,7 @@ export default { 'No other recipients found': 'Keine weiteren Empfänger:innen gefunden', 'Recipients could not be loaded': 'Empfänger:innen konnten nicht geladen werden', 'View award': 'Verleihung anzeigen', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Zum Folgen bitte anmelden', 'Following All': 'Allen gefolgt', 'Followed {{count}} users': '{{count}} Nutzer:innen gefolgt', @@ -577,7 +610,8 @@ export default { 'HTTPS-Index-Relays (z. B. REST /api/events/filter). Gleiche Lese-/Schreib-/beides-Rollen wie Mailbox-Relays; gespeichert als Kind 10243. Liste leeren und speichern, um eine leere Liste zu veröffentlichen.', 'HTTP relays saved': 'HTTP-Relays gespeichert', 'Failed to save HTTP relay list': 'HTTP-Relay-Liste konnte nicht gespeichert werden', - 'HTTP relays must start with https:// or http://': 'HTTP-Relays müssen mit https:// oder http:// beginnen', + 'HTTP relays must start with https:// or http://': + 'HTTP-Relays müssen mit https:// oder http:// beginnen', relayType_client_default: 'Client-Standard', relayType_open_from: 'Aktueller Feed', relayType_favorite: 'Favorit', @@ -603,6 +637,28 @@ export default { successes: 'Erfolge', None: 'Keine', 'Cache & offline storage': 'Cache & Offline-Speicher', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Füge Medien-Dateien ein oder ziehe sie hierher, um sie hochzuladen', Preview: 'Vorschau', @@ -702,13 +758,39 @@ export default { 'Remove poll': 'Umfrage entfernen', 'Refresh results': 'Ergebnisse aktualisieren', '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Umfrage', Media: 'Medien', 'Articles and Publications': 'Artikel und Veröffentlichungen', 'Search articles...': 'Artikel suchen…', 'Refreshing articles...': 'Artikel werden aktualisiert…', 'No articles or publications found': 'Keine Artikel oder Veröffentlichungen gefunden', - 'No articles or publications match your search': 'Keine Artikel oder Veröffentlichungen entsprechen der Suche', + 'No articles or publications match your search': + 'Keine Artikel oder Veröffentlichungen entsprechen der Suche', 'articles and publications': 'Artikel und Veröffentlichungen', Interests: 'Interessen', Calendar: 'Kalender', @@ -720,10 +802,10 @@ export default { 'Nothing to load for this feed.': 'Für diesen Feed gibt es nichts zu laden.', 'No posts loaded for this feed. Try refreshing.': 'Keine Beiträge für diesen Feed geladen. Bitte aktualisieren.', - 'Per-relay timeline results ({{count}} connections)': - 'Ergebnis je Relay ({{count}} Verbindungen)', 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': 'Die Relays haben keine Ereignisse für diesen Feed geliefert. Sie können offline sein, langsam antworten oder diese Notizen nicht indexieren.', + 'Per-relay timeline results ({{count}} connections)': + 'Ergebnis je Relay ({{count}} Verbindungen)', 'Republish to ...': 'Erneut veröffentlichen zu ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -790,6 +872,7 @@ export default { Highlights: 'Highlights', 'A note from': 'A note from', Polls: 'Umfragen', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Sprachbeiträge', 'Photo Posts': 'Fotobeiträge', 'Video Posts': 'Videobeiträge', @@ -867,7 +950,8 @@ export default { 'Bitte Suchtext, Autorenfilter oder einen Zeitraum setzen, bevor Relays abgefragt werden.', 'Feed full search invalid feed': 'Für diesen Feed ist keine Relay-Suche möglich.', 'Feed full search failed': 'Relay-Suche fehlgeschlagen. Bitte erneut versuchen.', - 'Feed full search empty': 'Auf den abgefragten Relays wurden keine passenden Beiträge gefunden.', + 'Feed full search empty': + 'Auf den abgefragten Relays wurden keine passenden Beiträge gefunden.', 'No loaded posts match your filters.': 'Keine geladenen Beiträge entsprechen den Filtern.', 'mentioned you in a note': 'hat Sie in einer Notiz erwähnt', 'quoted your note': 'hat Ihre Notiz zitiert', @@ -1321,6 +1405,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1406,7 +1492,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1415,6 +1502,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1438,6 +1526,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1447,6 +1537,41 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', 'Follow sets': 'Folgenlisten', 'Follow sets settings intro': @@ -1466,6 +1591,7 @@ export default { 'Delete follow set?': 'Diese Folgenliste löschen?', 'Delete follow set confirm': 'Es wird eine Löschanfrage (Kind 5) für die Liste gesendet. Relays, die sie annehmen, entfernen die Liste; andere Clients können noch zwischengespeicherte Daten anzeigen, bis sie neu laden.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1518,6 +1644,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1569,10 +1696,6 @@ export default { 'Subscribed to topic (local)': 'Subscribed to topic (local)', 'Subscribing...': 'Subscribing...', Summary: 'Summary', - 'Unknown note reference tags': 'Referenz-Tags (e, p, q, a)', - 'Starred spells': 'Markierte Sprüche', - 'Spell star add title': 'Spruch markieren (wird zu deinen Nostr-Lesezeichen hinzugefügt)', - 'Spell star remove title': 'Markierung aufheben (aus Nostr-Lesezeichen entfernen)', 'Supported Event Types': 'Supported Event Types', 'Take a note': 'Take a note', 'The full prompt conversation (optional)': 'The full prompt conversation (optional)', @@ -1580,6 +1703,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1689,6 +1820,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index a2b6fa34..08ec3628 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -176,8 +176,7 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', 'Read aloud': 'Read aloud', @@ -218,7 +217,8 @@ export default { 'Read-aloud Piper status heading': 'Piper (server voice)', 'Read-aloud Piper skipped notice': 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', - 'Read-aloud Piper attempt started': 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', @@ -599,7 +599,8 @@ export default { 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', 'HTTP relays saved': 'HTTP relays saved', 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', - 'HTTP relays must start with https:// or http://': 'HTTP relays must start with https:// or http://', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -625,6 +626,9 @@ export default { successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', 'eventArchive.sectionTitle': 'Notes & feed archive', 'eventArchive.sectionBlurb': 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', @@ -772,7 +776,8 @@ export default { 'Search articles...': 'Search articles...', 'Refreshing articles...': 'Refreshing articles...', 'No articles or publications found': 'No articles or publications found', - 'No articles or publications match your search': 'No articles or publications match your search', + 'No articles or publications match your search': + 'No articles or publications match your search', 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', @@ -1241,7 +1246,7 @@ export default { 'Clear Cache': 'Clear Cache', 'Clear Service Worker': 'Clear Service Worker', 'Clear cached data stored in your browser, including IndexedDB events, localStorage settings, and service worker caches.': - 'Clear cached data stored in your browser, including IndexedDB events, localStorage settings, and service worker caches.', + 'Clear cached data stored in your browser, including IndexedDB events, read-aloud (Piper) audio cache, localStorage settings, and service worker caches.', 'Click update to get the latest features and improvements': 'Click update to get the latest features and improvements', Close: 'Close', @@ -1514,15 +1519,15 @@ export default { 'Article URLs subtitle': 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', 'RSS timeline': 'RSS timeline', - 'RSS timeline subtitle': 'Every item from your subscribed feeds, newest first — classic RSS reader.', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', URLs: 'URLs', RSS: 'RSS', Both: 'Both', 'RSS feed item label': 'RSS', 'Web URL item label': 'Web URL', 'URL thread activity': 'URL thread activity', - 'Suppress Clawstr links in RSS previews': - 'Hide clawstr.com in RSS and URL feed', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', 'Hide local, media & feed URLs from URL cards': 'Hide local, media, feed, document & XML links from the feed', 'RSS articles': 'RSS articles', @@ -1532,8 +1537,7 @@ export default { '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', 'No comments yet': 'No comments yet', 'No highlights yet': 'No highlights yet', - 'Showing {{filtered}} of {{total}} entries': - 'Showing {{filtered}} of {{total}} entries', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', standardRssFeed_youtube: 'YouTube feed', standardRssFeed_youtubeChannel: 'YouTube channel feed', @@ -1679,7 +1683,8 @@ export default { 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', - 'This GIF was found in a Nostr event of kind {{kind}}.': 'This GIF was found in a Nostr event of kind {{kind}}.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1789,6 +1794,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts index 4a83a1ee..666bd741 100644 --- a/src/i18n/locales/es.ts +++ b/src/i18n/locales/es.ts @@ -7,6 +7,18 @@ export default { Home: 'Inicio', Feed: 'Feed', 'Favorite Relays': 'Relés favoritos', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Todos los relés favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configuración de relés', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Relés', Refresh: 'Actualizar', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Perfil', Logout: 'Cerrar sesión', Following: 'Siguiendo', followings: 'siguiendo', boosted: 'boosteado', + 'Boosted by:': 'Boosted by:', 'just now': 'justo ahora', 'n minutes ago': 'hace {{n}} minutos', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": 'Relés usados por {{username}}', "username's muted": 'Silenciados de {{username}}', Login: 'Iniciar sesión', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Te sigue', 'Relay Settings': 'Configuración de relés', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'L y E', Read: 'Leer', Write: 'Escribir', @@ -338,6 +404,9 @@ export default { 'Calculate optimal read relays': 'Calcular relés de lectura óptimos', 'Login to set': 'Inicia sesión para ajustar', 'Please login to view following feed': 'Por favor inicia sesión para ver el feed de seguidos', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Enviar únicamente a {{r}}', 'Send only to these relays': 'Enviar únicamente a estos relés', Explore: 'Explorar', @@ -375,6 +444,43 @@ export default { Topics: 'Topics', 'Open in a': 'Abrir en {{a}}', 'Cannot handle event of kind k': 'No se puede manejar el evento de tipo {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': '¡Lo siento! No se pudo encontrar la nota 😔', 'This user has been muted': 'Este usuario ha sido silenciado', Wallet: 'Billetera', @@ -392,6 +498,9 @@ export default { All: 'Todo', Reactions: 'Reacciones', Zaps: 'Zaps', + Boosts: 'Boosts', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': '¿Te gusta Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': '¡Tu donación me ayuda a mantener y mejorar Jumble! 😊', @@ -435,6 +544,11 @@ export default { 'no more relays': 'no hay más relés', 'Favorited by': 'Favoritado por', 'Post settings': 'Ajustes de publicación', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Servicio de carga de medios', 'Choose a relay': 'Selecciona un relé', 'no relays found': 'no se encontraron relés', @@ -448,6 +562,15 @@ export default { Bookmarks: 'Marcadores', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -462,11 +585,26 @@ export default { Autoplay: 'Reproducción automática', 'Enable video autoplay on this device': 'Habilitar reproducción automática de video en este dispositivo', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -486,9 +624,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Pegar o soltar archivos multimedia para cargar', Preview: 'Vista previa', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -528,6 +691,11 @@ export default { Pay: 'Pagar', interactions: 'interacciones', notifications: 'notificaciones', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Mostrar {{type}} no confiables', 'Hide untrusted {type}': 'Ocultar {{type}} no confiables', 'Currently hiding {type} from untrusted users.': @@ -580,8 +748,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URLs de relé (opcional, separadas por comas)', 'Remove poll': 'Eliminar encuesta', 'Refresh results': 'Actualizar resultados', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Encuesta', Media: 'medios', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -592,6 +793,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Republicar a ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -627,7 +832,6 @@ export default { 'No more boosts': 'No hay más boosts', 'No boosts yet': 'Sin boosts aún', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosts', FollowListNotFoundConfirmation: 'Lista de seguidos no encontrada. ¿Quieres crear una nueva? Si has seguido usuarios antes, por favor NO confirmes ya que esta operación te hará perder tu lista de seguidos anterior.', MuteListNotFoundConfirmation: @@ -657,12 +861,45 @@ export default { Highlights: 'Destacados', 'A note from': 'A note from', Polls: 'Encuestas', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Publicaciones de voz', 'Photo Posts': 'Publicaciones de fotos', 'Video Posts': 'Publicaciones de video', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Seleccionar todo', 'Clear All': 'Limpiar todo', 'Set as default filter': 'Establecer como filtro predeterminado', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Aplicar', Reset: 'Restablecer', 'Share something on this Relay': 'Comparte algo en este relé', @@ -674,8 +911,56 @@ export default { 'Hide content mentioning muted users': 'Ocultar contenido que mencione usuarios silenciados', 'This note mentions a user you muted': 'Esta nota menciona a un usuario que silenciaste', Filter: 'Filtro', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'te mencionó en una nota', 'quoted your note': 'citó tu nota', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'votó en tu encuesta', 'reacted to your note': 'reaccionó a tu nota', 'boosted your note': 'boosteó tu nota', @@ -733,6 +1018,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -923,6 +1212,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -985,6 +1276,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1095,6 +1387,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1148,6 +1442,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1179,7 +1474,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1188,6 +1484,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1211,6 +1508,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1220,7 +1519,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1273,6 +1626,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1283,6 +1637,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1327,6 +1685,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1436,6 +1802,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/fa.ts b/src/i18n/locales/fa.ts index 559c348f..a34c76fc 100644 --- a/src/i18n/locales/fa.ts +++ b/src/i18n/locales/fa.ts @@ -7,6 +7,18 @@ export default { Home: 'خانه', Feed: 'Feed', 'Favorite Relays': 'رله‌های مورد علاقه', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'همهٔ رله‌های مورد علاقه', 'Pinned note': 'Pinned note', 'Relay settings': 'تنظیمات رله', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'رله‌ها', Refresh: 'بازخوانی', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'پروفایل', Logout: 'خروج', Following: 'دنبال می‌کنم', followings: 'دنبال شونده‌ها', boosted: 'بوست شده', + 'Boosted by:': 'Boosted by:', 'just now': 'همین الان', 'n minutes ago': '{{n}} دقیقه پیش', 'n m': '{{n}}د', @@ -85,6 +100,7 @@ export default { "username's used relays": 'رله‌های استفاده شده {{username}}', "username's muted": 'بی‌صدا شده‌های {{username}}', Login: 'ورود', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'شما را دنبال می‌کند', 'Relay Settings': 'تنظیمات رله', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'خواندن و نوشتن', Read: 'خواندن', Write: 'نوشتن', @@ -337,6 +403,9 @@ export default { 'Calculate optimal read relays': 'محاسبه رله‌های خواندن بهینه', 'Login to set': 'برای تنظیم وارد شوید', 'Please login to view following feed': 'لطفاً برای مشاهده فید دنبال شونده‌ها وارد شوید', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'فقط به {{r}} ارسال شود', 'Send only to these relays': 'فقط به این رله‌ها ارسال شود', Explore: 'کاوش', @@ -374,6 +443,43 @@ export default { Topics: 'Topics', 'Open in a': 'باز کردن در {{a}}', 'Cannot handle event of kind k': 'نمی‌توان رویداد از نوع {{k}} را پردازش کرد', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'متأسفانه! یادداشت یافت نشد 😔', 'This user has been muted': 'این کاربر بی‌صدا شده است', Wallet: 'کیف پول', @@ -391,6 +497,9 @@ export default { All: 'همه', Reactions: 'واکنش‌ها', Zaps: 'زپ‌ها', + Boosts: 'بوست‌ها', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'از Jumble لذت می‌برید؟', 'Your donation helps me maintain Jumble and make it better! 😊': 'کمک مالی شما به من در نگهداری Jumble و بهتر کردن آن کمک می‌کند! 😊', @@ -434,6 +543,11 @@ export default { 'no more relays': 'رله بیشتری وجود ندارد', 'Favorited by': 'مورد علاقه', 'Post settings': 'تنظیمات پست', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'سرویس آپلود رسانه', 'Choose a relay': 'یک رله انتخاب کنید', 'no relays found': 'رله‌ای یافت نشد', @@ -447,6 +561,15 @@ export default { Bookmarks: 'نشانک‌ها', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -460,11 +583,26 @@ export default { General: 'عمومی', Autoplay: 'پخش خودکار', 'Enable video autoplay on this device': 'فعال کردن پخش خودکار ویدیو در این دستگاه', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -484,9 +622,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'فایل‌های رسانه را برای آپلود بچسبانید یا بکشید', Preview: 'پیش‌نمایش', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -526,6 +689,11 @@ export default { Pay: 'پرداخت', interactions: 'تعاملات', notifications: 'اعلان‌ها', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'نمایش {{type}} غیرقابل اعتماد', 'Hide untrusted {type}': 'مخفی کردن {{type}} غیرقابل اعتماد', 'Currently hiding {type} from untrusted users.': @@ -578,8 +746,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'آدرس‌های رله (اختیاری، جدا شده با کاما)', 'Remove poll': 'حذف نظرسنجی', 'Refresh results': 'بارگیری مجدد نتایج', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'نظرسنجی', Media: 'رسانه', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -590,6 +791,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'بازنشر به ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -625,7 +830,6 @@ export default { 'No more boosts': 'بوست دیگری نیست', 'No boosts yet': 'هنوز بوستی نیست', 'n more boosts': '{{count}} more boosts', - Boosts: 'بوست‌ها', FollowListNotFoundConfirmation: 'فهرست دنبال‌کنندگان پیدا نشد. آیا می‌خواهید یکی جدید ایجاد کنید؟ اگر قبلاً کاربرانی را دنبال کرده‌اید، لطفاً تأیید نکنید زیرا این عملیات باعث از دست رفتن فهرست دنبال‌کنندگان قبلی شما خواهد شد.', MuteListNotFoundConfirmation: @@ -655,12 +859,45 @@ export default { Highlights: 'برجسته‌ها', 'A note from': 'A note from', Polls: 'نظرسنجی‌ها', + 'Zap polls': 'Zap polls', 'Voice Posts': 'پست‌های صوتی', 'Photo Posts': 'پست‌های عکس', 'Video Posts': 'پست‌های ویدیو', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'انتخاب همه', 'Clear All': 'پاک کردن همه', 'Set as default filter': 'تنظیم به عنوان فیلتر پیش‌فرض', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'اعمال', Reset: 'بازنشانی', 'Share something on this Relay': 'در این رله چیزی به اشتراک بگذارید', @@ -671,8 +908,56 @@ export default { 'Hide content mentioning muted users': 'مخفی کردن محتوای اشاره کننده به کاربران بی‌صدا شده', 'This note mentions a user you muted': 'این یادداشت به کاربری که بی‌صدا کرده‌اید اشاره می‌کند', Filter: 'فیلتر', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'در یادداشتی از شما نام برد', 'quoted your note': 'یادداشت شما را نقل قول کرد', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'در نظرسنجی شما رأی داد', 'reacted to your note': 'به یادداشت شما واکنش نشان داد', 'boosted your note': 'یادداشت شما را بوست کرد', @@ -729,6 +1014,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -919,6 +1208,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -981,6 +1272,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1091,6 +1383,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1144,6 +1438,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1175,7 +1470,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1184,6 +1480,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1207,6 +1504,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1216,7 +1515,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1269,6 +1622,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1279,6 +1633,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1323,6 +1681,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1432,6 +1798,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts index 8320a38b..aace57d4 100644 --- a/src/i18n/locales/fr.ts +++ b/src/i18n/locales/fr.ts @@ -7,6 +7,18 @@ export default { Home: 'Accueil', Feed: 'Feed', 'Favorite Relays': 'Relais favoris', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Tous les relais favoris', 'Pinned note': 'Pinned note', 'Relay settings': 'Paramètres du relais', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Relais', Refresh: 'Rafraîchir', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Profil', Logout: 'Déconnexion', Following: 'Abonnements', followings: 'abonnements', boosted: 'a boosté', + 'Boosted by:': 'Boosted by:', 'just now': "à l'instant", 'n minutes ago': 'il y a {{n}} minutes', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": 'les relais utilisés par {{username}}', "username's muted": '{{username}} en sourdine', Login: 'Connexion', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Vous suit', 'Relay Settings': 'Paramètres des relais', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'R & W', Read: 'Lire', Write: 'Écrire', @@ -337,6 +403,9 @@ export default { 'Calculate optimal read relays': 'Calculer les relais de lecture optimaux', 'Login to set': 'Connectez-vous pour définir', 'Please login to view following feed': 'Veuillez vous connecter pour voir le fil d’abonnements', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Envoyer uniquement à {{r}}', 'Send only to these relays': 'Envoyer uniquement à ces relais', Explore: 'Explorer', @@ -374,6 +443,43 @@ export default { Topics: 'Topics', 'Open in a': 'Ouvrir dans {{a}}', 'Cannot handle event of kind k': "Impossible de traiter l'événement de type {{k}}", + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Désolé ! La note est introuvable 😔', 'This user has been muted': 'Cet utilisateur a été mis en sourdine', Wallet: 'Portefeuille', @@ -391,6 +497,9 @@ export default { All: 'Tous', Reactions: 'Réactions', Zaps: 'Zaps', + Boosts: 'Boosts', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Vous appréciez Jumble ?', 'Your donation helps me maintain Jumble and make it better! 😊': "Votre don m'aide à maintenir Jumble et à l'améliorer ! 😊", @@ -434,6 +543,11 @@ export default { 'no more relays': 'aucun autre relais', 'Favorited by': 'Favorisé par', 'Post settings': 'Paramètres de publication', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Service de téléchargement de médias', 'Choose a relay': 'Choisir un relais', 'no relays found': 'aucun relais trouvé', @@ -447,7 +561,15 @@ export default { Bookmarks: 'Favoris', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', 'In Follow Packs': 'Dans les Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -462,11 +584,26 @@ export default { Autoplay: 'Lecture automatique', 'Enable video autoplay on this device': 'Activer la lecture automatique des vidéos sur cet appareil', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -486,9 +623,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Coller ou déposer des fichiers multimédias à télécharger', Preview: 'Aperçu', @@ -529,6 +691,11 @@ export default { Pay: 'Payer', interactions: 'interactions', notifications: 'notifications', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Afficher les {{type}} non fiables', 'Hide untrusted {type}': 'Cacher les {{type}} non fiables', 'Currently hiding {type} from untrusted users.': @@ -582,8 +749,41 @@ export default { 'URLs de relais (optionnel, séparées par des virgules)', 'Remove poll': 'Supprimer le sondage', 'Refresh results': 'Rafraîchir les résultats', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Sondage', Media: 'média', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -594,6 +794,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Reposter vers ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -630,7 +834,6 @@ export default { 'No more boosts': 'Plus de boosts', 'No boosts yet': 'Pas encore de boosts', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosts', FollowListNotFoundConfirmation: 'Liste de suivi non trouvée. Voulez-vous en créer une nouvelle ? Si vous avez suivi des utilisateurs auparavant, veuillez NE PAS confirmer car cette opération vous fera perdre votre liste de suivi précédente.', MuteListNotFoundConfirmation: @@ -660,12 +863,45 @@ export default { Highlights: 'Surlignages', 'A note from': 'A note from', Polls: 'Sondages', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Publications vocales', 'Photo Posts': 'Publications photo', 'Video Posts': 'Publications vidéo', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Tout sélectionner', 'Clear All': 'Tout effacer', 'Set as default filter': 'Définir comme filtre par défaut', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Appliquer', Reset: 'Réinitialiser', 'Share something on this Relay': 'Partager quelque chose sur ce relais', @@ -679,8 +915,56 @@ export default { 'This note mentions a user you muted': 'Cette note mentionne un utilisateur que vous avez masqué', Filter: 'Filtre', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'vous a mentionné dans une note', 'quoted your note': 'a cité votre note', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'a voté dans votre sondage', 'reacted to your note': 'a réagi à votre note', 'boosted your note': 'a boosté votre note', @@ -738,6 +1022,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -929,6 +1217,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -991,6 +1281,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1101,6 +1392,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1154,6 +1447,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1185,7 +1479,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1194,6 +1489,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1217,6 +1513,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1226,7 +1524,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1279,6 +1631,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1289,6 +1642,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1333,6 +1690,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1442,6 +1807,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/hi.ts b/src/i18n/locales/hi.ts index 788f7e7a..6d91ed8f 100644 --- a/src/i18n/locales/hi.ts +++ b/src/i18n/locales/hi.ts @@ -7,6 +7,18 @@ export default { Home: 'होम', Feed: 'Feed', 'Favorite Relays': 'पसंदीदा रिले', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'सभी पसंदीदा रिले', 'Pinned note': 'Pinned note', 'Relay settings': 'रिले सेटिंग्स', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'रिले', Refresh: 'रीफ्रेश', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'प्रोफ़ाइल', Logout: 'लॉगआउट', Following: 'फॉलो कर रहे हैं', followings: 'फॉलोइंग', boosted: 'बूस्ट किया', + 'Boosted by:': 'Boosted by:', 'just now': 'अभी', 'n minutes ago': '{{n}} मिनट पहले', 'n m': '{{n}}मि', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}} के उपयोग किए गए रिले', "username's muted": '{{username}} के म्यूट किए गए', Login: 'लॉगिन', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'आपको फॉलो करता है', 'Relay Settings': 'रिले सेटिंग्स', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -277,16 +333,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'R & W', Read: 'पढ़ें', Write: 'लिखें', @@ -338,6 +404,9 @@ export default { 'Calculate optimal read relays': 'इष्टतम रीड रिले की गणना करें', 'Login to set': 'सेट करने के लिए लॉगिन करें', 'Please login to view following feed': 'फॉलोइंग फीड देखने के लिए कृपया लॉगिन करें', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'केवल {{r}} को भेजें', 'Send only to these relays': 'केवल इन रिले को भेजें', Explore: 'एक्सप्लोर करें', @@ -375,6 +444,43 @@ export default { Topics: 'Topics', 'Open in a': '{{a}} में खोलें', 'Cannot handle event of kind k': 'प्रकार {{k}} के इवेंट को हैंडल नहीं कर सकते', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'माफ करें! नोट नहीं मिल सका 😔', 'This user has been muted': 'इस उपयोगकर्ता को म्यूट कर दिया गया है', Wallet: 'वॉलेट', @@ -392,6 +498,9 @@ export default { All: 'सभी', Reactions: 'प्रतिक्रियाएं', Zaps: 'जैप्स', + Boosts: 'बूस्ट', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Jumble का आनंद ले रहे हैं?', 'Your donation helps me maintain Jumble and make it better! 😊': 'आपका दान मुझे Jumble को बनाए रखने और इसे बेहतर बनाने में मदद करता है! 😊', @@ -435,6 +544,11 @@ export default { 'no more relays': 'कोई और रिले नहीं', 'Favorited by': 'द्वारा पसंदीदा', 'Post settings': 'पोस्ट सेटिंग्स', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'मीडिया अपलोड सेवा', 'Choose a relay': 'रिले चुनें', 'no relays found': 'कोई रिले नहीं मिला', @@ -448,6 +562,15 @@ export default { Bookmarks: 'बुकमार्क', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -461,11 +584,26 @@ export default { General: 'सामान्य', Autoplay: 'ऑटोप्ले', 'Enable video autoplay on this device': 'इस डिवाइस पर वीडियो ऑटोप्ले सक्षम करें', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -485,9 +623,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'अपलोड करने के लिए मीडिया फाइलें पेस्ट या ड्रॉप करें', Preview: 'पूर्वावलोकन', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -527,6 +690,11 @@ export default { Pay: 'भुगतान करें', interactions: 'इंटरैक्शन', notifications: 'सूचनाएं', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'अविश्वसनीय {{type}} दिखाएं', 'Hide untrusted {type}': 'अविश्वसनीय {{type}} छुपाएं', 'Currently hiding {type} from untrusted users.': @@ -579,8 +747,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'रिले URLs (वैकल्पिक, कॉमा से अलग)', 'Remove poll': 'पोल हटाएं', 'Refresh results': 'परिणाम रीफ्रेश करें', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'पोल', Media: 'मीडिया', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -591,6 +792,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'पुनः प्रकाशित करें...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -626,7 +831,6 @@ export default { 'No more boosts': 'और कोई बूस्ट नहीं', 'No boosts yet': 'अभी तक कोई बूस्ट नहीं', 'n more boosts': '{{count}} more boosts', - Boosts: 'बूस्ट', FollowListNotFoundConfirmation: 'फॉलो सूची नहीं मिली। क्या आप एक नई बनाना चाहते हैं? यदि आपने पहले उपयोगकर्ताओं को फॉलो किया है, तो कृपया पुष्टि न करें क्योंकि इस ऑपरेशन से आपकी पिछली फॉलो सूची नष्ट हो जाएगी।', MuteListNotFoundConfirmation: @@ -656,12 +860,45 @@ export default { Highlights: 'हाइलाइट्स', 'A note from': 'A note from', Polls: 'पोल', + 'Zap polls': 'Zap polls', 'Voice Posts': 'वॉयस पोस्ट', 'Photo Posts': 'फोटो पोस्ट', 'Video Posts': 'वीडियो पोस्ट', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'सभी चुनें', 'Clear All': 'सभी साफ़ करें', 'Set as default filter': 'डिफ़ॉल्ट फिल्टर के रूप में सेट करें', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'लागू करें', Reset: 'रीसेट', 'Share something on this Relay': 'इस रिले पर कुछ साझा करें', @@ -674,8 +911,56 @@ export default { 'This note mentions a user you muted': 'यह नोट एक उपयोगकर्ता का उल्लेख करता है जिसे आपने म्यूट किया है', Filter: 'फिल्टर', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'ने आपका एक नोट में उल्लेख किया', 'quoted your note': 'ने आपके नोट को उद्धृत किया', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'ने आपके पोल में वोट किया', 'reacted to your note': 'ने आपके नोट पर प्रतिक्रिया दी', 'boosted your note': 'ने आपके नोट को बूस्ट किया', @@ -731,6 +1016,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -921,6 +1210,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -983,6 +1274,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1093,6 +1385,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1146,6 +1440,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1177,7 +1472,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1186,6 +1482,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1209,6 +1506,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1218,7 +1517,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1271,6 +1624,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1281,6 +1635,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1325,6 +1683,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1434,6 +1800,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/it.ts b/src/i18n/locales/it.ts index ebfd5ca1..d2498471 100644 --- a/src/i18n/locales/it.ts +++ b/src/i18n/locales/it.ts @@ -7,6 +7,18 @@ export default { Home: 'Inizio', Feed: 'Feed', 'Favorite Relays': 'Relay preferiti', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Tutti i relay preferiti', 'Pinned note': 'Pinned note', 'Relay settings': 'Impostazioni Relay', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Relays', Refresh: 'Aggiorna', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Profilo', Logout: 'Disconnetti', Following: 'Seguendo', followings: 'seguiti', boosted: 'ha boostato', + 'Boosted by:': 'Boosted by:', 'just now': 'adesso', 'n minutes ago': '{{n}} minuti fa', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}} relays usati', "username's muted": '{{username}} zittiti', Login: 'Accedi', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Ti segue', 'Relay Settings': 'Impostazioni Relay', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -277,16 +333,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'L & S', Read: 'Leggi', Write: 'Scrivi', @@ -338,6 +404,9 @@ export default { 'Calculate optimal read relays': 'Calcolo ottimale relay di lettura', 'Login to set': 'Accedi per impostare', 'Please login to view following feed': 'Per favore accedi per vedere il feed dei seguiti', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Invia solo a {{r}}', 'Send only to these relays': 'Invia solo a questi relay', Explore: 'Esplora', @@ -375,6 +444,43 @@ export default { Topics: 'Topics', 'Open in a': 'Apri in {{a}}', 'Cannot handle event of kind k': 'Impossibile gestire un evento di tipo {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Spiacente! La nota non può essere trovata 😔', 'This user has been muted': 'Questo utente è stato zittito', Wallet: 'Wallet', @@ -392,6 +498,9 @@ export default { All: 'Tutto', Reactions: 'Reazioni', Zaps: 'Zaps', + Boosts: 'Boost', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Ti sta piacendo Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': 'La tua donazione mi aiuta a mantenere Jumble e a migliorarlo! 😊', @@ -435,6 +544,11 @@ export default { 'no more relays': 'niente più relay', 'Favorited by': 'Preferito da', 'Post settings': 'Impostazioni post', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Servizio di caricamento media', 'Choose a relay': 'Scegli un relay', 'no relays found': 'Nessun relay trovato', @@ -448,6 +562,15 @@ export default { Bookmarks: 'Segnalibri', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -462,11 +585,26 @@ export default { Autoplay: 'Riproduzione automatica', 'Enable video autoplay on this device': 'Abilita riproduzione automatica video su questo dispositivo', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -486,9 +624,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Incolla o trascina i file multimediali per caricarli', Preview: 'Anteprima', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -528,6 +691,11 @@ export default { Pay: 'Paga', interactions: 'interazioni', notifications: 'notifiche', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Mostra {{type}} non fidati', 'Hide untrusted {type}': 'Nascondi {{type}} non fidati', 'Currently hiding {type} from untrusted users.': @@ -580,8 +748,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URL relay (opzionale, separati da virgole)', 'Remove poll': 'Rimuovi sondaggio', 'Refresh results': 'Aggiorna risultati', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Sondaggio', Media: 'media', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -592,6 +793,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Ripubblica a...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -628,7 +833,6 @@ export default { 'No more boosts': 'Non ci sono più boost', 'No boosts yet': 'Ancora nessun boost', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boost', FollowListNotFoundConfirmation: 'Elenco seguiti non trovato. Vuoi crearne uno nuovo? Se hai già seguito degli utenti in precedenza, per favore NON confermare poiché questa operazione causerà la perdita del tuo elenco seguiti precedente.', MuteListNotFoundConfirmation: @@ -658,12 +862,45 @@ export default { Highlights: 'Evidenziazioni', 'A note from': 'A note from', Polls: 'Sondaggi', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Post vocali', 'Photo Posts': 'Post foto', 'Video Posts': 'Post video', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Seleziona tutto', 'Clear All': 'Cancella tutto', 'Set as default filter': 'Imposta come filtro predefinito', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Applica', Reset: 'Reimposta', 'Share something on this Relay': 'Condividi qualcosa su questo Relay', @@ -675,8 +912,56 @@ export default { 'Hide content mentioning muted users': 'Nascondi contenuto che menziona utenti silenziati', 'This note mentions a user you muted': 'Questa nota menziona un utente che hai silenziato', Filter: 'Filtro', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'ti ha menzionato in una nota', 'quoted your note': 'ha citato la tua nota', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'ha votato nel tuo sondaggio', 'reacted to your note': 'ha reagito alla tua nota', 'boosted your note': 'ha boostato la tua nota', @@ -734,6 +1019,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -924,6 +1213,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -986,6 +1277,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1096,6 +1388,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1149,6 +1443,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1180,7 +1475,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1189,6 +1485,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1212,6 +1509,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1221,7 +1520,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1274,6 +1627,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1284,6 +1638,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1328,6 +1686,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1437,6 +1803,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/ja.ts b/src/i18n/locales/ja.ts index d113688d..ae37817d 100644 --- a/src/i18n/locales/ja.ts +++ b/src/i18n/locales/ja.ts @@ -7,6 +7,18 @@ export default { Home: 'ホーム', Feed: 'Feed', 'Favorite Relays': 'お気に入りのリレイ', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'すべてのお気に入りリレイ', 'Pinned note': 'Pinned note', 'Relay settings': 'リレイ設定', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'リレイ', Refresh: '更新', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'プロフィール', Logout: 'ログアウト', Following: 'フォロー中', followings: 'フォロー', boosted: 'ブースト済み', + 'Boosted by:': 'Boosted by:', 'just now': 'たった今', 'n minutes ago': '{{n}}分前', 'n m': '{{n}}分', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}} の使用リレイ', "username's muted": '{{username}} はミュート済み', Login: 'ログイン', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'あなたをフォローしています', 'Relay Settings': 'リレイ設定', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': '読&書', Read: '読む', Write: '書く', @@ -336,6 +402,9 @@ export default { 'Calculate optimal read relays': '最適な読みリレイを計算', 'Login to set': 'セットにログイン', 'Please login to view following feed': 'フォロー中のフィードを表示するにはログインしてください', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': '{{r}} にのみ送信', 'Send only to these relays': 'これらのリレイにのみ送信', Explore: '探索', @@ -373,6 +442,43 @@ export default { Topics: 'Topics', 'Open in a': '{{a}}で開く', 'Cannot handle event of kind k': '種類{{k}}のイベントは処理できません', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': '申し訳ありません!ノートが見つかりません 😔', 'This user has been muted': 'このユーザーはミュートされています', Wallet: 'ウォレット', @@ -390,6 +496,9 @@ export default { All: 'すべて', Reactions: '反応', Zaps: 'Zap', + Boosts: 'ブースト', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Jumbleをお楽しみですか?', 'Your donation helps me maintain Jumble and make it better! 😊': 'あなたの寄付はJumbleの維持と改善に役立ちます! 😊', @@ -432,6 +541,11 @@ export default { 'no more relays': 'これ以上のリレイはありません', 'Favorited by': 'お気に入り', 'Post settings': '投稿設定', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'メディアアップロードサービス', 'Choose a relay': 'リレイを選択', 'no relays found': 'リレイが見つかりません', @@ -445,6 +559,15 @@ export default { Bookmarks: 'ブックマーク一覧', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -458,11 +581,26 @@ export default { General: '一般', Autoplay: '自動再生', 'Enable video autoplay on this device': 'このデバイスでのビデオ自動再生を有効にする', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -482,9 +620,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'メディアファイルを貼り付けるかドロップしてアップロード', Preview: 'プレビュー', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -524,6 +687,11 @@ export default { Pay: '支払う', interactions: 'インタラクション', notifications: '通知', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': '信頼されていない{{type}}を表示', 'Hide untrusted {type}': '信頼されていない{{type}}を非表示', 'Currently hiding {type} from untrusted users.': @@ -577,8 +745,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'リレーURL(任意、カンマ区切り)', 'Remove poll': '投票を削除', 'Refresh results': '結果を更新', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: '投票', Media: 'メディア', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -589,6 +790,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': '再公開先 ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -624,7 +829,6 @@ export default { 'No more boosts': 'これ以上のブーストはありません', 'No boosts yet': 'まだブーストはありません', 'n more boosts': '{{count}} more boosts', - Boosts: 'ブースト', FollowListNotFoundConfirmation: 'フォローリストが見つかりません。新しいものを作成しますか?以前にユーザーをフォローしたことがある場合は、この操作により前のフォローリストが失われるため、確認しないでください。', MuteListNotFoundConfirmation: @@ -654,12 +858,45 @@ export default { Highlights: 'ハイライト', 'A note from': 'A note from', Polls: '投票', + 'Zap polls': 'Zap polls', 'Voice Posts': '音声投稿', 'Photo Posts': '写真投稿', 'Video Posts': 'ビデオ投稿', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'すべて選択', 'Clear All': 'すべてクリア', 'Set as default filter': 'デフォルトフィルターに設定', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: '適用', Reset: 'リセット', 'Share something on this Relay': 'このリレーで何かを共有する', @@ -671,8 +908,56 @@ export default { 'Hide content mentioning muted users': 'ミュートしたユーザーを言及するコンテンツを非表示', 'This note mentions a user you muted': 'このノートはミュートしたユーザーを言及しています', Filter: 'フィルター', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'ノートであなたに言及しました', 'quoted your note': 'あなたのノートを引用しました', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'あなたの投票に投票しました', 'reacted to your note': 'あなたのノートにリアクションしました', 'boosted your note': 'あなたのノートをブーストしました', @@ -729,6 +1014,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -919,6 +1208,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -981,6 +1272,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1091,6 +1383,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1144,6 +1438,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1175,7 +1470,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1184,6 +1480,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1207,6 +1504,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1216,7 +1515,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1269,6 +1622,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1279,6 +1633,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1323,6 +1681,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1432,6 +1798,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/ko.ts b/src/i18n/locales/ko.ts index 334f5e3c..a5e380fa 100644 --- a/src/i18n/locales/ko.ts +++ b/src/i18n/locales/ko.ts @@ -7,6 +7,18 @@ export default { Home: '홈', Feed: 'Feed', 'Favorite Relays': '즐겨찾는 릴레이', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': '모든 즐겨찾는 릴레이', 'Pinned note': 'Pinned note', 'Relay settings': '릴레이 설정', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: '릴레이', Refresh: '새로고침', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: '프로필', Logout: '로그아웃', Following: '팔로잉', followings: '팔로잉', boosted: '부스트함', + 'Boosted by:': 'Boosted by:', 'just now': '방금 전', 'n minutes ago': '{{n}}분 전', 'n m': '{{n}}분', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}}님이 사용하는 릴레이', "username's muted": '{{username}}님이 차단한 사용자', Login: '로그인', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': '회원님을 팔로우함', 'Relay Settings': '릴레이 설정', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': '읽기/쓰기', Read: '읽기 전용', Write: '쓰기 전용', @@ -335,6 +401,9 @@ export default { 'Calculate optimal read relays': '최적의 읽기 릴레이 계산', 'Login to set': '설정하려면 로그인', 'Please login to view following feed': '팔로잉 피드를 보려면 로그인하세요', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': '{{r}}에만 전송', 'Send only to these relays': '이 릴레이에만 전송', Explore: '탐색', @@ -372,6 +441,43 @@ export default { Topics: 'Topics', 'Open in a': '{{a}}에서 열기', 'Cannot handle event of kind k': '{{k}} 유형의 이벤트를 처리할 수 없습니다', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': '죄송합니다! 해당 노트를 찾을 수 없습니다 😔', 'This user has been muted': '이 사용자는 차단되었습니다', Wallet: '지갑', @@ -389,6 +495,9 @@ export default { All: '전체', Reactions: '반응', Zaps: '잽', + Boosts: '부스트', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Jumble이 마음에 드시나요?', 'Your donation helps me maintain Jumble and make it better! 😊': '후원해주시면 Jumble을 더 잘 유지하고 발전시킬 수 있습니다! 😊', @@ -431,6 +540,11 @@ export default { 'no more relays': '더 이상 릴레이 없음', 'Favorited by': '즐겨찾기한 사람', 'Post settings': '게시 설정', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': '미디어 업로드 서비스', 'Choose a relay': '릴레이 선택', 'no relays found': '릴레이를 찾을 수 없음', @@ -444,6 +558,15 @@ export default { Bookmarks: '북마크', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -457,11 +580,26 @@ export default { General: '일반', Autoplay: '자동 재생', 'Enable video autoplay on this device': '이 기기에서 비디오 자동 재생 활성화', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -481,9 +619,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': '미디어 파일을 붙여넣거나 드래그하여 업로드', Preview: '미리보기', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -523,6 +686,11 @@ export default { Pay: '결제', interactions: '상호작용', notifications: '알림', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': '신뢰하지 않는 {{type}} 표시', 'Hide untrusted {type}': '신뢰하지 않는 {{type}} 숨기기', 'Currently hiding {type} from untrusted users.': @@ -575,8 +743,41 @@ export default { 'Relay URLs (optional, comma-separated)': '릴레이 URL (선택사항, 쉼표로 구분)', 'Remove poll': '투표 제거', 'Refresh results': '결과 새로 고침', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: '투표', Media: '미디어', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -587,6 +788,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': '다시 게시 ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -622,7 +827,6 @@ export default { 'No more boosts': '더 이상 부스트가 없습니다', 'No boosts yet': '아직 부스트가 없습니다', 'n more boosts': '{{count}} more boosts', - Boosts: '부스트', FollowListNotFoundConfirmation: '팔로우 목록을 찾을 수 없습니다. 새로 만드시겠습니까? 이전에 사용자를 팔로우한 적이 있다면 이 작업으로 인해 이전 팔로우 목록을 잃게 되므로 확인하지 마시기 바랍니다.', MuteListNotFoundConfirmation: @@ -652,12 +856,45 @@ export default { Highlights: '하이라이트', 'A note from': 'A note from', Polls: '투표', + 'Zap polls': 'Zap polls', 'Voice Posts': '음성 게시물', 'Photo Posts': '사진 게시물', 'Video Posts': '비디오 게시물', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': '모두 선택', 'Clear All': '모두 지우기', 'Set as default filter': '기본 필터로 설정', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: '적용', Reset: '초기화', 'Share something on this Relay': '이 릴레이에서 무언가를 공유하세요', @@ -669,8 +906,56 @@ export default { 'Hide content mentioning muted users': '뮤트된 사용자를 언급하는 콘텐츠 숨기기', 'This note mentions a user you muted': '이 노트는 뮤트한 사용자를 언급합니다', Filter: '필터', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': '노트에서 당신을 언급했습니다', 'quoted your note': '당신의 노트를 인용했습니다', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': '당신의 투표에 참여했습니다', 'reacted to your note': '당신의 노트에 반응했습니다', 'boosted your note': '당신의 노트를 부스트했습니다', @@ -727,6 +1012,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -917,6 +1206,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -979,6 +1270,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1089,6 +1381,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1142,6 +1436,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1173,7 +1468,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1182,6 +1478,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1205,6 +1502,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1214,7 +1513,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1267,6 +1620,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1277,6 +1631,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1321,6 +1679,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1430,6 +1796,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/pl.ts b/src/i18n/locales/pl.ts index 997925c2..58fd535d 100644 --- a/src/i18n/locales/pl.ts +++ b/src/i18n/locales/pl.ts @@ -7,6 +7,18 @@ export default { Home: 'Strona Główna', Feed: 'Feed', 'Favorite Relays': 'Ulubione transmitery', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Wszystkie ulubione transmitery', 'Pinned note': 'Pinned note', 'Relay settings': 'Ustawienia transmiterów', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Transmitery', Refresh: 'Odśwież', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Twój Profil', Logout: 'Wyloguj', Following: 'Obserwowani', followings: 'niżej wymienionych', boosted: 'zboostował', + 'Boosted by:': 'Boosted by:', 'just now': 'teraz', 'n minutes ago': '{{n}} m', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}} użył transmiterów', "username's muted": 'Zablokowani przez {{username}} ', Login: 'Logowanie', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Obserwujący', 'Relay Settings': 'Ustawienia transmiterów', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'O & Z', Read: 'Odczyt', Write: 'Zapis', @@ -335,6 +401,9 @@ export default { 'Calculate optimal read relays': 'Obliczanie optymalnego odczytu transmiterów', 'Login to set': 'Zaloguj się', 'Please login to view following feed': 'Zaloguj się, aby wyświetlić poniższy wpis', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Wyślij tylko do {{r}}', 'Send only to these relays': 'Wyślij tylko do tych transmiterów', Explore: 'Transmitery', @@ -372,6 +441,43 @@ export default { Topics: 'Topics', 'Open in a': 'Otwórz w {{a}}', 'Cannot handle event of kind k': 'Nie można obsłużyć zdarzenia typu {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Sorry! The note cannot be found 😔', 'This user has been muted': 'Ten użytkownik został wyciszony', Wallet: 'Portfel', @@ -389,6 +495,9 @@ export default { All: 'Wszystkie', Reactions: 'Odzewy', Zaps: 'Zapy', + Boosts: 'Boosty', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Podoba ci się Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': 'Twoja darowizna pomoże mi utrzymać i ulepszać Jumble! 😊', @@ -432,6 +541,11 @@ export default { 'no more relays': 'brak kolejnych transmiterów', 'Favorited by': 'Ulubione przez', 'Post settings': 'Ustawienia publikacji', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Usługa przesyłania mediów', 'Choose a relay': 'Wybierz transmiter', 'no relays found': 'Nie znaleziono transmiterów', @@ -445,7 +559,15 @@ export default { Bookmarks: 'Zakładki', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -460,11 +582,26 @@ export default { Autoplay: 'Autoodtwarzanie', 'Enable video autoplay on this device': 'Włącz automatyczne odtwarzanie wideo na tym urządzeniu', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -484,9 +621,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Wklej lub upuść pliki multimedialne, aby przesłać', Preview: 'Podgląd', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -526,6 +688,11 @@ export default { Pay: 'Zapłać', interactions: 'Interakcje', notifications: 'Powiadomienia', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Pokaż nieznane {{type}}', 'Hide untrusted {type}': 'Ukryj nieznane {{type}}', 'Currently hiding {type} from untrusted users.': @@ -579,8 +746,41 @@ export default { 'Adresy URL transmiterów (opcjonalne, oddzielone przecinkami)', 'Remove poll': 'Usuń ankietę', 'Refresh results': 'Odśwież wyniki', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Ankieta', Media: 'media', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -591,6 +791,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Przekaż ponownie do ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -628,7 +832,6 @@ export default { 'No more boosts': 'Brak kolejnych boostów', 'No boosts yet': 'Brak boostów', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosty', FollowListNotFoundConfirmation: 'Lista obserwowanych nie została znaleziona. Czy chcesz utworzyć nową? Jeśli wcześniej obserwowałeś użytkowników, proszę NIE potwierdzaj, ponieważ ta operacja spowoduje utratę poprzedniej listy obserwowanych.', MuteListNotFoundConfirmation: @@ -658,12 +861,45 @@ export default { Highlights: 'Wyróżnienia', 'A note from': 'A note from', Polls: 'Ankiety', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Posty głosowe', 'Photo Posts': 'Posty ze zdjęciami', 'Video Posts': 'Posty wideo', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Zaznacz wszystko', 'Clear All': 'Wyczyść wszystko', 'Set as default filter': 'Ustaw jako domyślny filtr', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Zastosuj', Reset: 'Resetuj', 'Share something on this Relay': 'Udostępnij coś na tym transmiterze', @@ -675,8 +911,56 @@ export default { 'Hide content mentioning muted users': 'Ukryj treści wspominające wyciszonych użytkowników', 'This note mentions a user you muted': 'Ten wpis wspomina użytkownika, którego wyciszyłeś', Filter: 'Filtr', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'wspomniał o tobie w notatce', 'quoted your note': 'zacytował twoją notatkę', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'zagłosował w twojej ankiecie', 'reacted to your note': 'zareagował na twoją notatkę', 'boosted your note': 'zboostował twoją notatkę', @@ -733,6 +1017,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -923,6 +1211,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -985,6 +1275,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1095,6 +1386,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1148,6 +1441,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1179,7 +1473,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1188,6 +1483,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1211,6 +1507,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1220,7 +1518,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1273,6 +1625,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1283,6 +1636,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1327,6 +1684,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1436,6 +1801,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/pt-BR.ts b/src/i18n/locales/pt-BR.ts index 958c8061..e7b4da2f 100644 --- a/src/i18n/locales/pt-BR.ts +++ b/src/i18n/locales/pt-BR.ts @@ -7,6 +7,18 @@ export default { Home: 'Início', Feed: 'Feed', 'Favorite Relays': 'Relays favoritos', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Todos os relays favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configurações de relay', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Relays', Refresh: 'Atualizar', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Perfil', Logout: 'Sair', Following: 'Seguindo', followings: 'Seguidos', boosted: 'deu boost', + 'Boosted by:': 'Boosted by:', 'just now': 'agora mesmo', 'n minutes ago': '{{n}} minutos atrás', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": 'relays usados por {{username}}', "username's muted": '{{username}} silenciado', Login: 'Entrar', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Segue você', 'Relay Settings': 'Configurações de relay', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'Leitura & Escrita', Read: 'Leitura', Write: 'Escrita', @@ -337,6 +403,9 @@ export default { 'Calculate optimal read relays': 'Calcular relays de leitura ideais', 'Login to set': 'Entrar no conjunto', 'Please login to view following feed': 'Por favor, faça login para ver o feed de seguidores', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Enviar apenas para {{r}}', 'Send only to these relays': 'Enviar apenas para estes relays', Explore: 'Explorar', @@ -374,6 +443,43 @@ export default { Topics: 'Topics', 'Open in a': 'Abrir em {{a}}', 'Cannot handle event of kind k': 'Não é possível lidar com o evento do tipo {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Desculpe! A nota não pode ser encontrada 😔', 'This user has been muted': 'Este usuário foi silenciado', Wallet: 'Carteira', @@ -391,6 +497,9 @@ export default { All: 'Tudo', Reactions: 'Reações', Zaps: 'Zaps', + Boosts: 'Boosts', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Gostando do Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': 'Sua doação me ajuda a manter o Jumble e torná-lo melhor! 😊', @@ -434,6 +543,11 @@ export default { 'no more relays': 'não há mais relays', 'Favorited by': 'Favoritado por', 'Post settings': 'Ajustes de publicação', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Serviço de upload de mídia', 'Choose a relay': 'Escolher um relay', 'no relays found': 'nenhum relay encontrado', @@ -447,6 +561,15 @@ export default { Bookmarks: 'Favoritos', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -461,11 +584,26 @@ export default { Autoplay: 'Reprodução automática', 'Enable video autoplay on this device': 'Habilitar reprodução automática de vídeo neste dispositivo', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -485,9 +623,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Cole ou arraste arquivos de mídia para fazer upload', Preview: 'Pré-visualização', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -527,6 +690,11 @@ export default { Pay: 'Pagar', interactions: 'interações', notifications: 'notificações', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Mostrar {{type}} não confiáveis', 'Hide untrusted {type}': 'Ocultar {{type}} não confiáveis', 'Currently hiding {type} from untrusted users.': @@ -579,8 +747,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URLs de relay (opcional, separadas por vírgulas)', 'Remove poll': 'Remover enquete', 'Refresh results': 'Atualizar resultados', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Enquete', Media: 'Mídia', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -591,6 +792,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Republicar em ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -626,7 +831,6 @@ export default { 'No more boosts': 'Sem mais boosts', 'No boosts yet': 'Ainda sem boosts', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosts', FollowListNotFoundConfirmation: 'Lista de seguindo não encontrada. Deseja criar uma nova? Se você seguiu usuários antes, por favor NÃO confirme, pois esta operação fará você perder sua lista de seguindo anterior.', MuteListNotFoundConfirmation: @@ -656,12 +860,45 @@ export default { Highlights: 'Marcações', 'A note from': 'A note from', Polls: 'Enquetes', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Áudios', 'Photo Posts': 'Fotos', 'Video Posts': 'Vídeos', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Selecionar tudo', 'Clear All': 'Limpar tudo', 'Set as default filter': 'Definir como filtro padrão', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Aplicar', Reset: 'Redefinir', 'Share something on this Relay': 'Compartilhe algo neste Relay', @@ -672,8 +909,56 @@ export default { 'Hide content mentioning muted users': 'Ocultar conteúdo que menciona usuários silenciados', 'This note mentions a user you muted': 'Esta nota menciona um usuário que você silenciou', Filter: 'Filtro', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'mencionou você em uma nota', 'quoted your note': 'citou sua nota', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'votou na sua enquete', 'reacted to your note': 'reagiu à sua nota', 'boosted your note': 'deu boost na sua nota', @@ -731,6 +1016,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -921,6 +1210,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -983,6 +1274,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1093,6 +1385,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1146,6 +1440,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1177,7 +1472,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1186,6 +1482,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1209,6 +1506,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1218,7 +1517,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1271,6 +1624,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1281,6 +1635,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1325,6 +1683,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1434,6 +1800,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/pt-PT.ts b/src/i18n/locales/pt-PT.ts index be3d29ab..d1cad52b 100644 --- a/src/i18n/locales/pt-PT.ts +++ b/src/i18n/locales/pt-PT.ts @@ -7,6 +7,18 @@ export default { Home: 'Início', Feed: 'Feed', 'Favorite Relays': 'Relés Favoritos', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Todos os relés favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configurações de Relé', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Relés', Refresh: 'Atualizar', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Perfil', Logout: 'Sair', Following: 'Seguindo', followings: 'seguidos', boosted: 'deu boost', + 'Boosted by:': 'Boosted by:', 'just now': 'agora mesmo', 'n minutes ago': '{{n}} minutos atrás', 'n m': '{{n}}m', @@ -85,6 +100,7 @@ export default { "username's used relays": 'relés usados por {{username}}', "username's muted": '{{username}} silenciado', Login: 'Entrar', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Segue você', 'Relay Settings': 'Configurações de Relé', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'Leitura & Escrita', Read: 'Ler', Write: 'Escrever', @@ -337,6 +403,9 @@ export default { 'Calculate optimal read relays': 'Calcular relés de leitura ideais', 'Login to set': 'Entrar no conjunto', 'Please login to view following feed': 'Por favor, faça login para ver o feed de seguidores', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Enviar apenas para {{r}}', 'Send only to these relays': 'Enviar apenas para estes relés', Explore: 'Explorar', @@ -374,6 +443,43 @@ export default { Topics: 'Topics', 'Open in a': 'Abrir em {{a}}', 'Cannot handle event of kind k': 'Não é possível lidar com o evento do tipo {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Desculpe! A nota não pode ser encontrada 😔', 'This user has been muted': 'Este usuário foi silenciado', Wallet: 'Carteira', @@ -391,6 +497,9 @@ export default { All: 'Tudo', Reactions: 'Reações', Zaps: 'Zaps', + Boosts: 'Boosts', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Gostando do Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': 'Sua doação me ajuda a manter o Jumble e torná-lo melhor! 😊', @@ -434,6 +543,11 @@ export default { 'no more relays': 'não há mais relés', 'Favorited by': 'Favoritado por', 'Post settings': 'Configurações de Postagem', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Serviço de Upload de Mídia', 'Choose a relay': 'Escolher um Relé', 'no relays found': 'nenhum relé encontrado', @@ -447,6 +561,15 @@ export default { Bookmarks: 'Favoritos', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -461,11 +584,26 @@ export default { Autoplay: 'Reprodução Automática', 'Enable video autoplay on this device': 'Habilitar reprodução automática de vídeo neste dispositivo', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -485,9 +623,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Cole ou solte arquivos de mídia para fazer upload', Preview: 'Pré-visualização', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -527,6 +690,11 @@ export default { Pay: 'Pagar', interactions: 'interações', notifications: 'notificações', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Mostrar {{type}} não confiáveis', 'Hide untrusted {type}': 'Esconder {{type}} não confiáveis', 'Currently hiding {type} from untrusted users.': @@ -579,8 +747,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URLs de relay (opcional, separadas por vírgulas)', 'Remove poll': 'Remover sondagem', 'Refresh results': 'Atualizar resultados', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Sondagem', Media: 'mídia', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -591,6 +792,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Transmitir para...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -627,7 +832,6 @@ export default { 'No more boosts': 'Sem mais boosts', 'No boosts yet': 'Ainda sem boosts', 'n more boosts': '{{count}} more boosts', - Boosts: 'Boosts', FollowListNotFoundConfirmation: 'Lista de seguir não encontrada. Deseja criar uma nova? Se seguiu utilizadores anteriormente, por favor NÃO confirme, pois esta operação fará com que perca a sua lista de seguir anterior.', MuteListNotFoundConfirmation: @@ -657,12 +861,45 @@ export default { Highlights: 'Destaques', 'A note from': 'A note from', Polls: 'Inquéritos', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Áudios', 'Photo Posts': 'Fotos', 'Video Posts': 'Vídeos', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Seleccionar tudo', 'Clear All': 'Limpar tudo', 'Set as default filter': 'Definir como filtro predefinido', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Aplicar', Reset: 'Repor', 'Share something on this Relay': 'Partilhe algo neste Relay', @@ -674,8 +911,56 @@ export default { 'Hide content mentioning muted users': 'Ocultar conteúdo que menciona utilizadores silenciados', 'This note mentions a user you muted': 'Esta nota menciona um utilizador que silenciou', Filter: 'Filtro', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'mencionou-o numa nota', 'quoted your note': 'citou a sua nota', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'votou na sua sondagem', 'reacted to your note': 'reagiu à sua nota', 'boosted your note': 'deu boost na sua nota', @@ -733,6 +1018,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -923,6 +1212,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -985,6 +1276,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1095,6 +1387,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1148,6 +1442,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1179,7 +1474,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1188,6 +1484,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1211,6 +1508,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1220,7 +1519,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1273,6 +1626,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1283,6 +1637,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1327,6 +1685,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1436,6 +1802,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/ru.ts b/src/i18n/locales/ru.ts index 3d77eeb4..f0f3d02e 100644 --- a/src/i18n/locales/ru.ts +++ b/src/i18n/locales/ru.ts @@ -7,6 +7,18 @@ export default { Home: 'Главная', Feed: 'Feed', 'Favorite Relays': 'Избранные ретрансляторы', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'Все избранные ретрансляторы', 'Pinned note': 'Pinned note', 'Relay settings': 'Настройки ретрансляции', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'Ретрансляторы', Refresh: 'Обновить', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'Профиль', Logout: 'Выйти', Following: 'Подписки', followings: 'подписки', boosted: 'сделал буст', + 'Boosted by:': 'Boosted by:', 'just now': 'только что', 'n minutes ago': '{{n}} минут назад', 'n m': '{{n}}м', @@ -85,6 +100,7 @@ export default { "username's used relays": 'Ретрансляторы пользователя {{username}}', "username's muted": '{{username}} заблокирован', Login: 'Войти', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'Подписан на вас', 'Relay Settings': 'Настройки ретрансляторов', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -277,16 +333,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'Чтение & Запись', Read: 'Читать', Write: 'Писать', @@ -338,6 +404,9 @@ export default { 'Calculate optimal read relays': 'Рассчитать оптимальные ретрансляторы для чтения', 'Login to set': 'Войти в набор', 'Please login to view following feed': 'Войдите, чтобы увидеть ленту подписок', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'Отправить только на {{r}}', 'Send only to these relays': 'Отправить только на эти ретрансляторы', Explore: 'Обзор', @@ -375,6 +444,43 @@ export default { Topics: 'Topics', 'Open in a': 'Открыть в {{a}}', 'Cannot handle event of kind k': 'Невозможно обработать событие типа {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'Извините! Заметка не найдена 😔', 'This user has been muted': 'Этот пользователь заглушен', Wallet: 'Кошелёк', @@ -392,6 +498,9 @@ export default { All: 'Все', Reactions: 'Реакции', Zaps: 'Запы', + Boosts: 'Бусты', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'Нравится Jumble?', 'Your donation helps me maintain Jumble and make it better! 😊': 'Ваше пожертвование помогает поддерживать и улучшать Jumble! 😊', @@ -435,6 +544,11 @@ export default { 'no more relays': 'больше нет ретрансляторов', 'Favorited by': 'Избранные у', 'Post settings': 'Настройки публикации', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'Служба загрузки медиафайлов', 'Choose a relay': 'Выберите ретранслятор', 'no relays found': 'ретрансляторы не найдены', @@ -448,6 +562,15 @@ export default { Bookmarks: 'Закладки', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -461,11 +584,26 @@ export default { General: 'Общие', Autoplay: 'Автовоспроизведение', 'Enable video autoplay on this device': 'Включить автовоспроизведение видео на этом устройстве', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -485,9 +623,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'Вставьте или перетащите медиафайлы для загрузки', Preview: 'Предварительный просмотр', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -527,6 +690,11 @@ export default { Pay: 'Оплатить', interactions: 'взаимодействия', notifications: 'уведомления', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'Показать недоверенные {{type}}', 'Hide untrusted {type}': 'Скрыть недоверенные {{type}}', 'Currently hiding {type} from untrusted users.': @@ -579,8 +747,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URL релеев (необязательно, через запятую)', 'Remove poll': 'Удалить опрос', 'Refresh results': 'Обновить результаты', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'Опрос', Media: 'медиа', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -591,6 +792,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'Ретранслировать в ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -627,7 +832,6 @@ export default { 'No more boosts': 'Больше нет бустов', 'No boosts yet': 'Пока нет бустов', 'n more boosts': '{{count}} more boosts', - Boosts: 'Бусты', FollowListNotFoundConfirmation: 'Список подписок не найден. Хотите создать новый? Если вы уже подписывались на пользователей ранее, пожалуйста, НЕ подтверждайте, так как эта операция приведет к потере вашего предыдущего списка подписок.', MuteListNotFoundConfirmation: @@ -657,12 +861,45 @@ export default { Highlights: 'Выделения', 'A note from': 'A note from', Polls: 'Опросы', + 'Zap polls': 'Zap polls', 'Voice Posts': 'Голосовые посты', 'Photo Posts': 'Фото посты', 'Video Posts': 'Видео посты', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'Выбрать все', 'Clear All': 'Очистить все', 'Set as default filter': 'Установить как фильтр по умолчанию', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'Применить', Reset: 'Сбросить', 'Share something on this Relay': 'Поделиться чем-то на этом релее', @@ -674,8 +911,56 @@ export default { 'This note mentions a user you muted': 'Эта заметка упоминает пользователя, которого вы заглушили', Filter: 'Фильтр', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'упомянул вас в заметке', 'quoted your note': 'процитировал вашу заметку', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'проголосовал в вашем опросе', 'reacted to your note': 'отреагировал на вашу заметку', 'boosted your note': 'сделал буст вашей заметки', @@ -734,6 +1019,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -924,6 +1213,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -986,6 +1277,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1096,6 +1388,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1149,6 +1443,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1180,7 +1475,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1189,6 +1485,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1212,6 +1509,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1221,7 +1520,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1274,6 +1627,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1284,6 +1638,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1328,6 +1686,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1437,6 +1803,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/th.ts b/src/i18n/locales/th.ts index bfb05701..98dec6d9 100644 --- a/src/i18n/locales/th.ts +++ b/src/i18n/locales/th.ts @@ -7,6 +7,18 @@ export default { Home: 'หน้าหลัก', Feed: 'Feed', 'Favorite Relays': 'รีเลย์โปรด', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': 'รีเลย์โปรดทั้งหมด', 'Pinned note': 'Pinned note', 'Relay settings': 'การตั้งค่ารีเลย์', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: 'รีเลย์', Refresh: 'รีเฟรช', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: 'โปรไฟล์', Logout: 'ออกจากระบบ', Following: 'กำลังติดตาม', followings: 'กำลังติดตาม', boosted: 'บูสต์แล้ว', + 'Boosted by:': 'Boosted by:', 'just now': 'เมื่อสักครู่', 'n minutes ago': '{{n}} นาทีที่แล้ว', 'n m': '{{n}}น', @@ -85,6 +100,7 @@ export default { "username's used relays": 'รีเลย์ที่ {{username}} ใช้งาน', "username's muted": 'ผู้ที่ {{username}} ปิดเสียง', Login: 'เข้าสู่ระบบ', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': 'ติดตามคุณ', 'Relay Settings': 'การตั้งค่ารีเลย์', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -276,16 +332,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': 'อ่าน & เขียน', Read: 'อ่าน', Write: 'เขียน', @@ -335,6 +401,9 @@ export default { 'Calculate optimal read relays': 'คำนวณรีเลย์อ่านที่เหมาะสม', 'Login to set': 'เข้าสู่ระบบเพื่อกำหนด', 'Please login to view following feed': 'กรุณาเข้าสู่ระบบเพื่อดูฟีดที่ติดตาม', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': 'ส่งเฉพาะไปยัง {{r}}', 'Send only to these relays': 'ส่งเฉพาะไปยังรีเลย์เหล่านี้', Explore: 'สำรวจ', @@ -372,6 +441,43 @@ export default { Topics: 'Topics', 'Open in a': 'เปิดใน {{a}}', 'Cannot handle event of kind k': 'ไม่สามารถจัดการเหตุการณ์ประเภท {{k}}', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': 'ขออภัย! ไม่พบโน้ต 😔', 'This user has been muted': 'ผู้ใช้นี้ถูกปิดเสียง', Wallet: 'กระเป๋าสตางค์', @@ -389,6 +495,9 @@ export default { All: 'ทั้งหมด', Reactions: 'ปฏิกิริยา', Zaps: 'ซาตส์', + Boosts: 'บูสต์', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': 'ชอบ Jumble ไหม?', 'Your donation helps me maintain Jumble and make it better! 😊': 'การบริจาคของคุณช่วยให้ฉันดูแลและพัฒนา Jumble ให้ดีขึ้น! 😊', @@ -431,6 +540,11 @@ export default { 'no more relays': 'ไม่มีรีเลย์เพิ่มเติม', 'Favorited by': 'ถูกเพิ่มเป็นรายการโปรดโดย', 'Post settings': 'การตั้งค่าโพสต์', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': 'บริการอัปโหลดสื่อ', 'Choose a relay': 'เลือกรีเลย์', 'no relays found': 'ไม่พบรีเลย์', @@ -444,6 +558,15 @@ export default { Bookmarks: 'บุ๊กมาร์ก', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -457,11 +580,26 @@ export default { General: 'ทั่วไป', Autoplay: 'เล่นอัตโนมัติ', 'Enable video autoplay on this device': 'เปิดใช้งานเล่นวิดีโออัตโนมัติบนอุปกรณ์นี้', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -481,9 +619,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': 'วางหรือหย่อนไฟล์สื่อเพื่ออัปโหลด', Preview: 'ดูตัวอย่าง', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -523,6 +686,11 @@ export default { Pay: 'ชำระเงิน', interactions: 'การโต้ตอบ', notifications: 'การแจ้งเตือน', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': 'แสดง {{type}} ที่ไม่น่าเชื่อถือ', 'Hide untrusted {type}': 'ซ่อน {{type}} ที่ไม่น่าเชื่อถือ', 'Currently hiding {type} from untrusted users.': @@ -575,8 +743,41 @@ export default { 'Relay URLs (optional, comma-separated)': 'URL รีเลย์ (ไม่บังคับ, คั่นด้วยจุลภาค)', 'Remove poll': 'ลบโพลล์', 'Refresh results': 'รีเฟรชผลลัพธ์', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: 'โพลล์', Media: 'สื่อ', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -587,6 +788,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': 'เผยแพร่ซ้ำไปยัง ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -622,7 +827,6 @@ export default { 'No more boosts': 'ไม่มีบูสต์เพิ่มเติม', 'No boosts yet': 'ยังไม่มีบูสต์', 'n more boosts': '{{count}} more boosts', - Boosts: 'บูสต์', FollowListNotFoundConfirmation: 'ไม่พบรายการติดตาม คุณต้องการสร้างรายการใหม่หรือไม่? หากคุณเคยติดตามผู้ใช้มาก่อน กรุณาอย่ายืนยัน เพราะการดำเนินการนี้จะทำให้คุณสูญเสียรายการติดตามก่อนหน้านี้', MuteListNotFoundConfirmation: @@ -652,12 +856,45 @@ export default { Highlights: 'ไฮไลต์', 'A note from': 'A note from', Polls: 'โพล', + 'Zap polls': 'Zap polls', 'Voice Posts': 'โพสต์เสียง', 'Photo Posts': 'โพสต์รูปภาพ', 'Video Posts': 'โพสต์วิดีโอ', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': 'เลือกทั้งหมด', 'Clear All': 'ล้างทั้งหมด', 'Set as default filter': 'ตั้งเป็นตัวกรองเริ่มต้น', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: 'ใช้', Reset: 'รีเซ็ต', 'Share something on this Relay': 'แชร์บางอย่างบนรีเลย์นี้', @@ -668,8 +905,56 @@ export default { 'Hide content mentioning muted users': 'ซ่อนเนื้อหาที่กล่าวถึงผู้ใช้ที่ปิดเสียง', 'This note mentions a user you muted': 'โน้ตนี้กล่าวถึงผู้ใช้ที่คุณปิดเสียง', Filter: 'ตัวกรอง', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': 'ได้กล่าวถึงคุณในโน้ต', 'quoted your note': 'ได้ยกคำพูดจากโน้ตของคุณ', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': 'ได้โหวตในการสำรวจของคุณ', 'reacted to your note': 'ได้แสดงปฏิกิริยาต่อโน้ตของคุณ', 'boosted your note': 'ได้บูสต์โน้ตของคุณ', @@ -725,6 +1010,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -914,6 +1203,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -976,6 +1267,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1086,6 +1378,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1139,6 +1433,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1170,7 +1465,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1179,6 +1475,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1202,6 +1499,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1211,7 +1510,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1264,6 +1617,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1274,6 +1628,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1318,6 +1676,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1427,6 +1793,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/i18n/locales/zh.ts b/src/i18n/locales/zh.ts index fd80c542..cb9957f0 100644 --- a/src/i18n/locales/zh.ts +++ b/src/i18n/locales/zh.ts @@ -7,6 +7,18 @@ export default { Home: '主页', Feed: 'Feed', 'Favorite Relays': '收藏的服务器', + 'Relay pulse': 'Relay pulse', + 'Relay pulse empty': 'Quiet on your relays in the last hour.', + 'Relay pulse follows': 'Following ({{count}})', + 'Relay pulse others': 'Others ({{count}})', + 'Relay pulse updated': 'Updated {{relative}}', + 'Relay pulse active npubs': 'Active npubs', + 'Relay pulse active npubs hint': + 'Kind 0 profiles for pubkeys seen on your favorite relays in the last hour (same sample as Relay pulse).', + 'Relay pulse drawer following': 'Following', + 'Relay pulse drawer others': 'Others', + 'Relay pulse drawer no profiles': 'No kind 0 profiles loaded for this sample yet.', + 'See the newest notes from your follows': 'See the newest notes from your follows', 'All favorite relays': '所有收藏服务器', 'Pinned note': 'Pinned note', 'Relay settings': '服务器设置', @@ -14,11 +26,14 @@ export default { 'Account menu': 'Account menu', SidebarRelays: '服务器', Refresh: '刷新列表', + 'refresh.longPressHardReload': 'Long-press: reload app and restore feed cache', + 'link.expandNostrEmbed': 'Show Nostr preview', Profile: '个人资料', Logout: '退出登录', Following: '关注', followings: '关注', boosted: '已助推', + 'Boosted by:': 'Boosted by:', 'just now': '刚刚', 'n minutes ago': '{{n}} 分钟前', 'n m': '{{n}}分', @@ -85,6 +100,7 @@ export default { "username's used relays": '{{username}} 使用的服务器', "username's muted": '{{username}} 屏蔽的用户', Login: '登录', + downloadDesktopApp: 'Download app', 'Please log in to view notifications.': 'Please log in to view notifications.', 'Follows you': '关注了你', 'Relay Settings': '服务器设置', @@ -160,10 +176,50 @@ export default { 'Start call about this': 'Start call about this', 'Send call invite': 'Send call invite', 'Read this note aloud': 'Read this note aloud', - 'Read-aloud is not supported in this browser': - 'Read-aloud is not supported in this browser', + 'Read-aloud is not supported in this browser': 'Read-aloud is not supported in this browser', 'Nothing to read aloud': 'Nothing to read aloud', 'Read-aloud failed': 'Read-aloud failed', + 'Read aloud': 'Read aloud', + 'Read-aloud idle': 'Idle', + 'Preparing read-aloud…': 'Preparing read-aloud…', + 'Requesting audio…': 'Requesting audio…', + 'Loading audio…': 'Loading audio…', + Playing: 'Playing', + Paused: 'Paused', + 'Read-aloud finished': 'Finished', + 'Read-aloud error': 'Error', + 'TTS endpoint': 'TTS endpoint', + 'Using browser speech synthesis': 'Using browser speech synthesis', + 'Read-aloud section progress': 'Section {{current}} of {{total}}', + 'Request sent': 'Request sent', + 'Response received': 'Response received', + 'Playback started': 'Playback started', + Characters: 'Characters', + Pause: 'Pause', + Play: 'Play', + Stop: 'Stop', + 'Read-aloud sections': 'Read-aloud sections', + 'Read-aloud overall progress': 'Overall progress', + 'Read-aloud section done': 'Section {{index}}: finished', + 'Read-aloud section pending': 'Section {{index}}: not started yet', + 'Read-aloud section fetching': 'Section {{index}}: requesting audio', + 'Read-aloud section preparing audio': 'Section {{index}}: loading audio', + 'Read-aloud section playing': 'Section {{index}}: playing', + 'Read-aloud section paused': 'Section {{index}}: paused', + 'Read-aloud legend fetching': 'Requesting audio for this section from the server…', + 'Read-aloud legend buffering': 'Decoding audio for this section…', + 'Read-aloud legend playing': 'Playing this section.', + 'Read-aloud legend paused': 'Playback paused.', + 'Read-aloud Piper fallback notice': + 'Server voice (Piper) could not be used. Playing with your browser voice instead.', + 'Read-aloud Piper fallback detail label': 'Piper error', + 'Read-aloud Piper status region': 'Piper text-to-speech status', + 'Read-aloud Piper status heading': 'Piper (server voice)', + 'Read-aloud Piper skipped notice': + 'No Piper URL is configured for this app (see VITE_READ_ALOUD_TTS_URL). Only the browser voice is used — the server was not contacted.', + 'Read-aloud Piper attempt started': + 'Piper was started at {{time}} (this read-aloud used the server first).', + 'Read-aloud Piper endpoint tried': 'URL used: {{url}}', 'Join the video call': 'Join the video call', 'Schedule video call': 'Schedule video call', "You're invited to a scheduled video call.": "You're invited to a scheduled video call.", @@ -275,16 +331,26 @@ export default { 'Upload Image': 'Upload Image', 'Insert emoji': 'Insert emoji', 'Insert GIF': 'Insert GIF', + 'Insert meme': 'Insert meme', 'Search GIFs': 'Search GIFs', + 'Search memes': 'Search memes', 'Choose a GIF': 'Choose a GIF', + 'Choose a meme': 'Choose a meme', 'Search GifBuddy for more GIFs': 'Search GifBuddy for more GIFs', 'Add your own GIFs': 'Add your own GIFs', + 'Add your own meme templates': 'Add your own meme templates', 'Description (optional, for search)': 'Description (optional, for search)', 'e.g. happy birthday, thumbs up': 'e.g. happy birthday, thumbs up', + 'e.g. drake, distracted boyfriend': 'e.g. drake, distracted boyfriend', 'Uploading...': 'Uploading...', 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.': 'No GIFs found. Try searching or add your own. GIFs come from Nostr kind 1063 (NIP-94) events on GIF relays.', + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).': + 'No meme templates found. Try searching or open Meme Amigo. The grid only lists kind 1063 (NIP-94) files tagged memeamigo (not random photos from notes).', + 'Failed to publish meme template for the picker': + 'Failed to publish meme template for the picker', '{{name}} is not a GIF file': '{{name}} is not a GIF file', + '{{name}} is not a JPEG, PNG, or WebP file': '{{name}} is not a JPEG, PNG, or WebP file', 'R & W': '读写', Read: '只读', Write: '只写', @@ -334,6 +400,9 @@ export default { 'Calculate optimal read relays': '计算最佳读服务器', 'Login to set': '登录后设置', 'Please login to view following feed': '请登录以查看关注动态', + 'Follow set': 'Follow set', + 'Follow set feed empty': + 'This NIP-51 list is empty, was not found, or relays could not load it yet.', 'Send only to r': '只发送到 {{r}}', 'Send only to these relays': '只发送到这些服务器', Explore: '探索', @@ -371,6 +440,43 @@ export default { Topics: 'Topics', 'Open in a': '在 {{a}} 中打开', 'Cannot handle event of kind k': '无法处理类型为 {{k}} 的事件', + 'Unsupported event preview': + 'There isn’t a dedicated card for this event type yet. Here’s a readable preview.', + 'No text content in event': 'No text in this event.', + 'Technical details': 'Technical details', + 'Event kind and time': 'Kind {{kind}} · {{time}}', + 'Event kind label': 'Kind {{kind}}', + 'Note kind label line': 'KIND: {{kind}} · {{description}}', + 'Unknown note declared kind tag': 'Tagged kind: {{value}}', + 'Unknown note tagged pubkey': 'Tagged pubkey', + 'Unknown note tagged content': 'Content', + 'Unknown note reference tags': 'Reference tags (e, p, q, a)', + 'Starred spells': 'Starred spells', + 'Spell star add title': 'Star spell (adds to your Nostr bookmarks)', + 'Spell star remove title': 'Unstar spell (removes from your Nostr bookmarks)', + 'Copy JSON': 'Copy JSON', + Verse: 'Verse', + 'Notification reaction summary': 'reacted to this note.', + 'Notification discussion upvote summary': 'upvoted in this discussion.', + 'Notification discussion downvote summary': 'downvoted in this discussion.', + 'Notification boost summary': 'Boosted this note', + 'Notification boost detail': 'The preview above is the original post.', + 'Notification poll vote summary': 'Voted on the poll above.', + 'Notification poll vote options count': '{{count}} option(s) selected', + 'Jumble Imwald synthetic event': 'Jumble Imwald synthetic event', + '+ Add a URL to this list': 'Add a URL to this list', + 'Add a web URL': 'Add a web URL', + 'Add web URL to feed description': + 'Adds a card to this feed. Open the page from the card when you want to read, reply, react, or highlight.', + 'Add to feed': 'Add to feed', + 'Open any https page in the side panel to reply, react, and discuss on Nostr.': + 'Open any https page in the side panel to reply, react, and discuss on Nostr.', + 'Enter a valid http(s) URL': 'Enter a valid http(s) URL', + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.': + 'Opened by URL — not from your RSS list. Nostr thread is still tied to this link.', + 'Open in browser': 'Open in browser', + 'Web page': 'Web page', + Open: 'Open', 'Sorry! The note cannot be found 😔': '抱歉!找不到该笔记 😔', 'This user has been muted': '该用户已被屏蔽', Wallet: '钱包', @@ -388,6 +494,9 @@ export default { All: '全部', Reactions: '互动', Zaps: '打闪', + Boosts: '助推', + Badges: 'Badges', + Reports: 'Reports', 'Enjoying Jumble?': '喜欢 Jumble 吗?', 'Your donation helps me maintain Jumble and make it better! 😊': '您的捐赠帮助我维护 Jumble 并使其更好!😊', @@ -430,6 +539,11 @@ export default { 'no more relays': '没有更多服务器了', 'Favorited by': '收藏自', 'Post settings': '发布设置', + 'Publishing feedback': 'Publishing feedback', + 'Publish success toasts': 'Publish success toasts', + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.': + 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.', + 'Publish successful': 'Publish successful', 'Media upload service': '媒体上传服务', 'Choose a relay': '选择一个服务器', 'no relays found': '未找到服务器', @@ -443,6 +557,15 @@ export default { Bookmarks: '收藏', 'Follow Packs': 'Follow Packs', 'Follow Pack': 'Follow Pack', + 'Follow pack by': 'by', + 'In Follow Packs': 'In Follow Packs', + 'Badge details': 'Badge details', + 'Issued by': 'Issued by', + 'Other recipients': 'Other recipients', + 'No other recipients found': 'No other recipients found', + 'Recipients could not be loaded': 'Recipients could not be loaded', + 'View award': 'View award', + 'Awarded on': 'Awarded on', 'Please log in to follow': 'Please log in to follow', 'Following All': 'Following All', 'Followed {{count}} users': 'Followed {{count}} users', @@ -456,11 +579,26 @@ export default { General: '常规', Autoplay: '自动播放', 'Enable video autoplay on this device': '在此设备上启用视频自动播放', + 'liveActivities.heading': 'Live now', + 'liveActivities.regionLabel': 'Live spaces and streams', + 'liveActivities.fromFollow': 'From someone you follow', + 'liveActivities.goToSlide': 'Show live item {{n}}', + 'liveActivities.settingsToggle': 'Live activities banner', + 'liveActivities.settingsHint': + 'Shows NIP-53 live rooms (audio/video spaces) from your relays. Updates on a quarter-hour schedule and when the app finishes its initial session warm-up.', 'Add random relays to every publish': 'Random relays in publish list', 'Add random relays to every publish description': 'Adds {{n}} random public relays from the NIP-66 lively list (preferring monitors that reported a write RTT) to the publish relay list. When ON, they are selected by default; when OFF, they appear in the list but are unchecked so you can optionally include them.', relayType_local: 'Local', relayType_relay_list: 'Relay list', + relayType_http_relay_list: 'HTTP', + 'HTTP relays': 'HTTP relays', + httpRelaysDescription: + 'HTTPS index relays (e.g. REST /api/events/filter). Same read/write/both roles as mailbox relays; stored as kind 10243. Clear the list and save to publish an empty list.', + 'HTTP relays saved': 'HTTP relays saved', + 'Failed to save HTTP relay list': 'Failed to save HTTP relay list', + 'HTTP relays must start with https:// or http://': + 'HTTP relays must start with https:// or http://', relayType_client_default: 'Client default', relayType_open_from: 'Current feed', relayType_favorite: 'Favorite', @@ -480,9 +618,34 @@ export default { 'Session relays scored random hint': 'Relays that have accepted at least one publish this session; used to prefer faster relays when picking random relays. Sorted by average latency.', 'Session relays all striked': 'All striked relays (any source)', + 'Session relays clear strike': 'Allow again', + 'Session relays clear strike hint': + 'Remove this relay from the session block list; it will be used again until new connection failures.', successes: 'successes', None: 'None', 'Cache & offline storage': 'Cache & offline storage', + feedStarting: 'Starting feeds and relays… This can take a few seconds after login.', + refreshCacheButtonExplainer: + 'Refresh Cache runs an IndexedDB upgrade check, re-fetches your relay lists and profile-related events from the network (same work as the automatic startup sync), syncs kind-5 deletions into tombstones and removes deleted items from the local cache, then refreshes the store counts below.', + 'eventArchive.sectionTitle': 'Notes & feed archive', + 'eventArchive.sectionBlurb': + 'Keeps notes, reactions, and timeline order on disk so feeds can load offline or on slow links. Replaceable data (profiles, relay lists, publications) stays in its existing stores — this archive only fills gaps for “firehose” events. Turn off to rely on relays only.', + 'eventArchive.defaultsMobile': + 'This device profile uses small defaults: about {{lru}} events in memory, ~{{mb}} MB / {{ev}} archived events (reactions/zaps drop first).', + 'eventArchive.defaultsElectron': + 'Desktop app defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.defaultsDesktopWeb': + 'Desktop browser defaults: ~{{lru}} in-memory events, ~{{mb}} MB / {{ev}} archived events.', + 'eventArchive.enablePersist': 'Persist feed events to disk', + 'eventArchive.maxMb': 'Max archive size (MB), blank = default for this device', + 'eventArchive.maxEvents': 'Max archived events, blank = default', + 'eventArchive.sessionLru': 'In-memory session cache (event count), blank = default', + 'eventArchive.effectiveSummary': + 'Currently: {{enabled}} — ~{{mb}} MB budget, {{events}} events, {{lru}} session LRU.', + 'eventArchive.on': 'on', + 'eventArchive.off': 'off', + 'eventArchive.apply': 'Apply cache settings', + 'eventArchive.appliedToast': 'Cache settings saved. Session memory updated.', 'Paste or drop media files to upload': '支持粘贴或拖放媒体文件进行上传', Preview: '预览', 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': @@ -522,6 +685,11 @@ export default { Pay: '支付', interactions: '互动', notifications: '通知', + notificationsViewAsAccount: 'View as', + notificationsViewAsAccountAria: + 'Switch stored account. Notifications, replies, zaps, reactions, and boosts use this account.', + notificationsSwitchAccountFailed: + 'Could not switch account. Check your signer, password, or extension and try again.', 'Show untrusted {type}': '显示不受信任的{{type}}', 'Hide untrusted {type}': '隐藏不受信任的{{type}}', 'Currently hiding {type} from untrusted users.': '当前隐藏来自不受信任用户的{{type}}。', @@ -573,8 +741,41 @@ export default { 'Relay URLs (optional, comma-separated)': '中继服务器 URL(可选,逗号分隔)', 'Remove poll': '移除投票', 'Refresh results': '刷新结果', + '{{votes}} · {{pct}}%': '{{votes}} · {{pct}}%', + 'See results': 'See results', + 'Zap poll (paid votes)': 'Zap poll (paid votes)', + 'Invalid zap poll': 'Invalid zap poll', + 'You voted on this poll (zap receipt)': 'You voted on this poll (zap receipt)', + 'Poll closed {{time}}': 'Poll closed {{time}}', + 'Closes {{time}}': 'Closes {{time}}', + 'Vote size': 'Vote size', + '{{n}} sats (fixed)': '{{n}} sats (fixed)', + '{{min}}–{{max}} sats': '{{min}}–{{max}} sats', + '≥ {{n}} sats': '≥ {{n}} sats', + '≤ {{n}} sats': '≤ {{n}} sats', + 'Loading tally…': 'Loading tally…', + 'Zap poll no votes yet': + 'No zap votes found on the relays we queried (try Refresh tally, or votes may live on other relays).', + 'Consensus threshold': 'Consensus threshold', + 'Pay to': 'Pay to', + Recipient: 'Recipient', + Option: 'Option', + 'Select option': 'Select option', + 'Select an option': 'Select an option', + 'Vote with zap': 'Vote with zap', + 'Zap sent': 'Zap sent', + 'Zapping…': 'Zapping…', + 'Refresh tally': 'Refresh tally', + '{{n}} zaps': '{{n}} zaps', Poll: '投票', Media: '媒体', + 'Articles and Publications': 'Articles and Publications', + 'Search articles...': 'Search articles...', + 'Refreshing articles...': 'Refreshing articles...', + 'No articles or publications found': 'No articles or publications found', + 'No articles or publications match your search': + 'No articles or publications match your search', + 'articles and publications': 'articles and publications', Interests: 'Interests', Calendar: 'Calendar', 'No subscribed interests yet.': @@ -585,6 +786,10 @@ export default { 'Nothing to load for this feed.': 'Nothing to load for this feed.', 'No posts loaded for this feed. Try refreshing.': 'No posts loaded for this feed. Try refreshing.', + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.': + 'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.', + 'Per-relay timeline results ({{count}} connections)': + 'Per-relay timeline results ({{count}} connections)', 'Republish to ...': '重新发布到 ...', 'All available relays': 'All available relays', 'All active relays (monitoring list)': 'All active relays (monitoring list)', @@ -618,7 +823,6 @@ export default { 'No more boosts': '没有更多助推了', 'No boosts yet': '暂无助推', 'n more boosts': '{{count}} more boosts', - Boosts: '助推', FollowListNotFoundConfirmation: '未找到关注列表。你想创建一个新的吗?如果你之前已经关注了用户,请不要确认,因为此操作会导致你丢失之前的关注列表。', MuteListNotFoundConfirmation: @@ -647,12 +851,45 @@ export default { Highlights: '高亮', 'A note from': 'A note from', Polls: '投票', + 'Zap polls': 'Zap polls', 'Voice Posts': '语音帖子', 'Photo Posts': '图片帖子', 'Video Posts': '视频帖子', + 'Git repositories': 'Git repositories', + 'Git issues': 'Git issues', + 'Git releases': 'Git releases', + 'Git Republic repository': 'Git Republic repository', + 'Git Republic issue': 'Git Republic issue', + 'Git Republic release': 'Git Republic release', + 'Git Republic event': 'Git Republic event', + 'Git Republic': 'Git Republic', + 'Open in Git Republic': 'Open in Git Republic', + 'Pre-release': 'Pre-release', + Draft: 'Draft', + 'Repository release': 'Repository release', + 'New Repository Release': 'New Repository Release', + 'Release notes use the editor below (optional).': + 'Release notes use the editor below (optional).', + 'Repository owner (npub or hex)': 'Repository owner (npub or hex)', + 'Repository id (d-tag)': 'Repository id (d-tag)', + 'Git tag name': 'Git tag name', + 'Tag target (40-char commit hash)': 'Tag target (40-character commit hash)', + '40-character hex SHA-1': '40-character hex SHA-1', + 'Release title': 'Release title', + 'Download URL': 'Download URL', + 'Draft release': 'Draft release', + 'Fill repository release fields': 'Fill in all required repository release fields.', + 'Invalid repository owner pubkey': 'Invalid repository owner (use npub or 64-char hex).', + 'Citations require private relays (NIP-65).': + 'Citations require private outbox relays (NIP-65).', 'Select All': '全选', 'Clear All': '清空', 'Set as default filter': '设为默认过滤器', + 'Use filter': 'Use filter', + 'See all events': 'See all events', + 'See all events hint': + 'Feed requests omit kind filters and every kind is shown (still subject to relay limits and other feed rules). For testing new event kinds.', + 'Use filter hint': 'Only the kinds you select below are requested and shown.', Apply: '应用', Reset: '重置', 'Share something on this Relay': '在此服务器上分享点什么', @@ -663,8 +900,56 @@ export default { 'Hide content mentioning muted users': '隐藏提及已屏蔽用户的内容', 'This note mentions a user you muted': '此笔记提及了您已屏蔽的用户', Filter: '过滤器', + 'Feed filter': 'Feed filter', + 'Search loaded posts': 'Search loaded posts', + 'Filter loaded posts placeholder': 'Filter by text in content or tags…', + 'Feed filter author': 'Author', + 'Feed filter author everyone': 'From everyone', + 'Feed filter author me': 'Only from me', + 'Feed filter author npub': 'From user (npub or hex)', + 'Feed filter author npub from prefix': 'from:', + 'Feed filter author npub placeholder': 'npub1… or 64-char hex', + 'Feed filter author me needs login': 'Log in to filter by your pubkey', + 'Within the last': 'Within the last', + 'Time unit': 'Time unit', + Minutes: 'Minutes', + Days: 'Days', + Weeks: 'Weeks', + Months: 'Months', + Years: 'Years', + 'Feed filter client-side hint': + 'Filters only apply to posts already loaded; relays are not queried again.', + 'Feed full search': 'Perform full search', + 'Feed full search running': 'Searching…', + 'Feed full search clear': 'Clear', + 'Feed full search active hint': + 'Showing relay search results. Clear to return to the live feed.', + 'Feed full search need constraint': + 'Add search text, an author filter, or a time range before searching relays.', + 'Feed full search invalid feed': 'This feed cannot run a relay search.', + 'Feed full search failed': 'Relay search failed. Try again.', + 'Feed full search empty': 'No matching posts were found on the queried relays.', + 'No loaded posts match your filters.': 'No loaded posts match your filters.', 'mentioned you in a note': '在笔记中提及了您', 'quoted your note': '引用了您的笔记', + 'quoted this note': 'Quoted this note', + 'highlighted this note': 'Highlighted this note', + 'cited in article': 'Cited in article', + 'Thread backlinks heading': 'Also quoting this note', + 'Thread backlinks primary section': 'Quotes, highlights & citations', + 'Thread backlinks bookmarks section': 'Bookmarks', + 'Thread backlinks lists section': 'Lists & collections', + 'View full note and thread': 'View full note and thread', + 'labeled this note': 'Labeled this note', + 'reported this note': 'Reported this note', + 'bookmarked this note': 'Bookmarked this note', + 'pinned this note': 'Pinned this note', + 'listed this note': 'Listed this note', + 'bookmark set reference': 'Bookmark set includes this note', + 'curated this note': 'Curated this note', + 'badge award for this note': 'Badge award for this note', + 'referenced this note': 'Referenced this note', + 'Report events heading': 'Moderation reports', 'voted in your poll': '在您的投票中投票', 'reacted to your note': '对您的笔记做出了反应', 'boosted your note': '助推了您的笔记', @@ -720,6 +1005,10 @@ export default { 'Trending on the Default Relays': 'Trending on the Default Relays', 'Latest from your follows': 'Latest from your follows', 'Latest from our recommended follows': 'Latest from our recommended follows', + 'Follows latest page title': 'Latest from follows', + 'Follows latest page description': + 'Recent notes from accounts you follow (or a curated list when not signed in), using their outbox relays merged with your favorites. Expand a row for notes or open the profile from the row.', + 'Follows latest nav label': 'Follows latest', 'Loading follow list…': 'Loading follow list…', 'Could not load recommended follows': 'Could not load recommended follows', 'Your follow list is empty': 'Your follow list is empty', @@ -909,6 +1198,8 @@ export default { 'Article exported as AsciiDoc': 'Article exported as AsciiDoc', 'Article exported as Markdown': 'Article exported as Markdown', 'Article title (optional)': 'Article title (optional)', + articleDTagDefaultHint: + 'Optional. If empty, the d-tag defaults to a type-specific prefix plus a Unix timestamp (seconds), e.g. longform-article-…, wiki-article-…, wiki-markdown-…, publication-content-….', Audio: 'Audio', Author: 'Author', 'Author is required for reading groups': 'Author is required for reading groups', @@ -971,6 +1262,7 @@ export default { 'Create New Thread': 'Create New Thread', 'Create Poll': 'Create Poll', 'Create Thread': 'Create Thread', + composeModeKind1: 'Short note (kind 1) — turn off other compose types', 'Create a Spell': 'Create a Spell', 'Creating...': 'Creating...', 'D-Tag': 'D-Tag', @@ -1081,6 +1373,8 @@ export default { Insert: 'Insert', 'Insert URL into your post and publish to Nostr GIF library (NIP-94).': 'Insert URL into your post and publish to Nostr GIF library (NIP-94).', + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.': + 'Insert URL into your post and publish kind 1063 (NIP-94) with hashtag memeamigo for discoverability.', 'Insert event or address': 'Insert event or address', 'Insert mention': 'Insert mention', 'Internal Citation': 'Internal Citation', @@ -1134,6 +1428,7 @@ export default { 'New Internal Citation': 'New Internal Citation', 'New Long-form Article': 'New Long-form Article', 'New Poll': 'New Poll', + 'New Discussion': 'New Discussion', 'New Prompt Citation': 'New Prompt Citation', 'New Public Message': 'New Public Message', 'New Wiki Article': 'New Wiki Article', @@ -1165,7 +1460,8 @@ export default { 'Open Timestamp': 'Open Timestamp', 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.': 'Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.', - Option: 'Option', + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.': + 'Opens in a new tab. Copy an image URL there, then paste below. If this picker closed, click “Insert meme” again to paste.', Optional: 'Optional', 'Optional image for the event': 'Optional image for the event', 'Optionally, add the full quote/context to show your highlight within it': @@ -1174,6 +1470,7 @@ export default { 'Page Range': 'Page Range', Pages: 'Pages', 'Paste URL of a GIF': 'Paste URL of a GIF', + 'Paste URL of a meme image': 'Paste URL of a meme image', 'Paste the entire original passage that contains your highlight': 'Paste the entire original passage that contains your highlight', Photo: 'Photo', @@ -1197,6 +1494,8 @@ export default { 'Prompt Citation Settings': 'Prompt Citation Settings', 'Prompt Conversation Script': 'Prompt Conversation Script', 'Proof of Work': 'Proof of Work', + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post': + 'Publish kind 1063 (NIP-94) for this GIF and insert the URL into your post', 'Publish to Relays': 'Publish to Relays', 'Published By': 'Published By', 'Published In': 'Published In', @@ -1206,7 +1505,61 @@ export default { 'Publisher name (optional)': 'Publisher name (optional)', 'Quiet Tags': 'Quiet Tags', 'RSS Feed': 'RSS Feed', + 'RSS + Web': 'RSS + Web', + 'RSS feed source': 'RSS feed source', + 'All feed sources': 'All feed sources', + 'RSS feed view mode': 'RSS feed view mode', + 'Article URLs': 'Article URLs', + 'Article URLs subtitle': + 'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.', + 'RSS timeline': 'RSS timeline', + 'RSS timeline subtitle': + 'Every item from your subscribed feeds, newest first — classic RSS reader.', + URLs: 'URLs', + RSS: 'RSS', + Both: 'Both', + 'RSS feed item label': 'RSS', + 'Web URL item label': 'Web URL', + 'URL thread activity': 'URL thread activity', + 'Suppress Clawstr links in RSS previews': 'Hide clawstr.com in RSS and URL feed', + 'Hide local, media & feed URLs from URL cards': + 'Hide local, media, feed, document & XML links from the feed', + 'RSS articles': 'RSS articles', + 'Web comments': 'Web comments', + 'Web highlights': 'Web highlights', + 'In your bookmarks': 'In your bookmarks', + '{{count}} RSS entries for this URL': '{{count}} RSS entries for this URL', + 'No comments yet': 'No comments yet', + 'No highlights yet': 'No highlights yet', + 'Showing {{filtered}} of {{total}} entries': 'Showing {{filtered}} of {{total}} entries', + standardRssFeed_spotifeed: 'Spotify playlist (Spotifeed)', + standardRssFeed_youtube: 'YouTube feed', + standardRssFeed_youtubeChannel: 'YouTube channel feed', + standardRssFeed_youtubePlaylist: 'YouTube playlist feed', + standardRssFeed_feedburner: 'FeedBurner', + standardRssFeed_reddit: 'Reddit RSS', + standardRssFeed_substack: 'Substack', + standardRssFeed_medium: 'Medium', 'RSS Feed Settings': 'RSS Feed Settings', + 'Follow sets': 'Follow sets', + 'Follow sets settings intro': + 'NIP-51 follow sets (kind 30000) group people for custom feeds (for example in Spells). Lists are published to your NIP-65 outboxes and profile discovery relays.', + 'New follow set': 'New follow set', + 'Edit follow set': 'Edit follow set', + 'No follow sets yet': 'You have not created any follow sets yet.', + 'Follow set saved': 'Follow set saved', + 'Follow set deleted': 'Follow set deleted', + 'Failed to load follow sets': 'Failed to load follow sets', + members: 'members', + 'Optional display title': 'Optional display title', + 'List id (d tag)': 'List id (d tag)', + 'Follow set d tag hint': + 'Stable identifier for this list. It cannot be changed after the first publish.', + 'People in this list': 'People in this list', + 'Delete follow set?': 'Delete this follow set?', + 'Delete follow set confirm': + 'This sends a deletion request (kind 5) for the list. Relays that accept it will drop the list; other clients may still show a cached copy until they refresh.', + 'Remove feed': 'Remove feed', 'RSS Feeds': 'RSS Feeds', 'RSS feeds exported to OPML file': 'RSS feeds exported to OPML file', 'RSS feeds saved': 'RSS feeds saved', @@ -1259,6 +1612,7 @@ export default { 'Search logs...': 'Search logs...', 'Search notes, threads, long-form…': 'Search notes, threads, long-form…', 'Search on GifBuddy': 'Search on GifBuddy', + 'Search on Meme Amigo': 'Search on Meme Amigo', 'Search posts...': 'Search posts...', 'Search threads by title, content, tags, npub, author...': 'Search threads by title, content, tags, npub, author...', @@ -1269,6 +1623,10 @@ export default { 'Select Media Type': 'Select Media Type', 'Select group...': 'Select group...', 'Select relays': 'Select relays', + 'Publish relay cap hint': + 'At most {{max}} relays are contacted per publish. Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted; lower-priority checks are skipped first if you exceed the cap. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', + 'Publish relay cap hint with outbox first': + 'At most {{max}} relays per publish. Your NIP-65 write relay(s) use {{reservedSlots}} of those slots first (merged ahead of this picker; they may also appear checked below). Of the {{selected}} relay(s) you checked here, {{selectedContacted}} will be contacted. Session-blocked relays are skipped. See console [PublishEvent] for the exact list.', 'Select the group where you want to create this discussion.': 'Select the group where you want to create this discussion.', 'Select topic...': 'Select topic...', @@ -1313,6 +1671,14 @@ export default { 'The main editor above should contain only the text you want to highlight. This field should contain the full quote or paragraph for context.', 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.': 'These relays were found from your NIP-05 identifier and signer. You can add them to your relay list.', + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.': + 'This GIF comes from kind 1063 (NIP-94 file metadata). Choosing it still publishes your own kind 1063 to your write relays (and fast write relays as fallback) so your relays index the URL.', + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1 note. Notes are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.': + 'This GIF was found in a kind 1111 comment. Comments are not NIP-94 GIF index entries; publish kind 1063 yourself if you want it discoverable as file metadata.', + 'This GIF was found in a Nostr event of kind {{kind}}.': + 'This GIF was found in a Nostr event of kind {{kind}}.', 'This file could be either audio or video. Please select the correct type:': 'This file could be either audio or video. Please select the correct type:', 'This store does not contain replaceable events': @@ -1422,6 +1788,26 @@ export default { threads: 'threads', 'topic1, topic2, topic3': 'topic1, topic2, topic3', '{{count}} relay(s) selected': '{{count}} relay(s) selected', - '🔞 NSFW 🔞': '🔞 NSFW 🔞' + '🔞 NSFW 🔞': '🔞 NSFW 🔞', + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).': + 'Choose a suggested topic or type your own. It becomes a normalized tag (e.g. my-topic).', + 'Failed to refresh': 'Failed to refresh', + 'Invalid article link.': 'Invalid article link.', + Likes: 'Likes', + 'Loading…': 'Loading…', + 'Missing pubkey': 'Missing pubkey', + 'No RSS feed list found on relays': 'No RSS feed list found on relays', + 'Pinned posts': 'Pinned posts', + 'Publishing...': 'Publishing...', + 'RSS article': 'RSS article', + 'RSS feed list refreshed': 'RSS feed list refreshed', + 'Save or discard your changes before refreshing from relays': + 'Save or discard your changes before refreshing from relays', + 'Suggested topics': 'Suggested topics', + 'Synthetic event (no author)': 'Synthetic event (no author)', + 'Topic is required': 'Topic is required', + 'Type a topic or pick from the list': 'Type a topic or pick from the list', + profileEditorRefreshCacheHint: 'profileEditorRefreshCacheHint', + startupSessionHydrating: 'startupSessionHydrating' } } diff --git a/src/providers/FavoriteRelaysActivityProvider.tsx b/src/providers/FavoriteRelaysActivityProvider.tsx index 38d99089..810fab43 100644 --- a/src/providers/FavoriteRelaysActivityProvider.tsx +++ b/src/providers/FavoriteRelaysActivityProvider.tsx @@ -10,6 +10,7 @@ import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useNostr } from '@/providers/NostrProvider' import { queryService, replaceableEventService } from '@/services/client.service' import indexedDb from '@/services/indexed-db.service' +import storage from '@/services/local-storage.service' import type { Event } from 'nostr-tools' import { kinds } from 'nostr-tools' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -82,6 +83,12 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R const [activeNpubsDrawerOpen, setActiveNpubsDrawerOpen] = useState(false) const [fallbackFollowings, setFallbackFollowings] = useState([]) const lastCompletedFetchAtRef = useRef(Date.now()) + /** Nostr pubkey hydrates async after reload; storage already has current account (init before React mount). */ + const viewerForPulseCache = viewerPubkey ?? storage.getCurrentAccount()?.pubkey ?? null + const orderedPubkeysRef = useRef([]) + orderedPubkeysRef.current = orderedPubkeys + /** After restoring from disk, ignore the first empty network result (timeouts / slow relays), then behave normally. */ + const skipFirstEmptyNetworkOverwriteRef = useRef(false) const relayKey = useMemo( () => getFavoritesFeedRelayUrls(favoriteRelays, blockedRelays).join('\n'), [favoriteRelays, blockedRelays] @@ -89,6 +96,7 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R const fetchActive = useCallback( async (useDefaultRelays = false) => { + const cacheViewer = viewerPubkey ?? storage.getCurrentAccount()?.pubkey ?? null const urls = useDefaultRelays ? getFavoritesFeedRelayUrls([], blockedRelays) : getFavoritesFeedRelayUrls(favoriteRelays, blockedRelays) @@ -101,7 +109,7 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R setLastFetchedAtMs(now) writeRelayPulseActiveNpubsCache({ relayKey, - viewerPubkey: viewerPubkey ?? null, + viewerPubkey: cacheViewer, orderedPubkeys: [], lastFetchedAtMs: now }) @@ -121,15 +129,26 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R ) const now = Date.now() const nextPubkeys = aggregatePubkeysByRecency(events) - setOrderedPubkeys(nextPubkeys) - lastCompletedFetchAtRef.current = now - setLastFetchedAtMs(now) - writeRelayPulseActiveNpubsCache({ - relayKey, - viewerPubkey: viewerPubkey ?? null, - orderedPubkeys: nextPubkeys, - lastFetchedAtMs: now - }) + const prev = orderedPubkeysRef.current + if ( + skipFirstEmptyNetworkOverwriteRef.current && + nextPubkeys.length === 0 && + prev.length > 0 + ) { + skipFirstEmptyNetworkOverwriteRef.current = false + logger.debug('[FavoriteRelaysActivity] kept relay pulse from cache; first fetch returned empty') + } else { + skipFirstEmptyNetworkOverwriteRef.current = false + setOrderedPubkeys(nextPubkeys) + lastCompletedFetchAtRef.current = now + setLastFetchedAtMs(now) + writeRelayPulseActiveNpubsCache({ + relayKey, + viewerPubkey: cacheViewer, + orderedPubkeys: nextPubkeys, + lastFetchedAtMs: now + }) + } } catch (error) { logger.debug('[FavoriteRelaysActivity] fetch failed', { error, useDefaultRelays }) if (!useDefaultRelays && favoriteRelays.length > 0) { @@ -148,6 +167,7 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R /** Reset pulse state when account or relay set changes so we show loading until fresh data. */ const resetForRefetch = useCallback(() => { + skipFirstEmptyNetworkOverwriteRef.current = false setRelayActivityReady(false) setOrderedPubkeys([]) setProfileKind0ByPubkey({}) @@ -180,13 +200,14 @@ export function FavoriteRelaysActivityProvider({ children }: { children: React.R /** Restore last successful relay-pulse author list from localStorage (same relay set + viewer). */ useEffect(() => { - const row = readRelayPulseActiveNpubsCache(relayKey, viewerPubkey ?? null) + const row = readRelayPulseActiveNpubsCache(relayKey, viewerForPulseCache) if (!row) return setOrderedPubkeys(row.orderedPubkeys) setLastFetchedAtMs(row.lastFetchedAtMs) setRelayActivityReady(true) lastCompletedFetchAtRef.current = row.lastFetchedAtMs - }, [relayKey, viewerPubkey]) + skipFirstEmptyNetworkOverwriteRef.current = row.orderedPubkeys.length > 0 + }, [relayKey, viewerForPulseCache]) /** When follow list from context is empty but we have a logged-in viewer, try IndexedDB cache. * Fixes race where pulse data arrives before NostrProvider has hydrated follow list from cache. */ diff --git a/src/providers/LiveActivitiesProvider.tsx b/src/providers/LiveActivitiesProvider.tsx index 8777b978..d8d02cd7 100644 --- a/src/providers/LiveActivitiesProvider.tsx +++ b/src/providers/LiveActivitiesProvider.tsx @@ -11,7 +11,7 @@ import client from '@/services/client.service' import { registerLiveActivitiesPrewarmCallback } from '@/services/live-activities-prewarm-bridge' import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react' import { useFavoriteRelays } from './FavoriteRelaysProvider' -import { useFollowList } from './FollowListProvider' +import { useFollowListOptional } from './FollowListProvider' import { useNostr } from './NostrProvider' import { useUserPreferences } from './UserPreferencesProvider' @@ -37,7 +37,8 @@ export function useLiveActivitiesOptional(): TLiveActivitiesContext | undefined export function LiveActivitiesProvider({ children }: { children: React.ReactNode }) { const { pubkey, relayList, isInitialized, isAccountSessionHydrating } = useNostr() const { favoriteRelays, blockedRelays } = useFavoriteRelays() - const { followings } = useFollowList() + const followListCtx = useFollowListOptional() + const followings = followListCtx?.followings ?? [] const { showLiveActivitiesBanner } = useUserPreferences() const [items, setItems] = useState([])