From f964e61a1c5a3c851d62030c78215178ae6717c9 Mon Sep 17 00:00:00 2001 From: SITO Date: Tue, 18 Aug 2026 21:42:59 +0200 Subject: [PATCH] upstream: integrar 0.9.5 en lo que no diverge (57 ficheros) + dependencias nuevas Primera tanda de la integracion 0.9.1 -> 0.9.5. Se actualizan los 57 ficheros que upstream cambio y la rama no tocaba, entre ellos los 11 de traduccion: eso ya solo es posible gracias al overlay de i18n, antes eran 11 conflictos garantizados. Se portan ademas las dependencias que 0.9.5 introduce y de las que dependen los ficheros actualizados: pdfDocument, content_favorites, recurrence, media_gallery, comments_view, gallery_view y polls (modelo, limites y vista). Quedan 48 ficheros con divergencia real por resolver a mano (backend.js, main_views.js, OasisMobile.css y 45 vistas y modelos). Verificado: 0 errores de sintaxis en src/, 0 requires relativos rotos, la app arranca declarando 0.9.5 y las 47 rutas principales responden 200/302. --- src/backend/content_favorites.js | 153 +++ src/backend/logsPdf.js | 8 +- src/backend/pdfDocument.js | 199 ++++ src/backend/pm_policy.js | 43 +- src/backend/smartContractPdf.js | 8 +- src/client/assets/translations/oasis_ar.js | 1181 +++++-------------- src/client/assets/translations/oasis_de.js | 1183 +++++-------------- src/client/assets/translations/oasis_en.js | 1185 +++++-------------- src/client/assets/translations/oasis_es.js | 1187 +++++--------------- src/client/assets/translations/oasis_eu.js | 1187 +++++--------------- src/client/assets/translations/oasis_fr.js | 1185 +++++-------------- src/client/assets/translations/oasis_hi.js | 1183 +++++-------------- src/client/assets/translations/oasis_it.js | 1183 +++++-------------- src/client/assets/translations/oasis_pt.js | 1183 +++++-------------- src/client/assets/translations/oasis_ru.js | 1183 +++++-------------- src/client/assets/translations/oasis_zh.js | 1183 +++++-------------- src/configs/agenda-config.json | 2 +- src/configs/content_favorites.json | 27 + src/configs/shared-state.js | 11 +- src/maps/map_renderer.js | 41 +- src/models/bookmarking_model.js | 8 +- src/models/calendars_model.js | 91 +- src/models/crypto.js | 28 +- src/models/cv_model.js | 10 +- src/models/dev_model.js | 9 +- src/models/documents_model.js | 4 +- src/models/events_model.js | 49 +- src/models/favorites_model.js | 79 +- src/models/images_model.js | 8 +- src/models/logs_model.js | 19 +- src/models/main_models.js | 25 + src/models/maps_model.js | 2 +- src/models/media_gallery.js | 42 + src/models/onboarding_model.js | 5 +- src/models/parliament_model.js | 151 ++- src/models/polls_model.js | 443 ++++++++ src/models/polls_model_limits.js | 5 + src/models/recurrence.js | 40 + src/models/reports_model.js | 31 +- src/models/tasks_model.js | 9 +- src/models/tribes_model.js | 2 +- src/server/package.json | 2 +- src/server/ssb_config.js | 5 + src/views/AI_view.js | 88 +- src/views/banking_views.js | 11 +- src/views/clearnet_view.js | 2 +- src/views/comments_view.js | 77 ++ src/views/dev_view.js | 4 +- src/views/favorites_view.js | 133 ++- src/views/fediverse_view.js | 4 +- src/views/feed_view.js | 124 +- src/views/gallery_view.js | 118 ++ src/views/games_view.js | 4 +- src/views/graphos_view.js | 24 +- src/views/inhabitants_view.js | 198 ++-- src/views/invites_view.js | 12 + src/views/larp_view.js | 228 ++-- src/views/logs_view.js | 97 +- src/views/melody_view.js | 2 +- src/views/pads_view.js | 153 ++- src/views/pixelia_view.js | 32 +- src/views/pm_view.js | 8 +- src/views/polls_view.js | 323 ++++++ src/views/stats_view.js | 119 +- src/views/transfer_view.js | 152 ++- src/views/tribes_view.js | 126 ++- src/views/welcome_view.js | 26 + 67 files changed, 5740 insertions(+), 10907 deletions(-) create mode 100644 src/backend/content_favorites.js create mode 100644 src/backend/pdfDocument.js create mode 100644 src/configs/content_favorites.json create mode 100644 src/models/media_gallery.js create mode 100644 src/models/polls_model.js create mode 100644 src/models/polls_model_limits.js create mode 100644 src/models/recurrence.js create mode 100644 src/views/comments_view.js create mode 100644 src/views/gallery_view.js create mode 100644 src/views/polls_view.js diff --git a/src/backend/content_favorites.js b/src/backend/content_favorites.js new file mode 100644 index 0000000..a3d86b8 --- /dev/null +++ b/src/backend/content_favorites.js @@ -0,0 +1,153 @@ +const fs = require("fs"); +const path = require("path"); + +const TEMPLATE = path.join(__dirname, "../configs/content_favorites.json"); + +const storePath = () => { + try { + return require("../server/ssb_config").statePath("content_favorites.json") || TEMPLATE; + } catch (_) { return TEMPLATE; } +}; + +const DEFAULT = { + audios: [], + blogs: [], + bookmarks: [], + calendars: [], + chats: [], + documents: [], + events: [], + forum: [], + housing: [], + images: [], + jobs: [], + logs: [], + maps: [], + pads: [], + polls: [], + projects: [], + reports: [], + shops: [], + market: [], + shopProducts: [], + tasks: [], + torrents: [], + transfers: [], + videos: [], + votes: [] +}; + +const safeArr = (v) => (Array.isArray(v) ? v : []); + +let queue = Promise.resolve(); + +const withLock = (fn) => { + queue = queue.then(fn, fn); + return queue; +}; + +const normalize = (raw) => { + const out = {}; + for (const k of Object.keys(DEFAULT)) { + const list = safeArr(raw?.[k]).map((x) => String(x || "").trim()).filter(Boolean); + out[k] = Array.from(new Set(list)); + } + return out; +}; + +const ensureFile = async () => { + try { + await fs.promises.access(storePath()); + } catch (e) { + const dir = path.dirname(storePath()); + await fs.promises.mkdir(dir, { recursive: true }); + await fs.promises.writeFile(storePath(), JSON.stringify(DEFAULT, null, 2), "utf8"); + } +}; + +const readAll = async () => { + await ensureFile(); + try { + const txt = await fs.promises.readFile(storePath(), "utf8"); + return normalize(JSON.parse(txt || "{}")); + } catch (e) { + const fixed = normalize(DEFAULT); + await fs.promises.writeFile(storePath(), JSON.stringify(fixed, null, 2), "utf8"); + return fixed; + } +}; + +const writeAll = async (data) => { + const dir = path.dirname(storePath()); + const tmp = path.join(dir, `.content_favorites.${process.pid}.${Date.now()}.tmp`); + const txt = JSON.stringify(normalize(data), null, 2); + await fs.promises.writeFile(tmp, txt, "utf8"); + await fs.promises.rename(tmp, storePath()); +}; + +const assertKind = (kind) => { + const k = String(kind || "").trim(); + if (!Object.prototype.hasOwnProperty.call(DEFAULT, k)) throw new Error("Invalid favorites kind"); + return k; +}; + +const lastArg = (args, n) => args[args.length - n]; + +const kindFromArgs = (args) => { + const k = String(lastArg(args, 1) || "").trim(); + return assertKind(k); +}; + +const idFromArgs = (args) => String(lastArg(args, 1) || "").trim(); + +exports.getFavoriteSet = async (kind) => { + const k = assertKind(kind); + const data = await readAll(); + return new Set(safeArr(data[k]).map(String)); +}; + +exports.getFavoriteIndex = async () => { + const data = await readAll(); + const index = new Map(); + for (const kind of Object.keys(DEFAULT)) { + for (const id of safeArr(data[kind])) index.set(String(id), kind); + } + return index; +}; + +exports.addFavorite = async (kind, id) => + withLock(async () => { + const k = assertKind(kind); + const favId = String(id || "").trim(); + if (!favId) return; + const data = await readAll(); + const set = new Set(safeArr(data[k]).map(String)); + set.add(favId); + data[k] = Array.from(set); + await writeAll(data); + }); + +exports.removeFavorite = async (kind, id) => + withLock(async () => { + const k = assertKind(kind); + const favId = String(id || "").trim(); + if (!favId) return; + const data = await readAll(); + const set = new Set(safeArr(data[k]).map(String)); + set.delete(favId); + data[k] = Array.from(set); + await writeAll(data); + }); + +exports.getFavoritesSet = async (...args) => exports.getFavoriteSet(kindFromArgs(args)); +exports.addToFavorites = async (...args) => { + const kind = kindFromArgs(args.slice(0, -1)); + const id = idFromArgs(args); + return exports.addFavorite(kind, id); +}; +exports.removeFromFavorites = async (...args) => { + const kind = kindFromArgs(args.slice(0, -1)); + const id = idFromArgs(args); + return exports.removeFavorite(kind, id); +}; +exports.storePath = storePath; diff --git a/src/backend/logsPdf.js b/src/backend/logsPdf.js index ca25ec3..676ac90 100644 --- a/src/backend/logsPdf.js +++ b/src/backend/logsPdf.js @@ -3,7 +3,7 @@ const path = require('path'); const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg'); -const escapePdf = s => String(s || '').replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)'); +const { escapePdf } = require('./pdfDocument'); const linkPattern = /(?:https?:\/\/[^\s]+|www\.[^\s]+|@[A-Za-z0-9+/=.\-]+\.ed25519|[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/g; @@ -94,8 +94,8 @@ function buildLogsPdf(entries, oasisId, opts = {}) { const catalogId = addObj(null); const pagesId = addObj(null); - const fontId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier >>'); - const fontBoldId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold >>'); + const fontId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >>'); + const fontBoldId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >>'); let logoXObjId = null; if (logoBuf && logoDims) { @@ -156,7 +156,7 @@ function buildLogsPdf(entries, oasisId, opts = {}) { parts.push(`BT\n/F1 8 Tf\n${pageW - marginX - pageLabelW} ${footerH - 10} Td\n(${escapePdf(pageLabel)}) Tj\nET`); const content = parts.join('\n'); - const stream = `<< /Length ${Buffer.byteLength(content)} >>\nstream\n${content}\nendstream`; + const stream = `<< /Length ${Buffer.byteLength(content, 'latin1')} >>\nstream\n${content}\nendstream`; const cid = addObj(stream); contentIds.push(cid); const pid = addObj(null); diff --git a/src/backend/pdfDocument.js b/src/backend/pdfDocument.js new file mode 100644 index 0000000..4e3dc3e --- /dev/null +++ b/src/backend/pdfDocument.js @@ -0,0 +1,199 @@ +const fs = require('fs'); +const path = require('path'); + +const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg'); + +const WIN_ANSI_HIGH = { + '\u20AC': '\x80', '\u201A': '\x82', '\u0192': '\x83', '\u201E': '\x84', + '\u2026': '\x85', '\u2020': '\x86', '\u2021': '\x87', '\u02C6': '\x88', + '\u2030': '\x89', '\u0160': '\x8A', '\u2039': '\x8B', '\u0152': '\x8C', + '\u017D': '\x8E', '\u2018': '\x91', '\u2019': '\x92', '\u201C': '\x93', + '\u201D': '\x94', '\u2022': '\x95', '\u2013': '\x96', '\u2014': '\x97', + '\u02DC': '\x98', '\u2122': '\x99', '\u0161': '\x9A', '\u203A': '\x9B', + '\u0153': '\x9C', '\u017E': '\x9E', '\u0178': '\x9F' +}; + +const escapePdf = s => String(s == null ? '' : s) + .replace(/[\r\n\t]+/g, ' ') + .replace(/[\u0152\u0153\u0160\u0161\u0178\u017D\u017E\u0192\u02C6\u02DC\u2013\u2014\u2018\u2019\u201A\u201C\u201D\u201E\u2020\u2021\u2022\u2026\u2030\u2039\u203A\u20AC\u2122]/g, + (c) => WIN_ANSI_HIGH[c] || '?') + .replace(/[^\x20-\xFF\x80-\x9F]/g, '?') + .replace(/\\/g, '\\\\') + .replace(/\(/g, '\\(') + .replace(/\)/g, '\\)'); + +const wrap = (txt, max = 82) => { + const out = []; + for (const raw of String(txt == null ? '' : txt).split('\n')) { + let line = raw; + while (line.length > max) { + let cut = line.lastIndexOf(' ', max); + if (cut <= 0) cut = max; + out.push(line.slice(0, cut)); + line = line.slice(cut).replace(/^\s+/, ''); + } + out.push(line); + } + return out; +}; + +const readJpegDims = (buf) => { + let i = 2; + while (i < buf.length) { + if (buf[i] !== 0xFF) return null; + const marker = buf[i + 1]; + if (marker === 0xD8 || marker === 0xD9) { i += 2; continue; } + const len = buf.readUInt16BE(i + 2); + if (marker >= 0xC0 && marker <= 0xCF && marker !== 0xC4 && marker !== 0xC8 && marker !== 0xCC) { + const h = buf.readUInt16BE(i + 5); + const w = buf.readUInt16BE(i + 7); + const c = buf[i + 9]; + return { w, h, c }; + } + i += 2 + len; + } + return null; +}; + +const flattenSections = (sections) => { + const lines = []; + for (const s of Array.isArray(sections) ? sections : []) { + if (!s) continue; + if (s.kind === 'kv') { + const txt = `${s.label}: ${s.value == null ? '' : s.value}`; + for (const w of wrap(txt, 82)) lines.push({ kind: 'kv', text: w }); + } else if (s.kind === 'text') { + for (const w of wrap(s.text, 82)) lines.push({ kind: 'kv', text: w }); + } else { + lines.push({ kind: s.kind, text: s.text }); + } + } + return lines; +}; + +function buildDocumentPdf({ title, issuedToLabel, issuedTo, sections } = {}) { + const pageW = 612; + const pageH = 792; + const marginX = 50; + const headerH = 90; + const footerH = 40; + const bodyTop = pageH - headerH - 24; + const bodyBottom = footerH + 10; + const lineH = 14; + + let logoBuf = null; + let logoDims = null; + try { + logoBuf = fs.readFileSync(LOGO_PATH); + logoDims = readJpegDims(logoBuf); + } catch (_) {} + + const lines = flattenSections(sections); + + const maxBodyLines = Math.floor((bodyTop - bodyBottom) / lineH); + const pages = []; + for (let i = 0; i < lines.length; i += maxBodyLines) pages.push(lines.slice(i, i + maxBodyLines)); + if (!pages.length) pages.push([]); + + const objects = []; + const addObj = body => { objects.push(body); return objects.length; }; + + const catalogId = addObj(null); + const pagesId = addObj(null); + const fontId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >>'); + const fontBoldId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >>'); + let logoXObjId = null; + if (logoBuf && logoDims) { + const cs = logoDims.c === 1 ? '/DeviceGray' : '/DeviceRGB'; + const dict = `<< /Type /XObject /Subtype /Image /Width ${logoDims.w} /Height ${logoDims.h} /ColorSpace ${cs} /BitsPerComponent 8 /Filter /DCTDecode /Length ${logoBuf.length} >>`; + logoXObjId = addObj({ dict, stream: logoBuf }); + } + + const exportDate = new Date().toISOString().replace('T', ' ').slice(0, 19) + ' UTC'; + const footerLeft = `Generated: ${exportDate}`; + + const pageIds = []; + const contentIds = []; + + pages.forEach((pg, pgIdx) => { + const parts = []; + if (logoXObjId) { + const logoH = 60; + const logoW = Math.round((logoDims.w / logoDims.h) * logoH); + parts.push(`q\n${logoW} 0 0 ${logoH} ${marginX} ${pageH - headerH + 15} cm\n/Logo Do\nQ`); + } + const titleX = (logoXObjId ? marginX + 80 : marginX); + const titleY = pageH - 45; + parts.push(`BT\n/F2 16 Tf\n${titleX} ${titleY} Td\n(${escapePdf(title || 'OASIS')}) Tj\nET`); + if (issuedTo) { + const prefix = `${issuedToLabel || 'Issued to'}: `; + const prefixW = prefix.length * 5.4; + parts.push(`BT\n/F1 9 Tf\n${titleX} ${titleY - 16} Td\n(${escapePdf(prefix)}) Tj\nET`); + parts.push(`BT\n/F2 9 Tf\n${titleX + prefixW} ${titleY - 16} Td\n(${escapePdf(String(issuedTo))}) Tj\nET`); + } + + parts.push(`q\n0.6 0.6 0.6 RG\n0.5 w\n${marginX} ${pageH - headerH} m\n${pageW - marginX} ${pageH - headerH} l\nS\nQ`); + + let y = bodyTop; + for (const ln of pg) { + if (ln.kind === 'title') { + parts.push(`BT\n/F2 14 Tf\n0 0 0 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`); + } else if (ln.kind === 'subtitle') { + parts.push(`BT\n/F1 11 Tf\n0.2 0.2 0.2 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`); + } else if (ln.kind === 'section') { + parts.push(`BT\n/F2 11 Tf\n0 0 0 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`); + parts.push(`q\n0 0 0 RG\n0.5 w\n${marginX} ${y - 3} m\n${pageW - marginX} ${y - 3} l\nS\nQ`); + } else if (ln.kind === 'kv') { + parts.push(`BT\n/F1 10 Tf\n0 0 0 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`); + } + y -= lineH; + } + + parts.push(`q\n0.6 0.6 0.6 RG\n0.5 w\n${marginX} ${footerH + 5} m\n${pageW - marginX} ${footerH + 5} l\nS\nQ`); + parts.push(`BT\n/F1 8 Tf\n${marginX} ${footerH - 10} Td\n(${escapePdf(footerLeft)}) Tj\nET`); + const pageLabel = `Page ${pgIdx + 1} of ${pages.length}`; + const pageLabelW = pageLabel.length * 4.8; + parts.push(`BT\n/F1 8 Tf\n${pageW - marginX - pageLabelW} ${footerH - 10} Td\n(${escapePdf(pageLabel)}) Tj\nET`); + + const content = parts.join('\n'); + const stream = `<< /Length ${Buffer.byteLength(content, 'latin1')} >>\nstream\n${content}\nendstream`; + const cid = addObj(stream); + contentIds.push(cid); + const pid = addObj(null); + pageIds.push(pid); + }); + + for (let i = 0; i < pageIds.length; i++) { + const resources = logoXObjId + ? `<< /Font << /F1 ${fontId} 0 R /F2 ${fontBoldId} 0 R >> /XObject << /Logo ${logoXObjId} 0 R >> >>` + : `<< /Font << /F1 ${fontId} 0 R /F2 ${fontBoldId} 0 R >> >>`; + objects[pageIds[i] - 1] = `<< /Type /Page /Parent ${pagesId} 0 R /MediaBox [0 0 ${pageW} ${pageH}] /Contents ${contentIds[i]} 0 R /Resources ${resources} >>`; + } + objects[catalogId - 1] = `<< /Type /Catalog /Pages ${pagesId} 0 R >>`; + objects[pagesId - 1] = `<< /Type /Pages /Kids [${pageIds.map(id => `${id} 0 R`).join(' ')}] /Count ${pageIds.length} >>`; + + const chunks = []; + const offsets = [0]; + let byteLen = 0; + const push = (buf) => { chunks.push(buf); byteLen += buf.length; }; + push(Buffer.from('%PDF-1.4\n%\xE2\xE3\xCF\xD3\n', 'binary')); + for (let i = 0; i < objects.length; i++) { + offsets.push(byteLen); + const obj = objects[i]; + if (obj && typeof obj === 'object' && obj.dict && obj.stream) { + push(Buffer.from(`${i + 1} 0 obj\n${obj.dict}\nstream\n`, 'binary')); + push(obj.stream); + push(Buffer.from('\nendstream\nendobj\n', 'binary')); + } else { + push(Buffer.from(`${i + 1} 0 obj\n${obj}\nendobj\n`, 'binary')); + } + } + const xrefStart = byteLen; + let xref = `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`; + for (let i = 1; i <= objects.length; i++) xref += `${String(offsets[i]).padStart(10, '0')} 00000 n \n`; + xref += `trailer\n<< /Size ${objects.length + 1} /Root ${catalogId} 0 R >>\nstartxref\n${xrefStart}\n%%EOF`; + push(Buffer.from(xref, 'binary')); + return Buffer.concat(chunks); +} + +module.exports = { buildDocumentPdf, escapePdf, wrap }; diff --git a/src/backend/pm_policy.js b/src/backend/pm_policy.js index bfb511e..6b69b8a 100644 --- a/src/backend/pm_policy.js +++ b/src/backend/pm_policy.js @@ -1,3 +1,7 @@ +const fs = require('fs'); + +const ANNOUNCE_SEEN_FILE = 'oasis-political-seen'; + const isMutual = (relationship) => !!(relationship && relationship.following && relationship.followsMe); const isRecipientAllowed = ({ pmVisibility, viewerId, recipientId, relationship } = {}) => { @@ -6,4 +10,41 @@ const isRecipientAllowed = ({ pmVisibility, viewerId, recipientId, relationship return isMutual(relationship); }; -module.exports = { isRecipientAllowed, isMutual }; +const announceSeenPath = () => { + try { return require('../server/ssb_config').statePath(ANNOUNCE_SEEN_FILE); } catch (_) { return null; } +}; + +const readAnnounceSeen = () => { + const file = announceSeenPath(); + if (!file) return {}; + try { + const parsed = JSON.parse(fs.readFileSync(file, 'utf8')); + return parsed && typeof parsed === 'object' ? parsed : {}; + } catch (_) { return {}; } +}; + +const writeAnnounceSeen = (state) => { + const file = announceSeenPath(); + if (!file) return false; + try { fs.writeFileSync(file, JSON.stringify(state || {})); return true; } catch (_) { return false; } +}; + +const everAnnounced = (announced, subject) => { + for (const entry of (announced || [])) { + if (String(entry).startsWith(`${subject}|`)) return true; + } + return false; +}; + +const decideAnnouncement = ({ subject, ref, announced = new Set(), seen = {} } = {}) => { + if (!subject || !ref) return { send: false, remember: false }; + const key = String(ref); + if (announced.has(`${subject}|${key}`)) return { send: false, remember: false }; + if (seen[subject] === key) return { send: false, remember: false }; + if (!everAnnounced(announced, subject) && seen[subject] === undefined) { + return { send: false, remember: true }; + } + return { send: true, remember: true }; +}; + +module.exports = { isRecipientAllowed, isMutual, announceSeenPath, readAnnounceSeen, writeAnnounceSeen, decideAnnouncement }; diff --git a/src/backend/smartContractPdf.js b/src/backend/smartContractPdf.js index 66b8baf..e396747 100644 --- a/src/backend/smartContractPdf.js +++ b/src/backend/smartContractPdf.js @@ -3,7 +3,7 @@ const path = require('path'); const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg'); -const escapePdf = s => String(s || '').replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)'); +const { escapePdf } = require('./pdfDocument'); const wrap = (txt, max = 82) => { const out = []; @@ -131,8 +131,8 @@ function buildSmartContractPdf({ transfer, block, viewerId }) { const catalogId = addObj(null); const pagesId = addObj(null); - const fontId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier >>'); - const fontBoldId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold >>'); + const fontId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >>'); + const fontBoldId = addObj('<< /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >>'); let logoXObjId = null; if (logoBuf && logoDims) { const cs = logoDims.c === 1 ? '/DeviceGray' : '/DeviceRGB'; @@ -185,7 +185,7 @@ function buildSmartContractPdf({ transfer, block, viewerId }) { parts.push(`BT\n/F1 8 Tf\n${pageW - marginX - pageLabelW} ${footerH - 10} Td\n(${escapePdf(pageLabel)}) Tj\nET`); const content = parts.join('\n'); - const stream = `<< /Length ${Buffer.byteLength(content)} >>\nstream\n${content}\nendstream`; + const stream = `<< /Length ${Buffer.byteLength(content, 'latin1')} >>\nstream\n${content}\nendstream`; const cid = addObj(stream); contentIds.push(cid); const pid = addObj(null); diff --git a/src/client/assets/translations/oasis_ar.js b/src/client/assets/translations/oasis_ar.js index bf888b1..6cb95c1 100644 --- a/src/client/assets/translations/oasis_ar.js +++ b/src/client/assets/translations/oasis_ar.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { ar: { - languageName: "العربية", shopOrderStatusPaid: "تم استلام الدفع", shopOrderStatusReceived: "تم الاستلام", shopOrderMarkPaid: "تأكيد استلام الدفع", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "ليس لديك مشتريات بعد.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "البائع", - shopOrderPaymentConcept: "دفعة", shopOrderInvoice: "فاتورة", shopOrderInvoiceConcept: "فاتورة", shopOrderStatusPending: "قيد الانتظار", shopOrderStatusAccepted: "مقبول", shopOrderStatusRejected: "مرفوض", shopOrderStatusShipped: "تم الشحن", - shopOrderStatusDelivered: "تم التسليم", shopOrderAccept: "قبول", shopOrderReject: "رفض", shopOrderMarkShipped: "وضع علامة شُحن", - shopOrderMarkDelivered: "وضع علامة سُلّم", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "عقد ذكي", shopOrderContractConcept: "طلب متجر", shopOrdersPending: "طلبات معلّقة", all: "الكل", @@ -55,14 +50,13 @@ module.exports = { viewJson: "عرض JSON", matchScore: "درجة التطابق", preferencesLabel: "التفضيلات", - inhabitantProfileTitle: "ملف الساكن", + inhabitantProfileTitle: "الساكن", contentWarningLabel: "تحذير المحتوى", invalidPost: "محتوى غير صالح", invalidPostHint: "هذه الرسالة تحتوي على نص فارغ/غير صالح.", spreadBy: "بواسطة", spreadChron: "نشر", spreaded: "تم النشر", - spreadMore: "المزيد", spreadContentUnavailable: "المحتوى غير متاح بعد (في انتظار النسخ)", filteredByTag: "مُصفّى حسب الوسم", filteredByTagTitle: "مُصفّى حسب الوسم", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "بدون خطورة", calendarDeleteDate: "حذف التاريخ", calendarIntervalUntil: "حتى", - bookmarkCategory: "الفئة", bookmarkLastVisit: "آخر زيارة", profileClearnetBookmarksLabel: "الإشارات المرجعية", - forumFilterHot: "رائج", invitesPort: "المنفذ", currentlyUnrecheable: "خطأ!", peerHostValidation: "عنوان IPv4 صالح (مثل 192.168.1.100) أو اسم مضيف (مثل pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "أقصى تقدير سنوي", statsCarbonNetwork: "إجمالي الشبكة", statsCarbonOfEstMax: "من السعة القصوى المقدّرة", + statsCarbonYearProgress: "من السنة المنقضية", + statsNetworkTitle: "الشبكة", + statsStorageTitle: "التخزين", + statsEcoTaxTitle: "ضريبة ECO", + statsAccountTitle: "الحساب", + statsAveragesTitle: "المتوسطات", statsCarbonOfNetwork: "من إجمالي الشبكة", statsCarbonUser: "بصمتك", statsContentCountColumn: "العدد", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "أبرز الوسوم", statsTopTypesTitle: "أبرز أنواع المحتوى", statsTotalMsgs: "إجمالي الرسائل", - feedViewDetails: "عرض التفاصيل", - eventFileLabel: "إرفاق صورة", - taskFileLabel: "إرفاق صورة", - courtsRespondentRequired: "معرّف المدعى عليه مطلوب", extended: "الكون المتعدد", extendedDescription: [ "عندما تدعم شخصًا ما، قد تقوم بتنزيل منشورات من السكان الذين يدعمونهم، وتظهر تلك المنشورات هنا، مرتبة حسب الأحدث.", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "عرض", graphosYou: "أنت", graphosTotalNodes: "إجمالي العقد", - manualMode: "الوضع اليدوي", mentions: "الإشارات", mentionsDescription: [ - strong("منشورات تُشير إليك @"), - "، مرتبة حسب الأحدث.", + strong("كل رسالة تذكرك بـ @"), + ".", ], - nextPage: "التالي", - previousPage: "السابق", noMentions: "لم تتلقَّ إشارات @ بعد.", + mentionsSearchPlaceholder: "ابحث في الإشارات...", privateReminders: "تذكيرات", inboxFiltersLabel: "المرشحات:", inboxToggleToMutuals: "التبديل إلى المتبادلين", inboxToggleToWhole: "التبديل إلى الجميع", - privateFrom: "من", - privateTo: "إلى", privateDate: "التاريخ", pmReply: "رد", pmReplies: "ردود", - pmNew: "جديد", - pmMarkRead: "تعيين كمقروء", inReplyTo: "ردًا على", pmPreview: "معاينة", pmPreviewTitle: "معاينة الرسالة", peers: "الأقران", searchDescription: "الوصف", - imageSearch: "بحث عن الصور", searchFromLabel: "من", searchToLabel: "إلى", - searchMinOpinionsLabel: "أدنى الآراء", - searchInhabitantLabel: "ساكن (Oasis ID)", searchQueryLabel: "استعلام", searchPerPageLabel: "نتائج لكل صفحة", settings: "الإعدادات", @@ -245,68 +230,39 @@ module.exports = { melodyDescription: 'شغّل لحن سلسلة الكتل خاصتك — كل كتلة تصبح نغمة.', melodyEmpty: 'لا توجد نغمات بعد — لم تنتج سلسلة الكتل خاصتك أي كتلة.', melodyCompositionTitle: 'التأليف', - melodyCompositionHelp: 'كل كتلة في سلسلة الكتل خاصتك تصبح نغمة موسيقية حسب نوعها وحجمها.', - melodyStatsTitle: 'التوزيع حسب النوع', - melodyInhabitantLabel: 'الساكن', melodyTotalBlocks: 'نغمات', - melodyType: 'النوع', - melodyCount: 'كتل', melodyFilterMine: 'لي', melodyFilterAll: 'الكل', - melodyFilterShare: 'تحميل لحن', - melodyShareTitle: 'شارك لحنك', - melodyShareHelp: 'انشر لقطة من لحنك الحالي ليتمكن الآخرون من الاستماع وإعادة المزج.', - melodyShareTitleLabel: 'العنوان (اختياري)', - melodyShareTitlePlaceholder: 'شبح بلوكتشين', - melodyShareSubmit: 'نشر اللحن', - melodyNoShared: 'لا توجد ألحان بلوكتشين بعد.', melodyRegenerate: 'إعادة التوليد', melodyDownload: "تنزيل BCS", - profileActivityTitle: 'النشاط', - profileActivityMore: 'عرض كل النشاط', profileContentSectionTitle: 'محتوى الصورة الرمزية', profileContentHelp: 'اختر أي وحدات تُعرض في صورتك الرمزية.', profileSensorsHelp: 'مقاييس اختيارية معروضة في صورتك الرمزية.', profileClearnetHelp: 'الوحدات التي يمكن الوصول إليها من خارج أوازيس.', profileHubAll: 'الكل', - profileHubTitle: 'المحتوى العام', - footerPulseTitle: 'النبض', - footerPulsePeers: 'الأقران', - footerPulseInbox: 'الوارد', - footerPulseSync: 'آخر مزامنة', - footerPulseEcoValue: 'ECO/ساعة', - footerPulseLastActivity: 'آخر نشاط', footerLicenseLabel: 'الترخيص', profileSwitchToOasis: 'العودة إلى Oasis', - profileSwitchToClearnet: 'الغوص في Clearnet', - profileVisibilityFediverse: "فيديفيرس", - profileSwitchToFediverse: "انغمس في الفيديفيرس", - coordLabel: 'الإحداثي (مثال: A3)', - coordPlaceholder: 'أدخل الإحداثي', + profileVisibilityFediverse: "الكون المتعدد", contributorsTitle: "المساهمون", - pixeliaBy: "بواسطة", colorLabel: 'اختر لونًا', paintButton: 'ارسم!', - invalidCoordinate: 'إحداثي غير صحيح', - goToMuralButton: "عرض الجدارية", totalPixels: 'إجمالي البكسلات', modules: "الوحدات", modulesViewTitle: "الوحدات", modulesViewDescription: "اضبط بيئتك بتفعيل أو تعطيل الوحدات.", inbox: "صندوق الوارد", multiverse: "الكون المتعدد", - fediverse: "فيديفيرس", - fediverseDescription: "أدر حساباتك الأخرى في الفيديفيرس، بما في ذلك إرسال واستقبال المحتوى.", + fediverse: "الكون المتعدد", + fediverseDescription: "أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.", fediverseStatus: "الحالة", - fediverseDisconnected: "الفيديفيرس غير متصل. تحقق من %LINK% أو حالة الاتصال.", - fediverseSettingsTitle: "فيديفيرس", + fediverseDisconnected: "الكون المتعدد غير متصل. تحقق من %LINK% أو حالة الاتصال.", + fediverseSettingsTitle: "الكون المتعدد", fediverseInstanceLabel: "العنوان", fediverseTokenLabel: "رمز الوصول", fediverseTokenHelp: "اضبط رمز الوصول الخاص بك. سيُستخدم لإدارة حساب ماستودون من داخل أوازيس.", fediverseConnect: "ربطه", fediverseConnectedAs: "متصل باسم", fediverseDisconnect: "قطع الاتصال", - fediverseEmpty: "عند ربط حسابات أخرى في الفيديفيرس من %LINK%، يمكنك إدارتها من هنا.", fediverseEmptyLink: "الإعدادات", fediverseComposePlaceholder: "بماذا تفكر؟", fediverseReplyPlaceholder: "اكتب ردك…", @@ -315,21 +271,15 @@ module.exports = { fediverseReply: "رد", fediverseBoosted: "قام بالترقية", fediverseNoPosts: "خطك الزمني فارغ.", - fediverseThread: "سلسلة", fediverseTimeline: "الخطوط الزمنية", - fediverseManageTimeline: "إدارة الخط الزمني", fediverseFollowers: "المتابعون", fediverseFollowing: "يُتابِع", fediversePosts: "المنشورات", fediverseJoined: "انضم", - fediverseOverview: "نظرة عامة", fediverseRefresh: "تحديث", fediverseWrite: "اكتب", fediversePreview: "معاينة", - fediverseEdit: "تعديل", - fediverseOpenFeed: "زيارة الخلاصة", fediverseManage: "إدارة", - fediverseStatusNotConnected: "غير متصل", fediverseError: "تعذّر الاتصال بماستودون.", fediverseErrInstance: "رابط خادم غير صالح.", fediverseErrAuth: "رمز غير صالح أو منتهٍ الصلاحية.", @@ -340,17 +290,6 @@ module.exports = { fediverseErrPost: "تعذّر النشر.", fediverseErrMedia: "تعذّر رفع الملف.", fediverseErrEmpty: "اكتب شيئاً أو أرفق ملفاً.", - popularLabel: "أبرز المنشورات", - topicsLabel: "المواضيع", - latestLabel: "الأحدث", - summariesLabel: "الملخصات", - threadsLabel: "المحادثات", - multiverseLabel: "الكون المتعدد", - inboxLabel: "صندوق الوارد", - invitesLabel: "الدعوات", - walletLabel: "المحفظة", - legacyLabel: "المفاتيح", - cipherLabel: "التشفير", bookmarksLabel: "العلامات المرجعية", videosLabel: "الفيديوهات", torrentsLabel: "التورنت", @@ -361,18 +300,14 @@ module.exports = { inhabitantsLabel: "السكان", trendingLabel: "الرائج", eventsLabel: "الأحداث", - tasksLabel: "المهام", apply: "تطبيق", menuPersonal: "شخصي", - menuContent: "المحتوى", - menuBlogs: "مدونات", menuGovernance: "الحوكمة", menuOffice: "المكتب", - menuMultiverse: "الكون المتعدد", - menuNetwork: "الشبكة", + menuNetwork: "المجتمع", menuCreative: "إبداعي", menuEconomy: "الاقتصاد", - menuMedia: "الوسائط", + menuMedia: "المكتبة", menuTools: "الأدوات", comment: "تعليق", subtopic: "موضوع فرعي", @@ -382,13 +317,6 @@ module.exports = { follow: "دعم", block: "حظر", unblock: "إلغاء الحظر", - newerPosts: "منشورات أحدث", - olderPosts: "منشورات أقدم", - feedRangeEmpty: "النطاق المحدد فارغ لهذا التغذية. جرّب عرض ", - seeFullFeed: "التغذية الكاملة", - feedEmpty: "لم تشهد شبكة Oasis أي منشورات من هذا الحساب.", - beginningOfFeed: "هذه بداية التغذية", - noNewerPosts: "لم يتم استقبال منشورات أحدث بعد.", relationshipNotFollowing: "أنت غير مدعوم", relationshipTheyFollow: "يدعمك", relationshipMutuals: "دعم متبادل", @@ -398,16 +326,12 @@ module.exports = { relationshipBlockedBy: "أنت محظور", relationshipMutualBlock: "حظر متبادل", relationshipNone: "أنت لا تدعم", - relationshipConflict: "تعارض", relationshipBlockingPost: "منشور محظور", viewLikes: "عرض الانتشارات", spreadedDescription: "قائمة المنشورات التي نشرها الساكن.", - totalspreads: "إجمالي الانتشارات", - attachFiles: "إرفاق ملفات", preview: "معاينة", publish: "كتابة", contentWarningPlaceholder: "أضف موضوعًا للمنشور (اختياري)", - privateWarningPlaceholder: "أضف سكانًا لإرسال منشور خاص (اختياري)", publishWarningPlaceholder: "النص محدود بـ 7000 حرفًا.", publishTooLong: "منشورك طويل جدًا. الرجاء تقصيره.", publishCustomDescription: [ @@ -416,8 +340,6 @@ module.exports = { commentWarning: [ "تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.", ], - commentPublic: "عام", - commentPrivate: "خاص", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -437,7 +359,6 @@ module.exports = { ".", ], publishCustom: "كتابة منشور متقدم", - subtopicLabel: "إنشاء موضوع فرعي من هذا المنشور", messagePreview: "معاينة المنشور", mentionsMatching: "الإشارات المطابقة", mentionsName: "الاسم", @@ -460,24 +381,19 @@ module.exports = { ssbLogStream: "البلوكتشين", ssbLogStreamDescription: "تكوين حد الرسائل لتدفقات البلوكتشين.", saveSettings: "حفظ الإعدادات", - exportTitle: "تصدير البيانات", exportDescription: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير مفتاحك", exportDataTitle: "نسخة احتياطية", exportDataDescription: "تنزيل بياناتك (بدون المفتاح السري!)", exportDataButton: "تنزيل قاعدة البيانات", - pubWallet: "محفظة PUB", - pubWalletDescription: "عيّن عنوان محفظة PUB. سيُستخدم لمعاملات PUB (بما في ذلك الدخل الأساسي الشامل).", - pubWalletConfiguration: "حفظ الإعدادات", - importTitle: "استيراد البيانات", importDescription: "استورد مفتاحك السري المشفر (المفتاح الخاص) لتفعيل صورتك الرمزية", - importAttach: "إرفاق ملف مشفر (.enc)", - passwordLengthInfo: "يجب أن تكون كلمة المرور 32 حرفًا على الأقل.", passwordImport: "اكتب كلمة المرور لفك تشفير البيانات التي سيتم حفظها في مجلد النظام الرئيسي (الاسم: secret)", exportPasswordPlaceholder: "استخدم أحرفًا صغيرة وكبيرة وأرقامًا ورموزًا", fileInfo: "سيتم تنزيل مفتاحك السري المشفر إلى جهازك (الاسم: oasis.enc)", developer: "التطوير", devTitle: "التطوير", welcomeBannerText: "أهلًا بك في أواسيس. اتبع هذه الخطوات السريعة لإعداد شخصيتك.", + aiSuggestionBanner: "اقتراح:", + aiSuggestionsEnable: "اقتراحات الذكاء الاصطناعي", welcomeBannerAction: "ابدأ!", welcomeTitle: "أهلًا بك", welcomeStepGreetingAction: "إرسال", @@ -520,14 +436,9 @@ module.exports = { devParentFolder: "المجلد الأعلى", devOpenFolder: "فتح", devDescription: "استكشف الشيفرة المصدرية التي تعمل على هذه العقدة.", - devTreeTitle: "الملفات", - devSearchTitle: "البحث في الشيفرة", - devMapTitle: "الوحدات", devRoot: "الجذر", - devRootButton: "الجذر", devSearchPlaceholder: "النص المطلوب البحث عنه في الشيفرة", devAnyExtension: "أي ملف", - devSearchButton: "بحث", devStatsFiles: "الملفات", devStatsLines: "الأسطر", devStatsModules: "الوحدات", @@ -564,16 +475,13 @@ module.exports = { languageDescription: "إذا كنت ترغب في استخدام لغة أخرى، اخترها هنا.", setLanguage: "تعيين اللغة", - peerConnections: "الأقران", peerConnectionsIntro: "إدارة جميع اتصالاتك مع الأقران الآخرين.", peerConnectionsTitle: "الاتصالات", online: "متصل", offline: "غير متصل", discovered: 'مُكتشَف', unknown: 'غير معروف', - lanBroadcastLabel: "بث LAN", lanBroadcastActive: "نشط (بث UDP المتعدد عبر LAN)", - lanBroadcastDisabled: "معطل (وضع pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -586,8 +494,6 @@ module.exports = { noConnections: "لا يوجد أقران متصلون.", noDiscovered: "لم يتم اكتشاف أقران.", noUnknownPeers: "لا توجد أقران غير معروفة في رسم بياني الأصدقاء.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -597,9 +503,6 @@ module.exports = { peerImport: "استيراد", peerImportTitle: "استيراد قائمة الأقران", peerImportPlaceholder: "ألصق عنوان multiserver واحدًا لكل سطر، أو حمّل ملف .txt…", - noSupportedConnections: "لا يوجد أقران مدعومون.", - noBlockedConnections: "لا يوجد أقران محظورون.", - noRecommendedConnections: "لا يوجد أقران مُوصى بهم.", connectionActionIntro: "", startNetworking: "بدء الشبكة", @@ -613,9 +516,19 @@ module.exports = { homePageDescription: "اختر الوحدة التي تريدها كصفحتك الرئيسية.", saveHomePage: "تعيين الرئيسية", invites: "الدعوات", - invitesTitle: "الدعوات", - invitesInvites: "الدعوات", invitesDescription: "إدارة وتطبيق رموز الدعوة في شبكتك.", + invitesPubsHint: "ألصق رمز دعوة لخادم pub للاتحاد معه والبدء بنسخ سكانه.", + invitesFederationsHint: "الخوادم المتحدة معك: حدّثها، أزل غير المتاحة أو صدّر القائمة.", + invitesHousesHint: "أدخل رمز بيت للانضمام إلى بيت في LARP والمشاركة في اقتصاده.", + invitesTribesHint: "أدخل رمز قبيلة لتصبح عضوًا وتصل إلى محتواها الخاص.", + invitesChatsHint: "أدخل رمز محادثة للانضمام إلى الحوار ومواضيعه.", + invitesPadsHint: "أدخل رمز لوح للكتابة مع آخرين في مستند مشترك.", + invitesCalendarsHint: "أدخل رمز تقويم لمشاركة المواعيد والتذكيرات.", + invitesEventsHint: "أدخل رمز فعالية للانضمام إلى فعالية خاصة.", + invitesForumsHint: "أدخل رمز منتدى للقراءة والرد في منتدى خاص.", + invitesMapsHint: "أدخل رمز خريطة لرؤية الأماكن وإضافتها على خريطة مشتركة.", + invitesShopsHint: "أدخل رمز متجر للانضمام إلى متجر وكتالوجه.", + invitesInhabitantsHint: "أدخل رمز ساكن لمتابعة بعضكما وتبادل المحتوى.", invitesTribesTitle: "القبائل", invitesTribeInviteCodePlaceholder: "أدخل رمز دعوة القبيلة", invitesTribeJoinButton: "انضم إلى القبيلة", @@ -646,7 +559,6 @@ module.exports = { invitesAlreadyFederated: "أنت متحد بالفعل مع هذا الخادم.", invitesFederationsTitle: "الاتحادات", invitesAcceptedInvites: "متحدة", - invitesNoInvites: "لم يتم قبول أي دعوات بعد.", invitesUnfollow: "إلغاء المتابعة", invitesFollow: "متابعة", invitesUnfollowedInvites: "غير متحدة", @@ -666,39 +578,24 @@ module.exports = { panicMode: "وضع الطوارئ!", encryptData: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير البلوكتشين الخاص بك", decryptData: "أدخل كلمة المرور لفك تشفير البلوكتشين الخاص بك", - panicModeDescription: "تشفير/فك تشفير أو حذف البلوكتشين الخاص بك", removeDataDescription: "تحذير: لا يمكن التراجع عن هذه العملية.", - encryptPanicButton: "تشفير البلوكتشين", - decryptPanicButton: "فك تشفير البلوكتشين", removePanicButton: "حذف جميع بياناتك!", searchTitle: "بحث", searchDescriptionLabel: "ابحث عن محتوى في شبكتك.", - searchLanguagesLabel: "اللغات", - searchSkillsLabel: "المهارات", searchPlaceholder:"ابحث عن محتوى...", - searchDateLabel:"التاريخ", searchLocationLabel:"الموقع", searchPriceLabel:"السعر", - searchUrlLabel:"الرابط", searchCategoryLabel:"الفئة", - searchStartLabel:"وقت البدء", - searchEndLabel:"وقت الانتهاء", searchPriorityLabel:"الأولوية", searchStatusLabel:"الحالة", statusLabel:"الحالة", - totalVotesLabel:"إجمالي الأصوات", noResultsFound:"لم يتم العثور على نتائج.", votesOption:"خيارات التصويت", voteYesLabel:"نعم", voteNoLabel:"لا", allTypesLabel: "غير محدود", - ABSTENTIONLabel:"امتناع", YESLabel:"نعم", NOLabel:"لا", - FOLLOW_MAJORITYLabel: "اتباع الأغلبية", - CONFUSEDLabel: "مرتبك", - NOT_INTERESTEDLabel: "غير مهتم", - StatusLabel:"الحالة", votesOptionYesLabel:"نعم", votesOptionNoLabel:"لا", votesOptionAbstentionLabel:"امتناع", @@ -706,7 +603,6 @@ module.exports = { votesCreatedByLabel:"أنشأه", voteStatusOpen:"مفتوح", voteStatusClosed:"مغلق", - imageSearchLabel: "أدخل كلمات للبحث عن صور مُعلَّمة بها.", commentDescription: ({ parentUrl }) => [ " علّق على ", a({ href: parentUrl }, " المحادثة"), @@ -717,53 +613,20 @@ module.exports = { a({ href: parentUrl }, " منشور"), ], subtopicTitle: ({ authorName }) => [`موضوع فرعي على منشور @${authorName}`], - mysteryDescription: "نشر منشورًا غامضًا", oasisDescription: "شبكة مشروع OASIS", searchSubmit: "لنبحث...", - postLabel: "المنشورات", - aboutLabel: "السكان", - feedLabel: "التغذيات", votesLabel: "التصويتات", - reportLabel: "التقارير", - imageLabel: "الصور", - videoLabel: "الفيديوهات", - audioLabel: "الملفات الصوتية", - documentLabel: "المستندات", - torrentLabel: "التورنت", pdfFallbackLabel: "مستند PDF", - eventLabel: "الأحداث", - taskLabel: "المهام", - transferLabel: "التحويلات", - curriculumLabel: "السيرة الذاتية", - bookmarkLabel: "العلامات المرجعية", - tribeLabel: "القبائل", - marketLabel: "السوق", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "المحافظ", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "إرسال", - subjectLabel: "الموضوع", editProfile: "تعديل الصورة الرمزية", - profileQrAlt: "رمز QR للملف الشخصي", - profileQrHint: "امسح ضوئيًا لنسخ معرّف Oasis هذا.", oasisIdLabel: "OasisID", - spreadLabel: "نشر", - spreadHint: "نشر هذا لداعميك (يتم النسخ عبر تغذيتك).", + spreadContent: "نسخ", welcomePmSubject: "Hello World!", - welcomePmBody: "مرحبًا بك في أوازيس — شبكة اجتماعية حرة، نِدّ لِنِد، اتحادية ومشفّرة، ذات بنية موزّعة بالدعوة فقط.\n\nبعض الأماكن المثيرة للاهتمام للبدء:\n\n- /profile — عدّل صورتك الرمزية واسمك ووصفك والوحدات التي تظهر في جانبك العام.\n- /invites — أضف pub للاتحاد مع بقية الشبكة.\n- /peers — اطّلع على من هو متصل، أعد مسح شبكتك المحلية، صدّر أو استورد قوائم الأقران.\n- /inhabitants — اكتشف الصور الرمزية للآخرين وزرها.\n- /tribes — أنشئ مجموعات خاصة بتشفير من طرف إلى طرف أو انضم إليها.\n- /inbox — اقرأ وأرسل الرسائل الخاصة.\n- /activity — اطّلع على النشاط الأخير، نشاطك ونشاط شبكتك.\n- /publish — اكتب منشورًا أو شارك صورة أو صوتًا أو فيديو أو مستندًا.\n- /search — ابحث في محتوى الشبكة حسب النوع.\n\nبعض الأماكن المثيرة للاهتمام للاتصال:\n\n- /fediverse — أدر حساباتك الأخرى في الفيديفيرس، بما في ذلك إرسال واستقبال المحتوى.\n\nأُرسلت هذه الرسالة بشكل خاص منك إلى نفسك، لذا لم يلزم أي اتصال لاستلامها.", - profileVisibilityTitle: "ظهور الملف الشخصي العام", - profileVisibilityHint: "اختر الحقول التي يراها السكان الآخرون في ملفك الشخصي. افتراضيًا، يظهر Karma فقط.", + welcomePmBody: "مرحبًا بك في أوازيس — شبكة اجتماعية حرة، نِدّ لِنِد، اتحادية ومشفّرة، ذات بنية موزّعة بالدعوة فقط.\n\nبعض الأماكن المثيرة للاهتمام للبدء:\n\n- /profile — عدّل صورتك الرمزية واسمك ووصفك والوحدات التي تظهر في جانبك العام.\n- /invites — أضف pub للاتحاد مع بقية الشبكة.\n- /peers — اطّلع على من هو متصل، أعد مسح شبكتك المحلية، صدّر أو استورد قوائم الأقران.\n- /inhabitants — اكتشف الصور الرمزية للآخرين وزرها.\n- /tribes — أنشئ مجموعات خاصة بتشفير من طرف إلى طرف أو انضم إليها.\n- /inbox — اقرأ وأرسل الرسائل الخاصة.\n- /activity — اطّلع على النشاط الأخير، نشاطك ونشاط شبكتك.\n- /publish — اكتب منشورًا أو شارك صورة أو صوتًا أو فيديو أو مستندًا.\n- /search — ابحث في محتوى الشبكة حسب النوع.\n\nبعض الأماكن المثيرة للاهتمام للاتصال:\n\n- /multiverse — أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.\n\nأُرسلت هذه الرسالة بشكل خاص منك إلى نفسك، لذا لم يلزم أي اتصال لاستلامها.", profileSensorsSectionTitle: "المستشعرات", profileVisibilityActivity: "مستوى النشاط", - profileVisibilityDevice: "الجهاز", profileDeviceLockedHint: "هذا المستشعر مفعّل دائمًا: يتيح للآخرين معرفة الجهاز الذي تتصل منه ولا يمكن تعطيله.", profileVisibilityKarma: "نقاط KARMA", profileVisibilityUbi: "UBI", @@ -771,7 +634,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "مفتاح GPG", - profileVisibilityClearnet: "نشر ملفي الشخصي", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "المتاجر", profileClearnetJobsLabel: "الوظائف", @@ -825,7 +687,6 @@ module.exports = { " أو حالة الاتصال.", ], walletSentToLine: ({ destination, amount }) => `تم إرسال ECO ${amount} إلى ${destination}`, - walletSettingsTitle: "المحفظة", walletSettingsDescription: "دمج Oasis مع محفظة ECOin الخاصة بك.", walletSettingsDocLink: "دليل تثبيت ECOin", walletStatusMessages: { @@ -847,37 +708,19 @@ module.exports = { cipherTitle: "التشفير", cipherDescription: "تشفير وفك تشفير نصك بشكل متماثل (باستخدام كلمة مرور مشتركة).", randomPassword: "كلمة مرور عشوائية", - cipherEncryptTitle: "تشفير النص", - cipherEncryptDescription: "أدخل النص للتشفير", - cipherTextLabel: "النص للتشفير", cipherTextPlaceholder: "أدخل النص للتشفير...", cipherPasswordLabel: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير نصك", cipherPasswordDecryptLabel: "عيّن كلمة مرور (32 حرفًا على الأقل) لفك تشفير نصك", cipherPasswordPlaceholder: "أدخل كلمة مرور...", cipherEncryptButton: "تشفير", - cipherDecryptTitle: "فك تشفير النص", - cipherDecryptDescription: "أدخل النص لفك التشفير", cipherEncryptedMessageLabel: "النص المشفر", cipherDecryptedMessageLabel: "النص المفكوك", - cipherPasswordUsedLabel: "كلمة المرور المستخدمة للتشفير (احتفظ بها!)", cipherEncryptedTextPlaceholder: "أدخل النص المشفر...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "أدخل متجه التهيئة...", cipherDecryptButton: "فك التشفير", password: "كلمة المرور", text: "النص", encryptedText: "النص المشفر", iv: "متجه التهيئة (IV)", - encryptTitle: "تشفير نصك", - encryptDescription: "أدخل النص الذي تريد تشفيره وقدّم كلمة مرور.", - encryptButton: "تشفير", - decryptTitle: "فك تشفير نصك", - decryptDescription: "أدخل النص المشفر وقدّم نفس كلمة المرور المستخدمة للتشفير.", - decryptButton: "فك التشفير", - passwordLengthError: "يجب أن تكون كلمة المرور 32 حرفًا على الأقل.", - missingFieldsError: "لم يتم تقديم النص أو كلمة المرور أو IV.", - encryptionError: "خطأ في تشفير النص.", - decryptionError: "خطأ في فك تشفير النص.", bookmarkTitle: "العلامات المرجعية", bookmarkDescription: "اكتشف وأدِر العلامات المرجعية في شبكتك.", bookmarkAllSectionTitle: "العلامات المرجعية", @@ -903,8 +746,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "اختياري", bookmarkTagsLabel: "الوسوم", bookmarkTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", - bookmarkCategoryLabel: "الفئة", - bookmarkCategoryPlaceholder: "اختياري", bookmarkLastVisitLabel: "آخر زيارة", bookmarkSearchPlaceholder: "ابحث عن رابط، وسوم، فئة، مؤلف...", bookmarkSortRecent: "الأحدث", @@ -919,8 +760,6 @@ module.exports = { noLastVisit: "لا توجد زيارة أخيرة", videoTitle: "الفيديوهات", videoDescription: "استكشف وأدِر محتوى الفيديو في شبكتك.", - videoPluginTitle: "العنوان", - videoPluginDescription: "الوصف", videoMineSectionTitle: "فيديوهاتك", videoCreateSectionTitle: "رفع فيديو", videoUpdateSectionTitle: "تحديث الفيديو", @@ -952,7 +791,6 @@ module.exports = { videoSortOldest: "الأقدم", videoSortTop: "الأكثر تصويتًا", videoSearchButton: "بحث", - videoMessageAuthorButton: "رسالة خاصة", videoUpdatedAt: "تم التحديث", videoNoMatch: "لا توجد فيديوهات تطابق بحثك.", documentTitle: "المستندات", @@ -993,8 +831,6 @@ module.exports = { documentUpdatedAt: "تم التحديث", audioTitle: "الملفات الصوتية", audioDescription: "استكشف وأدِر المحتوى الصوتي في شبكتك.", - audioPluginTitle: "العنوان", - audioPluginDescription: "الوصف", audioMineSectionTitle: "ملفاتك الصوتية", audioCreateSectionTitle: "رفع ملف صوتي", audioUpdateSectionTitle: "تحديث الملف الصوتي", @@ -1005,7 +841,6 @@ module.exports = { audioFilterMine: "خاصتي", audioFilterRecent: "الأخيرة", audioFilterTop: "الأفضل", - audioFilterBlockchain: "بلوكتشين", audioCreateButton: "رفع ملف صوتي", audioUpdateButton: "تحديث", audioDeleteButton: "حذف", @@ -1032,6 +867,7 @@ module.exports = { audioFilterFavorites: "المفضلة", favoritesTitle: "المفضلة", favoritesDescription: "كل المحتوى المفضل لديك في مكان واحد.", + favoritesSearchPlaceholder: "ابحث في المفضلة...", favoritesFilterAll: "الكل", favoritesFilterRecent: "الأخيرة", favoritesFilterAudios: "الملفات الصوتية", @@ -1047,18 +883,13 @@ module.exports = { favoritesNoItems: "لا توجد مفضلات بعد.", yourContacts: "جهات اتصالك", allInhabitants: "السكان", - allCVs: "جميع السير الذاتية", + allCVs: "السير الذاتية", discoverPeople: "اكتشف السكان في شبكتك.", - allInhabitantsButton: "الكل", - contactsButton: "المدعومون", - CVsButton: "السير الذاتية", - matchSkills: "مطابقة المهارات", - matchSkillsButton: "مطابقة المهارات", - suggestedButton: "المقترحون", searchInhabitantsPlaceholder: "تصفية السكان حسب الاسم …", filterLocation: "تصفية السكان حسب الموقع …", filterLanguage: "تصفية السكان حسب اللغة …", filterSkills: "تصفية السكان حسب المهارات …", + cvSkillsCount: "المهارات", applyFilters: "تطبيق الفلاتر", locationLabel: "الموقع", languagesLabel: "اللغات", @@ -1067,17 +898,18 @@ module.exports = { mutualFollowers: "المتابعون المتبادلون", suggestedFollowsYou: "يتابعك", latestInteractions: "آخر التفاعلات", - viewAvatar: "عرض الصورة الرمزية", - viewCV: "عرض السيرة الذاتية", suggestedSectionTitle: "المقترحون", topkarmaSectionTitle: "أفضل كارما", topecoSectionTitle: "أفضل إيكو", topactivitySectionTitle: "الأكثر نشاطًا", + "TOP INACTIVITYButton": "الأقل نشاطاً", + topinactivitySectionTitle: "السكان الأقل نشاطاً", blockedSectionTitle: "المحظورون", gallerySectionTitle: "المعرض", - blockedButton: "المحظورون", + topSectionTitle: "الأعلى", blockedLabel: "مستخدم محظور", inhabitantviewDetails: "عرض التفاصيل", + cvVisitButton: "زيارة السيرة الذاتية", keepReading: "متابعة القراءة...", oasisId: "المعرّف", noInhabitantsFound: "لم يتم العثور على سكان بعد.", @@ -1090,7 +922,8 @@ module.exports = { parliamentFilterCandidatures: "الترشيحات", parliamentFilterProposals: "المقترحات", parliamentFilterLaws: "القوانين", - parliamentFilterHistorical: "السجل التاريخي", + parliamentFilterRevocations: "الإقالات", + parliamentFilterHistorical: "السجل", parliamentFilterLeaders: "القادة", parliamentFilterRules: "القواعد", parliamentGovernmentCard: "الحكومة الحالية", @@ -1115,10 +948,8 @@ module.exports = { parliamentPoliciesDeclined: "القوانين المرفوضة", parliamentPoliciesDiscarded: "القوانين الملغاة", parliamentEfficiency: "% الكفاءة", - parliamentFilterRevocations: 'الإلغاءات', parliamentRevocationFormTitle: 'إلغاء قانون', parliamentRevocationLaw: 'القانون', - parliamentRevocationTitle: 'العنوان', parliamentRevocationReasons: 'الأسباب', parliamentRevocationPublish: 'نشر الإلغاء', parliamentCurrentRevocationsTitle: 'الإلغاءات الحالية', @@ -1131,23 +962,12 @@ module.exports = { parliamentNoGovernments: "لا توجد حكومات بعد.", parliamentCandidatureFormTitle: "اقتراح ترشيح", parliamentCandidatureIdPh: "معرّف Oasis (@...) أو اسم القبيلة", - parliamentCandidatureSlogan: "الشعار (140 حرفًا كحد أقصى)", - parliamentCandidatureSloganPh: "شعار قصير", parliamentCandidatureMethod: "الطريقة", parliamentCandidatureProposeBtn: "نشر الترشيح", - parliamentThDate: "تاريخ الاقتراح", - parliamentThSlogan: "الشعار", - parliamentThSince: "تاريخ الملف الشخصي", - parliamentThVotes: "الأصوات المُستلَمة", - parliamentThVoteAction: "تصويت", - parliamentTypeUser: "ساكن", - parliamentTypeTribe: "قبيلة", parliamentVoteBtn: "تصويت", parliamentProposalFormTitle: "اقتراح قانون", parliamentProposalDescription: "الوصف (≤1000)", parliamentProposalPublish: "نشر الاقتراح", - parliamentFinalize: "إنهاء", - parliamentDeadline: "الموعد النهائي", parliamentNoProposals: "لا توجد مقترحات قوانين بعد.", parliamentNoLaws: "لا توجد قوانين معتمدة بعد.", parliamentMethodDEMOCRACY: "ديمقراطية", @@ -1165,29 +985,21 @@ module.exports = { parliamentVotesSlashTotal: "الأصوات/الإجمالي", parliamentVotesNeeded: "الأصوات المطلوبة", parliamentFutureLawsTitle: "القوانين المستقبلية", - parliamentNoFutureLaws: "لا توجد قوانين مستقبلية بعد.", parliamentVoteAction: "تصويت", - parliamentLeadersTitle: "القادة", parliamentThLeader: "الصورة الرمزية", parliamentPopulation: "عدد السكان", - parliamentThType: "النوع", - parliamentThInPower: "في السلطة", parliamentThPresented: "الترشيحات", parliamentNoLeaders: "لا يوجد قادة بعد.", parliamentCandidaturesListTitle: "قائمة الترشيحات", parliamentTimeRemaining: "الوقت المتبقي", - parliamentNoLeader: "لا يوجد ترشيح فائز بعد.", parliamentElectionsStatusTitle: "الحكومة القادمة", parliamentProposalDeadlineLabel: "الموعد النهائي", parliamentProposalTimeLeft: "الوقت المتبقي", - parliamentProposalOnTrack: "في طريقه للتمرير", - parliamentProposalOffTrack: "لا يوجد دعم كافٍ بعد", parliamentRulesTitle: "كيف يعمل البرلمان", parliamentRulesIntro: "تُحسم الانتخابات كل شهرين؛ الترشيحات مستمرة وتُعاد عند اختيار حكومة.", parliamentRulesCandidates: "يمكن لأي ساكن ترشيح نفسه أو ساكن آخر أو أي قبيلة. يمكن لكل ساكن تقديم 3 ترشيحات كحد أقصى لكل دورة؛ تُرفض التكرارات في نفس الدورة.", parliamentRulesElection: "الفائز هو الترشيح الذي يحصل على أكبر عدد من الأصوات وقت الحسم.", parliamentRulesTies: "ترتيب كسر التعادل: أعلى كارما للساكن؛ إذا تعادلوا، أقدم ملف شخصي؛ إذا لا يزال متعادلاً، أقدم ترشيح؛ ثم ترتيب أبجدي حسب المعرّف.", - parliamentRulesFallback: "إذا لم يصوّت أحد، يفوز آخر ترشيح مقدّم. إذا لم تكن هناك ترشيحات، تُختار قبيلة عشوائية.", parliamentRulesTerm: "يعرض تبويب الحكومة الحكومة الحالية والإحصائيات.", parliamentRulesMethods: "الأشكال: فوضوية (أغلبية بسيطة)، ديمقراطية (50%+1)، أغلبية (80%)، أقلية (20%)، كارماتوقراطية (مقترحات أعلى كارما)، ديكتاتورية (موافقة فورية).", parliamentRulesAnarchy: "الفوضوية هي الوضع الافتراضي: إذا لم يُنتخب أي ترشيح عند الحسم، تُعلن الفوضوية. في ظل الفوضوية، يمكن لأي ساكن اقتراح قوانين.", @@ -1209,11 +1021,7 @@ module.exports = { courtsCaseFormTitle: "فتح قضية", courtsCaseRespondent: "المتهم / المدعى عليه", courtsCaseRespondentPh: "معرّف Oasis (@...) أو اسم القبيلة", - courtsCaseMediatorsAccuser: "الوسطاء (المدعي)", courtsCaseMethod: "طريقة الحل", - courtsCaseDescription: "الوصف (1000 حرف كحد أقصى)", - courtsCaseEvidenceTitle: "أدلة القضية", - courtsCaseEvidenceHelp: "أرفق صورًا أو ملفات صوتية أو مستندات (PDF) أو فيديوهات تدعم قضيتك.", courtsCaseSubmit: "رفع القضية", courtsNominateJudge: "ترشيح قاضٍ", courtsJudgeId: "القاضي", @@ -1258,22 +1066,6 @@ module.exports = { courtsRulesMisconduct: "قد يؤدي التحرش أو التلاعب أو تلفيق الأدلة إلى حكم سلبي فوري.", courtsRulesGlossary: "القضية: سجل نزاع. الدليل: مواد تدعم الادعاءات. الحكم: قرار مع علاج. الاستئناف: طلب مراجعة الحكم.", courtsFilterActions: "الإجراءات", - courtsNoActions: "لا توجد إجراءات معلقة لدورك.", - courtsCaseTitlePlaceholder: "وصف مختصر للنزاع", - courtsCaseSeverity: "الخطورة", - courtsCaseSeverityNone: "بدون تصنيف خطورة", - courtsCaseSeverityLOW: "منخفضة", - courtsCaseSeverityMEDIUM: "متوسطة", - courtsCaseSeverityHIGH: "عالية", - courtsCaseSeverityCRITICAL: "حرجة", - courtsCaseSubject: "الموضوع", - courtsCaseSubjectNone: "بدون تصنيف موضوع", - courtsCaseSubjectBEHAVIOUR: "سلوك", - courtsCaseSubjectCONTENT: "محتوى", - courtsCaseSubjectGOVERNANCE: "حوكمة / قواعد", - courtsCaseSubjectFINANCIAL: "مالي / موارد", - courtsCaseSubjectOTHER: "أخرى", - courtsHiddenRespondent: "مخفي (مرئي فقط للأدوار المعنية).", courtsThRole: "الدور", courtsRoleAccuser: "المدعي", courtsRoleDefence: "الدفاع", @@ -1284,54 +1076,19 @@ module.exports = { courtsAssignJudgeBtn: "اختيار قاضٍ", trendingTitle: "الرائج", exploreTrending: "استكشف المحتوى الأكثر شعبية في شبكتك.", - bookmarkButton: "العلامات المرجعية", - transferButton: "التحويلات", - eventButton: "الأحداث", - taskButton: "المهام", votesButton: "التصويتات", - industryButton: "الصناعة", - projectButton: "المشاريع", - shopProductButton: "المنتجات", - reportButton: "التقارير", - feedButton: "التغذية", - marketButton: "السوق", - imageButton: "الصور", - audioButton: "الملفات الصوتية", - videoButton: "الفيديوهات", - documentButton: "المستندات", - torrentButton: "التورنت", - noTrendingFound: "لم يتم العثور على محتوى رائج.", - noContentMessage: "لا يتوفر محتوى رائج بعد.", - trendingDescription: "الوصف", - trendingDate: "التاريخ", - trendingLocation: "الموقع", - trendingPrice: "السعر", - trendingUrl: "الرابط", - trendingCategory: "الفئة", - trendingStart: "البداية", - trendingEnd: "النهاية", - trendingPriority: "الأولوية", - trendingStatus: "الحالة", - trendingFrom: "من", - trendingTo: "إلى", - trendingConcept: "المفهوم", - trendingAmount: "المبلغ", - trendingDeadline: "الموعد النهائي", - trendingItemStatus: "حالة العنصر", - trendingTotalVotes: "إجمالي الأصوات", + shopProductButton: "متجر", trendingTotalOpinions: "إجمالي الآراء", trendingNoContentMessage: "لا توجد اتجاهات بعد.", - trendingAuthor: "بواسطة", - trendingCreatedAtLabel: "أُنشئ في", trendingTotalCount: "العدد الإجمالي", tasksTitle: "المهام", tasksDescription: "اكتشف وأدِر المهام في شبكتك.", + taskSearchPlaceholder: "ابحث عن المهام...", taskTitleLabel: "العنوان", taskDescriptionLabel: "الوصف", taskStartTimeLabel: "وقت البدء", taskEndTimeLabel: "وقت الانتهاء", taskPriorityLabel: "الأولوية", - taskPrioritySelect: "اختر الأولوية", taskPriorityUrgent: "عاجل", taskPriorityHigh: "عالية", taskPriorityMedium: "متوسطة", @@ -1341,13 +1098,13 @@ module.exports = { taskVisibilityLabel: "الظهور", taskPublic: "عام", taskPrivate: "خاص", - taskCreatedAt: "أُنشئ في", - taskBy: "بواسطة", taskStatus: "الحالة", taskStatusOpen: "مفتوح", taskStatusInProgress: "قيد التنفيذ", taskStatusClosed: "مغلق", taskAssignedTo: "مُسنَد إلى", + taskAssignedChip: "مُسندة", + taskUnassignedChip: "غير مُسندة", taskAssignees: "المُكلَّفون", taskAssignButton: "إسناد لي", taskUnassignButton: "إلغاء الإسناد", @@ -1360,7 +1117,6 @@ module.exports = { taskFilterInProgress: "قيد التنفيذ", taskFilterClosed: "مغلق", taskFilterAssigned: "مُسنَد", - taskFilterArchived: "مؤرشف", taskFilterUrgent: "عاجل", taskFilterHigh: "عالية", taskFilterMedium: "متوسطة", @@ -1373,23 +1129,21 @@ module.exports = { taskInProgressTitle: "المهام قيد التنفيذ", taskClosedTitle: "المهام المغلقة", taskAssignedTitle: "المهام المُسنَدة", - taskArchivedTitle: "المهام المؤرشفة", - taskPublicTitle: "المهام العامة", - taskPrivateTitle: "المهام الخاصة", notasks: "لا توجد مهام متاحة.", noLocation: "لم يتم تحديد الموقع", taskSetStatus: "تعيين الحالة", - eventTitle: "الأحداث", eventDateLabel: "التاريخ", + eventRecurrenceLabel: "التكرار", + eventRecurrenceUntil: "كرر حتى", + eventRecurrenceHint: "اترك تاريخ الانتهاء فارغًا لفعالية لمرة واحدة.", + eventUpcomingDates: "التواريخ القادمة", eventsTitle: "الأحداث", eventsDescription: "اكتشف وأدِر الأحداث في شبكتك.", - eventDescription: "الوصف", + eventSearchPlaceholder: "ابحث عن الأحداث...", eventPrice: "السعر", eventStatus: "الحالة", - eventOrganizer: "المنظم", eventAllSectionTitle: "الأحداث", eventMineSectionTitle: "أحداثك", - eventArchivedTitle: "الأحداث المؤرشفة", eventCreateSectionTitle: "إنشاء حدث", eventUpdateSectionTitle: "تحديث الحدث", eventDeleteButton: "حذف", @@ -1397,11 +1151,26 @@ module.exports = { eventAddToCalendar: "إضافة إلى التقويم", eventVisitCalendar: "عرض التقويم", viewTask: "عرض المهمة", + viewEvent: "عرض الحدث", + viewPad: "عرض المستند", + viewMap: "عرض الخريطة", + viewCalendar: "عرض التقويم", viewReport: "عرض التقرير", viewTransfer: "عرض التحويل", viewItem: "عرض العنصر", viewShop: "عرض المتجر", viewProject: "عرض المشروع", + viewJob: "عرض الوظيفة", + viewPlace: "عرض المكان", + generatePdf: "إنشاء PDF", + sharePm: "مشاركة برسالة خاصة", + galleryImages: "الصور (الحجم الأقصى: 50 ميجابايت لكل صورة)", + galleryPhotos: "الصور", + galleryAddPhoto: "إضافة صورة", + galleryRemovePhoto: "إزالة", + galleryVideo: "فيديو (الحجم الأقصى: 50 ميجابايت)", + galleryAddVideo: "إضافة فيديو", + galleryRemoveVideo: "إزالة الفيديو", viewVotation: "عرض التصويت", voteCastTitle: "أدلِ بصوتك", voteResults: "النتائج", @@ -1409,29 +1178,15 @@ module.exports = { eventDescriptionLabel: "الوصف", eventDescriptionPlaceholder: "أدخل وصف الحدث...", eventUpdateButton: "تحديث", - eventAttendeesLabel: "الحاضرون", - eventAttendeesPlaceholder: "أدخل الحاضرين، مفصولين بفواصل...", eventTagsLabel: "الوسوم", - eventTagsPlaceholder: "أدخل وسوم الحدث، مفصولة بفواصل...", - eventTags: "الوسوم", eventPriceLabel: "السعر", eventUrlLabel: "الرابط", eventAttendees: "الحاضرون", - noAttendees: "لا يوجد حاضرون بعد", - eventCreatedAt: "أُنشئ في", eventLocation: "الموقع", eventLocationLabel: "الموقع", - eventNoLocation: "لم يتم تحديد الموقع", - eventNoURL: "لم يتم تحديد رابط", - eventBy: "بواسطة", noevents: "لا توجد أحداث متاحة.", eventDate: "التاريخ", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "حضور الحدث", - eventUnattendButton: "إلغاء الحضور", - eventCreatedBy: "أُنشئ بواسطة", - eventAttendeesCount: "عدد الحاضرين", - eventCreatedByYou: "أنت أنشأت هذا الحدث", eventFilterAll: "الكل", eventFilterMine: "خاصتي", eventFilterToday: "اليوم", @@ -1439,18 +1194,9 @@ module.exports = { eventFilterMonth: "هذا الشهر", eventFilterYear: "هذه السنة", eventFilterArchived: "مؤرشف", - eventTodayTitle: "أحداث اليوم", - eventThisWeekTitle: "أحداث هذا الأسبوع", - eventThisMonthTitle: "أحداث هذا الشهر", - eventThisYearTitle: "أحداث هذه السنة", eventPrivacyLabel: "الظهور", eventPublic: "عام", eventPrivate: "خاص", - eventPublicTitle: "الأحداث العامة", - eventNoPrice: "حدث مجاني", - eventNoImage: "لم يتم رفع صورة", - eventAttendConfirmation: "أنت الآن تحضر هذا الحدث", - eventUnattendConfirmation: "لم تعد تحضر هذا الحدث", eventAttended: "حضر", eventUnattended: "لم يحضر", eventStatusOpen: "مفتوح", @@ -1461,6 +1207,10 @@ module.exports = { tagsTopSectionTitle: "أفضل الوسوم", tagsCloudSectionTitle: "سحابة الوسوم", tagsFilterAll: "الكل", + tagsFilterMine: "لي", + tagsFilterRecent: "حديثة", + tagsMineSectionTitle: "وسومي", + tagsRecentSectionTitle: "وسوم حديثة", tagsFilterTop: "الأفضل", tagsFilterCloud: "السحابة", tagsNoItems: "لا توجد وسوم متاحة.", @@ -1504,18 +1254,12 @@ module.exports = { transfersDeadline: "الموعد النهائي", transfersTags: "الوسوم", transfersStatus: "الحالة", - transfersStatusUnconfirmed: "غير مؤكد", - transfersStatusClosed: "مغلق", - transfersStatusDiscarded: "ملغى", - transfersCreatedAt: "أُنشئ في", transfersConfirmations: "التأكيدات", - transfersContainingBlock: "الكتلة المحتوية", - transfersExportContract: "عقد ذكي", + transfersExportContract: "إنشاء فاتورة", transfersConfirmButton: "تأكيد التحويل", transfersNoItems: "لم يتم العثور على تحويلات.", transfersMineSectionTitle: "تحويلاتك", transfersUBISectionTitle: "تحويلات UBI", - transfersMarketSectionTitle: "تحويلات السوق", transfersTopSectionTitle: "أفضل التحويلات", transfersPendingSectionTitle: "التحويلات المعلّقة", transfersUnconfirmedSectionTitle: "التحويلات غير المؤكدة", @@ -1523,21 +1267,13 @@ module.exports = { transfersDiscardedSectionTitle: "التحويلات الملغاة", transfersCreateSectionTitle: "إنشاء عملية نقل", transfersAllSectionTitle: "التحويلات", - transfersFilterFavs: "المفضلة", - transfersFavsSectionTitle: "التحويلات المفضلة", - transfersSearchLabel: "بحث", transfersSearchPlaceholder: "ابحث عن مفهوم، وسوم، مستخدمين...", transfersMinAmountLabel: "الحد الأدنى للمبلغ", transfersMaxAmountLabel: "الحد الأقصى للمبلغ", - transfersSortLabel: "ترتيب حسب", transfersSortRecent: "الأحدث", transfersSortAmount: "الأعلى مبلغًا", transfersSortDeadline: "الأقرب موعدًا", transfersSearchButton: "بحث", - transfersFavoriteButton: "إضافة للمفضلة", - transfersUnfavoriteButton: "إزالة من المفضلة", - transfersMessageUserButton: "رسالة", - transfersExpiringSoonBadge: "على وشك الانتهاء", transfersExpiredBadge: "منتهي الصلاحية", transfersUpdatedAt: "تم التحديث", transfersNoMatch: "لا توجد تحويلات تطابق بحثك.", @@ -1582,16 +1318,6 @@ module.exports = { voteNoQuestion: "لم يتم تقديم سؤال", voteUnknownCreator: "مُنشئ غير معروف", voteUnknownDate: "تاريخ غير معروف", - errorVoteNotFound: "لم يتم العثور على التصويت", - errorAlreadyVoted: "لقد أبديت رأيك بالفعل.", - errorVoteClosedCannotEdit: "لا يمكنك تعديل تصويت مغلق", - errorVoteDeadlinePassed: "انتهى الموعد النهائي لهذا التصويت", - errorRetrievingVote: "خطأ في استرجاع التصويت", - errorCreatingVote: "خطأ في إنشاء التصويت", - errorVoteAlreadyVoted: "لا يمكن التعديل بعد الإدلاء بالرأي", - errorDeletingOldVote: "خطأ في حذف الرأي القديم", - errorCreatingUpdatedVote: "خطأ في إنشاء الرأي المحدّث", - errorCreatingTombstone: "خطأ في إنشاء شاهد القبر", voteDetailSectionTitle: 'تفاصيل التصويت', voteCommentsLabel: 'التعليقات', voteCommentsForumButton: 'فتح النقاش', @@ -1601,7 +1327,6 @@ module.exports = { voteNewCommentButton: 'نشر التعليق', voteNewCommentLabel: 'إضافة تعليق', cvTitle: "السيرة الذاتية", - cvLabel: "السيرة الذاتية (CV)", cvEditSectionTitle: "تعديل السيرة الذاتية", cvCreateSectionTitle: "إنشاء سيرة ذاتية", cvDescription: "إدارة ومشاركة مهاراتك ومعلوماتك المهنية.", @@ -1620,19 +1345,16 @@ module.exports = { cvLocationLabel: "الموقع", cvStatusLabel: "الحالة", cvPreferencesLabel: "التفضيلات", - cvOasisContributorLabel: "مساهم في Oasis", cvPersonal: "شخصي", cvOasis: "مساهم في Oasis (اختياري)", - cvOasisContributorView: "مساهمة في Oasis", + cvOasisContributorView: "المساهمة", cvEducational: "تعليمي (اختياري)", cvEducationalView: "تعليمي", cvProfessional: "مهني (اختياري)", cvProfessionalView: "مهني", cvAvailability: "التوفر (اختياري)", - cvAvailabilityView: "التوفر", cvUpdateButton: "تحديث", cvCreateButton: "إنشاء سيرة ذاتية", - cvContactLabel: "التواصل", cvCreatedAt: "أُنشئ في", cvUpdatedAt: "تم التحديث في", cvEditButton: "تحديث", @@ -1641,8 +1363,103 @@ module.exports = { blogSubject: "الموضوع", blogMessage: "الرسالة", blogImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + blogMedia: "المرفقات (حتى 8 صور ومقطع فيديو)", blogPublish: "معاينة", - noPopularMessages: "لم تُنشر رسائل شائعة بعد", + pollsTitle: "الاستطلاعات", + dataTitle: "التطابقات", + dataDescription: "استكشف تطابقات شبكتك وشاهدها.", + dataFilterAll: "الكل", + dataFilterMine: "بياناتي", + dataFilterRecent: "الأحدث", + dataFilterTop: "الأعلى", + dataKindInhabitants: "السكان", + dataKindJobs: "الوظائف", + dataKindProjects: "المشاريع", + dataKindEvents: "الفعاليات", + dataKindTribes: "القبائل", + dataKindMarket: "السوق", + dataKindHousing: "السكن", + dataKindIndustry: "الصناعة", + dataKindTasks: "المهام", + dataKindReports: "التقارير", + dataKindVotes: "التصويتات", + dataSearchPlaceholder: "ابحث في البيانات المتقاطعة...", + dataCohesionTitle: "معامل التماسك (CC)", + dataCcShort: "CC", + dataCohesionHint: "متوسط التقارب بين كل ما نشرته الشبكة.", + dataAffinity: "التوافق", + dataCommonTerms: "كلمة مفتاحية", + dataStatPeople: "السير الذاتية", + dataStatConnected: "متصلون", + dataStatSkills: "المهارات", + dataBestMatch: "أفضل تطابق", + dataStatIsolated: "معزولون", + dataStatEntities: "الكيانات المقارَنة", + dataStatTerms: "مصطلحات مختلفة", + dataStatPairs: "الأزواج المرتبطة", + dataMatchesTitle: "التطابقات", + dataMatchesHint: "اقتراحات مخصصة من الخوارزم.", + dataTermsTitle: "الكلمات المفتاحية", + dataTermsHint: "المصطلحات التي تظهر في أكثر المحتويات.", + dataConnections: "تطابقات مرتبطة", + dataTopicTitle: "كل ما يتعلق بـ", + dataTopicHint: "ما يربطه الخوارزم بهذا الموضوع", + dataNoMatches: "لا توجد بيانات متقاطعة لعرضها.", + dataNoProfile: "انشر محتوى أو اكتب سيرتك الذاتية ليتعلم الخوارزم ما يهمك.", + pollsDescription: "وحدة لسؤال الشبكة وعدّ الإجابات.", + pollFilterAll: "الكل", + pollFilterMine: "استطلاعاتي", + pollFilterRecent: "الأحدث", + pollFilterTop: "الأعلى", + pollFilterVoted: "صوّتت", + pollFilterOpen: "مفتوحة", + pollFilterClosed: "مغلقة", + pollCreateButton: "إنشاء استطلاع", + pollCreateTitle: "إنشاء استطلاع", + pollEditTitle: "تعديل الاستطلاع", + pollQuestion: "السؤال", + pollQuestionPlaceholder: "ماذا تريد أن تسأل؟", + pollOptions: "الخيارات (خيار في كل سطر)", + pollOutcome: "النتيجة", + pollNoVotesYet: "لا أصوات بعد", + pollTie: "تعادل", + pollOptionsPlaceholder: "الساحة\nالحديقة\nالمقهى", + pollAnonymous: "مجهول", + pollAnonymousLabel: "استطلاع مجهول", + pollMultiple: "اختيار متعدد", + pollMultipleLabel: "السماح بعدة إجابات", + pollDeadline: "الموعد النهائي", + pollTags: "الوسوم", + pollPublishButton: "نشر الاستطلاع", + pollUpdateButton: "تحديث", + pollCloseButton: "إغلاق", + pollDeleteButton: "حذف", + pollVoteButton: "صوّت", + pollChangeVote: "تغيير الصوت", + pollVoters: "المصوّتون", + pollComments: "التعليقات", + pollStatusLabel: "الحالة", + pollStatusOpen: "مفتوح", + pollStatusClosed: "مغلق", + pollSearchPlaceholder: "ابحث في الاستطلاعات...", + pollsNoItems: "لم يتم العثور على استطلاعات.", + viewPoll: "عرض الاستطلاع", + pollChatCreate: "إنشاء استطلاع", + pollInChat: "استطلاع", + blogTitle: "المدونات", + blogDescription: "وحدة لاكتشاف المدونات وإدارتها.", + blogFilterAll: "الكل", + blogFilterMine: "مدوناتي", + blogFilterRecent: "الأحدث", + blogFilterFavorites: "المفضلة", + blogFilterTop: "الأعلى", + blogCreateButton: "إنشاء مدونة", + blogSearchPlaceholder: "ابحث في المدونات...", + blogComments: "التعليقات", + blogAllowComments: "السماح بالتعليقات", + blogCommentsClosed: "أغلق الكاتب التعليقات على هذه المدونة.", + blogNoItems: "لم يتم العثور على مدونات.", + viewBlog: "عرض المدونة", forumTitle: "المنتديات", forumCategoryLabel: "الفئة", forumTitleLabel: "العنوان", @@ -1650,43 +1467,22 @@ module.exports = { forumCreateButton: "إنشاء منتدى", forumCreateSectionTitle: "إنشاء منتدى", forumDescription: "تحدث بصراحة مع السكان الآخرين في شبكتك.", + forumSearchPlaceholder: "ابحث في المنتدى...", forumFilterAll: "الكل", forumFilterMine: "خاصتي", forumFilterRecent: "الأخيرة", forumFilterTop: "الأفضل", - forumMineSectionTitle: "منتدياتك", - forumRecentSectionTitle: "المنتديات الأخيرة", - forumAllSectionTitle: "المنتديات", forumDeleteButton: "حذف", forumParticipants: "المشاركون", forumMessages: "الرسائل", - forumLastMessage: "آخر رسالة", forumMessageLabel: "الرسالة", forumMessagePlaceholder: "اكتب رسالتك...", forumSendButton: "إرسال", - forumVisitForum: "زيارة المنتدى", noForums: "لم يتم العثور على منتديات.", - forumVisitButton: "زيارة المنتدى", - forumCatGENERAL: "عام", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "سياسة", - forumCatTECH: "تقنية", - forumCatSCIENCE: "علوم", - forumCatMUSIC: "موسيقى", - forumCatART: "فن", - forumCatGAMING: "ألعاب", - forumCatBOOKS: "كتب", - forumCatFILMS: "أفلام", - forumCatPHILOSOPHY: "فلسفة", - forumCatSOCIETY: "مجتمع", - forumCatPRIVACY: "خصوصية", - forumCatCYBERWARFARE: "حرب سيبرانية", - forumCatSURVIVALISM: "البقائية", + forumVisitButton: "عرض المنتدى", + forumTopicLabel: "الموضوع", imageTitle: "الصور", imageDescription: "استكشف وأدِر محتوى الصور في شبكتك.", - imagePluginTitle: "العنوان", - imagePluginDescription: "الوصف", imageMineSectionTitle: "صورك", imageCreateSectionTitle: "رفع صورة", imageUpdateSectionTitle: "تحديث الصورة", @@ -1695,14 +1491,12 @@ module.exports = { imageTopSectionTitle: "أفضل الصور", imageFavoritesSectionTitle: "المفضلة", imageGallerySectionTitle: "المعرض", - imageMemeSectionTitle: "ميمز", imageFilterAll: "الكل", imageFilterMine: "خاصتي", imageFilterRecent: "الأخيرة", imageFilterTop: "الأفضل", imageFilterFavorites: "المفضلة", imageFilterGallery: "المعرض", - imageFilterMeme: "ميمز", imageCreateButton: "رفع صورة", imageUpdateButton: "تحديث", imageDeleteButton: "حذف", @@ -1715,7 +1509,6 @@ module.exports = { imageTitlePlaceholder: "اختياري", imageDescriptionLabel: "الوصف", imageDescriptionPlaceholder: "اختياري", - imageMemeLabel: "تعيين كميم", imageNoFile: "لم يتم تقديم ملف صورة", noImages: "لا توجد صور متاحة.", imageSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف، مؤلف...", @@ -1723,7 +1516,6 @@ module.exports = { imageSortOldest: "الأقدم", imageSortTop: "الأكثر تصويتًا", imageSearchButton: "بحث", - imageMessageAuthorButton: "رسالة", imageUpdatedAt: "تم التحديث", imageNoMatch: "لا توجد صور تطابق بحثك.", feedTitle: "التغذية", @@ -1731,7 +1523,6 @@ module.exports = { createFeedButton: "أرسل التغذية!", feedPlaceholder: "ماذا يحدث؟ (280 حرفًا كحد أقصى)", TODAYButton: "اليوم", - CREATEButton: "إنشاء تغذية", totalOpinions: "إجمالي الآراء", moreVoted: "الأكثر تصويتًا", noFeedsFound: "لم يتم العثور على تغذيات.", @@ -1754,20 +1545,12 @@ module.exports = { concept: "المفهوم", description: "الوصف", meme: "ميم", - activityContact: "جهة اتصال", - activityBy: "الاسم", - activityPixelia: "تمت إضافة بكسل جديد", - viewImage: "عرض الصورة", - playAudio: "تشغيل الصوت", - playVideo: "تشغيل الفيديو", typeRecent: "الأخيرة", - errorActivity: "خطأ في استرجاع النشاط", + typeTop: "الأعلى", typePost: "مدونات", - recentButton: "الأحدث", typeTribe: "القبائل", typeLarp: "L.A.R.P.", typeInhabitants: "السكان", - activityProfileUpdated: "حدّث ملفه الشخصي", typeAbout: "السكان", typeCurriculum: "السير الذاتية", typeImage: "الصور", @@ -1811,8 +1594,6 @@ module.exports = { typeCourtsSettlementAccepted: "المحاكم · تسوية مقبولة", typeCourtsNomination: "المحاكم · ترشيح", typeCourtsNominationVote: "المحاكم · تصويت ترشيح", - activitySupport: "تحالف جديد أُقيم", - activityJoin: "تم الانضمام إلى PUB جديد", question: "السؤال", deadline: "الموعد النهائي", status: "الحالة", @@ -1826,12 +1607,8 @@ module.exports = { date: "التاريخ", category: "الفئة", attendees: "الحاضرون", - activitySpread: "->", - visitLink: "زيارة الرابط", - viewDocument: "عرض المستند", location: "الموقع", contentWarning: "الموضوع", - personName: "اسم الساكن", bankWalletConnected: "محفظة ECOin", bankUbiReceived: "تم استلام الدخل الأساسي", bankTx: "معاملة", @@ -1841,7 +1618,6 @@ module.exports = { link: "رابط", activityProjectFollow: "%OASIS% الآن %ACTION% هذا المشروع %PROJECT%", activityProjectUnfollow: "%OASIS% الآن %ACTION% هذا المشروع %PROJECT%", - activityProjectPledged: "%OASIS% قد %ACTION% %AMOUNT% للمشروع %PROJECT%", following: "يتابع", unfollowing: "ألغى المتابعة", pledged: "تبرع", @@ -1887,26 +1663,17 @@ module.exports = { courtsVotesSlashTotal: "نعم/الإجمالي", courtsOpenVote: "تصويت مفتوح", courtsAnswerTitle: "الرد", - courtsStanceADMIT: "اعتراف", - courtsStanceDENY: "إنكار", - courtsStancePARTIAL: "جزئي", - courtsStanceCOUNTERCLAIM: "دعوى مضادة", - courtsStanceNEUTRAL: "محايد", courtsVerdictResult: "النتيجة", courtsVerdictOrders: "الأوامر", courtsSettlementText: "التسوية", courtsSettlementAccepted: "مقبولة", - courtsSettlementPending: "معلّقة", courtsJudge: "القاضي", courtsThSupports: "الداعمون", courtsFilterOpenCase: 'فتح قضية', - courtsEvidenceFileLabel: 'ملف الدليل (صورة، صوت، فيديو أو PDF)', - courtsCaseMediators: 'الوسطاء', courtsCaseMediatorsPh: 'معرّفات Oasis للوسطاء، مفصولة بفاصلة', courtsMediatorsLabel: 'الوسطاء', courtsThCase: 'القضية', courtsThCreatedAt: 'تاريخ البدء', - courtsThActions: 'الإجراءات', courtsPublicPrefLabel: 'الظهور بعد الحل', courtsPublicPrefYes: 'أوافق على أن تكون هذه القضية علنية بالكامل', courtsPublicPrefNo: 'أفضل إبقاء التفاصيل خاصة', @@ -1914,8 +1681,11 @@ module.exports = { courtsMethodMEDIATION: 'وساطة', courtsNoCases: 'لا توجد قضايا.', reportsTitle: "التقارير", - reportsDescription: "إدارة وتتبع التقارير المتعلقة بالمشاكل والأخطاء والإساءات وتحذيرات المحتوى في شبكتك.", + reportsDescription: "أدر تقارير شبكتك وتابعها.", + reportsSearchPlaceholder: "ابحث عن البلاغات...", reportsFilterAll: "الكل", + reportsFilterRecent: "حديثة", + reportsFilterTop: "الأعلى", reportsFilterMine: "خاصتي", reportsFilterFeatures: "الميزات", reportsFilterBugs: "الأخطاء", @@ -1928,18 +1698,13 @@ module.exports = { reportsFilterInvalid: "غير صالح", reportsCreateButton: "إنشاء تقرير", reportsTitleLabel: "العنوان", - reportsDescriptionLabel: "الوصف", - reportsDescriptionPlaceholder: "يرجى تقديم وصف مفصّل.", reportsCategory: "الفئة", - reportsCategoryLabel: "الفئة", reportsCategoryFeatures: "الميزات", reportsCategoryBugs: "الأخطاء", reportsCategoryAbuse: "الإساءة", - reportsCategoryContent: "مشاكل المحتوى", + reportsCategoryContent: "المحتوى", reportsUpdateButton: "تحديث", reportsDeleteButton: "حذف", - reportsDateLabel: "التاريخ", - reportsUploadFile: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", reportsMineSectionTitle: "تقاريرك", reportsFeaturesSectionTitle: "طلبات الميزات", reportsBugsSectionTitle: "الأخطاء", @@ -1947,11 +1712,6 @@ module.exports = { reportsContentSectionTitle: "مشاكل المحتوى", reportsAllSectionTitle: "التقارير", reportsNoItems: "لا توجد تقارير متاحة.", - reportsValidationTitle: "يرجى إدخال عنوان صالح.", - reportsValidationDescription: "لا يمكن أن يكون الوصف فارغًا.", - reportsValidationCategory: "يرجى اختيار فئة.", - reportsCreatedAt: "أُنشئ في", - reportsCreatedBy: "بواسطة", reportsSeverity: "الخطورة", reportsSeverityLow: "منخفضة", reportsSeverityMedium: "متوسطة", @@ -1962,9 +1722,6 @@ module.exports = { reportsStatusUnderReview: "قيد المراجعة", reportsStatusResolved: "محلول", reportsStatusInvalid: "غير صالح", - reportsUpdateStatusButton: "تحديث الحالة", - reportsAnonymityOption: "إرسال بشكل مجهول", - reportsAnonymousAuthor: "مجهول", reportsConfirmButton: "تأكيد التقرير!", reportsConfirmations: "التأكيدات", reportsConfirmedSectionTitle: "التقارير المؤكدة", @@ -2012,6 +1769,20 @@ module.exports = { reportsRequestedActionLabel: 'الإجراء المطلوب', reportsRequestedActionPlaceholder: 'إزالة، إخفاء، وسم، تحذير، إلخ.', tribesTitle: "القبائل", + tribeFilterAll: "الكل", + tribeFilterRecent: "الأحدث", + tribeFilterMine: "لي", + tribeFilterMembership: "العضوية", + tribeFilterSubtribes: "القبائل الفرعية", + tribeFilterTop: "الأعلى", + tribeFilterGallery: "المعرض", + tribeFeedFilterTOP: "الأعلى", + tribeFeedFilterMINE: "لي", + tribeFeedFilterALL: "الكل", + tribeFeedFilterRECENT: "الأحدث", + courtsStanceDENY: "إنكار", + courtsStanceADMIT: "إقرار", + courtsStancePARTIAL: "إقرار جزئي", tribeAllSectionTitle: "القبائل", tribeMineSectionTitle: "قبائلك", tribeCreateSectionTitle: "إنشاء قبيلة", @@ -2023,13 +1794,6 @@ module.exports = { tribeviewSubTribeButton: "زيارة القبيلة الفرعية", tribeRootLabel: "الجذر", tribeDescription: "استكشف أو أنشئ قبائل في شبكتك.", - tribeFilterAll: "الكل", - tribeFilterMine: "خاصتي", - tribeFilterMembership: "العضوية", - tribeFilterRecent: "الأخيرة", - tribeFilterTop: "الأفضل", - tribeFilterSubtribes: "القبائل الفرعية", - tribeFilterGallery: "المعرض", tribeMainTribeLabel: "القبيلة الرئيسية", tribeCreateButton: "إنشاء قبيلة", tribeUpdateButton: "تحديث", @@ -2048,13 +1812,8 @@ module.exports = { tribeModeLabel: "الوضع", tribeIsAnonymousLabel: "الحالة", tribeMembersCount: "الأعضاء", - tribeInviteCodePlaceholder: "أدخل رمز الدعوة", - tribeJoinByCodeButton: "الانضمام بالرمز", - tribeJoinButton: "انضمام", tribeEnterInvite: "إدخال الرمز", tribeLeaveButton: "مغادرة", - tribeYes: "نعم", - tribeNo: "لا", tribePublic: "عامة", tribePrivate: "خاصة", tribeGenerateInvite: "دعوة فردية", @@ -2063,13 +1822,8 @@ module.exports = { tribeRemoveInvitation: "إزالة الدعوة", tribeCreatedAt: "أُنشئت في", tribeAuthor: "بواسطة", - tribeAuthorLabel: "المؤلف", tribeStrict: "صارم", tribeOpen: "مفتوح", - tribeFeedFilterRECENT: "الأخيرة", - tribeFeedFilterMINE: "خاصتي", - tribeFeedFilterALL: "الكل", - tribeFeedFilterTOP: "الأفضل", tribeFeedRefeeds: "إعادات النشر", tribeFeedRefeed: "إعادة نشر", tribeFeedMessagePlaceholder: "اكتب تغذية…", @@ -2079,17 +1833,12 @@ module.exports = { tribeNotFound: "لم يتم العثور على القبيلة!", createTribeTitle: "إنشاء قبيلة", updateTribeTitle: "تحديث القبيلة", - tribeSectionOverview: "نظرة عامة", tribeSectionInhabitants: "السكان", tribeSectionVotations: "التصويتات", tribeSectionEvents: "الأحداث", - tribeSectionReports: "التقارير", tribeSectionTasks: "المهام", tribeSectionFeed: "التغذية", tribeSectionForum: "المنتدى", - tribeSectionMarket: "السوق", - tribeSectionJobs: "الوظائف", - tribeSectionProjects: "المشاريع", tribeSectionMedia: "الوسائط", tribeSectionImages: "الصور", tribeSectionAudios: "الملفات الصوتية", @@ -2127,11 +1876,6 @@ module.exports = { tribeTaskStatusClosed: "إغلاق", tribeTaskAssign: "إسناد", tribeTaskUnassign: "إلغاء الإسناد", - tribeReportCreate: "إنشاء تقرير", - tribeReportsEmpty: "لا توجد تقارير بعد.", - tribeReportTitle: "العنوان", - tribeReportDescription: "الوصف", - tribeReportCategory: "الفئة", tribeVotationCreate: "إنشاء تصويت", tribeVotationsEmpty: "لا توجد تصويتات بعد.", tribeVotationTitle: "العنوان", @@ -2149,27 +1893,6 @@ module.exports = { tribeForumCategory: "الفئة", tribeForumReply: "رد", tribeForumReplies: "الردود", - tribeMarketCreate: "إنشاء عرض", - tribeMarketEmpty: "لا توجد عروض بعد.", - tribeMarketTitle: "العنوان", - tribeMarketDescription: "الوصف", - tribeMarketPrice: "السعر", - tribeMarketImage: "الصورة", - tribeMarketCategory: "الفئة", - tribeJobCreate: "إنشاء وظيفة", - tribeJobsEmpty: "لا توجد وظائف بعد.", - tribeJobTitle: "العنوان", - tribeJobDescription: "الوصف", - tribeJobLocation: "الموقع", - tribeJobSalary: "الراتب", - tribeJobDeadline: "الموعد النهائي", - tribeProjectCreate: "إنشاء مشروع", - tribeProjectsEmpty: "لا توجد مشاريع بعد.", - tribeProjectTitle: "العنوان", - tribeProjectDescription: "الوصف", - tribeProjectGoal: "الهدف", - tribeProjectFunded: "مُموَّل", - tribeProjectDeadline: "الموعد النهائي", tribeMediaUpload: "رفع وسائط", readDocument: "قراءة المستند", tribeCreateImage: "إنشاء صورة", @@ -2180,7 +1903,6 @@ module.exports = { tribeMediaEmpty: "لا توجد وسائط بعد.", tribeMediaTitle: "العنوان", tribeMediaDescription: "الوصف", - tribeMediaType: "النوع", tribeMediaTypeImage: "صورة", tribeMediaTypeVideo: "فيديو", tribeMediaTypeAudio: "صوت", @@ -2190,11 +1912,6 @@ module.exports = { tribeInviteCodeText: "رمز الدعوة: ", oasisVersionLabel: "إصدار Oasis", tribeInviteCodeHint: "شارك هذا الرمز مع من تريد دعوته. يمكنه الانضمام من /invites → Tribes.", - tribeGroupTribe: "القبيلة", - tribeGroupOffice: "المكتب", - tribeGroupNetwork: "الشبكة", - tribeGroupEconomy: "الاقتصاد", - tribeGroupMedia: "الوسائط", tribeStatusOpen: "مفتوح", tribeStatusClosed: "مغلق", tribeStatusInProgress: "قيد التنفيذ", @@ -2204,33 +1921,17 @@ module.exports = { tribePriorityCritical: "حرجة", tribeTaskFilterAll: "الكل", tribeMediaFilterAll: "الكل", - tribeReportCatBug: "خطأ", - tribeReportCatAbuse: "إساءة", - tribeReportCatContent: "محتوى", - tribeReportCatOther: "أخرى", tribeForumCatGeneral: "عام", tribeForumCatProposal: "اقتراح", tribeForumCatQuestion: "سؤال", tribeForumCatAnnouncement: "إعلان", - tribeMarketCatGoods: "سلع", - tribeMarketCatServices: "خدمات", - tribeMarketCatFood: "طعام", - tribeMarketCatOther: "أخرى", tribeStatusLabel: "الحالة", tribeSubTribes: "القبائل الفرعية", tribeSubTribesCreate: "إنشاء قبيلة فرعية", tribeSubTribesStrictDenied: "الوضع الصارم للقبيلة لا يسمح لك بإنشاء قبائل فرعية جديدة. يرجى الاتصال بالمسؤول.", - tribeSubTribesEmpty: "لم يتم إنشاء قبائل فرعية بعد.", - tribeActivityJoined: "انضم", - tribeActivityLeft: "غادر", - tribeActivityFeed: "تغذية", tribeActivityRefeed: "إعادة نشر", - tribeGroupAnalytics: "التحليلات", - tribeGroupCreative: "إبداعي", tribeSectionActivity: "النشاط", tribeSectionTrending: "الرائج", - tribeSectionOpinions: "الآراء", - tribeSectionPixelia: "بكسيليا", tribeSectionTags: "الوسوم", tribeSectionSearch: "بحث", tribeActivityEmpty: "لا يوجد نشاط بعد.", @@ -2242,25 +1943,15 @@ module.exports = { tribeTrendingPeriodWeek: "هذا الأسبوع", tribeTrendingPeriodAll: "كل الأوقات", tribeTrendingEngagement: "التفاعل", - tribeOpinionsEmpty: "لا توجد آراء بعد.", - tribeOpinionsCast: "تصويت", - tribeOpinionsRankings: "الترتيب", - tribeOpinionsAlreadyVoted: "تم التصويت بالفعل", tribeTopCategory: "الأكثر تصويتًا", - tribePixeliaTitle: "بكسيليا", - tribePixeliaDescription: "لوحة فن بكسل تعاونية.", - tribePixeliaPaint: "رسم", - tribePixeliaContributors: "المساهمون", - tribePixeliaTotalPixels: "البكسلات المرسومة", tribeTagsEmpty: "لم يتم العثور على وسوم.", - tribeTagsCloud: "سحابة الوسوم", - tribeTagsContentWith: "محتوى بالوسم", tribeSearchPlaceholder: "ابحث في محتوى القبيلة...", tribeSearchEmpty: "لم يتم العثور على نتائج.", tribeSearchResults: "النتائج", tribeSearchMinChars: "أدخل حرفين على الأقل للبحث.", agendaTitle: "الأجندة", agendaDescription: "هنا يمكنك العثور على جميع العناصر المسندة إليك.", + agendaSearchPlaceholder: "ابحث في جدول الأعمال...", agendaFilterAll: "الكل", agendaFilterToday: "اليوم", agendaFilterUpcoming: "القادمة", @@ -2279,20 +1970,9 @@ module.exports = { agendaFilterProjects: "المشاريع", agendaFilterCalendars: "التقويمات", agendaNoItems: "لم يتم العثور على إسنادات.", - agendaAuthor: "بواسطة", agendaDiscardButton: "تجاهل", agendaRestoreButton: "استعادة", - agendaCreatedAt: "أُنشئ في", - agendaTitleLabel: "العنوان", agendaMembersCount: "الأعضاء", - agendaDescriptionLabel: "الوصف", - agendaStatus: "الحالة", - agendaVisibility: "الظهور", - agendaEventDate: "تاريخ الحدث", - agendaEventLocation: "الموقع", - agendaEventPrice: "السعر", - agendaEventUrl: "الرابط", - agendaTaskStart: "وقت البدء", agendaLocationLabel: "الموقع", agendaYes: "نعم", agendaNo: "لا", @@ -2302,11 +1982,6 @@ module.exports = { agendareportCategory: "الفئة", agendareportSeverity: "الخطورة", agendareportStatus: "الحالة", - agendareportDescription: "الوصف", - agendaTaskEnd: "وقت الانتهاء", - agendaTaskPriority: "الأولوية", - agendaTransferFrom: "من", - agendaTransferTo: "إلى", agendaTransferConcept: "المفهوم", agendaTransferAmount: "المبلغ", agendaTransferDeadline: "الموعد النهائي", @@ -2316,47 +1991,7 @@ module.exports = { voteNow: "صوّت الآن", alreadyVoted: "لقد أبديت رأيك بالفعل.", noOpinionsFound: "لم يتم العثور على آراء.", - RECENTButton: "الأخيرة", TOPButton: "الأفضل", - interestingButton: "مثير للاهتمام", - necessaryButton: "ضروري", - funnyButton: "مضحك", - disgustingButton: "مقزز", - sensibleButton: "حساس", - propagandaButton: "دعاية", - adultOnlyButton: "للبالغين فقط", - boringButton: "ممل", - confusingButton: "مربك", - usefulButton: "مفيد", - informativeButton: "إعلامي", - wellResearchedButton: "بحث جيد", - accurateButton: "دقيق", - needsSourcesButton: "يحتاج مصادر", - wrongButton: "خاطئ", - lowQualityButton: "جودة منخفضة", - creativeButton: "إبداعي", - insightfulButton: "ثاقب", - actionableButton: "قابل للتنفيذ", - inspiringButton: "ملهم", - loveButton: "حب", - clearButton: "واضح", - upliftingButton: "مُحفّز", - unnecessaryButton: "غير ضروري", - rejectedButton: "مرفوض", - misleadingButton: "مضلل", - offTopicButton: "خارج الموضوع", - duplicateButton: "مكرر", - clickbaitButton: "طُعم نقرات", - spamButton: "رسائل مزعجة", - trollButton: "تصيّد", - nsfwButton: "NSFW", - violentButton: "عنيف", - toxicButton: "سام", - harassmentButton: "تحرش", - hateButton: "كراهية", - scamButton: "احتيال", - triggeringButton: "مُحفّز سلبيًا", - opinionsCreatedAt: "أُنشئ في", opinionsTotalCount: "إجمالي الآراء", voteInteresting: "مثير للاهتمام", voteNecessary: "ضروري", @@ -2393,7 +2028,6 @@ module.exports = { voteCreative: "إبداعي", voteSpam: "رسائل مزعجة", voteAdultOnly: "للبالغين فقط", - publishBlog: "نشر مدونة", privateMessage: "رسالة خاصة", pmSendTitle: "الرسائل الخاصة", pmSend: "إرسال!", @@ -2404,7 +2038,6 @@ module.exports = { pmComposeTitle: "إرسال رسالة", pmRecipients: "المستلمون", pmRecipientsHint: "أدخل معرّفات Oasis مفصولة بفواصل", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "حتى 7 مستلمين لكل رسالة.", pmTextPlaceholder: "النص محدود بـ 7000 حرفًا.", pmSubject: "الموضوع", @@ -2428,7 +2061,6 @@ module.exports = { pmCrypterCharsLabel: "حرفًا", pmInvalidRecipients: "معرّف Oasis غير صالح (يجب أن يكون بالشكل @…=.ed25519).", pmEncryptionLabel: "التشفير", - pmFile: "المرفق", private: "خاص", privateDescription: "رسائلك المشفرة.", privateInbox: "الوارد", @@ -2438,10 +2070,8 @@ module.exports = { noPrivateMessages: "لا توجد رسائل خاصة.", pmFromLabel: "من:", pmToLabel: "إلى:", - pmInvalidMessage: "رسالة غير صالحة", pmNoSubject: "(بدون موضوع)", pmSubjectLabel: "الموضوع:", - pmBodyLabel: "النص", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2459,8 +2089,6 @@ module.exports = { inboxJobSubscribedTitle: "اشتراك جديد في عرض عملك", pmInhabitantWithId: "ساكن بمعرّف OASIS:", pmHasSubscribedToYourJobOffer: "اشترك في عرض عملك", - inboxProjectCreatedTitle: "تم إنشاء مشروع جديد", - pmHasCreatedAProject: "أنشأ مشروعًا", inboxMarketItemSoldTitle: "تم بيع عنصر", inboxShopSoldTitle: "تم بيع المنتج", pmYourItem: "عنصرك", @@ -2470,7 +2098,6 @@ module.exports = { pmHasPledged: "تبرع بـ", pmToYourProject: "لمشروعك", blockchain: 'مستكشف الكتل', - blockchainTitle: 'مستكشف الكتل', blockchainDescription: 'استكشف وتصوّر الكتل في البلوكتشين.', blockchainNoBlocks: 'لم يتم العثور على كتل في البلوكتشين.', blockchainStatsTitle: 'الإحصاءات', @@ -2482,19 +2109,17 @@ module.exports = { blockchainBlockCarbon: 'البصمة الكربونية', blockchainBlockType: 'النوع', blockchainBlockTimestamp: 'الطابع الزمني', - blockchainBlockContent: 'الكتلة', - blockchainBlockURL: 'الرابط:', - blockchainContent: 'الكتلة', - blockchainContentPreview: 'معاينة محتوى الكتلة', blockchainLatestDatagram: 'آخر بيانات', - blockchainDatagram: 'البيانات', - blockchainDetails: 'عرض تفاصيل الكتلة', - blockchainViewBlockexplorer: "عرض في مستكشف الكتل", - blockchainBlockInfo: 'معلومات الكتلة', - blockchainBlockDetails: 'تفاصيل الكتلة المحددة', + blockchainDatagram: "مخطط البيانات", + blockchainDetails: "عرض تفاصيل الكتلة", + blockchainViewBlockexplorer: "العرض في Blockexplorer", blockchainBack: 'العودة إلى مستكشف الكتل', blockchainContentDeleted: "تم حذف هذا المحتوى", visitContent: "زيارة المحتوى", + favoriteAdd: "تثبيت في المفضلة", + pmContentTooltip: "إرسال رسالة خاصة", + favoriteRemove: "إزالة من المفضلة", + reportContent: "الإبلاغ عن المحتوى", banking: 'المصرفية', bankingTitle: 'المصرفية', bankingDescription: "اقتصاد ECOin: الرصيد، الدخل الأساسي، الضرائب وقيمة الصناعة.", @@ -2503,21 +2128,17 @@ module.exports = { bankRules: 'القواعد', pending: 'معلّق', closed: 'مغلق', - bankBack: 'العودة إلى المصرفية', bankViewTx: 'عرض المعاملة', bankClaimNow: 'طالب الآن', bankClaimUBI: 'طالب بـ UBI!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'لا توجد تخصيصات UBI معلقة لهذه الحقبة.', bankEpoch: 'الحقبة', bankPool: 'المجمع (هذه الحقبة)', bankWeightsSum: 'مجموع الأوزان', - bankAllocations: 'التخصيصات', bankNoAllocations: 'لم يتم العثور على تخصيصات.', bankNoEpochs: 'لم يتم العثور على حقب.', bankEpochAllocations: 'تخصيصات الحقبة', @@ -2536,9 +2157,6 @@ module.exports = { bankYourFundsMonth: "أموالك (هذا الشهر)", bankIndustryBalance: "الإنتاج الصناعي (تقديري)", bankUserBalance: 'رصيدك', - ecoWalletNotConfigured: 'محفظة ECOin غير مُعدّة', - editWallet: 'تعديل المحفظة', - addWallet: 'إضافة محفظة', bankAddresses: 'العناوين', bankNoAddresses: 'لم يتم العثور على عناوين.', bankUser: 'معرّف Oasis', @@ -2563,15 +2181,7 @@ module.exports = { search: 'ابحث!', bankLocal: 'محلي', bankFromOasis: 'Oasis', - bankMyAddress: 'عنوانك', - bankRemoveMyAddress: 'إزالة عنواني', - bankNotRemovableOasis: 'لا يمكن إزالة العناوين محليًا', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "لا توجد أموال!", bankUbiAvailableOk: "متوفر!", bankUbiAvailability: "الدخل الأساسي (الشبكة)", @@ -2588,13 +2198,6 @@ module.exports = { shopsTitle: "متاجر", shopDescription: "اكتشف وأدر المتاجر في الشبكة.", shopTitle: "متجر", - shopFilterAll: "الكل", - shopFilterMine: "متاجري", - shopFilterRecent: "الأحدث", - shopFilterTop: "الأفضل", - shopFilterProducts: "المنتجات", - shopFilterPrices: "الأسعار", - shopFilterFavorites: "المفضلة", shopUpload: "إنشاء متجر", shopAllSectionTitle: "جميع المتاجر", shopMineSectionTitle: "متاجري", @@ -2611,16 +2214,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "النشر على Clearnet", - shopClearnetUnpublish: "إلغاء النشر من Clearnet", - shopClearnetUrlLabel: "رابط Clearnet", - shopClearnetWarning: "النشر على Clearnet يجعل هذا المتجر قابلاً للفهرسة بواسطة محركات البحث والزواحف الخارجية.", shopAddFavorite: "إضافة مفضلة", shopRemoveFavorite: "إزالة مفضلة", shopOpen: "مفتوح", shopClosed: "مغلق", - shopOpenShop: "فتح المتجر", - shopCloseShop: "إغلاق المتجر", shopMakePrivate: "جعلها خاصة (E2E)", shopMakePublic: "جعلها عامة", shopProducts: "المنتجات", @@ -2648,8 +2245,6 @@ module.exports = { shopOrderPrice: "السعر", shopOrderBuyer: "المشتري", shopBackToShop: "العودة إلى المتجر", - shopShareUrl: "رابط المشاركة", - shopVisitShop: "زيارة المتجر", marketVisitItem: "زيارة العنصر", shopStatus: "الحالة", shopCreatedAt: "تاريخ الإنشاء", @@ -2658,12 +2253,10 @@ module.exports = { shopLocation: "الموقع", shopTags: "الوسوم", shopVisibility: "الرؤية", - shopImage: "صورة", shopShortDescription: "وصف قصير", shopShortDescriptionPlaceholder: "وصف مختصر لبطاقات المتجر (160 حرف كحد أقصى)", shopTitlePlaceholder: "اسم متجرك", shopDescriptionPlaceholder: "وصف تفصيلي لمتجرك", - shopUrlPlaceholder: "https://رابط-متجرك.com", shopLocationPlaceholder: "المدينة، البلد", shopTagsPlaceholder: "وسم1، وسم2، وسم3", mapTitlePlaceholder: "عنوان الخريطة", @@ -2681,7 +2274,6 @@ module.exports = { bankUnitMinutes: "دقائق", bankUnitDays: "أيام", bankExchangeNoData: 'لا توجد بيانات متاحة', - bankExchangeIndex: 'قيمة ECOin (1 ساعة)', bankInflation: 'تضخم ECOin (anual)', bankInflationMonthly: 'تضخم ECOin (mensual)', bankExchangeChartTitle: 'تطور قيمة ECOin عبر الزمن', @@ -2695,38 +2287,17 @@ module.exports = { bankingSyncStatusOutdated: 'قديم', statsTitle: 'الإحصائيات', statistics: "الإحصائيات", - statsInhabitant: "إحصائيات الساكن", statsDescription: "اكتشف إحصائيات عن شبكتك.", ALLButton: "الكل", MINEButton: "خاصتي", TOMBSTONEButton: "شواهد القبور", - statsYou: "أنت", - statsUserId: "معرّف Oasis", statsCreatedAt: "أُنشئ في", statsYourContent: "المحتوى", statsYourOpinions: "الآراء", - statsYourTombstone: "شواهد القبور", - statsNetwork: "الشبكة", - statsTotalInhabitants: "السكان", - statsDiscoveredTribes: "القبائل (العامة)", - statsPrivateDiscoveredTribes: "القبائل (الخاصة)", statsNetworkContent: "المحتوى", - statsYourMarket: "السوق", - statsYourJob: "الوظائف", - statsYourProject: "المشاريع", - statsYourTransfer: "التحويلات", - statsYourForum: "المنتديات", statsNetworkOpinions: "الآراء", - statsDiscoveredMarket: "السوق", - statsDiscoveredJob: "الوظائف", - statsDiscoveredProject: "المشاريع", - statsBankingTitle: "المصرفية", statsEcoWalletLabel: "محفظة ECOIN", statsEcoWalletNotConfigured: "غير مُعدّة!", - statsTotalEcoAddresses: "إجمالي العناوين", - statsDiscoveredTransfer: "التحويلات", - statsDiscoveredForum: "المنتديات", - statsNetworkTombstone: "شواهد القبور", statsBookmark: "العلامات المرجعية", statsEvent: "الأحداث", statsTask: "المهام", @@ -2748,16 +2319,12 @@ module.exports = { statsAiExchange: "الذكاء الاصطناعي", statsPUBs: 'PUBs', statsPost: "المنشورات", - statsOasisID: "معرّف Oasis", statsSize: "الإجمالي (الحجم)", statsBlockchainSize: "البلوكتشين (الحجم)", statsBlobsSize: "الملفات (الحجم)", statsActivity7d: "النشاط (آخر 7 أيام)", statsActivity7dTotal: "إجمالي 7 أيام", statsActivity30dTotal: "إجمالي 30 يومًا", - statsKarmaScore: "نقاط الكارما", - statsPublic: "عام", - statsPrivate: "خاص", day: "يوم", messages: "الرسائل", statsProject: "المشاريع", @@ -2769,30 +2336,14 @@ module.exports = { statsProjectsCancelled: "ملغى", statsProjectsGoalTotal: "الهدف الإجمالي", statsProjectsPledgedTotal: "إجمالي التبرعات", - statsProjectsSuccessRate: "نسبة النجاح", - statsProjectsAvgProgress: "متوسط التقدم", - statsProjectsMedianProgress: "متوسط التقدم (الوسيط)", - statsProjectsActiveFundingAvg: "متوسط التمويل النشط", - statsJobsTitle: "الوظائف", - statsJobsTotal: "إجمالي الوظائف", - statsJobsOpen: "مفتوح", - statsJobsClosed: "مغلق", - statsJobsOpenVacants: "الشواغر المفتوحة", - statsJobsSubscribersTotal: "إجمالي المشتركين", - statsJobsAvgSalary: "متوسط الراتب", - statsJobsMedianSalary: "متوسط الراتب (الوسيط)", statsMarketTitle: "السوق", statsMarketTotal: "إجمالي العناصر", statsMarketForSale: "للبيع", statsMarketReserved: "محجوز", statsMarketClosed: "مغلق", statsMarketSold: "مُباع", - statsMarketRevenue: "الإيرادات", - statsMarketAvgSoldPrice: "متوسط سعر البيع", statsUsersTitle: "السكان", user: "ساكن", - statsTombstoneTitle: "شواهد القبور", - statsNetworkTombstones: "شواهد قبور الشبكة", statsTombstoneRatio: "نسبة شواهد القبور (%)", statsParliamentCandidature: "ترشيحات البرلمان", statsParliamentTerm: "فترات البرلمان", @@ -2819,30 +2370,21 @@ module.exports = { aiConfiguration: "تعيين التوجيه", aiPromptUsed: "التوجيه", aiClearHistory: "مسح سجل المحادثة", - aiSharePrompt: "إضافة هذه الإجابة للتدريب الجماعي؟", - aiShareYes: "نعم", - aiShareNo: "لا", - aiSharedLabel: "تمت الإضافة للتدريب", - aiRejectedLabel: "لم تتم الإضافة للتدريب", aiServerError: "لم يتمكن الذكاء الاصطناعي من الرد. يرجى المحاولة مرة أخرى.", aiInputPlaceholder: "ما هو Oasis؟", typeAiExchange: "الذكاء الاصطناعي", aiApproveTrain: "إضافة للتدريب الجماعي", aiRejectTrain: "عدم التدريب", - aiTrainPending: "بانتظار الموافقة", aiTrainApproved: "تمت الموافقة للتدريب", aiTrainRejected: "تم الرفض للتدريب", aiSnippetsUsed: "المقتطفات المُستخدَمة", aiSnippetsLearned: "المقتطفات المُتعلَّمة", statsAITraining: "تدريب الذكاء الاصطناعي", - aiApproveCustomTrain: "التدريب باستخدام هذه الإجابة المخصصة", aiCustomAnswerPlaceholder: "اكتب إجابتك المخصصة…", - statsAIExchanges: "تبادلات النموذج", marketMineSectionTitle: "عناصرك", marketCreateSectionTitle: "إنشاء عنصر", marketUpdateSectionTitle: "تحديث", marketAllSectionTitle: "السوق", - marketRecentSectionTitle: "السوق الأخير", marketTitle: "السوق", marketDescription: "سوق لتبادل السلع أو الخدمات في شبكتك.", marketFilterAll: "الكل", @@ -2872,14 +2414,11 @@ module.exports = { marketItemDeadline: "الموعد النهائي", marketItemIncludesShipping: "يشمل الشحن؟", marketItemHighestBid: "أعلى عرض", - marketItemHighestBidder: "صاحب أعلى عرض", marketItemStock: "المخزون", marketOutOfStock: "نفد المخزون", - marketItemBidTime: "وقت العرض", marketActionsUpdate: "تحديث", marketUpdateButton: "تحديث", marketActionsDelete: "حذف", - marketActionsSold: "تعيين كمُباع", marketActionsChangeStatus: "تغيير الحالة", marketActionsBuy: "شراء!", marketAuctionBids: "العروض الحالية", @@ -2888,21 +2427,17 @@ module.exports = { marketNoItems: "لا توجد عناصر متاحة بعد.", marketYourBid: "عرضك", marketCreateFormImageLabel: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", - marketSearchLabel: "بحث", marketSearchPlaceholder: "ابحث عن عنوان أو وسوم", marketMinPriceLabel: "الحد الأدنى للسعر", marketMaxPriceLabel: "الحد الأقصى للسعر", - marketSortLabel: "ترتيب حسب", marketSortRecent: "الأحدث", marketSortPrice: "السعر", marketSortDeadline: "الموعد النهائي", marketSearchButton: "بحث", marketAuctionEndsIn: "ينتهي", marketAuctionEnded: "انتهى", - marketMyBidBadge: "عرضتَ", marketNoItemsMatch: "لا توجد عناصر تطابق بحثك.", housingTitle: "السكن", - housingLabel: "السكن", housingDescriptionText: "اكتشف وأدر الأماكن في شبكتك.", modulesHousingLabel: "السكن", modulesHousingDescription: "وحدة لاكتشاف الأماكن وإدارتها.", @@ -2946,14 +2481,7 @@ module.exports = { housingAvailableFrom: "متاح من", housingAvailableTo: "متاح حتى", housingTags: "الوسوم", - housingImages: "الصور (الحد الأقصى: 50 ميغابايت لكل صورة)", - housingRemovePhoto: "إزالة", spreadEditWarning: "سيفقد هذا المحتوى نشراته بعد تعديله", - housingRemoveVideo: "إزالة الفيديو", - housingAddPhoto: "إضافة صورة", - housingAddVideo: "إضافة فيديو", - housingVideo: "فيديو (الحد الأقصى: 50 ميغابايت)", - housingPhotos: "الصور", housingRequests: "الطلبات", housingRequestButton: "طلب", housingCancelButton: "إلغاء الطلب", @@ -3022,7 +2550,6 @@ module.exports = { jobLocationPresencial: "حضوري", jobLocationRemote: "عن بُعد", jobVacantsPlaceholder: "عدد المناصب", - jobSalaryPlaceholder: "الراتب بـ ECO لساعة عمل واحدة", jobImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", jobTasks: "المهام", jobType: "نوع الوظيفة", @@ -3032,7 +2559,6 @@ module.exports = { jobsFilterTop: "الأفضل", jobsTopTitle: "الوظائف الأعلى راتبًا", createJobButton: "نشر الوظيفة", - viewDetailsButton: "عرض التفاصيل", noJobsFound: "لم يتم العثور على عروض وظيفية.", jobAuthor: "بواسطة", jobTypeFreelance: "مستقل", @@ -3044,10 +2570,6 @@ module.exports = { jobsHoursOffered: "الساعات المعروضة", jobsHoursRequested: "الساعات المطلوبة في المقابل", jobsExchangeSkill: "المهارة المطلوبة في المقابل", - jobsHoursOfferedPlaceholder: "مثال: 4", - jobsHoursRequestedPlaceholder: "مثال: 4", - jobsExchangeSkillPlaceholder: "مثال: النجارة، التصميم", - jobExchangeHint: "بالنسبة لوظائف تبادل الساعات، املأ الحقول أدناه بدلاً من الراتب.", jobTimePartial: "دوام جزئي", jobTimeComplete: "دوام كامل", jobsDeleteButton: "حذف", @@ -3055,28 +2577,17 @@ module.exports = { jobsFilterApplied: "مُتقدَّم", jobsAppliedTitle: "طلباتي", jobsAppliedBadge: "مُتقدَّم", - jobsFilterFavs: "المفضلة", - jobsFavsTitle: "المفضلة", - jobsFilterNeeds: "يحتاج مساعدة", - jobsNeedsTitle: "يحتاج مساعدة", - jobsSearchLabel: "بحث", jobsSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف...", jobsMinSalaryLabel: "الحد الأدنى للراتب", jobsMaxSalaryLabel: "الحد الأقصى للراتب", - jobsSortLabel: "ترتيب حسب", jobsSortRecent: "الأحدث", jobsSortSalary: "الأعلى راتبًا", jobsSortSubscribers: "الأكثر متقدمين", jobsSearchButton: "بحث", - jobsFavoriteButton: "إضافة للمفضلة", - jobsUnfavoriteButton: "إزالة من المفضلة", - jobsMessageAuthorButton: "رسالة خاصة", jobsApplicants: "المتقدمون", jobsUpdatedAt: "تم التحديث", jobSetOpen: "تعيين كمفتوح", - jobNewBadge: "جديد", jobsTagsLabel: "الوسوم", - jobsTagsPlaceholder: "وسم1، وسم2، وسم3", noJobsMatch: "لا توجد وظائف تطابق بحثك.", industrySearchPlaceholder: "ابحث عن المصانع…", industryAllSectors: "جميع القطاعات", @@ -3084,9 +2595,7 @@ module.exports = { industryAdvanceTo: "تعيين إلى", industryAmount: "المبلغ", industryApproveBuild: "الموافقة", - industryBackToFacility: "← المصنع", industryBlueprint: "مخطط", - industryBlueprintLabel: "مخطط صناعي", industryBlueprints: "مخططات", industryBuild: "بناء", industryBuildNotes: "ملاحظات", @@ -3099,18 +2608,13 @@ module.exports = { industryBuilds: "عمليات البناء", industryBuildTitle: "العنوان", industryContribute: "المساهمة", - industryContributeEco: "المساهمة بـ ECO", - industryContributeLabor: "المساهمة بالعمل", industryContributeButton: "ساهم", - industryContributeMaterial: "المساهمة بالمواد", industryContributions: "المساهمات", - industryContributors: "المساهمون", industryCreateBlueprintButton: "إنشاء مخطط", industryDistribute: "توزيع", industryDistributeButton: "التوزيع حسب الحصص", industryDistribution: "التوزيع", industryEcoAmount: "المبلغ (ECO)", - industryEcoContribHint: "تُحوَّل مساهمات ECO إلى القيّم بصفته أمين خزينة البناء.", industryEditBlueprint: "تعديل المخطط", industryFacility: "المصنع", industryKindLabel: "النوع", @@ -3119,13 +2623,10 @@ module.exports = { industryKind_eco: "أموال", industryLaborHours: "العمل (ساعات)", industryHours: "ساعات", - industryLicense: "الترخيص", industryMaterialItem: "مادة", industryMaterials: "المواد", - industryMaterialsHint: "مادة واحدة في كل سطر بالتنسيق الاسم:الكمية:السعر.", industryEstMaterials: "إجمالي المواد", industryEstLabor: "إجمالي العمل", - industryEstTaxes: "الضرائب", industryEstTotal: "السعر المقدر", industryBuildingPrice: "سعر التصنيع", industryFinalPrice: "السعر النهائي", @@ -3135,19 +2636,13 @@ module.exports = { industryNewBlueprint: "مخطط جديد", industryNewBuild: "اقتراح بناء", industryEditBuild: "تحرير الإنتاج", - industryNoBlueprint: "— لا شيء —", industryNeedBlueprint: "أنشئ مخططًا أولاً: كل إنتاج يصنع واحدًا.", industryNoBlueprints: "لا توجد مخططات بعد.", industryNoBuilds: "لا توجد عمليات بناء بعد.", industryNote: "ملاحظة", industryOutput: "المخرجات", - industryOutputItem: "اسم المنتج", industryOutputKind: "نوع المنتج", - industryOutputQty: "الوحدات لكل إنتاج", - industryOutputUnit: "وحدة القياس", industryOutputValue: "قيمة المخرجات (ECO، مثلاً من البيع)", - industryPayout: "الدفع", - industryPoints: "Karma", industryPostJob: "إنشاء وظيفة", industryPot: "الوعاء", industryProposeBuildButton: "اقتراح البناء", @@ -3155,8 +2650,6 @@ module.exports = { industryAuthor: "المؤلف", industrySellOnMarket: "إرسال إلى السوق", industrySendToProjects: "إنشاء مشروع", - industryShare: "حصة", - industryShares: "حصص", industrySkills: "المهارات", industryTreasury: "الخزينة", industryKind_physical: "مادي", @@ -3170,6 +2663,16 @@ module.exports = { industryBuildStatus_FAILED: "فاشل", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "وظيفة تطابق سيرتك الذاتية", + jobsBotMatchIntro: "وظيفة تطابق سيرتك الذاتية.", + jobsBotMatchJob: "الوظيفة", + jobsBotMatchHint: "تصلك هذه الرسالة لأن سيرتك الذاتية مُدارة بالذكاء الاصطناعي. يمكنك تعطيلها من سيرتك.", + cvAiManaged: "مُدار بالذكاء الاصطناعي", + switchOn: "مُفعّل", + switchOff: "معطّل", + cvAiManagedHint: "عند التفعيل، ينبهك JobsBot برسالة خاصة عندما تطابق وظيفة سيرتك الذاتية.", + cvMatchThreshold: "نبّهني بدءًا من هذا المستوى من التطابق", housingBotRequestedTitle: "طلب أحدهم أحد أماكنك.", housingBotCancelledTitle: "تم إلغاء طلب على أحد أماكنك.", housingBotYouRequestedTitle: "لقد طلبت مكاناً.", @@ -3198,22 +2701,14 @@ module.exports = { industryRulesDistribution: "عند اكتمال الإنتاج، يوزّع الوصي المبلغ (أموال الإنتاج بالإضافة إلى قيمة البيع) على المساهمين بنسبة حصصهم.", industryRulesTreasury: "يحتفظ القيّم بمساهمات ECO كأمين لخزينة البناء حتى التوزيع؛ تُسجَّل جميع الحركات على الشبكة ويمكن أن تذهب النزاعات إلى Courts.", industryJobs: "وظائف", - industryNoJobs: "لا توجد وظائف بعد.", - industryCreatePosition: "إنشاء وظيفة", - industryViewCV: "السيرة الذاتية", industryReportButton: "إبلاغ", industryCreateTask: "إنشاء مهمة", industryOpenDispute: "فتح نزاع", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "مثل وحدة، كجم، ترخيص", - industryOutputItemPlaceholder: "مثل روبوت", - industryOutputQtyPlaceholder: "مثل 5", - industrySkillsPlaceholder: "مثل لحام، شبكات، تركيب-شمسي", industryCreateInvite: "إنشاء دعوة", industryPauseVotes: "أصوات الحالة", industryTitle: "الصناعة", industryDescription: "وحدة لإدارة وسائل الإنتاج بشكل جماعي.", - industryLabel: "الصناعة", typeIndustryBuild: "بناء", typeIndustryBlueprint: "مخطط", typeIndustryAllocation: "توزيع", @@ -3262,9 +2757,7 @@ module.exports = { industryInviteNeeded: "تحتاج إلى دعوة للانضمام.", industryPauseButton: "صوّت للإيقاف", industryResumeButton: "صوّت للاستئناف", - industryEditButton: "تعديل", industryDeleteButton: "حذف", - industryBackToList: "← الصناعة", industryPendingApplicants: "طلبات معلقة", industryVotesYes: "نعم", industryVotesNo: "لا", @@ -3272,23 +2765,13 @@ module.exports = { industryAdmit: "قبول", industryReject: "رفض", industryDissolveTitle: "حل المصنع", - industryDissolveHint: "يتطلب الحل تصويتًا جماعيًا؛ لا يمكن للقيم الحل بمفرده.", industryDissolveVote: "التصويت للحل", - industrySector_software: "برمجيات", - industrySector_hardware: "عتاد", - industrySector_agriculture: "زراعة", - industrySector_textile: "نسيج", - industrySector_energy: "طاقة", - industrySector_food: "غذاء", - industrySector_construction: "بناء", - industrySector_media: "إعلام", - industrySector_services: "خدمات", - industrySector_other: "أخرى", industryPolicy_open: "مفتوح", industryPolicy_vote: "بالتصويت", industryPolicy_invite: "بالدعوة فقط", projectsTitle: "المشاريع", projectsDescription: "أنشئ ومُوّل وتابع مشاريع يقودها المجتمع في شبكتك.", + projectSearchPlaceholder: "ابحث عن المشاريع...", projectCreateProject: "إنشاء مشروع", projectCreateButton: "إنشاء مشروع", projectUpdateButton: "تحديث", @@ -3332,14 +2815,8 @@ module.exports = { projectPledgeTitle: "ادعم هذا المشروع", projectPledgePlaceholder: "المبلغ بـ ECO", projectBounties: "المكافآت", - projectBountiesInputLabel: "المكافآت (واحدة في كل سطر: العنوان|المبلغ [ECO]|الوصف)", - projectBountiesPlaceholder: "إصلاح خطأ واجهة|100|رابط المشكلة\nكتابة التوثيق|250|أمثلة الاستخدام", projectNoBounties: "لم يتم العثور على مكافآت.", projectTitle: "العنوان", - projectAddBountyTitle: "مكافأة جديدة", - projectBountyTitle: "عنوان المكافأة", - projectBountyAmount: "المبلغ (ECO)", - projectBountyDescription: "الوصف", projectMilestoneSelect: "اختيار مرحلة", projectBountyCreateButton: "إنشاء مكافأة", projectBountyStatus: "حالة المكافأة", @@ -3354,19 +2831,15 @@ module.exports = { projectMilestoneTitle: "عنوان المرحلة", projectMilestoneTargetPercent: "النسبة المئوية (%)", projectMilestoneDueDate: "التاريخ", - projectMilestoneCreateButton: "إنشاء مرحلة", projectMilestoneStatus: "حالة المرحلة", projectMilestoneOpen: "مفتوحة", projectMilestoneDone: "مكتملة", projectMilestoneDue: "مستحقة", - projectNoMilestones: "لم يتم العثور على مراحل.", projectMilestoneMarkDone: "تعيين كمنجزة", projectMilestoneTitlePlaceholder: "أدخل عنوان المرحلة", projectMilestoneDescriptionPlaceholder: "أدخل وصف هذه المرحلة", projectMilestoneDescription: "وصف المرحلة", - projectBudgetGoal: "الميزانية (الهدف)", projectBudgetAssigned: "المخصص للمكافآت", - projectBudgetRemaining: "المتبقي", projectBudgetOver: "تجاوز الميزانية: المخصص يتجاوز الهدف", projectFollowers: "المتابعون", projectFollowersTitle: "المتابعون", @@ -3379,7 +2852,6 @@ module.exports = { projectBackersTotalPledged: "إجمالي التبرعات", projectBackersYourPledge: "تبرعك", projectBackersNone: "لا توجد تبرعات بعد.", - projectNoRemainingBudget: "لا توجد ميزانية متبقية.", projectFilterBackers: "الداعمون", projectFilterApplied: "مُتقدَّم", projectAppliedTitle: "مُتقدَّم", @@ -3388,30 +2860,15 @@ module.exports = { projectBackerAmount: "إجمالي المساهمة", projectBackerPledges: "التبرعات", projectBackerProjects: "المشاريع", - projectPledgeAmount: "المبلغ", projectSelectMilestoneOrBounty: "اختر مرحلة أو مكافأة", projectPledgeButton: "تبرّع", footerLicense: "GPLv3", - footerPackage: "الحزمة", - footerVersion: "الإصدار", modulesModuleName: "الاسم", modulesModuleDescription: "الوصف", modulesModuleStatus: "الحالة", modulesTotalModulesLabel: "الوحدات المُحمَّلة", modulesEnabledModulesLabel: "مُفعَّلة", modulesDisabledModulesLabel: "مُعطَّلة", - modulesPopularLabel: "أبرز المنشورات", - modulesPopularDescription: "وحدة لاستقبال المنشورات الرائجة أو الأكثر مشاهدة أو الأكثر تعليقًا.", - modulesTopicsLabel: "المواضيع", - modulesTopicsDescription: "وحدة لاستقبال فئات النقاش القائمة على الاهتمامات المشتركة.", - modulesSummariesLabel: "الملخصات", - modulesSummariesDescription: "وحدة لاستقبال ملخصات النقاشات أو المنشورات الطويلة.", - modulesLatestLabel: "الأحدث", - modulesLatestDescription: "وحدة لاستقبال أحدث المنشورات والنقاشات.", - modulesThreadsLabel: "المحادثات", - modulesThreadsDescription: "وحدة لاستقبال المحادثات المجمعة حسب الموضوع أو السؤال.", - modulesMultiverseLabel: "الكون المتعدد", - modulesMultiverseDescription: "وحدة لاستقبال المحتوى من الأقران المتحدين الآخرين.", modulesInvitesLabel: "الدعوات", modulesInvitesDescription: "وحدة لإدارة وتطبيق رموز الدعوة.", modulesWalletLabel: "المحفظة", @@ -3452,8 +2909,12 @@ module.exports = { modulesOpinionsDescription: "وحدة لاكتشاف والتصويت على الآراء.", modulesTransfersLabel: "التحويلات", modulesTransfersDescription: "وحدة لاكتشاف وإدارة العقود الذكية (التحويلات).", - modulesFediverseLabel: "فيديفيرس", - modulesFediverseDescription: "أدر حساباتك الأخرى في الفيديفيرس، بما في ذلك إرسال واستقبال المحتوى.", + modulesFediverseLabel: "الكون المتعدد", + modulesBlogsLabel: "المدونات", + modulesBlogsDescription: "وحدة لاكتشاف المدونات وإدارتها.", + modulesPollsLabel: "الاستطلاعات", + modulesPollsDescription: "وحدة لسؤال الشبكة وعدّ الإجابات.", + modulesFediverseDescription: "أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.", modulesFeedLabel: "التغذية", modulesFeedDescription: "وحدة لاكتشاف ومشاركة النصوص القصيرة (التغذيات).", modulesParliamentLabel: "البرلمان", @@ -3489,37 +2950,33 @@ module.exports = { visibilityMakeHidden: "إخفاؤه", invitesInhabitantsTitle: "السكان", invitesInhabitantsFollow: "متابعة", - aiNavPlaceholder: "إلى أين تريد الذهاب؟", + aiNavPlaceholder: "صف ما تحتاجه...", aiNavDisabled: "تعطيل التنقل بالذكاء الاصطناعي.", - aiNavResultsTitle: "اقتراحات التنقل بالذكاء الاصطناعي", + aiNavResultsTitle: "اقتراحات AINav", aiNavQueryLabel: "الاستفسار", - aiNavResultsDescription: "اختر المسار الأنسب لما تبحث عنه.", - aiNavResultPath: "المسار", - aiNavResultDescription: "ما يمكنك فعله", aiNavResultMatch: "التطابق", aiNavResultsEmpty: "لا توجد مسارات مطابقة. جرّب /search.", - aiNavSearchInstead: "ابحث بدلًا من ذلك", modulesAINavLabel: "AINav", modulesAINavDescription: "وحدة لإجراء استعلامات بلغة طبيعية حول محتوى الشبكة.", - directConnect: "اتصال مباشر", directConnectDescription: "اتصل مباشرة بقرين عن طريق إدخال عنوان IP والمنفذ والمفتاح العام. سيتم إضافة القرين كاتصال مُتابَع.", peerHost: "IP", peerPort: "المنفذ (افتراضي: 8008)", peerPublicKey: "المفتاح العام (@...ed25519)", connectAndFollow: "اتصال", - deviceSourceLabel: "مصدر الجهاز", modulesPresetTitle: "الإعدادات الشائعة", - modulesPreset_minimal: "الحد الأدنى", - modulesPreset_basic: "أساسي", - modulesPreset_social: "اجتماعي", - modulesPreset_economy: "اقتصادي", - modulesPreset_full: "كامل", + workflowsTitle: "مسارات العمل", + workflowsDescription: "يحدد مسار العمل السمة والوحدات المفعّلة.", + workflowsSet: "تطبيق مسار العمل", + workflow_default: "الافتراضي", + workflow_jobs: "العمل", + workflow_ruling: "الحُكم", + workflow_politics: "السياسة", + workflow_social: "اجتماعي", + workflow_business: "الأعمال", + workflow_night: "ليل", + workflow_mobile: "الهاتف", statsCarbonFootprintTitle: "البصمة الكربونية", - statsCarbonFootprintNetwork: "البصمة الكربونية للشبكة", - statsCarbonFootprintYours: "بصمتك الكربونية", statsCarbonTombstone: "بصمة الحذف", - feedSuccessMsg: "تم نشر التغذية بنجاح!", - dominantOpinionLabel: "الرأي السائد", uploadMedia: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", feedOpenDiscussion: "فتح النقاش", feedDetailTitle: "التغذية", @@ -3552,14 +3009,13 @@ module.exports = { mapDescriptionLabel: "الوصف", mapDescriptionPlaceholder: "صف الخريطة أو الموقع...", mapTypeLabel: "نوع الخريطة", - mapTypeSingle: "فردي (الموقع الأولي فقط)", - mapTypeOpen: "مفتوح (يمكن لأي شخص إضافة علامات)", - mapTypeClosed: "مغلق (المنشئ فقط يضيف علامات)", + mapInviteMode: "دعوة", + mapTypeSingle: "فردي", + mapTypeOpen: "مفتوح", + mapTypeClosed: "مغلق", mapTagsLabel: "الوسوم", mapTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", mapUrlLabel: "رابط الخريطة", - mapPickCoordLabel: "أو اختر موقعاً على الشبكة:", - mapMarkersLabel: "علامات", mapMarkersTitle: "العلامات", mapMarkerDefault: "علامة", mapMarkerLatLabel: "خط عرض العلامة", @@ -3586,14 +3042,9 @@ module.exports = { padTitle: "وسادة", modulesPadsLabel: "الوسادات", modulesPadsDescription: "وحدة لإدارة محررات النصوص التعاونية.", - padFilterAll: "الكل", - padFilterMine: "خاصتي", - padFilterRecent: "الأخيرة", - padFilterOpen: "مفتوح", - padFilterClosed: "مغلق", padCreate: "إنشاء وسادة", - padUpdate: "تحديث الوسادة", - padDelete: "حذف الوسادة", + padUpdate: "تحديث", + padDelete: "حذف", padTitleLabel: "العنوان", padTitlePlaceholder: "أدخل عنوان الوسادة...", padStatusLabel: "الحالة", @@ -3604,14 +3055,7 @@ module.exports = { padTagsLabel: "الوسوم", padTagsPlaceholder: "وسم1، وسم2، ...", padMembersLabel: "الأعضاء", - padVisitPad: "زيارة الوسادة", - padShareUrl: "مشاركة الرابط", padCreated: "تاريخ الإنشاء", - padAuthor: "المؤلف", - padGenerateCode: "إنشاء رمز", - padInviteCodeLabel: "رمز الدعوة", - padInviteCodePlaceholder: "أدخل رمز الدعوة...", - padValidateInvite: "تحقق", padStartEditing: "ابدأ التحرير!", padEditorPlaceholder: "ابدأ الكتابة...", padSubmitEntry: "إرسال", @@ -3624,12 +3068,11 @@ module.exports = { padClosedSectionTitle: "الوسادات المغلقة", padCreateSectionTitle: "إنشاء وسادة جديدة", padUpdateSectionTitle: "تحديث الوسادة", - padInviteGenerated: "تم إنشاء رمز الدعوة", typePad: "وسادات", padNew: "جديد", padAddFavorite: "إضافة إلى المفضلة", padRemoveFavorite: "إزالة من المفضلة", - padClose: "إغلاق اللوحة", + padClose: "إغلاق", padBackToEditor: "العودة إلى المحرر", padSearchPlaceholder: "البحث عن الوسادات...", @@ -3637,8 +3080,6 @@ module.exports = { modulesChatsDescription: "وحدة لاكتشاف وإدارة المحادثات المشفرة.", typeChat: "محادثات", typeChatMessage: "رسالة محادثة", - chatLabel: "المحادثات", - chatMessageLabel: "رسائل المحادثة", chatsTitle: "المحادثات", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3646,56 +3087,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "الوصف", - chatMessageReply: "رد", - chatMessageLabel: "رسالة", chatCategory: "الفئة", chatStatus: "الحالة", - chatFilterAll: "الكل", - chatFilterMine: "لي", - chatFilterRecent: "الأخيرة", - chatFilterFavorites: "المفضلة", - chatFilterOpen: "مفتوح", - chatFilterClosed: "مغلق", chatCreate: "إنشاء محادثة", - chatUpdate: "تحديث المحادثة", - chatDelete: "حذف المحادثة", + chatUpdate: "تحديث", + chatDelete: "حذف", chatClose: "إغلاق المحادثة", chatVisitChat: "زيارة المحادثة", chatUntitled: "محادثة بدون عنوان", chatNoItems: "لا توجد محادثات.", chatParticipants: "المشاركون", - chatStartChatting: "ابدأ المحادثة!", - chatGenerateCode: "إنشاء رمز", - chatShareUrl: "مشاركة الرابط", + chatMessagesLabel: "الرسائل", + chatThreadsLabel: "المواضيع", chatCreatedAt: "تم الإنشاء", chatSearchPlaceholder: "بحث في المحادثات...", chatStatusOpen: "مفتوح", chatStatusInviteOnly: "بالدعوة فقط", chatStatusClosed: "مغلق", chatSendMessage: "إرسال", + chatJumpLatest: "آخر رسالة", + chatPickChat: "اختر محادثة لفتحها", + chatNoneYet: "لا توجد محادثة متاحة بعد.", + activitySearchPlaceholder: "ابحث في النشاط...", + trendingSearchPlaceholder: "ابحث في الرائج...", + opinionsSearchPlaceholder: "ابحث في الآراء...", + votesSearchPlaceholder: "ابحث في التصويتات...", + welcomeStepUxTitle: "اختر واجهتك", + welcomeStepUxText: "قرر شكل Oasis. يمكنك تغييره لاحقاً من الإعدادات.", + welcomeStepUxAction: "استخدم هذا العرض", + chatRateLimitTitle: "رسائل كثيرة جدًا", + chatRateLimitMessage: "لقد بلغت حد الرسائل الذي تقبله هذه الغرفة في الساعة. حاول لاحقًا.", chatMessagePlaceholder: "اكتب رسالتك...", chatNoMessages: "لا توجد رسائل بعد.", - chatLeave: "مغادرة المحادثة", - chatInviteCodeLabel: "أدخل رمز الدعوة", - chatJoinByInvite: "انضم", chatTitlePlaceholder: "عنوان المحادثة", chatDescriptionPlaceholder: "وصف المحادثة", chatTagsPlaceholder: "وسم1، وسم2", chatImageLabel: "اختر ملف صورة (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "رمز الدعوة", chatAuthor: "المؤلف", - chatCreated: "تم الإنشاء", chatAddFavorite: "إضافة للمفضلة", chatRemoveFavorite: "إزالة من المفضلة", chatPM: "رسالة", chatStatusLabel: "الحالة", chatCategoryLabel: "الفئة", - chatParticipantsLabel: "المشاركون", gamesTitle: "الألعاب", gamesDescription: "اكتشف وألعب بعض الألعاب.", gamesFilterAll: "الكل", gamesPlayButton: "العب!", - gamesBackToGames: "العودة إلى الألعاب", modulesGamesLabel: "الألعاب", modulesGamesDescription: "وحدة لاكتشاف وتشغيل بعض الألعاب.", modulesGraphosLabel: "غرافوس", @@ -3712,8 +3149,6 @@ module.exports = { gamesArkanoidDesc: "اكسر جميع الطوب بمضربك وكرتك. تحدي أركيد كلاسيكي.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "بينج بونج كلاسيكي ضد ذكاء اصطناعي. أول من يصل إلى 5 نقاط يفوز.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "سباق ضد الوقت! تجنب السيارات وصل إلى خط النهاية قبل انتهاء الوقت.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "قد مركبتك عبر حقل الكويكبات. دمرها قبل أن تصطدم بك.", gamesRockPaperScissorsTitle: "حجر ورقة مقص", @@ -3734,8 +3169,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3746,12 +3179,6 @@ module.exports = { modulesCalendarsLabel: "التقاويم", modulesCalendarsDescription: "وحدة لاكتشاف وإدارة التقاويم.", typeCalendar: "تقويمات", - calendarFilterAll: "الكل", - calendarFilterMine: "تقاويمي", - calendarFilterOpen: "مفتوح", - calendarFilterClosed: "مغلق", - calendarFilterRecent: "الأحدث", - calendarFilterFavorites: "المفضلة", calendarCreate: "إنشاء تقويم", calendarUpdate: "تحديث", calendarDelete: "حذف", @@ -3764,24 +3191,17 @@ module.exports = { calendarTagsLabel: "الوسوم", calendarTagsPlaceholder: "وسم1، وسم2...", calendarParticipantsLabel: "المشاركون", - calendarParticipantsCount: "المشاركون", - calendarVisitCalendar: "زيارة التقويم", calendarCreated: "تم الإنشاء", - calendarAuthor: "المؤلف", calendarJoin: "انضمام", calendarGenerateInvite: "إنشاء دعوة", - calendarInviteCodePlaceholder: "أدخل رمز الدعوة...", - calendarValidateInvite: "التحقق من الرمز", - calendarJoined: "منضم", - calendarAddDate: "إضافة تاريخ", - calendarAddNote: "إضافة ملاحظة", calendarDateLabel: "التاريخ", calendarDatePlaceholder: "وصف هذا التاريخ...", - calendarNoteLabel: "ملاحظة", + calendarNoteLabel: "ملاحظات", calendarNotePlaceholder: "إضافة ملاحظة...", calendarFirstDateLabel: "التاريخ", calendarFirstNoteLabel: "ملاحظات", calendarIntervalLabel: "Interval", + calendarIntervalNone: "بدون تكرار", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3792,8 +3212,6 @@ module.exports = { calendarsDescription: "اكتشف وأدر التقويمات في شبكتك.", calendarMonthPrev: "← السابق", calendarMonthNext: "التالي →", - calendarMonthLabel: "التواريخ", - calendarsShareUrl: "رابط المشاركة", calendarAllSectionTitle: "التقاويم", calendarRecentSectionTitle: "التقويمات الأحدث", calendarFavoritesSectionTitle: "المفضلة", @@ -3807,7 +3225,6 @@ module.exports = { calendarRemoveFavorite: "إزالة من المفضلة", calendarSearchPlaceholder: "البحث عن تقاويم...", calendarAddEntry: "إضافة إدخال", - calendarLeave: "مغادرة التقويم", statsCalendar: "التقاويم", statsCalendarDate: "تواريخ التقويم", statsCalendarNote: "ملاحظات التقويم", @@ -3854,7 +3271,6 @@ module.exports = { torrentSortOldest: "الأقدم", torrentSortTop: "الأكثر تصويتاً", torrentNoMatch: "لا توجد تورنتات مطابقة.", - torrentMessageAuthorButton: "مراسلة المؤلف", torrentUpdatedAt: "تم التحديث", statsTorrent: "التورنت", typeTorrent: "التورنت", @@ -3862,10 +3278,18 @@ module.exports = { modulesTorrentsDescription: "وحدة لاكتشاف وإدارة التورنت.", favoritesFilterTorrents: "التورنت", favoritesFilterMarket: "السوق", + favoritesFilterEvents: "الفعاليات", + favoritesFilterForum: "المنتدى", + favoritesFilterHousing: "السكن", + favoritesFilterJobs: "الوظائف", + favoritesFilterProjects: "المشاريع", + favoritesFilterReports: "التقارير", + favoritesFilterTasks: "المهام", + favoritesFilterTransfers: "التحويلات", + favoritesFilterVotes: "التصويتات", favoritesFilterShopProducts: "منتجات المتجر", tribeSectionTorrents: "التورنت", tribeCreateTorrent: "رفع تورنت", - tribeMediaTypeTorrent: "تورنت", settingsWishTitle: "الرغبة", settingsWishDesc: "قم بتكوين رغبة الأفاتار الخاص بك.", settingsWishWhole: "Multiverse", @@ -3876,16 +3300,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "الإرسال حاجز UX. الاستقبال فلتر انتباه.", - pmBlockedNonMutual: "يمكنك إرسال الرسائل الخاصة فقط للسكان ذوي الدعم المتبادل.", inhabitantsPendingFollowsTitle: "طلبات الدعم المعلقة", inhabitantsPendingAccept: "قبول", inhabitantsPendingReject: "رفض", - bxEncrypted: "مشفر", - bxEncryptedHexLabel: "النص المشفر (معاينة)", tribeSectionGovernance: "الحوكمة", - tribeSubStatusPublic: "عامة", - tribeSubStatusPrivate: "خاصة", - tribeSubInheritedPrivate: "خاصة (موروثة من القبيلة الرئيسية)", tribePadInviteRequired: "لا يمكنك الوصول. اطلب دعوة.", tribeChatInviteRequired: "لا يمكنك الوصول للدردشة. اطلب دعوة.", tribeGovernanceDesc: "الحوكمة الداخلية لهذه القبيلة.", @@ -3925,44 +3343,31 @@ module.exports = { tribeGovNoHistorical: "لا يوجد أي سجل بعد", logsTitle: "السجل", logsDescription: "سجل تجربتك في الشبكة.", - logsReadMore: "اقرأ المزيد", logsViewTitle: "السجل", logsColumnType: "النوع", logsView: "عرض", - logsManualPrompt: "اكتب سجلك", logsUpdateButton: "تحديث", - logsEditTitle: "تعديل الإدخال", - logsCreateDescription: "سجل تجربتك...", + logsEditTitle: "تحديث السجل", logsCreateTitle: "إنشاء إدخال", logsWriteButton: "اكتب", logsTextPlaceholder: "صف تجاربك...", - logsTextField: "النص", - logsLabelPlaceholder: "تسمية...", - logsLabelField: "اكتب سجلك (تسمية)", - logsAiDisabledWarn: "فعّل وحدة الذكاء الاصطناعي في /modules لاستخدام السجلات المكتوبة بواسطة الذكاء.", - logsAiContextValue: "يوم blockchain", - logsAiContext: "السياق", - logsAiModStatus: "AImod", - logsModeApply: "تطبيق!", logsModeAIWritten: "AI-Assistant", logsModeManual: "يدوي", logsModeAI: "ذكاء", - logsColumnDelete: "حذف", - logsColumnEdit: "تعديل", logsColumnLog: "السجل", logsColumnDate: "التاريخ", logsDelete: "حذف", - logsEdit: "تعديل", + logsEdit: "تحديث", logsFilterAlways: "دائمًا", logsFilterYear: "السنة الماضية", logsFilterMonth: "الشهر الماضي", logsFilterWeek: "الأسبوع الماضي", logsFilterToday: "اليوم", - logsFilterRecent: "الأحدث", - logsFilterAll: "الكل", + logsComments: "التعليقات", + logsAuthorEntries: "المدخلات", logsCreate: "إنشاء إدخال", logsExport: "تصدير السجل", - logsExportOne: "تصدير", + logsExportOne: "تصدير السجل", logsViewDetails: "عرض التفاصيل", logsGenerateButton: "توليد نص", logsSearchText: "ابحث في السجلات...", @@ -3972,31 +3377,25 @@ module.exports = { modulesLogsLabel: "السجل", modulesLogsDescription: "وحدة لتسجيل تجاربك (عبر مساعد ذكاء اصطناعي).", statsLogsTitle: "السجل", - statsLogsEntries: "إدخالات", typeLog: "سجل", - blockchainCycle: "دورة", larpTitle: "L.A.R.P.", larpDescription: "طبقة لعب أدوار حية للتجربة التعاونية.", + larpNoHousesMatch: "لا توجد بيوت تطابق بحثك.", + larpSearchPlaceholder: "ابحث في البيوت...", larpAllHouses: "البيوت:", larpFilterRuling: "يحكم", larpFilterHouses: "البيوت", larpFilterRules: "FAQ", larpRulesTitle: "أسئلة شائعة عن L.A.R.P.", - larpRulesEntryTitle: "بيت البداية", larpRulesEntryText: "يبدأ كل ساكن في ACADEMIA افتراضياً. من ACADEMIA، اختر بيتاً من لوحة «الانضمام إلى بيت»: ستفتح اختبار الدخول الخاص به. أجب عن الأسئلة العشرة وأرسلها. إذا تجاوزت الحد (7/10) فستُقبل آلياً في ذلك البيت؛ وإلا تُرفض وتبقى في ACADEMIA. في كل الأحوال يسجّل النظام OasisID الخاص بك ودورة المحاولة، ويمنع محاولة جديدة حتى انتهاء فترة الانتظار وهي 30 دورة.", - larpRulesLeaveText: "يستطيع أعضاء أي بيت العودة إلى ACADEMIA في أي وقت من صفحة بيتهم؛ يعيد ذلك ضبط عضويتهم لكنه لا يلغي فترة انتظار الاختبار.", - larpRulesGovernanceTitle: "حائط الحوكمة", larpRulesGovernanceText: "خلال دورته، يحمل البيت الحاكم شارة «يحكم» وهو الوحيد الذي يُعرض حائطه علنياً ضمن تبويب «يحكم».", - larpRulesSignTitle: "شعار L.A.R.P.", + larpRulesWallText: "لكل بيت جدار يكتب فيه أعضاؤه. جدار البيت خاص به، عدا جدار البيت الحاكم وجدار ACADEMIA، فيمكن لأي شخص قراءتهما.", larpRulesSignText: "يستطيع السكان تفعيله (في /profile/edit > المستشعرات) لعرض صورة بيتهم الحالي كختم في الملف الشخصي وبطاقة المؤلف والساكن. يربط الختم بصفحة البيت.", larpPostsTitle: "الحائط", larpPostsEmpty: "لا توجد منشورات بعد.", - larpPostLabel: "منشور جديد", larpPostPlaceholder: "ماذا يريد هذا البيت أن يقول؟", - larpPostPublic: "عام (يراه أي شخص، وإلا فالأعضاء فقط)", larpPostSubmit: "انشر", - larpPostMembersOnly: "للأعضاء فقط", larpCycleLabel: "الدورة:", audioBackToBcs: "Back to BCS", audioFilterBcs: "BCS", @@ -4113,12 +3512,9 @@ module.exports = { bankTaxesLookupNote: "أدخل معرف كتلة للبحث عنه في خلاصتك المحلية.", bankTaxesUserNoteChipsClick: "انقر على أي شريحة لفحص كتلتها في blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "رمز الدعوة", larpRulesInviteEntryText: "يمكن لأعضاء البيوت إنشاء رموز دعوة تمنح الوصول المباشر إلى البيت.", larpRulesOneHouseText: "يمكنك الانتماء إلى بيت واحد فقط في أي وقت. إذا لم تنتم إلى أي بيت، فأنت في ACADEMIA. كل صفحة بيت (غير ACADEMIA) تعرض لأعضائها زر «مغادرة البيت» الذي يعيد العضوية إلى ACADEMIA. المغادرة لا تلغي فترة انتظار الاختبار.", - larpRulesOneHouseTitle: "بيت واحد في كل مرة", - larpRulesTestEntry: "اختبار WILL", - larpRulesTestEntryText: "كل خيار يرجح بيتاً أو أكثر؛ عند الإرسال، يجمع النظام النقاط ويضمك تلقائياً إلى البيت صاحب أعلى نتيجة.", + larpRulesTestEntryText: "في اختبار WILL يمنح كل خيار وزنًا لبيت أو أكثر؛ وعند الإرسال يجمع النظام النقاط ويضمّك تلقائيًا إلى البيت الأعلى نقاطًا.", larpWillTestHint: "بمجرد الانتهاء، ستُسند إليك البيت الذي يتطابق بشكل أفضل مع إجاباتك. تتم معالجة إجاباتك الفردية محلياً ولا يتم تخزينها أبداً — يُنشر في خلاصتك فقط نتيجة تعيين البيت.", larpWillTestTitle: "اختبار WILL", settingsLanDesc: "الإعلان بشكل دوري عن هذا النظير لمثيلات Oasis الأخرى على نفس الشبكة المحلية. تعطيل لإيقاف بث UDP.", @@ -4137,31 +3533,27 @@ module.exports = { aiExchangeMarkHelpful: "+1 مفيد", larpCyclesUntilRuling: "دورة الحكم القادمة", larpVisitTribe: "زيارة القبيلة", + larpStartJourney: "ابدأ الرحلة", larpGoverning: "يحكم:", + larpStartHere: "ابدأ من هنا:", larpMyHouse: "بيتي:", larpMembersCount: "الأعضاء", - larpMembersTitle: "الأعضاء", - larpNoMembers: "لا يوجد أعضاء بعد.", larpRolesLabel: "الأدوار", larpFunctionLabel: "الوظيفة", larpMonthLabel: "دورة الحكم", larpLeaveToAcademia: "العودة إلى ACADEMIA", - larpAcademiaJoinTitle: "الانضمام إلى بيت", - larpAcademiaJoinHint: "أجرِ اختبار الشخصية النفسي ليُسنَد إليك البيت الأنسب لك، أو استخدم رمز دعوة تشاركَه أحد أعضاء البيوت.", - larpTakeTestButton: "أجرِ اختبار الشخصية", + larpAcademiaJoinTitle: "بيوت L.A.R.P.", larpInviteRedeem: "الانضمام إلى البيت", larpInviteCreate: "إنشاء رمز دعوة", larpInvitePlaceholder: "رمز الدعوة", larpInviteBannerTitle: "رمز دعوة جديد", larpInviteBannerHint: "شارك هذا الرمز مع شخص في ACADEMIA. ينتهي خلال 30 دورة أو بعد استخدام واحد.", - larpTestAssignedHouse: "البيت المُسنَد", larpTestRankingTitle: "النقاط لكل بيت", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "رمز دعوة بيت", invitesHouseJoinButton: "الانضمام إلى البيت", larpLastAttemptTitle: "آخر محاولاتك", larpLastAttemptHouse: "البيت", - larpLastAttemptResult: "النتيجة", larpLastAttemptWhen: "متى", larpLastAttemptCooldown: "المحاولة التالية خلال", larpTestTitle: "اختبار الدخول", @@ -4170,37 +3562,14 @@ module.exports = { larpTestCooldownActive: "الاختبار التالي متاح خلال", larpTestCooldownDays: "دورات", larpTestResultTitle: "نتيجة الاختبار", - larpTestPassed: "اجتزت الاختبار — أهلاً!", - larpTestFailed: "لم تجتز الاختبار", larpTestScore: "الدرجة", larpTestNextAttempt: "يمكنك إجراء اختبار آخر بعد 30 دورة.", larpGoToHouse: "اذهب إلى بيتك", larpBackToAcademia: "العودة إلى ACADEMIA", - larpBackToHouses: "◀ البيوت", larpBadgeYou: "أنت", larpBadgeRuling: "يحكم", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "وحدة طبقة لعب الأدوار الحية في Oasis (البيوت التسعة).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - ecoinTaxLabel: "ECOin Tax", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - statsEcoTaxTitle: "ECO Tax", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - audioBackToAudio: "Back to audio", - audioAuthorLabel: "Author", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "عند مواجهة مشكلة معقدة، ما الذي تفعله أولاً؟", larpProfileQ1O1: "التحدث مع الآخرين للوصول إلى توافق", larpProfileQ1O2: "بناء نموذج أولي لاختباره", diff --git a/src/client/assets/translations/oasis_de.js b/src/client/assets/translations/oasis_de.js index 10ef825..dfa3426 100644 --- a/src/client/assets/translations/oasis_de.js +++ b/src/client/assets/translations/oasis_de.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { de: { - languageName: "Deutsch", shopOrderStatusPaid: "Zahlung erhalten", shopOrderStatusReceived: "Erhalten", shopOrderMarkPaid: "Zahlung erhalten", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Du hast noch keine Käufe.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Verkäufer", - shopOrderPaymentConcept: "Zahlung", shopOrderInvoice: "Rechnung", shopOrderInvoiceConcept: "Rechnung", shopOrderStatusPending: "Ausstehend", shopOrderStatusAccepted: "Angenommen", shopOrderStatusRejected: "Abgelehnt", shopOrderStatusShipped: "Versandt", - shopOrderStatusDelivered: "Geliefert", shopOrderAccept: "Annehmen", shopOrderReject: "Ablehnen", shopOrderMarkShipped: "Als versandt markieren", - shopOrderMarkDelivered: "Als geliefert markieren", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Vertrag", shopOrderContractConcept: "Shop-Bestellung", shopOrdersPending: "Ausstehende Bestellungen", all: "Alle", @@ -55,14 +50,13 @@ module.exports = { viewJson: "JSON anzeigen", matchScore: "Übereinstimmung", preferencesLabel: "Einstellungen", - inhabitantProfileTitle: "Bewohnerprofil", + inhabitantProfileTitle: "Bewohner", contentWarningLabel: "Inhaltswarnung", invalidPost: "Ungültiger Inhalt", invalidPostHint: "Diese Nachricht hat ungültigen/leeren Text.", spreadBy: "Von", spreadChron: "Verbreitung", spreaded: "Verbreitet", - spreadMore: "mehr", spreadContentUnavailable: "Inhalt noch nicht verfügbar (Replikation ausstehend)", filteredByTag: "Nach Tag gefiltert", filteredByTagTitle: "Nach Tag gefiltert", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Kein Schweregrad", calendarDeleteDate: "Datum löschen", calendarIntervalUntil: "Bis", - bookmarkCategory: "Kategorie", bookmarkLastVisit: "Letzter Besuch", profileClearnetBookmarksLabel: "Lesezeichen", - forumFilterHot: "Beliebt", invitesPort: "Port", currentlyUnrecheable: "FEHLER!", peerHostValidation: "Gültige IPv4 (z. B. 192.168.1.100) oder Hostname (z. B. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Jährliche Maximalschätzung", statsCarbonNetwork: "Netzwerk gesamt", statsCarbonOfEstMax: "der geschätzten Maximalkapazität", + statsCarbonYearProgress: "des Jahres vergangen", + statsNetworkTitle: "Netzwerk", + statsStorageTitle: "Speicher", + statsEcoTaxTitle: "ECO-Steuer", + statsAccountTitle: "Konto", + statsAveragesTitle: "Durchschnitte", statsCarbonOfNetwork: "des Netzwerk-Gesamtwerts", statsCarbonUser: "Dein Fußabdruck", statsContentCountColumn: "Anzahl", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Top-Tags", statsTopTypesTitle: "Top-Inhaltstypen", statsTotalMsgs: "Nachrichten gesamt", - feedViewDetails: "Details anzeigen", - eventFileLabel: "Bild anhängen", - taskFileLabel: "Bild anhängen", - courtsRespondentRequired: "Beklagten-ID erforderlich", extended: "Multiversum", extendedDescription: [ "Wenn du jemanden unterstützt, kannst du Beiträge von dessen unterstützten Bewohnern herunterladen. Diese erscheinen hier, nach Aktualität sortiert.", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "Zeige", graphosYou: "Du", graphosTotalNodes: "Knoten insgesamt", - manualMode: "Manueller Modus", mentions: "Erwähnungen", mentionsDescription: [ - strong("Beiträge, die dich @erwähnen"), - ", nach Aktualität sortiert.", + strong("Jede Nachricht, die dich @erwähnt"), + ".", ], - nextPage: "Weiter", - previousPage: "Zurück", noMentions: "Du hast noch keine @Erwähnungen erhalten.", + mentionsSearchPlaceholder: "Erwähnungen suchen...", privateReminders: "ERINNERUNGEN", inboxFiltersLabel: "Filter:", inboxToggleToMutuals: "Auf Gegenseitige umschalten", inboxToggleToWhole: "Auf Alle umschalten", - privateFrom: "Von", - privateTo: "An", privateDate: "Datum", pmReply: "Antworten", pmReplies: "Antworten", - pmNew: "neu", - pmMarkRead: "Als gelesen markieren", inReplyTo: "ALS ANTWORT AUF", pmPreview: "Vorschau", pmPreviewTitle: "Nachrichtenvorschau", peers: "Verbindungen", searchDescription: "Beschreibung", - imageSearch: "Bildersuche", searchFromLabel: "Von", searchToLabel: "Bis", - searchMinOpinionsLabel: "Min. Meinungen", - searchInhabitantLabel: "Bewohner (Oasis ID)", searchQueryLabel: "Suche", searchPerPageLabel: "Ergebnisse pro Seite", settings: "Einstellungen", @@ -244,67 +229,38 @@ module.exports = { melodyTitle: 'Melody', melodyDescription: 'Spiel die Melodie deiner Blockchain — jeder Block wird zu einer Note.', melodyEmpty: 'Noch keine Noten — deine Blockchain hat noch keinen Block erzeugt.', - melodyCompositionHelp: 'Jeder Block deiner Blockchain wird je nach Typ und Größe zu einer Note.', - melodyStatsTitle: 'Aufschlüsselung nach Typ', - melodyInhabitantLabel: 'Bewohner', melodyTotalBlocks: 'Noten', - melodyType: 'Typ', - melodyCount: 'Blöcke', melodyFilterAll: 'ALLE', - melodyFilterShare: 'Melodie hochladen', - melodyShareTitle: 'Teile deine Melodie', - melodyShareHelp: 'Veröffentliche eine Momentaufnahme deiner aktuellen Melodie, damit andere sie anhören und remixen können.', - melodyShareTitleLabel: 'Titel (optional)', - melodyShareTitlePlaceholder: 'Ein Blockchain-Geist', - melodyShareSubmit: 'Melodie veröffentlichen', - melodyNoShared: 'Noch keine Blockchain-Melodien.', melodyRegenerate: 'Neu erzeugen', melodyDownload: "BCS herunterladen", - profileActivityTitle: 'Aktivität', - profileActivityMore: 'Alle Aktivität anzeigen', profileContentSectionTitle: 'Avatar-Inhalt', profileContentHelp: 'Wähle, welche deiner Module auf deinem Avatar angezeigt werden.', profileSensorsHelp: 'Optionale Metriken, die auf deinem Avatar angezeigt werden.', profileClearnetHelp: 'Module, die von außerhalb von Oasis aufgerufen werden können.', profileHubAll: 'Alle', - profileHubTitle: 'Öffentlicher Inhalt', - footerPulseTitle: 'Puls', - footerPulsePeers: 'Peers', - footerPulseInbox: 'Posteingang', - footerPulseSync: 'Letzte Sync', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Letzte Aktivität', footerLicenseLabel: 'Lizenz', profileSwitchToOasis: 'Zurück zu Oasis', - profileSwitchToClearnet: 'Eintauchen ins Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Ins Fediverse eintauchen", - coordLabel: 'Koordinate (z.B. A3)', - coordPlaceholder: 'Koordinate eingeben', + profileVisibilityFediverse: "Multiversum", contributorsTitle: "Mitwirkende", - pixeliaBy: "von", colorLabel: 'Farbe wählen', paintButton: 'Malen!', - invalidCoordinate: 'Ungültige Koordinate', - goToMuralButton: "Wandbild anzeigen", totalPixels: 'Pixel gesamt', modules: "Module", modulesViewTitle: "Module", modulesViewDescription: "Konfiguriere deine Umgebung durch Aktivieren oder Deaktivieren von Modulen.", inbox: "Posteingang", multiverse: "Multiversum", - fediverse: "Fediverse", - fediverseDescription: "Verwalte deine anderen Fediverse-Konten, einschließlich Senden und Empfangen von Inhalten.", + fediverse: "Multiversum", + fediverseDescription: "Verwalte deine anderen Multiversum-Konten, einschließlich Senden und Empfangen von Inhalten.", fediverseStatus: "Status", - fediverseDisconnected: "Fediverse getrennt. Überprüfe %LINK% oder den Verbindungsstatus.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiversum getrennt. Überprüfe %LINK% oder den Verbindungsstatus.", + fediverseSettingsTitle: "Multiversum", fediverseInstanceLabel: "Adresse", fediverseTokenLabel: "Zugriffstoken", fediverseTokenHelp: "Lege dein Zugriffstoken fest. Es wird verwendet, um dein Mastodon-Konto aus Oasis heraus zu verwalten.", fediverseConnect: "Verbinden", fediverseConnectedAs: "Verbunden als", fediverseDisconnect: "Trennen", - fediverseEmpty: "Wenn du weitere Fediverse-Konten in %LINK% verbindest, kannst du sie von hier aus verwalten.", fediverseEmptyLink: "deinen Einstellungen", fediverseComposePlaceholder: "Was denkst du gerade?", fediverseReplyPlaceholder: "Schreibe deine Antwort…", @@ -313,21 +269,15 @@ module.exports = { fediverseReply: "Antworten", fediverseBoosted: "teilte", fediverseNoPosts: "Deine Timeline ist leer.", - fediverseThread: "Thread", fediverseTimeline: "Zeitleisten", - fediverseManageTimeline: "Zeitleiste verwalten", fediverseFollowers: "Follower", fediverseFollowing: "Folge ich", fediversePosts: "Beiträge", fediverseJoined: "Beigetreten", - fediverseOverview: "Übersicht", fediverseRefresh: "Aktualisieren", fediverseWrite: "Schreiben", fediversePreview: "Vorschau", - fediverseEdit: "Bearbeiten", - fediverseOpenFeed: "Feed ansehen", fediverseManage: "Verwalten", - fediverseStatusNotConnected: "Nicht verbunden", fediverseError: "Mastodon konnte nicht erreicht werden.", fediverseErrInstance: "Ungültige Instanz-URL.", fediverseErrAuth: "Ungültiges oder abgelaufenes Token.", @@ -338,17 +288,6 @@ module.exports = { fediverseErrPost: "Konnte nicht veröffentlichen.", fediverseErrMedia: "Datei konnte nicht hochgeladen werden.", fediverseErrEmpty: "Schreibe etwas oder hänge eine Datei an.", - popularLabel: "Höhepunkte", - topicsLabel: "Themen", - latestLabel: "Neueste", - summariesLabel: "Zusammenfassungen", - threadsLabel: "Diskussionen", - multiverseLabel: "Multiversum", - inboxLabel: "Posteingang", - invitesLabel: "Einladungen", - walletLabel: "Geldbörse", - legacyLabel: "Schlüssel", - cipherLabel: "Verschlüsselung", bookmarksLabel: "Lesezeichen", videosLabel: "Videos", torrentsLabel: "Torrents", @@ -359,18 +298,14 @@ module.exports = { inhabitantsLabel: "Bewohner", trendingLabel: "Trends", eventsLabel: "Termine", - tasksLabel: "Aufgaben", apply: "Anwenden", menuPersonal: "Persönlich", - menuContent: "Inhalt", - menuBlogs: "Blogs", menuGovernance: "Regierung", menuOffice: "Büro", - menuMultiverse: "Multiversum", - menuNetwork: "Netzwerk", + menuNetwork: "Gemeinschaft", menuCreative: "Kreativ", menuEconomy: "Wirtschaft", - menuMedia: "Medien", + menuMedia: "Bibliothek", menuTools: "Werkzeuge", comment: "Kommentar", subtopic: "Unterthema", @@ -380,13 +315,6 @@ module.exports = { follow: "Unterstützen", block: "Blockieren", unblock: "Entsperren", - newerPosts: "Neuere Beiträge", - olderPosts: "Ältere Beiträge", - feedRangeEmpty: "Der angegebene Bereich ist leer für diesen Feed. Versuchen Sie den ", - seeFullFeed: "gesamten Feed", - feedEmpty: "Das Oasis-Netzwerk hat nie Beiträge von diesem Konto gesehen.", - beginningOfFeed: "Dies ist der Anfang des Feeds", - noNewerPosts: "Es wurden noch keine neueren Beiträge empfangen.", relationshipNotFollowing: "Du wirst nicht unterstützt", relationshipTheyFollow: "Unterstützt dich", relationshipMutuals: "Gegenseitige Unterstützung", @@ -396,16 +324,12 @@ module.exports = { relationshipBlockedBy: "Du bist blockiert", relationshipMutualBlock: "Gegenseitige Blockierung", relationshipNone: "Du unterstützt nicht", - relationshipConflict: "Konflikt", relationshipBlockingPost: "Blockierter Beitrag", viewLikes: "Verbreitungen ansehen", spreadedDescription: "Liste der vom Bewohner verbreiteten Beiträge.", - totalspreads: "Verbreitungen gesamt", - attachFiles: "Dateien anhängen", preview: "Vorschau", publish: "Schreiben", contentWarningPlaceholder: "Betreff zum Beitrag hinzufügen (optional)", - privateWarningPlaceholder: "Bewohner hinzufügen, um einen privaten Beitrag zu senden (optional)", publishWarningPlaceholder: "Text auf 7000 Zeichen begrenzt.", publishTooLong: "Dein Beitrag ist zu lang. Bitte kürze ihn.", publishCustomDescription: [ @@ -414,8 +338,6 @@ module.exports = { commentWarning: [ "ACHTUNG: Aufgrund der Blockchain-Technologie kann ein veröffentlichter Beitrag nicht bearbeitet oder gelöscht werden.", ], - commentPublic: "öffentlich", - commentPrivate: "privat", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -435,7 +357,6 @@ module.exports = { ".", ], publishCustom: "Erweiterten Beitrag schreiben", - subtopicLabel: "Ein Unterthema dieses Beitrags erstellen", messagePreview: "Beitragsvorschau", mentionsMatching: "Passende Erwähnungen", mentionsName: "Name", @@ -458,24 +379,19 @@ module.exports = { ssbLogStream: "Blockchain", ssbLogStreamDescription: "Konfiguriere das Nachrichtenlimit für Blockchain-Streams.", saveSettings: "Einstellungen speichern", - exportTitle: "Daten exportieren", exportDescription: "Passwort festlegen (mind. 32 Zeichen), um deinen Schlüssel zu verschlüsseln", exportDataTitle: "Sicherung", exportDataDescription: "Lade deine Daten herunter (geheimer Schlüssel ausgeschlossen!)", exportDataButton: "Datenbank herunterladen", - pubWallet: "PUB-Wallet", - pubWalletDescription: "Setze die PUB-Wallet-URL. Diese wird für PUB-Transaktionen (einschließlich UBI) verwendet.", - pubWalletConfiguration: "Konfiguration speichern", - importTitle: "Daten importieren", importDescription: "Importiere deinen verschlüsselten geheimen Schlüssel, um deinen Avatar zu aktivieren", - importAttach: "Verschlüsselte Datei anhängen (.enc)", - passwordLengthInfo: "Das Passwort muss mindestens 32 Zeichen lang sein.", passwordImport: "Gib dein Passwort ein, um die Daten zu entschlüsseln", exportPasswordPlaceholder: "Klein-, Großbuchstaben, Zahlen und Symbole verwenden", fileInfo: "Dein verschlüsselter Schlüssel wird auf dein Gerät heruntergeladen (Name: oasis.enc)", developer: "Entwicklung", devTitle: "Entwicklung", welcomeBannerText: "Willkommen bei OASIS. Folge diesen kurzen Schritten, um deinen Avatar einzurichten.", + aiSuggestionBanner: "Vorschlag:", + aiSuggestionsEnable: "KI-Vorschläge", welcomeBannerAction: "Los geht es!", welcomeTitle: "Willkommen", welcomeStepGreetingAction: "Senden", @@ -518,14 +434,9 @@ module.exports = { devParentFolder: "Übergeordneter Ordner", devOpenFolder: "öffnen", devDescription: "Erkunde den Quellcode, der auf diesem Knoten läuft.", - devTreeTitle: "Dateien", - devSearchTitle: "Code durchsuchen", - devMapTitle: "Module", devRoot: "Wurzel", - devRootButton: "WURZEL", devSearchPlaceholder: "Im Code zu suchender Text", devAnyExtension: "Beliebige Datei", - devSearchButton: "Suchen", devStatsFiles: "Dateien", devStatsLines: "Zeilen", devStatsModules: "Module", @@ -560,16 +471,13 @@ module.exports = { language: "Sprache", languageDescription: "Wenn du eine andere Sprache verwenden möchtest, wähle sie hier aus.", setLanguage: "Sprache festlegen", - peerConnections: "Verbindungen", peerConnectionsIntro: "Verwalte alle Verbindungen mit anderen Peers.", peerConnectionsTitle: "Verbindungen", online: "Online", offline: "Offline", discovered: 'Entdeckt', unknown: 'Unbekannt', - lanBroadcastLabel: "LAN-Broadcast", lanBroadcastActive: "Aktiv (UDP-Multicast im LAN)", - lanBroadcastDisabled: "Deaktiviert (Pub-Modus)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -582,8 +490,6 @@ module.exports = { noConnections: "Keine Peers verbunden.", noDiscovered: "Keine Peers entdeckt.", noUnknownPeers: "Keine unbekannten Peers im Freundes-Graphen.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -593,9 +499,6 @@ module.exports = { peerImport: "Importieren", peerImportTitle: "Peer-Liste importieren", peerImportPlaceholder: "Eine Multiserver-Adresse pro Zeile einfügen oder eine .txt-Datei hochladen…", - noSupportedConnections: "Keine Peers unterstützt.", - noBlockedConnections: "Keine Peers blockiert.", - noRecommendedConnections: "Keine Peers empfohlen.", connectionActionIntro: "", startNetworking: "Netzwerk starten", @@ -608,9 +511,19 @@ module.exports = { homePageDescription: "Wähle, welches Modul deine Startseite sein soll.", saveHomePage: "Startseite festlegen", invites: "Einladungen", - invitesTitle: "Einladungen", - invitesInvites: "Einladungen", invitesDescription: "Verwalte und verwende Einladungscodes in deinem Netzwerk.", + invitesPubsHint: "Füge einen Pub-Einladungscode ein, um dich mit ihm zu föderieren und seine Bewohner zu replizieren.", + invitesFederationsHint: "Pubs, mit denen du föderiert bist: aktualisieren, unerreichbare entfernen oder die Liste exportieren.", + invitesHousesHint: "Gib einen Haus-Code ein, um einem LARP-Haus beizutreten und an seiner Wirtschaft teilzunehmen.", + invitesTribesHint: "Gib einen Stammes-Code ein, um Mitglied zu werden und die privaten Inhalte zu sehen.", + invitesChatsHint: "Gib einen Chat-Code ein, um dem Gespräch und seinen Threads beizutreten.", + invitesPadsHint: "Gib einen Pad-Code ein, um gemeinsam an einem Dokument zu schreiben.", + invitesCalendarsHint: "Gib einen Kalender-Code ein, um Termine und Erinnerungen zu teilen.", + invitesEventsHint: "Gib einen Event-Code ein, um an einer privaten Veranstaltung teilzunehmen.", + invitesForumsHint: "Gib einen Forum-Code ein, um in einem privaten Forum zu lesen und zu antworten.", + invitesMapsHint: "Gib einen Karten-Code ein, um Orte auf einer gemeinsamen Karte zu sehen und hinzuzufügen.", + invitesShopsHint: "Gib einen Shop-Code ein, um einem Shop und seinem Katalog beizutreten.", + invitesInhabitantsHint: "Gib einen Bewohner-Code ein, um euch gegenseitig zu folgen und Inhalte auszutauschen.", invitesTribesTitle: "Stämme", invitesTribeInviteCodePlaceholder: "Stamm-Einladungscode eingeben", invitesTribeJoinButton: "Stamm beitreten", @@ -641,7 +554,6 @@ module.exports = { invitesAlreadyFederated: "Du bist bereits mit diesem Pub föderiert.", invitesFederationsTitle: "Föderationen", invitesAcceptedInvites: "Föderiert", - invitesNoInvites: "Noch keine Einladungen angenommen.", invitesUnfollow: "Entfolgen", invitesFollow: "Folgen", invitesUnfollowedInvites: "Nicht föderiert", @@ -661,39 +573,24 @@ module.exports = { panicMode: "Panikmodus!", encryptData: "Passwort festlegen (mind. 32 Zeichen), um deine Blockchain zu verschlüsseln", decryptData: "Passwort eingeben, um deine Blockchain zu entschlüsseln", - panicModeDescription: "Verschlüssele/Entschlüssele oder LÖSCHE deine Blockchain", removeDataDescription: "WARNUNG: Dieser Vorgang kann nicht rückgängig gemacht werden.", - encryptPanicButton: "Blockchain verschlüsseln", - decryptPanicButton: "Blockchain entschlüsseln", removePanicButton: "ALLE DEINE DATEN LÖSCHEN!", searchTitle: "Suche", searchDescriptionLabel: "Suche nach Inhalten in deinem Netzwerk.", - searchLanguagesLabel: "Sprachen", - searchSkillsLabel: "Fähigkeiten", searchPlaceholder:"Nach Inhalten suchen...", - searchDateLabel:"Datum", searchLocationLabel:"Ort", searchPriceLabel:"Preis", - searchUrlLabel: "URL", searchCategoryLabel:"Kategorie", - searchStartLabel: "Startzeit", - searchEndLabel: "Endzeit", searchPriorityLabel:"Priorität", searchStatusLabel: "Status", statusLabel: "Status", - totalVotesLabel: "Stimmen gesamt", noResultsFound: "Keine Ergebnisse gefunden.", votesOption: "Abstimmungsoptionen", voteYesLabel:"Ja", voteNoLabel:"Nein", allTypesLabel: "UNBEGRENZT", - ABSTENTIONLabel: "ENTHALTUNG", YESLabel: "JA", NOLabel: "NEIN", - FOLLOW_MAJORITYLabel: "MEHRHEIT FOLGEN", - CONFUSEDLabel: "VERWIRRT", - NOT_INTERESTEDLabel: "NICHT INTERESSIERT", - StatusLabel: "Status", votesOptionYesLabel:"Ja", votesOptionNoLabel:"Nein", votesOptionAbstentionLabel: "Enthaltung", @@ -701,7 +598,6 @@ module.exports = { votesCreatedByLabel: "Erstellt von", voteStatusOpen: "OFFEN", voteStatusClosed: "GESCHLOSSEN", - imageSearchLabel: "Gib Wörter ein, um nach Bildern zu suchen.", commentDescription: ({ parentUrl }) => [ " hat kommentiert in ", a({ href: parentUrl }, " Thread"), @@ -712,53 +608,20 @@ module.exports = { a({ href: parentUrl }, " einem Beitrag"), ], subtopicTitle: ({ authorName }) => [`Unterthema zu @${authorName}s Beitrag`], - mysteryDescription: "hat einen geheimnisvollen Beitrag veröffentlicht", oasisDescription: "OASIS Projekt-Netzwerk", searchSubmit: "Suchen...", - postLabel: "BEITRÄGE", - aboutLabel: "BEWOHNER", - feedLabel: "FEEDS", votesLabel: "ABSTIMMUNGEN", - reportLabel: "BERICHTE", - imageLabel: "BILDER", - videoLabel: "VIDEOS", - audioLabel: "AUDIOS", - documentLabel: "DOKUMENTE", - torrentLabel: "TORRENTS", pdfFallbackLabel: "PDF-Dokument", - eventLabel: "VERANSTALTUNGEN", - taskLabel: "AUFGABEN", - transferLabel: "ÜBERWEISUNGEN", - curriculumLabel: "LEBENSLAUF", - bookmarkLabel: "LESEZEICHEN", - tribeLabel: "STÄMME", - marketLabel: "MARKT", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "GELDBÖRSEN", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Absenden", - subjectLabel: "Betreff", editProfile: "Avatar bearbeiten", - profileQrAlt: "Profil-QR-Code", - profileQrHint: "Scannen, um diese Oasis-ID zu kopieren.", oasisIdLabel: "OasisID", - spreadLabel: "Verbreiten", - spreadHint: "Verbreite dies an deine Unterstützer (über deinen Feed).", + spreadContent: "Replizieren", welcomePmSubject: "Hello World!", - welcomePmBody: "Willkommen bei Oasis — ein freies, peer-to-peer, föderiertes und verschlüsseltes soziales Netzwerk mit einer verteilten Architektur nur mit Einladung.\n\nEinige interessante Orte zum Anfangen:\n\n- /profile — Bearbeite deinen Avatar, Namen, deine Beschreibung und welche Module auf deiner öffentlichen Seite erscheinen.\n- /invites — Füge einen Pub hinzu, um dich mit dem weiteren Netzwerk zu föderieren.\n- /peers — Sieh, wer verbunden ist, scanne dein LAN erneut, exportiere oder importiere Peer-Listen.\n- /inhabitants — Entdecke und besuche die Avatare anderer Personen.\n- /tribes — Erstelle private Gruppen mit Ende-zu-Ende-Verschlüsselung oder tritt ihnen bei.\n- /inbox — Lies und sende private Nachrichten.\n- /activity — Sieh die jüngste Aktivität, deine und die deines Netzwerks.\n- /publish — Schreibe einen Beitrag oder teile ein Bild, Audio, Video oder Dokument.\n- /search — Durchsuche die Inhalte des Netzwerks nach Typ.\n\nEinige interessante Orte zum Verbinden:\n\n- /fediverse — Verwalte deine anderen Fediverse-Konten, einschließlich Senden und Empfangen von Inhalten.\n\nDiese Nachricht wurde privat von dir an dich selbst gesendet, daher war keine Verbindung nötig, um sie zu empfangen.", - profileVisibilityTitle: "Sichtbarkeit des öffentlichen Profils", - profileVisibilityHint: "Wähle, welche Felder andere Bewohner in deinem Profil sehen. Standardmäßig wird nur Karma angezeigt.", + welcomePmBody: "Willkommen bei Oasis — ein freies, peer-to-peer, föderiertes und verschlüsseltes soziales Netzwerk mit einer verteilten Architektur nur mit Einladung.\n\nEinige interessante Orte zum Anfangen:\n\n- /profile — Bearbeite deinen Avatar, Namen, deine Beschreibung und welche Module auf deiner öffentlichen Seite erscheinen.\n- /invites — Füge einen Pub hinzu, um dich mit dem weiteren Netzwerk zu föderieren.\n- /peers — Sieh, wer verbunden ist, scanne dein LAN erneut, exportiere oder importiere Peer-Listen.\n- /inhabitants — Entdecke und besuche die Avatare anderer Personen.\n- /tribes — Erstelle private Gruppen mit Ende-zu-Ende-Verschlüsselung oder tritt ihnen bei.\n- /inbox — Lies und sende private Nachrichten.\n- /activity — Sieh die jüngste Aktivität, deine und die deines Netzwerks.\n- /publish — Schreibe einen Beitrag oder teile ein Bild, Audio, Video oder Dokument.\n- /search — Durchsuche die Inhalte des Netzwerks nach Typ.\n\nEinige interessante Orte zum Verbinden:\n\n- /Multiversum — Verwalte deine anderen Multiversum-Konten, einschließlich Senden und Empfangen von Inhalten.\n\nDiese Nachricht wurde privat von dir an dich selbst gesendet, daher war keine Verbindung nötig, um sie zu empfangen.", profileSensorsSectionTitle: "Sensoren", profileVisibilityActivity: "Aktivitätsstufe", - profileVisibilityDevice: "Gerät", profileDeviceLockedHint: "Dieser Sensor ist immer aktiv: Er zeigt anderen, von welchem Gerät du dich verbindest, und kann nicht deaktiviert werden.", profileVisibilityKarma: "KARMA-Punkte", profileVisibilityUbi: "UBI", @@ -766,7 +629,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "GPG-Schlüssel", - profileVisibilityClearnet: "Mein Profil veröffentlichen", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Shops", profileClearnetJobsLabel: "Stellen", @@ -820,7 +682,6 @@ module.exports = { " oder den Verbindungsstatus.", ], walletSentToLine: ({ destination, amount }) => `ECO ${amount} gesendet an ${destination}`, - walletSettingsTitle: "Geldbörse", walletSettingsDescription: "Integriere Oasis mit deiner ECOin-Wallet.", walletSettingsDocLink: "ECOin-Installationsanleitung", walletStatusMessages: { @@ -842,36 +703,18 @@ module.exports = { cipherTitle: "Verschlüsselung", cipherDescription: "Verschlüssele und entschlüssele Text symmetrisch.", randomPassword: "Zufälliges Passwort", - cipherEncryptTitle: "Text verschlüsseln", - cipherEncryptDescription: "Text zum Verschlüsseln eingeben", - cipherTextLabel: "Zu verschlüsselnder Text", cipherTextPlaceholder: "Text eingeben...", cipherPasswordLabel: "Passwort (mind. 32 Zeichen)", cipherPasswordPlaceholder: "Passwort eingeben...", cipherEncryptButton: "Verschlüsseln", - cipherDecryptTitle: "Text entschlüsseln", - cipherDecryptDescription: "Text zum Entschlüsseln eingeben", cipherEncryptedMessageLabel: "Verschlüsselter Text", cipherDecryptedMessageLabel: "Entschlüsselter Text", - cipherPasswordUsedLabel: "Verwendetes Passwort (aufbewahren!)", cipherEncryptedTextPlaceholder: "Verschlüsselten Text eingeben...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Initialisierungsvektor eingeben...", cipherDecryptButton: "Entschlüsseln", password: "Passwort", text: "Text", encryptedText: "Verschlüsselter Text", iv: "Initialisierungsvektor (IV)", - encryptTitle: "Text verschlüsseln", - encryptDescription: "Text und Passwort eingeben.", - encryptButton: "Verschlüsseln", - decryptTitle: "Text entschlüsseln", - decryptDescription: "Verschlüsselten Text und Passwort eingeben.", - decryptButton: "Entschlüsseln", - passwordLengthError: "Passwort muss mind. 32 Zeichen lang sein.", - missingFieldsError: "Text, Passwort oder IV fehlt.", - encryptionError: "Fehler beim Verschlüsseln.", - decryptionError: "Fehler beim Entschlüsseln.", bookmarkTitle: "Lesezeichen", bookmarkDescription: "Lesezeichen in deinem Netzwerk entdecken und verwalten.", bookmarkAllSectionTitle: "Lesezeichen", @@ -897,8 +740,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Optional", bookmarkTagsLabel: "Tags", bookmarkTagsPlaceholder: "Tags durch Kommas getrennt eingeben", - bookmarkCategoryLabel: "Kategorie", - bookmarkCategoryPlaceholder: "Optional", bookmarkLastVisitLabel: "Letzter Besuch", bookmarkSearchPlaceholder: "URL, Tags, Kategorie, Autor suchen...", bookmarkSortRecent: "Neueste zuerst", @@ -913,8 +754,6 @@ module.exports = { noLastVisit: "Kein letzter Besuch", videoTitle: "Videos", videoDescription: "Videoinhalte in deinem Netzwerk entdecken und verwalten.", - videoPluginTitle: "Titel", - videoPluginDescription: "Beschreibung", videoMineSectionTitle: "Deine Videos", videoCreateSectionTitle: "Video hochladen", videoUpdateSectionTitle: "Video aktualisieren", @@ -946,7 +785,6 @@ module.exports = { videoSortOldest: "Älteste zuerst", videoSortTop: "Meistgewählt", videoSearchButton: "Suche", - videoMessageAuthorButton: "PN", videoUpdatedAt: "Aktualisiert", videoNoMatch: "Keine Videos gefunden.", documentTitle: "Dokumente", @@ -987,8 +825,6 @@ module.exports = { documentUpdatedAt: "Aktualisiert", audioTitle: "Audios", audioDescription: "Audioinhalte in deinem Netzwerk entdecken und verwalten.", - audioPluginTitle: "Titel", - audioPluginDescription: "Beschreibung", audioMineSectionTitle: "Deine Audios", audioCreateSectionTitle: "Audio hochladen", audioUpdateSectionTitle: "Audio aktualisieren", @@ -999,7 +835,6 @@ module.exports = { audioFilterMine: "MEINE", audioFilterRecent: "NEUESTE", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Audio hochladen", audioUpdateButton: "Aktualisieren", audioDeleteButton: "Löschen", @@ -1026,6 +861,7 @@ module.exports = { audioFilterFavorites: "FAVORITEN", favoritesTitle: "Favoriten", favoritesDescription: "Alle deine favorisierten Inhalte an einem Ort.", + favoritesSearchPlaceholder: "Favoriten durchsuchen...", favoritesFilterAll: "ALLE", favoritesFilterRecent: "NEUESTE", favoritesFilterAudios: "AUDIOS", @@ -1041,18 +877,13 @@ module.exports = { favoritesNoItems: "Noch keine Favoriten.", yourContacts: "Deine Kontakte", allInhabitants: "Bewohner", - allCVs: "Alle Lebensläufe", + allCVs: "Lebensläufe", discoverPeople: "Entdecke Bewohner in deinem Netzwerk.", - allInhabitantsButton: "ALLE", - contactsButton: "UNTERSTÜTZT", - CVsButton: "CVs", - matchSkills: "Fähigkeiten abgleichen", - matchSkillsButton: "FÄHIGKEITEN ABGLEICHEN", - suggestedButton: "VORGESCHLAGEN", searchInhabitantsPlaceholder: "BEWOHNER NACH NAME FILTERN …", filterLocation: "BEWOHNER NACH ORT FILTERN …", filterLanguage: "BEWOHNER NACH SPRACHE FILTERN …", filterSkills: "BEWOHNER NACH FÄHIGKEITEN FILTERN …", + cvSkillsCount: "Fähigkeiten", applyFilters: "Filter anwenden", locationLabel: "Ort", languagesLabel: "Sprachen", @@ -1061,17 +892,18 @@ module.exports = { mutualFollowers: "Gemeinsame Follower", suggestedFollowsYou: "Folgt dir", latestInteractions: "Letzte Interaktionen", - viewAvatar: "Avatar anzeigen", - viewCV: "Lebenslauf anzeigen", suggestedSectionTitle: "Vorgeschlagen", topkarmaSectionTitle: "Top Karma", topecoSectionTitle: "Top Öko", topactivitySectionTitle: "Top Aktivität", + "TOP INACTIVITYButton": "AM INAKTIVSTEN", + topinactivitySectionTitle: "Am wenigsten aktive Bewohner", blockedSectionTitle: "Blockiert", gallerySectionTitle: "GALERIE", - blockedButton: "BLOCKIERT", + topSectionTitle: "TOP", blockedLabel: "Blockierter Bewohner", inhabitantviewDetails: "Details anzeigen", + cvVisitButton: "Lebenslauf ansehen", keepReading: "Weiterlesen...", oasisId: "ID", noInhabitantsFound: "Noch keine Bewohner gefunden.", @@ -1084,8 +916,9 @@ module.exports = { parliamentFilterCandidatures: "KANDIDATUREN", parliamentFilterProposals: "VORSCHLÄGE", parliamentFilterLaws: "GESETZE", - parliamentFilterHistorical: "HISTORISCH", - parliamentFilterLeaders: "ANFÜHRER", + parliamentFilterRevocations: "ABBERUFUNGEN", + parliamentFilterHistorical: "VERLAUF", + parliamentFilterLeaders: "FÜHRUNG", parliamentFilterRules: "REGELN", parliamentGovernmentCard: "Aktuelle Regierung", parliamentActorInPowerInhabitant: 'REGIERENDER BEWOHNER', @@ -1109,10 +942,8 @@ module.exports = { parliamentPoliciesDeclined: "GESETZE ABGELEHNT", parliamentPoliciesDiscarded: "GESETZE VERWORFEN", parliamentEfficiency: "% EFFIZIENZ", - parliamentFilterRevocations: 'WIDERRUFE', parliamentRevocationFormTitle: 'Gesetz widerrufen', parliamentRevocationLaw: 'Gesetz', - parliamentRevocationTitle: 'Titel', parliamentRevocationReasons: 'Begründung', parliamentRevocationPublish: 'Widerruf veröffentlichen', parliamentCurrentRevocationsTitle: 'Aktuelle Widerrufe', @@ -1125,23 +956,12 @@ module.exports = { parliamentNoGovernments: "Noch keine Regierungen vorhanden.", parliamentCandidatureFormTitle: "Kandidatur vorschlagen", parliamentCandidatureIdPh: "Oasis-ID (@...) oder Stammname", - parliamentCandidatureSlogan: "Slogan (max. 140 Zeichen)", - parliamentCandidatureSloganPh: "Ein kurzes Motto", parliamentCandidatureMethod: "Methode", parliamentCandidatureProposeBtn: "Kandidatur veröffentlichen", - parliamentThDate: "Vorschlagsdatum", - parliamentThSlogan: "Slogan", - parliamentThSince: "Profil seit", - parliamentThVotes: "Erhaltene Stimmen", - parliamentThVoteAction: "Abstimmen", - parliamentTypeUser: "Bewohner", - parliamentTypeTribe: "Stamm", parliamentVoteBtn: "Abstimmen", parliamentProposalFormTitle: "Gesetz vorschlagen", parliamentProposalDescription: "Beschreibung (≤1000)", parliamentProposalPublish: "Vorschlag veröffentlichen", - parliamentFinalize: "Abschließen", - parliamentDeadline: "Frist", parliamentNoProposals: "Noch keine Gesetzesvorschläge vorhanden.", parliamentNoLaws: "Noch keine Gesetze genehmigt.", parliamentMethodDEMOCRACY: "Demokratie", @@ -1159,29 +979,21 @@ module.exports = { parliamentVotesSlashTotal: "Stimmen/Gesamt", parliamentVotesNeeded: "Benötigte Stimmen", parliamentFutureLawsTitle: "Zukünftige Gesetze", - parliamentNoFutureLaws: "Noch keine zukünftigen Gesetze.", parliamentVoteAction: "Abstimmen", - parliamentLeadersTitle: "Anführer", parliamentThLeader: "AVATAR", parliamentPopulation: "Bevölkerung", - parliamentThType: "Typ", - parliamentThInPower: "An der Macht", parliamentThPresented: "KANDIDATUREN", parliamentNoLeaders: "Noch keine Anführer.", parliamentCandidaturesListTitle: "Liste der Kandidaturen", parliamentTimeRemaining: "Verbleibende Zeit", - parliamentNoLeader: "Noch keine führende Kandidatur.", parliamentElectionsStatusTitle: "Nächste Regierung", parliamentProposalDeadlineLabel: "Frist", parliamentProposalTimeLeft: "Verbleibende Zeit", - parliamentProposalOnTrack: "Auf Kurs zur Annahme", - parliamentProposalOffTrack: "Noch nicht genügend Unterstützung", parliamentRulesTitle: "Wie das Parlament funktioniert", parliamentRulesIntro: "Wahlen werden alle 2 Monate aufgelöst; Kandidaturen laufen durchgehend und werden zurückgesetzt, wenn eine Regierung gewählt wird.", parliamentRulesCandidates: "Jeder Bewohner kann sich selbst, einen anderen Bewohner oder einen Stamm vorschlagen. Jeder Bewohner kann bis zu 3 Kandidaturen pro Zyklus einreichen; Duplikate im selben Zyklus werden abgelehnt.", parliamentRulesElection: "Der Gewinner ist die Kandidatur mit den meisten Stimmen zum Zeitpunkt der Auflösung.", parliamentRulesTies: "Stichwahl-Reihenfolge: höchstes Bewohner-Karma; bei Gleichstand ältestes Profil; bei weiterem Gleichstand frühester Vorschlag; dann lexikographisch nach ID.", - parliamentRulesFallback: "Wenn niemand abstimmt, gewinnt die zuletzt vorgeschlagene Kandidatur. Wenn keine Kandidaturen vorliegen, wird ein zufälliger Stamm ausgewählt.", parliamentRulesTerm: "Der Regierungs-Tab zeigt die aktuelle Regierung und Statistiken.", parliamentRulesMethods: "Formen: Anarchie (einfache Mehrheit), Demokratie (50%+1), Mehrheit (80%), Minderheit (20%), Karmatokratie (Vorschläge mit höchstem Karma), Diktatur (sofortige Genehmigung).", parliamentRulesAnarchy: "Anarchie ist der Standardmodus: Wenn bei der Auflösung keine Kandidatur gewählt wird, wird Anarchie ausgerufen. Unter Anarchie kann jeder Bewohner Gesetze vorschlagen.", @@ -1203,11 +1015,7 @@ module.exports = { courtsCaseFormTitle: "Fall eröffnen", courtsCaseRespondent: "Angeklagter / Beklagter", courtsCaseRespondentPh: "Oasis-ID (@...) oder Stammname", - courtsCaseMediatorsAccuser: "Mediatoren (Ankläger)", courtsCaseMethod: "Lösungsmethode", - courtsCaseDescription: "Beschreibung (max. 1000 Zeichen)", - courtsCaseEvidenceTitle: "Fallbeweise", - courtsCaseEvidenceHelp: "Bilder, Audios, Dokumente (PDF) oder Videos anhängen, die deinen Fall unterstützen.", courtsCaseSubmit: "Fall einreichen", courtsNominateJudge: "Richter nominieren", courtsJudgeId: "Richter", @@ -1252,22 +1060,6 @@ module.exports = { courtsRulesMisconduct: "Belästigung, Manipulation oder gefälschte Beweise können zu einer sofortigen negativen Lösung führen.", courtsRulesGlossary: "Fall: Aufzeichnung eines Konflikts. Beweis: Materialien, die Ansprüche unterstützen. Urteil: Entscheidung mit Maßnahme. Berufung: Antrag auf Überprüfung des Urteils.", courtsFilterActions: "AKTIONEN", - courtsNoActions: "Keine ausstehenden Aktionen für deine Rolle.", - courtsCaseTitlePlaceholder: "Kurze Beschreibung des Konflikts", - courtsCaseSeverity: "Schweregrad", - courtsCaseSeverityNone: "Kein Schweregrad", - courtsCaseSeverityLOW: "Niedrig", - courtsCaseSeverityMEDIUM: "Mittel", - courtsCaseSeverityHIGH: "Hoch", - courtsCaseSeverityCRITICAL: "Kritisch", - courtsCaseSubject: "Thema", - courtsCaseSubjectNone: "Kein Thema-Tag", - courtsCaseSubjectBEHAVIOUR: "Verhalten", - courtsCaseSubjectCONTENT: "Inhalt", - courtsCaseSubjectGOVERNANCE: "Regierung / Regeln", - courtsCaseSubjectFINANCIAL: "Finanzen / Ressourcen", - courtsCaseSubjectOTHER: "Sonstiges", - courtsHiddenRespondent: "Verborgen (nur für beteiligte Rollen sichtbar).", courtsThRole: "Rolle", courtsRoleAccuser: "Ankläger", courtsRoleDefence: "Verteidigung", @@ -1278,54 +1070,19 @@ module.exports = { courtsAssignJudgeBtn: "Richter auswählen", trendingTitle: "Trends", exploreTrending: "Entdecke die beliebtesten Inhalte in deinem Netzwerk.", - bookmarkButton: "LESEZEICHEN", - transferButton: "ÜBERWEISUNGEN", - eventButton: "TERMINE", - taskButton: "AUFGABEN", votesButton: "ABSTIMMUNGEN", - industryButton: "INDUSTRIE", - projectButton: "PROJEKTE", - shopProductButton: "PRODUKTE", - reportButton: "BERICHTE", - feedButton: "FEED", - marketButton: "MARKT", - imageButton: "BILDER", - audioButton: "AUDIOS", - videoButton: "VIDEOS", - documentButton: "DOKUMENTE", - torrentButton: "TORRENTS", - noTrendingFound: "Keine Trendinhalte gefunden.", - noContentMessage: "Noch keine Trendinhalte vorhanden.", - trendingDescription: "Beschreibung", - trendingDate: "Datum", - trendingLocation: "Ort", - trendingPrice: "Preis", - trendingUrl: "URL", - trendingCategory: "Kategorie", - trendingStart: "Start", - trendingEnd: "Ende", - trendingPriority: "Priorität", - trendingStatus: "Status", - trendingFrom: "Von", - trendingTo: "An", - trendingConcept: "Konzept", - trendingAmount: "Betrag", - trendingDeadline: "Frist", - trendingItemStatus: "Status", - trendingTotalVotes: "Stimmen gesamt", + shopProductButton: "SHOP", trendingTotalOpinions: "Meinungen gesamt", trendingNoContentMessage: "Noch keine Trends vorhanden.", - trendingAuthor: "Von", - trendingCreatedAtLabel: "Erstellt am", trendingTotalCount: "Gesamtzahl", tasksTitle: "Aufgaben", tasksDescription: "Aufgaben in deinem Netzwerk entdecken und verwalten.", + taskSearchPlaceholder: "Aufgaben suchen...", taskTitleLabel: "Titel", taskDescriptionLabel: "Beschreibung", taskStartTimeLabel: "Startzeit", taskEndTimeLabel: "Endzeit", taskPriorityLabel: "Priorität", - taskPrioritySelect: "Priorität auswählen", taskPriorityUrgent: "Dringend", taskPriorityHigh: "Hoch", taskPriorityMedium: "Mittel", @@ -1335,13 +1092,13 @@ module.exports = { taskVisibilityLabel: "Sichtbarkeit", taskPublic: "öffentlich", taskPrivate: "privat", - taskCreatedAt: "Erstellt am", - taskBy: "Von", taskStatus: "Status", taskStatusOpen: "Öffnen", taskStatusInProgress: "In Bearbeitung", taskStatusClosed: "Geschlossen", taskAssignedTo: "Zugewiesen an", + taskAssignedChip: "Zugewiesen", + taskUnassignedChip: "Nicht zugewiesen", taskAssignees: "Zugewiesene", taskAssignButton: "Mir zuweisen", taskUnassignButton: "Zuweisung aufheben", @@ -1354,7 +1111,6 @@ module.exports = { taskFilterInProgress: "IN BEARBEITUNG", taskFilterClosed: "GESCHLOSSEN", taskFilterAssigned: "ZUGEWIESEN", - taskFilterArchived: "ARCHIVIERT", taskFilterUrgent: "DRINGEND", taskFilterHigh: "HOCH", taskFilterMedium: "MITTEL", @@ -1367,23 +1123,21 @@ module.exports = { taskInProgressTitle: "Aufgaben in Bearbeitung", taskClosedTitle: "Geschlossene Aufgaben", taskAssignedTitle: "Zugewiesene Aufgaben", - taskArchivedTitle: "Archivierte Aufgaben", - taskPublicTitle: "Öffentliche Aufgaben", - taskPrivateTitle: "Private Aufgaben", notasks: "Keine Aufgaben vorhanden.", noLocation: "Kein Ort angegeben", taskSetStatus: "Status setzen", - eventTitle: "Termine", eventDateLabel: "Datum", + eventRecurrenceLabel: "Wiederholung", + eventRecurrenceUntil: "Wiederholen bis", + eventRecurrenceHint: "Lass das Enddatum leer für ein einmaliges Ereignis.", + eventUpcomingDates: "Nächste Termine", eventsTitle: "Termine", eventsDescription: "Termine in deinem Netzwerk entdecken und verwalten.", - eventDescription: "Beschreibung", + eventSearchPlaceholder: "Veranstaltungen suchen...", eventPrice: "Preis", eventStatus: "Status", - eventOrganizer: "Veranstalter", eventAllSectionTitle: "Termine", eventMineSectionTitle: "Deine Termine", - eventArchivedTitle: "Archivierte Termine", eventCreateSectionTitle: "Termin erstellen", eventUpdateSectionTitle: "Termin aktualisieren", eventDeleteButton: "Löschen", @@ -1391,11 +1145,26 @@ module.exports = { eventAddToCalendar: "Zum Kalender hinzufügen", eventVisitCalendar: "Kalender ansehen", viewTask: "Aufgabe ansehen", + viewEvent: "Event ansehen", + viewPad: "Pad ansehen", + viewMap: "Karte ansehen", + viewCalendar: "Kalender ansehen", viewReport: "Bericht ansehen", viewTransfer: "Transfer ansehen", viewItem: "Artikel ansehen", viewShop: "Shop ansehen", viewProject: "Projekt ansehen", + viewJob: "Job Ansehen", + viewPlace: "Ort Ansehen", + generatePdf: "PDF Erzeugen", + sharePm: "Per PN Teilen", + galleryImages: "Bilder (max. 50 MB pro Datei)", + galleryPhotos: "Bilder", + galleryAddPhoto: "Bild Hinzufügen", + galleryRemovePhoto: "Entfernen", + galleryVideo: "Video (max. 50 MB)", + galleryAddVideo: "Video Hinzufügen", + galleryRemoveVideo: "Video entfernen", viewVotation: "Abstimmung ansehen", voteCastTitle: "Stimme abgeben", voteResults: "Ergebnisse", @@ -1403,29 +1172,15 @@ module.exports = { eventDescriptionLabel: "Beschreibung", eventDescriptionPlaceholder: "Terminbeschreibung eingeben...", eventUpdateButton: "Aktualisieren", - eventAttendeesLabel: "Teilnehmer", - eventAttendeesPlaceholder: "Teilnehmer eingeben, durch Kommas getrennt...", eventTagsLabel: "Tags", - eventTagsPlaceholder: "Termin-Tags eingeben, durch Kommas getrennt...", - eventTags: "Tags", eventPriceLabel: "Preis", eventUrlLabel: "URL", eventAttendees: "Teilnehmer", - noAttendees: "Noch keine Teilnehmer", - eventCreatedAt: "Erstellt am", eventLocation: "Ort", eventLocationLabel: "Ort", - eventNoLocation: "Kein Ort angegeben", - eventNoURL: "Keine URL angegeben", - eventBy: "Von", noevents: "Keine Termine vorhanden.", eventDate: "Datum", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "Teilnehmen", - eventUnattendButton: "Nicht mehr teilnehmen", - eventCreatedBy: "Erstellt von", - eventAttendeesCount: "Teilnehmerzahl", - eventCreatedByYou: "Du hast diesen Termin erstellt", eventFilterAll: "ALLE", eventFilterMine: "MEINE", eventFilterToday: "HEUTE", @@ -1433,18 +1188,9 @@ module.exports = { eventFilterMonth: "DIESER MONAT", eventFilterYear: "DIESES JAHR", eventFilterArchived: "ARCHIVIERT", - eventTodayTitle: "Heutige Termine", - eventThisWeekTitle: "Termine dieser Woche", - eventThisMonthTitle: "Termine dieses Monats", - eventThisYearTitle: "Termine dieses Jahres", eventPrivacyLabel: "Sichtbarkeit", eventPublic: "Öffentlich", eventPrivate: "Privat", - eventPublicTitle: "Öffentliche Termine", - eventNoPrice: "Kostenloser Termin", - eventNoImage: "Kein Bild hochgeladen", - eventAttendConfirmation: "Du nimmst jetzt an diesem Termin teil", - eventUnattendConfirmation: "Du nimmst nicht mehr an diesem Termin teil", eventAttended: "Teilgenommen", eventUnattended: "Nicht teilgenommen", eventStatusOpen: "Öffnen", @@ -1455,6 +1201,10 @@ module.exports = { tagsTopSectionTitle: "Top-Tags", tagsCloudSectionTitle: "Tag-Wolke", tagsFilterAll: "ALLE", + tagsFilterMine: "MEINE", + tagsFilterRecent: "NEU", + tagsMineSectionTitle: "Meine Tags", + tagsRecentSectionTitle: "Neue Tags", tagsFilterTop: "TOP", tagsFilterCloud: "WOLKE", tagsNoItems: "Keine Tags vorhanden.", @@ -1498,18 +1248,12 @@ module.exports = { transfersDeadline: "Frist", transfersTags: "Tags", transfersStatus: "Status", - transfersStatusUnconfirmed: "UNBESTÄTIGT", - transfersStatusClosed: "GESCHLOSSEN", - transfersStatusDiscarded: "VERWORFEN", - transfersCreatedAt: "Erstellt am", transfersConfirmations: "BESTÄTIGUNGEN", - transfersContainingBlock: "Enthaltender Block", - transfersExportContract: "Smart Contract", + transfersExportContract: "Rechnung Erzeugen", transfersConfirmButton: "Überweisung bestätigen", transfersNoItems: "Keine Überweisungen gefunden.", transfersMineSectionTitle: "Deine Überweisungen", transfersUBISectionTitle: "UBI Überweisungen", - transfersMarketSectionTitle: "Markt-Überweisungen", transfersTopSectionTitle: "Top-Überweisungen", transfersPendingSectionTitle: "Ausstehende Überweisungen", transfersUnconfirmedSectionTitle: "Unbestätigte Überweisungen", @@ -1517,21 +1261,13 @@ module.exports = { transfersDiscardedSectionTitle: "Verworfene Überweisungen", transfersCreateSectionTitle: "Transfer erstellen", transfersAllSectionTitle: "Überweisungen", - transfersFilterFavs: "Favoriten", - transfersFavsSectionTitle: "Favorisierte Überweisungen", - transfersSearchLabel: "Suche", transfersSearchPlaceholder: "Konzept, Tags, Bewohner suchen...", transfersMinAmountLabel: "Mindestbetrag", transfersMaxAmountLabel: "Höchstbetrag", - transfersSortLabel: "Sortieren nach", transfersSortRecent: "Neueste zuerst", transfersSortAmount: "Höchster Betrag", transfersSortDeadline: "Nächste Frist", transfersSearchButton: "Suche", - transfersFavoriteButton: "Favorit", - transfersUnfavoriteButton: "Kein Favorit", - transfersMessageUserButton: "Nachricht", - transfersExpiringSoonBadge: "LÄUFT AB", transfersExpiredBadge: "ABGELAUFEN", transfersUpdatedAt: "Aktualisiert", transfersNoMatch: "Keine Überweisungen gefunden.", @@ -1576,16 +1312,6 @@ module.exports = { voteNoQuestion: "Keine Frage angegeben", voteUnknownCreator: "Unbekannter Ersteller", voteUnknownDate: "Unbekanntes Datum", - errorVoteNotFound: "Abstimmung nicht gefunden", - errorAlreadyVoted: "Du hast bereits abgestimmt.", - errorVoteClosedCannotEdit: "Eine geschlossene Abstimmung kann nicht bearbeitet werden", - errorVoteDeadlinePassed: "Die Frist für diese Abstimmung ist abgelaufen", - errorRetrievingVote: "Fehler beim Abrufen der Abstimmung", - errorCreatingVote: "Fehler beim Erstellen der Abstimmung", - errorVoteAlreadyVoted: "Nach Abgabe einer Meinung nicht mehr bearbeitbar", - errorDeletingOldVote: "Fehler beim Löschen der alten Meinung", - errorCreatingUpdatedVote: "Fehler beim Erstellen der aktualisierten Meinung", - errorCreatingTombstone: "Fehler beim Erstellen des Tombstone", voteDetailSectionTitle: 'Abstimmungsdetails', voteCommentsLabel: 'Kommentare', voteCommentsForumButton: 'Diskussion eröffnen', @@ -1595,7 +1321,6 @@ module.exports = { voteNewCommentButton: 'Kommentar veröffentlichen', voteNewCommentLabel: 'Einen Kommentar hinzufügen', cvTitle: "Lebenslauf", - cvLabel: "LEBENSLÄUFE", cvEditSectionTitle: "Lebenslauf bearbeiten", cvCreateSectionTitle: "Lebenslauf erstellen", cvDescription: "Verwalte und teile deine beruflichen Fähigkeiten und Informationen.", @@ -1614,19 +1339,16 @@ module.exports = { cvLocationLabel: "Ort", cvStatusLabel: "Status", cvPreferencesLabel: "Präferenzen", - cvOasisContributorLabel: "Oasis-Mitwirkender", cvPersonal: "Persönlich", cvOasis: "Oasis-Mitwirkender (optional)", - cvOasisContributorView: "Oasis-Beitrag", + cvOasisContributorView: "Beitrag", cvEducational: "Bildung (optional)", cvEducationalView: "Bildung", cvProfessional: "Beruf (optional)", cvProfessionalView: "Beruf", cvAvailability: "Verfügbarkeit (optional)", - cvAvailabilityView: "Verfügbarkeit", cvUpdateButton: "Aktualisieren", cvCreateButton: "Lebenslauf erstellen", - cvContactLabel: "Kontakt", cvCreatedAt: "Erstellt am", cvUpdatedAt: "Aktualisiert am", cvEditButton: "Aktualisieren", @@ -1635,8 +1357,103 @@ module.exports = { blogSubject: "Betreff", blogMessage: "Nachricht", blogImage: "Medien hochladen (max: 50MB)", + blogMedia: "Anhänge (bis zu 8 Bilder und ein Video)", blogPublish: "Vorschau", - noPopularMessages: "Noch keine beliebten Nachrichten veröffentlicht", + pollsTitle: "Umfragen", + dataTitle: "Übereinstimmungen", + dataDescription: "Erkunde und visualisiere die Übereinstimmungen in deinem Netzwerk.", + dataFilterAll: "ALLE", + dataFilterMine: "MEINE", + dataFilterRecent: "NEUESTE", + dataFilterTop: "TOP", + dataKindInhabitants: "BEWOHNER", + dataKindJobs: "JOBS", + dataKindProjects: "PROJEKTE", + dataKindEvents: "EREIGNISSE", + dataKindTribes: "STÄMME", + dataKindMarket: "MARKT", + dataKindHousing: "WOHNEN", + dataKindIndustry: "INDUSTRIE", + dataKindTasks: "AUFGABEN", + dataKindReports: "BERICHTE", + dataKindVotes: "ABSTIMMUNGEN", + dataSearchPlaceholder: "Querdaten durchsuchen...", + dataCohesionTitle: "Kohäsionskoeffizient (CC)", + dataCcShort: "CC", + dataCohesionHint: "Durchschnittliche Affinität zwischen allem, was das Netzwerk veröffentlicht hat.", + dataAffinity: "Affinität", + dataCommonTerms: "Schlüsselwort", + dataStatPeople: "Lebensläufe", + dataStatConnected: "Verbunden", + dataStatSkills: "Fähigkeiten", + dataBestMatch: "Bestes Match", + dataStatIsolated: "Isoliert", + dataStatEntities: "Verglichene Einheiten", + dataStatTerms: "Verschiedene Begriffe", + dataStatPairs: "Verbundene Paare", + dataMatchesTitle: "Übereinstimmungen", + dataMatchesHint: "Personalisierte Vorschläge des Algorithmus.", + dataTermsTitle: "Schlagwörter", + dataTermsHint: "Die Begriffe, die in den meisten Inhalten vorkommen.", + dataConnections: "Verknüpfte Treffer", + dataTopicTitle: "Alles zu", + dataTopicHint: "Was der Algorithmus mit diesem Thema verbindet", + dataNoMatches: "Keine Querdaten vorhanden.", + dataNoProfile: "Veröffentliche Inhalte oder schreib deinen Lebenslauf, damit der Algorithmus lernt, was dich interessiert.", + pollsDescription: "Modul, um das Netzwerk zu fragen und Antworten zu zählen.", + pollFilterAll: "ALLE", + pollFilterMine: "MEINE", + pollFilterRecent: "NEUESTE", + pollFilterTop: "TOP", + pollFilterVoted: "ABGESTIMMT", + pollFilterOpen: "OFFEN", + pollFilterClosed: "GESCHLOSSEN", + pollCreateButton: "Umfrage Erstellen", + pollCreateTitle: "Umfrage Erstellen", + pollEditTitle: "Umfrage Bearbeiten", + pollQuestion: "Frage", + pollQuestionPlaceholder: "Was möchtest du fragen?", + pollOptions: "Optionen (eine pro Zeile)", + pollOutcome: "Ergebnis", + pollNoVotesYet: "Noch keine Stimmen", + pollTie: "Gleichstand", + pollOptionsPlaceholder: "Platz\nPark\nBar", + pollAnonymous: "Anonym", + pollAnonymousLabel: "Anonyme Umfrage", + pollMultiple: "Mehrfachauswahl", + pollMultipleLabel: "Mehrere Antworten erlauben", + pollDeadline: "Frist", + pollTags: "Schlagwörter", + pollPublishButton: "Umfrage Veröffentlichen", + pollUpdateButton: "Aktualisieren", + pollCloseButton: "Schließen", + pollDeleteButton: "Löschen", + pollVoteButton: "Abstimmen", + pollChangeVote: "Stimme Ändern", + pollVoters: "Abstimmende", + pollComments: "Kommentare", + pollStatusLabel: "Status", + pollStatusOpen: "OFFEN", + pollStatusClosed: "GESCHLOSSEN", + pollSearchPlaceholder: "Umfragen suchen...", + pollsNoItems: "Keine Umfragen gefunden.", + viewPoll: "Umfrage Ansehen", + pollChatCreate: "Umfrage Erstellen", + pollInChat: "Umfrage", + blogTitle: "Blogs", + blogDescription: "Modul zum Entdecken und Verwalten von Blogs.", + blogFilterAll: "ALLE", + blogFilterMine: "MEINE", + blogFilterRecent: "NEUESTE", + blogFilterFavorites: "FAVORITEN", + blogFilterTop: "TOP", + blogCreateButton: "Blog Erstellen", + blogSearchPlaceholder: "Blogs suchen...", + blogComments: "Kommentare", + blogAllowComments: "Kommentare erlauben", + blogCommentsClosed: "Der Autor hat die Kommentare für diesen Blog geschlossen.", + blogNoItems: "Keine Blogs gefunden.", + viewBlog: "Blog Ansehen", forumTitle: "Foren", forumCategoryLabel: "Kategorie", forumTitleLabel: "Titel", @@ -1644,43 +1461,22 @@ module.exports = { forumCreateButton: "Forum erstellen", forumCreateSectionTitle: "Forum erstellen", forumDescription: "Diskutiere offen mit anderen Bewohnern in deinem Netzwerk.", + forumSearchPlaceholder: "Forum durchsuchen...", forumFilterAll: "ALLE", forumFilterMine: "MEINE", forumFilterRecent: "NEUESTE", forumFilterTop: "TOP", - forumMineSectionTitle: "Deine Foren", - forumRecentSectionTitle: "Neueste Foren", - forumAllSectionTitle: "Foren", forumDeleteButton: "Löschen", forumParticipants: "Teilnehmer", forumMessages: "Nachrichten", - forumLastMessage: "Letzte Nachricht", forumMessageLabel: "Nachricht", forumMessagePlaceholder: "Schreibe deine Nachricht...", forumSendButton: "Senden", - forumVisitForum: "Forum besuchen", noForums: "Keine Foren gefunden.", - forumVisitButton: "Forum besuchen", - forumCatGENERAL: "Allgemein", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Politik", - forumCatTECH: "Technik", - forumCatSCIENCE: "Wissenschaft", - forumCatMUSIC: "Musik", - forumCatART: "Kunst", - forumCatGAMING: "Gaming", - forumCatBOOKS: "Bücher", - forumCatFILMS: "Filme", - forumCatPHILOSOPHY: "Philosophie", - forumCatSOCIETY: "Gesellschaft", - forumCatPRIVACY: "Privatsphäre", - forumCatCYBERWARFARE: "Cyberkrieg", - forumCatSURVIVALISM: "Survivalismus", + forumVisitButton: "Forum Ansehen", + forumTopicLabel: "Thema", imageTitle: "Bilder", imageDescription: "Bildinhalte in deinem Netzwerk entdecken und verwalten.", - imagePluginTitle: "Titel", - imagePluginDescription: "Beschreibung", imageMineSectionTitle: "Deine Bilder", imageCreateSectionTitle: "Bild hochladen", imageUpdateSectionTitle: "Bild aktualisieren", @@ -1689,14 +1485,12 @@ module.exports = { imageTopSectionTitle: "Top-Bilder", imageFavoritesSectionTitle: "Favoriten", imageGallerySectionTitle: "Galerie", - imageMemeSectionTitle: "Memes", imageFilterAll: "ALLE", imageFilterMine: "MEINE", imageFilterRecent: "NEUESTE", imageFilterTop: "TOP", imageFilterFavorites: "FAVORITEN", imageFilterGallery: "GALERIE", - imageFilterMeme: "MEMES", imageCreateButton: "Bild hochladen", imageUpdateButton: "Aktualisieren", imageDeleteButton: "Löschen", @@ -1709,7 +1503,6 @@ module.exports = { imageTitlePlaceholder: "Optional", imageDescriptionLabel: "Beschreibung", imageDescriptionPlaceholder: "Optional", - imageMemeLabel: "MEME?", imageNoFile: "Keine Bilddatei angegeben", noImages: "Keine Bilder vorhanden.", imageSearchPlaceholder: "Titel, Tags, Beschreibung, Autor suchen...", @@ -1717,7 +1510,6 @@ module.exports = { imageSortOldest: "Älteste zuerst", imageSortTop: "Meistgewählt", imageSearchButton: "Suche", - imageMessageAuthorButton: "Nachricht", imageUpdatedAt: "Aktualisiert", imageNoMatch: "Keine Bilder gefunden.", feedTitle: "Feed", @@ -1725,7 +1517,6 @@ module.exports = { createFeedButton: "Feed senden!", feedPlaceholder: "Was passiert? (max. 280 Zeichen)", TODAYButton: "HEUTE", - CREATEButton: "Feed erstellen", totalOpinions: "Meinungen gesamt", moreVoted: "Meistgewählt", noFeedsFound: "Keine Feeds gefunden.", @@ -1748,20 +1539,12 @@ module.exports = { concept: "Konzept", description: "Beschreibung", meme: "Meme", - activityContact: "Kontakt", - activityBy: "Name", - activityPixelia: "Neues Pixel hinzugefügt", - viewImage: "Bild anzeigen", - playAudio: "Audio abspielen", - playVideo: "Video abspielen", typeRecent: "NEUESTE", - errorActivity: "Fehler beim Abrufen der Aktivität", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "NEUESTE", typeTribe: "STÄMME", typeLarp: "L.A.R.P.", typeInhabitants: "BEWOHNER", - activityProfileUpdated: "hat sein Profil aktualisiert", typeAbout: "BEWOHNER", typeCurriculum: "LEBENSLÄUFE", typeImage: "BILDER", @@ -1808,8 +1591,6 @@ module.exports = { typeCourtsSettlementAccepted: "Gerichte · Vergleich angenommen", typeCourtsNomination: "Gerichte · Nominierung", typeCourtsNominationVote: "Gerichte · Nominierungsabstimmung", - activitySupport: "Neue Allianz geschmiedet", - activityJoin: "Neuem PUB beigetreten", question: "Frage", deadline: "Frist", status: "Status", @@ -1823,12 +1604,8 @@ module.exports = { date: "Datum", category: "Kategorie", attendees: "Teilnehmer", - activitySpread: "->", - visitLink: "Link besuchen", - viewDocument: "Dokument anzeigen", location: "Ort", contentWarning: "Betreff", - personName: "Bewohnername", bankWalletConnected: "ECOin Wallet", bankUbiReceived: "UBI erhalten", bankTx: "Tx", @@ -1838,7 +1615,6 @@ module.exports = { link: "Link", activityProjectFollow: "%OASIS% unterstützt jetzt dieses Projekt %PROJECT%", activityProjectUnfollow: "%OASIS% unterstützt dieses Projekt nicht mehr %PROJECT%", - activityProjectPledged: "%OASIS% hat %AMOUNT% für das Projekt %PROJECT% zugesagt", following: "UNTERSTÜTZT", unfollowing: "NICHT MEHR UNTERSTÜTZT", pledged: "ZUGESAGT", @@ -1884,26 +1660,17 @@ module.exports = { courtsVotesSlashTotal: "JA / GESAMT", courtsOpenVote: "Abstimmung eröffnen", courtsAnswerTitle: "Auf die Klage antworten", - courtsStanceADMIT: "Zugeben", - courtsStanceDENY: "Bestreiten", - courtsStancePARTIAL: "Teilweise", - courtsStanceCOUNTERCLAIM: "Gegenklage", - courtsStanceNEUTRAL: "Neutral", courtsVerdictResult: "Ergebnis", courtsVerdictOrders: "Anordnungen", courtsSettlementText: "Bedingungen", courtsSettlementAccepted: "Angenommen", - courtsSettlementPending: "Ausstehend", courtsJudge: "Richter", courtsThSupports: "Unterstützungen", courtsFilterOpenCase: 'FALL ERÖFFNEN', - courtsEvidenceFileLabel: 'Beweisdatei (Bild, Audio, Video oder PDF)', - courtsCaseMediators: 'Mediatoren', courtsCaseMediatorsPh: 'Oasis-IDs der Mediatoren, durch Komma getrennt', courtsMediatorsLabel: 'Mediatoren', courtsThCase: 'Fall', courtsThCreatedAt: 'Startdatum', - courtsThActions: 'Aktionen', courtsPublicPrefLabel: 'Sichtbarkeit nach Klärung', courtsPublicPrefYes: 'Ich stimme zu, dass dieser Fall vollständig öffentlich sein kann', courtsPublicPrefNo: 'Ich bevorzuge, die Details privat zu halten', @@ -1911,8 +1678,11 @@ module.exports = { courtsMethodMEDIATION: 'Mediation', courtsNoCases: 'Keine Fälle.', reportsTitle: "Berichte", - reportsDescription: "Berichte zu Problemen, Fehlern, Missbrauch und Inhaltswarnungen in deinem Netzwerk verwalten und verfolgen.", + reportsDescription: "Verwalte und verfolge die Meldungen in deinem Netzwerk.", + reportsSearchPlaceholder: "Meldungen suchen...", reportsFilterAll: "ALLE", + reportsFilterRecent: "NEU", + reportsFilterTop: "TOP", reportsFilterMine: "MEINE", reportsFilterFeatures: "FUNKTIONEN", reportsFilterBugs: "FEHLER", @@ -1925,18 +1695,13 @@ module.exports = { reportsFilterInvalid: "UNGÜLTIG", reportsCreateButton: "Bericht erstellen", reportsTitleLabel: "Titel", - reportsDescriptionLabel: "Beschreibung", - reportsDescriptionPlaceholder: "Bitte eine ausführliche Beschreibung angeben.", reportsCategory: "Kategorie", - reportsCategoryLabel: "Kategorie", reportsCategoryFeatures: "Funktionen", reportsCategoryBugs: "Fehler", reportsCategoryAbuse: "Missbrauch", - reportsCategoryContent: "Inhaltsprobleme", + reportsCategoryContent: "Inhalt", reportsUpdateButton: "Aktualisieren", reportsDeleteButton: "Löschen", - reportsDateLabel: "Datum", - reportsUploadFile: "Medien hochladen (max: 50MB)", reportsMineSectionTitle: "Deine Berichte", reportsFeaturesSectionTitle: "Funktionsanfragen", reportsBugsSectionTitle: "Fehler", @@ -1944,11 +1709,6 @@ module.exports = { reportsContentSectionTitle: "Inhaltsprobleme", reportsAllSectionTitle: "Berichte", reportsNoItems: "Keine Berichte vorhanden.", - reportsValidationTitle: "Bitte einen gültigen Titel eingeben.", - reportsValidationDescription: "Beschreibung darf nicht leer sein.", - reportsValidationCategory: "Bitte eine Kategorie auswählen.", - reportsCreatedAt: "Erstellt am", - reportsCreatedBy: "Von", reportsSeverity: "Schweregrad", reportsSeverityLow: "Niedrig", reportsSeverityMedium: "Mittel", @@ -1959,13 +1719,10 @@ module.exports = { reportsStatusUnderReview: "In Prüfung", reportsStatusResolved: "Gelöst", reportsStatusInvalid: "Ungültig", - reportsUpdateStatusButton: "Status aktualisieren", - reportsAnonymityOption: "Anonym einreichen", - reportsAnonymousAuthor: "Anonym", reportsConfirmButton: "BERICHT BESTÄTIGEN!", reportsConfirmations: "Bestätigungen", reportsConfirmedSectionTitle: "Bestätigte Berichte", - reportsCreateTaskButton: "AUFGABE ERSTELLEN", + reportsCreateTaskButton: "Aufgabe erstellen", reportsOpenSectionTitle: "Offene Berichte", reportsUnderReviewSectionTitle: "Berichte in Prüfung", reportsResolvedSectionTitle: "Gelöste Berichte", @@ -2009,6 +1766,20 @@ module.exports = { reportsRequestedActionLabel: 'Gewünschte Maßnahme', reportsRequestedActionPlaceholder: 'Entfernen, verbergen, markieren, warnen, etc.', tribesTitle: "Stämme", + tribeFilterAll: "ALLE", + tribeFilterRecent: "NEUESTE", + tribeFilterMine: "MEINE", + tribeFilterMembership: "MITGLIEDSCHAFT", + tribeFilterSubtribes: "UNTERSTÄMME", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALERIE", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MEINE", + tribeFeedFilterALL: "ALLE", + tribeFeedFilterRECENT: "NEUESTE", + courtsStanceDENY: "Bestreiten", + courtsStanceADMIT: "Einräumen", + courtsStancePARTIAL: "Teilweise einräumen", tribeAllSectionTitle: "Stämme", tribeMineSectionTitle: "Deine Stämme", tribeCreateSectionTitle: "Stamm erstellen", @@ -2020,13 +1791,6 @@ module.exports = { tribeviewSubTribeButton: "Unter-Stamm besuchen", tribeRootLabel: "WURZEL", tribeDescription: "Stämme in deinem Netzwerk erkunden oder erstellen.", - tribeFilterAll: "ALLE", - tribeFilterMine: "MEINE", - tribeFilterMembership: "MITGLIEDSCHAFT", - tribeFilterRecent: "NEUESTE", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "UNTER-STÄMME", - tribeFilterGallery: "GALERIE", tribeMainTribeLabel: "HAUPTSTAMM", tribeCreateButton: "Stamm erstellen", tribeUpdateButton: "Aktualisieren", @@ -2045,13 +1809,8 @@ module.exports = { tribeModeLabel: "Einladungsmodus", tribeIsAnonymousLabel: "STATUS", tribeMembersCount: "Mitgliederzahl", - tribeInviteCodePlaceholder: "Einladungscode eingeben", - tribeJoinByCodeButton: "Mit Code beitreten", - tribeJoinButton: "BEITRETEN", tribeEnterInvite: "CODE EINGEBEN", tribeLeaveButton: "VERLASSEN", - tribeYes: "JA", - tribeNo: "NEIN", tribePublic: "ÖFFENTLICH", tribePrivate: "PRIVAT", tribeGenerateInvite: "EINZELNE EINLADUNG", @@ -2060,13 +1819,8 @@ module.exports = { tribeRemoveInvitation: "EINLADUNG ENTFERNEN", tribeCreatedAt: "Erstellt am", tribeAuthor: "Von", - tribeAuthorLabel: "AUTOR", tribeStrict: "Streng", tribeOpen: "Öffnen", - tribeFeedFilterRECENT: "NEUESTE", - tribeFeedFilterMINE: "MEINE", - tribeFeedFilterALL: "ALLE", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Weiterleitungen", tribeFeedRefeed: "Weiterleiten", tribeFeedMessagePlaceholder: "Einen Feed schreiben…", @@ -2076,17 +1830,12 @@ module.exports = { tribeNotFound: "Stamm nicht gefunden!", createTribeTitle: "Stamm erstellen", updateTribeTitle: "Stamm aktualisieren", - tribeSectionOverview: "Übersicht", tribeSectionInhabitants: "Bewohner", tribeSectionVotations: "ABSTIMMUNGEN", tribeSectionEvents: "TERMINE", - tribeSectionReports: "Berichte", tribeSectionTasks: "AUFGABEN", tribeSectionFeed: "FEED", tribeSectionForum: "FORUM", - tribeSectionMarket: "Markt", - tribeSectionJobs: "Stellen", - tribeSectionProjects: "Projekte", tribeSectionMedia: "Medien", tribeSectionImages: "BILDER", tribeSectionAudios: "AUDIOS", @@ -2124,11 +1873,6 @@ module.exports = { tribeTaskStatusClosed: "SCHLIESSEN", tribeTaskAssign: "ZUWEISEN", tribeTaskUnassign: "ENTZIEHEN", - tribeReportCreate: "Bericht erstellen", - tribeReportsEmpty: "Noch keine Berichte.", - tribeReportTitle: "Titel", - tribeReportDescription: "Beschreibung", - tribeReportCategory: "Kategorie", tribeVotationCreate: "Abstimmung erstellen", tribeVotationsEmpty: "Noch keine Abstimmungen.", tribeVotationTitle: "Titel", @@ -2146,27 +1890,6 @@ module.exports = { tribeForumCategory: "Kategorie", tribeForumReply: "Antworten", tribeForumReplies: "Antworten", - tribeMarketCreate: "Angebot erstellen", - tribeMarketEmpty: "Noch keine Angebote.", - tribeMarketTitle: "Titel", - tribeMarketDescription: "Beschreibung", - tribeMarketPrice: "Preis", - tribeMarketImage: "Bild", - tribeMarketCategory: "Kategorie", - tribeJobCreate: "Stelle erstellen", - tribeJobsEmpty: "Noch keine Stellen.", - tribeJobTitle: "Titel", - tribeJobDescription: "Beschreibung", - tribeJobLocation: "Ort", - tribeJobSalary: "Gehalt", - tribeJobDeadline: "Frist", - tribeProjectCreate: "Projekt erstellen", - tribeProjectsEmpty: "Noch keine Projekte.", - tribeProjectTitle: "Titel", - tribeProjectDescription: "Beschreibung", - tribeProjectGoal: "Ziel", - tribeProjectFunded: "Finanziert", - tribeProjectDeadline: "Frist", tribeMediaUpload: "Medien hochladen", readDocument: "Dokument lesen", tribeCreateImage: "Bild erstellen", @@ -2177,7 +1900,6 @@ module.exports = { tribeMediaEmpty: "Noch keine Medien.", tribeMediaTitle: "Titel", tribeMediaDescription: "Beschreibung", - tribeMediaType: "Typ", tribeMediaTypeImage: "Bild", tribeMediaTypeVideo: "Video", tribeMediaTypeAudio: "Audio", @@ -2187,11 +1909,6 @@ module.exports = { tribeInviteCodeText: "Einladungscode: ", oasisVersionLabel: "Oasis-Version", tribeInviteCodeHint: "Teile diesen Code mit jemandem, den du einladen möchtest. Er kann über /invites → Tribes beitreten.", - tribeGroupTribe: "Stamm", - tribeGroupOffice: "Büro", - tribeGroupNetwork: "Netzwerk", - tribeGroupEconomy: "Wirtschaft", - tribeGroupMedia: "Medien", tribeStatusOpen: "OFFEN", tribeStatusClosed: "GESCHLOSSEN", tribeStatusInProgress: "IN BEARBEITUNG", @@ -2201,33 +1918,17 @@ module.exports = { tribePriorityCritical: "KRITISCH", tribeTaskFilterAll: "ALLE", tribeMediaFilterAll: "ALLE", - tribeReportCatBug: "BUG", - tribeReportCatAbuse: "MISSBRAUCH", - tribeReportCatContent: "INHALT", - tribeReportCatOther: "SONSTIGES", tribeForumCatGeneral: "ALLGEMEIN", tribeForumCatProposal: "VORSCHLAG", tribeForumCatQuestion: "FRAGE", tribeForumCatAnnouncement: "ANKÜNDIGUNG", - tribeMarketCatGoods: "WAREN", - tribeMarketCatServices: "DIENSTE", - tribeMarketCatFood: "LEBENSMITTEL", - tribeMarketCatOther: "SONSTIGES", tribeStatusLabel: "Status", tribeSubTribes: "UNTER-STÄMME", tribeSubTribesCreate: "Unter-Stamm Erstellen", tribeSubTribesStrictDenied: "Der strikte Modus des Stammes erlaubt Ihnen nicht, neue Unter-Stämme zu erstellen. Bitte wenden Sie sich an den Administrator.", - tribeSubTribesEmpty: "Noch keine Unter-Stämme erstellt.", - tribeActivityJoined: "BEIGETRETEN", - tribeActivityLeft: "VERLASSEN", - tribeActivityFeed: "FEED", tribeActivityRefeed: "WEITERLEITUNG", - tribeGroupAnalytics: "Analysen", - tribeGroupCreative: "Kreativ", tribeSectionActivity: "AKTIVITÄT", tribeSectionTrending: "TRENDS", - tribeSectionOpinions: "MEINUNGEN", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "TAGS", tribeSectionSearch: "SUCHE", tribeActivityEmpty: "Noch keine Aktivität.", @@ -2239,25 +1940,15 @@ module.exports = { tribeTrendingPeriodWeek: "Diese Woche", tribeTrendingPeriodAll: "Gesamte Zeit", tribeTrendingEngagement: "Beteiligung", - tribeOpinionsEmpty: "Noch keine Meinungen.", - tribeOpinionsCast: "Abstimmen", - tribeOpinionsRankings: "Ranglisten", - tribeOpinionsAlreadyVoted: "Bereits abgestimmt", tribeTopCategory: "Meistgewählt", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Gemeinschaftliche Pixel-Art-Leinwand.", - tribePixeliaPaint: "Malen", - tribePixeliaContributors: "Mitwirkende", - tribePixeliaTotalPixels: "gemalte Pixel", tribeTagsEmpty: "Keine Tags gefunden.", - tribeTagsCloud: "Tag-Wolke", - tribeTagsContentWith: "Inhalt mit Tag", tribeSearchPlaceholder: "Stamminhalt durchsuchen...", tribeSearchEmpty: "Keine Ergebnisse gefunden.", tribeSearchResults: "Ergebnisse", tribeSearchMinChars: "Mindestens 2 Zeichen eingeben, um zu suchen.", agendaTitle: "Agenda", agendaDescription: "Hier findest du alle dir zugewiesenen Einträge.", + agendaSearchPlaceholder: "Agenda durchsuchen...", agendaFilterAll: "ALLE", agendaFilterToday: "HEUTE", agendaFilterUpcoming: "BEVORSTEHEND", @@ -2276,20 +1967,9 @@ module.exports = { agendaFilterProjects: "PROJEKTE", agendaFilterCalendars: "KALENDER", agendaNoItems: "Keine Zuweisungen gefunden.", - agendaAuthor: "Von", agendaDiscardButton: "Verwerfen", agendaRestoreButton: "Wiederherstellen", - agendaCreatedAt: "Erstellt am", - agendaTitleLabel: "Titel", agendaMembersCount: "Mitglieder", - agendaDescriptionLabel: "Beschreibung", - agendaStatus: "Status", - agendaVisibility: "Sichtbarkeit", - agendaEventDate: "Termindatum", - agendaEventLocation: "Ort", - agendaEventPrice: "Preis", - agendaEventUrl: "URL", - agendaTaskStart: "Startzeit", agendaLocationLabel: "Ort", agendaYes: "JA", agendaNo: "NEIN", @@ -2299,11 +1979,6 @@ module.exports = { agendareportCategory: "Kategorie", agendareportSeverity: "Schweregrad", agendareportStatus: "Status", - agendareportDescription: "Beschreibung", - agendaTaskEnd: "Endzeit", - agendaTaskPriority: "Priorität", - agendaTransferFrom: "Von", - agendaTransferTo: "An", agendaTransferConcept: "Konzept", agendaTransferAmount: "Betrag", agendaTransferDeadline: "Frist", @@ -2313,47 +1988,7 @@ module.exports = { voteNow: "Jetzt abstimmen", alreadyVoted: "Du hast bereits abgestimmt.", noOpinionsFound: "Keine Meinungen gefunden.", - RECENTButton: "NEUESTE", TOPButton: "TOP", - interestingButton: "INTERESSANT", - necessaryButton: "NOTWENDIG", - funnyButton: "LUSTIG", - disgustingButton: "WIDERLICH", - sensibleButton: "SENSIBEL", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "NUR FÜR ERWACHSENE", - boringButton: "LANGWEILIG", - confusingButton: "VERWIRREND", - usefulButton: "NÜTZLICH", - informativeButton: "INFORMATIV", - wellResearchedButton: "GUT RECHERCHIERT", - accurateButton: "ZUTREFFEND", - needsSourcesButton: "QUELLEN NÖTIG", - wrongButton: "FALSCH", - lowQualityButton: "NIEDRIGE QUALITÄT", - creativeButton: "KREATIV", - insightfulButton: "AUFSCHLUSSREICH", - actionableButton: "UMSETZBAR", - inspiringButton: "INSPIRIEREND", - loveButton: "LIEBE", - clearButton: "KLAR", - upliftingButton: "ERHEBEND", - unnecessaryButton: "UNNÖTIG", - rejectedButton: "ABGELEHNT", - misleadingButton: "IRREFÜHREND", - offTopicButton: "THEMENFREMD", - duplicateButton: "DUPLIKAT", - clickbaitButton: "CLICKBAIT", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "GEWALT", - toxicButton: "TOXISCH", - harassmentButton: "BELÄSTIGUNG", - hateButton: "HASS", - scamButton: "BETRUG", - triggeringButton: "TRIGGERND", - opinionsCreatedAt: "Erstellt am", opinionsTotalCount: "Meinungen gesamt", voteInteresting: "Interessant", voteNecessary: "Notwendig", @@ -2390,7 +2025,6 @@ module.exports = { voteCreative: "Kreativ", voteSpam: "Spam", voteAdultOnly: "Nur für Erwachsene", - publishBlog: "Blog veröffentlichen", privateMessage: "PN", pmSendTitle: "Private Nachrichten", pmSend: "Senden!", @@ -2401,7 +2035,6 @@ module.exports = { pmComposeTitle: "Nachricht senden", pmRecipients: "Empfänger", pmRecipientsHint: "Oasis-IDs durch Kommas getrennt eingeben", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Bis zu 7 Empfänger pro Nachricht.", pmTextPlaceholder: "Text auf 7000 Zeichen begrenzt.", pmSubject: "Betreff", @@ -2425,7 +2058,6 @@ module.exports = { pmCrypterCharsLabel: "Zeichen", pmInvalidRecipients: "Ungültige Oasis-ID (sollte wie @…=.ed25519 aussehen).", pmEncryptionLabel: "Verschlüsselung", - pmFile: "Anhang", private: "Privat", privateDescription: "Deine verschlüsselten Nachrichten.", privateInbox: "POSTEINGANG", @@ -2435,10 +2067,8 @@ module.exports = { noPrivateMessages: "Keine privaten Nachrichten.", pmFromLabel: "Von:", pmToLabel: "An:", - pmInvalidMessage: "Ungültige Nachricht", pmNoSubject: "(kein Betreff)", pmSubjectLabel: "Betreff:", - pmBodyLabel: "Inhalt", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2456,8 +2086,6 @@ module.exports = { inboxJobSubscribedTitle: "Neues Abonnement deines Stellenangebots", pmInhabitantWithId: "Bewohner mit OASIS-ID:", pmHasSubscribedToYourJobOffer: "hat dein Stellenangebot abonniert", - inboxProjectCreatedTitle: "Neues Projekt erstellt", - pmHasCreatedAProject: "hat ein Projekt erstellt", inboxMarketItemSoldTitle: "Artikel verkauft", inboxShopSoldTitle: "Produkt verkauft", pmYourItem: "Dein Artikel", @@ -2467,7 +2095,6 @@ module.exports = { pmHasPledged: "hat zugesagt", pmToYourProject: "für dein Projekt", blockchain: 'BlockExplorer', - blockchainTitle: 'BlockExplorer', blockchainDescription: 'Blöcke in der Blockchain erkunden und visualisieren.', blockchainNoBlocks: 'Keine Blöcke in der Blockchain gefunden.', blockchainStatsTitle: 'Statistiken', @@ -2479,19 +2106,17 @@ module.exports = { blockchainBlockCarbon: 'CO₂-Fußabdruck', blockchainBlockType: 'Typ', blockchainBlockTimestamp: 'Zeitstempel', - blockchainBlockContent: 'Block', - blockchainBlockURL: 'URL:', - blockchainContent: 'Block', - blockchainContentPreview: 'Vorschau des Blockinhalts', blockchainLatestDatagram: 'Letztes Datagramm', - blockchainDatagram: 'Datagramm', - blockchainDetails: 'Blockdetails anzeigen', + blockchainDatagram: "Datagramm", + blockchainDetails: "Blockdetails ansehen", blockchainViewBlockexplorer: "Im Blockexplorer ansehen", - blockchainBlockInfo: 'Blockinformationen', - blockchainBlockDetails: 'Details des ausgewählten Blocks', blockchainBack: 'Zurück zum BlockExplorer', blockchainContentDeleted: "Dieser Inhalt wurde gelöscht (Tombstone)", visitContent: "Inhalt besuchen", + favoriteAdd: "Zu Favoriten anheften", + pmContentTooltip: "Private Nachricht senden", + favoriteRemove: "Von Favoriten lösen", + reportContent: "Inhalt melden", banking: 'Bankwesen', bankingTitle: 'Bankwesen', bankingDescription: "Die ECOin-Wirtschaft: Guthaben, Grundeinkommen, Steuern und Industriewert.", @@ -2500,21 +2125,17 @@ module.exports = { bankRules: 'Regeln', pending: 'Ausstehend', closed: 'Geschlossen', - bankBack: 'Zurück zum Bankwesen', bankViewTx: 'Tx anzeigen', bankClaimNow: 'Jetzt beanspruchen', bankClaimUBI: 'UBI beanspruchen!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'Keine ausstehenden UBI-Zuweisungen für diese Epoche.', bankEpoch: 'Epoche', bankPool: 'Pool (diese Epoche)', bankWeightsSum: 'Gewichtssumme', - bankAllocations: 'Zuweisungen', bankNoAllocations: 'Keine Zuweisungen gefunden.', bankNoEpochs: 'Keine Epochen gefunden.', bankEpochAllocations: 'Epochen-Zuweisungen', @@ -2533,9 +2154,6 @@ module.exports = { bankYourFundsMonth: "Deine Mittel (diesen Monat)", bankIndustryBalance: "Industrieproduktion (geschätzt)", bankUserBalance: 'Dein Kontostand', - ecoWalletNotConfigured: 'ECOin Wallet nicht konfiguriert', - editWallet: 'Geldbörse bearbeiten', - addWallet: 'Geldbörse hinzufügen', bankAddresses: 'Adressen', bankNoAddresses: 'Keine Adressen gefunden.', bankUser: 'Oasis-ID', @@ -2560,15 +2178,7 @@ module.exports = { search: 'Suchen!', bankLocal: 'Lokal', bankFromOasis: 'Oasis', - bankMyAddress: 'Deine Adresse', - bankRemoveMyAddress: 'Meine Adresse entfernen', - bankNotRemovableOasis: 'Adressen können nicht lokal entfernt werden', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "KEIN GUTHABEN!", bankUbiAvailableOk: "VERFÜGBAR!", bankUbiAvailability: "BGE (Netzwerk)", @@ -2585,13 +2195,6 @@ module.exports = { shopsTitle: "Shops", shopDescription: "Shops im Netzwerk entdecken und verwalten.", shopTitle: "Shop", - shopFilterAll: "ALLE", - shopFilterMine: "MEINE", - shopFilterRecent: "NEUESTE", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUKTE", - shopFilterPrices: "PREISE", - shopFilterFavorites: "FAVORITEN", shopUpload: "Shop erstellen", shopAllSectionTitle: "Alle Shops", shopMineSectionTitle: "Meine Shops", @@ -2608,16 +2211,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Im Clearnet veröffentlichen", - shopClearnetUnpublish: "Aus Clearnet entfernen", - shopClearnetUrlLabel: "Clearnet-URL", - shopClearnetWarning: "Die Veröffentlichung im Clearnet macht diesen Shop für externe Suchmaschinen und Crawler indexierbar.", shopAddFavorite: "Favorit hinzufügen", shopRemoveFavorite: "Favorit entfernen", shopOpen: "OFFEN", shopClosed: "GESCHLOSSEN", - shopOpenShop: "Shop öffnen", - shopCloseShop: "Shop schließen", shopMakePrivate: "PRIVAT MACHEN (E2E)", shopMakePublic: "ÖFFENTLICH MACHEN", shopProducts: "Produkte", @@ -2645,8 +2242,6 @@ module.exports = { shopOrderPrice: "Preis", shopOrderBuyer: "Käufer", shopBackToShop: "Zurück zum Shop", - shopShareUrl: "URL teilen", - shopVisitShop: "SHOP BESUCHEN", marketVisitItem: "ARTIKEL ANZEIGEN", shopStatus: "STATUS", shopCreatedAt: "ERSTELLT", @@ -2655,12 +2250,10 @@ module.exports = { shopLocation: "Standort", shopTags: "Tags", shopVisibility: "Sichtbarkeit", - shopImage: "Bild", shopShortDescription: "Kurzbeschreibung", shopShortDescriptionPlaceholder: "Kurzbeschreibung fuer Shopkarten (max. 160 Zeichen)", shopTitlePlaceholder: "Name Ihres Shops", shopDescriptionPlaceholder: "Detaillierte Beschreibung Ihres Shops", - shopUrlPlaceholder: "https://ihre-shop-url.com", shopLocationPlaceholder: "Stadt, Land", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Kartentitel", @@ -2678,7 +2271,6 @@ module.exports = { bankUnitMinutes: "Minuten", bankUnitDays: "Tage", bankExchangeNoData: 'Keine Daten verfügbar', - bankExchangeIndex: 'ECOin-Wert (1h)', bankInflation: 'ECOin-Inflation (anual)', bankInflationMonthly: 'ECOin-Inflation (mensual)', bankExchangeChartTitle: 'Progression des ECOin-Werts im Zeitverlauf', @@ -2692,38 +2284,17 @@ module.exports = { bankingSyncStatusOutdated: 'Veraltet', statsTitle: 'Statistiken', statistics: "Statistiken", - statsInhabitant: "Bewohner-Statistiken", statsDescription: "Entdecke Statistiken über dein Netzwerk.", ALLButton: "ALLE", MINEButton: "MEINE", TOMBSTONEButton: "TOMBSTONES", - statsYou: "Du", - statsUserId: "Oasis-ID", statsCreatedAt: "Erstellt am", statsYourContent: "Inhalt", statsYourOpinions: "Meinungen", - statsYourTombstone: "Tombstones", - statsNetwork: "Netzwerk", - statsTotalInhabitants: "Bewohner", - statsDiscoveredTribes: "Stämme (Öffentlich)", - statsPrivateDiscoveredTribes: "Stämme (Privat)", statsNetworkContent: "Inhalt", - statsYourMarket: "Markt", - statsYourJob: "Stellen", - statsYourProject: "Projekte", - statsYourTransfer: "Überweisungen", - statsYourForum: "Foren", statsNetworkOpinions: "Meinungen", - statsDiscoveredMarket: "Markt", - statsDiscoveredJob: "Stellen", - statsDiscoveredProject: "Projekte", - statsBankingTitle: "Bankwesen", statsEcoWalletLabel: "ECOIN Wallet", statsEcoWalletNotConfigured: "Nicht konfiguriert!", - statsTotalEcoAddresses: "Adressen gesamt", - statsDiscoveredTransfer: "Überweisungen", - statsDiscoveredForum: "Foren", - statsNetworkTombstone: "Tombstones", statsBookmark: "Lesezeichen", statsEvent: "Termine", statsTask: "Aufgaben", @@ -2745,16 +2316,12 @@ module.exports = { statsAiExchange: "KI", statsPUBs: 'PUBs', statsPost: "Beiträge", - statsOasisID: "Oasis-ID", statsSize: "Gesamt (Größe)", statsBlockchainSize: "Blockchain (Größe)", statsBlobsSize: "Blobs (Größe)", statsActivity7d: "Aktivität (letzte 7 Tage)", statsActivity7dTotal: "7-Tage-Gesamt", statsActivity30dTotal: "30-Tage-Gesamt", - statsKarmaScore: "KARMA-Punktzahl", - statsPublic: "Öffentlich", - statsPrivate: "Privat", day: "TAG", messages: "Nachrichten", statsProject: "Projekte", @@ -2766,30 +2333,14 @@ module.exports = { statsProjectsCancelled: "Abgebrochen", statsProjectsGoalTotal: "Ziel gesamt", statsProjectsPledgedTotal: "Zugesagt gesamt", - statsProjectsSuccessRate: "Erfolgsquote", - statsProjectsAvgProgress: "Durchschnittlicher Fortschritt", - statsProjectsMedianProgress: "Medianer Fortschritt", - statsProjectsActiveFundingAvg: "Durchschn. aktive Finanzierung", - statsJobsTitle: "Stellen", - statsJobsTotal: "Stellen gesamt", - statsJobsOpen: "Öffnen", - statsJobsClosed: "Geschlossen", - statsJobsOpenVacants: "Offene Stellen", - statsJobsSubscribersTotal: "Abonnenten gesamt", - statsJobsAvgSalary: "Durchschnittsgehalt", - statsJobsMedianSalary: "Mediangehalt", statsMarketTitle: "Markt", statsMarketTotal: "Artikel gesamt", statsMarketForSale: "Zum Verkauf", statsMarketReserved: "Reserviert", statsMarketClosed: "Geschlossen", statsMarketSold: "Verkauft", - statsMarketRevenue: "Umsatz", - statsMarketAvgSoldPrice: "Durchschn. Verkaufspreis", statsUsersTitle: "Bewohner", user: "Bewohner", - statsTombstoneTitle: "Tombstones", - statsNetworkTombstones: "Netzwerk-Tombstones", statsTombstoneRatio: "Tombstone-Anteil (%)", statsParliamentCandidature: "Parlamentskandidaturen", statsParliamentTerm: "Parlamentsperioden", @@ -2816,30 +2367,21 @@ module.exports = { aiConfiguration: "Prompt setzen", aiPromptUsed: "Prompt", aiClearHistory: "Chatverlauf löschen", - aiSharePrompt: "Diese Antwort zum kollektiven Training hinzufügen?", - aiShareYes: "Ja", - aiShareNo: "Nein", - aiSharedLabel: "Zum Training hinzugefügt", - aiRejectedLabel: "Nicht zum Training hinzugefügt", aiServerError: "Die KI konnte nicht antworten. Bitte versuche es erneut.", aiInputPlaceholder: "Was gibt es Neues?", typeAiExchange: "KI", aiApproveTrain: "Zum kollektiven Training hinzufügen", aiRejectTrain: "Nicht trainieren", - aiTrainPending: "Genehmigung ausstehend", aiTrainApproved: "Für Training genehmigt", aiTrainRejected: "Für Training abgelehnt", aiSnippetsUsed: "Verwendete Fragmente", aiSnippetsLearned: "Erlernte Fragmente", statsAITraining: "KI-Training", - aiApproveCustomTrain: "Mit dieser benutzerdefinierten Antwort trainieren", aiCustomAnswerPlaceholder: "Schreibe deine benutzerdefinierte Antwort…", - statsAIExchanges: "Austausche", marketMineSectionTitle: "Deine Artikel", marketCreateSectionTitle: "Artikel erstellen", marketUpdateSectionTitle: "Aktualisieren", marketAllSectionTitle: "Markt", - marketRecentSectionTitle: "Neueste Marktartikel", marketTitle: "Markt", marketDescription: "Ein Marktplatz zum Austausch von Waren oder Dienstleistungen in deinem Netzwerk.", marketFilterAll: "ALLE", @@ -2869,14 +2411,11 @@ module.exports = { marketItemDeadline: "Frist", marketItemIncludesShipping: "Versand inklusive?", marketItemHighestBid: "Höchstgebot", - marketItemHighestBidder: "Höchstbietender", marketItemStock: "Bestand", marketOutOfStock: "Nicht vorrätig", - marketItemBidTime: "Gebotszeit", marketActionsUpdate: "Aktualisieren", marketUpdateButton: "Aktualisieren", marketActionsDelete: "Löschen", - marketActionsSold: "Als verkauft markieren", marketActionsChangeStatus: "STATUS ÄNDERN", marketActionsBuy: "KAUFEN!", marketAuctionBids: "Aktuelle Gebote", @@ -2885,21 +2424,17 @@ module.exports = { marketNoItems: "Noch keine Artikel vorhanden.", marketYourBid: "Dein Gebot", marketCreateFormImageLabel: "Medien hochladen (max: 50MB)", - marketSearchLabel: "Suche", marketSearchPlaceholder: "Titel oder Tags suchen", marketMinPriceLabel: "Mindestpreis", marketMaxPriceLabel: "Höchstpreis", - marketSortLabel: "Sortieren nach", marketSortRecent: "Neueste zuerst", marketSortPrice: "Preis", marketSortDeadline: "Frist", marketSearchButton: "Suche", marketAuctionEndsIn: "Endet", marketAuctionEnded: "Beendet", - marketMyBidBadge: "Du hast geboten", marketNoItemsMatch: "Keine Artikel gefunden.", housingTitle: "Wohnen", - housingLabel: "Wohnen", housingDescriptionText: "Entdecke und verwalte Orte in deinem Netzwerk.", modulesHousingLabel: "Wohnen", modulesHousingDescription: "Modul zum Entdecken und Verwalten von Orten.", @@ -2943,14 +2478,7 @@ module.exports = { housingAvailableFrom: "Verfügbar ab", housingAvailableTo: "Verfügbar bis", housingTags: "Schlagwörter", - housingImages: "Fotos (max. 50MB pro Datei)", - housingRemovePhoto: "Entfernen", spreadEditWarning: "Dieser Inhalt verliert seine Spreads beim Bearbeiten", - housingRemoveVideo: "Video entfernen", - housingAddPhoto: "Foto hinzufügen", - housingAddVideo: "Video hinzufügen", - housingVideo: "Video (max. 50MB)", - housingPhotos: "Fotos", housingRequests: "Anfragen", housingRequestButton: "Anfragen", housingCancelButton: "Anfrage zurückziehen", @@ -3019,7 +2547,6 @@ module.exports = { jobLocationPresencial: "Vor Ort", jobLocationRemote: "Remote", jobVacantsPlaceholder: "Anzahl der Positionen", - jobSalaryPlaceholder: "Gehalt in ECO für 1 Arbeitsstunde", jobImage: "Medien hochladen (max: 50MB)", jobTasks: "Aufgaben", jobType: "Stellenart", @@ -3029,7 +2556,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Top-Gehalt-Stellen", createJobButton: "Stelle veröffentlichen", - viewDetailsButton: "Details anzeigen", noJobsFound: "Keine Stellenangebote gefunden.", jobAuthor: "Von", jobTypeFreelance: "Freiberufler", @@ -3041,10 +2567,6 @@ module.exports = { jobsHoursOffered: "Angebotene Stunden", jobsHoursRequested: "Im Tausch gefragte Stunden", jobsExchangeSkill: "Im Tausch gefragte Fähigkeit", - jobsHoursOfferedPlaceholder: "z. B. 4", - jobsHoursRequestedPlaceholder: "z. B. 4", - jobsExchangeSkillPlaceholder: "z. B. Tischlerei, Design", - jobExchangeHint: "Für Stundentausch-Angebote füllen Sie statt des Gehalts die folgenden Felder aus.", jobTimePartial: "Teilzeit", jobTimeComplete: "Vollzeit", jobsDeleteButton: "LÖSCHEN", @@ -3052,28 +2574,17 @@ module.exports = { jobsFilterApplied: "BEWORBEN", jobsAppliedTitle: "Meine Bewerbungen", jobsAppliedBadge: "Beworben", - jobsFilterFavs: "Favoriten", - jobsFavsTitle: "Favoriten", - jobsFilterNeeds: "Braucht Hilfe", - jobsNeedsTitle: "Braucht Hilfe", - jobsSearchLabel: "Suche", jobsSearchPlaceholder: "Titel, Tags, Beschreibung suchen...", jobsMinSalaryLabel: "Mindestgehalt", jobsMaxSalaryLabel: "Höchstgehalt", - jobsSortLabel: "Sortieren nach", jobsSortRecent: "Neueste zuerst", jobsSortSalary: "Höchstes Gehalt", jobsSortSubscribers: "Meiste Bewerber", jobsSearchButton: "Suche", - jobsFavoriteButton: "Favorit", - jobsUnfavoriteButton: "Kein Favorit", - jobsMessageAuthorButton: "PN", jobsApplicants: "Bewerber", jobsUpdatedAt: "Aktualisiert", jobSetOpen: "Als OFFEN setzen", - jobNewBadge: "NEU", jobsTagsLabel: "Tags", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "Keine Stellen gefunden.", industrySearchPlaceholder: "Fabriken suchen…", industryAllSectors: "Alle Sektoren", @@ -3081,9 +2592,7 @@ module.exports = { industryAdvanceTo: "Setzen auf", industryAmount: "Betrag", industryApproveBuild: "Genehmigen", - industryBackToFacility: "← Fabrik", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Industrie-Blueprint", industryBlueprints: "Blueprints", industryBuild: "Build", industryBuildNotes: "Notizen", @@ -3096,18 +2605,13 @@ module.exports = { industryBuilds: "Builds", industryBuildTitle: "Titel", industryContribute: "Beitragen", - industryContributeEco: "ECO beitragen", - industryContributeLabor: "Arbeit beitragen", industryContributeButton: "Beitragen", - industryContributeMaterial: "Material beitragen", industryContributions: "Beiträge", - industryContributors: "Beitragende", industryCreateBlueprintButton: "Blueprint erstellen", industryDistribute: "Verteilen", industryDistributeButton: "Nach Anteilen verteilen", industryDistribution: "Verteilung", industryEcoAmount: "Betrag (ECO)", - industryEcoContribHint: "ECO-Beiträge werden an den Verwalter als Treuhänder der Build-Kasse überwiesen.", industryEditBlueprint: "Blueprint bearbeiten", industryFacility: "Fabrik", industryKindLabel: "Art", @@ -3116,13 +2620,10 @@ module.exports = { industryKind_eco: "Mittel", industryLaborHours: "Arbeit (Stunden)", industryHours: "Stunden", - industryLicense: "Lizenz", industryMaterialItem: "Material", industryMaterials: "Materialien", - industryMaterialsHint: "Ein Material pro Zeile, im Format Name:Menge:Preis.", industryEstMaterials: "Gesamtmaterialien", industryEstLabor: "Gesamtarbeit", - industryEstTaxes: "Steuern", industryEstTotal: "Geschätzter Preis", industryBuildingPrice: "Baupreis", industryFinalPrice: "Endpreis", @@ -3132,19 +2633,13 @@ module.exports = { industryNewBlueprint: "Neuer Blueprint", industryNewBuild: "Build vorschlagen", industryEditBuild: "Produktion bearbeiten", - industryNoBlueprint: "— keiner —", industryNeedBlueprint: "Erstelle zuerst einen Bauplan: jede Produktion fertigt einen.", industryNoBlueprints: "Noch keine Blueprints.", industryNoBuilds: "Noch keine Builds.", industryNote: "Notiz", industryOutput: "Ausgabe", - industryOutputItem: "Produktname", industryOutputKind: "Produkttyp", - industryOutputQty: "Einheiten pro Produktion", - industryOutputUnit: "Maßeinheit", industryOutputValue: "Ausgabewert (ECO, z. B. aus Verkauf)", - industryPayout: "Auszahlung", - industryPoints: "Karma", industryPostJob: "Stelle erstellen", industryPot: "Topf", industryProposeBuildButton: "Build vorschlagen", @@ -3152,8 +2647,6 @@ module.exports = { industryAuthor: "Autor", industrySellOnMarket: "An den Markt senden", industrySendToProjects: "Projekt erstellen", - industryShare: "Anteil", - industryShares: "Anteile", industrySkills: "Fähigkeiten", industryTreasury: "Kasse", industryKind_physical: "Physisch", @@ -3167,6 +2660,16 @@ module.exports = { industryBuildStatus_FAILED: "FEHLGESCHLAGEN", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Ein Job passt zu deinem Lebenslauf", + jobsBotMatchIntro: "Ein Job passt zu deinem Lebenslauf.", + jobsBotMatchJob: "Job", + jobsBotMatchHint: "Du erhältst dies, weil dein Lebenslauf KI-verwaltet ist. Du kannst es im Lebenslauf abschalten.", + cvAiManaged: "KI-verwaltet", + switchOn: "EIN", + switchOff: "AUS", + cvAiManagedHint: "Wenn aktiv, meldet JobsBot per Privatnachricht, wenn ein Job zu deinem Lebenslauf passt.", + cvMatchThreshold: "Ab dieser Übereinstimmung benachrichtigen", housingBotRequestedTitle: "Jemand hat einen deiner Orte angefragt.", housingBotCancelledTitle: "Eine Anfrage zu einem deiner Orte wurde zurückgezogen.", housingBotYouRequestedTitle: "Du hast einen Ort angefragt.", @@ -3195,22 +2698,14 @@ module.exports = { industryRulesDistribution: "Wenn eine Produktion abgeschlossen ist, verteilt der Steward den Topf (die Mittel der Produktion plus Verkaufswert) anteilig an die Beitragenden.", industryRulesTreasury: "ECO-Beiträge hält der Verwalter als Treuhänder der Build-Kasse bis zur Verteilung; alle Bewegungen werden im Netzwerk aufgezeichnet und Streitfälle können an die Courts gehen.", industryJobs: "Stellen", - industryNoJobs: "Noch keine Stellen.", - industryCreatePosition: "Stelle erstellen", - industryViewCV: "Lebenslauf", industryReportButton: "Melden", industryCreateTask: "Aufgabe erstellen", industryOpenDispute: "Streit eröffnen", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "z. B. Stück, kg, Lizenz", - industryOutputItemPlaceholder: "z. B. Roboter", - industryOutputQtyPlaceholder: "z. B. 5", - industrySkillsPlaceholder: "z. B. Löten, Netzwerke, Solar-Installation", industryCreateInvite: "Einladung generieren", industryPauseVotes: "Status-Stimmen", industryTitle: "Industrie", industryDescription: "Modul zur gemeinschaftlichen Verwaltung der Produktionsmittel.", - industryLabel: "Industrie", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "VERTEILUNG", @@ -3259,9 +2754,7 @@ module.exports = { industryInviteNeeded: "Du brauchst eine Einladung, um beizutreten.", industryPauseButton: "Für Pause stimmen", industryResumeButton: "Für Fortsetzung stimmen", - industryEditButton: "Bearbeiten", industryDeleteButton: "Löschen", - industryBackToList: "← Industrie", industryPendingApplicants: "Ausstehende Bewerber", industryVotesYes: "ja", industryVotesNo: "nein", @@ -3269,23 +2762,13 @@ module.exports = { industryAdmit: "Zulassen", industryReject: "Ablehnen", industryDissolveTitle: "Fabrik auflösen", - industryDissolveHint: "Die Auflösung erfordert eine gemeinschaftliche Abstimmung; der Verwalter kann sie nicht allein auflösen.", industryDissolveVote: "Für Auflösung stimmen", - industrySector_software: "Software", - industrySector_hardware: "Hardware", - industrySector_agriculture: "Landwirtschaft", - industrySector_textile: "Textil", - industrySector_energy: "Energie", - industrySector_food: "Lebensmittel", - industrySector_construction: "Bau", - industrySector_media: "Medien", - industrySector_services: "Dienstleistungen", - industrySector_other: "Andere", industryPolicy_open: "Offen", industryPolicy_vote: "Per Abstimmung", industryPolicy_invite: "Nur mit Einladung", projectsTitle: "Projekte", projectsDescription: "Gemeinschaftsprojekte in deinem Netzwerk erstellen, finanzieren und verfolgen.", + projectSearchPlaceholder: "Projekte suchen...", projectCreateProject: "Projekt erstellen", projectCreateButton: "Projekt erstellen", projectUpdateButton: "AKTUALISIEREN", @@ -3329,14 +2812,8 @@ module.exports = { projectPledgeTitle: "Dieses Projekt unterstützen", projectPledgePlaceholder: "Betrag in ECO", projectBounties: "Prämien", - projectBountiesInputLabel: "Prämien (eine pro Zeile: Titel|Betrag [ECO]|Beschreibung)", - projectBountiesPlaceholder: "UI-Fehler beheben|100|Link zum Problem\\nDoku schreiben|250|Anwendungsbeispiele skizzieren", projectNoBounties: "Keine Prämien gefunden.", projectTitle: "Titel", - projectAddBountyTitle: "Neue Prämie", - projectBountyTitle: "Prämientitel", - projectBountyAmount: "Betrag (ECO)", - projectBountyDescription: "Beschreibung", projectMilestoneSelect: "Meilenstein auswählen", projectBountyCreateButton: "Prämie erstellen", projectBountyStatus: "Prämienstatus", @@ -3351,19 +2828,15 @@ module.exports = { projectMilestoneTitle: "Meilensteintitel", projectMilestoneTargetPercent: "Prozent (%)", projectMilestoneDueDate: "Datum", - projectMilestoneCreateButton: "Meilenstein erstellen", projectMilestoneStatus: "Meilensteinstatus", projectMilestoneOpen: "offen", projectMilestoneDone: "abgeschlossen", projectMilestoneDue: "fällig", - projectNoMilestones: "Keine Meilensteine gefunden.", projectMilestoneMarkDone: "Als abgeschlossen markieren", projectMilestoneTitlePlaceholder: "Meilensteintitel eingeben", projectMilestoneDescriptionPlaceholder: "Beschreibung für diesen Meilenstein eingeben", projectMilestoneDescription: "Meilensteinbeschreibung", - projectBudgetGoal: "Budget (Ziel)", projectBudgetAssigned: "Prämien zugewiesen", - projectBudgetRemaining: "Verbleibend", projectBudgetOver: "Budget überschritten: Zuweisungen übersteigen das Ziel", projectFollowers: "Follower", projectFollowersTitle: "Follower", @@ -3376,7 +2849,6 @@ module.exports = { projectBackersTotalPledged: "Zugesagt gesamt", projectBackersYourPledge: "Deine Zusage", projectBackersNone: "Noch keine Zusagen.", - projectNoRemainingBudget: "Kein verbleibendes Budget.", projectFilterBackers: "UNTERSTÜTZER", projectFilterApplied: "BEWORBEN", projectAppliedTitle: "BEWORBEN", @@ -3385,30 +2857,15 @@ module.exports = { projectBackerAmount: "Gesamtbeitrag", projectBackerPledges: "Zusagen", projectBackerProjects: "Projekte", - projectPledgeAmount: "Betrag", projectSelectMilestoneOrBounty: "Meilenstein oder Prämie auswählen", projectPledgeButton: "Zusagen", footerLicense: "GPLv3", - footerPackage: "Paket", - footerVersion: "Version", modulesModuleName: "Name", modulesModuleDescription: "Beschreibung", modulesModuleStatus: "Status", modulesTotalModulesLabel: "Geladene Module", modulesEnabledModulesLabel: "Aktiviert", modulesDisabledModulesLabel: "Deaktiviert", - modulesPopularLabel: "Beliebt", - modulesPopularDescription: "Modul zum Empfang von Beiträgen, die im Trend liegen, am meisten angesehen oder kommentiert werden.", - modulesTopicsLabel: "Themen", - modulesTopicsDescription: "Modul zum Empfang von Diskussionskategorien basierend auf gemeinsamen Interessen.", - modulesSummariesLabel: "Zusammenfassungen", - modulesSummariesDescription: "Modul zum Empfang von Zusammenfassungen langer Diskussionen oder Beiträge.", - modulesLatestLabel: "Neueste", - modulesLatestDescription: "Modul zum Empfang der neuesten Beiträge und Diskussionen.", - modulesThreadsLabel: "Diskussionen", - modulesThreadsDescription: "Modul zum Empfang von Unterhaltungen, gruppiert nach Thema oder Frage.", - modulesMultiverseLabel: "Multiversum", - modulesMultiverseDescription: "Modul zum Empfang von Inhalten anderer föderierter Peers.", modulesInvitesLabel: "Einladungen", modulesInvitesDescription: "Modul zum Verwalten und Einlösen von Einladungscodes.", modulesWalletLabel: "Geldbörse", @@ -3449,8 +2906,12 @@ module.exports = { modulesOpinionsDescription: "Modul zum Entdecken und Bewerten von Meinungen.", modulesTransfersLabel: "Überweisungen", modulesTransfersDescription: "Modul zum Entdecken und Verwalten von Smart Contracts (Überweisungen).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Verwalte deine anderen Fediverse-Konten, einschließlich Senden und Empfangen von Inhalten.", + modulesFediverseLabel: "Multiversum", + modulesBlogsLabel: "Blogs", + modulesBlogsDescription: "Modul zum Entdecken und Verwalten von Blogs.", + modulesPollsLabel: "Umfragen", + modulesPollsDescription: "Modul, um das Netzwerk zu fragen und Antworten zu zählen.", + modulesFediverseDescription: "Verwalte deine anderen Multiversum-Konten, einschließlich Senden und Empfangen von Inhalten.", modulesFeedLabel: "Feed", modulesFeedDescription: "Modul zum Entdecken und Teilen von Kurztexten (Feeds).", modulesParliamentLabel: "Parlament", @@ -3486,37 +2947,33 @@ module.exports = { visibilityMakeHidden: "Verstecken", invitesInhabitantsTitle: "Bewohner", invitesInhabitantsFollow: "Folgen", - aiNavPlaceholder: "Wohin möchtest du gehen?", + aiNavPlaceholder: "Beschreib, was du brauchst...", aiNavDisabled: "KI-Navigation ist deaktiviert.", - aiNavResultsTitle: "KI-Navigationsvorschläge", + aiNavResultsTitle: "AINav-Vorschläge", aiNavQueryLabel: "Anfrage", - aiNavResultsDescription: "Wähle die Route, die am besten zu deiner Suche passt.", - aiNavResultPath: "Route", - aiNavResultDescription: "Was du dort tun kannst", aiNavResultMatch: "Übereinstimmung", aiNavResultsEmpty: "Keine passenden Routen. Versuche stattdessen /search.", - aiNavSearchInstead: "Stattdessen suchen", modulesAINavLabel: "AINav", modulesAINavDescription: "Modul für natürlichsprachliche Anfragen zum Inhalt des Netzwerks.", - directConnect: "Direkte Verbindung", directConnectDescription: "Verbinde dich direkt mit einem Peer, indem du IP-Adresse, Port und öffentlichen Schlüssel eingibst.", peerHost: "IP", peerPort: "Port (Standard: 8008)", peerPublicKey: "Öffentlicher Schlüssel (@...ed25519)", connectAndFollow: "Verbinden", - deviceSourceLabel: "Gerätetyp", modulesPresetTitle: "Gängige Konfigurationen", - modulesPreset_minimal: "Minimal", - modulesPreset_basic: "Basis", - modulesPreset_social: "Sozial", - modulesPreset_economy: "Wirtschaft", - modulesPreset_full: "Vollständig", + workflowsTitle: "Workflows", + workflowsDescription: "Ein Workflow legt das Thema und die aktiven Module fest.", + workflowsSet: "Workflow anwenden", + workflow_default: "Standard", + workflow_jobs: "Arbeit", + workflow_ruling: "Regierung", + workflow_politics: "Politik", + workflow_social: "Sozial", + workflow_business: "Geschäft", + workflow_night: "Nacht", + workflow_mobile: "Mobil", statsCarbonFootprintTitle: "CO2-Fußabdruck", - statsCarbonFootprintNetwork: "Netzwerk-CO2-Fußabdruck", - statsCarbonFootprintYours: "Dein CO2-Fußabdruck", statsCarbonTombstone: "Tombstoning-Fußabdruck", - feedSuccessMsg: "Feed erfolgreich veröffentlicht!", - dominantOpinionLabel: "Vorherrschende Meinung", uploadMedia: "Medien hochladen (max: 50MB)", cipherPasswordDecryptLabel: "Passwort (zum Entschlüsseln)", courtsRespondentInvalid: "Ungültiger Beklagter", @@ -3550,14 +3007,13 @@ module.exports = { mapDescriptionLabel: "Beschreibung", mapDescriptionPlaceholder: "Beschreiben Sie die Karte oder den Standort...", mapTypeLabel: "Kartentyp", - mapTypeSingle: "EINZELN (nur initialer Standort)", - mapTypeOpen: "OFFEN (jeder kann Markierungen hinzufügen)", - mapTypeClosed: "GESCHLOSSEN (nur Ersteller fügt Markierungen hinzu)", + mapInviteMode: "Einladung", + mapTypeSingle: "EINZELN", + mapTypeOpen: "OFFEN", + mapTypeClosed: "GESCHLOSSEN", mapTagsLabel: "Tags", mapTagsPlaceholder: "Tags durch Kommas getrennt eingeben", mapUrlLabel: "Karten-URL", - mapPickCoordLabel: "Oder wählen Sie einen Standort auf dem Raster:", - mapMarkersLabel: "Markierungen", mapMarkersTitle: "Markierungen", mapMarkerDefault: "Markierung", mapMarkerLatLabel: "Markierung Breitengrad", @@ -3584,14 +3040,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pads", modulesPadsDescription: "Modul zur Verwaltung kollaborativer Texteditoren.", - padFilterAll: "ALLE", - padFilterMine: "MEINE", - padFilterRecent: "AKTUELL", - padFilterOpen: "OFFEN", - padFilterClosed: "GESCHLOSSEN", padCreate: "Pad Erstellen", - padUpdate: "Pad Aktualisieren", - padDelete: "Pad Löschen", + padUpdate: "Aktualisieren", + padDelete: "Löschen", padTitleLabel: "Titel", padTitlePlaceholder: "Pad-Titel eingeben...", padStatusLabel: "Status", @@ -3602,14 +3053,7 @@ module.exports = { padTagsLabel: "Tags", padTagsPlaceholder: "tag1, tag2, ...", padMembersLabel: "Mitglieder", - padVisitPad: "Pad Besuchen", - padShareUrl: "URL Teilen", padCreated: "Erstellt", - padAuthor: "Autor", - padGenerateCode: "Code Generieren", - padInviteCodeLabel: "Einladungscode", - padInviteCodePlaceholder: "Einladungscode eingeben...", - padValidateInvite: "Validieren", padStartEditing: "BEARBEITUNG STARTEN!", padEditorPlaceholder: "Schreiben beginnen...", padSubmitEntry: "Senden", @@ -3622,19 +3066,17 @@ module.exports = { padClosedSectionTitle: "Geschlossene Pads", padCreateSectionTitle: "Neues Pad Erstellen", padUpdateSectionTitle: "Pad Aktualisieren", - padInviteGenerated: "Einladungscode Generiert", typePad: "PADS", padNew: "NEU", padAddFavorite: "Zu Favoriten Hinzufügen", padRemoveFavorite: "Aus Favoriten Entfernen", - padClose: "Pad schließen", + padClose: "Schließen", padBackToEditor: "Zurück zum Editor", padSearchPlaceholder: "Pads suchen...", gamesTitle: "Spiele", gamesDescription: "Entdecke und spiele einige Spiele.", gamesFilterAll: "ALLE", gamesPlayButton: "SPIELEN!", - gamesBackToGames: "Zurück zu Spielen", modulesGamesLabel: "Spiele", modulesGamesDescription: "Modul zum Entdecken und Spielen von Spielen.", modulesGraphosLabel: "Graphos", @@ -3651,8 +3093,6 @@ module.exports = { gamesArkanoidDesc: "Brecht alle Steine mit eurem Schläger und Ball. Ein klassisches Arcade-Spiel.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Klassisches Ping-Pong gegen eine KI. Wer zuerst 5 Punkte hat, gewinnt.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Rennen gegen die Zeit! Weiche dem Verkehr aus und erreiche das Ziel rechtzeitig.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Steuere dein Raumschiff durch ein tödliches Asteroidenfeld. Schieße sie ab, bevor sie dich treffen.", gamesRockPaperScissorsTitle: "Schere Stein Papier", @@ -3673,8 +3113,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3682,7 +3120,6 @@ module.exports = { gamesNoScores: "Noch keine Ergebnisse.", modulesChatsLabel: "Chats", modulesChatsDescription: "Modul zum Entdecken und Verwalten verschlüsselter Chats.", - chatMessageLabel: "CHATNACHRICHTEN", chatsTitle: "Chats", chatMineSectionTitle: "Meine Chats", chatRecentTitle: "Aktuelle Chats", @@ -3690,62 +3127,53 @@ module.exports = { chatOpenTitle: "Offene Chats", chatClosedTitle: "Geschlossene Chats", chatDescription: "Beschreibung", - chatMessageReply: "Antwort", - chatMessageLabel: "Nachricht", chatCategory: "Kategorie", chatStatus: "STATUS", - chatFilterAll: "ALLE", - chatFilterMine: "MEINE", - chatFilterRecent: "AKTUELL", - chatFilterFavorites: "FAVORITEN", - chatFilterOpen: "OFFEN", - chatFilterClosed: "GESCHLOSSEN", chatCreate: "Chat Erstellen", - chatUpdate: "Chat Aktualisieren", - chatDelete: "Chat Löschen", + chatUpdate: "Aktualisieren", + chatDelete: "Löschen", chatClose: "Chat Schließen", chatVisitChat: "CHAT BESUCHEN", chatUntitled: "Unbenannter Chat", chatNoItems: "Keine Chats gefunden.", chatParticipants: "Teilnehmer", - chatStartChatting: "CHAT STARTEN!", - chatGenerateCode: "Code Generieren", - chatShareUrl: "URL Teilen", + chatMessagesLabel: "Nachrichten", + chatThreadsLabel: "Threads", chatCreatedAt: "ERSTELLT", chatSearchPlaceholder: "Chats suchen...", chatStatusOpen: "OFFEN", chatStatusInviteOnly: "NUR AUF EINLADUNG", chatStatusClosed: "GESCHLOSSEN", chatSendMessage: "Senden", + chatJumpLatest: "Neueste Nachricht", + chatPickChat: "Wähle einen Chat, um ihn zu öffnen", + chatNoneYet: "Noch kein Chat verfügbar.", + activitySearchPlaceholder: "In der Aktivität suchen...", + trendingSearchPlaceholder: "In den Trends suchen...", + opinionsSearchPlaceholder: "In den Meinungen suchen...", + votesSearchPlaceholder: "In den Abstimmungen suchen...", + welcomeStepUxTitle: "Wähle deine Oberfläche", + welcomeStepUxText: "Entscheide, wie Oasis aussieht. Später in den Einstellungen änderbar.", + welcomeStepUxAction: "Diese Ansicht verwenden", + chatRateLimitTitle: "Zu viele Nachrichten", + chatRateLimitMessage: "Du hast das Nachrichtenlimit dieses Raums pro Stunde erreicht. Versuche es später erneut.", chatMessagePlaceholder: "Nachricht eingeben...", chatNoMessages: "Noch keine Nachrichten.", - chatLeave: "Chat Verlassen", - chatInviteCodeLabel: "Einladungscode eingeben", - chatJoinByInvite: "Beitreten", chatTitlePlaceholder: "Chat-Titel", chatDescriptionPlaceholder: "Chat-Beschreibung", chatTagsPlaceholder: "tag1, tag2, tag3", chatImageLabel: "Bilddatei auswählen (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Einladungscode", chatAuthor: "Autor", - chatCreated: "Erstellt", chatAddFavorite: "Zu Favoriten Hinzufügen", chatRemoveFavorite: "Aus Favoriten Entfernen", chatPM: "PM", chatStatusLabel: "Status", chatCategoryLabel: "Kategorie", - chatParticipantsLabel: "Teilnehmer", calendarsTitle: "Kalender", calendarTitle: "Kalender", modulesCalendarsLabel: "Kalender", modulesCalendarsDescription: "Modul zum Entdecken und Verwalten von Kalendern.", typeCalendar: "KALENDER", - calendarFilterAll: "ALLE", - calendarFilterMine: "MEINE", - calendarFilterOpen: "OFFEN", - calendarFilterClosed: "GESCHLOSSEN", - calendarFilterRecent: "KÜRZLICH", - calendarFilterFavorites: "FAVORITEN", calendarCreate: "Kalender erstellen", calendarUpdate: "Aktualisieren", calendarDelete: "Löschen", @@ -3758,24 +3186,17 @@ module.exports = { calendarTagsLabel: "Tags", calendarTagsPlaceholder: "tag1, tag2...", calendarParticipantsLabel: "Teilnehmer", - calendarParticipantsCount: "Teilnehmer", - calendarVisitCalendar: "Kalender besuchen", calendarCreated: "Erstellt", - calendarAuthor: "Autor", calendarJoin: "Beitreten", calendarGenerateInvite: "Einladung erstellen", - calendarInviteCodePlaceholder: "Einladungscode eingeben...", - calendarValidateInvite: "Code prüfen", - calendarJoined: "Beigetreten", - calendarAddDate: "Datum hinzufügen", - calendarAddNote: "Notiz hinzufügen", calendarDateLabel: "Datum", calendarDatePlaceholder: "Dieses Datum beschreiben...", - calendarNoteLabel: "Notiz", + calendarNoteLabel: "Notizen", calendarNotePlaceholder: "Notiz hinzufügen...", calendarFirstDateLabel: "Datum", calendarFirstNoteLabel: "Notizen", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Keine Wiederholung", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3786,8 +3207,6 @@ module.exports = { calendarsDescription: "Entdecke und verwalte Kalender in deinem Netzwerk.", calendarMonthPrev: "← Zurück", calendarMonthNext: "Weiter →", - calendarMonthLabel: "Daten", - calendarsShareUrl: "Teilen-URL", calendarAllSectionTitle: "Kalender", calendarRecentSectionTitle: "Kürzliche Kalender", calendarFavoritesSectionTitle: "Favoriten", @@ -3801,7 +3220,6 @@ module.exports = { calendarRemoveFavorite: "Aus Favoriten entfernen", calendarSearchPlaceholder: "Kalender suchen...", calendarAddEntry: "Eintrag hinzufügen", - calendarLeave: "Kalender verlassen", statsCalendar: "Kalender", statsCalendarDate: "Kalenderdaten", statsCalendarNote: "Kalendernotizen", @@ -3848,7 +3266,6 @@ module.exports = { torrentSortOldest: "Älteste", torrentSortTop: "Meistgewählt", torrentNoMatch: "Keine passenden Torrents.", - torrentMessageAuthorButton: "Nachricht an Autor", torrentUpdatedAt: "Aktualisiert", statsTorrent: "Torrents", typeTorrent: "TORRENTS", @@ -3856,10 +3273,18 @@ module.exports = { modulesTorrentsDescription: "Modul zum Entdecken und Verwalten von Torrents.", favoritesFilterTorrents: "TORRENTS", favoritesFilterMarket: "MARKT", + favoritesFilterEvents: "EREIGNISSE", + favoritesFilterForum: "FORUM", + favoritesFilterHousing: "WOHNEN", + favoritesFilterJobs: "JOBS", + favoritesFilterProjects: "PROJEKTE", + favoritesFilterReports: "BERICHTE", + favoritesFilterTasks: "AUFGABEN", + favoritesFilterTransfers: "ÜBERWEISUNGEN", + favoritesFilterVotes: "ABSTIMMUNGEN", favoritesFilterShopProducts: "SHOP-ARTIKEL", tribeSectionTorrents: "TORRENTS", tribeCreateTorrent: "Torrent Hochladen", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Wunsch", settingsWishDesc: "Konfiguriere den Wunsch deines Avatars.", settingsWishWhole: "Multiverse", @@ -3870,16 +3295,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "Ausgang ist ein UX-Schutz. Eingang ist ein Aufmerksamkeitsfilter.", - pmBlockedNonMutual: "Du kannst PNs nur an Bewohner mit gegenseitiger Unterstützung senden.", inhabitantsPendingFollowsTitle: "Ausstehende Unterstützungsanfragen", inhabitantsPendingAccept: "Akzeptieren", inhabitantsPendingReject: "Ablehnen", - bxEncrypted: "VERSCHLÜSSELT", - bxEncryptedHexLabel: "Chiffretext (Vorschau)", tribeSectionGovernance: "GOVERNANCE", - tribeSubStatusPublic: "ÖFFENTLICH", - tribeSubStatusPrivate: "PRIVAT", - tribeSubInheritedPrivate: "PRIVAT (vom Haupt-Stamm geerbt)", tribePadInviteRequired: "Kein Zugriff auf das Pad. Bitte um Einladung.", tribeChatInviteRequired: "Kein Zugriff auf den Chat. Bitte um Einladung.", tribeGovernanceDesc: "Interne Governance dieses Stammes.", @@ -3919,44 +3338,31 @@ module.exports = { tribeGovNoHistorical: "Noch kein Eintrag", logsTitle: "Logbuch", logsDescription: "Erfasse deine Erfahrung im Netzwerk.", - logsReadMore: "Mehr lesen", logsViewTitle: "Logbuch", logsColumnType: "Typ", logsView: "Ansehen", - logsManualPrompt: "Schreibe dein Logbuch", logsUpdateButton: "Aktualisieren", - logsEditTitle: "Eintrag bearbeiten", - logsCreateDescription: "Erfasse deine Erfahrung...", + logsEditTitle: "Log aktualisieren", logsCreateTitle: "Eintrag erstellen", logsWriteButton: "Schreiben", logsTextPlaceholder: "Beschreibe deine Erfahrungen...", - logsTextField: "Text", - logsLabelPlaceholder: "Bezeichnung...", - logsLabelField: "Schreibe dein Logbuch (Bezeichnung)", - logsAiDisabledWarn: "Aktiviere das KI-Modul in /modules, um KI-Einträge zu verwenden.", - logsAiContextValue: "Blockchain-Tag", - logsAiContext: "Kontext", - logsAiModStatus: "AImod", - logsModeApply: "Anwenden!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manuell", logsModeAI: "KI", - logsColumnDelete: "Löschen", - logsColumnEdit: "Bearbeiten", logsColumnLog: "Logbuch", logsColumnDate: "Datum", logsDelete: "Löschen", - logsEdit: "Bearbeiten", + logsEdit: "Aktualisieren", logsFilterAlways: "IMMER", logsFilterYear: "LETZTES JAHR", logsFilterMonth: "LETZTER MONAT", logsFilterWeek: "LETZTE WOCHE", logsFilterToday: "HEUTE", - logsFilterRecent: "AKTUELL", - logsFilterAll: "ALLE", + logsComments: "Kommentare", + logsAuthorEntries: "Einträge", logsCreate: "Eintrag erstellen", logsExport: "Logbuch exportieren", - logsExportOne: "Exportieren", + logsExportOne: "Log exportieren", logsViewDetails: "Details ansehen", logsGenerateButton: "Text generieren", logsSearchText: "In Logbüchern suchen...", @@ -3966,31 +3372,25 @@ module.exports = { modulesLogsLabel: "Logbuch", modulesLogsDescription: "Modul, um (über einen KI-Assistenten) deine Erfahrungen aufzuzeichnen.", statsLogsTitle: "Logbuch", - statsLogsEntries: "Einträge", typeLog: "LOGBUCH", - blockchainCycle: "Zyklus", larpTitle: "L.A.R.P.", larpDescription: "Eine Live-Rollenspiel-Schicht für kollaboratives Experimentieren.", + larpNoHousesMatch: "Keine Häuser entsprechen deiner Suche.", + larpSearchPlaceholder: "Häuser durchsuchen...", larpAllHouses: "Häuser:", larpFilterRuling: "REGIERT", larpFilterHouses: "HÄUSER", larpFilterRules: "FAQ", larpRulesTitle: "L.A.R.P.-FAQ", - larpRulesEntryTitle: "Starthaus", larpRulesEntryText: "Jede Bewohnerin beginnt standardmäßig in ACADEMIA. Von ACADEMIA aus wählst du ein Haus im Panel \"Haus beitreten\": dadurch öffnet sich seine Eintrittsprüfung. Beantworte die 10 Fragen und sende sie ab. Wenn du die Schwelle (7/10) erreichst, wirst du automatisch in das Haus aufgenommen; andernfalls wirst du abgelehnt und bleibst in ACADEMIA. In beiden Fällen speichert das System deine OasisID und den Zyklus des Versuchs und verhindert weitere Versuche, bis die Abklingzeit von 30 Zyklen abgelaufen ist.", - larpRulesLeaveText: "Mitglieder eines beliebigen Hauses können jederzeit von ihrer Hausseite zu ACADEMIA zurückkehren; dies setzt ihre Mitgliedschaft zurück, hebt aber die Test-Abklingzeit nicht auf.", - larpRulesGovernanceTitle: "Regierungswand", larpRulesGovernanceText: "In ihrem Zyklus trägt das regierende Haus das \"Regiert\"-Abzeichen und ist das einzige, dessen Wand öffentlich unter dem REGIERT-Tab erscheint.", - larpRulesSignTitle: "L.A.R.P.-Emblem", + larpRulesWallText: "Jedes Haus hat eine Wand, auf der seine Mitglieder schreiben. Die Wand eines Hauses ist privat, außer der des regierenden Hauses und der der ACADEMIA, die alle lesen können.", larpRulesSignText: "Bewohner können dies aktivieren (unter /profile/edit > Sensoren), um das Bild ihres aktuellen Hauses als Siegel auf ihrem Profil, in der Autoren- und Bewohnerkarte anzuzeigen. Das Siegel verlinkt zur Hausseite.", larpPostsTitle: "Wand", larpPostsEmpty: "Noch keine Beiträge.", - larpPostLabel: "Neuer Beitrag", larpPostPlaceholder: "Was hat dieses Haus zu sagen?", - larpPostPublic: "Öffentlich (für alle sichtbar, sonst nur für Mitglieder)", larpPostSubmit: "Veröffentlichen", - larpPostMembersOnly: "Nur Mitglieder", larpCycleLabel: "Zyklus:", bankRulesArchTaxFormula: "ARCH Tax(user) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory", bankRulesArchTaxNote: "ARCH Tax reflects the long-term cost of growing and maintaining the network archive: the older your data lives in the network, the larger your share of the maintenance cost.", @@ -4027,12 +3427,9 @@ module.exports = { bankTaxesLookupNote: "Gib eine Block-ID ein, um sie in deinem lokalen Feed nachzuschlagen.", bankTaxesUserNoteChipsClick: "Klicke auf einen Chip, um seinen Block im Blockexplorer zu inspizieren.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Einladungscode", larpRulesInviteEntryText: "Hausmitglieder können Einladungscodes erzeugen, die direkten Zugang zum Haus gewähren.", larpRulesOneHouseText: "Du kannst zu jedem Zeitpunkt höchstens einem Haus angehören. Gehörst du keinem an, bist du in ACADEMIA. Jede Nicht-ACADEMIA-Hausseite zeigt seinen Mitgliedern eine Schaltfläche „Haus verlassen\", die die Mitgliedschaft zurück nach ACADEMIA setzt. Das Verlassen hebt die Test-Abklingzeit NICHT auf.", - larpRulesOneHouseTitle: "Ein Haus auf einmal", - larpRulesTestEntry: "WILL-Test", - larpRulesTestEntryText: "Jede Option gewichtet ein oder mehrere Häuser; beim Absenden zählt das System die Punkte und nimmt dich automatisch in das Haus mit der höchsten Punktzahl auf.", + larpRulesTestEntryText: "Im WILL-Test gewichtet jede Option ein oder mehrere Häuser; beim Absenden zählt das System die Punkte und nimmt dich automatisch im Haus mit der höchsten Punktzahl auf.", larpWillTestHint: "Nach Abschluss wirst du dem Haus zugewiesen, das am besten zu deinen Antworten passt. Deine einzelnen Antworten werden lokal verarbeitet und nie gespeichert — nur die resultierende Hauszuweisung wird in deinem Feed veröffentlicht.", larpWillTestTitle: "WILL-Test", settingsLanDesc: "Diesen Peer periodisch an andere Oasis-Instanzen im selben lokalen Netzwerk ankündigen. Deaktivieren, um UDP-Broadcasts zu stoppen.", @@ -4051,36 +3448,30 @@ module.exports = { aiExchangeMarkHelpful: "+1 hilfreich", larpCyclesUntilRuling: "Nächster Regierungszyklus", larpVisitTribe: "Stamm besuchen", + larpStartJourney: "Reise beginnen", larpGoverning: "Regiert:", + larpStartHere: "Fang hier an:", larpMyHouse: "Mein Haus:", larpMembersCount: "Mitglieder", - larpMembersTitle: "Mitglieder", - larpNoMembers: "Noch keine Mitglieder.", larpRolesLabel: "Rollen", larpFunctionLabel: "Funktion", larpMonthLabel: "Regierungszyklus", larpLeaveToAcademia: "Zurück zu ACADEMIA", - larpAcademiaJoinTitle: "Haus beitreten", - larpAcademiaJoinHint: "Lege den psychologischen Profiltest ab, um dem Haus zugewiesen zu werden, das am besten zu dir passt, oder löse einen Einladungscode ein, den dir ein Mitglied eines Hauses gegeben hat.", - larpTakeTestButton: "Profiltest ablegen", + larpAcademiaJoinTitle: "L.A.R.P.-Häuser", larpInviteRedeem: "Haus beitreten", larpInviteCreate: "Einladungscode erzeugen", larpInvitePlaceholder: "Einladungscode", larpInviteBannerTitle: "Neuer Einladungscode", larpInviteBannerHint: "Teile diesen Code mit jemandem in ACADEMIA. Er läuft in 30 Zyklen oder nach einmaliger Nutzung ab.", - larpTestAssignedHouse: "Zugewiesenes Haus", larpTestRankingTitle: "Punktzahl nach Haus", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Haus-Einladungscode", invitesHouseJoinButton: "Haus beitreten", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Steuern", bankOverviewYourTaxes: "Deine Steuern", - bankTaxesNetworkTitle: "Netzwerksteuern", bankTaxesEcoTaxTitle: "ECO Tax", bankTaxesArchTaxTitle: "ARCH Tax", - bankTaxesUserTitle: "Deine Steuern", bankTaxesUserAmount: "Deine ECO Tax (zu zahlender Beitrag)", bankTaxesArchTaxUserAmount: "Deine ARCH Tax (zu zahlender Beitrag)", bankTaxesArchTaxFirstBlock: "Alter deines ersten Blocks", @@ -4131,16 +3522,13 @@ module.exports = { bankRulesEcoTaxRate: "Rate", bankRulesArchTaxRate: "Rate", bankRulesCarbonFactor: "Kohlenstofffaktor", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "Noch keine Tombstones im Netzwerk.", blockchainBlockNotAvailable: "Dieser Block ist in deinem lokalen Feed nicht verfügbar. Er gehört möglicherweise einem Peer, von dem du noch nicht replizierst.", blockchainBackToBlockexplorer: "Zurück zum Blockexplorer", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", - audioTranscodeTitle: "BCS-Transcode", audioTranscodeDetailTitle: "Transcode", audioTranscodeDetailDescription: "Entschlüssle die eingebettete Nutzlast und die ursprüngliche Blockchain-Kompositionskarte.", - audioTranscodeStegoTitle: "In die Wellenform eingebettet", audioTranscodeStegoOasisId: "Von", audioTranscodeStegoTimestamp: "Erzeugt am", audioTranscodeStegoMessage: "TEXT", @@ -4148,9 +3536,7 @@ module.exports = { audioTranscodeStegoUnknown: "—", audioTranscodeStegoNotFound: "Aus diesem Audio konnte keine steganographische Nutzlast entschlüsselt werden.", audioTranscodeCompositionEmpty: "Dieses Audio enthält keine gespeicherte Blockchain-Komposition.", - audioBackToAudio: "Zurück zum Audio", audioBackToBcs: "Zurück zu BCS", - audioAuthorLabel: "Autor", melodyCompositionTitle: "Blockchain-Kompositionskarte", melodyFilterMine: "MEINS", melodyByLabel: "Von", @@ -4164,7 +3550,6 @@ module.exports = { melodyUploadBcsNameNote: "Das Audio wird unter dem automatisch generierten Namen veröffentlicht", larpLastAttemptTitle: "Dein letzter Versuch", larpLastAttemptHouse: "Haus", - larpLastAttemptResult: "Ergebnis", larpLastAttemptWhen: "Wann", larpLastAttemptCooldown: "Nächster Versuch in", larpTestTitle: "Eintrittsprüfung", @@ -4173,30 +3558,14 @@ module.exports = { larpTestCooldownActive: "Nächster Test verfügbar in", larpTestCooldownDays: "Zyklen", larpTestResultTitle: "Testergebnis", - larpTestPassed: "Test bestanden — willkommen!", - larpTestFailed: "Test nicht bestanden", larpTestScore: "Punktzahl", larpTestNextAttempt: "Du kannst in 30 Zyklen einen weiteren Test absolvieren.", larpGoToHouse: "Zu deinem Haus", larpBackToAcademia: "Zurück zu ACADEMIA", - larpBackToHouses: "◀ Häuser", larpBadgeYou: "Du", larpBadgeRuling: "Regiert", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Modul für die Live-Rollenspielschicht von Oasis (die 9 Häuser).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - chatLabel: "CHATS", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Wenn du vor einem komplexen Problem stehst, was tust du zuerst?", larpProfileQ1O1: "Mit anderen reden, um Konsens zu finden", larpProfileQ1O2: "Einen Prototyp zum Testen bauen", diff --git a/src/client/assets/translations/oasis_en.js b/src/client/assets/translations/oasis_en.js index 675cf2f..3ad88f5 100644 --- a/src/client/assets/translations/oasis_en.js +++ b/src/client/assets/translations/oasis_en.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { en: { - languageName: "English", shopOrderStatusPaid: "Payment received", shopOrderStatusReceived: "Received", shopOrderMarkPaid: "Payment received", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "You have no purchases yet.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Seller", - shopOrderPaymentConcept: "Payment", shopOrderInvoice: "Invoice", shopOrderInvoiceConcept: "Invoice", shopOrderStatusPending: "Pending", shopOrderStatusAccepted: "Accepted", shopOrderStatusRejected: "Rejected", shopOrderStatusShipped: "Shipped", - shopOrderStatusDelivered: "Delivered", shopOrderAccept: "Accept", shopOrderReject: "Reject", shopOrderMarkShipped: "Mark shipped", - shopOrderMarkDelivered: "Mark delivered", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Smart-contract", shopOrderContractConcept: "Shop order", shopOrdersPending: "Pending orders", all: "All", @@ -55,14 +50,13 @@ module.exports = { viewJson: "View JSON", matchScore: "Match score", preferencesLabel: "Preferences", - inhabitantProfileTitle: "Inhabitant profile", + inhabitantProfileTitle: "Inhabitant", contentWarningLabel: "Content warning", invalidPost: "Invalid content", invalidPostHint: "This message has invalid/empty text.", spreadBy: "By", spreadChron: "Spread", spreaded: "Spread", - spreadMore: "more", spreadContentUnavailable: "Content not yet available (pending replication)", filteredByTag: "Filtered by tag", filteredByTagTitle: "Filtered by tag", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "No severity", calendarDeleteDate: "Delete Date", calendarIntervalUntil: "Until", - bookmarkCategory: "Category", bookmarkLastVisit: "Last visit", profileClearnetBookmarksLabel: "Bookmarks", - forumFilterHot: "Hot", invitesPort: "Port", currentlyUnrecheable: "ERROR!", peerHostValidation: "Valid IPv4 (e.g. 192.168.1.100) or hostname (e.g. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Annual max estimate", statsCarbonNetwork: "Network total", statsCarbonOfEstMax: "of estimated max capacity", + statsCarbonYearProgress: "of the year elapsed", + statsNetworkTitle: "Network", + statsStorageTitle: "Storage", + statsEcoTaxTitle: "ECO Tax", + statsAccountTitle: "Account", + statsAveragesTitle: "Averages", statsCarbonOfNetwork: "of network total", statsCarbonUser: "Your footprint", statsContentCountColumn: "Count", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Top Tags", statsTopTypesTitle: "Top Content Types", statsTotalMsgs: "Total messages", - feedViewDetails: "View details", - eventFileLabel: "Attach image", - taskFileLabel: "Attach image", - courtsRespondentRequired: "Respondent ID is required", extended: "Multiverse", extendedDescription: [ "When you support someone you may download posts from the inhabitants they support, and those posts show up here, sorted by recency.", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "Showing", graphosYou: "You", graphosTotalNodes: "Total nodes", - manualMode: "Manual Mode", mentions: "Mentions", mentionsDescription: [ - strong("Posts that @mention you"), - ", sorted by recency.", + strong("Every message that @mention you"), + ".", ], - nextPage: "Next", - previousPage: "Previous", noMentions: "You haven't received @mentions, yet.", + mentionsSearchPlaceholder: "Search mentions...", privateReminders: "REMINDERS", inboxFiltersLabel: "Filters:", inboxToggleToMutuals: "Switch to mutuals", inboxToggleToWhole: "Switch to whole", - privateFrom: "From", - privateTo: "To", privateDate: "Date", pmReply: "Reply", pmReplies: "replies", - pmNew: "new", - pmMarkRead: "Mark as read", inReplyTo: "IN REPLY TO", pmPreview: "Preview", pmPreviewTitle: "Message preview", peers: "Peers", searchDescription: "Description", - imageSearch: "Image Search", searchFromLabel: "From", searchToLabel: "To", - searchMinOpinionsLabel: "Min opinions", - searchInhabitantLabel: "Inhabitant (Oasis ID)", searchQueryLabel: "Query", searchPerPageLabel: "Results per page", settings: "Settings", @@ -245,26 +230,12 @@ module.exports = { melodyDescription: 'Play the melody of your blockchain — each block becomes a note.', melodyEmpty: 'No notes yet — your blockchain has not produced any block.', melodyCompositionTitle: 'Blockchain Composition Map', - melodyCompositionHelp: 'Each block of your blockchain becomes a musical note based on its type and size.', - melodyStatsTitle: 'Type breakdown', - melodyInhabitantLabel: 'Inhabitant', melodyTotalBlocks: 'Notes', - melodyType: 'Type', - melodyCount: 'Blocks', melodyFilterAll: 'ALL', - melodyFilterShare: 'Upload Melody', - melodyShareTitle: 'Share your melody', - melodyShareHelp: 'Publish a snapshot of your current melody so others can listen and remix it.', - melodyShareTitleLabel: 'Title (optional)', - melodyShareTitlePlaceholder: 'A blockchain ghost', - melodyShareSubmit: 'Publish Melody', - melodyNoShared: 'No blockchain melodies yet.', melodyRegenerate: 'Regenerate', melodyDownload: "Download BCS", melodyUploadBcsTitle: "Publish", melodyUploadBcsButton: "Publish", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", melodyUploadStegoLabel: "Hidden message (steganography)", melodyUploadStegoPlaceholder: "Optional.", melodyUploadStegoMaxLabel: "max 280 characters", @@ -275,51 +246,34 @@ module.exports = { melodyFilterMine: "MINE", melodyByLabel: "By", melodyAllEmpty: "No BCS compositions from other inhabitants yet.", - profileActivityTitle: 'Activity', - profileActivityMore: 'View all activity', profileContentSectionTitle: 'Avatar Content', profileContentHelp: 'Choose which of your modules will be displayed on your avatar.', profileSensorsHelp: 'Optional metrics shown on your avatar.', profileClearnetHelp: 'Modules that can be accessed from outside Oasis.', profileHubAll: 'All', - profileHubTitle: 'Public Content', - footerPulseTitle: 'Pulse', - footerPulsePeers: 'Peers', - footerPulseInbox: 'Inbox', - footerPulseSync: 'Last Sync', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Last Activity', footerLicenseLabel: 'License', profileSwitchToOasis: 'Return to Oasis', - profileSwitchToClearnet: 'Dive into Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Dive into Fediverse", - coordLabel: 'Coordinate (e.g., A3)', - coordPlaceholder: 'Enter coordinate', + profileVisibilityFediverse: "Multiverse", contributorsTitle: "Contributors", - pixeliaBy: "by", colorLabel: 'Pick a color', paintButton: 'Paint it!', - invalidCoordinate: 'Incorrect coordinate', - goToMuralButton: "View Mural", totalPixels: 'Total Pixels', modules: "Modules", modulesViewTitle: "Modules", modulesViewDescription: "Set your environment by enabling or disabling modules.", inbox: "Inbox", multiverse: "Multiverse", - fediverse: "Fediverse", - fediverseDescription: "Manage your other fediverse accounts, including sending and receiving content.", + fediverse: "Multiverse", + fediverseDescription: "Manage your other multiverse accounts, including sending and receiving content.", fediverseStatus: "Status", - fediverseDisconnected: "Fediverse disconnected. Check %LINK% or connection status.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiverse disconnected. Check %LINK% or connection status.", + fediverseSettingsTitle: "Multiverse", fediverseInstanceLabel: "Address", fediverseTokenLabel: "Access token", fediverseTokenHelp: "Set your access token. This will be used to manage your Mastodon account from inside Oasis.", fediverseConnect: "Connect it", fediverseConnectedAs: "Connected as", fediverseDisconnect: "Disconnect", - fediverseEmpty: "When you connect other fediverse accounts from %LINK%, you can manage them from here.", fediverseEmptyLink: "your settings", fediverseComposePlaceholder: "What's on your mind?", fediverseReplyPlaceholder: "Write your reply…", @@ -328,21 +282,15 @@ module.exports = { fediverseReply: "Reply", fediverseBoosted: "boosted", fediverseNoPosts: "Your timeline is empty.", - fediverseThread: "Thread", fediverseTimeline: "Timelines", - fediverseManageTimeline: "Manage timeline", fediverseFollowers: "Followers", fediverseFollowing: "Following", fediversePosts: "Posts", fediverseJoined: "Joined", - fediverseOverview: "Overview", fediverseRefresh: "Refresh", fediverseWrite: "Write", fediversePreview: "Preview", - fediverseEdit: "Edit", - fediverseOpenFeed: "Visit feed", fediverseManage: "Manage", - fediverseStatusNotConnected: "Not connected", fediverseError: "Could not contact Mastodon.", fediverseErrInstance: "Invalid instance URL.", fediverseErrAuth: "Invalid or expired token.", @@ -353,17 +301,6 @@ module.exports = { fediverseErrPost: "Could not publish.", fediverseErrMedia: "Could not upload the file.", fediverseErrEmpty: "Write something or attach a file.", - popularLabel: "Highlights", - topicsLabel: "Topics", - latestLabel: "Latest", - summariesLabel: "Summaries", - threadsLabel: "Threads", - multiverseLabel: "Multiverse", - inboxLabel: "Inbox", - invitesLabel: "Invites", - walletLabel: "Wallet", - legacyLabel: "Keys", - cipherLabel: "Crypter", bookmarksLabel: "Bookmarks", videosLabel: "Videos", torrentsLabel: "Torrents", @@ -374,18 +311,14 @@ module.exports = { inhabitantsLabel: "Inhabitants", trendingLabel: "Trending", eventsLabel: "Events", - tasksLabel: "Tasks", apply: "Apply", menuPersonal: "Personal", - menuContent: "Content", - menuBlogs: "Blogs", menuGovernance: "Governance", menuOffice: "Office", - menuMultiverse: "Multiverse", - menuNetwork: "Network", + menuNetwork: "Community", menuCreative: "Creative", menuEconomy: "Economy", - menuMedia: "Media", + menuMedia: "Library", menuTools: "Tools", comment: "Comment", subtopic: "Subtopic", @@ -395,13 +328,6 @@ module.exports = { follow: "Support", block: "Block", unblock: "Unblock", - newerPosts: "Newer posts", - olderPosts: "Older posts", - feedRangeEmpty: "The given range is empty for this feed. Try viewing the ", - seeFullFeed: "full feed", - feedEmpty: "The Oasis network has never seen posts from this account.", - beginningOfFeed: "This is the beginning of the feed", - noNewerPosts: "No newer posts have been received yet.", relationshipNotFollowing: "You are not supported", relationshipTheyFollow: "Supports you", relationshipMutuals: "Mutual support", @@ -411,16 +337,12 @@ module.exports = { relationshipBlockedBy: "You are blocked", relationshipMutualBlock: "Mutual block", relationshipNone: "You are not supporting", - relationshipConflict: "Conflict", relationshipBlockingPost: "Blocked post", viewLikes: "View spreads", spreadedDescription: "List of posts spread by the inhabitant.", - totalspreads: "Total spreads", - attachFiles: "Attach files", preview: "Preview", publish: "Write", contentWarningPlaceholder: "Add a subject to the post (optional)", - privateWarningPlaceholder: "Add inhabitants to send a private post (optional)", publishWarningPlaceholder: "Body capped at 7000 characters.", publishTooLong: "Your post is too long. Please shorten it.", publishCustomDescription: [ @@ -429,8 +351,6 @@ module.exports = { commentWarning: [ "REMEMBER: Due to blockchain technology, once a post is published it cannot be edited or deleted.", ], - commentPublic: "public", - commentPrivate: "private", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -450,7 +370,6 @@ module.exports = { ".", ], publishCustom: "Write advanced post", - subtopicLabel: "Create a subtopic of this post", messagePreview: "Post Preview", mentionsMatching: "Matching Mentions", mentionsName: "Name", @@ -479,24 +398,19 @@ module.exports = { settingsReplicationHopsLabel: "Hops", settingsLanEnable: "Enable LAN broadcasting", saveSettings: "Save settings", - exportTitle: "Export data", exportDescription: "Set password (min 32 characters long) to encrypt your key", exportDataTitle: "Backup", exportDataDescription: "Download your data (secret key excluded!)", exportDataButton: "Download database", - pubWallet: "PUB Wallet", - pubWalletDescription: "Set the PUB wallet URL. This will be used for PUB transactions (including the UBI).", - pubWalletConfiguration: "Save configuration", - importTitle: "Import data", importDescription: "Import your encrypted secret (private key) to enable your avatar", - importAttach: "Attach encrypted file (.enc)", - passwordLengthInfo: "Password must be at least 32 characters long.", passwordImport: "Write your password to decrypt data that will be saved at your system home (name: secret)", exportPasswordPlaceholder: "Use lowercase, uppercase, numbers & symbols", fileInfo: "Your encrypted secret key will be downloaded to your device (name: oasis.enc)", developer: "Developer", devTitle: "Developer", welcomeBannerText: "Welcome to OASIS. Follow these quick steps to set up your avatar.", + aiSuggestionBanner: "Suggestion:", + aiSuggestionsEnable: "AI Suggestions", welcomeBannerAction: "Start wizard!", welcomeTitle: "Welcome", welcomeStepGreetingAction: "Send Feed", @@ -539,14 +453,9 @@ module.exports = { devParentFolder: "Parent folder", devOpenFolder: "open", devDescription: "Explore the source code running on this node.", - devTreeTitle: "Files", - devSearchTitle: "Search code", - devMapTitle: "Modules", devRoot: "root", - devRootButton: "ROOT", devSearchPlaceholder: "Text to find in the code", devAnyExtension: "Any file", - devSearchButton: "Search", devStatsFiles: "Files", devStatsLines: "Lines", devStatsModules: "Modules", @@ -583,16 +492,13 @@ module.exports = { languageDescription: "If you'd like to use another language, select it here.", setLanguage: "Set Language", - peerConnections: "Peers", peerConnectionsIntro: "Manage all your connections with other peers.", peerConnectionsTitle: "Connections", online: "Online", offline: "Offline", discovered: 'Discovered', unknown: 'Unknown', - lanBroadcastLabel: "LAN broadcast", lanBroadcastActive: "Active (UDP multicast on LAN)", - lanBroadcastDisabled: "Disabled (pub mode)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -605,8 +511,6 @@ module.exports = { noConnections: "No peers connected.", noDiscovered: "No peers discovered.", noUnknownPeers: "No unknown peers in the friend graph.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -616,9 +520,6 @@ module.exports = { peerImport: "Import", peerImportTitle: "Import peer list", peerImportPlaceholder: "Paste one multiserver address per line, or upload a .txt file…", - noSupportedConnections: "No peers supported.", - noBlockedConnections: "No peers blocked.", - noRecommendedConnections: "No peers recommended.", connectionActionIntro: "", startNetworking: "Start networking", @@ -632,9 +533,19 @@ module.exports = { homePageDescription: "Select which module you want as your home page.", saveHomePage: "Set home", invites: "Invites", - invitesTitle: "Invites", - invitesInvites: "Invitations", invitesDescription: "Manage and apply invite codes in your network.", + invitesPubsHint: "Paste a pub invite code to federate with it and start replicating its inhabitants.", + invitesFederationsHint: "Pubs you are federated with: refresh them, drop the unreachable ones or export the list.", + invitesHousesHint: "Enter a house code to join a LARP house and take part in its economy.", + invitesTribesHint: "Enter a tribe code to become a member and reach its private content.", + invitesChatsHint: "Enter a chat code to join the conversation and its threads.", + invitesPadsHint: "Enter a pad code to write together on a shared document.", + invitesCalendarsHint: "Enter a calendar code to share dates and reminders with others.", + invitesEventsHint: "Enter an event code to join a private event.", + invitesForumsHint: "Enter a forum code to read and reply in a private forum.", + invitesMapsHint: "Enter a map code to add and see places on a shared map.", + invitesShopsHint: "Enter a shop code to join a shop and its catalogue.", + invitesInhabitantsHint: "Enter an inhabitant code to follow each other and exchange content.", invitesTribesTitle: "Tribes", invitesTribeInviteCodePlaceholder: "Enter tribe invite code", invitesTribeJoinButton: "Join Tribe", @@ -665,7 +576,6 @@ module.exports = { invitesAlreadyFederated: "You are already federated with this pub.", invitesFederationsTitle: "Federations", invitesAcceptedInvites: "Federated", - invitesNoInvites: "No invitations accepted, yet.", invitesUnfollow: "Unfollow", invitesFollow: "Follow", invitesUnfollowedInvites: "Unfederated", @@ -685,39 +595,24 @@ module.exports = { panicMode: "Panic Mode!", encryptData: "Set password (min 32 characters long) to encrypt your blockchain", decryptData: "Enter password to decrypt your blockchain", - panicModeDescription: "Encrypt/Decrypt or DELETE your blockchain", removeDataDescription: "WARNING: This process cannot be undone.", - encryptPanicButton: "Encrypt blockchain", - decryptPanicButton: "Decrypt blockchain", removePanicButton: "DELETE ALL YOUR DATA!", searchTitle: "Search", searchDescriptionLabel: "Search for content in your network.", - searchLanguagesLabel: "Languages", - searchSkillsLabel: "Skills", searchPlaceholder:"Search for content...", - searchDateLabel:"Date", searchLocationLabel:"Location", searchPriceLabel:"Price", - searchUrlLabel:"URL", searchCategoryLabel:"Category", - searchStartLabel:"Start Time", - searchEndLabel:"End Time", searchPriorityLabel:"Priority", searchStatusLabel:"Status", statusLabel:"Status", - totalVotesLabel:"Total Votes", noResultsFound:"No results found.", votesOption:"Vote Options", voteYesLabel:"Yes", voteNoLabel:"No", allTypesLabel: "UNLIMITED", - ABSTENTIONLabel:"ABSTENTION", YESLabel:"YES", NOLabel:"NO", - FOLLOW_MAJORITYLabel: "FOLLOW MAJORITY", - CONFUSEDLabel: "CONFUSED", - NOT_INTERESTEDLabel: "NOT INTERESTED", - StatusLabel:"Status", votesOptionYesLabel:"Yes", votesOptionNoLabel:"No", votesOptionAbstentionLabel:"Abstention", @@ -725,7 +620,6 @@ module.exports = { votesCreatedByLabel:"Created by", voteStatusOpen:"OPEN", voteStatusClosed:"CLOSED", - imageSearchLabel: "Enter words to search for images labelled with them.", commentDescription: ({ parentUrl }) => [ " commented on ", a({ href: parentUrl }, " thread"), @@ -736,57 +630,24 @@ module.exports = { a({ href: parentUrl }, " a post"), ], subtopicTitle: ({ authorName }) => [`Subtopic on @${authorName}'s post`], - mysteryDescription: "posted a mysterious post", oasisDescription: "OASIS Project Network", searchSubmit: "Let's Search...", - postLabel: "POSTS", - aboutLabel: "INHABITANTS", - feedLabel: "FEEDS", votesLabel: "VOTATIONS", - reportLabel: "REPORTS", - imageLabel: "IMAGES", - videoLabel: "VIDEOS", - audioLabel: "AUDIOS", - documentLabel: "DOCUMENTS", - torrentLabel: "TORRENTS", pdfFallbackLabel: "PDF Document", - eventLabel: "EVENTS", - taskLabel: "TASKS", - transferLabel: "TRANSFERS", - curriculumLabel: "CURRICULUM", - bookmarkLabel: "BOOKMARKS", - tribeLabel: "TRIBES", - marketLabel: "MARKET", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "WALLETS", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Submit", - subjectLabel: "Subject", editProfile: "Edit Avatar", - profileQrAlt: "Profile QR code", - profileQrHint: "Scan to copy this Oasis ID.", oasisIdLabel: "OasisID", - spreadLabel: "Spread", - spreadHint: "Spread this to your supporters (replicates via your feed).", + spreadContent: "Replicate", welcomePmSubject: "Hello World!", - welcomePmBody: "Welcome to Oasis — a libre, peer-to-peer, federated and encrypted social network with a distributed invite-only architecture.\n\nSome interesting places to start:\n\n- /profile — Edit your avatar, name, description and which modules appear on your public side.\n- /settings — Tune your local instance: language, theme, modules, privacy and sync.\n- /invites — Add a pub to federate with the wider network.\n- /peers — See who is connected, rescan your LAN, export or import peer lists.\n- /inhabitants — Discover and visit other people's avatars.\n- /tribes — Create or join private groups with end-to-end encryption.\n- /inbox — Read and send private messages.\n- /banking — See your ECO balance, UBI, ECO tax and the wealth-redistribution rules.\n- /activity — See recent activity, yours and your network's.\n- /publish — Write a post or share an image, audio, video or document.\n- /search — Search the network's content by type.\n\nSome interesting places to connect:\n\n- /fediverse — Manage your other fediverse accounts, including sending and receiving content.\n\nThis message was sent privately from you to yourself, so no connection was required to receive it.", + welcomePmBody: "Welcome to Oasis — a libre, peer-to-peer, federated and encrypted social network with a distributed invite-only architecture.\n\nSome interesting places to start:\n\n- /profile — Edit your avatar, name, description and which modules appear on your public side.\n- /settings — Tune your local instance: language, theme, modules, privacy and sync.\n- /invites — Add a pub to federate with the wider network.\n- /peers — See who is connected, rescan your LAN, export or import peer lists.\n- /inhabitants — Discover and visit other people's avatars.\n- /tribes — Create or join private groups with end-to-end encryption.\n- /inbox — Read and send private messages.\n- /banking — See your ECO balance, UBI, ECO tax and the wealth-redistribution rules.\n- /activity — See recent activity, yours and your network's.\n- /publish — Write a post or share an image, audio, video or document.\n- /search — Search the network's content by type.\n\nSome interesting places to connect:\n\n- /multiverse — Manage your other multiverse accounts, including sending and receiving content.\n\nThis message was sent privately from you to yourself, so no connection was required to receive it.", indexingTitle: "Synchronizing", indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!", indexingRefreshNote: "This page refreshes every 10 seconds.", indexingEditProfileLink: "Set up my avatar", - profileVisibilityTitle: "Public profile visibility", - profileVisibilityHint: "Toggle which fields other inhabitants see on your profile. By default only Karma is shown.", profileSensorsSectionTitle: "Sensors", profileVisibilityActivity: "Activity Level", - profileVisibilityDevice: "Device", profileDeviceLockedHint: "This sensor is always on: it lets other users see which device you connect from and cannot be disabled.", profileVisibilityKarma: "KARMA Scoring", profileVisibilityUbi: "UBI", @@ -794,7 +655,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "GPG Key", - profileVisibilityClearnet: "Publish my profile", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Shops", profileClearnetJobsLabel: "Jobs", @@ -848,7 +708,6 @@ module.exports = { " or connection status.", ], walletSentToLine: ({ destination, amount }) => `Sent ECO ${amount} to ${destination}`, - walletSettingsTitle: "Wallet", walletSettingsDescription: "Integrate Oasis with your ECOin wallet.", walletSettingsDocLink: "ECOin installation guide", walletStatusMessages: { @@ -870,37 +729,19 @@ module.exports = { cipherTitle: "Crypter", cipherDescription: "Encrypt and decrypt your text symmetrically (using a shared password).", randomPassword: "Random Password", - cipherEncryptTitle: "Encrypt Text", - cipherEncryptDescription: "Enter text to encrypt", - cipherTextLabel: "Text to Encrypt", cipherTextPlaceholder: "Enter text to encrypt...", cipherPasswordLabel: "Set password (min 32 characters long) to encrypt your text", cipherPasswordDecryptLabel: "Set password (min 32 characters long) to decrypt your text", cipherPasswordPlaceholder: "Enter a password...", cipherEncryptButton: "Encrypt", - cipherDecryptTitle: "Decrypt Text", - cipherDecryptDescription: "Enter text to decrypt", cipherEncryptedMessageLabel: "Encrypted Text", cipherDecryptedMessageLabel: "Decrypted Text", - cipherPasswordUsedLabel: "Password used to encrypt (keep it!)", cipherEncryptedTextPlaceholder: "Enter the encrypted text...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Enter the initialization vector...", cipherDecryptButton: "Decrypt", password: "Password", text: "Text", encryptedText: "Encrypted Text", iv: "Initialization Vector (IV)", - encryptTitle: "Encrypt your text", - encryptDescription: "Enter the text you want to encrypt and provide a password.", - encryptButton: "Encrypt", - decryptTitle: "Decrypt your text", - decryptDescription: "Enter the encrypted text and provide the same password used for encryption.", - decryptButton: "Decrypt", - passwordLengthError: "Password must be at least 32 characters long.", - missingFieldsError: "Text, password or IV not provided.", - encryptionError: "Error encrypting text.", - decryptionError: "Error decrypting text.", bookmarkTitle: "Bookmarks", bookmarkDescription: "Discover and manage bookmarks in your network.", bookmarkAllSectionTitle: "Bookmarks", @@ -926,8 +767,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Optional", bookmarkTagsLabel: "Tags", bookmarkTagsPlaceholder: "Enter tags separated by commas", - bookmarkCategoryLabel: "Category", - bookmarkCategoryPlaceholder: "Optional", bookmarkLastVisitLabel: "Last Visit", bookmarkSearchPlaceholder: "Search URL, tags, category, author...", bookmarkSortRecent: "Most recent", @@ -942,8 +781,6 @@ module.exports = { noLastVisit: "No last visit", videoTitle: "Videos", videoDescription: "Explore and manage video content in your network.", - videoPluginTitle: "Title", - videoPluginDescription: "Description", videoMineSectionTitle: "Your Videos", videoCreateSectionTitle: "Upload Video", videoUpdateSectionTitle: "Update Video", @@ -975,7 +812,6 @@ module.exports = { videoSortOldest: "Oldest", videoSortTop: "Most voted", videoSearchButton: "Search", - videoMessageAuthorButton: "PM", videoUpdatedAt: "Updated", videoNoMatch: "No videos match your search.", documentTitle: "Documents", @@ -1016,8 +852,6 @@ module.exports = { documentUpdatedAt: "Updated", audioTitle: "Audios", audioDescription: "Explore and manage audio content in your network.", - audioPluginTitle: "Title", - audioPluginDescription: "Description", audioMineSectionTitle: "Your Audios", audioCreateSectionTitle: "Upload Audio", audioUpdateSectionTitle: "Update Audio", @@ -1028,17 +862,12 @@ module.exports = { audioFilterMine: "MINE", audioFilterRecent: "RECENT", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", audioTranscodeDetailTitle: "Transcode", audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Taxes", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", bankTaxesUserNoteChips: "The ECO Tax chip shown next to each item changes color (green / yellow / red) depending on the item size relative to the largest block ever seen on the network, softened by the number of active inhabitants — a larger solar-punk network distributes the load and pushes more items into the green band.", bankTaxesUserNoteChipsClick: "Click any chip to inspect its block in the blockexplorer.", bankTaxesEcoTaxTitle: "ECO Tax", @@ -1051,7 +880,6 @@ module.exports = { bankTaxesArchTaxRate: "Rate", bankTaxesArchTaxFirstBlock: "Your first block age", bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", bankTaxesArchTaxNoteIntro: "Your ARCH tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Newer inhabitants and those specifically dedicated to archival, replication and maintenance tasks will likely have some task dedicated to keeping the network archive healthy on your behalf. Or they may dedicate themselves to ", bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly", bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.", @@ -1060,7 +888,6 @@ module.exports = { bankRulesArchTaxRate: "Rate", bankRulesArchTaxFormula: "ARCH Tax(user) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory", bankRulesArchTaxNote: "ARCH Tax reflects the long-term cost of growing and maintaining the network archive: the older your data lives in the network, the larger your share of the maintenance cost.", - bankTaxesExample: "Example", bankTaxesUserNoteOtherParams: "ECO Tax is currently derived from the carbon footprint of each block, but it may incorporate other parameters over time — energy spent on replication, redundant storage across peers, blob bandwidth, computational cost of decryption, mining footprint of associated transactions, or any other measurable load the network agrees to value.", bankTaxesUserAmount: "Your ECO tax (price to return)", bankOverviewYourTaxes: "Your Taxes", @@ -1074,7 +901,6 @@ module.exports = { bankTaxesTotalLifetime: "Total (lifetime)", bankTaxesTotalAnnual: "Total (annual)", bankTaxesTotalMonthly: "Total (monthly)", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", bankTaxesRate: "Rate", bankTaxesSpan: "Sampling span", bankTaxesLookupTitle: "Inspect a block", @@ -1115,11 +941,7 @@ module.exports = { bankRulesChipTitle: "ECO Tax chip color band", bankRulesChipNote: "Each item's chip is colored relative to the largest message ever observed in the network and softened by the number of active inhabitants — a larger network distributes the load and pushes more items into the green band.", bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "No tombstones in the network yet.", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", audioTranscodeStegoOasisId: "By", audioTranscodeStegoTimestamp: "Generated at", audioTranscodeStegoMessage: "TEXT", @@ -1127,9 +949,7 @@ module.exports = { audioTranscodeStegoUnknown: "—", audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.", audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.", - audioBackToAudio: "Back to audio", audioBackToBcs: "Back to BCS", - audioAuthorLabel: "Author", audioCreateButton: "Upload Audio", audioUpdateButton: "Update", audioDeleteButton: "Delete", @@ -1156,6 +976,7 @@ module.exports = { audioFilterFavorites: "FAVORITES", favoritesTitle: "Favorites", favoritesDescription: "All your favorited content in one place.", + favoritesSearchPlaceholder: "Search favorites...", favoritesFilterAll: "ALL", favoritesFilterRecent: "RECENT", favoritesFilterAudios: "AUDIOS", @@ -1171,18 +992,13 @@ module.exports = { favoritesNoItems: "No favorites yet.", yourContacts: "Your Contacts", allInhabitants: "Inhabitants", - allCVs: "All CVs", + allCVs: "CVs", discoverPeople: "Discover inhabitants in your network.", - allInhabitantsButton: "ALL", - contactsButton: "SUPPORTS", - CVsButton: "CVs", - matchSkills: "Match Skills", - matchSkillsButton: "MATCH SKILLS", - suggestedButton: "SUGGESTED", searchInhabitantsPlaceholder: "FILTER inhabitants BY NAME …", filterLocation: "FILTER inhabitants BY LOCATION …", filterLanguage: "FILTER inhabitants BY LANGUAGE …", filterSkills: "FILTER inhabitants BY SKILLS …", + cvSkillsCount: "Skills", applyFilters: "Apply Filters", locationLabel: "Location", languagesLabel: "Languages", @@ -1191,17 +1007,18 @@ module.exports = { mutualFollowers: "Mutual Followers", suggestedFollowsYou: "Follows you", latestInteractions: "Latest Interactions", - viewAvatar: "View Avatar", - viewCV: "View CV", suggestedSectionTitle: "Suggested", topkarmaSectionTitle: "Top Karma", topecoSectionTitle: "Top Eco", topactivitySectionTitle: "Top Activity", + "TOP INACTIVITYButton": "TOP INACTIVITY", + topinactivitySectionTitle: "Least active inhabitants", blockedSectionTitle: "Blocked", gallerySectionTitle: "GALLERY", - blockedButton: "BLOCKED", + topSectionTitle: "TOP", blockedLabel: "Blocked User", inhabitantviewDetails: "View Details", + cvVisitButton: "Visit CV", keepReading: "Keep reading...", oasisId: "ID", noInhabitantsFound: "No inhabitants found, yet.", @@ -1210,10 +1027,11 @@ module.exports = { deviceLabel: "Device", parliamentTitle: "Parliament", parliamentDescription: "Explore forms of government and collective management laws.", - parliamentFilterGovernment: "GOVERMENT", + parliamentFilterGovernment: "GOVERNMENT", parliamentFilterCandidatures: "CANDIDATURES", parliamentFilterProposals: "PROPOSALS", parliamentFilterLaws: "LAWS", + parliamentFilterRevocations: "REVOCATIONS", parliamentFilterHistorical: "HISTORICAL", parliamentFilterLeaders: "LEADERS", parliamentFilterRules: "RULES", @@ -1239,10 +1057,8 @@ module.exports = { parliamentPoliciesDeclined: "LAWS DECLINED", parliamentPoliciesDiscarded: "LAWS DISCARDED", parliamentEfficiency: "% EFFICIENCY", - parliamentFilterRevocations: 'REVOCATIONS', parliamentRevocationFormTitle: 'Revocate Law', parliamentRevocationLaw: 'Law', - parliamentRevocationTitle: 'Title', parliamentRevocationReasons: 'Reasons', parliamentRevocationPublish: 'Publish Revocation', parliamentCurrentRevocationsTitle: 'Current Revocations', @@ -1255,23 +1071,12 @@ module.exports = { parliamentNoGovernments: "There are not governments, yet.", parliamentCandidatureFormTitle: "Propose Candidature", parliamentCandidatureIdPh: "Oasis ID (@...) or Tribe name", - parliamentCandidatureSlogan: "Slogan (max 140 chars)", - parliamentCandidatureSloganPh: "A short motto", parliamentCandidatureMethod: "Method", parliamentCandidatureProposeBtn: "Publish Candidature", - parliamentThDate: "Proposal date", - parliamentThSlogan: "Slogan", - parliamentThSince: "Profile since", - parliamentThVotes: "Votes recieved", - parliamentThVoteAction: "Vote", - parliamentTypeUser: "Inhabitant", - parliamentTypeTribe: "Tribe", parliamentVoteBtn: "Vote", parliamentProposalFormTitle: "Propose Law", parliamentProposalDescription: "Description (≤1000)", parliamentProposalPublish: "Publish Proposal", - parliamentFinalize: "Finalize", - parliamentDeadline: "Deadline", parliamentNoProposals: "There are not law proposals, yet.", parliamentNoLaws: "There are not laws approved, yet.", parliamentMethodDEMOCRACY: "Democracy", @@ -1289,29 +1094,21 @@ module.exports = { parliamentVotesSlashTotal: "Votes/Total", parliamentVotesNeeded: "Votes Needed", parliamentFutureLawsTitle: "Future Laws", - parliamentNoFutureLaws: "No future laws, yet.", parliamentVoteAction: "Vote", - parliamentLeadersTitle: "Leaders", parliamentThLeader: "AVATAR", parliamentPopulation: "Population", - parliamentThType: "Type", - parliamentThInPower: "In power", parliamentThPresented: "CANDIDATURES", parliamentNoLeaders: "No leaders, yet.", parliamentCandidaturesListTitle: "List of Candidatures", parliamentTimeRemaining: "Time remaining", - parliamentNoLeader: "No winning candidature, yet.", parliamentElectionsStatusTitle: "Next Government", parliamentProposalDeadlineLabel: "Deadline", parliamentProposalTimeLeft: "Time left", - parliamentProposalOnTrack: "On track to pass", - parliamentProposalOffTrack: "Not enough support yet", parliamentRulesTitle: "How Parliament works", parliamentRulesIntro: "Election resolve every 2 months; candidatures are continuous and reset when a government is chosen.", parliamentRulesCandidates: "Any inhabitant may propose themself, another inhabitant, or any tribe. Each inhabitant can propose up to 3 candidatures per cycle; duplicates in the same cycle are rejected.", parliamentRulesElection: "The winner is the candidature with the most votes at resolution time.", parliamentRulesTies: "Tie-break order: highest inhabitant karma; if tied, oldest profile; if still tied, earliest proposal; then lexicographic by ID.", - parliamentRulesFallback: "If no one votes, the latest proposed candidature wins. If there are no candidatures, a random tribe is selected.", parliamentRulesTerm: "The Government tab shows the current government and stats.", parliamentRulesMethods: "Forms: Anarchy (simple majority), Democracy (50%+1), Majority (80%), Minority (20%), Karmatocracy (highest-karma proposals), Dictatorship (instant approval).", parliamentRulesAnarchy: "Anarchy is the default mode: if no candidature is elected at resolution, Anarchy is proclaimed. Under Anarchy, any inhabitant can propose laws.", @@ -1333,11 +1130,7 @@ module.exports = { courtsCaseFormTitle: "Open Case", courtsCaseRespondent: "Accused / Respondent", courtsCaseRespondentPh: "Oasis ID (@...) or Tribe name", - courtsCaseMediatorsAccuser: "Mediators (accuser)", courtsCaseMethod: "Resolution method", - courtsCaseDescription: "Description (max 1000 chars.)", - courtsCaseEvidenceTitle: "Case evidence", - courtsCaseEvidenceHelp: "Attach images, audios, documents (PDF) or videos that support your case.", courtsCaseSubmit: "File Case", courtsNominateJudge: "Nominate Judge", courtsJudgeId: "Judge", @@ -1383,22 +1176,6 @@ module.exports = { courtsRulesMisconduct: "Harassment, manipulation, or fabricated evidence may lead to immediate negative resolution.", courtsRulesGlossary: "Case: record of a conflict. Evidence: materials that support claims. Verdict: decision with remedy. Appeal: request to review the verdict.", courtsFilterActions: "ACTIONS", - courtsNoActions: "No pending actions for your role.", - courtsCaseTitlePlaceholder: "Short description of the conflict", - courtsCaseSeverity: "Severity", - courtsCaseSeverityNone: "No severity tag", - courtsCaseSeverityLOW: "Low", - courtsCaseSeverityMEDIUM: "Medium", - courtsCaseSeverityHIGH: "High", - courtsCaseSeverityCRITICAL: "Critical", - courtsCaseSubject: "Topic", - courtsCaseSubjectNone: "No topic tag", - courtsCaseSubjectBEHAVIOUR: "Behaviour", - courtsCaseSubjectCONTENT: "Content", - courtsCaseSubjectGOVERNANCE: "Governance / rules", - courtsCaseSubjectFINANCIAL: "Financial / resources", - courtsCaseSubjectOTHER: "Other", - courtsHiddenRespondent: "Hidden (only visible to involved roles).", courtsThRole: "Role", courtsRoleAccuser: "Accuser", courtsRoleDefence: "Defence", @@ -1409,54 +1186,19 @@ module.exports = { courtsAssignJudgeBtn: "Choose judge", trendingTitle: "Trending", exploreTrending: "Explore the most popular content in your network.", - bookmarkButton: "BOOKMARKS", - transferButton: "TRANSFERS", - eventButton: "EVENTS", - taskButton: "TASKS", votesButton: "VOTATIONS", - industryButton: "INDUSTRY", - projectButton: "PROJECTS", - shopProductButton: "PRODUCTS", - reportButton: "REPORTS", - feedButton: "FEED", - marketButton: "MARKET", - imageButton: "IMAGES", - audioButton: "AUDIOS", - videoButton: "VIDEOS", - documentButton: "DOCUMENTS", - torrentButton: "TORRENTS", - noTrendingFound: "No trending content found.", - noContentMessage: "No trending content available, yet.", - trendingDescription: "Description", - trendingDate: "Date", - trendingLocation: "Location", - trendingPrice: "Price", - trendingUrl: "URL", - trendingCategory: "Category", - trendingStart: "Start", - trendingEnd: "End", - trendingPriority: "Priority", - trendingStatus: "Status", - trendingFrom: "From", - trendingTo: "To", - trendingConcept: "Concept", - trendingAmount: "Amount", - trendingDeadline: "Deadline", - trendingItemStatus: "Item Status", - trendingTotalVotes: "Total Votes", + shopProductButton: "SHOP", trendingTotalOpinions: "Total Opinions", trendingNoContentMessage: "No trending available, yet.", - trendingAuthor: "By", - trendingCreatedAtLabel: "Created At", trendingTotalCount: "Total Count", tasksTitle: "Tasks", tasksDescription: "Discover and manage tasks in your network.", + taskSearchPlaceholder: "Search tasks...", taskTitleLabel: "Title", taskDescriptionLabel: "Description", taskStartTimeLabel: "Start Time", taskEndTimeLabel: "End Time", taskPriorityLabel: "Priority", - taskPrioritySelect: "Select priority", taskPriorityUrgent: "Urgent", taskPriorityHigh: "High", taskPriorityMedium: "Medium", @@ -1466,13 +1208,13 @@ module.exports = { taskVisibilityLabel: "Visibility", taskPublic: "public", taskPrivate: "private", - taskCreatedAt: "Created At", - taskBy: "By", taskStatus: "Status", taskStatusOpen: "Open", taskStatusInProgress: "In Progress", taskStatusClosed: "Closed", taskAssignedTo: "Assigned to", + taskAssignedChip: "Assigned", + taskUnassignedChip: "Unassigned", taskAssignees: "Assignees", taskAssignButton: "Assign to Me", taskUnassignButton: "Unassign", @@ -1485,7 +1227,6 @@ module.exports = { taskFilterInProgress: "IN-PROGRESS", taskFilterClosed: "CLOSED", taskFilterAssigned: "ASSIGNED", - taskFilterArchived: "ARCHIVED", taskFilterUrgent: "URGENT", taskFilterHigh: "HIGH", taskFilterMedium: "MEDIUM", @@ -1498,23 +1239,21 @@ module.exports = { taskInProgressTitle: "In Progress Tasks", taskClosedTitle: "Closed Tasks", taskAssignedTitle: "Assigned Tasks", - taskArchivedTitle: "Archived Tasks", - taskPublicTitle: "Public Tasks", - taskPrivateTitle: "Private Tasks", notasks: "No tasks available.", noLocation: "No location specified", taskSetStatus: "Set Status", - eventTitle: "Events", eventDateLabel: "Date", + eventRecurrenceLabel: "Recurrence", + eventRecurrenceUntil: "Repeat until", + eventRecurrenceHint: "Leave the repeat-until date empty for a one-off event.", + eventUpcomingDates: "Upcoming dates", eventsTitle: "Events", eventsDescription: "Discover and manage events in your network.", - eventDescription: "Description", + eventSearchPlaceholder: "Search events...", eventPrice: "Price", eventStatus: "Status", - eventOrganizer: "Organizer", eventAllSectionTitle: "Events", eventMineSectionTitle: "Your Events", - eventArchivedTitle: "Archived Events", eventCreateSectionTitle: "Create Event", eventUpdateSectionTitle: "Update Event", eventDeleteButton: "Delete", @@ -1522,11 +1261,26 @@ module.exports = { eventAddToCalendar: "Add to Calendar", eventVisitCalendar: "Visit Calendar", viewTask: "View Task", + viewEvent: "View Event", + viewPad: "View Pad", + viewMap: "View Map", + viewCalendar: "View Calendar", viewReport: "View Report", viewTransfer: "View Transfer", viewItem: "View Item", viewShop: "View Shop", viewProject: "View Project", + viewJob: "View Job", + viewPlace: "View Place", + generatePdf: "Generate PDF", + sharePm: "Share via PM", + galleryImages: "Images (max-size: 50MB each)", + galleryPhotos: "Images", + galleryAddPhoto: "Add Image", + galleryRemovePhoto: "Remove", + galleryVideo: "Video (max-size: 50MB)", + galleryAddVideo: "Add Video", + galleryRemoveVideo: "Remove video", viewVotation: "View Votation", voteCastTitle: "Cast Vote", voteResults: "Results", @@ -1534,29 +1288,15 @@ module.exports = { eventDescriptionLabel: "Description", eventDescriptionPlaceholder: "Enter event description...", eventUpdateButton: "Update", - eventAttendeesLabel: "Attendees", - eventAttendeesPlaceholder: "Enter attendees, separated by commas...", eventTagsLabel: "Tags", - eventTagsPlaceholder: "Enter event tags, separated by commas...", - eventTags: "Tags", eventPriceLabel: "Price", eventUrlLabel: "URL", eventAttendees: "Attendees", - noAttendees: "No attendees yet", - eventCreatedAt: "Created At", eventLocation: "Location", eventLocationLabel: "Location", - eventNoLocation: "No location specified", - eventNoURL: "No URL specified", - eventBy: "By", noevents: "No events available.", eventDate: "Date", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "Attend Event", - eventUnattendButton: "Unattend Event", - eventCreatedBy: "Created By", - eventAttendeesCount: "Attendees Count", - eventCreatedByYou: "You created this event", eventFilterAll: "ALL", eventFilterMine: "MINE", eventFilterToday: "TODAY", @@ -1564,18 +1304,9 @@ module.exports = { eventFilterMonth: "THIS MONTH", eventFilterYear: "THIS YEAR", eventFilterArchived: "ARCHIVED", - eventTodayTitle: "Today's Events", - eventThisWeekTitle: "This Week's Events", - eventThisMonthTitle: "This Month's Events", - eventThisYearTitle: "This Year's Events", eventPrivacyLabel: "Visibility", eventPublic: "Public", eventPrivate: "Private", - eventPublicTitle: "Public Events", - eventNoPrice: "Free Event", - eventNoImage: "No image uploaded", - eventAttendConfirmation: "You are now attending this event", - eventUnattendConfirmation: "You are no longer attending this event", eventAttended: "Attended", eventUnattended: "Unattended", eventStatusOpen: "Open", @@ -1586,6 +1317,10 @@ module.exports = { tagsTopSectionTitle: "Top Tags", tagsCloudSectionTitle: "Tags Cloud", tagsFilterAll: "ALL", + tagsFilterMine: "MINE", + tagsFilterRecent: "RECENT", + tagsMineSectionTitle: "My Tags", + tagsRecentSectionTitle: "Recent Tags", tagsFilterTop: "TOP", tagsFilterCloud: "CLOUD", tagsNoItems: "No tags available.", @@ -1629,18 +1364,12 @@ module.exports = { transfersDeadline: "Deadline", transfersTags: "Tags", transfersStatus: "Status", - transfersStatusUnconfirmed: "UNCONFIRMED", - transfersStatusClosed: "CLOSED", - transfersStatusDiscarded: "DISCARDED", - transfersCreatedAt: "Created At", transfersConfirmations: "CONFIRMATIONS", - transfersContainingBlock: "Containing block", - transfersExportContract: "Smart Contract", + transfersExportContract: "Generate Bill", transfersConfirmButton: "Confirm Transfer", transfersNoItems: "No transfers found.", transfersMineSectionTitle: "Your Transfers", transfersUBISectionTitle: "UBI Transfers", - transfersMarketSectionTitle: "Market Transfers", transfersTopSectionTitle: "Top Transfers", transfersPendingSectionTitle: "Pending Transfers", transfersUnconfirmedSectionTitle: "Unconfirmed Transfers", @@ -1648,21 +1377,13 @@ module.exports = { transfersDiscardedSectionTitle: "Discarded Transfers", transfersCreateSectionTitle: "Create transfer", transfersAllSectionTitle: "Transfers", - transfersFilterFavs: "Favorites", - transfersFavsSectionTitle: "Favorite transfers", - transfersSearchLabel: "Search", transfersSearchPlaceholder: "Search concept, tags, users...", transfersMinAmountLabel: "Min amount", transfersMaxAmountLabel: "Max amount", - transfersSortLabel: "Sort by", transfersSortRecent: "Most recent", transfersSortAmount: "Highest amount", transfersSortDeadline: "Closest deadline", transfersSearchButton: "Search", - transfersFavoriteButton: "Favorite", - transfersUnfavoriteButton: "Unfavorite", - transfersMessageUserButton: "Message", - transfersExpiringSoonBadge: "EXPIRING", transfersExpiredBadge: "EXPIRED", transfersUpdatedAt: "Updated", transfersNoMatch: "No transfers match your search.", @@ -1707,16 +1428,6 @@ module.exports = { voteNoQuestion: "No question provided", voteUnknownCreator: "Unknown Creator", voteUnknownDate: "Unknown Date", - errorVoteNotFound: "Vote not found", - errorAlreadyVoted: "You have already opined.", - errorVoteClosedCannotEdit: "You cannot edit a closed votation", - errorVoteDeadlinePassed: "The deadline for this votation has passed", - errorRetrievingVote: "Error retrieving vote", - errorCreatingVote: "Error creating vote", - errorVoteAlreadyVoted: "Cannot edit after opinion has been cast", - errorDeletingOldVote: "Error deleting old opinion", - errorCreatingUpdatedVote: "Error creating updated opinion", - errorCreatingTombstone: "Error creating tombstone", voteDetailSectionTitle: 'Vote details', voteCommentsLabel: 'Comments', voteCommentsForumButton: 'Open discussion', @@ -1726,7 +1437,6 @@ module.exports = { voteNewCommentButton: 'Post comment', voteNewCommentLabel: 'Add a comment', cvTitle: "CV", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Edit CV", cvCreateSectionTitle: "Create CV", cvDescription: "Manage and share your professional skills and information.", @@ -1745,19 +1455,16 @@ module.exports = { cvLocationLabel: "Location", cvStatusLabel: "Status", cvPreferencesLabel: "Preferences", - cvOasisContributorLabel: "Oasis Contributor", cvPersonal: "Personal", cvOasis: "Oasis Contributor (optional)", - cvOasisContributorView: "Oasis Contribution", + cvOasisContributorView: "Contribution", cvEducational: "Educational (optional)", cvEducationalView: "Educational", cvProfessional: "Professional (optional)", cvProfessionalView: "Professional", cvAvailability: "Availability (optional)", - cvAvailabilityView: "Availability", cvUpdateButton: "Update", cvCreateButton: "Create CV", - cvContactLabel: "Contact", cvCreatedAt: "Created At", cvUpdatedAt: "Updated At", cvEditButton: "Update", @@ -1766,8 +1473,103 @@ module.exports = { blogSubject: "Subject", blogMessage: "Message", blogImage: "Upload media (max-size: 50MB)", + blogMedia: "Attachments (up to 8 images and a video)", blogPublish: "Preview", - noPopularMessages: "No popular messages published, yet", + pollsTitle: "Polls", + dataTitle: "Matches", + dataDescription: "Explore and visualize the matches in your network.", + dataFilterAll: "ALL", + dataFilterMine: "MINE", + dataFilterRecent: "RECENT", + dataFilterTop: "TOP", + dataKindInhabitants: "INHABITANTS", + dataKindJobs: "JOBS", + dataKindProjects: "PROJECTS", + dataKindEvents: "EVENTS", + dataKindTribes: "TRIBES", + dataKindMarket: "MARKET", + dataKindHousing: "HOUSING", + dataKindIndustry: "INDUSTRY", + dataKindTasks: "TASKS", + dataKindReports: "REPORTS", + dataKindVotes: "VOTATIONS", + dataSearchPlaceholder: "Search the cross-data...", + dataCohesionTitle: "Cohesion Coefficient (CC)", + dataCcShort: "CC", + dataCohesionHint: "Average affinity between everything the network has published.", + dataAffinity: "Affinity", + dataCommonTerms: "Keyword", + dataStatPeople: "CVs", + dataStatConnected: "Connected", + dataStatSkills: "Skills", + dataBestMatch: "Best Match", + dataStatIsolated: "Isolated", + dataStatEntities: "Entities compared", + dataStatTerms: "Distinct terms", + dataStatPairs: "Connected pairs", + dataMatchesTitle: "Matches", + dataMatchesHint: "Personalized algorithm suggestions.", + dataTermsTitle: "Keywords", + dataTermsHint: "The terms that appear across the most content.", + dataConnections: "Linked matches", + dataTopicTitle: "Everything related to", + dataTopicHint: "What the algorithm relates to this topic", + dataNoMatches: "No cross-data to show.", + dataNoProfile: "Publish content or write your CV so the algorithm can learn what interests you.", + pollsDescription: "Module to ask the network and count the answers.", + pollFilterAll: "ALL", + pollFilterMine: "MINE", + pollFilterRecent: "RECENT", + pollFilterTop: "TOP", + pollFilterVoted: "VOTED", + pollFilterOpen: "OPEN", + pollFilterClosed: "CLOSED", + pollCreateButton: "Create Poll", + pollCreateTitle: "Create Poll", + pollEditTitle: "Edit Poll", + pollQuestion: "Question", + pollQuestionPlaceholder: "What do you want to ask?", + pollOptions: "Options (one per line)", + pollOutcome: "Result", + pollNoVotesYet: "No votes yet", + pollTie: "Tie", + pollOptionsPlaceholder: "Plaza\nPark\nBar", + pollAnonymous: "Anonymous", + pollAnonymousLabel: "Anonymous poll", + pollMultiple: "Multiple choice", + pollMultipleLabel: "Allow multiple answers", + pollDeadline: "Deadline", + pollTags: "Tags", + pollPublishButton: "Publish Poll", + pollUpdateButton: "Update", + pollCloseButton: "Close", + pollDeleteButton: "Delete", + pollVoteButton: "Vote", + pollChangeVote: "Change Vote", + pollVoters: "Voters", + pollComments: "Comments", + pollStatusLabel: "Status", + pollStatusOpen: "OPEN", + pollStatusClosed: "CLOSED", + pollSearchPlaceholder: "Search polls...", + pollsNoItems: "No polls found.", + viewPoll: "View Poll", + pollChatCreate: "Create Poll", + pollInChat: "Poll", + blogTitle: "Blogs", + blogDescription: "Module to discover and manage blogs.", + blogFilterAll: "ALL", + blogFilterMine: "MINE", + blogFilterRecent: "RECENT", + blogFilterFavorites: "FAVORITES", + blogFilterTop: "TOP", + blogCreateButton: "Create Blog", + blogSearchPlaceholder: "Search blogs...", + blogComments: "Comments", + blogAllowComments: "Allow comments", + blogCommentsClosed: "The author has closed comments on this blog.", + blogNoItems: "No blogs found.", + viewBlog: "View Blog", forumTitle: "Forums", forumCategoryLabel: "Category", forumTitleLabel: "Title", @@ -1775,70 +1577,55 @@ module.exports = { forumCreateButton: "Create forum", forumCreateSectionTitle: "Create forum", forumDescription: "Talk openly with other inhabitants in your network.", + forumSearchPlaceholder: "Search forums...", forumFilterAll: "ALL", forumFilterMine: "MINE", forumFilterRecent: "RECENT", forumFilterTop: "TOP", - forumMineSectionTitle: "Your Forums", - forumRecentSectionTitle: "Recent Forums", - forumAllSectionTitle: "Forums", forumDeleteButton: "Delete", forumParticipants: "participants", forumMessages: "messages", - forumLastMessage: "Last message", forumMessageLabel: "Message", forumMessagePlaceholder: "Write your message...", forumSendButton: "Send", - forumVisitForum: "Visit Forum", noForums: "No forums found.", - forumVisitButton: "Visit forum", - forumCatGENERAL: "General", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", + forumVisitButton: "Visit Forum", + forumTopicLabel: "Topic", larpTitle: "L.A.R.P.", larpDescription: "A live action role-playing layer for collaborative experimentation.", + larpNoHousesMatch: "No houses match your search.", + larpSearchPlaceholder: "Search houses...", larpAllHouses: "Houses:", larpFilterRuling: "RULING", larpFilterHouses: "HOUSES", larpFilterRules: "FAQ", larpRulesTitle: "F.A.Q.", - larpRulesEntryTitle: "Starting house", larpRulesEntryText: "Every inhabitant begins in ACADEMIA by default.", - larpRulesTestEntry: "WILL test", - larpRulesTestEntryText: "Each option weights one or more houses; when you submit, the system tallies the scores and auto-admits you into the highest-scoring house.", - larpRulesInviteEntry: "Invitation code", + larpRulesTestEntryText: "In the WILL test each option weights one or more houses; when you submit, the system tallies the scores and auto-admits you into the highest-scoring house.", larpRulesInviteEntryText: "House members can generate invitation codes that grant direct access to the house.", - larpRulesOneHouseTitle: "One house at a time", larpRulesOneHouseText: "You can belong to at most one house at any given moment. If you belong to none, you are in ACADEMIA. Every non-ACADEMIA house page shows a \"Leave House\" button to its members that resets membership back to ACADEMIA. Leaving does NOT waive the test cooldown.", - larpRulesLeaveText: "Members of any house can return to ACADEMIA at any time from their house page; doing so resets their membership but does not waive the test cooldown.", - larpRulesGovernanceTitle: "Governance Wall", larpRulesGovernanceText: "During its cycle, the governing house wears the \"Ruling\" badge and is the only one whose Wall is surfaced publicly under the RULING tab.", - larpRulesSignTitle: "L.A.R.P. Emblem", + larpRulesWallText: "Each house has a Wall where its members write. A house Wall is private to the house, except the one of the governing house and the one of ACADEMIA, which anybody can read.", larpRulesSignText: "Inhabitants can choose whether to add a sensor on their avatar with the emblem of their current house.", larpPostsTitle: "Wall", larpPostsEmpty: "No posts yet.", - larpPostLabel: "New post", larpPostPlaceholder: "What does this house need to say?", - larpPostPublic: "Public (visible to anyone, otherwise only members)", larpPostSubmit: "Publish", - larpPostMembersOnly: "Members only", larpCycleLabel: "Cycle:", larpCyclesUntilRuling: "Next governance cycle", larpVisitTribe: "Visit Tribe", - larpGoverning: "Governing:", + larpStartJourney: "Start Journey", + larpGoverning: "Ruling:", + larpStartHere: "Start here:", larpMyHouse: "My House:", larpMembersCount: "Members", - larpMembersTitle: "Members", - larpNoMembers: "No members yet.", larpRolesLabel: "Roles", larpFunctionLabel: "Function", larpMonthLabel: "Governance cycle", larpLeaveToAcademia: "Leave House", - larpAcademiaJoinTitle: "Houses Current Status", + larpAcademiaJoinTitle: "L.A.R.P. Houses", larpWillTestTitle: "WILL test", larpWillTestHint: "Once completed, you will be assigned the house that best matches your answers. Your individual answers are processed locally and never stored — only the resulting house assignment is published to your feed.", - larpAcademiaJoinHint: "Take the psychological profile test to be assigned the house that fits you best, or redeem an invitation code shared by a member of a house.", - larpTakeTestButton: "Take the profile test", larpInviteRedeem: "Join House", larpInviteCreate: "Generate invitation code", larpInvitePlaceholder: "Invitation code", @@ -1847,11 +1634,9 @@ module.exports = { invitesHouseJoinButton: "Join House", larpInviteBannerTitle: "New invitation code", larpInviteBannerHint: "Share this code with someone in ACADEMIA. It expires in 30 cycles or after one use.", - larpTestAssignedHouse: "Assigned house", larpTestRankingTitle: "Score by house", larpLastAttemptTitle: "Your last attempt", larpLastAttemptHouse: "House", - larpLastAttemptResult: "Result", larpLastAttemptWhen: "When", larpLastAttemptCooldown: "Next attempt in", larpTestTitle: "Profile test", @@ -1930,34 +1715,16 @@ module.exports = { larpTestCooldownActive: "Next test available in", larpTestCooldownDays: "cycles", larpTestResultTitle: "Test result", - larpTestPassed: "Test passed — welcome!", - larpTestFailed: "Test not passed", larpTestScore: "Score", larpTestNextAttempt: "You can attempt another test in 30 cycles.", larpGoToHouse: "Go to your house", larpBackToAcademia: "Back to ACADEMIA", - larpBackToHouses: "◀ Houses", larpBadgeYou: "You", larpBadgeRuling: "Ruling", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Module for the live-action role-playing layer of Oasis (the 9 Houses).", - forumCatPOLITICS: "Politics", - forumCatTECH: "Tech", - forumCatSCIENCE: "Science", - forumCatMUSIC: "Music", - forumCatART: "Art", - forumCatGAMING: "Gaming", - forumCatBOOKS: "Books", - forumCatFILMS: "Films", - forumCatPHILOSOPHY: "Philosophy", - forumCatSOCIETY: "Society", - forumCatPRIVACY: "Privacy", - forumCatCYBERWARFARE: "Cyberwarfare", - forumCatSURVIVALISM: "Survivalism", imageTitle: "Images", imageDescription: "Explore and manage image content in your network.", - imagePluginTitle: "Title", - imagePluginDescription: "Description", imageMineSectionTitle: "Your Images", imageCreateSectionTitle: "Upload Image", imageUpdateSectionTitle: "Update Image", @@ -1966,14 +1733,12 @@ module.exports = { imageTopSectionTitle: "Top Images", imageFavoritesSectionTitle: "Favorites", imageGallerySectionTitle: "Gallery", - imageMemeSectionTitle: "Memes", imageFilterAll: "ALL", imageFilterMine: "MINE", imageFilterRecent: "RECENT", imageFilterTop: "TOP", imageFilterFavorites: "FAVORITES", imageFilterGallery: "GALLERY", - imageFilterMeme: "MEMES", imageCreateButton: "Upload Image", imageUpdateButton: "Update", imageDeleteButton: "Delete", @@ -1986,7 +1751,6 @@ module.exports = { imageTitlePlaceholder: "Optional", imageDescriptionLabel: "Description", imageDescriptionPlaceholder: "Optional", - imageMemeLabel: "¿MEME?", imageNoFile: "No image file provided", noImages: "No images available.", imageSearchPlaceholder: "Search title, tags, description, author...", @@ -1994,7 +1758,6 @@ module.exports = { imageSortOldest: "Oldest", imageSortTop: "Most voted", imageSearchButton: "Search", - imageMessageAuthorButton: "Message", imageUpdatedAt: "Updated", imageNoMatch: "No images match your search.", feedTitle: "Feed", @@ -2006,7 +1769,6 @@ module.exports = { createFeedButton: "Send Feed!", feedPlaceholder: "What's happening? (max 280 characters)", TODAYButton: "TODAY", - CREATEButton: "Create Feed", totalOpinions: "Total Opinions", moreVoted: "More Voted", noFeedsFound: "No feeds found.", @@ -2029,20 +1791,12 @@ module.exports = { concept: "Concept", description: "Description", meme: "Meme", - activityContact: "Contact", - activityBy: "Name", - activityPixelia: "New pixel added", - viewImage: "View image", - playAudio: "Play audio", - playVideo: "Play video", typeRecent: "RECENT", - errorActivity: "Error retrieving activity", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "RECENT", typeTribe: "TRIBES", typeLarp: "L.A.R.P.", typeInhabitants: "INHABITANTS", - activityProfileUpdated: "updated their profile", typeAbout: "INHABITANTS", typeCurriculum: "CVS", typeImage: "IMAGES", @@ -2086,8 +1840,6 @@ module.exports = { typeCourtsSettlementAccepted: "Courts · Settlement Accepted", typeCourtsNomination: "Courts · Nomination", typeCourtsNominationVote: "Courts · Nomination Vote", - activitySupport: "New alliance forged", - activityJoin: "New PUB joined", question: "Question", deadline: "Deadline", status: "Status", @@ -2101,12 +1853,8 @@ module.exports = { date: "Date", category: "Category", attendees: "Attendees", - activitySpread: "->", - visitLink: "Visit Link", - viewDocument: "View Document", location: "Location", contentWarning: "Subject", - personName: "Inhabitant Name", bankWalletConnected: "ECOin Wallet", bankUbiReceived: "UBI Received", bankTx: "Tx", @@ -2124,7 +1872,6 @@ module.exports = { aiExchangeMarkHelpful:"+1 helpful", activityProjectFollow: "%OASIS% is now %ACTION% this project %PROJECT%", activityProjectUnfollow: "%OASIS% is now %ACTION% this project %PROJECT%", - activityProjectPledged: "%OASIS% has %ACTION% %AMOUNT% to project %PROJECT%", following: "FOLLOWING", unfollowing: "UNFOLLOWING", pledged: "PLEDGED", @@ -2170,26 +1917,17 @@ module.exports = { courtsVotesSlashTotal: "YES/TOTAL", courtsOpenVote: "Open vote", courtsAnswerTitle: "Answer", - courtsStanceADMIT: "Admit", - courtsStanceDENY: "Deny", - courtsStancePARTIAL: "Partial", - courtsStanceCOUNTERCLAIM: "Counterclaim", - courtsStanceNEUTRAL: "Neutral", courtsVerdictResult: "Result", courtsVerdictOrders: "Orders", courtsSettlementText: "Settlement", courtsSettlementAccepted: "Accepted", - courtsSettlementPending: "Pending", courtsJudge: "Judge", courtsThSupports: "Supports", courtsFilterOpenCase: 'Open Case', - courtsEvidenceFileLabel: 'Evidence file (image, audio, video or PDF)', - courtsCaseMediators: 'Mediators', courtsCaseMediatorsPh: 'Mediator Oasis IDs, separated by comma', courtsMediatorsLabel: 'Mediators', courtsThCase: 'Case', courtsThCreatedAt: 'Start date', - courtsThActions: 'Actions', courtsPublicPrefLabel: 'Visibility after resolution', courtsPublicPrefYes: 'I agree this case can be fully public', courtsPublicPrefNo: 'I prefer to keep the details private', @@ -2197,8 +1935,11 @@ module.exports = { courtsMethodMEDIATION: 'Mediation', courtsNoCases: 'No cases.', reportsTitle: "Reports", - reportsDescription: "Manage and track reports related to issues, bugs, abuses and content warnings in your network.", + reportsDescription: "Manage and track reports in your network.", + reportsSearchPlaceholder: "Search reports...", reportsFilterAll: "ALL", + reportsFilterRecent: "RECENT", + reportsFilterTop: "TOP", reportsFilterMine: "MINE", reportsFilterFeatures: "FEATURES", reportsFilterBugs: "BUGS", @@ -2211,18 +1952,13 @@ module.exports = { reportsFilterInvalid: "INVALID", reportsCreateButton: "Create Report", reportsTitleLabel: "Title", - reportsDescriptionLabel: "Description", - reportsDescriptionPlaceholder: "Please provide a detailed description.", reportsCategory: "Category", - reportsCategoryLabel: "Category", reportsCategoryFeatures: "Features", reportsCategoryBugs: "Bugs", reportsCategoryAbuse: "Abuse", - reportsCategoryContent: "Content Issues", + reportsCategoryContent: "Content", reportsUpdateButton: "Update", reportsDeleteButton: "Delete", - reportsDateLabel: "Date", - reportsUploadFile: "Upload media (max-size: 50MB)", reportsMineSectionTitle: "Your Reports", reportsFeaturesSectionTitle: "Feature Requests", reportsBugsSectionTitle: "Bugs", @@ -2230,11 +1966,6 @@ module.exports = { reportsContentSectionTitle: "Content Issues", reportsAllSectionTitle: "Reports", reportsNoItems: "No reports available.", - reportsValidationTitle: "Please enter a valid title.", - reportsValidationDescription: "Description cannot be empty.", - reportsValidationCategory: "Please select a category.", - reportsCreatedAt: "Created At", - reportsCreatedBy: "By", reportsSeverity: "Severity", reportsSeverityLow: "Low", reportsSeverityMedium: "Medium", @@ -2245,13 +1976,10 @@ module.exports = { reportsStatusUnderReview: "Under Review", reportsStatusResolved: "Resolved", reportsStatusInvalid: "Invalid", - reportsUpdateStatusButton: "Update Status", - reportsAnonymityOption: "Submit Anonymously", - reportsAnonymousAuthor: "Anonymous", reportsConfirmButton: "CONFIRM REPORT!", reportsConfirmations: "Confirmations", reportsConfirmedSectionTitle: "Confirmed Reports", - reportsCreateTaskButton: "CREATE TASK", + reportsCreateTaskButton: "Create Task", reportsOpenSectionTitle: "Open Reports", reportsUnderReviewSectionTitle: "Under Review Reports", reportsResolvedSectionTitle: "Resolved Reports", @@ -2295,6 +2023,20 @@ module.exports = { reportsRequestedActionLabel: 'Requested action', reportsRequestedActionPlaceholder: 'Remove, hide, tag, warn, etc.', tribesTitle: "Tribes", + tribeFilterAll: "ALL", + tribeFilterRecent: "RECENT", + tribeFilterMine: "MINE", + tribeFilterMembership: "MEMBERSHIP", + tribeFilterSubtribes: "SUBTRIBES", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALLERY", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MINE", + tribeFeedFilterALL: "ALL", + tribeFeedFilterRECENT: "RECENT", + courtsStanceDENY: "Deny", + courtsStanceADMIT: "Admit", + courtsStancePARTIAL: "Partially admit", tribeAllSectionTitle: "Tribes", tribeMineSectionTitle: "Your Tribes", tribeCreateSectionTitle: "Create Tribe", @@ -2306,13 +2048,6 @@ module.exports = { tribeviewSubTribeButton: "Visit Sub-Tribe", tribeRootLabel: "ROOT", tribeDescription: "Explore or create tribes on your network.", - tribeFilterAll: "ALL", - tribeFilterMine: "MINE", - tribeFilterMembership: "MEMBERSHIP", - tribeFilterRecent: "RECENT", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "SUB-TRIBES", - tribeFilterGallery: "GALLERY", tribeMainTribeLabel: "MAIN TRIBE", tribeCreateButton: "Create Tribe", tribeUpdateButton: "Update", @@ -2331,13 +2066,8 @@ module.exports = { tribeModeLabel: "MODE", tribeIsAnonymousLabel: "STATUS", tribeMembersCount: "Members", - tribeInviteCodePlaceholder: "Enter invite code", - tribeJoinByCodeButton: "Join with code", - tribeJoinButton: "JOIN", tribeEnterInvite: "ENTER INVITE CODE", tribeLeaveButton: "LEAVE", - tribeYes: "YES", - tribeNo: "NO", tribePublic: "PUBLIC", tribePrivate: "PRIVATE", tribeGenerateInvite: "SINGLE INVITATION", @@ -2346,13 +2076,8 @@ module.exports = { tribeRemoveInvitation: "REMOVE INVITATION", tribeCreatedAt: "Created at", tribeAuthor: "By", - tribeAuthorLabel: "AUTHOR", tribeStrict: "Strict", tribeOpen: "Open", - tribeFeedFilterRECENT: "RECENT", - tribeFeedFilterMINE: "MINE", - tribeFeedFilterALL: "ALL", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Refeeds", tribeFeedRefeed: "Refeed", tribeFeedMessagePlaceholder: "Write a feed…", @@ -2362,17 +2087,12 @@ module.exports = { tribeNotFound: "Tribe not found!", createTribeTitle: "Create Tribe", updateTribeTitle: "Update Tribe", - tribeSectionOverview: "Overview", tribeSectionInhabitants: "Inhabitants", tribeSectionVotations: "VOTATIONS", tribeSectionEvents: "EVENTS", - tribeSectionReports: "Reports", tribeSectionTasks: "TASKS", tribeSectionFeed: "FEED", tribeSectionForum: "FORUM", - tribeSectionMarket: "Market", - tribeSectionJobs: "Jobs", - tribeSectionProjects: "Projects", tribeSectionMedia: "Media", tribeSectionImages: "IMAGES", tribeSectionAudios: "AUDIOS", @@ -2410,11 +2130,6 @@ module.exports = { tribeTaskStatusClosed: "CLOSE", tribeTaskAssign: "ASSIGN", tribeTaskUnassign: "UNASSIGN", - tribeReportCreate: "Create Report", - tribeReportsEmpty: "No reports, yet.", - tribeReportTitle: "Title", - tribeReportDescription: "Description", - tribeReportCategory: "Category", tribeVotationCreate: "Create Votation", tribeVotationsEmpty: "No votations, yet.", tribeVotationTitle: "Title", @@ -2432,27 +2147,6 @@ module.exports = { tribeForumCategory: "Category", tribeForumReply: "Reply", tribeForumReplies: "Replies", - tribeMarketCreate: "Create Listing", - tribeMarketEmpty: "No listings, yet.", - tribeMarketTitle: "Title", - tribeMarketDescription: "Description", - tribeMarketPrice: "Price", - tribeMarketImage: "Image", - tribeMarketCategory: "Category", - tribeJobCreate: "Create Job", - tribeJobsEmpty: "No jobs, yet.", - tribeJobTitle: "Title", - tribeJobDescription: "Description", - tribeJobLocation: "Location", - tribeJobSalary: "Salary", - tribeJobDeadline: "Deadline", - tribeProjectCreate: "Create Project", - tribeProjectsEmpty: "No projects, yet.", - tribeProjectTitle: "Title", - tribeProjectDescription: "Description", - tribeProjectGoal: "Goal", - tribeProjectFunded: "Funded", - tribeProjectDeadline: "Deadline", tribeMediaUpload: "Upload Media", readDocument: "Read Document", tribeCreateImage: "Create Image", @@ -2463,7 +2157,6 @@ module.exports = { tribeMediaEmpty: "No media, yet.", tribeMediaTitle: "Title", tribeMediaDescription: "Description", - tribeMediaType: "Type", tribeMediaTypeImage: "Image", tribeMediaTypeVideo: "Video", tribeMediaTypeAudio: "Audio", @@ -2473,11 +2166,6 @@ module.exports = { tribeInviteCodeText: "Invite code: ", oasisVersionLabel: "Oasis Version", tribeInviteCodeHint: "Share this code with someone you want to invite. They can join via /invites → Tribes.", - tribeGroupTribe: "Tribe", - tribeGroupOffice: "Office", - tribeGroupNetwork: "Network", - tribeGroupEconomy: "Economy", - tribeGroupMedia: "Media", tribeStatusOpen: "OPEN", tribeStatusClosed: "CLOSED", tribeStatusInProgress: "IN PROGRESS", @@ -2487,33 +2175,17 @@ module.exports = { tribePriorityCritical: "CRITICAL", tribeTaskFilterAll: "ALL", tribeMediaFilterAll: "ALL", - tribeReportCatBug: "BUG", - tribeReportCatAbuse: "ABUSE", - tribeReportCatContent: "CONTENT", - tribeReportCatOther: "OTHER", tribeForumCatGeneral: "GENERAL", tribeForumCatProposal: "PROPOSAL", tribeForumCatQuestion: "QUESTION", tribeForumCatAnnouncement: "ANNOUNCEMENT", - tribeMarketCatGoods: "GOODS", - tribeMarketCatServices: "SERVICES", - tribeMarketCatFood: "FOOD", - tribeMarketCatOther: "OTHER", tribeStatusLabel: "Status", tribeSubTribes: "SUB-TRIBES", tribeSubTribesCreate: "Create Sub-Tribe", tribeSubTribesStrictDenied: "Tribe strict mode does not allow you to create new sub-tribes. Please contact the administrator.", - tribeSubTribesEmpty: "No sub-tribes created, yet.", - tribeActivityJoined: "JOINED", - tribeActivityLeft: "LEFT", - tribeActivityFeed: "FEED", tribeActivityRefeed: "REFEED", - tribeGroupAnalytics: "Analytics", - tribeGroupCreative: "Creative", tribeSectionActivity: "ACTIVITY", tribeSectionTrending: "TRENDING", - tribeSectionOpinions: "OPINIONS", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "TAGS", tribeSectionSearch: "SEARCH", tribeActivityEmpty: "No activity yet.", @@ -2525,25 +2197,15 @@ module.exports = { tribeTrendingPeriodWeek: "This Week", tribeTrendingPeriodAll: "All Time", tribeTrendingEngagement: "engagement", - tribeOpinionsEmpty: "No opinions yet.", - tribeOpinionsCast: "Vote", - tribeOpinionsRankings: "Rankings", - tribeOpinionsAlreadyVoted: "Already voted", tribeTopCategory: "More Voted", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Collaborative pixel art canvas.", - tribePixeliaPaint: "Paint", - tribePixeliaContributors: "contributors", - tribePixeliaTotalPixels: "pixels painted", tribeTagsEmpty: "No tags found.", - tribeTagsCloud: "Tag Cloud", - tribeTagsContentWith: "Content with tag", tribeSearchPlaceholder: "Search tribe content...", tribeSearchEmpty: "No results found.", tribeSearchResults: "Results", tribeSearchMinChars: "Enter at least 2 characters to search.", agendaTitle: "Agenda", agendaDescription: "Here you can find all your assigned items.", + agendaSearchPlaceholder: "Search agenda...", agendaFilterAll: "ALL", agendaFilterToday: "TODAY", agendaFilterUpcoming: "UPCOMING", @@ -2562,20 +2224,9 @@ module.exports = { agendaFilterProjects: "PROJECTS", agendaFilterCalendars: "CALENDARS", agendaNoItems: "No assignments found.", - agendaAuthor: "By", agendaDiscardButton: "Discard", agendaRestoreButton: "Restore", - agendaCreatedAt: "Created At", - agendaTitleLabel: "Title", agendaMembersCount: "Members", - agendaDescriptionLabel: "Description", - agendaStatus: "Status", - agendaVisibility: "Visibility", - agendaEventDate: "Event Date", - agendaEventLocation: "Location", - agendaEventPrice: "Price", - agendaEventUrl: "URL", - agendaTaskStart: "Start Time", agendaLocationLabel: "Location", agendaYes: "YES", agendaNo: "NO", @@ -2585,11 +2236,6 @@ module.exports = { agendareportCategory: "Category", agendareportSeverity: "Severity", agendareportStatus: "Status", - agendareportDescription: "Description", - agendaTaskEnd: "End Time", - agendaTaskPriority: "Priority", - agendaTransferFrom: "From", - agendaTransferTo: "To", agendaTransferConcept: "Concept", agendaTransferAmount: "Amount", agendaTransferDeadline: "Deadline", @@ -2599,47 +2245,7 @@ module.exports = { voteNow: "Vote now", alreadyVoted: "You have already opined.", noOpinionsFound: "No opinions found.", - RECENTButton: "RECENT", TOPButton: "TOP", - interestingButton: "INTERESTING", - necessaryButton: "NECESSARY", - funnyButton: "FUNNY", - disgustingButton: "DISGUSTING", - sensibleButton: "SENSIBLE", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "ADULT ONLY", - boringButton: "BORING", - confusingButton: "CONFUSING", - usefulButton: "USEFUL", - informativeButton: "INFORMATIVE", - wellResearchedButton: "WELL RESEARCHED", - accurateButton: "ACCURATE", - needsSourcesButton: "NEEDS SOURCES", - wrongButton: "WRONG", - lowQualityButton: "LOW QUALITY", - creativeButton: "CREATIVE", - insightfulButton: "INSIGHTFUL", - actionableButton: "ACTIONABLE", - inspiringButton: "INSPIRING", - loveButton: "LOVE", - clearButton: "CLEAR", - upliftingButton: "UPLIFTING", - unnecessaryButton: "UNNECESSARY", - rejectedButton: "REJECTED", - misleadingButton: "MISLEADING", - offTopicButton: "OFF TOPIC", - duplicateButton: "DUPLICATE", - clickbaitButton: "CLICKBAIT", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "VIOLENT", - toxicButton: "TOXIC", - harassmentButton: "HARASSMENT", - hateButton: "HATE", - scamButton: "SCAM", - triggeringButton: "TRIGGERING", - opinionsCreatedAt: "Created At", opinionsTotalCount: "Total Opinions", voteInteresting: "Interesting", voteNecessary: "Necessary", @@ -2676,7 +2282,6 @@ module.exports = { voteCreative: "Creative", voteSpam: "Spam", voteAdultOnly: "Adult Only", - publishBlog: "Publish Blog", privateMessage: "PM", pmSendTitle: "Private Messages", pmSend: "Send!", @@ -2687,7 +2292,6 @@ module.exports = { pmComposeTitle: "Send a message", pmRecipients: "Recipients", pmRecipientsHint: "Enter Oasis IDs separated by commas", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Up to 7 recipients per message.", pmTextPlaceholder: "Body capped at 7000 characters.", pmSubject: "Subject", @@ -2711,7 +2315,6 @@ module.exports = { pmCrypterCharsLabel: "characters", pmInvalidRecipients: "Invalid Oasis ID (should be like @…=.ed25519).", pmEncryptionLabel: "Encryption", - pmFile: "Attachment", private: "Private", privateDescription: "Your encrypted messages.", privateInbox: "INBOX", @@ -2721,10 +2324,8 @@ module.exports = { noPrivateMessages: "No private messages.", pmFromLabel: "From:", pmToLabel: "To:", - pmInvalidMessage: "Invalid message", pmNoSubject: "(no subject)", pmSubjectLabel: "Subject:", - pmBodyLabel: "Body", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2742,8 +2343,6 @@ module.exports = { inboxJobSubscribedTitle: "New subscription to your job offer", pmInhabitantWithId: "Inhabitant with OASIS ID:", pmHasSubscribedToYourJobOffer: "has subscribed to your job offer", - inboxProjectCreatedTitle: "New project created", - pmHasCreatedAProject: "has created a project", inboxMarketItemSoldTitle: "Item Sold", inboxShopSoldTitle: "Product Sold", pmYourItem: "Your item", @@ -2753,7 +2352,6 @@ module.exports = { pmHasPledged: "has pledged", pmToYourProject: "to your project", blockchain: 'BlockExplorer', - blockchainTitle: 'BlockExplorer', blockchainDescription: 'Explore and visualize the blocks in the blockchain.', blockchainNoBlocks: 'No blocks found in the blockchain.', blockchainStatsTitle: 'Stats', @@ -2765,19 +2363,17 @@ module.exports = { blockchainBlockCarbon: 'Carbon footprint', blockchainBlockType: 'Type', blockchainBlockTimestamp: 'Timestamp', - blockchainBlockContent: 'Block', - blockchainBlockURL: 'URL:', - blockchainContent: 'Block', - blockchainContentPreview: 'Preview of the block content', blockchainLatestDatagram: 'Latest Datagram', - blockchainDatagram: 'Datagram', - blockchainDetails: 'View block details', - blockchainViewBlockexplorer: "View blockexplorer", - blockchainBlockInfo: 'Block Information', - blockchainBlockDetails: 'Details of the selected block', + blockchainDatagram: "Datagram", + blockchainDetails: "View Block Details", + blockchainViewBlockexplorer: "View in Blockexplorer", blockchainBack: 'Back to Blockexplorer', blockchainContentDeleted: "This content has been tombstoned", visitContent: "Visit Content", + favoriteAdd: "Pin to Favorites", + pmContentTooltip: "Send a Private Message", + favoriteRemove: "Unpin from Favorites", + reportContent: "Report Content", banking: 'Banking', bankingTitle: 'Banking', bankingDescription: "The ECOin economy: balance, UBI, taxes and industry value.", @@ -2786,21 +2382,17 @@ module.exports = { bankRules: 'Rules', pending: 'Pending', closed: 'Closed', - bankBack: 'Back to Banking', bankViewTx: 'View Tx', bankClaimNow: 'Claim now', bankClaimUBI: 'Claim UBI!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'No pending UBI allocations for this epoch.', bankEpoch: 'Epoch', bankPool: 'Pool (this epoch)', bankWeightsSum: 'Sum of weights', - bankAllocations: 'Allocations', bankNoAllocations: 'No allocations found.', bankNoEpochs: 'No epochs found.', bankEpochAllocations: 'Epoch allocations', @@ -2819,9 +2411,6 @@ module.exports = { bankYourFundsMonth: "Your Funds (this month)", bankIndustryBalance: "Industry Production (estimated)", bankUserBalance: 'Your Balance', - ecoWalletNotConfigured: 'ECOin Wallet not configured', - editWallet: 'Edit wallet', - addWallet: 'Add wallet', bankAddresses: 'Addresses', bankNoAddresses: 'No addresses found.', bankUser: 'Oasis ID', @@ -2846,15 +2435,7 @@ module.exports = { search: 'Search!', bankLocal: 'Local', bankFromOasis: 'Oasis', - bankMyAddress: 'Your address', - bankRemoveMyAddress: 'Remove my address', - bankNotRemovableOasis: 'Addresses cannot be removed locally', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "NO FUNDS!", bankUbiAvailableOk: "AVAILABLE!", bankUbiAvailability: "UBI (network)", @@ -2871,13 +2452,6 @@ module.exports = { shopsTitle: "Shops", shopDescription: "Discover and manage shops in the network.", shopTitle: "Shop", - shopFilterAll: "ALL", - shopFilterMine: "MINE", - shopFilterRecent: "RECENT", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUCTS", - shopFilterPrices: "PRICES", - shopFilterFavorites: "FAVORITES", shopUpload: "Create Shop", shopAllSectionTitle: "Shops", shopMineSectionTitle: "Your Shops", @@ -2894,16 +2468,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Publish to Clearnet", - shopClearnetUnpublish: "Unpublish from Clearnet", - shopClearnetUrlLabel: "Clearnet URL", - shopClearnetWarning: "Publishing on Clearnet makes this shop indexable by external search engines and crawlers.", shopAddFavorite: "Add Favorite", shopRemoveFavorite: "Remove Favorite", shopOpen: "OPEN", shopClosed: "CLOSED", - shopOpenShop: "Open Shop", - shopCloseShop: "Close Shop", shopMakePrivate: "MAKE PRIVATE (E2E)", shopMakePublic: "MAKE PUBLIC", shopProducts: "Products", @@ -2931,8 +2499,6 @@ module.exports = { shopOrderPrice: "Price", shopOrderBuyer: "Buyer", shopBackToShop: "Back to Shop", - shopShareUrl: "Share URL", - shopVisitShop: "VISIT SHOP", marketVisitItem: "VISIT ITEM", shopStatus: "STATUS", shopCreatedAt: "CREATED", @@ -2941,12 +2507,10 @@ module.exports = { shopLocation: "Location", shopTags: "Tags", shopVisibility: "Visibility", - shopImage: "Image", shopShortDescription: "Short Description", shopShortDescriptionPlaceholder: "Brief description of your shop", shopTitlePlaceholder: "Name of your shop", shopDescriptionPlaceholder: "Detailed description of your shop", - shopUrlPlaceholder: "https://your-shop-url.com", shopLocationPlaceholder: "City, Country", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Map title", @@ -2964,7 +2528,6 @@ module.exports = { bankUnitMinutes: "minutes", bankUnitDays: "days", bankExchangeNoData: 'No data available', - bankExchangeIndex: 'ECOin Value (1h)', bankInflation: 'ECOin Inflation (anual)', bankInflationMonthly: 'ECOin Inflation (mensual)', bankExchangeChartTitle: 'ECOin value progression over time', @@ -2978,38 +2541,17 @@ module.exports = { bankingSyncStatusOutdated: 'Outdated', statsTitle: 'Statistics', statistics: "Statistics", - statsInhabitant: "Inhabitant Stats", statsDescription: "Discover statistics about your network.", ALLButton: "ALL", MINEButton: "MINE", TOMBSTONEButton: "TOMBSTONES", - statsYou: "You", - statsUserId: "Oasis ID", statsCreatedAt: "Created At", statsYourContent: "Content", statsYourOpinions: "Opinions", - statsYourTombstone: "Tombstones", - statsNetwork: "Network", - statsTotalInhabitants: "Inhabitants", - statsDiscoveredTribes: "Tribes (Public)", - statsPrivateDiscoveredTribes: "Tribes (Private)", statsNetworkContent: "Content", - statsYourMarket: "Market", - statsYourJob: "Jobs", - statsYourProject: "Projects", - statsYourTransfer: "Transfers", - statsYourForum: "Forums", statsNetworkOpinions: "Opinions", - statsDiscoveredMarket: "Market", - statsDiscoveredJob: "Jobs", - statsDiscoveredProject: "Projects", - statsBankingTitle: "Banking", statsEcoWalletLabel: "ECOIN Wallet", statsEcoWalletNotConfigured: "Not configured!", - statsTotalEcoAddresses: "Total addresses", - statsDiscoveredTransfer: "Transfers", - statsDiscoveredForum: "Forums", - statsNetworkTombstone: "Tombstones", statsBookmark: "Bookmarks", statsEvent: "Events", statsTask: "Tasks", @@ -3031,16 +2573,12 @@ module.exports = { statsAiExchange: "AI", statsPUBs: 'PUBs', statsPost: "Posts", - statsOasisID: "Oasis ID", statsSize: "Total (size)", statsBlockchainSize: "Blockchain (size)", statsBlobsSize: "Blobs (size)", statsActivity7d: "Activity (last 7 days)", statsActivity7dTotal: "7-day total", statsActivity30dTotal: "30-day total", - statsKarmaScore: "KARMA Score", - statsPublic: "Public", - statsPrivate: "Private", day: "Day", messages: "Messages", statsProject: "Projects", @@ -3052,30 +2590,14 @@ module.exports = { statsProjectsCancelled: "Cancelled", statsProjectsGoalTotal: "Total goal", statsProjectsPledgedTotal: "Total pledged", - statsProjectsSuccessRate: "Success rate", - statsProjectsAvgProgress: "Average progress", - statsProjectsMedianProgress: "Median progress", - statsProjectsActiveFundingAvg: "Avg. active funding", - statsJobsTitle: "Jobs", - statsJobsTotal: "Total jobs", - statsJobsOpen: "Open", - statsJobsClosed: "Closed", - statsJobsOpenVacants: "Open vacants", - statsJobsSubscribersTotal: "Total subscribers", - statsJobsAvgSalary: "Average salary", - statsJobsMedianSalary: "Median salary", statsMarketTitle: "Market", statsMarketTotal: "Total items", statsMarketForSale: "For sale", statsMarketReserved: "Reserved", statsMarketClosed: "Closed", statsMarketSold: "Sold", - statsMarketRevenue: "Revenue", - statsMarketAvgSoldPrice: "Avg. sold price", statsUsersTitle: "Inhabitants", user: "Inhabitant", - statsTombstoneTitle: "Tombstones", - statsNetworkTombstones: "Network tombstones", statsTombstoneRatio: "Tombstone ratio (%)", statsParliamentCandidature: "Parliament (candidatures)", statsParliamentTerm: "Parliament terms", @@ -3102,30 +2624,21 @@ module.exports = { aiConfiguration: "Set prompt", aiPromptUsed: "Prompt", aiClearHistory: "Clear chat history", - aiSharePrompt: "Add this answer to collective training?", - aiShareYes: "Yes", - aiShareNo: "No", - aiSharedLabel: "Added to training", - aiRejectedLabel: "Not added to training", aiServerError: "The AI could not answer. Please try again.", aiInputPlaceholder: "What is Oasis?", typeAiExchange: "AI", aiApproveTrain: "Add to collective training", aiRejectTrain: "Do not train", - aiTrainPending: "Pending approval", aiTrainApproved: "Approved for training", aiTrainRejected: "Rejected for training", aiSnippetsUsed: "Snippets used", aiSnippetsLearned: "Snippets learned", statsAITraining: "AI training", - aiApproveCustomTrain: "Train using this custom answer", aiCustomAnswerPlaceholder: "Write your custom answer…", - statsAIExchanges: "Model Exchanges", marketMineSectionTitle: "Your Items", marketCreateSectionTitle: "Create Item", marketUpdateSectionTitle: "Update", marketAllSectionTitle: "Market", - marketRecentSectionTitle: "Recent Market", marketTitle: "Market", marketDescription: "A marketplace for exchanging goods or services in your network.", marketFilterAll: "ALL", @@ -3155,14 +2668,11 @@ module.exports = { marketItemDeadline: "Deadline", marketItemIncludesShipping: "Includes Shipping?", marketItemHighestBid: "Highest Bid", - marketItemHighestBidder: "Highest Bidder", marketItemStock: "Stock", marketOutOfStock: "Out of stock", - marketItemBidTime: "Bid Time", marketActionsUpdate: "Update", marketUpdateButton: "Update", marketActionsDelete: "Delete", - marketActionsSold: "Mark as Sold", marketActionsChangeStatus: "CHANGE STATUS", marketActionsBuy: "BUY!", marketAuctionBids: "Current Bids", @@ -3171,21 +2681,17 @@ module.exports = { marketNoItems: "No items available, yet.", marketYourBid: "Your Bid", marketCreateFormImageLabel: "Upload media (max-size: 50MB)", - marketSearchLabel: "Search", marketSearchPlaceholder: "Search title or tags", marketMinPriceLabel: "Min price", marketMaxPriceLabel: "Max price", - marketSortLabel: "Sort by", marketSortRecent: "Most recent", marketSortPrice: "Price", marketSortDeadline: "Deadline", marketSearchButton: "Search", marketAuctionEndsIn: "Ends", marketAuctionEnded: "Ended", - marketMyBidBadge: "You bid", marketNoItemsMatch: "No items match your search.", housingTitle: "Housing", - housingLabel: "Housing", housingDescriptionText: "Discover and manage places in your network.", modulesHousingLabel: "Housing", modulesHousingDescription: "Module to discover and manage places.", @@ -3229,14 +2735,7 @@ module.exports = { housingAvailableFrom: "Available from", housingAvailableTo: "Available until", housingTags: "Tags", - housingImages: "Photos (max-size: 50MB each)", - housingRemovePhoto: "Remove", spreadEditWarning: "This content will lose spreads after editing it", - housingRemoveVideo: "Remove video", - housingAddPhoto: "Add Photo", - housingAddVideo: "Add Video", - housingVideo: "Video (max-size: 50MB)", - housingPhotos: "Photos", housingRequests: "Requests", housingRequestButton: "Request", housingCancelButton: "Cancel request", @@ -3305,7 +2804,6 @@ module.exports = { jobLocationPresencial: "On-place", jobLocationRemote: "Remote", jobVacantsPlaceholder: "Number of positions", - jobSalaryPlaceholder: "Salary in ECO for 1 dedicated hour", jobImage: "Upload media (max-size: 50MB)", jobTasks: "Tasks", jobType: "Job Type", @@ -3315,7 +2813,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Top Salary Jobs", createJobButton: "Publish Job", - viewDetailsButton: "View Details", noJobsFound: "No job offers found.", jobAuthor: "By", jobTypeFreelance: "Freelancer", @@ -3327,10 +2824,6 @@ module.exports = { jobsHoursOffered: "Hours offered", jobsHoursRequested: "Hours requested in return", jobsExchangeSkill: "Skill wanted in exchange", - jobsHoursOfferedPlaceholder: "e.g. 4", - jobsHoursRequestedPlaceholder: "e.g. 4", - jobsExchangeSkillPlaceholder: "e.g. carpentry, design", - jobExchangeHint: "For hour-exchange jobs, fill the fields below instead of salary.", jobTimePartial: "Part-time", jobTimeComplete: "Full-time", jobsDeleteButton: "DELETE", @@ -3338,28 +2831,17 @@ module.exports = { jobsFilterApplied: "APPLIED", jobsAppliedTitle: "My applications", jobsAppliedBadge: "Applied", - jobsFilterFavs: "Favorites", - jobsFavsTitle: "Favorites", - jobsFilterNeeds: "Needs help", - jobsNeedsTitle: "Needs help", - jobsSearchLabel: "Search", jobsSearchPlaceholder: "Search title, tags, description...", jobsMinSalaryLabel: "Min salary", jobsMaxSalaryLabel: "Max salary", - jobsSortLabel: "Sort by", jobsSortRecent: "Most recent", jobsSortSalary: "Highest salary", jobsSortSubscribers: "Most applicants", jobsSearchButton: "Search", - jobsFavoriteButton: "Favorite", - jobsUnfavoriteButton: "Unfavorite", - jobsMessageAuthorButton: "PM", jobsApplicants: "Applicants", jobsUpdatedAt: "Updated", jobSetOpen: "Set open", - jobNewBadge: "NEW", jobsTagsLabel: "Tags", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "No jobs match your search.", industrySearchPlaceholder: "Search facilities…", industryAllSectors: "All sectors", @@ -3367,9 +2849,7 @@ module.exports = { industryAdvanceTo: "Set to", industryAmount: "Amount", industryApproveBuild: "Approve", - industryBackToFacility: "← Facility", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Industry Blueprint", industryBlueprints: "Blueprints", industryBuild: "Build", industryBuildNotes: "Notes", @@ -3382,18 +2862,13 @@ module.exports = { industryBuilds: "Builds", industryBuildTitle: "Title", industryContribute: "Contribute", - industryContributeEco: "Contribute ECO", - industryContributeLabor: "Contribute labor", industryContributeButton: "Contribute", - industryContributeMaterial: "Contribute material", industryContributions: "Contributions", - industryContributors: "contributors", industryCreateBlueprintButton: "Create Blueprint", industryDistribute: "Distribute", industryDistributeButton: "Distribute by Shares", industryDistribution: "Distribution", industryEcoAmount: "Amount (ECO)", - industryEcoContribHint: "ECO contributions are transferred to the steward as the build's treasury custodian.", industryEditBlueprint: "Edit Blueprint", industryFacility: "Facility", industryKindLabel: "Kind", @@ -3402,13 +2877,10 @@ module.exports = { industryKind_eco: "Funds", industryLaborHours: "Labor (hours)", industryHours: "Hours", - industryLicense: "License", industryMaterialItem: "Material", industryMaterials: "Materials", - industryMaterialsHint: "One material per line, written as name:quantity:price.", industryEstMaterials: "Total Materials", industryEstLabor: "Total Labor", - industryEstTaxes: "Taxes", industryEstTotal: "Estimated price", industryBuildingPrice: "Building price", industryFinalPrice: "Final price", @@ -3418,19 +2890,13 @@ module.exports = { industryNewBlueprint: "New Blueprint", industryNewBuild: "Propose a Build", industryEditBuild: "Edit build", - industryNoBlueprint: "— none —", industryNeedBlueprint: "Create a blueprint first: every build produces one.", industryNoBlueprints: "No blueprints yet.", industryNoBuilds: "No builds yet.", industryNote: "Note", industryOutput: "Output", - industryOutputItem: "Product name", industryOutputKind: "Product type", - industryOutputQty: "Units per build", - industryOutputUnit: "Unit of measure", industryOutputValue: "Output value (ECO, e.g. from sale)", - industryPayout: "Payout", - industryPoints: "Karma", industryPostJob: "Create Job", industryPot: "Pot", industryProposeBuildButton: "Propose Build", @@ -3438,8 +2904,6 @@ module.exports = { industryAuthor: "Author", industrySellOnMarket: "Send to Market", industrySendToProjects: "Create Project", - industryShare: "Share", - industryShares: "Shares", industrySkills: "Skills", industryTreasury: "Treasury", industryKind_physical: "Physical", @@ -3453,6 +2917,16 @@ module.exports = { industryBuildStatus_FAILED: "FAILED", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "A job matches your curriculum", + jobsBotMatchIntro: "A job matches your curriculum.", + jobsBotMatchJob: "Job", + jobsBotMatchHint: "You receive this because your curriculum is AI managed. You can turn it off in your CV.", + cvAiManaged: "AI Managed", + switchOn: "ON", + switchOff: "OFF", + cvAiManagedHint: "When on, JobsBot warns you by private message when a job matches your curriculum.", + cvMatchThreshold: "Notify me from this match level", housingBotRequestedTitle: "Somebody has requested one of your places.", housingBotCancelledTitle: "A request on one of your places was cancelled.", housingBotYouRequestedTitle: "You have requested a place.", @@ -3481,22 +2955,14 @@ module.exports = { industryRulesDistribution: "When a build is completed the steward distributes the pot (the build's funds plus any sale value) among contributors, proportional to their shares.", industryRulesTreasury: "ECO contributions are held by the steward as the build's treasury custodian until distribution; all movements are recorded on the network and disputes can go to Courts.", industryJobs: "Jobs", - industryNoJobs: "No positions yet.", - industryCreatePosition: "Create position", - industryViewCV: "CV", industryReportButton: "Report", industryCreateTask: "Create Task", industryOpenDispute: "Open dispute", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "e.g. unit, kg, license", - industryOutputItemPlaceholder: "e.g. robot", - industryOutputQtyPlaceholder: "e.g. 5", - industrySkillsPlaceholder: "e.g. soldering, networking, solar-installation", industryCreateInvite: "Generate invite", industryPauseVotes: "Status votes", industryTitle: "Industry", industryDescription: "Module to manage the means of production collectively.", - industryLabel: "Industry", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "DISTRIBUTION", @@ -3545,9 +3011,7 @@ module.exports = { industryInviteNeeded: "You need an invitation to join.", industryPauseButton: "Vote to pause", industryResumeButton: "Vote to resume", - industryEditButton: "Edit", industryDeleteButton: "Delete", - industryBackToList: "← Industry", industryPendingApplicants: "Pending applicants", industryVotesYes: "yes", industryVotesNo: "no", @@ -3555,23 +3019,13 @@ module.exports = { industryAdmit: "Admit", industryReject: "Reject", industryDissolveTitle: "Dissolve facility", - industryDissolveHint: "Dissolution requires a collective vote; the steward cannot dissolve alone.", industryDissolveVote: "Vote to dissolve", - industrySector_software: "Software", - industrySector_hardware: "Hardware", - industrySector_agriculture: "Agriculture", - industrySector_textile: "Textile", - industrySector_energy: "Energy", - industrySector_food: "Food", - industrySector_construction: "Construction", - industrySector_media: "Media", - industrySector_services: "Services", - industrySector_other: "Other", industryPolicy_open: "Open", industryPolicy_vote: "By vote", industryPolicy_invite: "Invite only", projectsTitle: "Projects", projectsDescription: "Create, fund, and follow community-driven projects in your network.", + projectSearchPlaceholder: "Search projects...", projectCreateProject: "Create Project", projectCreateButton: "Create Project", projectUpdateButton: "UPDATE", @@ -3615,14 +3069,8 @@ module.exports = { projectPledgeTitle: "Back this project", projectPledgePlaceholder: "Amount in ECO", projectBounties: "Bounties", - projectBountiesInputLabel: "Bounties (one per line: Title|Amount [ECO]|Description)", - projectBountiesPlaceholder: "Fix UI bug|100|Link to issue\nWrite docs|250|Outline usage examples", projectNoBounties: "No bounties found.", projectTitle: "Title", - projectAddBountyTitle: "New Bounty", - projectBountyTitle: "Bounty Title", - projectBountyAmount: "Amount (ECO)", - projectBountyDescription: "Description", projectMilestoneSelect: "Select Milestone", projectBountyCreateButton: "Create Bounty", projectBountyStatus: "Bounty Status", @@ -3637,19 +3085,15 @@ module.exports = { projectMilestoneTitle: "Milestone Title", projectMilestoneTargetPercent: "Percent (%)", projectMilestoneDueDate: "Date", - projectMilestoneCreateButton: "Create Milestone", projectMilestoneStatus: "Milestone Status", projectMilestoneOpen: "open", projectMilestoneDone: "completed", projectMilestoneDue: "due", - projectNoMilestones: "No milestones found.", projectMilestoneMarkDone: "Mark as Done", projectMilestoneTitlePlaceholder: "Enter milestone title", projectMilestoneDescriptionPlaceholder: "Enter description for this milestone", projectMilestoneDescription: "Milestone Description", - projectBudgetGoal: "Budget (Goal)", projectBudgetAssigned: "Assigned to bounties", - projectBudgetRemaining: "Remaining", projectBudgetOver: "⚠ Over budget: assigned exceeds goal", projectFollowers: "Followers", projectFollowersTitle: "Followers", @@ -3662,7 +3106,6 @@ module.exports = { projectBackersTotalPledged: "Total pledged", projectBackersYourPledge: "Your pledge", projectBackersNone: "No pledges yet.", - projectNoRemainingBudget: "No remaining budget.", projectFilterBackers: "BACKERS", projectFilterApplied: "APPLIED", projectAppliedTitle: "APPLIED", @@ -3671,30 +3114,15 @@ module.exports = { projectBackerAmount: "Total contributed", projectBackerPledges: "Pledges", projectBackerProjects: "Projects", - projectPledgeAmount: "Amount", projectSelectMilestoneOrBounty: "Select Milestone or Bounty", projectPledgeButton: "Pledge", footerLicense: "GPLv3", - footerPackage: "Package", - footerVersion: "Version", modulesModuleName: "Name", modulesModuleDescription: "Description", modulesModuleStatus: "Status", modulesTotalModulesLabel: "Loaded Modules", modulesEnabledModulesLabel: "Enabled", modulesDisabledModulesLabel: "Disabled", - modulesPopularLabel: "Popular", - modulesPopularDescription: "Module to receive posts that are trending, most viewed, or most commented on.", - modulesTopicsLabel: "Topics", - modulesTopicsDescription: "Module to receive discussion categories based on shared interests.", - modulesSummariesLabel: "Summaries", - modulesSummariesDescription: "Module to receive summaries of long discussions or posts.", - modulesLatestLabel: "Latest", - modulesLatestDescription: "Module to receive the most recent posts and discussions.", - modulesThreadsLabel: "Threads", - modulesThreadsDescription: "Module to receive conversations grouped by topic or question.", - modulesMultiverseLabel: "Multiverse", - modulesMultiverseDescription: "Module to receive content from other federated peers.", modulesInvitesLabel: "Invites", modulesInvitesDescription: "Module to manage and apply invite codes.", modulesWalletLabel: "Wallet", @@ -3735,8 +3163,12 @@ module.exports = { modulesOpinionsDescription: "Module to discover and vote on opinions.", modulesTransfersLabel: "Transfers", modulesTransfersDescription: "Module to discover and manage smart-contracts (transfers).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Manage your other fediverse accounts, including sending and receiving content.", + modulesFediverseLabel: "Multiverse", + modulesBlogsLabel: "Blogs", + modulesBlogsDescription: "Module to discover and manage blogs.", + modulesPollsLabel: "Polls", + modulesPollsDescription: "Module to ask the network and count the answers.", + modulesFediverseDescription: "Manage your other multiverse accounts, including sending and receiving content.", modulesFeedLabel: "Feed", modulesFeedDescription: "Module to discover and share short-texts (feeds).", modulesParliamentLabel: "Parliament", @@ -3772,37 +3204,33 @@ module.exports = { visibilityMakeHidden: "Make hidden", invitesInhabitantsTitle: "Inhabitants", invitesInhabitantsFollow: "Give Support", - aiNavPlaceholder: "Where do you want to go?", + aiNavPlaceholder: "Describe what you need...", aiNavDisabled: "AI navigation is disabled.", - aiNavResultsTitle: "AI navigation suggestions", + aiNavResultsTitle: "AINav Suggestions", aiNavQueryLabel: "Query", - aiNavResultsDescription: "Pick the route that best matches what you are looking for.", - aiNavResultPath: "Route", - aiNavResultDescription: "What you can do", aiNavResultMatch: "Match", aiNavResultsEmpty: "No matching routes. Try /search instead.", - aiNavSearchInstead: "Search instead", modulesAINavLabel: "AINav", modulesAINavDescription: "Module for natural-language queries about the network's content.", - directConnect: "Direct Connect", directConnectDescription: "Connect directly to a peer by entering their IP address, port and public key. The peer will be added as a followed connection.", peerHost: "IP", peerPort: "Port (default: 8008)", peerPublicKey: "Public Key (@...ed25519)", connectAndFollow: "Connect", - deviceSourceLabel: "Device source", modulesPresetTitle: "Common Configurations", - modulesPreset_minimal: "Minimal", - modulesPreset_basic: "Basic", - modulesPreset_social: "Social", - modulesPreset_economy: "Economy", - modulesPreset_full: "Full", + workflowsTitle: "Workflows", + workflowsDescription: "A workflow sets the theme and which modules are active.", + workflowsSet: "Set workflow", + workflow_default: "Default", + workflow_jobs: "Jobs", + workflow_ruling: "Ruling", + workflow_politics: "Politics", + workflow_social: "Social", + workflow_business: "Business", + workflow_night: "Night", + workflow_mobile: "Mobile", statsCarbonFootprintTitle: "Carbon Footprint", - statsCarbonFootprintNetwork: "Network carbon footprint", - statsCarbonFootprintYours: "Your carbon footprint", statsCarbonTombstone: "Tombstoning footprint", - feedSuccessMsg: "Feed published successfully!", - dominantOpinionLabel: "Dominant opinion", uploadMedia: "Upload media (max-size: 50MB)", mapsLabel: "Maps", mapTitle: "Maps", @@ -3830,14 +3258,13 @@ module.exports = { mapDescriptionLabel: "Description", mapDescriptionPlaceholder: "Describe the map or location...", mapTypeLabel: "Map type", - mapTypeSingle: "SINGLE (only initial location)", - mapTypeOpen: "OPEN (anyone can add markers)", - mapTypeClosed: "CLOSED (only creator adds markers)", + mapInviteMode: "Invite", + mapTypeSingle: "SINGLE", + mapTypeOpen: "OPEN", + mapTypeClosed: "CLOSED", mapTagsLabel: "Tags", mapTagsPlaceholder: "Enter tags separated by commas", mapUrlLabel: "Map URL", - mapPickCoordLabel: "Or select a location on the grid:", - mapMarkersLabel: "markers", mapMarkersTitle: "Markers", mapMarkerDefault: "Marker", mapMarkerLatLabel: "Marker latitude", @@ -3851,10 +3278,6 @@ module.exports = { mapApplyZoom: "Apply Zoom", mapSearchPlaceholder: "Search description, tags, author...", mapSearchButton: "Search", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", mapUpdatedAt: "Updated", mapNoMatch: "No maps match your search.", noMaps: "No maps available.", @@ -3869,14 +3292,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pads", modulesPadsDescription: "Module to manage collaborative text editors.", - padFilterAll: "ALL", - padFilterMine: "MINE", - padFilterRecent: "RECENT", - padFilterOpen: "OPEN", - padFilterClosed: "CLOSED", padCreate: "Create Pad", - padUpdate: "Update Pad", - padDelete: "Delete Pad", + padUpdate: "Update", + padDelete: "Delete", padTitleLabel: "Title", padTitlePlaceholder: "Enter pad title...", padStatusLabel: "Status", @@ -3887,14 +3305,7 @@ module.exports = { padTagsLabel: "Tags", padTagsPlaceholder: "tag1, tag2, ...", padMembersLabel: "Members", - padVisitPad: "Visit Pad", - padShareUrl: "Share URL", padCreated: "Created", - padAuthor: "Author", - padGenerateCode: "Generate Code", - padInviteCodeLabel: "Invite Code", - padInviteCodePlaceholder: "Enter invite code...", - padValidateInvite: "Validate", padStartEditing: "START EDITING!", padEditorPlaceholder: "Start writing...", padSubmitEntry: "Submit", @@ -3910,12 +3321,11 @@ module.exports = { padClosedSectionTitle: "Closed Pads", padCreateSectionTitle: "Create New Pad", padUpdateSectionTitle: "Update Pad", - padInviteGenerated: "Invite Code Generated", typePad: "PADS", padNew: "NEW", padAddFavorite: "Add to Favorites", padRemoveFavorite: "Remove from Favorites", - padClose: "Close Pad", + padClose: "Close", padBackToEditor: "Back to editor", padSearchPlaceholder: "Search pads...", @@ -3924,12 +3334,6 @@ module.exports = { modulesCalendarsLabel: "Calendars", modulesCalendarsDescription: "Module to discover and manage calendars.", typeCalendar: "CALENDARS", - calendarFilterAll: "ALL", - calendarFilterMine: "MINE", - calendarFilterOpen: "OPEN", - calendarFilterClosed: "CLOSED", - calendarFilterRecent: "RECENT", - calendarFilterFavorites: "FAVORITES", calendarCreate: "Create Calendar", calendarUpdate: "Update", calendarDelete: "Delete", @@ -3942,24 +3346,17 @@ module.exports = { calendarTagsLabel: "Tags", calendarTagsPlaceholder: "tag1, tag2...", calendarParticipantsLabel: "Participants", - calendarParticipantsCount: "Participants", - calendarVisitCalendar: "Visit Calendar", calendarCreated: "Created", - calendarAuthor: "Author", calendarJoin: "Join Calendar", calendarGenerateInvite: "Generate invite", - calendarInviteCodePlaceholder: "Enter invite code...", - calendarValidateInvite: "Validate code", - calendarJoined: "Joined", - calendarAddDate: "Add Date", - calendarAddNote: "Add Note", calendarDateLabel: "Date", calendarDatePlaceholder: "Describe this date...", - calendarNoteLabel: "Note", + calendarNoteLabel: "Notes", calendarNotePlaceholder: "Add a note...", calendarFirstDateLabel: "Date", calendarFirstNoteLabel: "Notes", calendarIntervalLabel: "Interval", + calendarIntervalNone: "No repetition", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3970,8 +3367,6 @@ module.exports = { calendarsDescription: "Discover and manage calendars in your network.", calendarMonthPrev: "\u2190 Prev", calendarMonthNext: "Next \u2192", - calendarMonthLabel: "Dates", - calendarsShareUrl: "Share URL", calendarAllSectionTitle: "Calendars", calendarRecentSectionTitle: "Recent Calendars", calendarFavoritesSectionTitle: "Favorites", @@ -3985,7 +3380,6 @@ module.exports = { calendarRemoveFavorite: "Remove from Favorites", calendarSearchPlaceholder: "Search calendars...", calendarAddEntry: "Add Entry", - calendarLeave: "Leave Calendar", statsCalendar: "Calendars", statsCalendarDate: "Calendar Dates", statsCalendarNote: "Calendar Notes", @@ -3994,8 +3388,6 @@ module.exports = { modulesChatsDescription: "Module to discover and manage encrypted chats.", typeChat: "CHATS", typeChatMessage: "CHAT MESSAGE", - chatLabel: "CHATS", - chatMessageLabel: "CHAT MESSAGES", chatsTitle: "Chats", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -4003,56 +3395,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Description", - chatMessageReply: "Reply", - chatMessageLabel: "Message", chatCategory: "Category", chatStatus: "STATUS", - chatFilterAll: "ALL", - chatFilterMine: "MINE", - chatFilterRecent: "RECENT", - chatFilterFavorites: "FAVORITES", - chatFilterOpen: "OPEN", - chatFilterClosed: "CLOSED", chatCreate: "Create Chat", - chatUpdate: "Update Chat", - chatDelete: "Delete Chat", + chatUpdate: "Update", + chatDelete: "Delete", chatClose: "Close Chat", chatVisitChat: "VISIT CHAT", chatUntitled: "Untitled Chat", chatNoItems: "No chats found.", chatParticipants: "Participants", - chatStartChatting: "START CHATTING!", - chatGenerateCode: "Generate Code", - chatShareUrl: "Share URL", + chatMessagesLabel: "Messages", + chatThreadsLabel: "Threads", chatCreatedAt: "CREATED", chatSearchPlaceholder: "Search chats...", chatStatusOpen: "OPEN", chatStatusInviteOnly: "INVITE-ONLY", chatStatusClosed: "CLOSED", chatSendMessage: "Send", + chatJumpLatest: "Latest Message", + chatPickChat: "Pick a chat to open it", + chatNoneYet: "No chat available yet.", + activitySearchPlaceholder: "Search in activity...", + trendingSearchPlaceholder: "Search in trending...", + opinionsSearchPlaceholder: "Search in opinions...", + votesSearchPlaceholder: "Search in votations...", + welcomeStepUxTitle: "Choose your interface", + welcomeStepUxText: "Pick how Oasis should look. You can change it later in Settings.", + welcomeStepUxAction: "Use this view", + chatRateLimitTitle: "Too many messages", + chatRateLimitMessage: "You have reached the limit of messages this room accepts in an hour. Try again later.", chatMessagePlaceholder: "Type your message...", chatNoMessages: "No messages yet.", - chatLeave: "Leave Chat", - chatInviteCodeLabel: "Enter invite code", - chatJoinByInvite: "Join", chatTitlePlaceholder: "Chat title", chatDescriptionPlaceholder: "Chat description", chatTagsPlaceholder: "tag1, tag2, tag3", chatImageLabel: "Select an image file (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Invite Code", chatAuthor: "Author", - chatCreated: "Created", chatAddFavorite: "Add to Favorites", chatRemoveFavorite: "Remove from Favorites", chatPM: "PM", chatStatusLabel: "Status", chatCategoryLabel: "Category", - chatParticipantsLabel: "Participants", gamesTitle: "Games", gamesDescription: "Discover and play some mini-games in your network.", gamesFilterAll: "ALL", gamesPlayButton: "PLAY!", - gamesBackToGames: "Back to Games", modulesGamesLabel: "Games", modulesGamesDescription: "Module to discover and play some games.", modulesGraphosLabel: "Graphos", @@ -4069,8 +3457,6 @@ module.exports = { gamesArkanoidDesc: "Break all the bricks with your paddle and ball. A classic arcade challenge.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Classic ping-pong against an AI opponent. First to 5 points wins.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Race against time! Dodge traffic and reach the finish line before the clock runs out.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Pilot your ship through a deadly asteroid field. Shoot them down before they hit you.", gamesRockPaperScissorsTitle: "Rock Paper Scissors", @@ -4091,8 +3477,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -4101,7 +3485,6 @@ module.exports = { gamesHallDate: "Date", typeGameScore: "GAME SCORES", gamesNewRecord: "New Record", - gameScoreLabel: "GAME SCORES", uxModeTitle: "UX", uxModeDescription: "Select which UX navigation mode you want for your GUI.", uxModeMenus: "Blocks", @@ -4154,7 +3537,6 @@ module.exports = { torrentSortOldest: "Oldest", torrentSortTop: "Most voted", torrentNoMatch: "No matching torrents.", - torrentMessageAuthorButton: "Message Author", torrentUpdatedAt: "Updated", statsTorrent: "Torrents", typeTorrent: "TORRENTS", @@ -4162,10 +3544,18 @@ module.exports = { modulesTorrentsDescription: "Module to discover and manage torrents.", favoritesFilterTorrents: "TORRENTS", favoritesFilterMarket: "MARKET", + favoritesFilterEvents: "EVENTS", + favoritesFilterForum: "FORUM", + favoritesFilterHousing: "HOUSING", + favoritesFilterJobs: "JOBS", + favoritesFilterProjects: "PROJECTS", + favoritesFilterReports: "REPORTS", + favoritesFilterTasks: "TASKS", + favoritesFilterTransfers: "TRANSFERS", + favoritesFilterVotes: "VOTATIONS", favoritesFilterShopProducts: "SHOP ITEMS", tribeSectionTorrents: "TORRENTS", tribeCreateTorrent: "Upload Torrent", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Wish", settingsWishDesc: "Configure the wish of your Avatar. This determines how to access the whole content and your level of experiences into the network.", settingsWishWhole: "Multiverse", @@ -4176,16 +3566,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "Outbound is a UX guardrail. Inbound is an attention filter (ciphertext is still replicated).", - pmBlockedNonMutual: "You can only send private messages to habitants with mutual support.", inhabitantsPendingFollowsTitle: "Pending follow requests", inhabitantsPendingAccept: "Accept", inhabitantsPendingReject: "Reject", - bxEncrypted: "ENCRYPTED", - bxEncryptedHexLabel: "Ciphertext (preview)", tribeSectionGovernance: "GOVERNANCE", - tribeSubStatusPublic: "PUBLIC", - tribeSubStatusPrivate: "PRIVATE", - tribeSubInheritedPrivate: "PRIVATE (inherited from main tribe)", tribePadInviteRequired: "You do not have access to the pad. Ask for an invitation to access the content.", tribeChatInviteRequired: "You do not have access to the chat. Ask for an invitation to access the content.", tribeGovernanceDesc: "Internal governance for this tribe. Propose candidatures, debate rules, elect leaders.", @@ -4225,44 +3609,31 @@ module.exports = { tribeGovNoHistorical: "Not any record, yet", logsTitle: "Logs", logsDescription: "Record your experience in the network.", - logsReadMore: "Read more", logsViewTitle: "Log", logsColumnType: "Type", logsView: "View", - logsManualPrompt: "Write your log", logsUpdateButton: "Update", - logsEditTitle: "Edit Log", - logsCreateDescription: "Record your experience...", + logsEditTitle: "Update Log", logsCreateTitle: "Create Log", logsWriteButton: "Write", logsTextPlaceholder: "Describe your experiences...", - logsTextField: "Text", - logsLabelPlaceholder: "Label...", - logsLabelField: "Write your log (label)", - logsAiDisabledWarn: "Enable the AI module in /modules to use AI-written logs.", - logsAiContextValue: "Blockchain day", - logsAiContext: "Context", - logsAiModStatus: "AImod", - logsModeApply: "Apply!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manual", logsModeAI: "AI", - logsColumnDelete: "Delete", - logsColumnEdit: "Edit", logsColumnLog: "Log", logsColumnDate: "Date", logsDelete: "Delete", - logsEdit: "Edit", + logsEdit: "Update", logsFilterAlways: "ALWAYS", logsFilterYear: "LAST YEAR", logsFilterMonth: "LAST MONTH", logsFilterWeek: "LAST WEEK", logsFilterToday: "TODAY", - logsFilterRecent: "RECENT", - logsFilterAll: "ALL", + logsComments: "Comments", + logsAuthorEntries: "Entries", logsCreate: "Create Log", logsExport: "Export Logs", - logsExportOne: "Export", + logsExportOne: "Export Log", logsViewDetails: "View Details", logsGenerateButton: "Generate Text", logsSearchText: "Search in logs...", @@ -4272,9 +3643,7 @@ module.exports = { modulesLogsLabel: "Logs", modulesLogsDescription: "Module to record (via AI assistant) your experiences.", statsLogsTitle: "Logs", - statsLogsEntries: "Entries", typeLog: "LOGS", - blockchainCycle: "Cycle", } diff --git a/src/client/assets/translations/oasis_es.js b/src/client/assets/translations/oasis_es.js index 13afc19..b135331 100644 --- a/src/client/assets/translations/oasis_es.js +++ b/src/client/assets/translations/oasis_es.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { es: { - languageName: "Castellano", shopOrderStatusPaid: "Pago recibido", shopOrderStatusReceived: "Recibido", shopOrderMarkPaid: "Marcar pago recibido", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Aún no tienes compras.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Vendedor", - shopOrderPaymentConcept: "Pago", shopOrderInvoice: "Factura", shopOrderInvoiceConcept: "Factura", shopOrderStatusPending: "Pendiente", shopOrderStatusAccepted: "Aceptado", shopOrderStatusRejected: "Rechazado", shopOrderStatusShipped: "Enviado", - shopOrderStatusDelivered: "Entregado", shopOrderAccept: "Aceptar", shopOrderReject: "Rechazar", shopOrderMarkShipped: "Marcar enviado", - shopOrderMarkDelivered: "Marcar entregado", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Contrato", shopOrderContractConcept: "Pedido de tienda", shopOrdersPending: "Pedidos pendientes", all: "Todos", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Ver JSON", matchScore: "Puntuación de coincidencia", preferencesLabel: "Preferencias", - inhabitantProfileTitle: "Perfil del habitante", + inhabitantProfileTitle: "Habitante", contentWarningLabel: "Aviso de contenido", invalidPost: "Contenido no válido", invalidPostHint: "Este mensaje tiene texto vacío o no válido.", spreadBy: "Por", spreadChron: "Réplicas", spreaded: "Replicado", - spreadMore: "más", spreadContentUnavailable: "Contenido aún no disponible (replicación pendiente)", filteredByTag: "Filtrado por etiqueta", filteredByTagTitle: "Filtrado por etiqueta", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Sin gravedad", calendarDeleteDate: "Eliminar fecha", calendarIntervalUntil: "Hasta", - bookmarkCategory: "Categoría", bookmarkLastVisit: "Última visita", profileClearnetBookmarksLabel: "Marcadores", - forumFilterHot: "Populares", invitesPort: "Puerto", currentlyUnrecheable: "¡ERROR!", peerHostValidation: "IPv4 válida (p. ej. 192.168.1.100) o nombre de host (p. ej. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Estimación máx. anual", statsCarbonNetwork: "Total de la red", statsCarbonOfEstMax: "de la capacidad máx. estimada", + statsCarbonYearProgress: "del año transcurrido", + statsNetworkTitle: "Red", + statsStorageTitle: "Almacenamiento", + statsEcoTaxTitle: "Tasa ECO", + statsAccountTitle: "Cuenta", + statsAveragesTitle: "Promedios", statsCarbonOfNetwork: "del total de la red", statsCarbonUser: "Tu huella", statsContentCountColumn: "Cantidad", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Etiquetas principales", statsTopTypesTitle: "Tipos de contenido principales", statsTotalMsgs: "Mensajes totales", - feedViewDetails: "Ver detalles", - eventFileLabel: "Adjuntar imagen", - taskFileLabel: "Adjuntar imagen", - courtsRespondentRequired: "El ID del demandado es obligatorio", extended: "Multiverso", extendedDescription: [ "Cuando apoyas a alguien, puedes descargar las publicaciones de habitantes que apoya, y esas publicaciones aparecerán aquí, ordenadas por la más reciente.", @@ -203,29 +197,22 @@ module.exports = { graphosShowing: "Mostrando", graphosYou: "Tú", graphosTotalNodes: "Nodos totales", - manualMode: "Modo Manual", mentions: "Menciones", mentionsDescription: [ - strong("Publicaciones que te @mencionan"), - ", ordenadas por las más recientes.", + strong("Todos los mensajes que te @mencionan"), + ".", ], - nextPage: "Siguiente", - previousPage: "Anterior", noMentions: "No has recibido @menciones, aún.", + mentionsSearchPlaceholder: "Buscar menciones...", privateReminders: "RECORDATORIOS", inboxFiltersLabel: "Filtros:", inboxToggleToMutuals: "Cambiar a mutuos", inboxToggleToWhole: "Cambiar a todos", - privateFrom: "De", - privateTo: "Para", privateDate: "Fecha", peers: "Nodos", searchDescription: "Descripición", - imageSearch: "Buscar Imágenes", searchFromLabel: "Desde", searchToLabel: "Hasta", - searchMinOpinionsLabel: "Mín. opiniones", - searchInhabitantLabel: "Habitante (Oasis ID)", searchQueryLabel: "Búsqueda", searchPerPageLabel: "Resultados por página", settings: "Configuración", @@ -237,67 +224,38 @@ module.exports = { melodyTitle: 'Melody', melodyDescription: 'Reproduce la melodía de tu blockchain — cada bloque se convierte en una nota.', melodyEmpty: 'Aún no hay notas — tu blockchain todavía no ha generado ningún bloque.', - melodyCompositionHelp: 'Cada bloque de tu blockchain se convierte en una nota musical según su tipo y tamaño.', - melodyStatsTitle: 'Desglose por tipo', - melodyInhabitantLabel: 'Habitante', melodyTotalBlocks: 'Notas', - melodyType: 'Tipo', - melodyCount: 'Bloques', melodyFilterAll: 'TODAS', - melodyFilterShare: 'Subir melodía', - melodyShareTitle: 'Comparte tu melodía', - melodyShareHelp: 'Publica una instantánea de tu melodía actual para que otros la escuchen y remezclen.', - melodyShareTitleLabel: 'Título (opcional)', - melodyShareTitlePlaceholder: 'Un fantasma de blockchain', - melodyShareSubmit: 'Publicar Melodía', - melodyNoShared: 'Aún no hay melodías de blockchain.', melodyRegenerate: 'Regenerar', melodyDownload: "Descargar BCS", - profileActivityTitle: 'Actividad', - profileActivityMore: 'Ver toda la actividad', profileContentSectionTitle: 'Contenido del Avatar', profileContentHelp: 'Elige qué módulos se mostrarán en tu avatar.', profileSensorsHelp: 'Métricas opcionales que se muestran en tu avatar.', profileClearnetHelp: 'Módulos que pueden ser consultados desde fuera de Oasis.', profileHubAll: 'Todo', - profileHubTitle: 'Contenido Público', - footerPulseTitle: 'Pulso', - footerPulsePeers: 'Pares', - footerPulseInbox: 'Bandeja', - footerPulseSync: 'Última sinc.', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Última actividad', footerLicenseLabel: 'Licencia', profileSwitchToOasis: 'Volver a Oasis', - profileSwitchToClearnet: 'Sumérgete en Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Sumérgete en el Fediverso", - coordLabel: 'Coordenadas (e.g., A3)', - coordPlaceholder: 'Introduce coordenada', + profileVisibilityFediverse: "Multiverso", contributorsTitle: "Contribuciones", - pixeliaBy: "por", colorLabel: 'Elige un color', paintButton: 'Dibujar!', - invalidCoordinate: 'Coordenada incorrecta', - goToMuralButton: "Ver Mural", totalPixels: 'Total Pixeles', modules: "Módulos", modulesViewTitle: "Módulos", modulesViewDescription: "Define tu entorno ideal activando y desactivando módulos.", inbox: "Buzón", multiverse: "Multiverso", - fediverse: "Fediverse", - fediverseDescription: "Gestiona tus otras cuentas del fediverso, incluyendo enviar y recibir contenido.", + fediverse: "Multiverso", + fediverseDescription: "Gestiona tus otras cuentas del multiverso, incluyendo enviar y recibir contenido.", fediverseStatus: "Estado", - fediverseDisconnected: "Fediverse desconectado. Comprueba %LINK% o el estado de la conexión.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiverso desconectado. Comprueba %LINK% o el estado de la conexión.", + fediverseSettingsTitle: "Multiverso", fediverseInstanceLabel: "Dirección", fediverseTokenLabel: "Token de acceso", fediverseTokenHelp: "Configura tu token de acceso. Se usará para gestionar tu cuenta de Mastodon desde Oasis.", fediverseConnect: "Conectar", fediverseConnectedAs: "Conectado como", fediverseDisconnect: "Desconectar", - fediverseEmpty: "Cuando conectes otras cuentas del fediverso desde %LINK%, podrás gestionarlas desde aquí.", fediverseEmptyLink: "tus ajustes", fediverseComposePlaceholder: "¿Qué estás pensando?", fediverseReplyPlaceholder: "Escribe tu respuesta…", @@ -306,21 +264,15 @@ module.exports = { fediverseReply: "Responder", fediverseBoosted: "ha impulsado", fediverseNoPosts: "Tu timeline está vacío.", - fediverseThread: "Hilo", fediverseTimeline: "Cronologías", - fediverseManageTimeline: "Gestionar cronología", fediverseFollowers: "Seguidores", fediverseFollowing: "Siguiendo", fediversePosts: "Publicaciones", fediverseJoined: "Se unió", - fediverseOverview: "Resumen", fediverseRefresh: "Actualizar", fediverseWrite: "Escribir", fediversePreview: "Vista previa", - fediverseEdit: "Editar", - fediverseOpenFeed: "Visitar feed", fediverseManage: "Gestionar", - fediverseStatusNotConnected: "No conectado", fediverseError: "No se pudo contactar con Mastodon.", fediverseErrInstance: "URL de instancia no válida.", fediverseErrAuth: "Token no válido o caducado.", @@ -331,17 +283,6 @@ module.exports = { fediverseErrPost: "No se pudo publicar.", fediverseErrMedia: "No se pudo subir el archivo.", fediverseErrEmpty: "Escribe algo o adjunta un archivo.", - popularLabel: "Destacadas", - topicsLabel: "Tópicos", - latestLabel: "Últimas", - summariesLabel: "Resúmenes", - threadsLabel: "Hilos", - multiverseLabel: "Multiverso", - inboxLabel: "Buzón", - invitesLabel: "Invitaciones", - walletLabel: "Cartera", - legacyLabel: "Llaves", - cipherLabel: "Cifrador", bookmarksLabel: "Marcadores", videosLabel: "Vídeos", torrentsLabel: "Torrents", @@ -352,18 +293,14 @@ module.exports = { inhabitantsLabel: "Habitantes", trendingLabel: "Tendencias", eventsLabel: "Eventos", - tasksLabel: "Tareas", apply: "Aplicar", menuPersonal: "Personal", - menuContent: "Contenido", - menuBlogs: "Blogs", menuGovernance: "Gobernanza", menuOffice: "Oficina", - menuMultiverse: "Multiverso", - menuNetwork: "Red", + menuNetwork: "Comunidad", menuCreative: "Creativo", menuEconomy: "Economía", - menuMedia: "Multimedia", + menuMedia: "Biblioteca", menuTools: "Herramientas", comment: "Comentar", subtopic: "Subtema", @@ -373,13 +310,6 @@ module.exports = { follow: "Soportar", block: "Bloquear", unblock: "Desbloquear", - newerPosts: "Nuevos posts", - olderPosts: "Viejos posts", - feedRangeEmpty: "El rango aplicado está vación para éste feed. Trata de ver el ", - seeFullFeed: "feed completo", - feedEmpty: "La red Oasis no ha visto nunca posts desde ésta cuenta.", - beginningOfFeed: "Éste es el comienzo del feed", - noNewerPosts: "No se han recibido posts nuevos, aún.", relationshipNotFollowing: "No te da soporte", relationshipTheyFollow: "Te da soporte", relationshipMutuals: "Soporte mútuo", @@ -389,16 +319,12 @@ module.exports = { relationshipBlockedBy: "Te bloquea", relationshipMutualBlock: "Bloqueo mutuo", relationshipNone: "No estás dando soporte", - relationshipConflict: "Conflicto", relationshipBlockingPost: "Post bloqueado", viewLikes: "Ver replicas", spreadedDescription: "Lista de contenidos replicados por habitante.", - totalspreads: "Réplicas totales", - attachFiles: "Adjuntar ficheros", preview: "Previsualizar", publish: "Publicar", contentWarningPlaceholder: "Añade un título a tu post (opcional)", - privateWarningPlaceholder: "Añade habitantes para enviar un post privado (opcional)", publishWarningPlaceholder: "Cuerpo limitado a 7000 caracteres.", publishTooLong: "Tu publicación es demasiado larga. Acórtala, por favor.", publishCustomDescription: [ @@ -407,8 +333,6 @@ module.exports = { commentWarning: [ "RECUERDA: Debido a la tecnología blockchain, una vez has publicado algo, no puede ser editado ni borrado. Piénsalo bien!.", ], - commentPublic: "público", - commentPrivate: "privado", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -428,7 +352,6 @@ module.exports = { ".", ], publishCustom: "Escribir un post avanzado", - subtopicLabel: "Crea un subtopic para éste post", messagePreview: "Previsualización", mentionsMatching: "Menciones", mentionsName: "Nombre", @@ -451,24 +374,19 @@ module.exports = { ssbLogStream: "Blockchain", ssbLogStreamDescription: "Configura el límite de mensajes para los flujos de la blockchain.", saveSettings: "Guardar configuración", - exportTitle: "Exportar datos", exportDescription: "Establece una contraseña (min 32 caracteres de longitud) para cifrar tu secreto", exportDataTitle: "Copia de Seguridad", exportDataDescription: "Descargar tu blockchain (llave privada excluida!)", exportDataButton: "Descargar blockchain", - pubWallet: "Cartera del PUB", - pubWalletDescription: "Establece la URL del wallet del PUB. Esta se utilizará para las transacciones del PUB (incluída la RBU).", - pubWalletConfiguration: "Guardar Configuración", - importTitle: "Importar datos", importDescription: "Importa tu secreto cifrado (llave privada) para activar tu avatar", - importAttach: "Adjuntar fichero cifrado (.enc)", - passwordLengthInfo: "La contraseña debe tener mínimo 32 caracteres de longitud.", passwordImport: "Escribe tu contraseña para descifrar los datos que serán guardados en tu sistema (nombre: secret)", exportPasswordPlaceholder: "Utiliza minúsculas, mayúsculas, números y símbolos", fileInfo: "Tu secreto cifrado se descargará en tu dispositivo (nombre: oasis.enc)", developer: "Desarrollo", devTitle: "Desarrollo", - welcomeBannerText: "Bienvenida a OASIS. Sigue estos pasos rápidos para configurar tu avatar.", + welcomeBannerText: "Te damos la bienvenida a OASIS. Sigue estos pasos rápidos para configurar tu avatar.", + aiSuggestionBanner: "Sugerencia:", + aiSuggestionsEnable: "Sugerencias de la IA", welcomeBannerAction: "¡Empezar!", welcomeTitle: "Bienvenida", welcomeStepGreetingAction: "Enviar feed", @@ -511,14 +429,9 @@ module.exports = { devParentFolder: "Carpeta superior", devOpenFolder: "abrir", devDescription: "Explora el código que se está ejecutando en este nodo.", - devTreeTitle: "Ficheros", - devSearchTitle: "Buscar en el código", - devMapTitle: "Módulos", devRoot: "raíz", - devRootButton: "RAÍZ", devSearchPlaceholder: "Texto a buscar en el código", devAnyExtension: "Cualquier fichero", - devSearchButton: "Buscar", devStatsFiles: "Ficheros", devStatsLines: "Líneas", devStatsModules: "Módulos", @@ -555,16 +468,13 @@ module.exports = { languageDescription: "Si quieres utilizar otro idioma, seleccionalo aquí.", setLanguage: "Establecer lenguaje", - peerConnections: "Nodos", peerConnectionsIntro: "Maneja todas tus conexiones con otros nodos.", peerConnectionsTitle: "Conexiones", online: "Conectado", offline: "Desconectado", discovered: 'Descubiertos', unknown: 'Desconocidos', - lanBroadcastLabel: "Difusión LAN", lanBroadcastActive: "Activa (multicast UDP en la LAN)", - lanBroadcastDisabled: "Desactivada (modo pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -577,8 +487,6 @@ module.exports = { noConnections: "No hay nodos conectados.", noDiscovered: "No has descubierto nodos.", noUnknownPeers: "Sin pares desconocidos en el grafo de amistades.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -588,9 +496,6 @@ module.exports = { peerImport: "Importar", peerImportTitle: "Importar lista de peers", peerImportPlaceholder: "Pega una dirección multiserver por línea, o sube un archivo .txt…", - noSupportedConnections: "No soportas nodos.", - noBlockedConnections: "No bloqueas nodos.", - noRecommendedConnections: "No recomiendas nodos.", connectionActionIntro: "", startNetworking: "Iniciar red", @@ -604,9 +509,19 @@ module.exports = { homePageDescription: "Selecciona qué módulo quieres como tu página de inicio.", saveHomePage: "Establecer página de inicio", invites: "Invitaciones", - invitesTitle: "Invitaciones", - invitesInvites: "Invitaciones", invitesDescription: "Maneja y aplica códigos de invitación en tu red.", + invitesPubsHint: "Pega un código de invitación de un pub para federarte con él y empezar a replicar a sus habitantes.", + invitesFederationsHint: "Pubs con los que estás federado: actualízalos, quita los inalcanzables o exporta la lista.", + invitesHousesHint: "Introduce un código de casa para unirte a una casa del LARP y participar en su economía.", + invitesTribesHint: "Introduce un código de tribu para hacerte miembro y acceder a su contenido privado.", + invitesChatsHint: "Introduce un código de chat para unirte a la conversación y a sus hilos.", + invitesPadsHint: "Introduce un código de pad para escribir con otros en un documento compartido.", + invitesCalendarsHint: "Introduce un código de calendario para compartir fechas y recordatorios.", + invitesEventsHint: "Introduce un código de evento para unirte a un evento privado.", + invitesForumsHint: "Introduce un código de foro para leer y responder en un foro privado.", + invitesMapsHint: "Introduce un código de mapa para añadir y ver lugares en un mapa compartido.", + invitesShopsHint: "Introduce un código de tienda para unirte a una tienda y a su catálogo.", + invitesInhabitantsHint: "Introduce un código de habitante para seguiros mutuamente e intercambiar contenido.", invitesTribesTitle: "Tribus", invitesTribeInviteCodePlaceholder: "Introduce el código de la tribu", invitesTribeJoinButton: "Entrar en la tribu", @@ -637,7 +552,6 @@ module.exports = { invitesAlreadyFederated: "Ya estás federado con este pub.", invitesFederationsTitle: "Federaciones", invitesAcceptedInvites: "Federadas", - invitesNoInvites: "No hay invitaciones aceptadas, aún.", invitesNoFederatedPubs: "No hay pubs federados.", invitesUnreachablePubs: "Inalcanzables", invitesNoUnreachablePubs: "No hay pubs inalcanzables.", @@ -653,39 +567,24 @@ module.exports = { panicMode: "Modo Pánico!", encryptData: "Establece una contraseña (min 32 caracteres de longitud) para cifrar tu blockchain", decryptData: "Introduce contraseña para descifrar tu blockchain", - panicModeDescription: "Cifrar/Descifrar o BORRAR tu blockchain", removeDataDescription: "CUIDADO: Éste proceso no puede ser revocado.", - encryptPanicButton: "Cifrar blockchain", - decryptPanicButton: "Descifrar blockchain", removePanicButton: "BORRAR TODOS TUS DATOS!", searchTitle: "Buscar", searchDescriptionLabel: "Buscar contenido en tu red.", - searchLanguagesLabel: "Lenguajes", - searchSkillsLabel: "Habilidades", searchPlaceholder:"Buscar contenido...", - searchDateLabel:"Fecha", searchLocationLabel:"Localización", searchPriceLabel:"Precio", - searchUrlLabel:"URL", searchCategoryLabel:"Categoría", - searchStartLabel:"Fecha de comienzo", - searchEndLabel:"Fecha de fin", searchPriorityLabel:"Prioridad", searchStatusLabel:"Estado", statusLabel:"Estado", - totalVotesLabel:"Votos Totales", noResultsFound:"No se han encontrado resultados.", votesOption:"Opiniones Votadas", voteYesLabel:"Si", voteNoLabel:"No", allTypesLabel: "SIN LÍMITES", - ABSTENTIONLabel:"ABSTENCIÓN", YESLabel:"SI", NOLabel:"NO", - FOLLOW_MAJORITYLabel: "SEGUIR MAYORIA", - CONFUSEDLabel: "CONFUSO", - NOT_INTERESTEDLabel: "SIN INTERÉS", - StatusLabel:"Estado", votesOptionYesLabel:"Si", votesOptionNoLabel:"No", votesOptionAbstentionLabel:"Abstención", @@ -693,7 +592,6 @@ module.exports = { votesCreatedByLabel:"Creado el", voteStatusOpen:"ABIERTO", voteStatusClosed:"CERRADO", - imageSearchLabel: "Introduce palabras para buscar las imagenes que hayan sido etiquetadas con ellas.", commentDescription: ({ parentUrl }) => [ " ha comentado en ", a({ href: parentUrl }, " hilo"), @@ -704,53 +602,20 @@ module.exports = { a({ href: parentUrl }, " un post"), ], subtopicTitle: ({ authorName }) => [`Ha creado un subtopic en el post de @${authorName}`], - mysteryDescription: "publicado un post misterioso", oasisDescription: "OASIS Red de Proyectos", searchSubmit: "Buscar...", - postLabel: "POSTS", - aboutLabel: "HABITANTES", - feedLabel: "FEEDS", votesLabel: "GOBIERNO", - reportLabel: "REPORTES", - imageLabel: "IMAGENES", - videoLabel: "VIDEOS", - audioLabel: "AUDIOS", - documentLabel: "DOCUMENTOS", - torrentLabel: "TORRENTS", pdfFallbackLabel: "Documento PDF", - eventLabel: "EVENTOS", - taskLabel: "TAREAS", - transferLabel: "TRANSFERENCIAS", - curriculumLabel: "CURRÍCULUM", - bookmarkLabel: "ENLACES", - tribeLabel: "TRIBUS", - marketLabel: "MERCADO", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "CARTERAS", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Aplicar", - subjectLabel: "Asunto", editProfile: "Editar Avatar", - profileQrAlt: "Código QR del perfil", - profileQrHint: "Escanea para copiar este Oasis ID.", oasisIdLabel: "OasisID", - spreadLabel: "Replicar", - spreadHint: "Replica esto para quienes te apoyan (se difunde vía tu feed).", + spreadContent: "Replicar", welcomePmSubject: "Hello World!", - welcomePmBody: "Bienvenido a Oasis — una red social libre, peer-to-peer, federada y cifrada, con una arquitectura distribuida y solo por invitación.\n\nAlgunos lugares interesantes para empezar:\n\n- /profile — Edita tu avatar, nombre, descripción y qué módulos se muestran en tu cara pública.\n- /invites — Añade un pub para federarte con el resto de la red.\n- /peers — Mira quién está conectado, reescanea tu LAN, exporta o importa listas de peers.\n- /inhabitants — Descubre y visita los avatares de otras personas.\n- /tribes — Crea o únete a grupos privados con cifrado de extremo a extremo.\n- /inbox — Lee y envía mensajes privados.\n- /activity — Mira la actividad reciente, tuya y de tu red.\n- /publish — Escribe un post o comparte una imagen, audio, vídeo o documento.\n- /search — Busca el contenido de la red por tipo.\n\nAlgunos lugares interesantes para conectar:\n\n- /fediverse — Gestiona tus otras cuentas del fediverso, incluyendo enviar y recibir contenido.\n\nEste mensaje se envió de forma privada desde ti hacia ti, por eso no hizo falta conexión para recibirlo.", - profileVisibilityTitle: "Visibilidad del perfil público", - profileVisibilityHint: "Marca qué campos ven otros habitantes en tu perfil. Por defecto solo se muestra Karma.", + welcomePmBody: "Te damos la bienvenida a Oasis — una red social libre, peer-to-peer, federada y cifrada, con una arquitectura distribuida y solo por invitación.\n\nAlgunos lugares interesantes para empezar:\n\n- /profile — Edita tu avatar, nombre, descripción y qué módulos se muestran en tu cara pública.\n- /invites — Añade un pub para federarte con el resto de la red.\n- /peers — Mira quién está conectado, reescanea tu LAN, exporta o importa listas de peers.\n- /inhabitants — Descubre y visita los avatares de otras personas.\n- /tribes — Crea o únete a grupos privados con cifrado de extremo a extremo.\n- /inbox — Lee y envía mensajes privados.\n- /activity — Mira la actividad reciente, tuya y de tu red.\n- /publish — Escribe un post o comparte una imagen, audio, vídeo o documento.\n- /search — Busca el contenido de la red por tipo.\n\nAlgunos lugares interesantes para conectar:\n\n- /multiverse — Gestiona tus otras cuentas del multiverso, incluyendo enviar y recibir contenido.\n\nEste mensaje se envió de forma privada desde ti hacia ti, por eso no hizo falta conexión para recibirlo.", profileSensorsSectionTitle: "Sensores", profileVisibilityActivity: "Nivel de actividad", - profileVisibilityDevice: "Dispositivo", profileDeviceLockedHint: "Este sensor está siempre activo: permite a otros ver desde qué dispositivo te conectas y no se puede desactivar.", profileVisibilityKarma: "Puntuación KARMA", profileVisibilityUbi: "UBI", @@ -758,7 +623,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "Llave GPG", - profileVisibilityClearnet: "Publicar mi perfil", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Tiendas", profileClearnetJobsLabel: "Empleo", @@ -812,7 +676,6 @@ module.exports = { " o el estado de tu conexión.", ], walletSentToLine: ({ destination, amount }) => `Enviar ECO ${amount} a ${destination}`, - walletSettingsTitle: "Cartera", walletSettingsDescription: "Integrar Oasis con tu cartera de ECOin.", walletSettingsDocLink: "Guía de instalación de ECOin", walletStatusMessages: { @@ -834,37 +697,19 @@ module.exports = { cipherTitle: "Cifrador", cipherDescription: "Encripta y desencripta tu texto de forma simétrica (usando una contraseña compartida).", randomPassword: "Contraseña Aleatoria", - cipherEncryptTitle: "Encriptar Texto", - cipherEncryptDescription: "Introduce el texto para encriptar", - cipherTextLabel: "Texto para Encriptar", cipherTextPlaceholder: "Introduce el texto para encriptar...", cipherPasswordLabel: "Establece una contraseña (mínimo 32 caracteres) para encriptar tu texto", cipherPasswordDecryptLabel: "Establece una contraseña (mínimo 32 caracteres) para desencriptar tu texto", cipherPasswordPlaceholder: "Introduce una contraseña...", cipherEncryptButton: "Encriptar", - cipherDecryptTitle: "Desencriptar Texto", - cipherDecryptDescription: "Introduce el texto para desencriptar", cipherEncryptedMessageLabel: "Texto Encriptado", cipherDecryptedMessageLabel: "Texto Desencriptado", - cipherPasswordUsedLabel: "Contraseña usada para encriptar (guárdala!)", cipherEncryptedTextPlaceholder: "Introduce el texto encriptado...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Introduce el vector de inicialización...", cipherDecryptButton: "Desencriptar", password: "Contraseña", text: "Texto", encryptedText: "Texto Encriptado", iv: "Vector de Inicialización (IV)", - encryptTitle: "Encripta tu texto", - encryptDescription: "Introduce el texto que deseas encriptar y proporciona una contraseña.", - encryptButton: "Encriptar", - decryptTitle: "Desencripta tu texto", - decryptDescription: "Introduce el texto encriptado y proporciona la misma contraseña utilizada para la encriptación.", - decryptButton: "Desencriptar", - passwordLengthError: "La contraseña debe tener al menos 32 caracteres.", - missingFieldsError: "Texto, contraseña o IV no proporcionados.", - encryptionError: "Error al encriptar el texto.", - decryptionError: "Error al desencriptar el texto.", bookmarkTitle: "Marcadores", bookmarkDescription: "Descubre y gestiona marcadores en tu red.", bookmarkAllSectionTitle: "Marcadores", @@ -890,8 +735,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Opcional", bookmarkTagsLabel: "Etiquetas", bookmarkTagsPlaceholder: "Introduce tags separadas por comas", - bookmarkCategoryLabel: "Categoría", - bookmarkCategoryPlaceholder: "Opcional", bookmarkLastVisitLabel: "Última visita", bookmarkSearchPlaceholder: "Buscar URL, tags, categoría, autor...", bookmarkSortRecent: "Más recientes", @@ -906,8 +749,6 @@ module.exports = { noLastVisit: "Sin última visita", videoTitle: "Vídeos", videoDescription: "Explora y gestiona contenido de vídeo en tu red.", - videoPluginTitle: "Título", - videoPluginDescription: "Descripción", videoMineSectionTitle: "Tus vídeos", videoCreateSectionTitle: "Subir vídeo", videoUpdateSectionTitle: "Actualizar vídeo", @@ -939,7 +780,6 @@ module.exports = { videoSortOldest: "Más antiguos", videoSortTop: "Más votados", videoSearchButton: "Buscar", - videoMessageAuthorButton: "MP", videoUpdatedAt: "Actualizado", videoNoMatch: "Ningún vídeo coincide con tu búsqueda.", documentTitle: "Documentos", @@ -980,8 +820,6 @@ module.exports = { documentUpdatedAt: "Actualizado", audioTitle: "Audios", audioDescription: "Explora y gestiona contenido de audio en tu red.", - audioPluginTitle: "Título", - audioPluginDescription: "Descripción", audioMineSectionTitle: "Tus audios", audioCreateSectionTitle: "Subir audio", audioUpdateSectionTitle: "Actualizar audio", @@ -992,7 +830,6 @@ module.exports = { audioFilterMine: "MÍOS", audioFilterRecent: "RECIENTES", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Subir audio", audioUpdateButton: "Actualizar", audioDeleteButton: "Eliminar", @@ -1019,6 +856,7 @@ module.exports = { audioFilterFavorites: "FAVORITOS", favoritesTitle: "Favoritos", favoritesDescription: "Todos tus elementos marcados como favoritos en un solo lugar.", + favoritesSearchPlaceholder: "Buscar en favoritos...", favoritesFilterAll: "TODOS", favoritesFilterRecent: "RECIENTES", favoritesFilterAudios: "AUDIOS", @@ -1034,18 +872,13 @@ module.exports = { favoritesNoItems: "Todavía no hay favoritos.", yourContacts: "Tus Contactos", allInhabitants: "Habitantes", - allCVs: "Todos los CVs", + allCVs: "CVs", discoverPeople: "Descubre habitantes en tu red.", - allInhabitantsButton: "TODOS", - contactsButton: "SOPORTES", - CVsButton: "CVs", - matchSkills: "Coincidir Habilidades", - matchSkillsButton: "COINCIDIR HABILIDADES", - suggestedButton: "SUGERIDOS", searchInhabitantsPlaceholder: "FILTRAR habitantes POR NOMBRE …", filterLocation: "FILTRAR habitantes POR UBICACIÓN …", filterLanguage: "FILTRAR habitantes POR IDIOMA …", filterSkills: "FILTRAR habitantes POR HABILIDADES …", + cvSkillsCount: "Habilidades", applyFilters: "Aplicar Filtros", locationLabel: "Ubicación", languagesLabel: "Idiomas", @@ -1054,17 +887,18 @@ module.exports = { mutualFollowers: "Seguidores Mutuos", suggestedFollowsYou: "Te sigue", latestInteractions: "Últimas Interacciones", - viewAvatar: "Ver Avatar", - viewCV: "Ver CV", suggestedSectionTitle: "Sugeridos", topkarmaSectionTitle: "Mejor Karma", topecoSectionTitle: "Mejor Eco", topactivitySectionTitle: "Top Actividad", + "TOP INACTIVITYButton": "MÁS INACTIVOS", + topinactivitySectionTitle: "Habitantes menos activos", blockedSectionTitle: "Bloqueados", gallerySectionTitle: "GALERÍA", - blockedButton: "BLOQUEADOS", + topSectionTitle: "TOP", blockedLabel: "Usuario Bloqueado", inhabitantviewDetails: "Ver Detalles", + cvVisitButton: "Visitar CV", keepReading: "Seguir leyendo...", oasisId: "ID", noInhabitantsFound: "No se encontraron habitantes, aún.", @@ -1077,6 +911,7 @@ module.exports = { parliamentFilterCandidatures: "CANDIDATURAS", parliamentFilterProposals: "PROPUESTAS", parliamentFilterLaws: "LEYES", + parliamentFilterRevocations: "REVOCACIONES", parliamentFilterHistorical: "HISTÓRICO", parliamentFilterLeaders: "LÍDERES", parliamentFilterRules: "REGLAS", @@ -1102,10 +937,8 @@ module.exports = { parliamentPoliciesDeclined: "LEYES RECHAZADAS", parliamentPoliciesDiscarded: "LEYES DESCARTADAS", parliamentEfficiency: "% EFICIENCIA", - parliamentFilterRevocations: 'REVOCACIONES', parliamentRevocationFormTitle: 'Revocar Ley', parliamentRevocationLaw: 'Ley', - parliamentRevocationTitle: 'Título', parliamentRevocationReasons: 'Motivos', parliamentRevocationPublish: 'Publicar Revocación', parliamentCurrentRevocationsTitle: 'Revocaciones Actuales', @@ -1118,23 +951,12 @@ module.exports = { parliamentNoGovernments: "Todavía no hay gobiernos en el histórico.", parliamentCandidatureFormTitle: "Proponer Candidatura", parliamentCandidatureIdPh: "Oasis ID (@...) o nombre de la tribu", - parliamentCandidatureSlogan: "Lema (máx. 140 car.)", - parliamentCandidatureSloganPh: "Un lema corto", parliamentCandidatureMethod: "Método", parliamentCandidatureProposeBtn: "Publicar Candidatura", - parliamentThDate: "Fecha de propuesta", - parliamentThSlogan: "Lema", - parliamentThSince: "Perfil desde", - parliamentThVotes: "Votos recibidos", - parliamentThVoteAction: "Votar", - parliamentTypeUser: "Habitante", - parliamentTypeTribe: "Tribu", parliamentVoteBtn: "Votar", parliamentProposalFormTitle: "Proponer Ley", parliamentProposalDescription: "Descripción (≤1000)", parliamentProposalPublish: "Publicar Propuesta", - parliamentFinalize: "Finalizar", - parliamentDeadline: "Fecha límite", parliamentNoProposals: "Aún no hay propuestas de ley.", parliamentNoLaws: "Aún no hay leyes aprobadas.", parliamentMethodDEMOCRACY: "Democracia", @@ -1152,29 +974,21 @@ module.exports = { parliamentVotesSlashTotal: "Votos/Total", parliamentVotesNeeded: "Votos Necesarios", parliamentFutureLawsTitle: "Futuras leyes", - parliamentNoFutureLaws: "Aún no hay futuras leyes.", parliamentVoteAction: "Votar", - parliamentLeadersTitle: "Líderes", parliamentThLeader: "AVATAR", parliamentPopulation: "Población", - parliamentThType: "Tipo", - parliamentThInPower: "Gobiernos", parliamentThPresented: "CANDIDATURAS", parliamentNoLeaders: "Aún no hay líderes.", parliamentCandidaturesListTitle: "Lista de Candidaturas", parliamentTimeRemaining: "Tiempo restante", - parliamentNoLeader: "Aún no hay candidatura ganadora.", parliamentElectionsStatusTitle: "Próximo Gobierno", parliamentProposalDeadlineLabel: "Fecha límite", parliamentProposalTimeLeft: "Tiempo restante", - parliamentProposalOnTrack: "Con apoyo suficiente", - parliamentProposalOffTrack: "Apoyo insuficiente", parliamentRulesTitle: "Cómo funciona el Parlamento", parliamentRulesIntro: "Las elecciones se resuelven cada 2 meses; las candidaturas son continuas y se reinician cuando se elige un gobierno.", parliamentRulesCandidates: "Cualquier habitante puede proponerse a sí mismo, a otro habitante o a cualquier tribu. Cada habitante puede proponer hasta 3 candidaturas por ciclo; se rechazan duplicados en el mismo ciclo.", parliamentRulesElection: "Gana la candidatura con más votos en el momento de la resolución.", parliamentRulesTies: "Desempate: mayor karma del habitante; si persiste, perfil más antiguo; si persiste, propuesta más temprana; después, orden lexicográfico por ID.", - parliamentRulesFallback: "Si nadie vota, gana la última candidatura propuesta. Si no hay candidaturas, se selecciona una tribu al azar.", parliamentRulesTerm: "La pestaña Gobierno muestra el gobierno actual y sus estadísticas.", parliamentRulesMethods: "Formas: Anarquía (mayoría simple), Democracia (50%+1), Mayoría (80%), Minoría (20%), Karmatocracia (propuestas con mayor karma), Dictadura (aprobación instantánea).", parliamentRulesAnarchy: "Anarquía es el modo por defecto: si al resolver no se elige ninguna candidatura, se proclama la Anarquía. En Anarquía, cualquier habitante puede proponer leyes.", @@ -1196,11 +1010,7 @@ module.exports = { courtsCaseFormTitle: "Abrir caso", courtsCaseRespondent: "Acusado / Parte demandada", courtsCaseRespondentPh: "ID de Oasis (@...) o nombre de Tribu", - courtsCaseMediatorsAccuser: "Mediadores (acusación)", courtsCaseMethod: "Método de resolución", - courtsCaseDescription: "Descripción (máx. 1000 caracteres)", - courtsCaseEvidenceTitle: "Pruebas del caso", - courtsCaseEvidenceHelp: "Adjunta imágenes, audios, documentos (PDF) o vídeos que apoyen tu caso.", courtsCaseSubmit: "Presentar caso", courtsNominateJudge: "Nominar juez", courtsJudgeId: "Juez", @@ -1246,22 +1056,6 @@ module.exports = { courtsRulesMisconduct: "El acoso, la manipulación o las pruebas fabricadas pueden llevar a una resolución negativa inmediata.", courtsRulesGlossary: "Caso: registro de un conflicto. Pruebas: materiales que respaldan las afirmaciones. Veredicto: decisión con remedio. Apelación: solicitud para revisar el veredicto.", courtsFilterActions: "ACCIONES", - courtsNoActions: "No hay acciones pendientes para tu rol.", - courtsCaseTitlePlaceholder: "Breve descripción del conflicto", - courtsCaseSeverity: "Severidad", - courtsCaseSeverityNone: "Sin etiqueta de severidad", - courtsCaseSeverityLOW: "Baja", - courtsCaseSeverityMEDIUM: "Media", - courtsCaseSeverityHIGH: "Alta", - courtsCaseSeverityCRITICAL: "Crítica", - courtsCaseSubject: "Tema", - courtsCaseSubjectNone: "Sin etiqueta de tema", - courtsCaseSubjectBEHAVIOUR: "Comportamiento", - courtsCaseSubjectCONTENT: "Contenido", - courtsCaseSubjectGOVERNANCE: "Gobernanza / normas", - courtsCaseSubjectFINANCIAL: "Finanzas / recursos", - courtsCaseSubjectOTHER: "Otro", - courtsHiddenRespondent: "Oculto (solo visible para los roles implicados).", courtsThRole: "Rol", courtsRoleAccuser: "Acusación", courtsRoleDefence: "Defensa", @@ -1272,54 +1066,19 @@ module.exports = { courtsAssignJudgeBtn: "Elegir juez", trendingTitle: "Tendencias", exploreTrending: "Explora el contenido más popular en tu red.", - bookmarkButton: "MARCADORES", - transferButton: "TRANSFERENCIAS", - eventButton: "EVENTOS", - taskButton: "TAREAS", votesButton: "GOBIERNO", - industryButton: "INDUSTRIA", - projectButton: "PROYECTOS", - shopProductButton: "PRODUCTOS", - reportButton: "INFORMES", - feedButton: "FEED", - marketButton: "MERCADO", - imageButton: "IMÁGENES", - audioButton: "AUDIOS", - videoButton: "VIDEOS", - documentButton: "DOCUMENTOS", - torrentButton: "TORRENTS", - noTrendingFound: "No se encontraron contenidos populares.", - noContentMessage: "No hay contenido popular disponible, aún.", - trendingDescription: "Descripción", - trendingDate: "Fecha", - trendingLocation: "Ubicación", - trendingPrice: "Precio", - trendingUrl: "URL", - trendingCategory: "Categoría", - trendingStart: "Inicio", - trendingEnd: "Fin", - trendingPriority: "Prioridad", - trendingStatus: "Estado", - trendingFrom: "Desde", - trendingTo: "Hasta", - trendingConcept: "Concepto", - trendingAmount: "Cantidad", - trendingDeadline: "Plazo", - trendingItemStatus: "Estado del Artículo", - trendingTotalVotes: "Total de Votos", + shopProductButton: "TIENDA", trendingTotalOpinions: "Total de Opiniones", trendingNoContentMessage: "Todavía no hay tendencias.", - trendingAuthor: "Por", - trendingCreatedAtLabel: "Creado el", trendingTotalCount: "Total de Contadores", tasksTitle: "Tareas", tasksDescription: "Descubre y gestiona tareas en tu red.", + taskSearchPlaceholder: "Buscar tareas...", taskTitleLabel: "Título", taskDescriptionLabel: "Descripción", taskStartTimeLabel: "Fecha de Inicio", taskEndTimeLabel: "Fecha de Fin", taskPriorityLabel: "Prioridad", - taskPrioritySelect: "Seleccionar prioridad", taskPriorityUrgent: "Urgente", taskPriorityHigh: "Alta", taskPriorityMedium: "Media", @@ -1329,13 +1088,13 @@ module.exports = { taskVisibilityLabel: "Visibilidad", taskPublic: "público", taskPrivate: "privado", - taskCreatedAt: "Creado el", - taskBy: "Por", taskStatus: "Estado", taskStatusOpen: "Abierta", taskStatusInProgress: "En Progreso", taskStatusClosed: "Cerrada", taskAssignedTo: "Asignada a", + taskAssignedChip: "Asignada", + taskUnassignedChip: "Sin asignar", taskAssignees: "Asignados", taskAssignButton: "Asignar a Mí", taskUnassignButton: "Desasignar", @@ -1348,7 +1107,6 @@ module.exports = { taskFilterInProgress: "EN-PROCESO", taskFilterClosed: "CERRADAS", taskFilterAssigned: "ASIGNADAS", - taskFilterArchived: "ARCHIVADAS", taskFilterUrgent: "URGENTES", taskFilterHigh: "ALTAS", taskFilterMedium: "MEDIAS", @@ -1361,23 +1119,21 @@ module.exports = { taskInProgressTitle: "Tareas en Progreso", taskClosedTitle: "Tareas Cerradas", taskAssignedTitle: "Tareas Asignadas", - taskArchivedTitle: "Tareas Archivadas", - taskPublicTitle: "Tareas Públicas", - taskPrivateTitle: "Tareas Privadas", notasks: "No hay tareas disponibles.", noLocation: "No se especificó ubicación", taskSetStatus: "Establecer estado", - eventTitle: "Eventos", eventDateLabel: "Fecha", + eventRecurrenceLabel: "Recurrencia", + eventRecurrenceUntil: "Repetir hasta", + eventRecurrenceHint: "Deja vacía la fecha de repetición para un evento único.", + eventUpcomingDates: "Próximas fechas", eventsTitle: "Eventos", eventsDescription: "Descubre y gestiona eventos en tu red.", - eventDescription: "Descripción", + eventSearchPlaceholder: "Buscar eventos...", eventPrice: "Precio", eventStatus: "Estado", - eventOrganizer: "Organizador", eventAllSectionTitle: "Eventos", eventMineSectionTitle: "Tus Eventos", - eventArchivedTitle: "Eventos Archivados", eventCreateSectionTitle: "Crear Evento", eventUpdateSectionTitle: "Actualizar Evento", eventDeleteButton: "Eliminar", @@ -1385,11 +1141,26 @@ module.exports = { eventAddToCalendar: "Añadir al Calendario", eventVisitCalendar: "Visitar Calendario", viewTask: "Ver Tarea", + viewEvent: "Ver evento", + viewPad: "Ver pad", + viewMap: "Ver mapa", + viewCalendar: "Ver calendario", viewReport: "Ver Reporte", viewTransfer: "Ver Transferencia", viewItem: "Ver Item", viewShop: "Ver Tienda", viewProject: "Ver Proyecto", + viewJob: "Ver Empleo", + viewPlace: "Ver Lugar", + generatePdf: "Generar PDF", + sharePm: "Compartir por PM", + galleryImages: "Imágenes (tamaño máx: 50MB cada una)", + galleryPhotos: "Imágenes", + galleryAddPhoto: "Añadir Imagen", + galleryRemovePhoto: "Quitar", + galleryVideo: "Vídeo (tamaño máx: 50MB)", + galleryAddVideo: "Añadir Vídeo", + galleryRemoveVideo: "Quitar vídeo", viewVotation: "Ver Votación", voteCastTitle: "Emitir Voto", voteResults: "Resultados", @@ -1397,29 +1168,15 @@ module.exports = { eventDescriptionLabel: "Descripción", eventDescriptionPlaceholder: "Introduce la descripción del evento...", eventUpdateButton: "Actualizar", - eventAttendeesLabel: "Asistentes", - eventAttendeesPlaceholder: "Introduce los asistentes, separados por comas...", eventTagsLabel: "Etiquetas", - eventTagsPlaceholder: "Introduce las etiquetas del evento, separadas por comas...", - eventTags: "Etiquetas", eventPriceLabel: "Precio", eventUrlLabel: "URL", eventAttendees: "Asistentes", - noAttendees: "Aún no hay asistentes", - eventCreatedAt: "Creado el", eventLocation: "Ubicación", eventLocationLabel: "Ubicación", - eventNoLocation: "No se especificó ubicación", - eventNoURL: "No se especificó URL", - eventBy: "Por", noevents: "No hay eventos disponibles.", eventDate: "Fecha", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "Asistir al Evento", - eventUnattendButton: "Dejar de asistir al Evento", - eventCreatedBy: "Creado por", - eventAttendeesCount: "Número de Asistentes", - eventCreatedByYou: "Tú creaste este evento", eventFilterAll: "TODOS", eventFilterMine: "MIOS", eventFilterToday: "HOY", @@ -1427,18 +1184,9 @@ module.exports = { eventFilterMonth: "ESTE MES", eventFilterYear: "ESTE AÑO", eventFilterArchived: "ARCHIVADOS", - eventTodayTitle: "Eventos de Hoy", - eventThisWeekTitle: "Eventos de Esta Semana", - eventThisMonthTitle: "Eventos de Este Mes", - eventThisYearTitle: "Eventos de Este Año", eventPrivacyLabel: "Visibilidad", eventPublic: "Público", eventPrivate: "Privado", - eventPublicTitle: "Eventos Públicos", - eventNoPrice: "Evento Gratuito", - eventNoImage: "No se ha subido ninguna imagen", - eventAttendConfirmation: "Ahora estás asistiendo a este evento", - eventUnattendConfirmation: "Ya no estás asistiendo a este evento", eventAttended: "Asisto", eventUnattended: "No asisto", eventStatusOpen: "Abierto", @@ -1449,6 +1197,10 @@ module.exports = { tagsTopSectionTitle: "Etiquetas Principales", tagsCloudSectionTitle: "Nube de Etiquetas", tagsFilterAll: "TODOS", + tagsFilterMine: "MÍAS", + tagsFilterRecent: "RECIENTES", + tagsMineSectionTitle: "Mis etiquetas", + tagsRecentSectionTitle: "Etiquetas recientes", tagsFilterTop: "TOP", tagsFilterCloud: "NUBE", tagsNoItems: "No hay etiquetas disponibles.", @@ -1492,18 +1244,12 @@ module.exports = { transfersDeadline: "Plazo", transfersTags: "Etiquetas", transfersStatus: "Estado", - transfersStatusUnconfirmed: "NO CONFIRMADA", - transfersStatusClosed: "CERRADA", - transfersStatusDiscarded: "DESCARTADA", - transfersCreatedAt: "Creado el", transfersConfirmations: "CONFIRMACIONES", - transfersContainingBlock: "Bloque contenedor", - transfersExportContract: "Contrato inteligente", + transfersExportContract: "Generar Factura", transfersConfirmButton: "Confirmar Transferencia", transfersNoItems: "No se encontraron transferencias.", transfersMineSectionTitle: "Tus Transferencias", transfersUBISectionTitle: "Transferencias RBU", - transfersMarketSectionTitle: "Transferencias del Mercado", transfersTopSectionTitle: "Transferencias Principales", transfersPendingSectionTitle: "Transferencias Pendientes", transfersUnconfirmedSectionTitle: "Transferencias No Confirmadas", @@ -1511,21 +1257,13 @@ module.exports = { transfersDiscardedSectionTitle: "Transferencias Descartadas", transfersCreateSectionTitle: "Crear transferencia", transfersAllSectionTitle: "Transferencias", - transfersFilterFavs: "Favoritos", - transfersFavsSectionTitle: "Transferencias favoritas", - transfersSearchLabel: "Buscar", transfersSearchPlaceholder: "Buscar por concepto, tags, usuarios...", transfersMinAmountLabel: "Importe mín.", transfersMaxAmountLabel: "Importe máx.", - transfersSortLabel: "Ordenar por", transfersSortRecent: "Más recientes", transfersSortAmount: "Mayor importe", transfersSortDeadline: "Deadline más próximo", transfersSearchButton: "Buscar", - transfersFavoriteButton: "Favorito", - transfersUnfavoriteButton: "Quitar favorito", - transfersMessageUserButton: "Mensaje", - transfersExpiringSoonBadge: "CADUCA PRONTO", transfersExpiredBadge: "CADUCADA", transfersUpdatedAt: "Actualizado", transfersNoMatch: "No hay transferencias que coincidan con tu búsqueda.", @@ -1570,16 +1308,6 @@ module.exports = { voteNoQuestion: "No se proporcionó pregunta", voteUnknownCreator: "Creador Desconocido", voteUnknownDate: "Fecha Desconocida", - errorVoteNotFound: "Votación no encontrada", - errorAlreadyVoted: "Ya has opnado.", - errorVoteClosedCannotEdit: "No puedes editar una votación cerrada", - errorVoteDeadlinePassed: "El plazo para esta votación ha pasado", - errorRetrievingVote: "Error al recuperar votación", - errorCreatingVote: "Error al crear votación", - errorVoteAlreadyVoted: "No se puede editar después de haber opinado", - errorDeletingOldVote: "Error al eliminar opinión anterior", - errorCreatingUpdatedVote: "Error al crear opinión actualizada", - errorCreatingTombstone: "Error al crear lápida", voteDetailSectionTitle: 'Detalles de la votación', voteCommentsLabel: 'Comentarios', voteCommentsForumButton: 'Abrir conversación', @@ -1589,7 +1317,6 @@ module.exports = { voteNewCommentButton: 'Publicar comentario', voteNewCommentLabel: 'Añade un comentario', cvTitle: "CV", - cvLabel: "Currículum Vitae (CV)", cvEditSectionTitle: "Editar CV", cvCreateSectionTitle: "Crear CV", cvDescription: "Gestiona y comparte tus habilidades profesionales e información.", @@ -1608,19 +1335,16 @@ module.exports = { cvLocationLabel: "Ubicación", cvStatusLabel: "Estado", cvPreferencesLabel: "Preferencias", - cvOasisContributorLabel: "Contribuyente de Oasis", cvPersonal: "Personal", cvOasis: "Contribuyente de Oasis (opcional)", - cvOasisContributorView: "Contribución en Oasis", + cvOasisContributorView: "Contribución", cvEducational: "Educativo (opcional)", cvEducationalView: "Educativo", cvProfessional: "Profesional (opcional)", cvProfessionalView: "Profesional", cvAvailability: "Disponibilidad (opcional)", - cvAvailabilityView: "Disponibilidad", cvUpdateButton: "Actualizar", cvCreateButton: "Crear CV", - cvContactLabel: "Contacto", cvCreatedAt: "Creado el", cvUpdatedAt: "Actualizado el", cvEditButton: "Actualizar", @@ -1629,8 +1353,103 @@ module.exports = { blogSubject: "Asunto", blogMessage: "Mensaje", blogImage: "Subir contenido multimedia (max: 50MB)", + blogMedia: "Adjuntos (hasta 8 imágenes y un vídeo)", blogPublish: "Vista previa", - noPopularMessages: "No se han publicado mensajes populares, aún", + pollsTitle: "Encuestas", + dataTitle: "Coincidencias", + dataDescription: "Explora y visualiza las coincidencias de tu red.", + dataFilterAll: "TODO", + dataFilterMine: "MÍOS", + dataFilterRecent: "RECIENTES", + dataFilterTop: "TOP", + dataKindInhabitants: "HABITANTES", + dataKindJobs: "EMPLEOS", + dataKindProjects: "PROYECTOS", + dataKindEvents: "EVENTOS", + dataKindTribes: "TRIBUS", + dataKindMarket: "MERCADO", + dataKindHousing: "VIVIENDA", + dataKindIndustry: "INDUSTRIA", + dataKindTasks: "TAREAS", + dataKindReports: "INFORMES", + dataKindVotes: "VOTACIONES", + dataSearchPlaceholder: "Buscar en los datos cruzados...", + dataCohesionTitle: "Coeficiente de Cohesión (CC)", + dataCcShort: "CC", + dataCohesionHint: "Afinidad media entre todo lo que la red ha publicado.", + dataAffinity: "Afinidad", + dataCommonTerms: "Palabra clave", + dataStatPeople: "CVs", + dataStatConnected: "Conectados", + dataStatSkills: "Habilidades", + dataBestMatch: "Mejor match", + dataStatIsolated: "Aislados", + dataStatEntities: "Entidades comparadas", + dataStatTerms: "Términos distintos", + dataStatPairs: "Pares conectados", + dataMatchesTitle: "Coincidencias", + dataMatchesHint: "Sugerencias personalizadas del algoritmo.", + dataTermsTitle: "Palabras clave", + dataTermsHint: "Los términos que aparecen en más contenidos.", + dataConnections: "Coincidencias enlazadas", + dataTopicTitle: "Todo lo relacionado con", + dataTopicHint: "Lo que el algoritmo relaciona con este tema", + dataNoMatches: "No hay datos cruzados que mostrar.", + dataNoProfile: "Publica contenido o escribe tu CV para que el algoritmo aprenda qué te interesa.", + pollsDescription: "Módulo para preguntar a la red y contar las respuestas.", + pollFilterAll: "TODAS", + pollFilterMine: "MÍAS", + pollFilterRecent: "RECIENTES", + pollFilterTop: "TOP", + pollFilterVoted: "VOTADAS", + pollFilterOpen: "ABIERTAS", + pollFilterClosed: "CERRADAS", + pollCreateButton: "Crear Encuesta", + pollCreateTitle: "Crear Encuesta", + pollEditTitle: "Editar Encuesta", + pollQuestion: "Pregunta", + pollQuestionPlaceholder: "¿Qué quieres preguntar?", + pollOptions: "Opciones (una por línea)", + pollOutcome: "Resultado", + pollNoVotesYet: "Todavía sin votos", + pollTie: "Empate", + pollOptionsPlaceholder: "Plaza\nParque\nBar", + pollAnonymous: "Anónima", + pollAnonymousLabel: "Encuesta anónima", + pollMultiple: "Respuesta múltiple", + pollMultipleLabel: "Permitir varias respuestas", + pollDeadline: "Fecha límite", + pollTags: "Etiquetas", + pollPublishButton: "Publicar Encuesta", + pollUpdateButton: "Actualizar", + pollCloseButton: "Cerrar", + pollDeleteButton: "Eliminar", + pollVoteButton: "Votar", + pollChangeVote: "Cambiar Voto", + pollVoters: "Votantes", + pollComments: "Comentarios", + pollStatusLabel: "Estado", + pollStatusOpen: "ABIERTA", + pollStatusClosed: "CERRADA", + pollSearchPlaceholder: "Buscar encuestas...", + pollsNoItems: "No se han encontrado encuestas.", + viewPoll: "Ver Encuesta", + pollChatCreate: "Crear Encuesta", + pollInChat: "Encuesta", + blogTitle: "Blogs", + blogDescription: "Módulo para descubrir y gestionar blogs.", + blogFilterAll: "TODOS", + blogFilterMine: "MÍOS", + blogFilterRecent: "RECIENTES", + blogFilterFavorites: "FAVORITOS", + blogFilterTop: "TOP", + blogCreateButton: "Crear Blog", + blogSearchPlaceholder: "Buscar blogs...", + blogComments: "Comentarios", + blogAllowComments: "Permitir comentarios", + blogCommentsClosed: "El autor ha cerrado los comentarios de este blog.", + blogNoItems: "No se han encontrado blogs.", + viewBlog: "Ver Blog", forumTitle: "Foros", forumCategoryLabel: "Categoría", forumTitleLabel: "Título", @@ -1638,43 +1457,22 @@ module.exports = { forumCreateButton: "Crear foro", forumCreateSectionTitle: "Crear foro", forumDescription: "Habla abiertamente con habitantes de tu red.", + forumSearchPlaceholder: "Buscar foros...", forumFilterAll: "TODOS", forumFilterMine: "MÍAS", forumFilterRecent: "RECIENTES", forumFilterTop: "TOP", - forumMineSectionTitle: "Tus Foros", - forumRecentSectionTitle: "Foros Recientes", - forumAllSectionTitle: "Foros", forumDeleteButton: "Borrar", forumParticipants: "participantes", forumMessages: "mensajes", - forumLastMessage: "Último mensaje", forumMessageLabel: "Mensaje", forumMessagePlaceholder: "Escribe tu mensaje...", forumSendButton: "Enviar", - forumVisitForum: "Visitar Foro", noForums: "No hay foros disponibles, aún.", - forumVisitButton: "Visitar foro", - forumCatGENERAL: "General", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Política", - forumCatTECH: "Tecnología", - forumCatSCIENCE: "Ciencia", - forumCatMUSIC: "Música", - forumCatART: "Arte", - forumCatGAMING: "Videojuegos", - forumCatBOOKS: "Libros", - forumCatFILMS: "Cine", - forumCatPHILOSOPHY: "Filosofía", - forumCatSOCIETY: "Sociedad", - forumCatPRIVACY: "Privacidad", - forumCatCYBERWARFARE: "Ciberguerra", - forumCatSURVIVALISM: "Supervivencia", + forumVisitButton: "Visitar Foro", + forumTopicLabel: "Tema", imageTitle: "Imágenes", imageDescription: "Explora y gestiona contenido de imágenes en tu red.", - imagePluginTitle: "Título", - imagePluginDescription: "Descripción", imageMineSectionTitle: "Tus imágenes", imageCreateSectionTitle: "Subir imagen", imageUpdateSectionTitle: "Actualizar imagen", @@ -1683,14 +1481,12 @@ module.exports = { imageTopSectionTitle: "Top imágenes", imageFavoritesSectionTitle: "Favoritos", imageGallerySectionTitle: "Galería", - imageMemeSectionTitle: "Memes", imageFilterAll: "TODAS", imageFilterMine: "MÍAS", imageFilterRecent: "RECIENTES", imageFilterTop: "TOP", imageFilterFavorites: "FAVORITOS", imageFilterGallery: "GALERÍA", - imageFilterMeme: "MEMES", imageCreateButton: "Subir imagen", imageUpdateButton: "Actualizar", imageDeleteButton: "Eliminar", @@ -1703,7 +1499,6 @@ module.exports = { imageTitlePlaceholder: "Opcional", imageDescriptionLabel: "Descripción", imageDescriptionPlaceholder: "Opcional", - imageMemeLabel: "¿MEME?", imageNoFile: "No se ha proporcionado ningún archivo de imagen", noImages: "No hay imágenes disponibles.", imageSearchPlaceholder: "Buscar por título, etiquetas, descripción, autor...", @@ -1711,7 +1506,6 @@ module.exports = { imageSortOldest: "Más antiguas", imageSortTop: "Más votadas", imageSearchButton: "Buscar", - imageMessageAuthorButton: "Mensaje", imageUpdatedAt: "Actualizado", imageNoMatch: "Ninguna imagen coincide con tu búsqueda.", feedTitle: "Feed", @@ -1723,7 +1517,6 @@ module.exports = { createFeedButton: "Enviar Feed!", feedPlaceholder: "¿Qué está pasando? (máximo 280 caracteres)", TODAYButton: "HOY", - CREATEButton: "Crear Feed", totalOpinions: "Total de Opiniones", moreVoted: "Más Votado", noFeedsFound: "No se encontraron feeds.", @@ -1745,20 +1538,12 @@ module.exports = { concept: "Concepto", description: "Descripción", meme: "Meme", - activityContact: "Contacto", - activityBy: "Nombre", - activityPixelia: "Nuevo píxel añadido", - viewImage: "Ver imagen", - playAudio: "Reproducir audio", - playVideo: "Reproducir vídeo", typeRecent: "RECIENTE", - errorActivity: "Error al recuperar la actividad", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "RECIENTE", typeTribe: "TRIBUS", typeLarp: "L.A.R.P.", typeInhabitants: "HABITANTES", - activityProfileUpdated: "actualizó su perfil", typeAbout: "HABITANTES", typeCurriculum: "CVS", typeImage: "IMÁGENES", @@ -1802,8 +1587,6 @@ module.exports = { typeCourtsSettlementAccepted: "Tribunales · Acuerdo aceptado", typeCourtsNomination: "Tribunales · Nominación", typeCourtsNominationVote: "Tribunales · Votación de nominación", - activitySupport: "Nueva alianza forjada", - activityJoin: "Nuevo PUB unido", question: "Pregunta", deadline: "Fecha límite", status: "Estado", @@ -1817,12 +1600,8 @@ module.exports = { date: "Fecha", category: "Categoría", attendees: "Asistentes", - activitySpread: "->", - visitLink: "Visitar enlace", - viewDocument: "Ver documento", location: "Ubicación", contentWarning: "Asunto", - personName: "Nombre del habitante", bankWalletConnected: "Monedero ECOin", bankUbiReceived: "UBI recibido", bankTx: "Tx", @@ -1831,7 +1610,6 @@ module.exports = { link: "Enlace", activityProjectFollow: "%OASIS% ahora está %ACTION% este proyecto %PROJECT%", activityProjectUnfollow: "%OASIS% ahora está %ACTION% este proyecto %PROJECT%", - activityProjectPledged: "%OASIS% ha %ACTION% %AMOUNT% al proyecto %PROJECT%", following: "SIGUIENDO", unfollowing: "DEJANDO DE SEGUIR", pledged: "APORTADO", @@ -1877,26 +1655,17 @@ module.exports = { courtsVotesSlashTotal: "SÍ/TOTAL", courtsOpenVote: "Votación abierta", courtsAnswerTitle: "Respuesta", - courtsStanceADMIT: "Admite", - courtsStanceDENY: "Niega", - courtsStancePARTIAL: "Parcial", - courtsStanceCOUNTERCLAIM: "Reconvención", - courtsStanceNEUTRAL: "Neutral", courtsVerdictResult: "Resultado", courtsVerdictOrders: "Órdenes", courtsSettlementText: "Acuerdo", courtsSettlementAccepted: "Aceptado", - courtsSettlementPending: "Pendiente", courtsJudge: "Juez", courtsThSupports: "Apoyos", courtsFilterOpenCase: 'Abrir caso', - courtsEvidenceFileLabel: 'Archivo de prueba (imagen, audio, vídeo o PDF)', - courtsCaseMediators: 'Mediadores', courtsCaseMediatorsPh: 'IDs de Oasis de mediadores, separados por comas', courtsMediatorsLabel: 'Mediadores', courtsThCase: 'Caso', courtsThCreatedAt: 'Fecha de inicio', - courtsThActions: 'Acciones', courtsPublicPrefLabel: 'Visibilidad tras la resolución', courtsPublicPrefYes: 'Acepto que este caso sea totalmente público', courtsPublicPrefNo: 'Prefiero mantener privados los detalles', @@ -1904,8 +1673,11 @@ module.exports = { courtsMethodMEDIATION: 'Mediación', courtsNoCases: 'No hay casos.', reportsTitle: "Informes", - reportsDescription: "Gestiona y realiza un seguimiento de los informes relacionados con problemas, errores, abusos y advertencias de contenido en tu red.", + reportsDescription: "Gestiona y sigue los reportes de tu red.", + reportsSearchPlaceholder: "Buscar reportes...", reportsFilterAll: "TODOS", + reportsFilterRecent: "RECIENTES", + reportsFilterTop: "TOP", reportsFilterMine: "MIOS", reportsFilterFeatures: "FUNCIONES", reportsFilterBugs: "ERRORES", @@ -1918,18 +1690,13 @@ module.exports = { reportsFilterInvalid: "INVALIDOS", reportsCreateButton: "Crear Informe", reportsTitleLabel: "Título", - reportsDescriptionLabel: "Descripción", - reportsDescriptionPlaceholder: "Por favor, proporciona una descripción detallada.", reportsCategory: "Categoría", - reportsCategoryLabel: "Categoría", reportsCategoryFeatures: "Funciones", reportsCategoryBugs: "Errores", reportsCategoryAbuse: "Abuso", - reportsCategoryContent: "Problemas de Contenido", + reportsCategoryContent: "Contenido", reportsUpdateButton: "Actualizar", reportsDeleteButton: "Eliminar", - reportsDateLabel: "Fecha", - reportsUploadFile: "Subir contenido multimedia (max: 50MB)", reportsMineSectionTitle: "Tus Informes", reportsFeaturesSectionTitle: "Solicitudes de Funciones", reportsBugsSectionTitle: "Errores", @@ -1937,11 +1704,6 @@ module.exports = { reportsContentSectionTitle: "Problemas de Contenido", reportsAllSectionTitle: "Informes", reportsNoItems: "No hay informes disponibles.", - reportsValidationTitle: "Por favor, ingresa un título válido.", - reportsValidationDescription: "La descripción no puede estar vacía.", - reportsValidationCategory: "Por favor, selecciona una categoría.", - reportsCreatedAt: "Creado el", - reportsCreatedBy: "Por", reportsSeverity: "Gravedad", reportsSeverityLow: "Baja", reportsSeverityMedium: "Media", @@ -1952,13 +1714,10 @@ module.exports = { reportsStatusUnderReview: "En Revisión", reportsStatusResolved: "Resuelto", reportsStatusInvalid: "Inválido", - reportsUpdateStatusButton: "Actualizar Estado", - reportsAnonymityOption: "Enviar de forma anónima", - reportsAnonymousAuthor: "Anónimo", reportsConfirmButton: "CONFIRMAR INFORME!", reportsConfirmations: "Confirmaciones", reportsConfirmedSectionTitle: "Informes Confirmados", - reportsCreateTaskButton: "CREAR TAREA", + reportsCreateTaskButton: "Crear Tarea", reportsOpenSectionTitle: "Informes Abiertos", reportsUnderReviewSectionTitle: "Informes en Revisión", reportsResolvedSectionTitle: "Informes Resueltos", @@ -2001,6 +1760,20 @@ module.exports = { reportsRequestedActionLabel: 'Acción solicitada', reportsRequestedActionPlaceholder: 'Eliminar, ocultar, marcar, advertir, etc.', tribesTitle: "Tribus", + tribeFilterAll: "TODAS", + tribeFilterRecent: "RECIENTES", + tribeFilterMine: "MÍAS", + tribeFilterMembership: "MEMBRESÍA", + tribeFilterSubtribes: "SUBTRIBUS", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALERÍA", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MÍOS", + tribeFeedFilterALL: "TODOS", + tribeFeedFilterRECENT: "RECIENTES", + courtsStanceDENY: "Negar", + courtsStanceADMIT: "Admitir", + courtsStancePARTIAL: "Admitir en parte", tribeAllSectionTitle: "Tribus", tribeMineSectionTitle: "Tus Tribus", tribeCreateSectionTitle: "Crear Tribu", @@ -2012,13 +1785,6 @@ module.exports = { tribeviewSubTribeButton: "Visitar Sub-Tribu", tribeRootLabel: "RAÍZ", tribeDescription: "Explora o crea tribus en tu red.", - tribeFilterAll: "TODOS", - tribeFilterMine: "MÍAS", - tribeFilterMembership: "MIEMBROS", - tribeFilterRecent: "RECIENTES", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "SUB-TRIBUS", - tribeFilterGallery: "GALERÍA", tribeMainTribeLabel: "TRIBU PRINCIPAL", tribeCreateButton: "Crear Tribu", tribeUpdateButton: "Actualizar", @@ -2037,13 +1803,8 @@ module.exports = { tribeModeLabel: "MODO", tribeIsAnonymousLabel: "ESTADO", tribeMembersCount: "Miembros", - tribeInviteCodePlaceholder: "Introduce el código de invitación", - tribeJoinByCodeButton: "Unirse con código", - tribeJoinButton: "UNIRSE", tribeEnterInvite: "INTRODUCIR INVITACIÓN", tribeLeaveButton: "DEJAR", - tribeYes: "SÍ", - tribeNo: "NO", tribePublic: "PÚBLICA", tribePrivate: "PRIVADA", tribeGenerateInvite: "INVITACIÓN ÚNICA", @@ -2052,13 +1813,8 @@ module.exports = { tribeRemoveInvitation: "ELIMINAR INVITACIÓN", tribeCreatedAt: "Creado el", tribeAuthor: "Por", - tribeAuthorLabel: "AUTOR", tribeStrict: "Estricto", tribeOpen: "Abierta", - tribeFeedFilterRECENT: "RECIENTES", - tribeFeedFilterMINE: "MIOS", - tribeFeedFilterALL: "TODOS", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Redifusiones", tribeFeedRefeed: "Redifundir", tribeFeedMessagePlaceholder: "Escribe un feed…", @@ -2068,17 +1824,12 @@ module.exports = { tribeNotFound: "Tribu no encontrada!", createTribeTitle: "Crear Tribu", updateTribeTitle: "Actualizar Tribu", - tribeSectionOverview: "Resumen", tribeSectionInhabitants: "Habitantes", tribeSectionVotations: "VOTACIONES", tribeSectionEvents: "EVENTOS", - tribeSectionReports: "Reportes", tribeSectionTasks: "TAREAS", tribeSectionFeed: "FEED", tribeSectionForum: "FORO", - tribeSectionMarket: "Mercado", - tribeSectionJobs: "Empleos", - tribeSectionProjects: "Proyectos", tribeSectionMedia: "Multimedia", tribeSectionImages: "IMÁGENES", tribeSectionAudios: "AUDIOS", @@ -2116,11 +1867,6 @@ module.exports = { tribeTaskStatusClosed: "CERRAR", tribeTaskAssign: "ASIGNAR", tribeTaskUnassign: "DESASIGNAR", - tribeReportCreate: "Crear Reporte", - tribeReportsEmpty: "No hay reportes, aún.", - tribeReportTitle: "Título", - tribeReportDescription: "Descripción", - tribeReportCategory: "Categoría", tribeVotationCreate: "Crear Votación", tribeVotationsEmpty: "No hay votaciones, aún.", tribeVotationTitle: "Título", @@ -2138,27 +1884,6 @@ module.exports = { tribeForumCategory: "Categoría", tribeForumReply: "Responder", tribeForumReplies: "Respuestas", - tribeMarketCreate: "Crear Anuncio", - tribeMarketEmpty: "No hay anuncios, aún.", - tribeMarketTitle: "Título", - tribeMarketDescription: "Descripción", - tribeMarketPrice: "Precio", - tribeMarketImage: "Imagen", - tribeMarketCategory: "Categoría", - tribeJobCreate: "Crear Empleo", - tribeJobsEmpty: "No hay empleos, aún.", - tribeJobTitle: "Título", - tribeJobDescription: "Descripción", - tribeJobLocation: "Ubicación", - tribeJobSalary: "Salario", - tribeJobDeadline: "Fecha límite", - tribeProjectCreate: "Crear Proyecto", - tribeProjectsEmpty: "No hay proyectos, aún.", - tribeProjectTitle: "Título", - tribeProjectDescription: "Descripción", - tribeProjectGoal: "Objetivo", - tribeProjectFunded: "Financiado", - tribeProjectDeadline: "Fecha límite", tribeMediaUpload: "Subir Media", readDocument: "Leer Documento", tribeCreateImage: "Crear Imagen", @@ -2169,7 +1894,6 @@ module.exports = { tribeMediaEmpty: "No hay media, aún.", tribeMediaTitle: "Título", tribeMediaDescription: "Descripción", - tribeMediaType: "Tipo", tribeMediaTypeImage: "Imagen", tribeMediaTypeVideo: "Vídeo", tribeMediaTypeAudio: "Audio", @@ -2179,11 +1903,6 @@ module.exports = { tribeInviteCodeText: "Código de invitación: ", oasisVersionLabel: "Versión de Oasis", tribeInviteCodeHint: "Comparte este código con quien quieras invitar. Puede unirse desde /invites → Tribes.", - tribeGroupTribe: "Tribu", - tribeGroupOffice: "Oficina", - tribeGroupNetwork: "Red", - tribeGroupEconomy: "Economía", - tribeGroupMedia: "Multimedia", tribeStatusOpen: "ABIERTO", tribeStatusClosed: "CERRADO", tribeStatusInProgress: "EN PROGRESO", @@ -2193,33 +1912,17 @@ module.exports = { tribePriorityCritical: "CRÍTICA", tribeTaskFilterAll: "TODOS", tribeMediaFilterAll: "TODOS", - tribeReportCatBug: "ERROR", - tribeReportCatAbuse: "ABUSO", - tribeReportCatContent: "CONTENIDO", - tribeReportCatOther: "OTRO", tribeForumCatGeneral: "GENERAL", tribeForumCatProposal: "PROPUESTA", tribeForumCatQuestion: "PREGUNTA", tribeForumCatAnnouncement: "ANUNCIO", - tribeMarketCatGoods: "BIENES", - tribeMarketCatServices: "SERVICIOS", - tribeMarketCatFood: "ALIMENTACIÓN", - tribeMarketCatOther: "OTRO", tribeStatusLabel: "Estado", tribeSubTribes: "SUB-TRIBUS", tribeSubTribesCreate: "Crear Sub-Tribu", tribeSubTribesStrictDenied: "El modo estricto de la tribu no te permite generar nuevas sub-tribus. Ponte en contacto con el administrador.", - tribeSubTribesEmpty: "No se han creado sub-tribus, aún.", - tribeActivityJoined: "UNIDO", - tribeActivityLeft: "SALIDO", - tribeActivityFeed: "FEED", tribeActivityRefeed: "REFEED", - tribeGroupAnalytics: "Analíticas", - tribeGroupCreative: "Creativo", tribeSectionActivity: "ACTIVIDAD", tribeSectionTrending: "TENDENCIAS", - tribeSectionOpinions: "OPINIONES", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "ETIQUETAS", tribeSectionSearch: "BUSCAR", tribeActivityEmpty: "Sin actividad aún.", @@ -2231,25 +1934,15 @@ module.exports = { tribeTrendingPeriodWeek: "Esta Semana", tribeTrendingPeriodAll: "Todo", tribeTrendingEngagement: "interacción", - tribeOpinionsEmpty: "Sin opiniones aún.", - tribeOpinionsCast: "Votar", - tribeOpinionsRankings: "Clasificaciones", - tribeOpinionsAlreadyVoted: "Ya has votado", tribeTopCategory: "Más votado", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Lienzo colaborativo de pixel art.", - tribePixeliaPaint: "Pintar", - tribePixeliaContributors: "contribuidores", - tribePixeliaTotalPixels: "píxeles pintados", tribeTagsEmpty: "No se encontraron etiquetas.", - tribeTagsCloud: "Nube de Etiquetas", - tribeTagsContentWith: "Contenido con etiqueta", tribeSearchPlaceholder: "Buscar contenido de la tribu...", tribeSearchEmpty: "Sin resultados.", tribeSearchResults: "Resultados", tribeSearchMinChars: "Introduce al menos 2 caracteres para buscar.", agendaTitle: "Agenda", agendaDescription: "Aquí puedes encontrar todos tus elementos asignados.", + agendaSearchPlaceholder: "Buscar en la agenda...", agendaFilterAll: "TODOS", agendaFilterToday: "HOY", agendaFilterUpcoming: "PRÓXIMO", @@ -2270,18 +1963,7 @@ module.exports = { agendaNoItems: "No se encontraron asignaciones.", agendaDiscardButton: "Descartar", agendaRestoreButton: "Restaurar", - agendaAuthor: "Por", - agendaCreatedAt: "Creado el", - agendaTitleLabel: "Título", agendaMembersCount: "Miembros", - agendaDescriptionLabel: "Descripción", - agendaStatus: "Estado", - agendaVisibility: "Visibilidad", - agendaEventDate: "Fecha del Evento", - agendaEventLocation: "Ubicación", - agendaEventPrice: "Precio", - agendaEventUrl: "URL", - agendaTaskStart: "Hora de Inicio", agendaLocationLabel: "Ubicación", agendaYes: "SÍ", agendaNo: "NO", @@ -2291,11 +1973,6 @@ module.exports = { agendareportCategory: "Categoría", agendareportSeverity: "Gravedad", agendareportStatus: "Estado", - agendareportDescription: "Descripción", - agendaTaskEnd: "Hora de Fin", - agendaTaskPriority: "Prioridad", - agendaTransferFrom: "De", - agendaTransferTo: "A", agendaTransferConcept: "Concepto", agendaTransferAmount: "Cantidad", agendaTransferDeadline: "Plazo", @@ -2305,47 +1982,7 @@ module.exports = { voteNow: "Vota ahora", alreadyVoted: "Ya has opinado.", noOpinionsFound: "No se encontraron opiniones.", - RECENTButton: "RECIENTES", TOPButton: "TOP", - interestingButton: "INTERESANTE", - necessaryButton: "NECESARIO", - funnyButton: "DIVERTIDO", - disgustingButton: "ASQUEROSO", - sensibleButton: "SENSIBLE", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "SOLO ADULTOS", - boringButton: "ABURRIDO", - confusingButton: "CONFUSO", - usefulButton: "UTIL", - informativeButton: "INFORMATIVO", - wellResearchedButton: "BIEN INVESTIGADO", - accurateButton: "CONCISO", - needsSourcesButton: "NECESITA FUENTES", - wrongButton: "INCORRECTO", - lowQualityButton: "BAJA CALIDAD", - creativeButton: "CREATIVO", - insightfulButton: "PERSPECTIVO", - actionableButton: "ACCIONABLE", - inspiringButton: "INSPIRADOR", - loveButton: "AMOR", - clearButton: "CLARO", - upliftingButton: "EMPODERANTE", - unnecessaryButton: "INNECESARIO", - rejectedButton: "RECHAZADO", - misleadingButton: "ENGAÑOSO", - offTopicButton: "FUERA DE TEMA", - duplicateButton: "DUPLICADO", - clickbaitButton: "CEBO DE CLICS", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "VIOLENTO", - toxicButton: "TOXICO", - harassmentButton: "ACOSO", - hateButton: "ODIO", - scamButton: "ESTAFA", - triggeringButton: "PROVOCADOR", - opinionsCreatedAt: "Creado en", opinionsTotalCount: "Total de opiniones", voteInteresting: "Interesante", voteNecessary: "Necesario", @@ -2382,7 +2019,6 @@ module.exports = { voteCreative: "Creativo", voteSpam: "Spam", voteAdultOnly: "Solo adultos", - publishBlog: "Publicar Blog", privateMessage: "MP", pmSendTitle: "Mensajes Privados", pmSend: "Enviar!", @@ -2393,7 +2029,6 @@ module.exports = { pmComposeTitle: "Enviar un mensaje", pmRecipients: "Destinatarios", pmRecipientsHint: "Introduce los IDs de Oasis separados por comas", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Hasta 7 destinatarios por mensaje.", pmTextPlaceholder: "Cuerpo limitado a 7000 caracteres.", pmSubject: "Asunto", @@ -2417,7 +2052,6 @@ module.exports = { pmCrypterCharsLabel: "caracteres", pmInvalidRecipients: "Oasis ID no válido (debería ser como @…=.ed25519).", pmEncryptionLabel: "Cifrado", - pmFile: "Archivo adjunto", private: "Privados", privateDescription: "Tus mensajes cifrados.", privateInbox: "BUZÓN", @@ -2427,18 +2061,14 @@ module.exports = { noPrivateMessages: "No hay mensajes privados.", pmReply: "Responder", pmReplies: "respuestas", - pmNew: "nuevas", - pmMarkRead: "Marcar como leido", inReplyTo: "EN RESPUESTA A", pmPreview: "Previsualizar", pmPreviewTitle: "Vista previa", performed: "→", pmFromLabel: "De:", pmToLabel: "Para:", - pmInvalidMessage: "Mensaje no válido", pmNoSubject: "(sin asunto)", pmSubjectLabel: "Asunto:", - pmBodyLabel: "Cuerpo", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2456,8 +2086,6 @@ module.exports = { inboxJobSubscribedTitle: "Nueva suscripción a tu oferta de trabajo", pmInhabitantWithId: "Habitante con ID OASIS:", pmHasSubscribedToYourJobOffer: "se ha suscrito a tu oferta de trabajo", - inboxProjectCreatedTitle: "Nuevo proyecto creado", - pmHasCreatedAProject: "ha creado un proyecto", inboxMarketItemSoldTitle: "Artículo vendido", inboxShopSoldTitle: "Producto vendido", pmYourItem: "Tu artículo", @@ -2467,7 +2095,6 @@ module.exports = { pmHasPledged: "ha aportado", pmToYourProject: "a tu proyecto", blockchain: 'Explorador', - blockchainTitle: 'Explorador', blockchainDescription: 'Explora y visualiza los bloques de la cadena.', blockchainNoBlocks: 'No se encontraron bloques en la cadena.', blockchainStatsTitle: 'Estadísticas', @@ -2479,16 +2106,10 @@ module.exports = { blockchainBlockCarbon: 'Huella de carbono', blockchainBlockType: 'Tipo', blockchainBlockTimestamp: 'Marca de tiempo', - blockchainBlockContent: 'Bloque', - blockchainBlockURL: 'URL:', - blockchainContent: 'Bloque', - blockchainContentPreview: 'Vista previa del contenido del bloque', blockchainLatestDatagram: 'Último Datagrama', - blockchainDatagram: 'Datagrama', - blockchainDetails: 'Ver detalles del bloque', - blockchainViewBlockexplorer: "Ver en el blockexplorer", - blockchainBlockInfo: 'Información del Bloque', - blockchainBlockDetails: 'Detalles del bloque seleccionado', + blockchainDatagram: "Datagrama", + blockchainDetails: "Ver Detalles del Bloque", + blockchainViewBlockexplorer: "Vista en Blockexplorer", blockchainBack: 'Volver al Blockexplorer', banking: 'Banking', bankingTitle: 'Banking', @@ -2498,21 +2119,17 @@ module.exports = { bankRules: 'Reglas', pending: 'Pendientes', closed: 'Cerradas', - bankBack: 'Volver a Banking', bankViewTx: 'Ver Tx', bankClaimNow: 'Reclamar', bankClaimUBI: '¡Reclamar RBU!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'No hay asignaciones RBU pendientes para esta época.', bankEpoch: 'Época', bankPool: 'Fondo (esta época)', bankWeightsSum: 'Suma de pesos', - bankAllocations: 'Asignaciones', bankNoAllocations: 'No se encontraron asignaciones.', bankNoEpochs: 'No se encontraron épocas.', bankEpochAllocations: 'Asignaciones de la época', @@ -2531,9 +2148,6 @@ module.exports = { bankYourFundsMonth: "Tus fondos (este mes)", bankIndustryBalance: "Producción industrial (estimada)", bankUserBalance: 'Tu saldo', - ecoWalletNotConfigured: 'Cartera de ECOin no configurada', - editWallet: 'Editar cartera', - addWallet: 'Añadir cartera', bankAddresses: 'Direcciones', bankNoAddresses: 'No se encontraron direcciones.', bankUser: 'ID de Oasis', @@ -2558,15 +2172,7 @@ module.exports = { search: 'Buscar!', bankLocal: 'Local', bankFromOasis: 'Oasis', - bankMyAddress: 'Tu dirección', - bankRemoveMyAddress: 'Eliminar mi dirección', - bankNotRemovableOasis: 'Las direcciones no se pueden eliminar localmente', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "SIN FONDOS!", bankUbiAvailableOk: "¡DISPONIBLE!", bankUbiAvailability: "RBU (red)", @@ -2583,13 +2189,6 @@ module.exports = { shopsTitle: "Tiendas", shopDescription: "Descubre y gestiona tiendas en la red.", shopTitle: "Tienda", - shopFilterAll: "TODAS", - shopFilterMine: "MÍAS", - shopFilterRecent: "RECIENTES", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUCTOS", - shopFilterPrices: "PRECIOS", - shopFilterFavorites: "FAVORITAS", shopUpload: "Crear Tienda", shopAllSectionTitle: "Tiendas", shopMineSectionTitle: "Mis Tiendas", @@ -2606,16 +2205,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Publicar en Clearnet", - shopClearnetUnpublish: "Quitar de Clearnet", - shopClearnetUrlLabel: "URL en Clearnet", - shopClearnetWarning: "Publicar en Clearnet hace que esta tienda sea indexable por buscadores y rastreadores externos.", shopAddFavorite: "Añadir Favorito", shopRemoveFavorite: "Quitar Favorito", shopOpen: "ABIERTA", shopClosed: "CERRADA", - shopOpenShop: "Abrir Tienda", - shopCloseShop: "Cerrar Tienda", shopMakePrivate: "HACER PRIVADA (E2E)", shopMakePublic: "HACER PÚBLICA", shopProducts: "Productos", @@ -2643,8 +2236,6 @@ module.exports = { shopOrderPrice: "Precio", shopOrderBuyer: "Comprador", shopBackToShop: "Volver a la Tienda", - shopShareUrl: "URL para compartir", - shopVisitShop: "VISITAR TIENDA", marketVisitItem: "VER ARTÍCULO", shopStatus: "ESTADO", shopCreatedAt: "CREADO", @@ -2653,12 +2244,10 @@ module.exports = { shopLocation: "Ubicación", shopTags: "Etiquetas", shopVisibility: "Visibilidad", - shopImage: "Imagen", shopShortDescription: "Descripcion Corta", shopShortDescriptionPlaceholder: "Descripcion breve para las tarjetas (max 160 caracteres)", shopTitlePlaceholder: "Nombre de tu tienda", shopDescriptionPlaceholder: "Descripcion detallada de tu tienda", - shopUrlPlaceholder: "https://url-de-tu-tienda.com", shopLocationPlaceholder: "Ciudad, Pais", shopTagsPlaceholder: "etiqueta1, etiqueta2, etiqueta3", mapTitlePlaceholder: "Titulo del mapa", @@ -2675,7 +2264,6 @@ module.exports = { bankUnitMinutes: "minutos", bankUnitDays: "días", bankExchangeNoData: 'No hay datos disponibles', - bankExchangeIndex: 'Valor de ECOin (1h)', bankInflation: 'Inflación de ECOin (anual)', bankInflationMonthly: 'Inflación de ECOin (mensual)', bankExchangeChartTitle: 'Progresión del valor de ECOin a lo largo del tiempo', @@ -2689,38 +2277,17 @@ module.exports = { bankingSyncStatusOutdated: 'Desactualizado', statsTitle: 'Estadísticas', statistics: "Estadísticas", - statsInhabitant: "Estadísticas del Habitante", statsDescription: "Descubre estadísticas sobre tu red.", ALLButton: "TODO", MINEButton: "MÍAS", TOMBSTONEButton: "ELIMINADOS", - statsYou: "Tú", - statsUserId: "ID de Oasis", statsCreatedAt: "Creado el", statsYourContent: "Contenido", statsYourOpinions: "Opiniones", - statsYourTombstone: "Eliminados", - statsNetwork: "Red", - statsTotalInhabitants: "Habitantes", - statsDiscoveredTribes: "Tribus (Públicas)", - statsPrivateDiscoveredTribes: "Tribus (Privadas)", statsNetworkContent: "Contenido", - statsYourMarket: "Mercado", - statsYourJob: "Empleos", - statsYourProject: "Proyectos", - statsYourTransfer: "Transferencias", - statsYourForum: "Foros", statsNetworkOpinions: "Opiniones", - statsDiscoveredMarket: "Mercado", - statsDiscoveredJob: "Empleos", - statsDiscoveredProject: "Proyectos", - statsBankingTitle: "Banca", statsEcoWalletLabel: "Billetera ECOIN", statsEcoWalletNotConfigured: "¡No configurada!", - statsTotalEcoAddresses: "Direcciones totales", - statsDiscoveredTransfer: "Transferencias", - statsDiscoveredForum: "Foros", - statsNetworkTombstone: "Eliminados", statsBookmark: "Marcadores", statsEvent: "Eventos", statsTask: "Tareas", @@ -2742,16 +2309,12 @@ module.exports = { statsAiExchange: "IA", statsPUBs: 'PUBs', statsPost: "Publicaciones", - statsOasisID: "ID de Oasis", statsSize: "Total (tamaño)", statsBlockchainSize: "Blockchain (tamaño)", statsBlobsSize: "Blobs (tamaño)", statsActivity7d: "Actividad (últimos 7 días)", statsActivity7dTotal: "Total 7 días", statsActivity30dTotal: "Total 30 días", - statsKarmaScore: "Puntuación KARMA", - statsPublic: "Público", - statsPrivate: "Privado", day: "Día", messages: "Mensajes", statsProject: "Proyectos", @@ -2763,30 +2326,14 @@ module.exports = { statsProjectsCancelled: "Cancelados", statsProjectsGoalTotal: "Meta total", statsProjectsPledgedTotal: "Aportación total", - statsProjectsSuccessRate: "Tasa de éxito", - statsProjectsAvgProgress: "Progreso medio", - statsProjectsMedianProgress: "Progreso mediano", - statsProjectsActiveFundingAvg: "Financiación activa media", - statsJobsTitle: "Empleos", - statsJobsTotal: "Total de empleos", - statsJobsOpen: "Abiertos", - statsJobsClosed: "Cerrados", - statsJobsOpenVacants: "Vacantes abiertas", - statsJobsSubscribersTotal: "Suscriptores totales", - statsJobsAvgSalary: "Salario medio", - statsJobsMedianSalary: "Salario mediano", statsMarketTitle: "Mercado", statsMarketTotal: "Artículos totales", statsMarketForSale: "En venta", statsMarketReserved: "Reservados", statsMarketClosed: "Cerrados", statsMarketSold: "Vendidos", - statsMarketRevenue: "Ingresos", - statsMarketAvgSoldPrice: "Precio medio vendido", statsUsersTitle: "Habitantes", user: "Habitante", - statsTombstoneTitle: "Eliminados", - statsNetworkTombstones: "Eliminados en la red", statsTombstoneRatio: "Ratio de eliminados (%)", bankingUserEngagementScore: "Puntuación de KARMA", statsParliamentCandidature: "Candidaturas de parlamento", @@ -2814,30 +2361,21 @@ module.exports = { aiConfiguration: "Configurar prompt", aiPromptUsed: "Indicación", aiClearHistory: "Borrar historial de chat", - aiSharePrompt: "Añadir esta respuesta al entrenamiento colectivo?", - aiShareYes: "Sí", - aiShareNo: "No", - aiSharedLabel: "Añadida al entrenamiento", - aiRejectedLabel: "No añadida al entrenamiento", aiServerError: "La IA no ha podido responder. Inténtalo de nuevo.", aiInputPlaceholder: "¿Qué es Oasis?", typeAiExchange: "IA", aiApproveTrain: "Añadir al entrenamiento colectivo", aiRejectTrain: "No entrenar", - aiTrainPending: "Pendiente de aprobación", aiTrainApproved: "Aprobado para entrenamiento", aiTrainRejected: "Rechazado para entrenamiento", aiSnippetsUsed: "Fragmentos usados", aiSnippetsLearned: "Fragmentos aprendidos", statsAITraining: "Entrenamiento de IA", - aiApproveCustomTrain: "Entrenar con esta respuesta personalizada", aiCustomAnswerPlaceholder: "Escribe tu respuesta personalizada…", - statsAIExchanges: "Intercambio de Modelos", marketMineSectionTitle: "Tus artículos", marketCreateSectionTitle: "Crear artículo", marketUpdateSectionTitle: "Actualizar", marketAllSectionTitle: "Mercado", - marketRecentSectionTitle: "Mercado reciente", marketTitle: "Mercado", marketDescription: "Un mercado para intercambiar bienes o servicios en tu red.", marketFilterAll: "TODOS", @@ -2867,14 +2405,11 @@ module.exports = { marketItemDeadline: "Fecha límite", marketItemIncludesShipping: "¿Incluye envío?", marketItemHighestBid: "Puja más alta", - marketItemHighestBidder: "Mejor postor", marketItemStock: "Existencias", marketOutOfStock: "Sin stock", - marketItemBidTime: "Fecha de la puja", marketActionsUpdate: "Actualizar", marketUpdateButton: "Actualizar", marketActionsDelete: "Eliminar", - marketActionsSold: "Marcar como vendido", marketActionsChangeStatus: "CAMBIAR ESTADO", marketActionsBuy: "¡COMPRAR!", marketAuctionBids: "Pujas actuales", @@ -2883,21 +2418,17 @@ module.exports = { marketNoItems: "Aún no hay artículos disponibles.", marketYourBid: "Tu puja", marketCreateFormImageLabel: "Subir contenido multimedia (max: 50MB)", - marketSearchLabel: "Buscar", marketSearchPlaceholder: "Buscar por título o etiquetas", marketMinPriceLabel: "Precio mínimo", marketMaxPriceLabel: "Precio máximo", - marketSortLabel: "Ordenar por", marketSortRecent: "Más recientes", marketSortPrice: "Precio", marketSortDeadline: "Fecha límite", marketSearchButton: "Buscar", marketAuctionEndsIn: "Termina", marketAuctionEnded: "Terminó", - marketMyBidBadge: "Has pujado", marketNoItemsMatch: "No hay artículos que coincidan con tu búsqueda.", housingTitle: "Vivienda", - housingLabel: "Vivienda", housingDescriptionText: "Descubre y gestiona lugares en tu red.", modulesHousingLabel: "Vivienda", modulesHousingDescription: "Módulo para descubrir y gestionar lugares.", @@ -2941,14 +2472,7 @@ module.exports = { housingAvailableFrom: "Disponible desde", housingAvailableTo: "Disponible hasta", housingTags: "Etiquetas", - housingImages: "Fotos (tamaño máx.: 50MB cada una)", - housingRemovePhoto: "Quitar", spreadEditWarning: "Este contenido perderá sus réplicas al editarlo", - housingRemoveVideo: "Quitar vídeo", - housingAddPhoto: "Añadir foto", - housingAddVideo: "Añadir vídeo", - housingVideo: "Vídeo (tamaño máx.: 50MB)", - housingPhotos: "Fotos", housingRequests: "Solicitudes", housingRequestButton: "Solicitar", housingCancelButton: "Cancelar solicitud", @@ -3017,7 +2541,6 @@ module.exports = { jobLocationPresencial: "Presencial", jobLocationRemote: "Remoto", jobVacantsPlaceholder: "Número de vacantes", - jobSalaryPlaceholder: "Salario en ECO por 1 hora dedicada", jobImage: "Subir contenido multimedia (max: 50MB)", jobTasks: "Tareas", jobType: "Tipo de Trabajo", @@ -3027,7 +2550,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Trabajos Mejor Pagados", createJobButton: "Publicar Trabajo", - viewDetailsButton: "Ver Detalles", noJobsFound: "No se encontraron ofertas de trabajo.", jobAuthor: "Por", jobTypeFreelance: "Autónomo", @@ -3039,10 +2561,6 @@ module.exports = { jobsHoursOffered: "Horas ofrecidas", jobsHoursRequested: "Horas pedidas a cambio", jobsExchangeSkill: "Habilidad solicitada a cambio", - jobsHoursOfferedPlaceholder: "p. ej. 4", - jobsHoursRequestedPlaceholder: "p. ej. 4", - jobsExchangeSkillPlaceholder: "p. ej. carpintería, diseño", - jobExchangeHint: "Para trabajos de intercambio de horas, rellena los campos siguientes en vez del salario.", jobTimePartial: "Parcial", jobTimeComplete: "Completo", jobsDeleteButton: "ELIMINAR", @@ -3050,28 +2568,17 @@ module.exports = { jobsFilterApplied: "CANDIDATURA", jobsAppliedTitle: "Mis candidaturas", jobsAppliedBadge: "Inscrito", - jobsFilterFavs: "Favoritos", - jobsFavsTitle: "Favoritos", - jobsFilterNeeds: "Necesita ayuda", - jobsNeedsTitle: "Necesita ayuda", - jobsSearchLabel: "Buscar", jobsSearchPlaceholder: "Buscar por título, tags, descripción...", jobsMinSalaryLabel: "Salario mín.", jobsMaxSalaryLabel: "Salario máx.", - jobsSortLabel: "Ordenar por", jobsSortRecent: "Más recientes", jobsSortSalary: "Mayor salario", jobsSortSubscribers: "Más candidatos", jobsSearchButton: "Buscar", - jobsFavoriteButton: "Favorito", - jobsUnfavoriteButton: "Quitar favorito", - jobsMessageAuthorButton: "MP", jobsApplicants: "Candidatos", jobsUpdatedAt: "Actualizado", jobSetOpen: "Marcar abierto", - jobNewBadge: "NUEVO", jobsTagsLabel: "Etiquetas", - jobsTagsPlaceholder: "etiqueta1, etiqueta2, etiqueta3", noJobsMatch: "No hay ofertas que coincidan con tu búsqueda.", industrySearchPlaceholder: "Buscar fábricas…", industryAllSectors: "Todos los sectores", @@ -3079,9 +2586,7 @@ module.exports = { industryAdvanceTo: "Cambiar a", industryAmount: "Cantidad", industryApproveBuild: "Aprobar", - industryBackToFacility: "← Fábrica", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Blueprint de Industria", industryBlueprints: "Blueprints", industryBuild: "Build", industryBuildNotes: "Notas", @@ -3094,18 +2599,13 @@ module.exports = { industryBuilds: "Builds", industryBuildTitle: "Título", industryContribute: "Contribuir", - industryContributeEco: "Contribuir ECO", - industryContributeLabor: "Contribuir trabajo", industryContributeButton: "Contribuir", - industryContributeMaterial: "Contribuir material", industryContributions: "Contribuciones", - industryContributors: "colaboradores", industryCreateBlueprintButton: "Crear blueprint", industryDistribute: "Distribuir", industryDistributeButton: "Distribuir por cuotas", industryDistribution: "Distribución", industryEcoAmount: "Cantidad (ECO)", - industryEcoContribHint: "Las contribuciones en ECO se transfieren al mayordomo como custodio de la tesorería del build.", industryEditBlueprint: "Editar blueprint", industryFacility: "Fábrica", industryKindLabel: "Tipo", @@ -3114,13 +2614,10 @@ module.exports = { industryKind_eco: "Fondos", industryLaborHours: "Mano de obra (horas)", industryHours: "Horas", - industryLicense: "Licencia", industryMaterialItem: "Material", industryMaterials: "Materiales", - industryMaterialsHint: "Un material por línea, con el formato nombre:cantidad:precio.", industryEstMaterials: "Total materiales", industryEstLabor: "Total mano de obra", - industryEstTaxes: "Tasas", industryEstTotal: "Precio estimado", industryBuildingPrice: "Precio de construcción", industryFinalPrice: "Precio final", @@ -3130,19 +2627,13 @@ module.exports = { industryNewBlueprint: "Nuevo blueprint", industryNewBuild: "Proponer un build", industryEditBuild: "Editar producción", - industryNoBlueprint: "— ninguno —", industryNeedBlueprint: "Crea primero un plano: cada producción fabrica uno.", industryNoBlueprints: "Aún no hay blueprints.", industryNoBuilds: "Aún no hay builds.", industryNote: "Nota", industryOutput: "Salida", - industryOutputItem: "Nombre del producto", industryOutputKind: "Tipo de producto", - industryOutputQty: "Unidades por producción", - industryOutputUnit: "Unidad de medida", industryOutputValue: "Valor de salida (ECO, p. ej. de la venta)", - industryPayout: "Pago", - industryPoints: "Karma", industryPostJob: "Crear Trabajo", industryPot: "Bote", industryProposeBuildButton: "Proponer build", @@ -3150,8 +2641,6 @@ module.exports = { industryAuthor: "Autor", industrySellOnMarket: "Enviar al Mercado", industrySendToProjects: "Crear Proyecto", - industryShare: "Cuota", - industryShares: "Cuotas", industrySkills: "Habilidades", industryTreasury: "Tesorería", industryKind_physical: "Físico", @@ -3165,6 +2654,16 @@ module.exports = { industryBuildStatus_FAILED: "FALLIDO", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Un empleo encaja con tu currículum", + jobsBotMatchIntro: "Un empleo encaja con tu currículum.", + jobsBotMatchJob: "Empleo", + jobsBotMatchHint: "Recibes esto porque tu currículum está gestionado por IA. Puedes desactivarlo en tu CV.", + cvAiManaged: "Gestionado por IA", + switchOn: "ACTIVADO", + switchOff: "DESACTIVADO", + cvAiManagedHint: "Si está activo, JobsBot te avisa por mensaje privado cuando un empleo encaja con tu currículum.", + cvMatchThreshold: "Avisarme a partir de este nivel de coincidencia", housingBotRequestedTitle: "Alguien ha solicitado uno de tus lugares.", housingBotCancelledTitle: "Se ha cancelado una solicitud sobre uno de tus lugares.", housingBotYouRequestedTitle: "Has solicitado un lugar.", @@ -3193,22 +2692,14 @@ module.exports = { industryRulesDistribution: "Cuando una producción se completa, el steward reparte el fondo (los fondos de la producción más el valor de venta) entre quienes contribuyeron, en proporción a su participación.", industryRulesTreasury: "Las aportaciones en ECO las custodia el mayordomo como tesorería del build hasta el reparto; todos los movimientos quedan registrados en la red y las disputas pueden ir a Courts.", industryJobs: "Empleos", - industryNoJobs: "Aún no hay puestos.", - industryCreatePosition: "Crear puesto", - industryViewCV: "CV", industryReportButton: "Reportar", industryCreateTask: "Crear Tarea", industryOpenDispute: "Abrir disputa", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "p. ej. unidad, kg, licencia", - industryOutputItemPlaceholder: "p. ej. robot", - industryOutputQtyPlaceholder: "p. ej. 5", - industrySkillsPlaceholder: "p. ej. soldadura, redes, instalación-solar", industryCreateInvite: "Generar invitación", industryPauseVotes: "Votos de estado", industryTitle: "Industria", industryDescription: "Módulo para gestionar los medios de producción de forma colectiva.", - industryLabel: "Industria", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "DISTRIBUCIÓN", @@ -3257,9 +2748,7 @@ module.exports = { industryInviteNeeded: "Necesitas una invitación para unirte.", industryPauseButton: "Votar pausar", industryResumeButton: "Votar reanudar", - industryEditButton: "Editar", industryDeleteButton: "Eliminar", - industryBackToList: "← Industria", industryPendingApplicants: "Solicitudes pendientes", industryVotesYes: "sí", industryVotesNo: "no", @@ -3267,23 +2756,13 @@ module.exports = { industryAdmit: "Admitir", industryReject: "Rechazar", industryDissolveTitle: "Disolver fábrica", - industryDissolveHint: "La disolución requiere un voto colectivo; el mayordomo no puede disolverla en solitario.", industryDissolveVote: "Votar disolución", - industrySector_software: "Software", - industrySector_hardware: "Hardware", - industrySector_agriculture: "Agricultura", - industrySector_textile: "Textil", - industrySector_energy: "Energía", - industrySector_food: "Alimentación", - industrySector_construction: "Construcción", - industrySector_media: "Medios", - industrySector_services: "Servicios", - industrySector_other: "Otro", industryPolicy_open: "Abierta", industryPolicy_vote: "Por voto", industryPolicy_invite: "Solo invitación", projectsTitle: "Proyectos", projectsDescription: "Crea, financia y sigue proyectos impulsados por la comunidad en tu red.", + projectSearchPlaceholder: "Buscar proyectos...", projectCreateProject: "Crear Proyecto", projectCreateButton: "Crear Proyecto", projectUpdateButton: "ACTUALIZAR", @@ -3327,14 +2806,8 @@ module.exports = { projectPledgeTitle: "Apoya este proyecto", projectPledgePlaceholder: "Cantidad en ECO", projectBounties: "Recompensas", - projectBountiesInputLabel: "Recompensas (una por línea: Título|Cantidad [ECO]|Descripción)", - projectBountiesPlaceholder: "Arreglar error en UI|100|Enlace al problema\nEscribir documentación|250|Ejemplos de uso", projectNoBounties: "No se encontraron recompensas.", projectTitle: "Título", - projectAddBountyTitle: "Añadir nueva recompensa", - projectBountyTitle: "Título de la recompensa", - projectBountyAmount: "Cantidad (ECO)", - projectBountyDescription: "Descripción", projectMilestoneSelect: "Seleccionar hito", projectBountyCreateButton: "Crear recompensa", projectBountyStatus: "Estado de la recompensa", @@ -3349,19 +2822,15 @@ module.exports = { projectMilestoneTitle: "Título del hito", projectMilestoneTargetPercent: "Porcentaje (%)", projectMilestoneDueDate: "Fecha", - projectMilestoneCreateButton: "Crear hito", projectMilestoneStatus: "Estado del hito", projectMilestoneOpen: "abierto", projectMilestoneDone: "completado", projectMilestoneDue: "debido", - projectNoMilestones: "No se encontraron hitos.", projectMilestoneMarkDone: "Marcar como hecho", projectMilestoneTitlePlaceholder: "Ingresa el título del hito", projectMilestoneDescriptionPlaceholder: "Ingresa la descripción de este hito", projectMilestoneDescription: "Descripción del hito", - projectBudgetGoal: "Presupuesto (Objetivo)", projectBudgetAssigned: "Asignado a recompensas", - projectBudgetRemaining: "Restante", projectBudgetOver: "⚠ Presupuesto excedido: lo asignado supera el objetivo", projectFollowers: "Seguidores", projectFollowersTitle: "Seguidores", @@ -3374,7 +2843,6 @@ module.exports = { projectBackersTotalPledged: "Total aportado", projectBackersYourPledge: "Tu aportación", projectBackersNone: "Aún no hay aportaciones.", - projectNoRemainingBudget: "No queda presupuesto.", projectFilterBackers: "MECENAS", projectFilterApplied: "APORTANDO", projectAppliedTitle: "APORTANDO", @@ -3383,30 +2851,15 @@ module.exports = { projectBackerAmount: "Total aportado", projectBackerPledges: "Aportaciones", projectBackerProjects: "Proyectos", - projectPledgeAmount: "Cantidad", projectSelectMilestoneOrBounty: "Seleccionar Hito o Recompensa", projectPledgeButton: "Aportar", footerLicense: "GPLv3", - footerPackage: "Paquete", - footerVersion: "Versión", modulesModuleName: "Nombre", modulesModuleDescription: "Descripción", modulesModuleStatus: "Estado", modulesTotalModulesLabel: "Módulos Cargados", modulesEnabledModulesLabel: "Habilitados", modulesDisabledModulesLabel: "Deshabilitados", - modulesPopularLabel: "Popular", - modulesPopularDescription: "Módulo para recibir publicaciones que son tendencia, más vistas o más comentadas.", - modulesTopicsLabel: "Temas", - modulesTopicsDescription: "Módulo para recibir categorías de discusión basadas en intereses compartidos.", - modulesSummariesLabel: "Resúmenes", - modulesSummariesDescription: "Módulo para recibir resúmenes de discusiones o publicaciones largas.", - modulesLatestLabel: "Últimos", - modulesLatestDescription: "Módulo para recibir las publicaciones y discusiones más recientes.", - modulesThreadsLabel: "Hilos", - modulesThreadsDescription: "Módulo para recibir conversaciones agrupadas por tema o pregunta.", - modulesMultiverseLabel: "Multiverso", - modulesMultiverseDescription: "Módulo para recibir contenido de otros pares federados.", modulesInvitesLabel: "Invitaciones", modulesInvitesDescription: "Módulo para gestionar y aplicar códigos de invitación.", modulesWalletLabel: "Cartera", @@ -3451,8 +2904,12 @@ module.exports = { modulesOpinionsDescription: "Módulo para descubrir y votar opiniones.", modulesTransfersLabel: "Transferencias", modulesTransfersDescription: "Módulo para descubrir y gestionar contratos inteligentes (transferencias).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Gestiona tus otras cuentas del fediverso, incluyendo enviar y recibir contenido.", + modulesFediverseLabel: "Multiverso", + modulesBlogsLabel: "Blogs", + modulesBlogsDescription: "Módulo para descubrir y gestionar blogs.", + modulesPollsLabel: "Encuestas", + modulesPollsDescription: "Módulo para preguntar a la red y contar las respuestas.", + modulesFediverseDescription: "Gestiona tus otras cuentas del multiverso, incluyendo enviar y recibir contenido.", modulesFeedLabel: "Feed", modulesFeedDescription: "Módulo para descubrir y compartir textos breves (feeds).", modulesPixeliaLabel: "Pixelia", @@ -3484,37 +2941,33 @@ module.exports = { visibilityMakeHidden: "Hacer oculta", invitesInhabitantsTitle: "Habitantes", invitesInhabitantsFollow: "Seguir", - aiNavPlaceholder: "¿A dónde quieres ir?", + aiNavPlaceholder: "Describe qué necesitas...", aiNavDisabled: "La navegación con IA está desactivada.", - aiNavResultsTitle: "Sugerencias de navegación", + aiNavResultsTitle: "Sugerencias AINav", aiNavQueryLabel: "Consulta", - aiNavResultsDescription: "Elige la ruta que mejor se ajuste a lo que buscas.", - aiNavResultPath: "Ruta", - aiNavResultDescription: "Qué puedes hacer", aiNavResultMatch: "Coincidencia", aiNavResultsEmpty: "No hay rutas coincidentes. Prueba con /search.", - aiNavSearchInstead: "Buscar en su lugar", modulesAINavLabel: "AINav", modulesAINavDescription: "Módulo para realizar peticiones en lenguaje natural sobre el contenido de la red.", - directConnect: "Conexión Directa", directConnectDescription: "Conéctate directamente a un nodo introduciendo su dirección IP, puerto y clave pública. El nodo se añadirá como conexión seguida.", peerHost: "IP", peerPort: "Puerto (por defecto: 8008)", peerPublicKey: "Clave Pública (@...ed25519)", connectAndFollow: "Conectar", - deviceSourceLabel: "Dispositivo", modulesPresetTitle: "Configuraciones Comunes", - modulesPreset_minimal: "Mínimo", - modulesPreset_basic: "Básico", - modulesPreset_social: "Social", - modulesPreset_economy: "Economía", - modulesPreset_full: "Completo", + workflowsTitle: "Workflows", + workflowsDescription: "Un workflow fija el tema y qué módulos están activos.", + workflowsSet: "Aplicar workflow", + workflow_default: "Por defecto", + workflow_jobs: "Empleo", + workflow_ruling: "Gobierno", + workflow_politics: "Política", + workflow_social: "Social", + workflow_business: "Negocios", + workflow_night: "Noche", + workflow_mobile: "Móvil", statsCarbonFootprintTitle: "Huella de Carbono", - statsCarbonFootprintNetwork: "Huella de carbono de la red", - statsCarbonFootprintYours: "Tu huella de carbono", statsCarbonTombstone: "Huella del tombstoning", - feedSuccessMsg: "¡Feed publicado correctamente!", - dominantOpinionLabel: "Opinión predominante", uploadMedia: "Subir contenido multimedia (max: 50MB)", invitesUnfollow: "Dejar de seguir", invitesFollow: "Seguir", @@ -3522,7 +2975,11 @@ module.exports = { invitesNoUnfollowed: "No hay pubs no federados.", reportsWhyInappropriateLabel: "¿Por qué es inapropiado?", blockchainContentDeleted: "Este contenido ha sido eliminado", - visitContent: "Visitar contenido", + visitContent: "Visitar Contenido", + favoriteAdd: "Fijar en Favoritos", + pmContentTooltip: "Enviar un Mensaje Privado", + favoriteRemove: "Quitar de Favoritos", + reportContent: "Reportar Contenido", bankEcoinHours: "Equivalencia ECOin en tiempo", mapsLabel: "Mapas", mapTitle: "Mapas", @@ -3550,14 +3007,13 @@ module.exports = { mapDescriptionLabel: "Descripción", mapDescriptionPlaceholder: "Describe el mapa o ubicación...", mapTypeLabel: "Tipo de mapa", - mapTypeSingle: "ÚNICO (solo ubicación inicial)", - mapTypeOpen: "ABIERTO (cualquiera añade marcadores)", - mapTypeClosed: "CERRADO (solo el creador añade marcadores)", + mapInviteMode: "Invitación", + mapTypeSingle: "ÚNICO", + mapTypeOpen: "ABIERTO", + mapTypeClosed: "CERRADO", mapTagsLabel: "Etiquetas", mapTagsPlaceholder: "Introduce etiquetas separadas por comas", mapUrlLabel: "URL del mapa", - mapPickCoordLabel: "O selecciona una ubicación en la cuadrícula:", - mapMarkersLabel: "marcadores", mapMarkersTitle: "Marcadores", mapMarkerDefault: "Marcador", mapMarkerLatLabel: "Latitud del marcador", @@ -3571,8 +3027,6 @@ module.exports = { mapApplyZoom: "Aplicar Zoom", mapSearchPlaceholder: "Buscar descripción, etiquetas, autor...", mapSearchButton: "Buscar", - mapClickToCreate: "Haz click en el mapa para seleccionar ubicación", - mapClickToAddMarker: "Haz click en el mapa para añadir un marcador", mapUpdatedAt: "Actualizado", mapNoMatch: "Ningún mapa coincide con tu búsqueda.", noMaps: "No hay mapas disponibles.", @@ -3586,14 +3040,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pads", modulesPadsDescription: "Módulo para gestionar editores de texto colaborativos.", - padFilterAll: "TODOS", - padFilterMine: "MÍO", - padFilterRecent: "RECIENTE", - padFilterOpen: "ABIERTO", - padFilterClosed: "CERRADO", padCreate: "Crear Pad", - padUpdate: "Actualizar Pad", - padDelete: "Eliminar Pad", + padUpdate: "Actualizar", + padDelete: "Eliminar", padTitleLabel: "Título", padTitlePlaceholder: "Escribe el título del pad...", padStatusLabel: "Estado", @@ -3604,14 +3053,7 @@ module.exports = { padTagsLabel: "Etiquetas", padTagsPlaceholder: "etiqueta1, etiqueta2, ...", padMembersLabel: "Miembros", - padVisitPad: "Visitar Pad", - padShareUrl: "Compartir URL", padCreated: "Creado", - padAuthor: "Autor", - padGenerateCode: "Generar Código", - padInviteCodeLabel: "Código de Invitación", - padInviteCodePlaceholder: "Introduce el código de invitación...", - padValidateInvite: "Validar", padStartEditing: "¡EMPEZAR A EDITAR!", padEditorPlaceholder: "Empieza a escribir...", padSubmitEntry: "Enviar", @@ -3624,12 +3066,11 @@ module.exports = { padClosedSectionTitle: "Pads Cerrados", padCreateSectionTitle: "Crear Nuevo Pad", padUpdateSectionTitle: "Actualizar Pad", - padInviteGenerated: "Código de Invitación Generado", typePad: "PADS", padNew: "NUEVO", padAddFavorite: "Añadir a Favoritos", padRemoveFavorite: "Quitar de Favoritos", - padClose: "Cerrar Pad", + padClose: "Cerrar", padBackToEditor: "Volver al editor", padSearchPlaceholder: "Buscar pads...", @@ -3638,12 +3079,6 @@ module.exports = { modulesCalendarsLabel: "Calendarios", modulesCalendarsDescription: "Módulo para descubrir y gestionar calendarios.", typeCalendar: "CALENDARIOS", - calendarFilterAll: "TODOS", - calendarFilterMine: "MÍOs", - calendarFilterOpen: "ABIERTOS", - calendarFilterClosed: "CERRADOS", - calendarFilterRecent: "RECIENTES", - calendarFilterFavorites: "FAVORITOS", calendarCreate: "Crear Calendario", calendarUpdate: "Actualizar", calendarDelete: "Eliminar", @@ -3656,24 +3091,17 @@ module.exports = { calendarTagsLabel: "Etiquetas", calendarTagsPlaceholder: "etiqueta1, etiqueta2...", calendarParticipantsLabel: "Participantes", - calendarParticipantsCount: "Participantes", - calendarVisitCalendar: "Ver Calendario", calendarCreated: "Creado", - calendarAuthor: "Autor", calendarJoin: "Unirse al Calendario", calendarGenerateInvite: "Generar invitación", - calendarInviteCodePlaceholder: "Introduce código...", - calendarValidateInvite: "Validar código", - calendarJoined: "Unido", - calendarAddDate: "Añadir Fecha", - calendarAddNote: "Añadir Nota", calendarDateLabel: "Fecha", calendarDatePlaceholder: "Describe esta fecha...", - calendarNoteLabel: "Nota", + calendarNoteLabel: "Notas", calendarNotePlaceholder: "Añadir una nota...", calendarFirstDateLabel: "Fecha", calendarFirstNoteLabel: "Notas", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Sin repetición", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3684,8 +3112,6 @@ module.exports = { calendarsDescription: "Descubre y gestiona calendarios en tu red.", calendarMonthPrev: "\u2190 Anterior", calendarMonthNext: "Siguiente \u2192", - calendarMonthLabel: "Fechas", - calendarsShareUrl: "URL para compartir", calendarAllSectionTitle: "Calendarios", calendarRecentSectionTitle: "Calendarios Recientes", calendarFavoritesSectionTitle: "Favoritos", @@ -3699,7 +3125,6 @@ module.exports = { calendarRemoveFavorite: "Quitar de Favoritos", calendarSearchPlaceholder: "Buscar calendarios...", calendarAddEntry: "Añadir Entrada", - calendarLeave: "Salir del Calendario", statsCalendar: "Calendarios", statsCalendarDate: "Fechas de Calendario", statsCalendarNote: "Notas de Calendario", @@ -3708,8 +3133,6 @@ module.exports = { modulesChatsDescription: "Módulo para descubrir y gestionar chats cifrados.", typeChat: "CHATS", typeChatMessage: "MENSAJE DE CHAT", - chatLabel: "CHATS", - chatMessageLabel: "MENSAJES DE CHAT", chatsTitle: "Chats", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3717,56 +3140,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Descripción", - chatMessageReply: "Respuesta", - chatMessageLabel: "Mensaje", chatCategory: "Categoría", chatStatus: "ESTADO", - chatFilterAll: "TODOS", - chatFilterMine: "MÍO", - chatFilterRecent: "RECIENTE", - chatFilterFavorites: "FAVORITOS", - chatFilterOpen: "ABIERTO", - chatFilterClosed: "CERRADO", chatCreate: "Crear Chat", - chatUpdate: "Actualizar Chat", - chatDelete: "Eliminar Chat", + chatUpdate: "Actualizar", + chatDelete: "Borrar", chatClose: "Cerrar Chat", chatVisitChat: "VER CHAT", chatUntitled: "Chat sin título", chatNoItems: "No se encontraron chats.", chatParticipants: "Participantes", - chatStartChatting: "¡EMPEZAR A CHATEAR!", - chatGenerateCode: "Generar Código", - chatShareUrl: "Compartir URL", + chatMessagesLabel: "Mensajes", + chatThreadsLabel: "Hilos", chatCreatedAt: "CREADO", chatSearchPlaceholder: "Buscar chats...", chatStatusOpen: "ABIERTO", chatStatusInviteOnly: "SOLO INVITADOS", chatStatusClosed: "CERRADO", chatSendMessage: "Enviar", + chatJumpLatest: "Último Mensaje", + chatPickChat: "Elige un chat para abrirlo", + chatNoneYet: "No existe ningún chat disponible, todavía.", + activitySearchPlaceholder: "Buscar en la actividad...", + trendingSearchPlaceholder: "Buscar en tendencias...", + opinionsSearchPlaceholder: "Buscar en opiniones...", + votesSearchPlaceholder: "Buscar en votaciones...", + welcomeStepUxTitle: "Elige tu interfaz", + welcomeStepUxText: "Decide cómo se ve Oasis. Podrás cambiarlo después en Ajustes.", + welcomeStepUxAction: "Usar esta vista", + chatRateLimitTitle: "Demasiados mensajes", + chatRateLimitMessage: "Has alcanzado el límite de mensajes que esta sala acepta en una hora. Inténtalo más tarde.", chatMessagePlaceholder: "Escribe tu mensaje...", chatNoMessages: "Sin mensajes aún.", - chatLeave: "Salir del Chat", - chatInviteCodeLabel: "Introduce el código de invitación", - chatJoinByInvite: "Unirse", chatTitlePlaceholder: "Título del chat", chatDescriptionPlaceholder: "Descripción del chat", chatTagsPlaceholder: "etiqueta1, etiqueta2", chatImageLabel: "Selecciona un archivo de imagen (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Código de Invitación", chatAuthor: "Autor", - chatCreated: "Creado", chatAddFavorite: "Añadir a Favoritos", chatRemoveFavorite: "Quitar de Favoritos", chatPM: "MP", chatStatusLabel: "Estado", chatCategoryLabel: "Categoría", - chatParticipantsLabel: "Participantes", gamesTitle: "Juegos", gamesDescription: "Descubre y juega algunos juegos.", gamesFilterAll: "TODOS", gamesPlayButton: "¡JUGAR!", - gamesBackToGames: "Volver a Juegos", modulesGamesLabel: "Juegos", modulesGamesDescription: "Módulo para descubrir y jugar algunos juegos.", modulesGraphosLabel: "Graphos", @@ -3783,8 +3202,6 @@ module.exports = { gamesArkanoidDesc: "Rompe todos los ladrillos con tu paleta y pelota. Un clásico desafío arcade.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Ping-pong clásico contra una IA. El primero en llegar a 5 puntos gana.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "¡Corre contra el tiempo! Esquiva el tráfico y llega a la meta antes de que se acabe el tiempo.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Pilota tu nave por un campo de asteroides mortal. Dispárales antes de que te alcancen.", gamesRockPaperScissorsTitle: "Piedra Papel Tijeras", @@ -3805,8 +3222,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3855,7 +3270,6 @@ module.exports = { torrentSortOldest: "Más antiguos", torrentSortTop: "Más votados", torrentNoMatch: "No se encontraron torrents coincidentes.", - torrentMessageAuthorButton: "Enviar Mensaje al Autor", torrentUpdatedAt: "Actualizado", statsTorrent: "Torrents", typeTorrent: "TORRENTS", @@ -3863,10 +3277,18 @@ module.exports = { modulesTorrentsDescription: "Módulo para descubrir y gestionar torrents.", favoritesFilterTorrents: "TORRENTS", favoritesFilterMarket: "MERCADO", + favoritesFilterEvents: "EVENTOS", + favoritesFilterForum: "FORO", + favoritesFilterHousing: "VIVIENDA", + favoritesFilterJobs: "EMPLEOS", + favoritesFilterProjects: "PROYECTOS", + favoritesFilterReports: "INFORMES", + favoritesFilterTasks: "TAREAS", + favoritesFilterTransfers: "TRANSFERENCIAS", + favoritesFilterVotes: "VOTACIONES", favoritesFilterShopProducts: "ARTÍCULOS DE TIENDA", tribeSectionTorrents: "TORRENTS", tribeCreateTorrent: "Subir Torrent", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Deseo", settingsWishDesc: "Configura el deseo de tu Avatar. Determina cómo accedes a todo el contenido y tu experiencia en la red Oasis.", settingsWishWhole: "Multiverse", @@ -3877,16 +3299,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "El envío es una barrera de UX. La recepción es un filtro de atención (el cifrado ya está replicado).", - pmBlockedNonMutual: "Solo puedes enviar mensajes privados a habitantes con apoyo mutuo.", inhabitantsPendingFollowsTitle: "Solicitudes de apoyo pendientes", inhabitantsPendingAccept: "Aceptar", inhabitantsPendingReject: "Rechazar", - bxEncrypted: "CIFRADO", - bxEncryptedHexLabel: "Texto cifrado (vista previa)", tribeSectionGovernance: "GOBIERNO", - tribeSubStatusPublic: "PÚBLICA", - tribeSubStatusPrivate: "PRIVADA", - tribeSubInheritedPrivate: "PRIVADA (heredada de la tribu principal)", tribePadInviteRequired: "No tienes acceso al pad. Pide una invitación para acceder al contenido.", tribeChatInviteRequired: "No tienes acceso al chat. Pide una invitación para acceder al contenido.", tribeGovernanceDesc: "Gobierno interno de esta tribu.", @@ -3926,44 +3342,31 @@ module.exports = { tribeGovNoHistorical: "Aún no hay ningún registro", logsTitle: "Bitácora", logsDescription: "Registra tu experiencia en la red.", - logsReadMore: "Leer más", logsViewTitle: "Bitácora", logsColumnType: "Tipo", logsView: "Ver", - logsManualPrompt: "Escribe tu bitácora", logsUpdateButton: "Actualizar", - logsEditTitle: "Editar entrada", - logsCreateDescription: "Registra tu experiencia...", + logsEditTitle: "Actualizar registro", logsCreateTitle: "Crear entrada", logsWriteButton: "Escribir", logsTextPlaceholder: "Describe tus experiencias...", - logsTextField: "Texto", - logsLabelPlaceholder: "Etiqueta...", - logsLabelField: "Escribe tu bitácora (etiqueta)", - logsAiDisabledWarn: "Activa el módulo de IA en /modules para usar entradas escritas por IA.", - logsAiContextValue: "Día de blockchain", - logsAiContext: "Contexto", - logsAiModStatus: "AImod", - logsModeApply: "¡Aplicar!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manual", logsModeAI: "IA", - logsColumnDelete: "Eliminar", - logsColumnEdit: "Editar", logsColumnLog: "Bitácora", logsColumnDate: "Fecha", logsDelete: "Eliminar", - logsEdit: "Editar", + logsEdit: "Actualizar", logsFilterAlways: "SIEMPRE", logsFilterYear: "ÚLTIMO AÑO", logsFilterMonth: "ÚLTIMO MES", logsFilterWeek: "ÚLTIMA SEMANA", logsFilterToday: "HOY", - logsFilterRecent: "RECIENTES", - logsFilterAll: "TODOS", + logsComments: "Comentarios", + logsAuthorEntries: "Entradas", logsCreate: "Crear entrada", logsExport: "Exportar bitácora", - logsExportOne: "Exportar", + logsExportOne: "Exportar registro", logsViewDetails: "Ver detalles", logsGenerateButton: "Generar texto", logsSearchText: "Buscar en bitácoras...", @@ -3973,31 +3376,25 @@ module.exports = { modulesLogsLabel: "Bitácora", modulesLogsDescription: "Módulo para registrar (vía asistente de IA) tus experiencias.", statsLogsTitle: "Bitácora", - statsLogsEntries: "Entradas", typeLog: "BITÁCORA", - blockchainCycle: "Ciclo", larpTitle: "L.A.R.P.", larpDescription: "Una capa de juego de rol en vivo para la experimentación colaborativa.", + larpNoHousesMatch: "Ninguna casa coincide con tu búsqueda.", + larpSearchPlaceholder: "Buscar casas...", larpAllHouses: "Casas:", larpFilterRuling: "RIGE", larpFilterHouses: "CASAS", larpFilterRules: "FAQ", larpRulesTitle: "FAQ del L.A.R.P.", - larpRulesEntryTitle: "Casa de inicio", larpRulesEntryText: "Todo habitante comienza en ACADEMIA por defecto. Desde ACADEMIA, elige una casa en el panel \"Unirse a una casa\": esto abre su test de entrada. Responde las 10 preguntas y envía. Si superas el umbral (7/10), serás admitido automáticamente en esa casa; si no, serás rechazado y permanecerás en ACADEMIA. En cualquier caso el sistema registra tu OasisID y el ciclo del intento e impide otro intento hasta que pase el enfriamiento de 30 ciclos.", - larpRulesLeaveText: "Los miembros de cualquier casa pueden volver a ACADEMIA en cualquier momento desde la página de su casa; al hacerlo se restablece su pertenencia, pero no se anula el enfriamiento del test.", - larpRulesGovernanceTitle: "Muro de gobierno", larpRulesGovernanceText: "Durante su ciclo, la casa gobernante luce la insignia \"Rige\" y es la única cuyo Muro se muestra públicamente bajo la pestaña RIGE.", - larpRulesSignTitle: "Emblema L.A.R.P.", + larpRulesWallText: "Cada casa tiene un Muro donde escriben sus miembros. El Muro de una casa es privado para la casa, salvo el de la casa gobernante y el de la ACADEMIA, que puede leer cualquiera.", larpRulesSignText: "Los habitantes pueden activarlo (en /profile/edit > Sensores) para mostrar la imagen de su casa actual como un sello en su perfil, en su tarjeta de autor y de habitante. El sello enlaza a la página de la casa.", larpPostsTitle: "Muro", larpPostsEmpty: "Aún no hay publicaciones.", - larpPostLabel: "Nueva publicación", larpPostPlaceholder: "¿Qué tiene que decir esta casa?", - larpPostPublic: "Pública (visible para cualquiera, si no solo miembros)", larpPostSubmit: "Publicar", - larpPostMembersOnly: "Solo miembros", larpCycleLabel: "Ciclo:", bankRulesArchTaxFormula: "ARCH Tax(usuario) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory", bankRulesArchTaxNote: "El impuesto ARCH refleja el coste a largo plazo de hacer crecer y mantener el archivo de la red: cuanto más antiguos sean tus datos en la red, mayor será tu parte del coste de mantenimiento.", @@ -4035,12 +3432,9 @@ module.exports = { bankTaxesLookupNote: "Introduce un ID de bloque para buscarlo en tu feed local.", bankTaxesUserNoteChipsClick: "Haz clic en cualquier chip para inspeccionar su bloque en el blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Código de invitación", larpRulesInviteEntryText: "Los miembros de las casas pueden generar códigos de invitación que dan acceso directo a la casa.", larpRulesOneHouseText: "Solo puedes pertenecer a una casa a la vez. Si no perteneces a ninguna, estás en ACADEMIA. Cada página de casa (no ACADEMIA) muestra un botón \"Salir de la Casa\" a sus miembros que restablece la pertenencia a ACADEMIA. Salir NO anula el enfriamiento del test.", - larpRulesOneHouseTitle: "Una casa cada vez", - larpRulesTestEntry: "Test WILL", - larpRulesTestEntryText: "Cada opción pondera una o varias casas; al enviar, el sistema suma los puntos y te admite automáticamente en la casa con mayor puntuación.", + larpRulesTestEntryText: "En el test WILL cada opción pondera una o más casas; al enviarlo, el sistema suma las puntuaciones y te admite automáticamente en la casa con más puntos.", larpWillTestHint: "Una vez completado, se te asignará la casa que más se ajuste a tus respuestas. Tus respuestas individuales se procesan localmente y nunca se almacenan — solo se publica en tu feed la asignación de casa resultante.", larpWillTestTitle: "Test WILL", settingsLanDesc: "Anuncia periódicamente este peer a otras instancias de Oasis en la misma red local. Desactivar para detener las difusiones UDP.", @@ -4059,36 +3453,30 @@ module.exports = { aiExchangeMarkHelpful: "+1 útil", larpCyclesUntilRuling: "Próximo ciclo de gobierno", larpVisitTribe: "Visitar tribu", - larpGoverning: "Gobernando:", + larpStartJourney: "Comenzar el viaje", + larpGoverning: "Gobierna:", + larpStartHere: "Empieza aquí:", larpMyHouse: "Mi Casa:", larpMembersCount: "Miembros", - larpMembersTitle: "Miembros", - larpNoMembers: "Aún no hay miembros.", larpRolesLabel: "Roles", larpFunctionLabel: "Función", larpMonthLabel: "Ciclo de gobierno", larpLeaveToAcademia: "Volver a ACADEMIA", - larpAcademiaJoinTitle: "Unirse a una casa", - larpAcademiaJoinHint: "Realiza el test psicológico de perfil para que se te asigne la casa que mejor encaja contigo, o canjea un código de invitación compartido por algún miembro de una casa.", - larpTakeTestButton: "Hacer el test de perfil", + larpAcademiaJoinTitle: "Casas L.A.R.P.", larpInviteRedeem: "Unirse a la Casa", larpInviteCreate: "Generar código de invitación", larpInvitePlaceholder: "Código de invitación", larpInviteBannerTitle: "Nuevo código de invitación", larpInviteBannerHint: "Comparte este código con alguien que esté en ACADEMIA. Expira en 30 ciclos o tras un uso.", - larpTestAssignedHouse: "Casa asignada", larpTestRankingTitle: "Puntuación por casa", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Código de invitación de casa", invitesHouseJoinButton: "Unirse a la Casa", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Impuestos", bankOverviewYourTaxes: "Tus impuestos", - bankTaxesNetworkTitle: "Impuestos de la red", bankTaxesEcoTaxTitle: "ECO Tax", bankTaxesArchTaxTitle: "ARCH Tax", - bankTaxesUserTitle: "Tus impuestos", bankTaxesUserAmount: "Tu ECO tax (precio a devolver)", bankTaxesArchTaxUserAmount: "Tu ARCH tax (precio a devolver)", bankTaxesArchTaxFirstBlock: "Edad de tu primer bloque", @@ -4139,16 +3527,13 @@ module.exports = { bankRulesEcoTaxRate: "Tasa", bankRulesArchTaxRate: "Tasa", bankRulesCarbonFactor: "Factor de carbono", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "Aún no hay tombstones en la red.", blockchainBlockNotAvailable: "Este bloque no está disponible en tu feed local. Puede pertenecer a un peer del que aún no replicas.", blockchainBackToBlockexplorer: "Volver al blockexplorer", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", - audioTranscodeTitle: "Transcode BCS", audioTranscodeDetailTitle: "Transcodificar", audioTranscodeDetailDescription: "Decodifica la carga útil incrustada y el mapa de composición original de la blockchain.", - audioTranscodeStegoTitle: "Incrustado en la forma de onda", audioTranscodeStegoOasisId: "By", audioTranscodeStegoTimestamp: "Generado el", audioTranscodeStegoMessage: "TEXT", @@ -4156,9 +3541,7 @@ module.exports = { audioTranscodeStegoUnknown: "—", audioTranscodeStegoNotFound: "No se ha podido decodificar ninguna carga esteganográfica en este audio.", audioTranscodeCompositionEmpty: "Este audio no incluye una composición de blockchain guardada.", - audioBackToAudio: "Volver al audio", audioBackToBcs: "Volver a BCS", - audioAuthorLabel: "Autor", melodyCompositionTitle: "Mapa de composición de la blockchain", melodyFilterMine: "MINE", melodyByLabel: "Por", @@ -4172,7 +3555,6 @@ module.exports = { melodyUploadBcsNameNote: "El audio se publicará con el nombre auto-generado", larpLastAttemptTitle: "Tu último intento", larpLastAttemptHouse: "Casa", - larpLastAttemptResult: "Resultado", larpLastAttemptWhen: "Cuándo", larpLastAttemptCooldown: "Próximo intento en", larpTestTitle: "Test de entrada", @@ -4181,27 +3563,14 @@ module.exports = { larpTestCooldownActive: "Próximo test disponible en", larpTestCooldownDays: "ciclos", larpTestResultTitle: "Resultado del test", - larpTestPassed: "Test superado — ¡bienvenida!", - larpTestFailed: "Test no superado", larpTestScore: "Puntuación", larpTestNextAttempt: "Puedes intentar otro test en 30 ciclos.", larpGoToHouse: "Ir a tu casa", larpBackToAcademia: "Volver a ACADEMIA", - larpBackToHouses: "◀ Casas", larpBadgeYou: "Tú", larpBadgeRuling: "Rige", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Módulo para la capa de juego de rol en vivo de Oasis (las 9 Casas).", - melodyUploadTitlePlaceholder: "Título de la composición", - melodyUploadDescPlaceholder: "Descripción opcional", - bankTaxesUserNote: "Tu impuesto ECO se deduce del excedente que la red genera sobre tu UBI; el valor base del UBI es un mínimo inamovible. El impuesto nunca se deduce del importe fijo que corresponde a cada habitante como UBI. Los fondos deducidos alimentan el algoritmo de redistribución de la riqueza y se canalizan a otros habitantes a través de sus reclamaciones de UBI. Aquellos otros habitantes que reciban más UBI para sus proyectos probablemente tengan alguna tarea dedicada a ayudarte a reducir tu impuesto ECO. O pueden dedicarse a reducir el impuesto ECO directamente, y su contribución continua puede ser requerida por consenso de la red.", - bankTaxesArchTaxNote: "El impuesto ARCH refleja el coste de hacer crecer y mantener el archivo de la red. Se calcula a partir del tiempo transcurrido entre tu primer bloque publicado y el bloque más nuevo de la red — cuanto más viva tu historia en el archivo, mayor será tu parte del coste de mantenimiento. Al igual que el impuesto ECO, el impuesto ARCH se deduce del excedente que la red añade sobre tu UBI; el UBI base nunca se reduce por él.", - bankTaxesExample: "Ejemplo", - bankTaxesSummaryNote: "Total agregado de todos los tipos de impuestos que aplica la red. Actualmente solo el impuesto ECO (huella de carbono) está activado; futuros tipos de impuestos aparecerán como filas adicionales y contribuirán al total.", - audioTranscodeDescription: "Interpretación del audio: la composición original de la blockchain que lo produjo, además del OasisID, marca temporal y mensaje oculto incrustado en la forma de onda mediante esteganografía.", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - gameScoreLabel: "PUNTUACIONES", larpProfileQ1: "Cuando te enfrentas a un problema complejo, ¿qué haces primero?", larpProfileQ1O1: "Hablar con otras personas para buscar consenso", larpProfileQ1O2: "Construir un prototipo para probarlo", diff --git a/src/client/assets/translations/oasis_eu.js b/src/client/assets/translations/oasis_eu.js index 8d2c619..30b7521 100644 --- a/src/client/assets/translations/oasis_eu.js +++ b/src/client/assets/translations/oasis_eu.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { eu: { - languageName: "Basque", shopOrderStatusPaid: "Ordainketa jasota", shopOrderStatusReceived: "Jasota", shopOrderMarkPaid: "Markatu ordainketa jasota", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Oraindik ez duzu erosketarik.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Saltzailea", - shopOrderPaymentConcept: "Ordainketa", shopOrderInvoice: "Faktura", shopOrderInvoiceConcept: "Faktura", shopOrderStatusPending: "Zain", shopOrderStatusAccepted: "Onartua", shopOrderStatusRejected: "Baztertua", shopOrderStatusShipped: "Bidalia", - shopOrderStatusDelivered: "Entregatua", shopOrderAccept: "Onartu", shopOrderReject: "Baztertu", shopOrderMarkShipped: "Markatu bidalia", - shopOrderMarkDelivered: "Markatu entregatua", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Kontratua", shopOrderContractConcept: "Dendako eskaera", shopOrdersPending: "Eskaera zain", all: "Guztiak", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Ikusi JSON", matchScore: "Bat-egite puntuazioa", preferencesLabel: "Hobespenak", - inhabitantProfileTitle: "Biztanlearen profila", + inhabitantProfileTitle: "Biztanlea", contentWarningLabel: "Eduki abisua", invalidPost: "Eduki baliogabea", invalidPostHint: "Mezu honek testu baliogabea/hutsa du.", spreadBy: "Honek", spreadChron: "Hedapena", spreaded: "Hedatua", - spreadMore: "gehiago", spreadContentUnavailable: "Edukia oraindik ez dago eskuragarri (erreplikazioa zain)", filteredByTag: "Etiketaz iragazia", filteredByTagTitle: "Etiketaz iragazia", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Larritasunik ez", calendarDeleteDate: "Ezabatu data", calendarIntervalUntil: "Arte", - bookmarkCategory: "Kategoria", bookmarkLastVisit: "Azken bisita", profileClearnetBookmarksLabel: "Laster-markak", - forumFilterHot: "Beroa", invitesPort: "Ataka", currentlyUnrecheable: "ERROREA!", peerHostValidation: "IPv4 baliozkoa (adib. 192.168.1.100) edo ostalari-izena (adib. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Urteko gehienezko estimazioa", statsCarbonNetwork: "Sarearen guztira", statsCarbonOfEstMax: "estimatutako gehienezko ahalmenaren", + statsCarbonYearProgress: "urtea igarota", + statsNetworkTitle: "Sarea", + statsStorageTitle: "Biltegiratzea", + statsEcoTaxTitle: "ECO tasa", + statsAccountTitle: "Kontua", + statsAveragesTitle: "Batez bestekoak", statsCarbonOfNetwork: "sarearen guztizkoaren", statsCarbonUser: "Zure aztarna", statsContentCountColumn: "Kopurua", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Etiketa nagusiak", statsTopTypesTitle: "Eduki mota nagusiak", statsTotalMsgs: "Mezuak guztira", - feedViewDetails: "Ikusi xehetasunak", - eventFileLabel: "Erantsi irudia", - taskFileLabel: "Erantsi irudia", - courtsRespondentRequired: "Demandatuaren IDa beharrezkoa da", extended: "Multibertsoa", extendedDescription: [ "Norbait laguntzen duzunean, laguntzen dituzun erabiltzaileen bidalketak deskargatu ditzakezu. Mezu horiek hemen azalduko dira, dataren arabera antolatuta.", @@ -203,29 +197,22 @@ module.exports = { graphosShowing: "Erakusten", graphosYou: "Zu", graphosTotalNodes: "Nodo guztiak", - manualMode: "Eskuzko modua", mentions: "Aipamenak", mentionsDescription: [ - strong("@Aipatzen zaituzten bidalketak."), - ", gaurkotasunaren arabera antolatuta.", + strong("Zu @aipatzen zaituzten mezu guztiak"), + ".", ], - nextPage: "Hurrengoa", - previousPage: "Aurrekoa", noMentions: "Ez duzu aipamenik jaso, oraindik.", + mentionsSearchPlaceholder: "Bilatu aipamenak...", privateReminders: "OROIGARRIAK", inboxFiltersLabel: "Iragazkiak:", inboxToggleToMutuals: "Mutuora aldatu", inboxToggleToWhole: "Guztiora aldatu", - privateFrom: "Nork", - privateTo: "Nori", privateDate: "Data", peers: "Parekoak", searchDescription: "Deskribapena", - imageSearch: "Irudiak bilatu", searchFromLabel: "Hasiera", searchToLabel: "Bukaera", - searchMinOpinionsLabel: "Gutxi. iritziak", - searchInhabitantLabel: "Biztanle (Oasis ID)", searchQueryLabel: "Bilaketa", searchPerPageLabel: "Emaitzak orriko", settings: "Ezarpenak", @@ -238,68 +225,39 @@ module.exports = { melodyDescription: 'Erreproduzitu zure blockchain-aren melodia — bloke bakoitza nota bat bihurtzen da.', melodyEmpty: 'Oraindik notarik ez — zure blockchain-ak ez du oraindik blokerik sortu.', melodyCompositionTitle: 'Konposizioa', - melodyCompositionHelp: 'Zure blockchain-eko bloke bakoitza musika-nota bat bihurtzen da, motaren eta tamainaren arabera.', - melodyStatsTitle: 'Motaren araberako banaketa', - melodyInhabitantLabel: 'Biztanlea', melodyTotalBlocks: 'Notak', - melodyType: 'Mota', - melodyCount: 'Blokeak', melodyFilterMine: 'NIREA', melodyFilterAll: 'GUZTIAK', - melodyFilterShare: 'Igo melodia', - melodyShareTitle: 'Partekatu zure melodia', - melodyShareHelp: 'Argitaratu zure uneko melodiaren irudia, besteek entzun eta birmoldatu ahal izateko.', - melodyShareTitleLabel: 'Izenburua (aukerakoa)', - melodyShareTitlePlaceholder: 'Blockchain mamu bat', - melodyShareSubmit: 'Argitaratu melodia', - melodyNoShared: 'Oraindik ez dago blockchain melodiarik.', melodyRegenerate: 'Birsortu', melodyDownload: "Deskargatu BCS", - profileActivityTitle: 'Jarduera', - profileActivityMore: 'Ikusi jarduera guztia', profileContentSectionTitle: 'Avatarraren Edukia', profileContentHelp: 'Aukeratu zein modulu agertuko diren zure abatarrean.', profileSensorsHelp: 'Zure abatarrean agertzen diren aukerako metrikak.', profileClearnetHelp: 'Oasis kanpotik atzitu daitezkeen moduluak.', profileHubAll: 'Guztiak', - profileHubTitle: 'Eduki Publikoa', - footerPulseTitle: 'Pultsua', - footerPulsePeers: 'Kideak', - footerPulseInbox: 'Sarrera-ontzia', - footerPulseSync: 'Azken sinkr.', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Azken jarduera', footerLicenseLabel: 'Lizentzia', profileSwitchToOasis: 'Itzuli Oasisera', - profileSwitchToClearnet: 'Murgildu Clearneten', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Murgildu fediversoan", - coordLabel: 'Koordenatuak (Adb. A3)', - coordPlaceholder: 'Sartu koordenatuak', + profileVisibilityFediverse: "Multibertsoa", contributorsTitle: "Ekarpenak", colorLabel: 'Hautatu kolorea', paintButton: 'Koloreztatu!', - invalidCoordinate: 'Koordenatu okerrak', - goToMuralButton: "Ikusi Murala", totalPixels: 'Pixelak guztira', - pixeliaBy: "egilea", modules: "Moduluak", modulesViewTitle: "Moduluak", modulesViewDescription: "Konfiguratu zure ingurunea moduluak gaitu edo desgaituz.", inbox: "Sarrera-ontzia", multiverse: "Multibertsoa", - fediverse: "Fediverse", - fediverseDescription: "Kudeatu zure beste fediverso kontuak, edukia bidaltzea eta jasotzea barne.", + fediverse: "Multibertsoa", + fediverseDescription: "Kudeatu zure beste multibertso kontuak, edukia bidaltzea eta jasotzea barne.", fediverseStatus: "Egoera", - fediverseDisconnected: "Fediversoa deskonektatuta. Egiaztatu %LINK% edo konexioaren egoera.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multibertsoaa deskonektatuta. Egiaztatu %LINK% edo konexioaren egoera.", + fediverseSettingsTitle: "Multibertsoa", fediverseInstanceLabel: "Helbidea", fediverseTokenLabel: "Sarbide token-a", fediverseTokenHelp: "Ezarri zure sarbide token-a. Zure Mastodon kontua Oasis barrutik kudeatzeko erabiliko da.", fediverseConnect: "Konektatu", fediverseConnectedAs: "Honela konektatuta", fediverseDisconnect: "Deskonektatu", - fediverseEmpty: "Zure %LINK% beste fediverso kontu batzuk konektatzen dituzunean, hemendik kudeatu ahal izango dituzu.", fediverseEmptyLink: "ezarpenetatik", fediverseComposePlaceholder: "Zer duzu buruan?", fediverseReplyPlaceholder: "Idatzi zure erantzuna…", @@ -308,21 +266,15 @@ module.exports = { fediverseReply: "Erantzun", fediverseBoosted: "bultzatu du", fediverseNoPosts: "Zure denbora-lerroa hutsik dago.", - fediverseThread: "Haria", fediverseTimeline: "Denbora-lerroak", - fediverseManageTimeline: "Kudeatu denbora-lerroa", fediverseFollowers: "Jarraitzaileak", fediverseFollowing: "Jarraitzen", fediversePosts: "Argitalpenak", fediverseJoined: "Elkartua", - fediverseOverview: "Ikuspegi orokorra", fediverseRefresh: "Freskatu", fediverseWrite: "Idatzi", fediversePreview: "Aurrebista", - fediverseEdit: "Editatu", - fediverseOpenFeed: "Ikusi jarioa", fediverseManage: "Kudeatu", - fediverseStatusNotConnected: "Konektatu gabe", fediverseError: "Ezin izan da Mastodon-ekin konektatu.", fediverseErrInstance: "Instantzia URL baliogabea.", fediverseErrAuth: "Token baliogabea edo iraungia.", @@ -333,17 +285,6 @@ module.exports = { fediverseErrPost: "Ezin izan da argitaratu.", fediverseErrMedia: "Ezin izan da fitxategia igo.", fediverseErrEmpty: "Idatzi zerbait edo erantsi fitxategi bat.", - popularLabel: "Nabarmenak", - topicsLabel: "Gaiak", - latestLabel: "Azkena", - summariesLabel: "Laburpenak", - threadsLabel: "Hariak", - multiverseLabel: "Multibertsoa", - inboxLabel: "Sarrera-ontzia", - invitesLabel: "Gonbidapenak", - walletLabel: "Zorroa", - legacyLabel: "Gakoak", - cipherLabel: "Zifratzailea", bookmarksLabel: "Markagailuak", videosLabel: "Bideoak", torrentsLabel: "Torrentak", @@ -354,18 +295,14 @@ module.exports = { inhabitantsLabel: "Bizilagunak", trendingLabel: "Pil-pilean", eventsLabel: "Gertakariak", - tasksLabel: "Atazak", apply: "Aplikatu", menuPersonal: "Pertsonala", - menuContent: "Edukia", - menuBlogs: "Blogak", menuGovernance: "Gobernantza", menuOffice: "Bulegoa", - menuMultiverse: "Multibertsoa", - menuNetwork: "Sarea", + menuNetwork: "Komunitatea", menuCreative: "Sortzailea", menuEconomy: "Ekonomia", - menuMedia: "Multimedia", + menuMedia: "Liburutegia", menuTools: "Tresnak", comment: "Iruzkindu", subtopic: "Azpi-gaia", @@ -375,13 +312,6 @@ module.exports = { follow: "Lagundu", block: "Blokeatu", unblock: "Desblokeatu", - newerPosts: "Bidalketa berrienak", - olderPosts: "Bidalketa zaharrenak", - feedRangeEmpty: "Hautatuako tartea hutsik dago jario honentzat. Saiatu ", - seeFullFeed: "jario osoa ikusiz", - feedEmpty: "Oasis sareak ez du kontu honen bidalketarik ikusi inoiz.", - beginningOfFeed: "Jarioaren hasiera da hau", - noNewerPosts: "Ez da bidalketa berriagorik jaso oraindik.", relationshipNotFollowing: "Ez zaitu laguntzen", relationshipTheyFollow: "Laguntzen zaitu", relationshipMutuals: "Elkar laguntzen", @@ -391,16 +321,12 @@ module.exports = { relationshipBlockedBy: "Blokeatzen zaitu", relationshipMutualBlock: "Elkar blokeatzen", relationshipNone: "Ez duzu laguntzen", - relationshipConflict: "Gatazka", relationshipBlockingPost: "Blokeatutako bidalketa", viewLikes: "Ikusi zabalpenak", spreadedDescription: "Bizilagunak zabaldutako bidalketen zerrenda.", - totalspreads: "Hedapenak guztira", - attachFiles: "Erantsi fitxategiak", preview: "Aurrebista", publish: "Idatzi", contentWarningPlaceholder: "Gehitu gaia bidalketari (hautazkoa)", - privateWarningPlaceholder: "Gehitu bizilagunak mezu pribatua bidaltzeko (hautazkoa)", publishWarningPlaceholder: "Gorputza 7000 karakteretara mugatua.", publishTooLong: "Zure argitalpena luzeegia da. Laburtu ezazu, mesedez.", publishCustomDescription: [ @@ -409,8 +335,6 @@ module.exports = { commentWarning: [ "GOGORATU: Blockchain teknologia dela eta, bidalketa argitaratu ezkero, ezin izango da aldatu ezta ezabatu.", ], - commentPublic: "publikoa", - commentPrivate: "pribatua", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -430,7 +354,6 @@ module.exports = { "beharko zenuke.", ], publishCustom: "Idatzi bidalketa aurreratua", - subtopicLabel: "Bidalketa honen azpi-gaia sortu", messagePreview: "Aurreikusi bidalketa", mentionsMatching: "Bat datozen aipamenak", mentionsName: "Izena", @@ -453,24 +376,19 @@ module.exports = { ssbLogStream: "Blockchain", ssbLogStreamDescription: "Konfiguratu blockchain fluxuetarako mezu-muga.", saveSettings: "Ezarpenak gorde", - exportTitle: "Esportatu datuak", exportDescription: "Ezarri pasahitza (gutxienez 32 karaktere) zure gakoa zifratzeko", exportDataTitle: "Babeskopia", exportDataDescription: "Deskargatu zure datuak (gako sekretua izan ezik!)", exportDataButton: "Deskargatu datu-basea", - pubWallet: "PUB Wallet", - pubWalletDescription: "Ezarri PUB wallet-aren URLa. Hau PUB transakzioetarako erabiliko da (RBU barne).", - pubWalletConfiguration: "Ezarpenak gorde", - importTitle: "Inportatu datuak", importDescription: "Inportatu zifratutako sekretua (gako pribatua) zure abatarra gaitzeko", - importAttach: "Gehitu zifratutako fitxategia (.enc)", - passwordLengthInfo: "Pasahitzak 32 karaketereko luzera izan behar du.", passwordImport: "Idatzi pasahitza zure karpeta nagusian gordeko diren datuak deszifratzeko (izena: secret)", exportPasswordPlaceholder: "Erabili minuskulak, maiuskulak, zenbakiak eta sinboloak.", fileInfo: "Zure gako sekretu zifratua zure gailura deskargatuko da (izena: oasis.enc)", developer: "Garapena", devTitle: "Garapena", welcomeBannerText: "Ongi etorri OASISera. Jarraitu urrats azkar hauek zure avatarra konfiguratzeko.", + aiSuggestionBanner: "Iradokizuna:", + aiSuggestionsEnable: "AAren iradokizunak", welcomeBannerAction: "Hasi!", welcomeTitle: "Ongi etorri", welcomeStepGreetingAction: "Bidali", @@ -513,14 +431,9 @@ module.exports = { devParentFolder: "Goiko karpeta", devOpenFolder: "ireki", devDescription: "Arakatu nodo honetan exekutatzen ari den kodea.", - devTreeTitle: "Fitxategiak", - devSearchTitle: "Bilatu kodean", - devMapTitle: "Moduluak", devRoot: "erroa", - devRootButton: "ERROA", devSearchPlaceholder: "Kodean bilatzeko testua", devAnyExtension: "Edozein fitxategi", - devSearchButton: "Bilatu", devStatsFiles: "Fitxategiak", devStatsLines: "Lerroak", devStatsModules: "Moduluak", @@ -557,16 +470,13 @@ module.exports = { languageDescription: "Beste hizkuntza bat erabili nahi baduzu, hautatu hemen.", setLanguage: "Ezarri hizkuntza", - peerConnections: "Parekoak", peerConnectionsIntro: "Kudeatu beste parekoekin dituzun konexio guztiak.", peerConnectionsTitle: "Konexioak", online: "Linean", offline: "Lineaz kanpo", discovered: 'Aurkituak', unknown: 'Ezezagunak', - lanBroadcastLabel: "LAN igorpena", lanBroadcastActive: "Aktibo (UDP multicast LANean)", - lanBroadcastDisabled: "Desgaituta (pub modua)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -579,8 +489,6 @@ module.exports = { noConnections: "Konektatutako parekorik ez.", noDiscovered: "Ez duzu nodorik aurkitu.", noUnknownPeers: "Ez dago kide ezezagunik adiskidetza-grafoan.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -590,9 +498,6 @@ module.exports = { peerImport: "Inportatu", peerImportTitle: "Peer-zerrenda inportatu", peerImportPlaceholder: "Itsatsi multiserver-helbide bat lerro bakoitzeko, edo igo .txt fitxategi bat…", - noSupportedConnections: "Lagundutako parekorik ez.", - noBlockedConnections: "Blokeatutako parekorik ez.", - noRecommendedConnections: "Gomendatutako parekorik ez.", connectionActionIntro: "", startNetworking: "Abiarazi sarea", @@ -606,9 +511,19 @@ module.exports = { homePageDescription: "Hautatu nahi duzun moduluaren orria hasiera gisa.", saveHomePage: "Gorde hasierako orria", invites: "Gonbidapenak", - invitesTitle: "Gonbidapenak", - invitesInvites: "Gonbidapenak", invitesDescription: "Kudeatu eta erabili gonbidapen kodeak zure sarean.", + invitesPubsHint: "Itsatsi pub baten gonbidapen-kodea harekin federatzeko eta bere biztanleak errepikatzen hasteko.", + invitesFederationsHint: "Federatuta zauden pubak: eguneratu, kendu iritsezinak edo esportatu zerrenda.", + invitesHousesHint: "Sartu etxe-kode bat LARPeko etxe batean sartzeko eta bere ekonomian parte hartzeko.", + invitesTribesHint: "Sartu tribu-kode bat kide egiteko eta bere eduki pribatura iristeko.", + invitesChatsHint: "Sartu txat-kode bat elkarrizketara eta bere harietara batzeko.", + invitesPadsHint: "Sartu pad-kode bat besteekin batera dokumentu partekatu batean idazteko.", + invitesCalendarsHint: "Sartu egutegi-kode bat datak eta oroigarriak partekatzeko.", + invitesEventsHint: "Sartu ekitaldi-kode bat ekitaldi pribatu batera batzeko.", + invitesForumsHint: "Sartu foro-kode bat foro pribatu batean irakurri eta erantzuteko.", + invitesMapsHint: "Sartu mapa-kode bat mapa partekatu batean lekuak ikusi eta gehitzeko.", + invitesShopsHint: "Sartu denda-kode bat denda batera eta bere katalogora batzeko.", + invitesInhabitantsHint: "Sartu biztanle-kode bat elkar jarraitzeko eta edukia trukatzeko.", invitesTribesTitle: "Tribuak", invitesTribeInviteCodePlaceholder: "Sartu tribuaren gonbidapen kodea", invitesTribeJoinButton: "Sartu Tribuan", @@ -639,7 +554,6 @@ module.exports = { invitesAlreadyFederated: "Dagoeneko pub honekin federatuta zaude.", invitesFederationsTitle: "Federazioak", invitesAcceptedInvites: "Federatuak", - invitesNoInvites: "Ez da gonbidapenik onartu, oraindik.", invitesUnfollow: "Utzi jarraitzea", invitesFollow: "Jarraitu", invitesUnfollowedInvites: "Ez federatuak", @@ -659,39 +573,24 @@ module.exports = { panicMode: "Izu Modua!", encryptData: "Idatzi pasahitza (gutxienez 32 karaketere) zure blockchain-a zifratzeko.", decryptData: "Sartu pasahitza zure blockchain-a deszifratzeko.", - panicModeDescription: "Zifratu/deszifratu edo EZABATU zure blockchain-a", removeDataDescription: "KONTUZ: Prozesu hau ezin da desegin.", - encryptPanicButton: "Zifratu blockchain-a", - decryptPanicButton: "Deszifratu blockchain-a", removePanicButton: "EZABATU ZURE DATU GUZTIAK!", searchTitle: "Bilatu", searchDescriptionLabel: "Bilatu edukia zure sarean.", - searchLanguagesLabel: "Hizkuntzak", - searchSkillsLabel: "Trebetasunak", searchPlaceholder:"Bilatu edukia...", - searchDateLabel:"Data", searchLocationLabel:"Kokapena", searchPriceLabel:"Prezioa", - searchUrlLabel:"URL", searchCategoryLabel:"Kategoria", - searchStartLabel:"Hasiera ordua", - searchEndLabel:"Amaiera ordua", searchPriorityLabel:"Lehentasuna", searchStatusLabel:"Egoera", statusLabel:"Egoera", - totalVotesLabel:"Bozkak Guztira", noResultsFound:"Emaitzik ez.", votesOption:"Bozkatzeko Aukerak", voteYesLabel:"Bai", voteNoLabel:"Ez", allTypesLabel: "MUGAGABE", - ABSTENTIONLabel:"ABSTENTZIOA", YESLabel:"BAI", NOLabel:"EZ", - FOLLOW_MAJORITYLabel: "JARRAITU GEHIENGOA", - CONFUSEDLabel: "NAHASTUTA", - NOT_INTERESTEDLabel: "INTERESIK EZ", - StatusLabel:"Egoera", votesOptionYesLabel:"Bai", votesOptionNoLabel:"Ez", votesOptionAbstentionLabel:"Abstentzioa", @@ -699,7 +598,6 @@ module.exports = { votesCreatedByLabel:"Noiz", voteStatusOpen:"IREKITA", voteStatusClosed:"ITXITA", - imageSearchLabel: "Hitz hauek dituzten irudiak bilatu.", commentDescription: ({ parentUrl }) => [ " noiz komentatuta ", a({ href: parentUrl }, " haria"), @@ -710,53 +608,20 @@ module.exports = { a({ href: parentUrl }, " bidalketa bat"), ], subtopicTitle: ({ authorName }) => [`Subtopic on @${authorName}'s post`], - mysteryDescription: " bidalketa misteriotsua argitaratu du", oasisDescription: "OASIS Proiektuko Sarea", searchSubmit: "Bilatu...", - postLabel: "BIDALKETAK", - aboutLabel: "BIZILAGUNAK", - feedLabel: "JARIOAK", votesLabel: "GOBERNUA", - reportLabel: "TXOSTENAK", - imageLabel: "IRUDIAK", - videoLabel: "BIDEOAK", - audioLabel: "AUDIOAK", - documentLabel: "DOKUMENTUAK", - torrentLabel: "TORRENTAK", pdfFallbackLabel: "PDF Dokumentua", - eventLabel: "EKITALDIAK", - taskLabel: "ATAZAK", - transferLabel: "TRANSFERENTZIAK", - curriculumLabel: "KURRIKULUMA", - bookmarkLabel: "MARKAGAILUAK", - tribeLabel: "TRIBUAK", - marketLabel: "MERKATUA", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "ZORROTAK", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Bidali", - subjectLabel: "Gaia", editProfile: "Editatu Abatarra", - profileQrAlt: "Profilaren QR kodea", - profileQrHint: "Eskaneatu Oasis ID hau kopiatzeko.", oasisIdLabel: "OasisID", - spreadLabel: "Hedatu", - spreadHint: "Hedatu zure babesleei (zure feed bidez errepikatzen da).", + spreadContent: "Errepikatu", welcomePmSubject: "Hello World!", - welcomePmBody: "Ongi etorri Oasis-era — sare sozial libre, parekideen arteko, federatu eta zifratua, gonbidapen bidezko arkitektura banatu batekin.\n\nHasteko leku interesgarri batzuk:\n\n- /profile — Editatu zure avatarra, izena, deskribapena eta zein modulu agertuko diren zure alde publikoan.\n- /invites — Gehitu pub bat sarearen gainerakoarekin federatzeko.\n- /peers — Ikusi nor dagoen konektatuta, eskaneatu LAN-a berriz, esportatu edo inportatu peer-zerrendak.\n- /inhabitants — Aurkitu eta bisitatu beste pertsonen avatarrak.\n- /tribes — Sortu edo elkartu muturretik muturrera zifratutako talde pribatuetan.\n- /inbox — Irakurri eta bidali mezu pribatuak.\n- /activity — Ikusi azken jarduera, zurea eta zure sarearena.\n- /publish — Idatzi post bat edo partekatu irudia, audioa, bideoa edo dokumentua.\n- /search — Bilatu sarearen edukia motaren arabera.\n\nKonektatzeko leku interesgarri batzuk:\n\n- /fediverse — Kudeatu zure beste fediverso kontuak, edukia bidaltzea eta jasotzea barne.\n\nMezu hau zugandik zuregana modu pribatuan bidali da; horregatik ez zen konexiorik behar jasotzeko.", - profileVisibilityTitle: "Profil publikoaren ikusgaitasuna", - profileVisibilityHint: "Aukeratu zein eremu ikus ditzaketen beste biztanleek zure profilean. Lehenetsia: Karma soilik.", + welcomePmBody: "Ongi etorri Oasis-era — sare sozial libre, parekideen arteko, federatu eta zifratua, gonbidapen bidezko arkitektura banatu batekin.\n\nHasteko leku interesgarri batzuk:\n\n- /profile — Editatu zure avatarra, izena, deskribapena eta zein modulu agertuko diren zure alde publikoan.\n- /invites — Gehitu pub bat sarearen gainerakoarekin federatzeko.\n- /peers — Ikusi nor dagoen konektatuta, eskaneatu LAN-a berriz, esportatu edo inportatu peer-zerrendak.\n- /inhabitants — Aurkitu eta bisitatu beste pertsonen avatarrak.\n- /tribes — Sortu edo elkartu muturretik muturrera zifratutako talde pribatuetan.\n- /inbox — Irakurri eta bidali mezu pribatuak.\n- /activity — Ikusi azken jarduera, zurea eta zure sarearena.\n- /publish — Idatzi post bat edo partekatu irudia, audioa, bideoa edo dokumentua.\n- /search — Bilatu sarearen edukia motaren arabera.\n\nKonektatzeko leku interesgarri batzuk:\n\n- /multiverse — Kudeatu zure beste multibertso kontuak, edukia bidaltzea eta jasotzea barne.\n\nMezu hau zugandik zuregana modu pribatuan bidali da; horregatik ez zen konexiorik behar jasotzeko.", profileSensorsSectionTitle: "Sentsoreak", profileVisibilityActivity: "Jarduera-maila", - profileVisibilityDevice: "Gailua", profileDeviceLockedHint: "Sentsore hau beti dago aktibo: besteei zein gailutatik konektatzen zaren erakusten die eta ezin da desgaitu.", profileVisibilityKarma: "KARMA puntuazioa", profileVisibilityUbi: "UBI", @@ -764,7 +629,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "GPG Gakoa", - profileVisibilityClearnet: "Nire profila argitaratu", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Dendak", profileClearnetJobsLabel: "Lanak", @@ -818,7 +682,6 @@ module.exports = { " edo konexioaren egoera.", ], walletSentToLine: ({ destination, amount }) => `${amount} ECO bidali dira ${destination} helbidera`, - walletSettingsTitle: "Zorroa", walletSettingsDescription: "Integratu Oasis zure ECOin zorroarekin.", walletSettingsDocLink: "ECOin instalazio gida", walletStatusMessages: { @@ -840,37 +703,19 @@ module.exports = { cipherTitle: "Zifratzailea", cipherDescription: "Zifratu eta deszifratu testua simetrikoki (Pasahitza erabiliz).", randomPassword: "Ausazko pasahitza", - cipherEncryptTitle: "Zifratu testua", - cipherEncryptDescription: "Ezarri pasahitza (gutxienez 32 karaktereko luzera) zure testua zifratzeko", - cipherTextLabel: "Zifratuko den testua", cipherTextPlaceholder: "Idatzi zifratuko den testua...", cipherPasswordLabel: "Pasahitza", cipherPasswordDecryptLabel: "Pasahitza ezarri (gutxienez 32 karaktere) testua deszifratzeko", cipherPasswordPlaceholder: "Idatzi pasahitza...", cipherEncryptButton: "Zifratu", - cipherDecryptTitle: "Deszifratu testua", - cipherDecryptDescription: "Sartu zifratutako testua eta pasahitza, deszifratzeko.", cipherEncryptedMessageLabel: "Zifratutako testua", cipherDecryptedMessageLabel: "Deszifratutako Testua", - cipherPasswordUsedLabel: "Zifratzeko pasahitza (gorde!)", cipherEncryptedTextPlaceholder: "Sartu zifratutako testua...", - cipherIvLabel: "HB", - cipherIvPlaceholder: "Sartu hasieratzeko bektorea...", cipherDecryptButton: "Deszifratu", password: "Pasahitza", text: "Testua", encryptedText: "Zifratutako testua", iv: "Hasieratze Bektorea (HB)", - encryptTitle: "Zifratu zure testua", - encryptDescription: "Sartu zifratu nahi duzun testua eta eman pasahitz bat.", - encryptButton: "Zifratu", - decryptTitle: "Deszifratu zure testua", - decryptDescription: "Sartu zifratutako testua eta eman enkripatzeko erabili duzun pasahitz berbera.", - decryptButton: "Deszifratu", - passwordLengthError: "Pasahitzak gutxienez 32 karaketere izan behar ditu.", - missingFieldsError: "Ez da testurik, pasahitzik edo HB-rik sartu.", - encryptionError: "Errorea testua zifratzean.", - decryptionError: "Errorea testua deszifratzean.", bookmarkTitle: "Laster-markak", bookmarkDescription: "Zure sareko laster-markak aurkitu eta kudeatu.", bookmarkAllSectionTitle: "Laster-markak", @@ -896,8 +741,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Aukerakoa", bookmarkTagsLabel: "Tagak", bookmarkTagsPlaceholder: "Sartu tagak komaz banatuta", - bookmarkCategoryLabel: "Kategoria", - bookmarkCategoryPlaceholder: "Aukerakoa", bookmarkLastVisitLabel: "Azken bisita", bookmarkSearchPlaceholder: "Bilatu URLa, tagak, kategoria, egilea...", bookmarkSortRecent: "Berrienak", @@ -912,8 +755,6 @@ module.exports = { noLastVisit: "Azken bisitarik ez", videoTitle: "Bideoak", videoDescription: "Arakatu eta kudeatu zure sareko bideo-edukia.", - videoPluginTitle: "Izenburua", - videoPluginDescription: "Deskribapena", videoMineSectionTitle: "Zure bideoak", videoCreateSectionTitle: "Bideoa igo", videoUpdateSectionTitle: "Bideoa eguneratu", @@ -945,7 +786,6 @@ module.exports = { videoSortOldest: "Zaharrenak", videoSortTop: "Bozkatuenak", videoSearchButton: "Bilatu", - videoMessageAuthorButton: "MP", videoUpdatedAt: "Eguneratua", videoNoMatch: "Ez dago zure bilaketarekin bat datorren bideorik.", documentTitle: "Dokumentuak", @@ -986,8 +826,6 @@ module.exports = { documentUpdatedAt: "Eguneratua", audioTitle: "Audioak", audioDescription: "Arakatu eta kudeatu zure sareko audio-edukia.", - audioPluginTitle: "Izenburua", - audioPluginDescription: "Deskribapena", audioMineSectionTitle: "Zure audioak", audioCreateSectionTitle: "Audioa igo", audioUpdateSectionTitle: "Audioa eguneratu", @@ -998,7 +836,6 @@ module.exports = { audioFilterMine: "NIREAK", audioFilterRecent: "AZKENAK", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Audioa igo", audioUpdateButton: "Eguneratu", audioDeleteButton: "Ezabatu", @@ -1025,6 +862,7 @@ module.exports = { audioFilterFavorites: "GOGOKOAK", favoritesTitle: "Gogokoak", favoritesDescription: "Zure gogoko guztiak leku berean.", + favoritesSearchPlaceholder: "Bilatu gogokoetan...", favoritesFilterAll: "GUZTIAK", favoritesFilterRecent: "AZKENAK", favoritesFilterAudios: "AUDIOAK", @@ -1040,18 +878,13 @@ module.exports = { favoritesNoItems: "Oraindik ez dago gogokorik.", yourContacts: "Zure Kontaktuak", allInhabitants: "Bizilagunak", - allCVs: "CV guztiak", + allCVs: "CVak", discoverPeople: "Aurkitu bizilagunak zure sarean.", - allInhabitantsButton: "GUZTIAK", - contactsButton: "LAGUNTZEN", - CVsButton: "CV-ak", - matchSkills: "Aurkitu trebetasunak", - matchSkillsButton: "AURKITU TREBETASUNAK", - suggestedButton: "GOMENDATUTAKOAK", searchInhabitantsPlaceholder: "IRAGAZI bizilagunak IZENAREN ARABERA …", filterLocation: "IRAGAZI bizilagunak KOKAPENAREN ARABERA …", filterLanguage: "IRAGAZI bizilagunak BY HIZKUNTZAREN ARABERA …", filterSkills: "IRAGAZI bizilagunak BY TREBETASUNEN ARABERA …", + cvSkillsCount: "Trebetasunak", applyFilters: "Ezarri Iragazkiak", locationLabel: "Kokapena", languagesLabel: "Hizkuntzak", @@ -1060,17 +893,18 @@ module.exports = { mutualFollowers: "Jarraitzaile amankomunean", suggestedFollowsYou: "Zu jarraitzen zaitu", latestInteractions: "Interakzioak Azkenak", - viewAvatar: "Ikusi Abatarra", - viewCV: "Ikusi CV-a", suggestedSectionTitle: "Gomendatuta", topkarmaSectionTitle: "Karma Onena", topecoSectionTitle: "Eko Onena", topactivitySectionTitle: "Top Jarduera", + "TOP INACTIVITYButton": "INAKTIBOENAK", + topinactivitySectionTitle: "Biztanle gutxien aktiboak", blockedSectionTitle: "Blokeatuta", gallerySectionTitle: "GALERIA", - blockedButton: "BLOKETATUTA", + topSectionTitle: "TOP", blockedLabel: "Blokeatutako Erabiltzailea", inhabitantviewDetails: "Ikusi Xehetasunak", + cvVisitButton: "Bisitatu CVa", keepReading: "Irakurtzen jarraitu...", oasisId: "ID-a", noInhabitantsFound: "Bizilagunik ez, oraindik.", @@ -1083,8 +917,9 @@ module.exports = { parliamentFilterCandidatures: "HAUTAGAITZAK", parliamentFilterProposals: "PROPOSAMENAK", parliamentFilterLaws: "LEGEAK", + parliamentFilterRevocations: "EZEZTAPENAK", parliamentFilterHistorical: "HISTORIKOA", - parliamentFilterLeaders: "LIDERAK", + parliamentFilterLeaders: "BURUAK", parliamentFilterRules: "ARAUAK", parliamentGovernmentCard: "Uneko gobernua", parliamentActorInPowerInhabitant: 'BIZTANLEA AGINTEAN', @@ -1108,10 +943,8 @@ module.exports = { parliamentPoliciesDeclined: "BAZTERTUTAKO LEGEAK", parliamentPoliciesDiscarded: "POLITIKA BAZTERTUAK", parliamentEfficiency: "% ERAGINKORTASUNA", - parliamentFilterRevocations: 'INDARGABETZEAK', parliamentRevocationFormTitle: 'INDARGABETU', parliamentRevocationLaw: 'Legea', - parliamentRevocationTitle: 'Izenburua', parliamentRevocationReasons: 'Arrazoiak', parliamentCurrentRevocationsTitle: 'Uneko Indargabetzeak', parliamentFutureRevocationsTitle: 'Etorkizuneko Indargabetzeak', @@ -1123,23 +956,12 @@ module.exports = { parliamentNoGovernments: "Oraindik ez dago gobernurik.", parliamentCandidatureFormTitle: "Kandidatura Proposatu", parliamentCandidatureIdPh: "Oasis ID (@...) edo tribuaren izena", - parliamentCandidatureSlogan: "Leloa (geh. 140 karaktere)", - parliamentCandidatureSloganPh: "Lelo labur bat", parliamentCandidatureMethod: "Metodoa", parliamentCandidatureProposeBtn: "Hautagaitza Proposatu", - parliamentThDate: "Proposamen data", - parliamentThSlogan: "Leloa", - parliamentThSince: "Profila noiztik", - parliamentThVotes: "Jasotako botoak", - parliamentThVoteAction: "Bozkatu", - parliamentTypeUser: "Biztanlea", - parliamentTypeTribe: "Tribu", parliamentVoteBtn: "Bozkatu", parliamentProposalFormTitle: "Legea Proposatu", parliamentProposalDescription: "Deskribapena (≤1000)", parliamentProposalPublish: "Proposamena Argitaratu", - parliamentFinalize: "Amaitu", - parliamentDeadline: "Epea", parliamentNoProposals: "Oraindik ez dago lege-proposamenik.", parliamentNoLaws: "Oraindik ez dago onartutako legerik.", parliamentMethodDEMOCRACY: "Demokrazia", @@ -1157,29 +979,21 @@ module.exports = { parliamentVotesSlashTotal: "Botoak/Guztira", parliamentVotesNeeded: "Beharrezko Botoak", parliamentFutureLawsTitle: "Etorkizuneko legeak", - parliamentNoFutureLaws: "Oraindik ez dago etorkizuneko legerik", parliamentVoteAction: "Bozkatu", - parliamentLeadersTitle: "Liderak", parliamentThLeader: "AVATAR", parliamentPopulation: "Biztanleria", - parliamentThType: "Mota", - parliamentThInPower: "Agintean", parliamentThPresented: "HAUTAGAITZAK", parliamentNoLeaders: "Oraindik ez dago liderrik.", parliamentCandidaturesListTitle: "Kandidaturen Zerrenda", parliamentTimeRemaining: "Geratzen den denbora", - parliamentNoLeader: "Oraindik ez dago irabazten ari den kandidaturarik.", parliamentElectionsStatusTitle: "Hurrengo Gobernua", parliamentProposalDeadlineLabel: "Epemuga", parliamentProposalTimeLeft: "Geratzen den denbora", - parliamentProposalOnTrack: "Onartzeko bidean", - parliamentProposalOffTrack: "Euskarri nahikorik ez", parliamentRulesTitle: "Legebiltzarrak nola funtzionatzen duen", parliamentRulesIntro: "Hauteskundeak 2 hilean behin ebazten dira; hautagaitzak etengabeak dira eta gobernua aukeratzean berrabiarazten dira.", parliamentRulesCandidates: "Edozein biztanlek bere burua, beste biztanle bat edo edozein tribu proposa dezake. Biztanle bakoitzak gehienez 3 hautagaitza proposa ditzake ziklo bakoitzean; ziklo bereko bikoiztuak baztertzen dira.", parliamentRulesElection: "Irabazlea ebazpen unean boto gehien dituen hautagaitza da.", parliamentRulesTies: "Berdinketa haustea: biztanlearen karma handiena; berdin jarraituz gero, profilaren antzinatasun handiena; oraindik berdin, proposamen goiztiarrena; ondoren, IDaren hurrenkera lexikografikoa.", - parliamentRulesFallback: "Inork bozkatzen ez badu, azken proposatutako hautagaitzak irabazten du. Hautagaitzarik ez badago, ausazko tribu bat hautatzen da.", parliamentRulesTerm: "Gobernua fitxak uneko gobernua eta estatistikak erakusten ditu.", parliamentRulesMethods: "Ereduak: Anarkia (gehiengo sinplea), Demokrazia (%50+1), Gehiengoa (%80), Gutxiengoa (%20), Karmatokrazia (karma handiena duten proposamenak), Diktadura (berehalako onarpena).", parliamentRulesAnarchy: "Anarkia modu lehenetsia da: ebazpenean ez bada kandidaturarik hautatzen, Anarkia ezartzen da. Anarkian, edozein biztanlek legeak proposa ditzake.", @@ -1203,12 +1017,8 @@ module.exports = { courtsCaseTitle: "Izenburua", courtsCaseRespondent: "Akusatua / Erantzulea", courtsCaseRespondentPh: "Oasis ID (@...) edo Tribu izena", - courtsCaseMediatorsAccuser: "Bitartekariak (akusazioa)", courtsCaseMediatorsPh: "Oasis IDak, komaz bereizita", courtsCaseMethod: "Ebazpen metodoa", - courtsCaseDescription: "Azalpena (gehienez 1000 karaktere)", - courtsCaseEvidenceTitle: "Kasuko frogak", - courtsCaseEvidenceHelp: "Erantsi zure kasua babesten duten irudiak, audioak, dokumentuak (PDF) edo bideoak.", courtsCaseSubmit: "Kasu bidali", courtsNominateJudge: "Epailea proposatu", courtsJudgeId: "Epailea", @@ -1223,11 +1033,6 @@ module.exports = { courtsAnswerTitle: "Erreklamazioari erantzun", courtsAnswerText: "Erantzun laburra", courtsAnswerSubmit: "Erantzuna bidali", - courtsStanceDENY: "Ukatu", - courtsStanceADMIT: "Onartu", - courtsStancePARTIAL: "Partziala", - courtsStanceCOUNTERCLAIM: "Kontraerreklamazioa", - courtsStanceNEUTRAL: "Neutrala", courtsVerdictTitle: "Ebazpena eman", courtsVerdictResult: "Emaitza", courtsVerdictOrders: "Aginduak", @@ -1236,7 +1041,6 @@ module.exports = { courtsMediationPropose: "Akordioa proposatu", courtsSettlementText: "Baldintzak", courtsSettlementAccepted: "Onartua", - courtsSettlementPending: "Zain", courtsSettlementProposeBtn: "Proposatu", courtsNominationsTitle: "Epailetzako izendapenak", courtsThJudge: "Epailea", @@ -1253,7 +1057,6 @@ module.exports = { courtsThDecisionBy: "Ebazteko epea", courtsThCase: "Kasua", courtsThCreatedAt: "Hasiera-data", - courtsThActions: "Ekintzak", courtsCaseMediatorsRespondentTitle: "Defentsako bitartekariak gehitu", courtsCaseMediatorsRespondent: "Bitartekariak (defentsa)", courtsMediatorsAccuserLabel: "Bitartekariak (akusazioa)", @@ -1294,22 +1097,6 @@ module.exports = { courtsRulesMisconduct: "Jazarpenak, manipulazioak edo faltsututako frogek berehalako ebazpen negatiboa ekar dezakete.", courtsRulesGlossary: "Kasua: gatazkaren erregistroa. Froga: aldarrikapenak babesten dituzten materialak. Epai/ebazpena: neurri edo konponketarekin datorren erabakia. Helegitea: ebazpena berrikusteko eskaera.", courtsFilterActions: "EKINTZAK", - courtsNoActions: "Ez duzu zain dauden ekintzarik zure rolarentzat.", - courtsCaseTitlePlaceholder: "Gatazkaren deskribapen laburra", - courtsCaseSeverity: "Larritasuna", - courtsCaseSeverityNone: "Larritasun etiketarik ez", - courtsCaseSeverityLOW: "Baxua", - courtsCaseSeverityMEDIUM: "Ertaina", - courtsCaseSeverityHIGH: "Handia", - courtsCaseSeverityCRITICAL: "Larria", - courtsCaseSubject: "Gaia", - courtsCaseSubjectNone: "Gairik gabeko etiketa", - courtsCaseSubjectBEHAVIOUR: "Jokabidea", - courtsCaseSubjectCONTENT: "Edukia", - courtsCaseSubjectGOVERNANCE: "Gobernantza / arauak", - courtsCaseSubjectFINANCIAL: "Finantzak / baliabideak", - courtsCaseSubjectOTHER: "Bestelakoa", - courtsHiddenRespondent: "Ezkutatua (rol inplikatuek bakarrik ikus dezakete).", courtsThRole: "Rola", courtsRoleAccuser: "Akusatzailea", courtsRoleDefence: "Defentsa", @@ -1320,54 +1107,19 @@ module.exports = { courtsAssignJudgeBtn: "Epailea aukeratu", trendingTitle: "Pil-pilean", exploreTrending: "Aurkitu pil-pileko edukia zure sarean.", - bookmarkButton: "MARKAGAILUAK", - transferButton: "TRANSFERENTZIAK", - eventButton: "EKITALDIAK", - taskButton: "ATAZAK", votesButton: "GOBERNUA", - industryButton: "INDUSTRIA", - projectButton: "PROIEKTUAK", - shopProductButton: "PRODUKTUAK", - reportButton: "TXOSTENAK", - feedButton: "JARIOA", - marketButton: "MERKATUA", - imageButton: "IRUDIAK", - audioButton: "AUDIOAK", - videoButton: "BIDEOAK", - documentButton: "DOKUMENTUAK", - torrentButton: "TORRENTAK", - noTrendingFound: "Pil-pileko edukirik ez.", - noContentMessage: "Pil-pileko edukirik ez, oraindik.", - trendingDescription: "Deskribapena", - trendingDate: "Data", - trendingLocation: "Kokapena", - trendingPrice: "Prezioa", - trendingUrl: "URL", - trendingCategory: "Kategoria", - trendingStart: "Hasi", - trendingEnd: "Amaitu", - trendingPriority: "Lehentasuna", - trendingStatus: "Egoera", - trendingFrom: "Nork", - trendingTo: "Nori", - trendingConcept: "Kontzeptua", - trendingAmount: "Kopurua", - trendingDeadline: "Epemuga", - trendingItemStatus: "Elementuaren Egoera", - trendingTotalVotes: "Bozkak Guztira", + shopProductButton: "DENDA", trendingTotalOpinions: "Iritzial Guztira", trendingNoContentMessage: "Oraindik ez dago joerarik.", - trendingAuthor: "Nork", - trendingCreatedAtLabel: "Noiz", trendingTotalCount: "Kopurua Guztira", tasksTitle: "Atazak", tasksDescription: "Aurkitu eta kudeatu atazak", + taskSearchPlaceholder: "Bilatu zereginak...", taskTitleLabel: "Izenburua", taskDescriptionLabel: "Deskribapena", taskStartTimeLabel: "Hasiera Data", taskEndTimeLabel: "Amaiera Data", taskPriorityLabel: "Lehentasuna", - taskPrioritySelect: "Aukeratu lehentasuna", taskPriorityUrgent: "Larria", taskPriorityHigh: "Altua", taskPriorityMedium: "Ertaina", @@ -1377,13 +1129,13 @@ module.exports = { taskVisibilityLabel: "Ikusgaitasuna", taskPublic: "publikoa", taskPrivate: "pribatua", - taskCreatedAt: "Noiz", - taskBy: "Nork", taskStatus: "Egoera", taskStatusOpen: "Irekita", taskStatusInProgress: "Ekinean", taskStatusClosed: "Itxita", taskAssignedTo: "Honi esleituta", + taskAssignedChip: "Esleituta", + taskUnassignedChip: "Esleitu gabe", taskAssignees: "Hauei esleituta", taskAssignButton: "Esleitu neuri", taskUnassignButton: "Kendu esleipena", @@ -1396,7 +1148,6 @@ module.exports = { taskFilterInProgress: "EKINEAN", taskFilterClosed: "ITXITA", taskFilterAssigned: "ESLEITUTA", - taskFilterArchived: "ARTXIBATUTA", taskFilterUrgent: "LARRIA", taskFilterHigh: "ALTUA", taskFilterMedium: "ERTAINA", @@ -1409,23 +1160,21 @@ module.exports = { taskInProgressTitle: "Atazak Ekinean", taskClosedTitle: "Atazak itxita", taskAssignedTitle: "Atazak esleituta", - taskArchivedTitle: "Atazak artxibatuta", - taskPublicTitle: "Ataza publikoak", - taskPrivateTitle: "Ataza pribatuak", notasks: "Atazarik ez.", noLocation: "Ez da kokapenik zehaztu", taskSetStatus: "Egoera ezarri", - eventTitle: "Ekitaldiak", eventDateLabel: "Data", + eventRecurrenceLabel: "Errepikapena", + eventRecurrenceUntil: "Errepikatu arte", + eventRecurrenceHint: "Utzi hutsik amaiera data ekitaldi bakarrerako.", + eventUpcomingDates: "Hurrengo datak", eventsTitle: "Ekitaldiak", eventsDescription: "Aurkitu eta kudeatu ekitaldiak zure sarean.", - eventDescription: "Deskribapena", + eventSearchPlaceholder: "Bilatu ekitaldiak...", eventPrice: "Prezioa", eventStatus: "Egoera", - eventOrganizer: "Antolatzailea", eventAllSectionTitle: "Ekitaldiak", eventMineSectionTitle: "Zeure Ekitaldiak", - eventArchivedTitle: "Artxibatutako Ekitaldiak", eventCreateSectionTitle: "Sortu Ekitaldia", eventUpdateSectionTitle: "Eguneratu Ekitaldia", eventDeleteButton: "Ezabatu", @@ -1433,11 +1182,26 @@ module.exports = { eventAddToCalendar: "Egutegira gehitu", eventVisitCalendar: "Egutegia ikusi", viewTask: "Ikusi ataza", + viewEvent: "Ikusi ekitaldia", + viewPad: "Ikusi pad-a", + viewMap: "Ikusi mapa", + viewCalendar: "Ikusi egutegia", viewReport: "Ikusi txostena", viewTransfer: "Ikusi transferentzia", viewItem: "Ikusi elementua", viewShop: "Ikusi denda", viewProject: "Ikusi proiektua", + viewJob: "Ikusi Lanpostua", + viewPlace: "Ikusi Lekua", + generatePdf: "Sortu PDFa", + sharePm: "Partekatu PMz", + galleryImages: "Irudiak (geh. 50MB bakoitza)", + galleryPhotos: "Irudiak", + galleryAddPhoto: "Gehitu Irudia", + galleryRemovePhoto: "Kendu", + galleryVideo: "Bideoa (geh. 50MB)", + galleryAddVideo: "Gehitu Bideoa", + galleryRemoveVideo: "Kendu bideoa", viewVotation: "Ikusi bozketa", voteCastTitle: "Eman botoa", voteResults: "Emaitzak", @@ -1445,29 +1209,15 @@ module.exports = { eventDescriptionLabel: "Deskribapena", eventDescriptionPlaceholder: "Sartu ekitaldiaren deskribapena...", eventUpdateButton: "Eguneratu", - eventAttendeesLabel: "Partaideak", - eventAttendeesPlaceholder: "Sartu partaideak, erabili komak bereizteko.", eventTagsLabel: "Etiketak", - eventTagsPlaceholder: "Sartu ekitaldiaren etiketak, erabili komak bereizteko.", - eventTags: "Etiketak", eventPriceLabel: "Prezioa", eventUrlLabel: "URL", eventAttendees: "Partaideak", - noAttendees: "Partaiderik ez oraindik", - eventCreatedAt: "Noiz sortua", eventLocation: "Kokapena", eventLocationLabel: "Kokapena", - eventNoLocation: "Ez da zehaztu kokapenik", - eventNoURL: "Ez da zehaztu URL-rik", - eventBy: "Nork", noevents: "Ekitaldirik ez.", eventDate: "Data", - eventDateFormat: "YYYY/MM/DD HH:mm", eventAttendButton: "Joan Ekitaldira", - eventUnattendButton: "Joateari utzi", - eventCreatedBy: "Nork", - eventAttendeesCount: "Partaide kopurua", - eventCreatedByYou: "Zeuk sortu duzu ekitaldia", eventFilterAll: "GUZTIAK", eventFilterMine: "NEUREAK", eventFilterToday: "GAUR", @@ -1475,18 +1225,9 @@ module.exports = { eventFilterMonth: "HILEON", eventFilterYear: "AURTEN", eventFilterArchived: "ARTXIBATUTA", - eventTodayTitle: "Ekitaldiak gaur", - eventThisWeekTitle: "Ekitaldiak asteon", - eventThisMonthTitle: "Ekitaldiak hileon", - eventThisYearTitle: "Ekitaldiak aurten", eventPrivacyLabel: "Ikusgaitasuna", eventPublic: "Publikoa", eventPrivate: "Pribatua", - eventPublicTitle: "Ekitaldi Publikoak", - eventNoPrice: "Ekitaldia doan", - eventNoImage: "Ez da irudirik igo", - eventAttendConfirmation: "Ekitaldi honetara zoaz", - eventUnattendConfirmation: "Ez zara ekitaldi honetara joango", eventAttended: "Bertaratzen naiz", eventUnattended: "Ez naiz bertaratzen", eventStatusOpen: "Irekia", @@ -1497,6 +1238,10 @@ module.exports = { tagsTopSectionTitle: "Etiketa Gorenak", tagsCloudSectionTitle: "Etiketen hodeia", tagsFilterAll: "GUZTIAK", + tagsFilterMine: "NIREAK", + tagsFilterRecent: "BERRIAK", + tagsMineSectionTitle: "Nire etiketak", + tagsRecentSectionTitle: "Etiketa berriak", tagsFilterTop: "GORENAK", tagsFilterCloud: "HODEIA", tagsNoItems: "Etiketarik ez.", @@ -1540,18 +1285,12 @@ module.exports = { transfersDeadline: "Epemuga", transfersTags: "Etiketak", transfersStatus: "Egoera", - transfersStatusUnconfirmed: "BERRETSI GABE", - transfersStatusClosed: "ITXITA", - transfersStatusDiscarded: "BAZTERTUTA", - transfersCreatedAt: "Noiz", transfersConfirmations: "BERRESPENAK", - transfersContainingBlock: "Bloke edukitzailea", - transfersExportContract: "Kontratu adimenduna", + transfersExportContract: "Sortu Faktura", transfersConfirmButton: "Berretsi Transferentzia", transfersNoItems: "Transferentziarik ez.", transfersMineSectionTitle: "Zeure Transferentziak", transfersUBISectionTitle: "RBU Transferentziak", - transfersMarketSectionTitle: "Merkatuko Transferentziak", transfersTopSectionTitle: "Transferentzia Gorenak", transfersPendingSectionTitle: "Transferentziak Zain", transfersUnconfirmedSectionTitle: "Transferentziak Berretsi Gabe", @@ -1559,21 +1298,13 @@ module.exports = { transfersDiscardedSectionTitle: "Transferentziak Baztertuta", transfersCreateSectionTitle: "Sortu transferentzia", transfersAllSectionTitle: "Transferentziak", - transfersFilterFavs: "Gustukoak", - transfersFavsSectionTitle: "Gustuko transferentziak", - transfersSearchLabel: "Bilatu", transfersSearchPlaceholder: "Bilatu kontzeptua, etiketak, erabiltzaileak...", transfersMinAmountLabel: "Gutx. zenbatekoa", transfersMaxAmountLabel: "Geh. zenbatekoa", - transfersSortLabel: "Ordenatu", transfersSortRecent: "Berrienak", transfersSortAmount: "Zenbateko handiena", transfersSortDeadline: "Epe hurbilena", transfersSearchButton: "Bilatu", - transfersFavoriteButton: "Gustukoa", - transfersUnfavoriteButton: "Kendu gustukoa", - transfersMessageUserButton: "Mezua", - transfersExpiringSoonBadge: "LASTER", transfersExpiredBadge: "IRAUNGITA", transfersUpdatedAt: "Eguneratua", transfersNoMatch: "Ez dago bilaketarekin bat datorren transferentziarik.", @@ -1618,16 +1349,6 @@ module.exports = { voteNoQuestion: "Galderarik ez", voteUnknownCreator: "Sortzaile Ezezaguna", voteUnknownDate: "Data Ezezaguna", - errorVoteNotFound: "Bozka ez da aurkitu", - errorAlreadyVoted: "Jadanik bozkatu duzu", - errorVoteClosedCannotEdit: "Ezin duzu itxitako bozketa bat editatu", - errorVoteDeadlinePassed: "Bozketa honen epemuga igaro da", - errorRetrievingVote: "Errorea bozka eskuratzerakoan", - errorCreatingVote: "Errorea bozka sortzerakoan", - errorVoteAlreadyVoted: "Ezin duzu bozka editatu jadanik bozkatu baduzu", - errorDeletingOldVote: "Errorea bozka zaharra ezabatzerakoan", - errorCreatingUpdatedVote: "Errorea eguneratutako bozka sortzean", - errorCreatingTombstone: "Errorea hilarria sortzerakoan", voteDetailSectionTitle: 'Bozketa xehetasunak', voteCommentsLabel: 'Iruzkinak', voteCommentsForumButton: 'Eztabaida ireki', @@ -1637,7 +1358,6 @@ module.exports = { voteNewCommentButton: 'Bidali iruzkina', voteNewCommentLabel: 'Gehitu iruzkina', cvTitle: "CV", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Editatu CV-a", cvCreateSectionTitle: "Sortu CV-a", cvDescription: "Kudeatu eta partekatu zure trebetasun profesionalak eta informazio gehiago.", @@ -1656,19 +1376,16 @@ module.exports = { cvLocationLabel: "Kokapena", cvStatusLabel: "Egoera", cvPreferencesLabel: "Lehentasunak", - cvOasisContributorLabel: "Oasis-eko Parte-Hartzailea", cvPersonal: "Pertsonala", cvOasis: "Oasis-eko Parte-Hartzailea (optional)", - cvOasisContributorView: "Oasis-i Ekarpena", + cvOasisContributorView: "Ekarpena", cvEducational: "Hezkuntza (hautazkoa)", cvEducationalView: "Hezkuntza", cvProfessional: "Profesionala (hautazkoa)", cvProfessionalView: "Profesionala", cvAvailability: "Eskuragarritasuna (hautazkoa)", - cvAvailabilityView: "Eskuragarritasuna", cvUpdateButton: "Eguneratu", cvCreateButton: "Sortu CV-a", - cvContactLabel: "Kontaktua", cvCreatedAt: "Noiz sortua", cvUpdatedAt: "Noiz eguneratua", cvEditButton: "Eguneratu", @@ -1677,8 +1394,103 @@ module.exports = { blogSubject: "Gaia", blogMessage: "Mezua", blogImage: "Multimedia igo (max: 50MB)", + blogMedia: "Eranskinak (8 irudi eta bideo bat gehienez)", blogPublish: "Aurrebista", - noPopularMessages: "Pil-pileko mezurike ez, oraindik", + pollsTitle: "Inkestak", + dataTitle: "Bat etortzeak", + dataDescription: "Arakatu eta ikusi zure sareko bat etortzeak.", + dataFilterAll: "DENAK", + dataFilterMine: "NIREAK", + dataFilterRecent: "BERRIENAK", + dataFilterTop: "TOP", + dataKindInhabitants: "BIZTANLEAK", + dataKindJobs: "LANPOSTUAK", + dataKindProjects: "PROIEKTUAK", + dataKindEvents: "EKITALDIAK", + dataKindTribes: "TRIBUAK", + dataKindMarket: "MERKATUA", + dataKindHousing: "ETXEBIZITZA", + dataKindIndustry: "INDUSTRIA", + dataKindTasks: "ZEREGINAK", + dataKindReports: "TXOSTENAK", + dataKindVotes: "BOZKETAK", + dataSearchPlaceholder: "Bilatu datu gurutzatuetan...", + dataCohesionTitle: "Kohesio Koefizientea (CC)", + dataCcShort: "CC", + dataCohesionHint: "Sareak argitaratutako guztiaren arteko batez besteko afinitatea.", + dataAffinity: "Afinitatea", + dataCommonTerms: "Gako-hitza", + dataStatPeople: "CVak", + dataStatConnected: "Konektatuta", + dataStatSkills: "Trebetasunak", + dataBestMatch: "Match onena", + dataStatIsolated: "Isolatuta", + dataStatEntities: "Konparatutako entitateak", + dataStatTerms: "Termino desberdinak", + dataStatPairs: "Konektatutako bikoteak", + dataMatchesTitle: "Bat etortzeak", + dataMatchesHint: "Algoritmoaren iradokizun pertsonalizatuak.", + dataTermsTitle: "Gako-hitzak", + dataTermsHint: "Eduki gehienetan agertzen diren terminoak.", + dataConnections: "Lotutako bat-etortzeak", + dataTopicTitle: "Honekin lotutako guztia:", + dataTopicHint: "Algoritmoak gai honekin lotzen duena", + dataNoMatches: "Ez dago datu gurutzaturik erakusteko.", + dataNoProfile: "Argitaratu edukia edo idatzi zure CVa, algoritmoak zure interesak ikas ditzan.", + pollsDescription: "Sareari galdetzeko eta erantzunak zenbatzeko modulua.", + pollFilterAll: "GUZTIAK", + pollFilterMine: "NIREAK", + pollFilterRecent: "BERRIENAK", + pollFilterTop: "TOP", + pollFilterVoted: "BOZKATUAK", + pollFilterOpen: "IREKIAK", + pollFilterClosed: "ITXIAK", + pollCreateButton: "Sortu Inkesta", + pollCreateTitle: "Sortu Inkesta", + pollEditTitle: "Editatu Inkesta", + pollQuestion: "Galdera", + pollQuestionPlaceholder: "Zer galdetu nahi duzu?", + pollOptions: "Aukerak (bat lerroko)", + pollOutcome: "Emaitza", + pollNoVotesYet: "Oraindik botorik ez", + pollTie: "Berdinketa", + pollOptionsPlaceholder: "Plaza\nParkea\nTaberna", + pollAnonymous: "Anonimoa", + pollAnonymousLabel: "Inkesta anonimoa", + pollMultiple: "Aukera anitza", + pollMultipleLabel: "Baimendu erantzun bat baino gehiago", + pollDeadline: "Epemuga", + pollTags: "Etiketak", + pollPublishButton: "Argitaratu Inkesta", + pollUpdateButton: "Eguneratu", + pollCloseButton: "Itxi", + pollDeleteButton: "Ezabatu", + pollVoteButton: "Bozkatu", + pollChangeVote: "Aldatu Botoa", + pollVoters: "Bozkatzaileak", + pollComments: "Iruzkinak", + pollStatusLabel: "Egoera", + pollStatusOpen: "IREKIA", + pollStatusClosed: "ITXIA", + pollSearchPlaceholder: "Bilatu inkestak...", + pollsNoItems: "Ez da inkestarik aurkitu.", + viewPoll: "Ikusi Inkesta", + pollChatCreate: "Sortu Inkesta", + pollInChat: "Inkesta", + blogTitle: "Blogak", + blogDescription: "Blogak aurkitzeko eta kudeatzeko modulua.", + blogFilterAll: "GUZTIAK", + blogFilterMine: "NIREAK", + blogFilterRecent: "BERRIENAK", + blogFilterFavorites: "GOGOKOAK", + blogFilterTop: "TOP", + blogCreateButton: "Sortu Bloga", + blogSearchPlaceholder: "Bilatu blogak...", + blogComments: "Iruzkinak", + blogAllowComments: "Baimendu iruzkinak", + blogCommentsClosed: "Egileak blog honen iruzkinak itxi ditu.", + blogNoItems: "Ez da blogik aurkitu.", + viewBlog: "Ikusi Bloga", forumTitle: "Foroak", forumCategoryLabel: "Kategoria", forumTitleLabel: "Izenburua", @@ -1686,43 +1498,22 @@ module.exports = { forumCreateButton: "Sortu foroa", forumCreateSectionTitle: "Sortu foroa", forumDescription: "Hitz egin sareko beste erabiltzaileekin libreki.", + forumSearchPlaceholder: "Bilatu foroak...", forumFilterAll: "GUZTIAK", forumFilterMine: "NIREAK", forumFilterRecent: "BERRIENAK", forumFilterTop: "GORENAK", - forumMineSectionTitle: "Zure Foroak", - forumRecentSectionTitle: "Azken Foroak", - forumAllSectionTitle: "Foroak", forumDeleteButton: "Ezabatu", forumParticipants: "parte-hartzaileak", forumMessages: "mezuak", - forumLastMessage: "Azken mezua", forumMessageLabel: "Mezua", forumMessagePlaceholder: "Idatzi zure mezua...", forumSendButton: "Bidali", - forumVisitForum: "Bisitatu Foroaren", noForums: "Ez da fororik aurkitu.", - forumVisitButton: "Foroa bisitatu", - forumCatGENERAL: "Orokorra", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Politika", - forumCatTECH: "Teknologia", - forumCatSCIENCE: "Zientzia", - forumCatMUSIC: "Musika", - forumCatART: "Artea", - forumCatGAMING: "Bideojokoak", - forumCatBOOKS: "Liburuak", - forumCatFILMS: "Filmak", - forumCatPHILOSOPHY: "Filosofia", - forumCatSOCIETY: "Gizartea", - forumCatPRIVACY: "Pribatutasuna", - forumCatCYBERWARFARE: "Zibergerra", - forumCatSURVIVALISM: "Biziraupena", + forumVisitButton: "Ikusi Foroa", + forumTopicLabel: "Gaia", imageTitle: "Irudiak", imageDescription: "Arakatu eta kudeatu zure sareko irudi-edukia.", - imagePluginTitle: "Izenburua", - imagePluginDescription: "Deskribapena", imageMineSectionTitle: "Zure irudiak", imageCreateSectionTitle: "Irudia igo", imageUpdateSectionTitle: "Irudia eguneratu", @@ -1731,14 +1522,12 @@ module.exports = { imageTopSectionTitle: "Bozkatuenak", imageFavoritesSectionTitle: "Gogokoak", imageGallerySectionTitle: "Galeria", - imageMemeSectionTitle: "Memak", imageFilterAll: "GUZTIAK", imageFilterMine: "NIREAK", imageFilterRecent: "AZKENAK", imageFilterTop: "TOP", imageFilterFavorites: "GOGOKOAK", imageFilterGallery: "GALERIA", - imageFilterMeme: "MEMAK", imageCreateButton: "Irudia igo", imageUpdateButton: "Eguneratu", imageDeleteButton: "Ezabatu", @@ -1751,7 +1540,6 @@ module.exports = { imageTitlePlaceholder: "Aukerakoa", imageDescriptionLabel: "Deskribapena", imageDescriptionPlaceholder: "Aukerakoa", - imageMemeLabel: "¿MEME?", imageNoFile: "Ez da irudi-fitxategirik eman", noImages: "Ez dago irudirik erabilgarri.", imageSearchPlaceholder: "Bilatu izenburua, etiketak, deskribapena, egilea...", @@ -1759,7 +1547,6 @@ module.exports = { imageSortOldest: "Zaharrenak", imageSortTop: "Bozkatuenak", imageSearchButton: "Bilatu", - imageMessageAuthorButton: "Mezua", imageUpdatedAt: "Eguneratua", imageNoMatch: "Ez dago zure bilaketarekin bat datorren irudirik.", feedTitle: "Jarioa", @@ -1771,7 +1558,6 @@ module.exports = { createFeedButton: "Bidali Jarioa!", feedPlaceholder: "Zer berri? (max 280 characters)", TODAYButton: "GAUR", - CREATEButton: "Sortu Jarioa", totalOpinions: "Iritziak Guztira", moreVoted: "Gehien bozkatu", noFeedsFound: "Ez da jariorik aurkitu.", @@ -1793,20 +1579,12 @@ module.exports = { concept: "Kontzeptua", description: "Deskribapena", meme: "Meme", - activityContact: "Kontaktua", - activityBy: "Izena", - activityPixelia: "Pixel berria gehituta", - viewImage: "Ikusi irudia", - playAudio: "Audioa erreproduzitu", - playVideo: "Bideoa erreproduzitu", typeRecent: "AZKENA", - errorActivity: "Errorea jarduera eskuratzean", + typeTop: "TOP", typePost: "BLOGAK", - recentButton: "AZKENAK", typeTribe: "TRIBUAK", typeLarp: "L.A.R.P.", typeInhabitants: "BIZTANLEAK", - activityProfileUpdated: "bere profila eguneratu du", typeAbout: "BIZTANLEAK", typeCurriculum: "CVAK", typeImage: "IRUDIAK", @@ -1850,8 +1628,6 @@ module.exports = { typeCourtsSettlementAccepted: "Epaitegiak · Akordio onartua", typeCourtsNomination: "Epaitegiak · Izendapena", typeCourtsNominationVote: "Epaitegiak · Izendapen bozketak", - activitySupport: "Aliantza berria sortua", - activityJoin: "PUB berria batu da", question: "Galdera", deadline: "Epemuga", status: "Egoera", @@ -1865,12 +1641,8 @@ module.exports = { date: "Data", category: "Kategoria", attendees: "Parte-hartzaileak", - activitySpread: "->", - visitLink: "Esteka bisitatu", - viewDocument: "Dokumentua ikusi", location: "Kokalekua", contentWarning: "Gaia", - personName: "Biztanlearen izena", bankWalletConnected: "ECOin zorroa", bankUbiReceived: "Jasotako UBI", bankTx: "Tx", @@ -1879,7 +1651,6 @@ module.exports = { link: "Esteka", activityProjectFollow: "%OASIS% orain %ACTION% proiektu hau %PROJECT%", activityProjectUnfollow: "%OASIS% orain %ACTION% proiektu hau %PROJECT%", - activityProjectPledged: "%OASIS%-(e)k %ACTION% %AMOUNT% egin du %PROJECT% proiektuan", following: "JARRAITZEN", unfollowing: "EZ JARRAITZEN", pledged: "KONPROMISOA", @@ -1906,8 +1677,11 @@ module.exports = { parliamentLawVotes: "Botoak", createdAt: "Sortze-data", reportsTitle: "Txostenak", - reportsDescription: "Kudeatu eta jarraitu arazo, akats, gehiegikeri eta eduki-abisuei buruzko txostena zure sarean.", + reportsDescription: "Kudeatu eta jarraitu zure sareko txostenak.", + reportsSearchPlaceholder: "Bilatu txostenak...", reportsFilterAll: "GUZTIAK", + reportsFilterRecent: "BERRIAK", + reportsFilterTop: "TOP", reportsFilterMine: "NEUREAK", reportsFilterFeatures: "GAITASUNAK", reportsFilterBugs: "BUGAK", @@ -1920,18 +1694,13 @@ module.exports = { reportsFilterInvalid: "BALIOGABEKOA", reportsCreateButton: "Sortu Txostena", reportsTitleLabel: "Izenburua", - reportsDescriptionLabel: "Deskribapena", - reportsDescriptionPlaceholder: "Idatzi deskribapen zehatza, mesedez.", reportsCategory: "Kategoria", - reportsCategoryLabel: "Kategoria", reportsCategoryFeatures: "Gaitasunak", reportsCategoryBugs: "Bugak", reportsCategoryAbuse: "Gehiegikeria", - reportsCategoryContent: "Arazoak Edukiarekin", + reportsCategoryContent: "Edukia", reportsUpdateButton: "Eguneratu", reportsDeleteButton: "Ezabatu", - reportsDateLabel: "Data", - reportsUploadFile: "Multimedia igo (max: 50MB)", reportsMineSectionTitle: "Zeure Txostenak", reportsFeaturesSectionTitle: "Gaitasuna Eskatu", reportsBugsSectionTitle: "Bugak", @@ -1939,11 +1708,6 @@ module.exports = { reportsContentSectionTitle: "Arazoak Edukiarekin", reportsAllSectionTitle: "Txostenak", reportsNoItems: "Txostenik ez.", - reportsValidationTitle: "Sartu izenburu zuzena, mesedez.", - reportsValidationDescription: "Deskribapena ezin da hutsi egon.", - reportsValidationCategory: "Aukeratu kategoria, mesedez.", - reportsCreatedAt: "Noiz", - reportsCreatedBy: "Nork", reportsSeverity: "Larritasuna", reportsSeverityLow: "Baxua", reportsSeverityMedium: "Ertaina", @@ -1954,13 +1718,10 @@ module.exports = { reportsStatusUnderReview: "Berrikusten", reportsStatusResolved: "Zuzenduta", reportsStatusInvalid: "Balio gabekoa", - reportsUpdateStatusButton: "Eguneratu Egoera", - reportsAnonymityOption: "Bidali Anonimoki", - reportsAnonymousAuthor: "Anonimoa", reportsConfirmButton: "BERRETSI TXOSTENA!", reportsConfirmations: "Berrespenak", reportsConfirmedSectionTitle: "Berretsitako Txostenak", - reportsCreateTaskButton: "SORTU ATAZA", + reportsCreateTaskButton: "Sortu Ataza", reportsOpenSectionTitle: "Ireki Txostenak", reportsUnderReviewSectionTitle: "Txostenak Berrikuspenean", reportsResolvedSectionTitle: "Zuzendutako Txostenak", @@ -2003,6 +1764,20 @@ module.exports = { reportsRequestedActionLabel: 'Eskatutako ekintza', reportsRequestedActionPlaceholder: 'Kendu, ezkutatu, etiketatu, ohartarazi, etab.', tribesTitle: "Tribuak", + tribeFilterAll: "GUZTIAK", + tribeFilterRecent: "BERRIAK", + tribeFilterMine: "NIREAK", + tribeFilterMembership: "KIDETZA", + tribeFilterSubtribes: "AZPITRIBUAK", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALERIA", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "NIREAK", + tribeFeedFilterALL: "GUZTIAK", + tribeFeedFilterRECENT: "BERRIAK", + courtsStanceDENY: "Ukatu", + courtsStanceADMIT: "Onartu", + courtsStancePARTIAL: "Neurri batean onartu", tribeAllSectionTitle: "Tribuak", tribeMineSectionTitle: "Zeure Tribuak", tribeCreateSectionTitle: "Sortu Tribua", @@ -2014,13 +1789,6 @@ module.exports = { tribeviewSubTribeButton: "Azpi-Tribua Bisitatu", tribeRootLabel: "ERROA", tribeDescription: "Aurkitu edo sortu tribuak zure sarean.", - tribeFilterAll: "GUZTIAK", - tribeFilterMine: "NEUREAK", - tribeFilterMembership: "BAZKIDETZA", - tribeFilterRecent: "BERRIAK", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "AZPI-TRIBUAK", - tribeFilterGallery: "GALERIA", tribeMainTribeLabel: "TRIBU NAGUSIA", tribeCreateButton: "Sortu Tribua", tribeUpdateButton: "Egutneratu", @@ -2039,13 +1807,8 @@ module.exports = { tribeModeLabel: "Gonbidapen MODUA", tribeIsAnonymousLabel: "Publikoa?", tribeMembersCount: "Partaideak", - tribeInviteCodePlaceholder: "Sartu gonbidapen kodea", - tribeJoinByCodeButton: "Sartu kodearekin", - tribeJoinButton: "SARTU", tribeEnterInvite: "SARTU GONBIDAPENA", tribeLeaveButton: "ATERA", - tribeYes: "BAI", - tribeNo: "EZ", tribePublic: "PULIKOA", tribePrivate: "PRIBATUA", tribeGenerateInvite: "GONBIDAPEN BAKARRA", @@ -2054,13 +1817,8 @@ module.exports = { tribeRemoveInvitation: "KENDU GONBIDAPENA", tribeCreatedAt: "Noiz", tribeAuthor: "Nork", - tribeAuthorLabel: "EGILEA", tribeStrict: "Zorrotza", tribeOpen: "Irekita", - tribeFeedFilterRECENT: "BERRIAK", - tribeFeedFilterMINE: "NEUREAK", - tribeFeedFilterALL: "GUZTIAK", - tribeFeedFilterTOP: "GORENAK", tribeFeedRefeeds: "BERJARIOAK", tribeFeedRefeed: "Berjariotu", tribeFeedMessagePlaceholder: "Idatzi jarioa…", @@ -2070,17 +1828,12 @@ module.exports = { tribeNotFound: "Tribua ez da aurkitu!", createTribeTitle: "Sortu Tribua", updateTribeTitle: "Eguneratu Tribua", - tribeSectionOverview: "Ikuspegi orokorra", tribeSectionInhabitants: "Biztanleak", tribeSectionVotations: "BOZKATZEAK", tribeSectionEvents: "EKITALDIAK", - tribeSectionReports: "Txostenak", tribeSectionTasks: "ATAZAK", tribeSectionFeed: "JARIOA", tribeSectionForum: "FOROA", - tribeSectionMarket: "Merkatua", - tribeSectionJobs: "Lanak", - tribeSectionProjects: "Proiektuak", tribeSectionMedia: "Media", tribeSectionImages: "IRUDIAK", tribeSectionAudios: "AUDIOAK", @@ -2118,11 +1871,6 @@ module.exports = { tribeTaskStatusClosed: "ITXI", tribeTaskAssign: "ESLEITU", tribeTaskUnassign: "KENDU", - tribeReportCreate: "Sortu Txostena", - tribeReportsEmpty: "Txostenik ez, oraindik.", - tribeReportTitle: "Izenburua", - tribeReportDescription: "Deskribapena", - tribeReportCategory: "Kategoria", tribeVotationCreate: "Sortu Bozketa", tribeVotationsEmpty: "Bozketarik ez, oraindik.", tribeVotationTitle: "Izenburua", @@ -2140,27 +1888,6 @@ module.exports = { tribeForumCategory: "Kategoria", tribeForumReply: "Erantzun", tribeForumReplies: "Erantzunak", - tribeMarketCreate: "Sortu Iragarkia", - tribeMarketEmpty: "Iragarkirik ez, oraindik.", - tribeMarketTitle: "Izenburua", - tribeMarketDescription: "Deskribapena", - tribeMarketPrice: "Prezioa", - tribeMarketImage: "Irudia", - tribeMarketCategory: "Kategoria", - tribeJobCreate: "Sortu Lana", - tribeJobsEmpty: "Lanik ez, oraindik.", - tribeJobTitle: "Izenburua", - tribeJobDescription: "Deskribapena", - tribeJobLocation: "Kokalekua", - tribeJobSalary: "Soldata", - tribeJobDeadline: "Epemuga", - tribeProjectCreate: "Sortu Proiektua", - tribeProjectsEmpty: "Proiekturik ez, oraindik.", - tribeProjectTitle: "Izenburua", - tribeProjectDescription: "Deskribapena", - tribeProjectGoal: "Helburua", - tribeProjectFunded: "Finantzatua", - tribeProjectDeadline: "Epemuga", tribeMediaUpload: "Igo Media", readDocument: "Dokumentua Irakurri", tribeCreateImage: "Irudia Sortu", @@ -2171,7 +1898,6 @@ module.exports = { tribeMediaEmpty: "Mediarik ez, oraindik.", tribeMediaTitle: "Izenburua", tribeMediaDescription: "Deskribapena", - tribeMediaType: "Mota", tribeMediaTypeImage: "Irudia", tribeMediaTypeVideo: "Bideoa", tribeMediaTypeAudio: "Audioa", @@ -2181,11 +1907,6 @@ module.exports = { tribeInviteCodeText: "Gonbidapen kodea: ", oasisVersionLabel: "Oasis Bertsioa", tribeInviteCodeHint: "Partekatu kode hau gonbidatu nahi duzun pertsonarekin. /invites → Tribes bidez sar daiteke.", - tribeGroupTribe: "Tribua", - tribeGroupOffice: "Bulegoa", - tribeGroupNetwork: "Sarea", - tribeGroupEconomy: "Ekonomia", - tribeGroupMedia: "Media", tribeStatusOpen: "IREKITA", tribeStatusClosed: "ITXITA", tribeStatusInProgress: "ABIAN", @@ -2195,33 +1916,17 @@ module.exports = { tribePriorityCritical: "KRITIKOA", tribeTaskFilterAll: "GUZTIAK", tribeMediaFilterAll: "GUZTIAK", - tribeReportCatBug: "AKATSA", - tribeReportCatAbuse: "ABUSUA", - tribeReportCatContent: "EDUKIA", - tribeReportCatOther: "BESTEA", tribeForumCatGeneral: "OROKORRA", tribeForumCatProposal: "PROPOSAMENA", tribeForumCatQuestion: "GALDERA", tribeForumCatAnnouncement: "IRAGARPENA", - tribeMarketCatGoods: "ONDASUNAK", - tribeMarketCatServices: "ZERBITZUAK", - tribeMarketCatFood: "ELIKADURA", - tribeMarketCatOther: "BESTEA", tribeStatusLabel: "Egoera", tribeSubTribes: "AZPI-TRIBUAK", tribeSubTribesCreate: "Azpi-Tribua Sortu", tribeSubTribesStrictDenied: "Tribuaren modu zorrotzak ez dizu azpi-tribu berriak sortzen uzten. Jarri harremanetan administratzailearekin.", - tribeSubTribesEmpty: "Ez da azpi-triburik sortu, oraindik.", - tribeActivityJoined: "BATUTA", - tribeActivityLeft: "IRTEN", - tribeActivityFeed: "FEED", tribeActivityRefeed: "REFEED", - tribeGroupAnalytics: "Analitikak", - tribeGroupCreative: "Sormenez", tribeSectionActivity: "JARDUERA", tribeSectionTrending: "JOERAK", - tribeSectionOpinions: "IRITZIAK", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "ETIKETAK", tribeSectionSearch: "BILATU", tribeActivityEmpty: "Ez dago jarduerarik oraindik.", @@ -2233,25 +1938,15 @@ module.exports = { tribeTrendingPeriodWeek: "Aste Honetan", tribeTrendingPeriodAll: "Dena", tribeTrendingEngagement: "parte-hartzea", - tribeOpinionsEmpty: "Ez dago iritzirik oraindik.", - tribeOpinionsCast: "Bozkatu", - tribeOpinionsRankings: "Sailkapenak", - tribeOpinionsAlreadyVoted: "Dagoeneko bozkatu duzu", tribeTopCategory: "Gehien bozkatua", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Pixel art oihal kolaboratiboa.", - tribePixeliaPaint: "Pintatu", - tribePixeliaContributors: "laguntzaileak", - tribePixeliaTotalPixels: "pixel margotuta", tribeTagsEmpty: "Ez da etiketarik aurkitu.", - tribeTagsCloud: "Etiketa Hodeia", - tribeTagsContentWith: "Etiketadun edukia", tribeSearchPlaceholder: "Bilatu tribuaren edukian...", tribeSearchEmpty: "Emaitzarik ez.", tribeSearchResults: "Emaitzak", tribeSearchMinChars: "Idatzi gutxienez 2 karaktere bilatzeko.", agendaTitle: "Agenda", agendaDescription: "Eskeituta dauzkazun elementu guztiak aurki ditzakezu hemen.", + agendaSearchPlaceholder: "Bilatu agendan...", agendaFilterAll: "GUZTIAK", agendaFilterToday: "GAUR", agendaFilterUpcoming: "DATOZENAK", @@ -2273,18 +1968,7 @@ module.exports = { agendaNoItems: "Esleipenik ez.", agendaDiscardButton: "Baztertu", agendaRestoreButton: "Berrezarri", - agendaAuthor: "Nork", - agendaCreatedAt: "Noiz", - agendaTitleLabel: "Izenburua", agendaMembersCount: "Partaideak", - agendaDescriptionLabel: "Deskribapena", - agendaStatus: "Egoera", - agendaVisibility: "Ikusgaitasuna", - agendaEventDate: "Ekitaldiaren Data", - agendaEventLocation: "Kokapena", - agendaEventPrice: "Prezioa", - agendaEventUrl: "URL-a", - agendaTaskStart: "Hasiera Data", agendaLocationLabel: "Kokapena", agendaYes: "BAI", agendaNo: "EZ", @@ -2293,11 +1977,6 @@ module.exports = { agendareportCategory: "Kategoria", agendareportSeverity: "Larritasuna", agendareportStatus: "Egoera", - agendareportDescription: "Deskribapena", - agendaTaskEnd: "Amaiera Data", - agendaTaskPriority: "Lehentasuna", - agendaTransferFrom: "Nork", - agendaTransferTo: "Nori", agendaTransferConcept: "Kontzeptua", agendaTransferAmount: "Kopurua", agendaTransferDeadline: "Epemuga", @@ -2307,47 +1986,7 @@ module.exports = { voteNow: "Bozkatu orain", alreadyVoted: "Jada zure iritzia eman duzu.", noOpinionsFound: "Ez da iritzirik aurkitu.", - RECENTButton: "AZKENAK", TOPButton: "GORDEAK", - interestingButton: "INTERESGARRIA", - necessaryButton: "BEHARREZKOA", - funnyButton: "BARREGARRIA", - disgustingButton: "LOREZTUGARRIA", - sensibleButton: "SENTIKORRA", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "ADULTO BAKARRIK", - boringButton: "NEKAGARRIA", - confusingButton: "ZAILA", - usefulButton: "ERABILI", - informativeButton: "INFORMATIBOA", - wellResearchedButton: "ONDO IKERTUA", - accurateButton: "EGOKITUA", - needsSourcesButton: "ITURRIK BEHAR DITU", - wrongButton: "OKERREKOA", - lowQualityButton: "BEHERA KALITATEA", - creativeButton: "KREABO", - insightfulButton: "ARRETAZKOA", - actionableButton: "ERABILI DAITEKE", - inspiringButton: "INSPIRATZAILEA", - loveButton: "MAITASUN", - clearButton: "ARGI", - upliftingButton: "EGOITZAILEA", - unnecessaryButton: "EZINBESTEKOA", - rejectedButton: "UKATUA", - misleadingButton: "ENGAINEZKOA", - offTopicButton: "GAITIK AT", - duplicateButton: "DUPLIKATU", - clickbaitButton: "KLIK-APURKA", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "BORTITZA", - toxicButton: "TOXIKOA", - harassmentButton: "BAZTERKETA", - hateButton: "ARRETA", - scamButton: "ENGAINU", - triggeringButton: "HAUSKORRA", - opinionsCreatedAt: "Sortu zen", opinionsTotalCount: "Iritzi guztiak", voteInteresting: "Interesgarria", voteNecessary: "Beharrezkoa", @@ -2384,7 +2023,6 @@ module.exports = { voteCreative: "Sortzailea", voteSpam: "Spam", voteAdultOnly: "Ados bakarrik", - publishBlog: "Bloga argitaratu", privateMessage: "MP", pmSendTitle: "Mezu Pribatuak", pmSend: "Bidali!", @@ -2395,7 +2033,6 @@ module.exports = { pmComposeTitle: "Bidali mezu bat", pmRecipients: "Hartzaileak", pmRecipientsHint: "Idatzi Oasis IDak, komaz bereizita", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Mezu bakoitzeko 7 hartzaile gehienez.", pmTextPlaceholder: "Gorputza 7000 karakteretara mugatua.", pmSubject: "Gaia", @@ -2419,7 +2056,6 @@ module.exports = { pmCrypterCharsLabel: "karaktere", pmInvalidRecipients: "Oasis ID baliogabea (@…=.ed25519 itxurakoa izan behar du).", pmEncryptionLabel: "Zifratzea", - pmFile: "Eranskina", private: "Pribatuak", privateDescription: "Zure mezu zifratuak.", privateInbox: "SARRERA-ONTZIA", @@ -2429,18 +2065,14 @@ module.exports = { noPrivateMessages: "Ez dago mezu pribaturik.", pmReply: "Erantzun", pmReplies: "erantzunak", - pmNew: "berriak", - pmMarkRead: "Irakurritako gisa markatu", inReplyTo: "HONI ERANTZUNEZ", pmPreview: "Aurrebista", pmPreviewTitle: "Mezuaren aurrebista", performed: "→", pmFromLabel: "Nork:", pmToLabel: "Nori:", - pmInvalidMessage: "Mezu baliogabea", pmNoSubject: "(gaia gabe)", pmSubjectLabel: "Gaia:", - pmBodyLabel: "Gorputza", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2458,8 +2090,6 @@ module.exports = { inboxJobSubscribedTitle: "Lan-eskaintzara harpidetza berria", pmInhabitantWithId: "OASIS ID duen biztanlea:", pmHasSubscribedToYourJobOffer: "zure lan-eskaintzara harpidetu da", - inboxProjectCreatedTitle: "Proiektu berria sortu da", - pmHasCreatedAProject: "proiektu bat sortu du", inboxMarketItemSoldTitle: "Artikulua salduta", inboxShopSoldTitle: "Produktua salduta", pmYourItem: "Zure artikulua", @@ -2468,7 +2098,6 @@ module.exports = { inboxProjectPledgedTitle: "Ekarpen berria zure proiektuan", pmHasPledged: "ekarpena egin du", pmToYourProject: "zure proiektura", - blockchainTitle: 'BlockExplorer', blockchainDescription: 'Blokeak aztertu eta ikusgaitu blockchain-ean.', blockchainNoBlocks: 'Ez da blokeik aurkitu blockchain-ean.', blockchainStatsTitle: 'Estatistikak', @@ -2480,16 +2109,10 @@ module.exports = { blockchainBlockCarbon: 'Karbono-aztarna', blockchainBlockType: 'Mota', blockchainBlockTimestamp: 'Tzeitza', - blockchainBlockContent: 'Bloke', - blockchainBlockURL: 'URL:', - blockchainContent: 'Bloke', - blockchainContentPreview: 'Bloke edukia aurrebista', blockchainLatestDatagram: 'Azken Datagrama', - blockchainDatagram: 'Datagrama', - blockchainDetails: 'Ikusi blokearen xehetasunak', - blockchainViewBlockexplorer: "Ikusi blockexplorer-ean", - blockchainBlockInfo: 'Blokearen informazioa', - blockchainBlockDetails: 'Hautatutako blokearen xehetasunak', + blockchainDatagram: "Datagrama", + blockchainDetails: "Ikusi Blokearen Xehetasunak", + blockchainViewBlockexplorer: "Ikusi Blockexplorer-en", blockchainBack: 'Itzuli blokearen azterkira', blockchainContentDeleted: "Edukia ezabatu egin da", banking: 'Banking', @@ -2500,21 +2123,17 @@ module.exports = { bankRules: 'Arauak', pending: 'Zain', closed: 'Itxita', - bankBack: 'Itzuli Banking-era', bankViewTx: 'Tx ikusi', bankClaimNow: 'Esleitu', bankClaimUBI: 'RBU eskatu!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'Ez dago RBU esleipen zain garai honetan.', bankEpoch: 'Epea', bankPool: 'Funtsa (epe honetan)', bankWeightsSum: 'Pisuen batura', - bankAllocations: 'Esleipenak', bankNoAllocations: 'Ez da esleipenik aurkitu.', bankNoEpochs: 'Ez da eperik aurkitu.', bankEpochAllocations: 'Epearen esleipenak', @@ -2533,9 +2152,6 @@ module.exports = { bankYourFundsMonth: "Zure funtsak (hilabete honetan)", bankIndustryBalance: "Industria ekoizpena (estimatua)", bankUserBalance: 'Zure saldoa', - ecoWalletNotConfigured: 'ECOin poltsa ez dago konfiguratuta', - editWallet: 'Poltsa editatu', - addWallet: 'Poltsa gehitu', bankAddresses: 'Helbideak', bankNoAddresses: 'Ez da helbiderik aurkitu.', bankUser: 'Oasis ID', @@ -2560,16 +2176,8 @@ module.exports = { search: 'Bilatu!', bankLocal: 'Lokala', bankFromOasis: 'Oasis', - bankMyAddress: 'Zure helbidea', - bankRemoveMyAddress: 'Nire helbidea kendu', - bankNotRemovableOasis: 'Oasis helbideak ezin dira lokalki kendu', bankingUserEngagementScore: "KARMA puntuazioa", - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "FUNTSIK EZ!", bankUbiAvailableOk: "ESKURAGARRI!", bankUbiAvailability: "OBU (sarea)", @@ -2586,13 +2194,6 @@ module.exports = { shopsTitle: "Dendak", shopDescription: "Sareko dendak aurkitu eta kudeatu.", shopTitle: "Denda", - shopFilterAll: "GUZTIAK", - shopFilterMine: "NIREAK", - shopFilterRecent: "BERRIAK", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUKTUAK", - shopFilterPrices: "PREZIOAK", - shopFilterFavorites: "GOGOKOAK", shopUpload: "Denda sortu", shopAllSectionTitle: "Denda guztiak", shopMineSectionTitle: "Nire Dendak", @@ -2609,16 +2210,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Clearnet-en argitaratu", - shopClearnetUnpublish: "Clearnet-etik kendu", - shopClearnetUrlLabel: "Clearnet URLa", - shopClearnetWarning: "Clearnet-en argitaratzeak denda hau kanpoko bilatzaileek eta crawlerrek indexagarri egiten du.", shopAddFavorite: "Gogoko gehitu", shopRemoveFavorite: "Gogoko kendu", shopOpen: "IREKIA", shopClosed: "ITXIA", - shopOpenShop: "Denda ireki", - shopCloseShop: "Denda itxi", shopMakePrivate: "PRIBATU BIHURTU (E2E)", shopMakePublic: "PUBLIKO BIHURTU", shopProducts: "Produktuak", @@ -2646,8 +2241,6 @@ module.exports = { shopOrderPrice: "Prezioa", shopOrderBuyer: "Erosle", shopBackToShop: "Dendara itzuli", - shopShareUrl: "Partekatzeko URLa", - shopVisitShop: "DENDA BISITATU", marketVisitItem: "ITEMA BISITATU", shopStatus: "EGOERA", shopCreatedAt: "SORTUA", @@ -2656,12 +2249,10 @@ module.exports = { shopLocation: "Kokapena", shopTags: "Etiketak", shopVisibility: "Ikusgarritasuna", - shopImage: "Irudia", shopShortDescription: "Deskribapen Laburra", shopShortDescriptionPlaceholder: "Deskribapen laburra txarteletarako (gehienez 160 karaktere)", shopTitlePlaceholder: "Zure dendaren izena", shopDescriptionPlaceholder: "Zure dendaren deskribapen zehatza", - shopUrlPlaceholder: "https://zure-denda-url.com", shopLocationPlaceholder: "Hiria, Herrialdea", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Maparen titulua", @@ -2678,7 +2269,6 @@ module.exports = { bankUnitMinutes: "minutu", bankUnitDays: "egun", bankExchangeNoData: 'Ez dago daturik eskuragarri', - bankExchangeIndex: 'ECOin Balioa (1h)', bankInflation: 'ECOin Inflazioa (anual)', bankInflationMonthly: 'ECOin Inflazioa (mensual)', bankExchangeChartTitle: 'ECOin balioaren bilakaera denboran zehar', @@ -2692,38 +2282,17 @@ module.exports = { bankingSyncStatusOutdated: 'Desegonetik', statsTitle: 'Estatistikak', statistics: "Estatistikak", - statsInhabitant: "Bizilagunaren estatistikak", statsDescription: "Ezagutu zure sareari buruzko estatistikak.", ALLButton: "GUZTIAK", MINEButton: "NIREAK", TOMBSTONEButton: "EZABAKETAK", - statsYou: "Zu", - statsUserId: "Oasis ID", statsCreatedAt: "Sortze data", statsYourContent: "Edukia", statsYourOpinions: "Iritziak", - statsYourTombstone: "Ezabaketak", - statsNetwork: "Sarea", - statsTotalInhabitants: "Bizilagunak", - statsDiscoveredTribes: "Tribuak (Publikoak)", - statsPrivateDiscoveredTribes: "Tribuak (Pribatuak)", statsNetworkContent: "Edukia", - statsYourMarket: "Merkatua", - statsYourJob: "Lanak", - statsYourProject: "Proiektuak", - statsYourTransfer: "Transferentziak", - statsYourForum: "Foroak", statsNetworkOpinions: "Iritziak", - statsDiscoveredMarket: "Merkatua", - statsDiscoveredJob: "Lanak", - statsDiscoveredProject: "Proiektuak", - statsBankingTitle: "Bankua", statsEcoWalletLabel: "ECOIN zorroa", statsEcoWalletNotConfigured: "Konfiguratu gabe!", - statsTotalEcoAddresses: "Helbide kopurua", - statsDiscoveredTransfer: "Transferentziak", - statsDiscoveredForum: "Foroak", - statsNetworkTombstone: "Ezabaketak", statsBookmark: "Laster-markak", statsEvent: "Ekitaldiak", statsTask: "Zereginak", @@ -2745,16 +2314,12 @@ module.exports = { statsAiExchange: "IA", statsPUBs: 'PUBack', statsPost: "Mezuak", - statsOasisID: "Oasis ID", statsSize: "Guztira (tamaina)", statsBlockchainSize: "Blockchain (tamaina)", statsBlobsSize: "Blobak (tamaina)", statsActivity7d: "Jarduera (azken 7 egun)", statsActivity7dTotal: "7 eguneko guztira", statsActivity30dTotal: "30 eguneko guztira", - statsKarmaScore: "KARMA puntuazioa", - statsPublic: "Publikoa", - statsPrivate: "Pribatua", day: "Eguna", messages: "Mezuak", statsProject: "Proiektuak", @@ -2766,30 +2331,14 @@ module.exports = { statsProjectsCancelled: "Bertan behera", statsProjectsGoalTotal: "Helburu osoa", statsProjectsPledgedTotal: "Konprometitutako guztira", - statsProjectsSuccessRate: "Arrakasta tasa", - statsProjectsAvgProgress: "Batez besteko aurrerapena", - statsProjectsMedianProgress: "Aurrerapen mediana", - statsProjectsActiveFundingAvg: "Finantzaketa aktiboaren batez bestekoa", - statsJobsTitle: "Lanak", - statsJobsTotal: "Lan kopurua", - statsJobsOpen: "Irekita", - statsJobsClosed: "Itxita", - statsJobsOpenVacants: "Plaza irekiak", - statsJobsSubscribersTotal: "Harpidedun kopurua", - statsJobsAvgSalary: "Soldata ertaina", - statsJobsMedianSalary: "Soldata mediana", statsMarketTitle: "Merkatua", statsMarketTotal: "Gai kopurua", statsMarketForSale: "Salgai", statsMarketReserved: "Erreserbatuta", statsMarketClosed: "Itxita", statsMarketSold: "Salduta", - statsMarketRevenue: "Diru-sarrerak", - statsMarketAvgSoldPrice: "Salmenta prezio ertaina", statsUsersTitle: "Bizilagunak", user: "Bizilaguna", - statsTombstoneTitle: "Ezabaketak", - statsNetworkTombstones: "Sareko ezabaketak", statsTombstoneRatio: "Ezabaketa ratioa (%)", statsParliamentCandidature: "Parlamenturako hautagaitzak", statsParliamentTerm: "Parlamentuko agintaldiak", @@ -2816,30 +2365,21 @@ module.exports = { aiConfiguration: "Konfiguratu prompt-a", aiPromptUsed: "Prompt-a", aiClearHistory: "Txataren historia garbitu", - aiSharePrompt: "Erantzun hau entrenamendu kolektibora gehitu?", - aiShareYes: "Bai", - aiShareNo: "Ez", - aiSharedLabel: "Entrenamendura gehituta", - aiRejectedLabel: "Ez da gehitu entrenamendura", aiServerError: "Ezin izan da IAren erantzuna lortu. Saiatu berriro.", aiInputPlaceholder: "What is Oasis?", typeAiExchange: "IA", aiApproveTrain: "Prestakuntza kolektibora gehitu", aiRejectTrain: "Ez entrenatu", - aiTrainPending: "Onartzearen zain", aiTrainApproved: "Entrenamendurako onartua", aiTrainRejected: "Entrenamendurako baztertua", aiSnippetsUsed: "Erabilitako zatiak", aiSnippetsLearned: "Ikasitako fragementuak", statsAITraining: "IA prestakuntza", - aiApproveCustomTrain: "Erantzun pertsonalizatu hau erabiliz trebatu", aiCustomAnswerPlaceholder: "Idatzi zure erantzun pertsonalizatua…", - statsAIExchanges: "Ereduen trukea", marketMineSectionTitle: "Zure artikuluak", marketCreateSectionTitle: "Artikulua sortu", marketUpdateSectionTitle: "Eguneratu", marketAllSectionTitle: "Merkatua", - marketRecentSectionTitle: "Azken merkatua", marketTitle: "Merkatua", marketDescription: "Zure sarean ondasunak edo zerbitzuak trukatzeko merkatua.", marketFilterAll: "GUZTIAK", @@ -2869,14 +2409,11 @@ module.exports = { marketItemDeadline: "Epemuga", marketItemIncludesShipping: "Bidalketa barne?", marketItemHighestBid: "Puja altuena", - marketItemHighestBidder: "Pujatzaile onena", marketItemStock: "Stocka", marketOutOfStock: "Stockik gabe", - marketItemBidTime: "Pujaren data", marketActionsUpdate: "Eguneratu", marketUpdateButton: "Eguneratu", marketActionsDelete: "Ezabatu", - marketActionsSold: "Salduta gisa markatu", marketActionsChangeStatus: "EGOERA ALDATU", marketActionsBuy: "EROSI!", marketAuctionBids: "Oraingo pujаk", @@ -2885,21 +2422,17 @@ module.exports = { marketNoItems: "Oraindik ez dago artikulurik eskuragarri.", marketYourBid: "Zure puja", marketCreateFormImageLabel: "Multimedia igo (max: 50MB)", - marketSearchLabel: "Bilatu", marketSearchPlaceholder: "Izenburuan edo etiketetan bilatu", marketMinPriceLabel: "Gutxieneko prezioa", marketMaxPriceLabel: "Gehieneko prezioa", - marketSortLabel: "Ordenatu", marketSortRecent: "Berrienak", marketSortPrice: "Prezioa", marketSortDeadline: "Epemuga", marketSearchButton: "Bilatu", marketAuctionEndsIn: "Amaitzen da", marketAuctionEnded: "Amaituta", - marketMyBidBadge: "Puja egin duzu", marketNoItemsMatch: "Ez dago zure bilaketarekin bat datorren artikulurik.", housingTitle: "Etxebizitza", - housingLabel: "Etxebizitza", housingDescriptionText: "Aurkitu eta kudeatu lekuak zure sarean.", modulesHousingLabel: "Etxebizitza", modulesHousingDescription: "Lekuak aurkitzeko eta kudeatzeko modulua.", @@ -2943,14 +2476,7 @@ module.exports = { housingAvailableFrom: "Noiztik erabilgarri", housingAvailableTo: "Noiz arte erabilgarri", housingTags: "Etiketak", - housingImages: "Argazkiak (geh. 50MB bakoitza)", - housingRemovePhoto: "Kendu", spreadEditWarning: "Eduki honek spread-ak galduko ditu editatzean", - housingRemoveVideo: "Kendu bideoa", - housingAddPhoto: "Gehitu argazkia", - housingAddVideo: "Gehitu bideoa", - housingVideo: "Bideoa (geh. 50MB)", - housingPhotos: "Argazkiak", housingRequests: "Eskaerak", housingRequestButton: "Eskatu", housingCancelButton: "Ezeztatu eskaera", @@ -2994,10 +2520,6 @@ module.exports = { jobsHoursOffered: "Eskainitako orduak", jobsHoursRequested: "Trukean eskatutako orduak", jobsExchangeSkill: "Trukean eskatutako gaitasuna", - jobsHoursOfferedPlaceholder: "ad. 4", - jobsHoursRequestedPlaceholder: "ad. 4", - jobsExchangeSkillPlaceholder: "ad. zurgintza, diseinua", - jobExchangeHint: "Ordu-truke lanetarako, bete beheko eremuak soldataren ordez.", jobsCV: "CV-ak", jobsCreateJob: "Argitaratu Lana", jobsRecentTitle: "Lana Azkenak", @@ -3034,7 +2556,6 @@ module.exports = { jobLocationPresencial: "Aurrez aurrekoa", jobLocationRemote: "Urrunekoa", jobVacantsPlaceholder: "Postu kopurua", - jobSalaryPlaceholder: "Ordubeteko soldata ECO", jobImage: "Multimedia igo (max: 50MB)", jobTasks: "Eginkizunak", jobType: "Lanen Motak", @@ -3042,7 +2563,6 @@ module.exports = { jobSubscribers: "Harpidetzaileak", noSubscribers: "Ez da harpidetzailerik", createJobButton: "Argitaratu Lana", - viewDetailsButton: "Ikusi Xehetasunak", noJobsFound: "Ez daude lan eskaintzak.", jobAuthor: "Egilea", jobTimePartial: "Partziala", @@ -3052,28 +2572,17 @@ module.exports = { jobsFilterApplied: "ESKATUTA", jobsAppliedTitle: "Nire eskaerak", jobsAppliedBadge: "Izena emanda", - jobsFilterFavs: "Gustukoak", - jobsFavsTitle: "Gustukoak", - jobsFilterNeeds: "Laguntza behar du", - jobsNeedsTitle: "Laguntza behar du", - jobsSearchLabel: "Bilatu", jobsSearchPlaceholder: "Bilatu izenburua, etiketak, deskribapena...", jobsMinSalaryLabel: "Gutx. soldata", jobsMaxSalaryLabel: "Geh. soldata", - jobsSortLabel: "Ordenatu", jobsSortRecent: "Berrienak", jobsSortSalary: "Soldata altuena", jobsSortSubscribers: "Hautagai gehien", jobsSearchButton: "Bilatu", - jobsFavoriteButton: "Gustukoa", - jobsUnfavoriteButton: "Kendu gustukoa", - jobsMessageAuthorButton: "MP", jobsApplicants: "Hautagaiak", jobsUpdatedAt: "Eguneratua", jobSetOpen: "Ireki gisa markatu", - jobNewBadge: "BERRIA", jobsTagsLabel: "Etiketak", - jobsTagsPlaceholder: "etiketa1, etiketa2, etiketa3", noJobsMatch: "Ez dago bilaketarekin bat datorren lan-eskaintzarik.", industrySearchPlaceholder: "Bilatu fabrikak…", industryAllSectors: "Sektore guztiak", @@ -3081,9 +2590,7 @@ module.exports = { industryAdvanceTo: "Ezarri", industryAmount: "Kopurua", industryApproveBuild: "Onartu", - industryBackToFacility: "← Fabrika", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Industria Blueprint", industryBlueprints: "Blueprint-ak", industryBuild: "Build", industryBuildNotes: "Oharrak", @@ -3096,18 +2603,13 @@ module.exports = { industryBuilds: "Build-ak", industryBuildTitle: "Izenburua", industryContribute: "Lagundu", - industryContributeEco: "ECO lagundu", - industryContributeLabor: "Lana lagundu", industryContributeButton: "Ekarpena egin", - industryContributeMaterial: "Materiala lagundu", industryContributions: "Ekarpenak", - industryContributors: "laguntzaileak", industryCreateBlueprintButton: "Sortu blueprint", industryDistribute: "Banatu", industryDistributeButton: "Banatu kuoten arabera", industryDistribution: "Banaketa", industryEcoAmount: "Kopurua (ECO)", - industryEcoContribHint: "ECO ekarpenak arduradunari transferitzen zaizkio build-aren diruzaintzaren zaindari gisa.", industryEditBlueprint: "Editatu blueprint", industryFacility: "Fabrika", industryKindLabel: "Mota", @@ -3116,13 +2618,10 @@ module.exports = { industryKind_eco: "Funtsak", industryLaborHours: "Lana (orduak)", industryHours: "Orduak", - industryLicense: "Lizentzia", industryMaterialItem: "Materiala", industryMaterials: "Materialak", - industryMaterialsHint: "Material bat lerroko, izena:kopurua:prezioa formatuan.", industryEstMaterials: "Materialak guztira", industryEstLabor: "Lana guztira", - industryEstTaxes: "Zergak", industryEstTotal: "Prezio estimatua", industryBuildingPrice: "Eraikuntza prezioa", industryFinalPrice: "Azken prezioa", @@ -3132,19 +2631,13 @@ module.exports = { industryNewBlueprint: "Blueprint berria", industryNewBuild: "Proposatu build bat", industryEditBuild: "Editatu ekoizpena", - industryNoBlueprint: "— bat ere ez —", industryNeedBlueprint: "Sortu lehenik planoa: ekoizpen bakoitzak bat egiten du.", industryNoBlueprints: "Oraindik ez dago blueprint-ik.", industryNoBuilds: "Oraindik ez dago build-ik.", industryNote: "Oharra", industryOutput: "Irteera", - industryOutputItem: "Produktuaren izena", industryOutputKind: "Produktu mota", - industryOutputQty: "Unitateak ekoizpen bakoitzeko", - industryOutputUnit: "Neurri-unitatea", industryOutputValue: "Irteera balioa (ECO, adib. salmentatik)", - industryPayout: "Ordainketa", - industryPoints: "Karma", industryPostJob: "Sortu lana", industryPot: "Poltsa", industryProposeBuildButton: "Proposatu build", @@ -3152,8 +2645,6 @@ module.exports = { industryAuthor: "Egilea", industrySellOnMarket: "Bidali merkatura", industrySendToProjects: "Sortu proiektua", - industryShare: "Kuota", - industryShares: "Kuotak", industrySkills: "Trebetasunak", industryTreasury: "Diruzaintza", industryKind_physical: "Fisikoa", @@ -3167,6 +2658,16 @@ module.exports = { industryBuildStatus_FAILED: "HUTS EGINDA", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Lanpostu bat zure curriculumarekin bat dator", + jobsBotMatchIntro: "Lanpostu bat zure curriculumarekin bat dator.", + jobsBotMatchJob: "Lanpostua", + jobsBotMatchHint: "Hau jasotzen duzu zure curriculuma IAk kudeatzen duelako. Zure CVn desaktiba dezakezu.", + cvAiManaged: "IAk kudeatua", + switchOn: "PIZTUTA", + switchOff: "ITZALITA", + cvAiManagedHint: "Aktibo badago, JobsBotek mezu pribatuz abisatuko dizu lanpostu bat zure curriculumarekin bat datorrenean.", + cvMatchThreshold: "Abisatu bat etortze maila honetatik aurrera", housingBotRequestedTitle: "Norbaitek zure lekuetako bat eskatu du.", housingBotCancelledTitle: "Zure lekuetako baten eskaera ezeztatu da.", housingBotYouRequestedTitle: "Leku bat eskatu duzu.", @@ -3195,22 +2696,14 @@ module.exports = { industryRulesDistribution: "Ekoizpen bat amaitzean, stewardak pota (ekoizpenaren funtsak gehi salmenta balioa) banatzen du ekarpena egin dutenen artean, beren partaidetzaren arabera.", industryRulesTreasury: "ECO ekarpenak arduradunak gordetzen ditu build-aren diruzaintza gisa banaketa arte; mugimendu guztiak sarean erregistratzen dira eta gatazkak Courts-era joan daitezke.", industryJobs: "Lanpostuak", - industryNoJobs: "Oraindik ez dago lanposturik.", - industryCreatePosition: "Sortu lanpostua", - industryViewCV: "CV", industryReportButton: "Salatu", industryCreateTask: "Sortu zeregina", industryOpenDispute: "Ireki auzia", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "adib. unitatea, kg, lizentzia", - industryOutputItemPlaceholder: "adib. robota", - industryOutputQtyPlaceholder: "adib. 5", - industrySkillsPlaceholder: "adib. soldadura, sareak, eguzki-instalazioa", industryCreateInvite: "Sortu gonbidapena", industryPauseVotes: "Egoera botoak", industryTitle: "Industria", industryDescription: "Ekoizpen bideak modu kolektiboan kudeatzeko modulua.", - industryLabel: "Industria", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "BANAKETA", @@ -3259,9 +2752,7 @@ module.exports = { industryInviteNeeded: "Gonbidapena behar duzu elkartzeko.", industryPauseButton: "Bozkatu gelditzea", industryResumeButton: "Bozkatu berrekitea", - industryEditButton: "Editatu", industryDeleteButton: "Ezabatu", - industryBackToList: "← Industria", industryPendingApplicants: "Zain dauden eskaerak", industryVotesYes: "bai", industryVotesNo: "ez", @@ -3269,23 +2760,13 @@ module.exports = { industryAdmit: "Onartu", industryReject: "Ukatu", industryDissolveTitle: "Desegin fabrika", - industryDissolveHint: "Desegiteak boto kolektiboa behar du; arduradunak ezin du bakarrik desegin.", industryDissolveVote: "Bozkatu desegitea", - industrySector_software: "Softwarea", - industrySector_hardware: "Hardwarea", - industrySector_agriculture: "Nekazaritza", - industrySector_textile: "Ehungintza", - industrySector_energy: "Energia", - industrySector_food: "Elikadura", - industrySector_construction: "Eraikuntza", - industrySector_media: "Komunikabideak", - industrySector_services: "Zerbitzuak", - industrySector_other: "Bestelakoa", industryPolicy_open: "Irekia", industryPolicy_vote: "Botoz", industryPolicy_invite: "Gonbidapenez soilik", projectsTitle: "Proiektuak", projectsDescription: "Sortu, finantzatu eta jarraitu komunitateak gidatutako proiektuak zure sarean.", + projectSearchPlaceholder: "Bilatu proiektuak...", projectCreateProject: "Proiektu Bat Sortu", projectCreateButton: "Proiektu Bat Sortu", projectUpdateButton: "EGUNERATU", @@ -3329,14 +2810,8 @@ module.exports = { projectPledgeTitle: "Proiektua babestu", projectPledgePlaceholder: "Kantitatea ECOtan", projectBounties: "Saria", - projectBountiesInputLabel: "Sariak (lerro bakoitzean: Izenburua|Kantitatea [ECO]|Deskribapena)", - projectBountiesPlaceholder: "UI akatsa konpondu|100|Arazoaren esteka\nDokumentuak idatzi|250|Erabilera adibideak", projectNoBounties: "Ez da sariarik aurkitu.", projectTitle: "Izenburua", - projectAddBountyTitle: "Saria berri bat gehitu", - projectBountyTitle: "Sariaren izenburua", - projectBountyAmount: "Kantitatea (ECO)", - projectBountyDescription: "Deskribapena", projectMilestoneSelect: "Hitoa aukeratu", projectBountyCreateButton: "Saria sortu", projectBountyStatus: "Sariaren egoera", @@ -3351,19 +2826,15 @@ module.exports = { projectMilestoneTitle: "Hitoaren izenburua", projectMilestoneTargetPercent: "Portzentajea (%)", projectMilestoneDueDate: "Data", - projectMilestoneCreateButton: "Hitoa sortu", projectMilestoneStatus: "Hitoaren egoera", projectMilestoneOpen: "irekia", projectMilestoneDone: "osatua", projectMilestoneDue: "egonkor", - projectNoMilestones: "Ez da hitorik aurkitu.", projectMilestoneMarkDone: "Markatu amaitutako bezala", projectMilestoneTitlePlaceholder: "Hitoaren izenburua sartu", projectMilestoneDescriptionPlaceholder: "Sartu deskribapena", projectMilestoneDescription: "Hitoaren deskribapena", - projectBudgetGoal: "Aurrekontua (Helburua)", projectBudgetAssigned: "Sarietara esleituta", - projectBudgetRemaining: "Geratzen dena", projectBudgetOver: "⚠ Aurrekontua gaindituta: esleitutako zenbatekoak helburua gainditzen du", projectFollowers: "Jarraitzaileak", projectFollowersTitle: "Jarraitzaileak", @@ -3376,7 +2847,6 @@ module.exports = { projectBackersTotalPledged: "Ekarpenen guztizkoa", projectBackersYourPledge: "Zure ekarpena", projectBackersNone: "Oraindik ez dago ekarpenik.", - projectNoRemainingBudget: "Ez da aurrekonturik geratzen.", projectFilterApplied: "ESKATUTA", projectAppliedTitle: "ESKATUTA", projectFilterBackers: "BABESLEAK", @@ -3385,30 +2855,15 @@ module.exports = { projectBackerAmount: "Ekarpen osoa", projectBackerPledges: "Ekarpenak", projectBackerProjects: "Proiektuak", - projectPledgeAmount: "Kantitatea", projectSelectMilestoneOrBounty: "Hegoa edo Saria hautatu", projectPledgeButton: "Ekimen egin", footerLicense: "GPLv3", - footerPackage: "Paketea", - footerVersion: "Bertsioa", modulesModuleName: "Izena", modulesModuleDescription: "Deskribapena", modulesModuleStatus: "Egoera", modulesTotalModulesLabel: "Kargatutako Moduluak", modulesEnabledModulesLabel: "Gaituta", modulesDisabledModulesLabel: "Desgaituta", - modulesPopularLabel: "Nabarmenak", - modulesPopularDescription: "Gehien ikusi edo komentatu diren mezu ezagunak jasotzeko modulua.", - modulesTopicsLabel: "Gaiak", - modulesTopicsDescription: "Interes partekatutako kategorien araberako eztabaidak jasotzeko modulua.", - modulesSummariesLabel: "Laburpenak", - modulesSummariesDescription: "Eztabaida edo mezu luzeen laburpenak jasotzeko modulua.", - modulesLatestLabel: "Azkenak", - modulesLatestDescription: "Mezu eta eztabaida berrienak jasotzeko modulua.", - modulesThreadsLabel: "Hariak", - modulesThreadsDescription: "Gai edo galdera baten inguruko elkarrizketak jasotzeko modulua.", - modulesMultiverseLabel: "Multibertsoa", - modulesMultiverseDescription: "Beste federatutako kideetatik edukia jasotzeko modulua.", modulesInvitesLabel: "Gonbidapenak", modulesInvitesDescription: "Gonbidapen-kodeak kudeatu eta aplikatzeko modulua.", modulesWalletLabel: "Zorroa", @@ -3453,8 +2908,12 @@ module.exports = { modulesOpinionsDescription: "Iritziak aurkitu eta bozkatzeko modulua.", modulesTransfersLabel: "Transferentziak", modulesTransfersDescription: "Kontratu adimendunak (transferentziak) aurkitu eta kudeatzeko modulua.", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Kudeatu zure beste fediverso kontuak, edukia bidaltzea eta jasotzea barne.", + modulesFediverseLabel: "Multibertsoa", + modulesBlogsLabel: "Blogak", + modulesBlogsDescription: "Blogak aurkitzeko eta kudeatzeko modulua.", + modulesPollsLabel: "Inkestak", + modulesPollsDescription: "Sareari galdetzeko eta erantzunak zenbatzeko modulua.", + modulesFediverseDescription: "Kudeatu zure beste multibertso kontuak, edukia bidaltzea eta jasotzea barne.", modulesFeedLabel: "Jarioa", modulesFeedDescription: "Testu laburrak (jarioak) aurkitu eta partekatzeko modulua.", modulesPixeliaLabel: "Pixelia", @@ -3486,41 +2945,41 @@ module.exports = { visibilityMakeHidden: "Ezkutatu", invitesInhabitantsTitle: "Biztanleak", invitesInhabitantsFollow: "Jarraitu", - aiNavPlaceholder: "Nora joan nahi duzu?", + aiNavPlaceholder: "Deskribatu zer behar duzun...", aiNavDisabled: "AI nabigazioa desgaituta dago.", - aiNavResultsTitle: "AI nabigazio iradokizunak", + aiNavResultsTitle: "AINav iradokizunak", aiNavQueryLabel: "Galdera", - aiNavResultsDescription: "Aukeratu zure bilaketarekin bat datorren ibilbidea.", - aiNavResultPath: "Ibilbidea", - aiNavResultDescription: "Zer egin dezakezu", aiNavResultMatch: "Bat-egitea", aiNavResultsEmpty: "Ez dago bat datorren ibilbiderik. Saiatu /search.", - aiNavSearchInstead: "Bilatu beste modu batez", modulesAINavLabel: "AINav", modulesAINavDescription: "Sareko edukiari buruzko hizkuntza naturalezko galderak egiteko modulua.", - directConnect: "Zuzeneko Konexioa", directConnectDescription: "Konektatu zuzenean parekide batera bere IP helbidea, portua eta gako publikoa sartuz. Parekidea jarraipen-konexio gisa gehituko da.", peerHost: "IP", peerPort: "Portua (lehenetsia: 8008)", peerPublicKey: "Gako Publikoa (@...ed25519)", connectAndFollow: "Konektatu", - deviceSourceLabel: "Gailua", modulesPresetTitle: "Konfigurazio Arruntak", - modulesPreset_minimal: "Gutxienekoa", - modulesPreset_basic: "Oinarrizkoa", - modulesPreset_social: "Soziala", - modulesPreset_economy: "Ekonomia", - modulesPreset_full: "Osoa", + workflowsTitle: "Workflow-ak", + workflowsDescription: "Workflow batek gaia eta zein modulu dauden aktibo finkatzen ditu.", + workflowsSet: "Workflow-a ezarri", + workflow_default: "Lehenetsia", + workflow_jobs: "Lana", + workflow_ruling: "Gobernua", + workflow_politics: "Politika", + workflow_social: "Soziala", + workflow_business: "Negozioak", + workflow_night: "Gaua", + workflow_mobile: "Mugikorra", statsCarbonFootprintTitle: "Karbono Aztarna", - statsCarbonFootprintNetwork: "Sarearen karbono aztarna", - statsCarbonFootprintYours: "Zure karbono aztarna", statsCarbonTombstone: "Tombstoning-aren aztarna", - feedSuccessMsg: "Feeda arrakastaz argitaratu da!", - dominantOpinionLabel: "Iritzi nagusia", uploadMedia: "Multimedia igo (max: 50MB)", reportsWhyInappropriateLabel: "Zergatik da desegokia?", - visitContent: "Edukia bisitatu", + visitContent: "Bisitatu Edukia", + favoriteAdd: "Ainguratu Gogokoetan", + pmContentTooltip: "Bidali Mezu Pribatua", + favoriteRemove: "Kendu Gogokoetatik", + reportContent: "Salatu Edukia", bankEcoinHours: "ECOin Orduak", mapsLabel: "Mapak", mapTitle: "Mapak", @@ -3548,14 +3007,13 @@ module.exports = { mapDescriptionLabel: "Deskribapena", mapDescriptionPlaceholder: "Deskribatu mapa edo kokapena...", mapTypeLabel: "Mapa mota", - mapTypeSingle: "BAKARRA (hasierako kokapena soilik)", - mapTypeOpen: "IREKIA (edonork gehitu ditzake markatzaileak)", - mapTypeClosed: "ITXIA (sortzaileak soilik gehitzen ditu markatzaileak)", + mapInviteMode: "Gonbidapena", + mapTypeSingle: "BAKARRA", + mapTypeOpen: "IREKIA", + mapTypeClosed: "ITXIA", mapTagsLabel: "Etiketak", mapTagsPlaceholder: "Sartu etiketak komaz bereizita", mapUrlLabel: "Maparen URLa", - mapPickCoordLabel: "Edo hautatu kokapen bat sarean:", - mapMarkersLabel: "markatzaileak", mapMarkersTitle: "Markatzaileak", mapMarkerDefault: "Markatzailea", mapMarkerLatLabel: "Markatzailearen latitudea", @@ -3582,14 +3040,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Padak", modulesPadsDescription: "Testu editoreak lankidetzan kudeatzeko modulua.", - padFilterAll: "GUZTIAK", - padFilterMine: "NIREA", - padFilterRecent: "BERRIA", - padFilterOpen: "IREKIA", - padFilterClosed: "ITXIA", padCreate: "Pad Sortu", - padUpdate: "Pad Eguneratu", - padDelete: "Pad Ezabatu", + padUpdate: "Eguneratu", + padDelete: "Ezabatu", padTitleLabel: "Izenburua", padTitlePlaceholder: "Idatzi pad-aren izenburua...", padStatusLabel: "Egoera", @@ -3600,14 +3053,7 @@ module.exports = { padTagsLabel: "Etiketak", padTagsPlaceholder: "etiketa1, etiketa2, ...", padMembersLabel: "Kideak", - padVisitPad: "Pad Bisitatu", - padShareUrl: "URL Partekatu", padCreated: "Sortua", - padAuthor: "Egilea", - padGenerateCode: "Kodea Sortu", - padInviteCodeLabel: "Gonbidapen Kodea", - padInviteCodePlaceholder: "Sartu gonbidapen kodea...", - padValidateInvite: "Balioztatu", padStartEditing: "EDITZEN HASI!", padEditorPlaceholder: "Idazten hasi...", padSubmitEntry: "Bidali", @@ -3620,12 +3066,11 @@ module.exports = { padClosedSectionTitle: "Pad Itxiak", padCreateSectionTitle: "Pad Berria Sortu", padUpdateSectionTitle: "Pad Eguneratu", - padInviteGenerated: "Gonbidapen Kodea Sortua", typePad: "PADAK", padNew: "BERRIA", padAddFavorite: "Gogokoen Gehitu", padRemoveFavorite: "Gogokoetatik Kendu", - padClose: "Itxi Pad", + padClose: "Itxi", padBackToEditor: "Editorera itzuli", padSearchPlaceholder: "Bilatu padak...", @@ -3633,8 +3078,6 @@ module.exports = { modulesChatsDescription: "Txat zifratu publikoak aurkitu eta kudeatzeko modulua.", typeChat: "TXATAK", typeChatMessage: "TXAT MEZUA", - chatLabel: "TXATAK", - chatMessageLabel: "TXAT MEZUAK", chatsTitle: "Txatak", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3642,56 +3085,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Deskribapena", - chatMessageReply: "Erantzuna", - chatMessageLabel: "Mezua", chatCategory: "Kategoria", chatStatus: "EGOERA", - chatFilterAll: "GUZTIAK", - chatFilterMine: "NIREA", - chatFilterRecent: "BERRIA", - chatFilterFavorites: "GOGOKOAK", - chatFilterOpen: "IREKIA", - chatFilterClosed: "ITXIA", chatCreate: "Txata Sortu", - chatUpdate: "Txata Eguneratu", - chatDelete: "Txata Ezabatu", + chatUpdate: "Eguneratu", + chatDelete: "Ezabatu", chatClose: "Txata Itxi", chatVisitChat: "TXATA IKUSI", chatUntitled: "Izenburugabeko Txata", chatNoItems: "Ez da txatarik aurkitu.", chatParticipants: "Parte-hartzaileak", - chatStartChatting: "TXATEATZEN HASI!", - chatGenerateCode: "Kodea Sortu", - chatShareUrl: "URLa Partekatu", + chatMessagesLabel: "Mezuak", + chatThreadsLabel: "Hariak", chatCreatedAt: "SORTUA", chatSearchPlaceholder: "Txatak bilatu...", chatStatusOpen: "IREKIA", chatStatusInviteOnly: "GONBIDAPENEZ BAKARRIK", chatStatusClosed: "ITXIA", chatSendMessage: "Bidali", + chatJumpLatest: "Azken Mezua", + chatPickChat: "Aukeratu txat bat irekitzeko", + chatNoneYet: "Oraindik ez dago txatik eskuragarri.", + activitySearchPlaceholder: "Bilatu jardueran...", + trendingSearchPlaceholder: "Bilatu joeretan...", + opinionsSearchPlaceholder: "Bilatu iritzietan...", + votesSearchPlaceholder: "Bilatu bozketetan...", + welcomeStepUxTitle: "Aukeratu zure interfazea", + welcomeStepUxText: "Erabaki Oasis nolakoa den. Gero ezarpenetan alda dezakezu.", + welcomeStepUxAction: "Erabili ikuspegi hau", + chatRateLimitTitle: "Mezu gehiegi", + chatRateLimitMessage: "Gela honek ordu batean onartzen duen mezu mugara iritsi zara. Saiatu geroago.", chatMessagePlaceholder: "Idatzi zure mezua...", chatNoMessages: "Oraindik mezurik ez.", - chatLeave: "Txata Utzi", - chatInviteCodeLabel: "Gonbidapen kodea sartu", - chatJoinByInvite: "Sartu", chatTitlePlaceholder: "Txataren izenburua", chatDescriptionPlaceholder: "Txataren deskribapena", chatTagsPlaceholder: "etiketa1, etiketa2", chatImageLabel: "Aukeratu irudi-fitxategi bat (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Gonbidapen Kodea", chatAuthor: "Egilea", - chatCreated: "Sortua", chatAddFavorite: "Gogokoen artean gehitu", chatRemoveFavorite: "Gogokoenetatik kendu", chatPM: "MP", chatStatusLabel: "Egoera", chatCategoryLabel: "Kategoria", - chatParticipantsLabel: "Parte-hartzaileak", gamesTitle: "Jokoak", gamesDescription: "Aurkitu eta jokatu joko batzuk.", gamesFilterAll: "GUZTIAK", gamesPlayButton: "JOLASTU!", - gamesBackToGames: "Jokoetara itzuli", modulesGamesLabel: "Jokoak", modulesGamesDescription: "Jokoak aurkitzeko eta jolasteko modulua.", modulesGraphosLabel: "Graphos", @@ -3708,8 +3147,6 @@ module.exports = { gamesArkanoidDesc: "Hautsi adreilu guztiak zure pala eta pilotarekin. Arcade klasiko bat.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Ping-pong klasikoa IA baten aurka. Lehenak 5 puntu lortzen duena irabazten du.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Denboraren aurka lasterketa! Saihestu trafikoa eta iritsi helmugara garaiz.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Gidatu zure ontzia asteroide eremuaren bidez. Tiro egin haiek jo aurretik.", gamesRockPaperScissorsTitle: "Harria Paper Artaziak", @@ -3730,8 +3167,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3742,12 +3177,6 @@ module.exports = { modulesCalendarsLabel: "Egutegiak", modulesCalendarsDescription: "Egutegiak aurkitu eta kudeatzeko modulua.", typeCalendar: "EGUTEGIAK", - calendarFilterAll: "GUZTIAK", - calendarFilterMine: "NIREAK", - calendarFilterOpen: "IREKIA", - calendarFilterClosed: "ITXIA", - calendarFilterRecent: "BERRIAK", - calendarFilterFavorites: "GOGOKOAK", calendarCreate: "Egutegia sortu", calendarUpdate: "Eguneratu", calendarDelete: "Ezabatu", @@ -3760,24 +3189,17 @@ module.exports = { calendarTagsLabel: "Etiketak", calendarTagsPlaceholder: "etiketa1, etiketa2...", calendarParticipantsLabel: "Parte-hartzaileak", - calendarParticipantsCount: "Parte-hartzaileak", - calendarVisitCalendar: "Egutegia bisitatu", calendarCreated: "Sortua", - calendarAuthor: "Egilea", calendarJoin: "Batu", calendarGenerateInvite: "Sortu gonbidapena", - calendarInviteCodePlaceholder: "Sartu gonbidapen-kodea...", - calendarValidateInvite: "Egiaztatu kodea", - calendarJoined: "Batuta", - calendarAddDate: "Data gehitu", - calendarAddNote: "Oharra gehitu", calendarDateLabel: "Data", calendarDatePlaceholder: "Data hau deskribatu...", - calendarNoteLabel: "Oharra", + calendarNoteLabel: "Oharrak", calendarNotePlaceholder: "Oharra gehitu...", calendarFirstDateLabel: "Data", calendarFirstNoteLabel: "Oharrak", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Errepikapenik gabe", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3788,8 +3210,6 @@ module.exports = { calendarsDescription: "Aurkitu eta kudeatu zure sareko egutegiak.", calendarMonthPrev: "← Aurrekoa", calendarMonthNext: "Hurrengoa →", - calendarMonthLabel: "Datak", - calendarsShareUrl: "Partekatzeko URLa", calendarAllSectionTitle: "Egutegiak", calendarRecentSectionTitle: "Egutegi Berriak", calendarFavoritesSectionTitle: "Gogokoak", @@ -3803,7 +3223,6 @@ module.exports = { calendarRemoveFavorite: "Gogokoetatik kendu", calendarSearchPlaceholder: "Egutegiak bilatu...", calendarAddEntry: "Gehitu Sarrera", - calendarLeave: "Irten Egutegitik", statsCalendar: "Egutegiak", statsCalendarDate: "Egutegi datak", statsCalendarNote: "Egutegi oharrak", @@ -3850,7 +3269,6 @@ module.exports = { torrentSortOldest: "Zaharrenak", torrentSortTop: "Bozkatu enak", torrentNoMatch: "Ez dago torrent bat datorrenik.", - torrentMessageAuthorButton: "Mezua Bidali Egileari", torrentUpdatedAt: "Eguneratua", statsTorrent: "Torrentak", typeTorrent: "TORRENTAK", @@ -3858,10 +3276,18 @@ module.exports = { modulesTorrentsDescription: "Torrentak aurkitu eta kudeatzeko modulua.", favoritesFilterTorrents: "TORRENTAK", favoritesFilterMarket: "MERKATUA", + favoritesFilterEvents: "EKITALDIAK", + favoritesFilterForum: "FOROA", + favoritesFilterHousing: "ETXEBIZITZA", + favoritesFilterJobs: "LANPOSTUAK", + favoritesFilterProjects: "PROIEKTUAK", + favoritesFilterReports: "TXOSTENAK", + favoritesFilterTasks: "ZEREGINAK", + favoritesFilterTransfers: "TRANSFERENTZIAK", + favoritesFilterVotes: "BOZKETAK", favoritesFilterShopProducts: "DENDAKO ARTIKULUAK", tribeSectionTorrents: "TORRENTAK", tribeCreateTorrent: "Torrenta Igo", - tribeMediaTypeTorrent: "Torrenta", settingsWishTitle: "Nahia", settingsWishDesc: "Konfiguratu zure Avatarraren nahia.", settingsWishWhole: "Multiverse", @@ -3872,16 +3298,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "Bidalketa UX babes bat da. Jasotzea arreta-iragazkia.", - pmBlockedNonMutual: "Elkarrekiko laguntza duten biztanleei bakarrik bidal diezaiekezu.", inhabitantsPendingFollowsTitle: "Onespen zain dauden eskaerak", inhabitantsPendingAccept: "Onartu", inhabitantsPendingReject: "Ukatu", - bxEncrypted: "ZIFRATUA", - bxEncryptedHexLabel: "Testu zifratua (aurrebista)", tribeSectionGovernance: "GOBERNANTZA", - tribeSubStatusPublic: "PUBLIKOA", - tribeSubStatusPrivate: "PRIBATUA", - tribeSubInheritedPrivate: "PRIBATUA (tribu nagusitik heredatua)", tribePadInviteRequired: "Ez duzu pada atzipena. Eskatu gonbidapena.", tribeChatInviteRequired: "Ez duzu txata atzipena. Eskatu gonbidapena.", tribeGovernanceDesc: "Tribu honen barne gobernantza.", @@ -3921,44 +3341,31 @@ module.exports = { tribeGovNoHistorical: "Oraindik ez dago erregistrorik", logsTitle: "Egunkaria", logsDescription: "Erregistratu zure esperientzia sarean.", - logsReadMore: "Gehiago irakurri", logsViewTitle: "Egunkaria", logsColumnType: "Mota", logsView: "Ikusi", - logsManualPrompt: "Idatzi zure egunkaria", logsUpdateButton: "Eguneratu", - logsEditTitle: "Sarrera editatu", - logsCreateDescription: "Erregistratu zure esperientzia...", + logsEditTitle: "Eguneratu erregistroa", logsCreateTitle: "Sarrera sortu", logsWriteButton: "Idatzi", logsTextPlaceholder: "Deskribatu zure esperientziak...", - logsTextField: "Testua", - logsLabelPlaceholder: "Etiketa...", - logsLabelField: "Idatzi zure egunkaria (etiketa)", - logsAiDisabledWarn: "Gaitu AA modulua /modules-en AA-idatzitako sarrerak erabiltzeko.", - logsAiContextValue: "Blockchain-eguna", - logsAiContext: "Testuingurua", - logsAiModStatus: "AImod", - logsModeApply: "Aplikatu!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Eskuz", logsModeAI: "AA", - logsColumnDelete: "Ezabatu", - logsColumnEdit: "Editatu", logsColumnLog: "Egunkaria", logsColumnDate: "Data", logsDelete: "Ezabatu", - logsEdit: "Editatu", + logsEdit: "Eguneratu", logsFilterAlways: "BETI", logsFilterYear: "AZKEN URTEA", logsFilterMonth: "AZKEN HILABETEA", logsFilterWeek: "AZKEN ASTEA", logsFilterToday: "GAUR", - logsFilterRecent: "BERRIAK", - logsFilterAll: "DENAK", + logsComments: "Iruzkinak", + logsAuthorEntries: "Sarrerak", logsCreate: "Sarrera sortu", logsExport: "Egunkaria esportatu", - logsExportOne: "Esportatu", + logsExportOne: "Esportatu erregistroa", logsViewDetails: "Ikusi xehetasunak", logsGenerateButton: "Sortu testua", logsSearchText: "Bilatu egunkarietan...", @@ -3968,31 +3375,25 @@ module.exports = { modulesLogsLabel: "Egunkaria", modulesLogsDescription: "Modulua zure esperientziak (AA laguntzailearen bidez) erregistratzeko.", statsLogsTitle: "Egunkaria", - statsLogsEntries: "Sarrerak", typeLog: "EGUNKARIA", - blockchainCycle: "Zikloa", larpTitle: "L.A.R.P.", larpDescription: "Esperimentazio kolaboratiborako zuzeneko rol-joko geruza bat.", + larpNoHousesMatch: "Ez dago bilaketarekin bat datorren etxerik.", + larpSearchPlaceholder: "Bilatu etxeak...", larpAllHouses: "Etxeak:", larpFilterRuling: "AGINTZEN", larpFilterHouses: "ETXEAK", larpFilterRules: "FAQ", larpRulesTitle: "L.A.R.P. FAQ", - larpRulesEntryTitle: "Hasierako etxea", larpRulesEntryText: "Bizilagun bakoitza ACADEMIA-n hasten da lehenespenez. ACADEMIA-tik, aukeratu etxe bat \"Etxe batera sartu\" panelean: horrek sarrera-proba irekitzen du. Erantzun 10 galderak eta bidali. Atalasea (7/10) gainditzen baduzu, automatikoki onartzen zaitu etxe horretan; bestela, baztertuta gelditzen zara eta ACADEMIA-n geratzen zara. Bietan, sistemak zure OasisID eta saiakera-zikloa erregistratzen ditu eta beste saiakera bat eragozten du 30 zikloko itxaronaldia igaro arte.", - larpRulesLeaveText: "Edozein etxetako kideek ACADEMIA-ra itzul daitezke noiznahi beren etxe-orritik; horrek kidetza berrabiarazten du, baina ez du saiakera-itxaronaldia indargabetzen.", - larpRulesGovernanceTitle: "Gobernu-horma", larpRulesGovernanceText: "Bere zikloan, etxe agintariak \"Agintzen\" intsignia darama eta bere horma da soilik AGINTZEN fitxapean publikoki erakusten dena.", - larpRulesSignTitle: "L.A.R.P. Ikurra", + larpRulesWallText: "Etxe bakoitzak Horma bat du, non bere kideek idazten duten. Etxe baten Horma pribatua da, agintean dagoen etxearena eta ACADEMIArena izan ezik, edonork irakur baititzake.", larpRulesSignText: "Bizilagunek aktiba dezakete (/profile/edit > Sentsoreak) beren uneko etxearen irudia zigilu gisa erakusteko profilean, egile- eta bizilagun-txartelean. Zigiluak etxearen orrira eramaten du.", larpPostsTitle: "Horma", larpPostsEmpty: "Oraindik ez dago argitalpenik.", - larpPostLabel: "Argitalpen berria", larpPostPlaceholder: "Zer du etxe honek esateko?", - larpPostPublic: "Publikoa (edonork ikusgai, bestela kideek soilik)", larpPostSubmit: "Argitaratu", - larpPostMembersOnly: "Kideek soilik", larpCycleLabel: "Zikloa:", audioBackToBcs: "Back to BCS", audioFilterBcs: "BCS", @@ -4112,12 +3513,9 @@ module.exports = { bankTaxesLookupNote: "Sartu bloke-ID bat zure jario lokalean bilatzeko.", bankTaxesUserNoteChipsClick: "Egin klik edozein chiptan bere blokea blockexplorer-en ikuskatzeko.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Gonbidapen kodea", larpRulesInviteEntryText: "Etxeko kideek gonbidapen kodeak sor ditzakete, etxerako sarrera zuzena ematen dutenak.", larpRulesOneHouseText: "Une bakoitzean etxe bakar batekoa izan zaitezke gehienez. Inori ez baduzu, ACADEMIA-n zaude. ACADEMIA ez den etxeko orri bakoitzak \"Etxetik atera\" botoia erakusten die kideei, kidetza ACADEMIA-ra berrezartzen duena. Ateratzea EZ du proba-itxaronaldia indargabetzen.", - larpRulesOneHouseTitle: "Etxe bana aldi bakoitzean", - larpRulesTestEntry: "WILL proba", - larpRulesTestEntryText: "Aukera bakoitzak etxe bati edo gehiagori pisua ematen die; bidaltzean, sistemak puntuak batzen ditu eta puntuazio handiena duen etxean automatikoki onartzen zaitu.", + larpRulesTestEntryText: "WILL testean aukera bakoitzak etxe bat edo gehiago haztatzen ditu; bidaltzean, sistemak puntuazioak batzen ditu eta puntu gehien dituen etxean onartzen zaitu automatikoki.", larpWillTestHint: "Behin osatutakoan, zure erantzunekin ondoen bat datorren etxera esleituko zaitu. Zure erantzun indibidualak lokalki prozesatzen dira eta inoiz ez dira gordetzen — soilik etxe-esleipenaren emaitza argitaratzen da zure jarioan.", larpWillTestTitle: "WILL proba", settingsLanDesc: "Aldian behin iragarri pareko hau sare lokal bereko beste Oasis instantziei. Desgaitu UDP igorpenak gelditzeko.", @@ -4136,31 +3534,27 @@ module.exports = { aiExchangeMarkHelpful: "+1 lagungarri", larpCyclesUntilRuling: "Hurrengo gobernu-zikloa", larpVisitTribe: "Tribua bisitatu", - larpGoverning: "Agintzen:", + larpStartJourney: "Hasi bidaia", + larpGoverning: "Agintean:", + larpStartHere: "Hasi hemen:", larpMyHouse: "Nire Etxea:", larpMembersCount: "Kideak", - larpMembersTitle: "Kideak", - larpNoMembers: "Oraindik ez dago kiderik.", larpRolesLabel: "Rolak", larpFunctionLabel: "Funtzioa", larpMonthLabel: "Gobernu-zikloa", larpLeaveToAcademia: "Itzuli ACADEMIA-ra", - larpAcademiaJoinTitle: "Etxe batera sartu", - larpAcademiaJoinHint: "Egin profil psikologikoaren proba zuri ondoen egokitzen zaizun etxera esleitua izateko, edo erabili etxeko kide batek partekatutako gonbidapen-kodea.", - larpTakeTestButton: "Profil-proba egin", + larpAcademiaJoinTitle: "L.A.R.P. Etxeak", larpInviteRedeem: "Etxera sartu", larpInviteCreate: "Gonbidapen-kodea sortu", larpInvitePlaceholder: "Gonbidapen-kodea", larpInviteBannerTitle: "Gonbidapen-kode berria", larpInviteBannerHint: "Partekatu kode hau ACADEMIA-n dagoen norbaitekin. 30 zikloko edo erabilera bakar baten ostean iraungitzen da.", - larpTestAssignedHouse: "Esleitutako etxea", larpTestRankingTitle: "Etxe bakoitzeko puntuazioa", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Etxearen gonbidapen-kodea", invitesHouseJoinButton: "Etxera sartu", larpLastAttemptTitle: "Zure azken saiakera", larpLastAttemptHouse: "Etxea", - larpLastAttemptResult: "Emaitza", larpLastAttemptWhen: "Noiz", larpLastAttemptCooldown: "Hurrengo saiakera", larpTestTitle: "Sarrera-proba", @@ -4169,39 +3563,14 @@ module.exports = { larpTestCooldownActive: "Hurrengo proba erabilgarri", larpTestCooldownDays: "ziklo", larpTestResultTitle: "Probaren emaitza", - larpTestPassed: "Proba gainditua — ongi etorri!", - larpTestFailed: "Proba ez da gainditu", larpTestScore: "Puntuazioa", larpTestNextAttempt: "Beste proba bat egin dezakezu 30 ziklo barru.", larpGoToHouse: "Joan zure etxera", larpBackToAcademia: "Itzuli ACADEMIA-ra", - larpBackToHouses: "◀ Etxeak", larpBadgeYou: "Zu", larpBadgeRuling: "Agintzen", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Oasis-en zuzeneko rol-joko geruzaren modulua (9 Etxeak).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - ecoinTaxLabel: "ECOin Tax", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - statsEcoTaxTitle: "ECO Tax", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - audioBackToAudio: "Back to audio", - audioAuthorLabel: "Author", - courtsEvidenceFileLabel: "Evidence file (image, audio, video or PDF)", - courtsCaseMediators: "Mediators", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Arazo konplexu baten aurrean, lehenik zer egiten duzu?", larpProfileQ1O1: "Besteekin hitz egin adostasuna lortzeko", larpProfileQ1O2: "Prototipo bat egin probatzeko", diff --git a/src/client/assets/translations/oasis_fr.js b/src/client/assets/translations/oasis_fr.js index 65aa930..50ccf57 100644 --- a/src/client/assets/translations/oasis_fr.js +++ b/src/client/assets/translations/oasis_fr.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { fr: { - languageName: "Français", shopOrderStatusPaid: "Paiement reçu", shopOrderStatusReceived: "Reçu", shopOrderMarkPaid: "Marquer paiement reçu", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Vous n’avez pas encore d’achats.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Vendeur", - shopOrderPaymentConcept: "Paiement", shopOrderInvoice: "Facture", shopOrderInvoiceConcept: "Facture", shopOrderStatusPending: "En attente", shopOrderStatusAccepted: "Accepté", shopOrderStatusRejected: "Rejeté", shopOrderStatusShipped: "Expédié", - shopOrderStatusDelivered: "Livré", shopOrderAccept: "Accepter", shopOrderReject: "Rejeter", shopOrderMarkShipped: "Marquer expédié", - shopOrderMarkDelivered: "Marquer livré", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Contrat", shopOrderContractConcept: "Commande boutique", shopOrdersPending: "Commandes en attente", all: "Tous", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Voir le JSON", matchScore: "Score de correspondance", preferencesLabel: "Préférences", - inhabitantProfileTitle: "Profil de l’habitant", + inhabitantProfileTitle: "Habitant", contentWarningLabel: "Avertissement de contenu", invalidPost: "Contenu invalide", invalidPostHint: "Ce message a un texte vide/invalide.", spreadBy: "Par", spreadChron: "Diffusion", spreaded: "Diffusé", - spreadMore: "plus", spreadContentUnavailable: "Contenu pas encore disponible (réplication en attente)", filteredByTag: "Filtré par étiquette", filteredByTagTitle: "Filtré par étiquette", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Aucune gravité", calendarDeleteDate: "Supprimer la date", calendarIntervalUntil: "Jusqu’au", - bookmarkCategory: "Catégorie", bookmarkLastVisit: "Dernière visite", profileClearnetBookmarksLabel: "Favoris", - forumFilterHot: "Populaires", invitesPort: "Port", currentlyUnrecheable: "ERREUR !", peerHostValidation: "IPv4 valide (ex. 192.168.1.100) ou nom d’hôte (ex. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Estimation max annuelle", statsCarbonNetwork: "Total du réseau", statsCarbonOfEstMax: "de la capacité max estimée", + statsCarbonYearProgress: "de l'année écoulée", + statsNetworkTitle: "Réseau", + statsStorageTitle: "Stockage", + statsEcoTaxTitle: "Taxe ECO", + statsAccountTitle: "Compte", + statsAveragesTitle: "Moyennes", statsCarbonOfNetwork: "du total du réseau", statsCarbonUser: "Votre empreinte", statsContentCountColumn: "Nombre", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Principales étiquettes", statsTopTypesTitle: "Principaux types de contenu", statsTotalMsgs: "Total des messages", - feedViewDetails: "Voir les détails", - eventFileLabel: "Joindre une image", - taskFileLabel: "Joindre une image", - courtsRespondentRequired: "L'identifiant du défendeur est requis", extended: "Multivers", extendedDescription: [ "Lorsque vous soutenez quelqu’un, vous pouvez télécharger les publications des habitants qu’il soutient, et ces publications apparaîtront ici, triées de la plus récente.", @@ -203,29 +197,22 @@ module.exports = { graphosShowing: "Affichage", graphosYou: "Toi", graphosTotalNodes: "Nœuds totaux", - manualMode: "Mode Manuel", mentions: "Mentions", mentionsDescription: [ - strong("Publications qui vous @mentionnent"), - ", triées des plus récentes.", + strong("Chaque message qui vous @mentionne"), + ".", ], - nextPage: "Suivant", - previousPage: "Précédent", noMentions: "Vous n’avez pas encore reçu de @mentions.", + mentionsSearchPlaceholder: "Rechercher des mentions...", privateReminders: "RAPPELS", inboxFiltersLabel: "Filtres :", inboxToggleToMutuals: "Passer à mutuels", inboxToggleToWhole: "Passer à tous", - privateFrom: "De", - privateTo: "Pour", privateDate: "Date", peers: "Nœuds", searchDescription: "Description", - imageSearch: "Rechercher des images", searchFromLabel: "De", searchToLabel: "À", - searchMinOpinionsLabel: "Min opinions", - searchInhabitantLabel: "Habitant (Oasis ID)", searchQueryLabel: "Recherche", searchPerPageLabel: "Résultats par page", settings: "Configuration", @@ -237,67 +224,38 @@ module.exports = { melodyTitle: 'Melody', melodyDescription: 'Joue la mélodie de ta blockchain — chaque bloc devient une note.', melodyEmpty: 'Pas encore de notes — ta blockchain n’a pas encore produit de bloc.', - melodyCompositionHelp: 'Chaque bloc de ta blockchain devient une note musicale selon son type et sa taille.', - melodyStatsTitle: 'Répartition par type', - melodyInhabitantLabel: 'Habitant', melodyTotalBlocks: 'Notes', - melodyType: 'Type', - melodyCount: 'Blocs', melodyFilterAll: 'TOUTES', - melodyFilterShare: 'Téléverser une mélodie', - melodyShareTitle: 'Partage ta mélodie', - melodyShareHelp: 'Publie un instantané de ta mélodie actuelle pour que d’autres puissent l’écouter et la remixer.', - melodyShareTitleLabel: 'Titre (optionnel)', - melodyShareTitlePlaceholder: 'Un fantôme de blockchain', - melodyShareSubmit: 'Publier la mélodie', - melodyNoShared: 'Aucune mélodie blockchain pour l’instant.', melodyRegenerate: 'Régénérer', melodyDownload: "Télécharger BCS", - profileActivityTitle: 'Activité', - profileActivityMore: 'Voir toute l’activité', profileContentSectionTitle: 'Contenu de l’avatar', profileContentHelp: 'Choisis les modules à afficher sur ton avatar.', profileSensorsHelp: 'Métriques optionnelles affichées sur ton avatar.', profileClearnetHelp: 'Modules accessibles depuis l’extérieur d’Oasis.', profileHubAll: 'Tout', - profileHubTitle: 'Contenu Public', - footerPulseTitle: 'Pouls', - footerPulsePeers: 'Pairs', - footerPulseInbox: 'Boîte', - footerPulseSync: 'Dernière sync', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Dernière activité', footerLicenseLabel: 'Licence', profileSwitchToOasis: 'Retour à Oasis', - profileSwitchToClearnet: 'Plonger dans le Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Plonger dans le fédiverse", - coordLabel: 'Coordonnées (ex., A3)', - coordPlaceholder: 'Saisissez une coordonnée', + profileVisibilityFediverse: "Multivers", contributorsTitle: "Contributions", - pixeliaBy: "par", colorLabel: 'Choisir une couleur', paintButton: 'Dessiner !', - invalidCoordinate: 'Coordonnée incorrecte', - goToMuralButton: "Voir la fresque", totalPixels: 'Total de pixels', modules: "Modules", modulesViewTitle: "Modules", modulesViewDescription: "Définissez votre environnement idéal en activant et désactivant des modules.", inbox: "Boîte", multiverse: "Multivers", - fediverse: "Fediverse", - fediverseDescription: "Gérez vos autres comptes du fédiverse, y compris l'envoi et la réception de contenu.", + fediverse: "Multivers", + fediverseDescription: "Gérez vos autres comptes du multiverse, y compris l'envoi et la réception de contenu.", fediverseStatus: "Statut", - fediverseDisconnected: "Fédiverse déconnecté. Vérifiez %LINK% ou l'état de la connexion.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiverse déconnecté. Vérifiez %LINK% ou l'état de la connexion.", + fediverseSettingsTitle: "Multivers", fediverseInstanceLabel: "Adresse", fediverseTokenLabel: "Jeton d'accès", fediverseTokenHelp: "Définissez votre jeton d'accès. Il servira à gérer votre compte Mastodon depuis Oasis.", fediverseConnect: "Connecter", fediverseConnectedAs: "Connecté en tant que", fediverseDisconnect: "Déconnecter", - fediverseEmpty: "Lorsque vous connectez d'autres comptes du fédiverse depuis %LINK%, vous pouvez les gérer ici.", fediverseEmptyLink: "vos réglages", fediverseComposePlaceholder: "À quoi pensez-vous ?", fediverseReplyPlaceholder: "Écrivez votre réponse…", @@ -306,21 +264,15 @@ module.exports = { fediverseReply: "Répondre", fediverseBoosted: "a partagé", fediverseNoPosts: "Votre fil est vide.", - fediverseThread: "Fil", fediverseTimeline: "Fils", - fediverseManageTimeline: "Gérer le fil", fediverseFollowers: "Abonnés", fediverseFollowing: "Abonnements", fediversePosts: "Publications", fediverseJoined: "Inscrit", - fediverseOverview: "Vue d'ensemble", fediverseRefresh: "Actualiser", fediverseWrite: "Écrire", fediversePreview: "Aperçu", - fediverseEdit: "Modifier", - fediverseOpenFeed: "Voir le flux", fediverseManage: "Gérer", - fediverseStatusNotConnected: "Non connecté", fediverseError: "Impossible de contacter Mastodon.", fediverseErrInstance: "URL d'instance invalide.", fediverseErrAuth: "Jeton invalide ou expiré.", @@ -331,17 +283,6 @@ module.exports = { fediverseErrPost: "Impossible de publier.", fediverseErrMedia: "Impossible d'envoyer le fichier.", fediverseErrEmpty: "Écrivez quelque chose ou joignez un fichier.", - popularLabel: "À la une", - topicsLabel: "Sujets", - latestLabel: "Derniers", - summariesLabel: "Résumés", - threadsLabel: "Fils", - multiverseLabel: "Multivers", - inboxLabel: "Boîte", - invitesLabel: "Invitations", - walletLabel: "Portefeuille", - legacyLabel: "Clés", - cipherLabel: "Chiffreur", bookmarksLabel: "Marque-pages", videosLabel: "Vidéos", torrentsLabel: "Torrents", @@ -352,18 +293,14 @@ module.exports = { inhabitantsLabel: "Habitants", trendingLabel: "Tendances", eventsLabel: "Événements", - tasksLabel: "Tâches", apply: "Appliquer", menuPersonal: "Personnel", - menuContent: "Contenu", - menuBlogs: "Blogs", menuGovernance: "Gouvernance", menuOffice: "Bureau", - menuMultiverse: "Multivers", - menuNetwork: "Réseau", + menuNetwork: "Communauté", menuCreative: "Créatif", menuEconomy: "Économie", - menuMedia: "Médias", + menuMedia: "Bibliothèque", menuTools: "Outils", comment: "Commenter", subtopic: "Sous-sujet", @@ -373,13 +310,6 @@ module.exports = { follow: "Soutenir", block: "Bloquer", unblock: "Débloquer", - newerPosts: "Nouveaux posts", - olderPosts: "Anciens posts", - feedRangeEmpty: "La plage appliquée est vide pour ce fil. Essayez de voir le ", - seeFullFeed: "fil complet", - feedEmpty: "Le réseau Oasis n’a jamais vu de posts depuis ce compte.", - beginningOfFeed: "Ceci est le début du fil", - noNewerPosts: "Aucun nouveau post reçu pour l’instant.", relationshipNotFollowing: "Ne vous soutient pas", relationshipTheyFollow: "Vous soutient", relationshipMutuals: "Soutien mutuel", @@ -389,16 +319,12 @@ module.exports = { relationshipBlockedBy: "Vous bloque", relationshipMutualBlock: "Blocage mutuel", relationshipNone: "Vous ne soutenez pas", - relationshipConflict: "Conflit", relationshipBlockingPost: "Post bloqué", viewLikes: "Voir les soutiens", spreadedDescription: "Liste des posts soutenus par habitant.", - totalspreads: "Soutiens totales", - attachFiles: "Joindre des fichiers", preview: "Prévisualiser", publish: "Publier", contentWarningPlaceholder: "Ajoutez un titre à votre post (optionnel)", - privateWarningPlaceholder: "Ajoutez des habitants pour envoyer un post privé (optionnel)", publishWarningPlaceholder: "Corps limité à 7000 caractères.", publishTooLong: "Votre publication est trop longue. Veuillez la raccourcir.", publishCustomDescription: [ @@ -407,8 +333,6 @@ module.exports = { commentWarning: [ "RAPPELEZ-VOUS : En raison de la technologie blockchain, une fois que vous avez publié quelque chose, cela ne peut pas être modifié ni supprimé. Réfléchissez bien !", ], - commentPublic: "public", - commentPrivate: "privé", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -428,7 +352,6 @@ module.exports = { ".", ], publishCustom: "Écrire un post avancé", - subtopicLabel: "Créez un sous-sujet pour ce post", messagePreview: "Prévisualisation", mentionsMatching: "Mentions", mentionsName: "Nom", @@ -451,24 +374,19 @@ module.exports = { ssbLogStream: "Blockchain", ssbLogStreamDescription: "Configurez la limite de messages pour les flux de la blockchain.", saveSettings: "Enregistrer la configuration", - exportTitle: "Exporter des données", exportDescription: "Définissez un mot de passe (min 32 caractères) pour chiffrer votre secret", exportDataTitle: "Sauvegarde", exportDataDescription: "Télécharger votre blockchain (clé privée exclue !)", exportDataButton: "Télécharger la blockchain", - pubWallet: "Portefeuille du PUB", - pubWalletDescription: "Définissez l’URL du portefeuille du PUB. Elle sera utilisée pour les transactions du PUB (RBU incluse).", - pubWalletConfiguration: "Enregistrer la configuration", - importTitle: "Importer des données", importDescription: "Importez votre secret chiffré (clé privée) pour activer votre avatar", - importAttach: "Joindre le fichier chiffré (.enc)", - passwordLengthInfo: "Le mot de passe doit contenir au moins 32 caractères.", passwordImport: "Saisissez votre mot de passe pour déchiffrer les données qui seront enregistrées sur votre système (nom : secret)", exportPasswordPlaceholder: "Utilisez des minuscules, majuscules, chiffres et symboles", fileInfo: "Votre secret chiffré sera téléchargé sur votre appareil (nom : oasis.enc)", developer: "Développement", devTitle: "Développement", welcomeBannerText: "Bienvenue sur OASIS. Suivez ces quelques étapes pour configurer votre avatar.", + aiSuggestionBanner: "Suggestion :", + aiSuggestionsEnable: "Suggestions de l'IA", welcomeBannerAction: "Commencer !", welcomeTitle: "Bienvenue", welcomeStepGreetingAction: "Envoyer", @@ -511,14 +429,9 @@ module.exports = { devParentFolder: "Dossier parent", devOpenFolder: "ouvrir", devDescription: "Explorez le code source exécuté sur ce nœud.", - devTreeTitle: "Fichiers", - devSearchTitle: "Chercher dans le code", - devMapTitle: "Modules", devRoot: "racine", - devRootButton: "RACINE", devSearchPlaceholder: "Texte à chercher dans le code", devAnyExtension: "Tout fichier", - devSearchButton: "Chercher", devStatsFiles: "Fichiers", devStatsLines: "Lignes", devStatsModules: "Modules", @@ -555,16 +468,13 @@ module.exports = { languageDescription: "Si vous souhaitez utiliser une autre langue, sélectionnez-la ici.", setLanguage: "Définir la langue", - peerConnections: "Nœuds", peerConnectionsIntro: "Gérez toutes vos connexions avec d’autres nœuds.", peerConnectionsTitle: "Connexions", online: "En ligne", offline: "Hors ligne", discovered: 'Découverts', unknown: 'Inconnus', - lanBroadcastLabel: "Diffusion LAN", lanBroadcastActive: "Active (multicast UDP sur le LAN)", - lanBroadcastDisabled: "Désactivée (mode pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -577,8 +487,6 @@ module.exports = { noConnections: "Aucun nœud connecté.", noDiscovered: "Vous n’avez découvert aucun nœud.", noUnknownPeers: "Aucun pair inconnu dans le graphe d’amis.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -588,9 +496,6 @@ module.exports = { peerImport: "Importer", peerImportTitle: "Importer la liste de pairs", peerImportPlaceholder: "Colle une adresse multiserver par ligne, ou téléverse un fichier .txt…", - noSupportedConnections: "Aucun nœud pris en charge.", - noBlockedConnections: "Aucun nœud bloqué.", - noRecommendedConnections: "Aucun nœud recommandé.", connectionActionIntro: "", startNetworking: "Démarrer le réseau", @@ -604,9 +509,19 @@ module.exports = { homePageDescription: "Sélectionnez le module que vous souhaitez comme page d'accueil.", saveHomePage: "Enregistrer la page d'accueil", invites: "Invitations", - invitesTitle: "Invitations", - invitesInvites: "Invitations", invitesDescription: "Gérer et appliquer des codes d’invitation dans votre réseau.", + invitesPubsHint: "Collez un code d'invitation de pub pour vous fédérer avec lui et répliquer ses habitants.", + invitesFederationsHint: "Pubs avec lesquels vous êtes fédéré : actualisez-les, retirez les injoignables ou exportez la liste.", + invitesHousesHint: "Saisissez un code de maison pour rejoindre une maison du LARP et participer à son économie.", + invitesTribesHint: "Saisissez un code de tribu pour en devenir membre et accéder à son contenu privé.", + invitesChatsHint: "Saisissez un code de chat pour rejoindre la conversation et ses fils.", + invitesPadsHint: "Saisissez un code de pad pour écrire à plusieurs sur un document partagé.", + invitesCalendarsHint: "Saisissez un code de calendrier pour partager dates et rappels.", + invitesEventsHint: "Saisissez un code d'événement pour rejoindre un événement privé.", + invitesForumsHint: "Saisissez un code de forum pour lire et répondre dans un forum privé.", + invitesMapsHint: "Saisissez un code de carte pour ajouter et voir des lieux sur une carte partagée.", + invitesShopsHint: "Saisissez un code de boutique pour rejoindre une boutique et son catalogue.", + invitesInhabitantsHint: "Saisissez un code d'habitant pour vous suivre mutuellement et échanger du contenu.", invitesTribesTitle: "Tribus", invitesTribeInviteCodePlaceholder: "Saisissez le code de la tribu", invitesTribeJoinButton: "Entrer dans la tribu", @@ -637,7 +552,6 @@ module.exports = { invitesAlreadyFederated: "Vous êtes déjà fédéré avec ce pub.", invitesFederationsTitle: "Fédérations", invitesAcceptedInvites: "Fédérés", - invitesNoInvites: "Aucune invitation acceptée pour le moment.", invitesNoFederatedPubs: "Aucun pub fédéré.", invitesUnreachablePubs: "Inaccessibles", invitesNoUnreachablePubs: "Aucun pub inaccessible.", @@ -653,39 +567,24 @@ module.exports = { panicMode: "Mode Panique !", encryptData: "Définissez un mot de passe (min 32 caractères) pour chiffrer votre blockchain", decryptData: "Saisissez le mot de passe pour déchiffrer votre blockchain", - panicModeDescription: "Chiffrer/Déchiffrer ou SUPPRIMER votre blockchain", removeDataDescription: "ATTENTION : Ce processus ne peut pas être annulé.", - encryptPanicButton: "Chiffrer la blockchain", - decryptPanicButton: "Déchiffrer la blockchain", removePanicButton: "SUPPRIMER TOUTES VOS DONNÉES !", searchTitle: "Rechercher", searchDescriptionLabel: "Rechercher du contenu dans votre réseau.", - searchLanguagesLabel: "Langues", - searchSkillsLabel: "Compétences", searchPlaceholder:"Rechercher du contenu...", - searchDateLabel:"Date", searchLocationLabel:"Localisation", searchPriceLabel:"Prix", - searchUrlLabel:"URL", searchCategoryLabel:"Catégorie", - searchStartLabel:"Date de début", - searchEndLabel:"Date de fin", searchPriorityLabel:"Priorité", searchStatusLabel:"État", statusLabel:"État", - totalVotesLabel:"Total des votes", noResultsFound:"Aucun résultat trouvé.", votesOption:"Opinions votées", voteYesLabel:"Oui", voteNoLabel:"Non", allTypesLabel: "SANS LIMITES", - ABSTENTIONLabel:"ABSTENTION", YESLabel:"OUI", NOLabel:"NON", - FOLLOW_MAJORITYLabel: "SUIVRE LA MAJORITÉ", - CONFUSEDLabel: "CONFUS", - NOT_INTERESTEDLabel: "SANS INTÉRÊT", - StatusLabel:"État", votesOptionYesLabel:"Oui", votesOptionNoLabel:"Non", votesOptionAbstentionLabel:"Abstention", @@ -693,7 +592,6 @@ module.exports = { votesCreatedByLabel:"Créé le", voteStatusOpen:"OUVERT", voteStatusClosed:"FERMÉ", - imageSearchLabel: "Saisissez des mots pour rechercher les images étiquetées avec ces mots.", commentDescription: ({ parentUrl }) => [ " a commenté dans ", a({ href: parentUrl }, " fil"), @@ -704,53 +602,20 @@ module.exports = { a({ href: parentUrl }, " un post"), ], subtopicTitle: ({ authorName }) => [`A créé un sous-sujet dans le post de @${authorName}`], - mysteryDescription: "a publié un post mystérieux", oasisDescription: "OASIS Réseau de Projets", searchSubmit: "Rechercher...", - postLabel: "PUBLICATIONS", - aboutLabel: "HABITANTS", - feedLabel: "FLUX", votesLabel: "GOUVERNANCE", - reportLabel: "RAPPORTS", - imageLabel: "IMAGES", - videoLabel: "VIDÉOS", - audioLabel: "AUDIOS", - documentLabel: "DOCUMENTS", - torrentLabel: "TORRENTS", pdfFallbackLabel: "Document PDF", - eventLabel: "ÉVÉNEMENTS", - taskLabel: "TÂCHES", - transferLabel: "TRANSFERTS", - curriculumLabel: "CURRICULUM VITAE", - bookmarkLabel: "LIENS", - tribeLabel: "TRIBUS", - marketLabel: "MARCHÉ", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "PORTEFEUILLES", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Appliquer", - subjectLabel: "Sujet", editProfile: "Éditer l’Avatar", - profileQrAlt: "Code QR du profil", - profileQrHint: "Scannez pour copier cet identifiant Oasis.", oasisIdLabel: "OasisID", - spreadLabel: "Diffuser", - spreadHint: "Diffusez ceci à ceux qui vous soutiennent (réplique via votre feed).", + spreadContent: "Répliquer", welcomePmSubject: "Hello World!", - welcomePmBody: "Bienvenue sur Oasis — un réseau social libre, pair-à-pair, fédéré et chiffré, avec une architecture distribuée sur invitation uniquement.\n\nQuelques endroits intéressants par où commencer :\n\n- /profile — Édite ton avatar, ton nom, ta description et les modules visibles sur ta partie publique.\n- /invites — Ajoute un pub pour fédérer avec le reste du réseau.\n- /peers — Vois qui est connecté, rescanne ton LAN, exporte ou importe des listes de pairs.\n- /inhabitants — Découvre et visite les avatars d'autres personnes.\n- /tribes — Crée ou rejoins des groupes privés chiffrés de bout en bout.\n- /inbox — Lis et envoie des messages privés.\n- /activity — Vois l'activité récente, la tienne et celle de ton réseau.\n- /publish — Écris un post ou partage une image, un audio, une vidéo ou un document.\n- /search — Recherchez le contenu du réseau par type.\n\nQuelques endroits intéressants pour se connecter :\n\n- /fediverse — Gérez vos autres comptes du fédiverse, y compris l'envoi et la réception de contenu.\n\nCe message a été envoyé en privé de toi à toi-même : aucune connexion n'était nécessaire pour le recevoir.", - profileVisibilityTitle: "Visibilité du profil public", - profileVisibilityHint: "Choisissez les champs visibles par les autres habitants sur votre profil. Par défaut, seul Karma est affiché.", + welcomePmBody: "Bienvenue sur Oasis — un réseau social libre, pair-à-pair, fédéré et chiffré, avec une architecture distribuée sur invitation uniquement.\n\nQuelques endroits intéressants par où commencer :\n\n- /profile — Édite ton avatar, ton nom, ta description et les modules visibles sur ta partie publique.\n- /invites — Ajoute un pub pour fédérer avec le reste du réseau.\n- /peers — Vois qui est connecté, rescanne ton LAN, exporte ou importe des listes de pairs.\n- /inhabitants — Découvre et visite les avatars d'autres personnes.\n- /tribes — Crée ou rejoins des groupes privés chiffrés de bout en bout.\n- /inbox — Lis et envoie des messages privés.\n- /activity — Vois l'activité récente, la tienne et celle de ton réseau.\n- /publish — Écris un post ou partage une image, un audio, une vidéo ou un document.\n- /search — Recherchez le contenu du réseau par type.\n\nQuelques endroits intéressants pour se connecter :\n\n- /multiverse — Gérez vos autres comptes du multiverse, y compris l'envoi et la réception de contenu.\n\nCe message a été envoyé en privé de toi à toi-même : aucune connexion n'était nécessaire pour le recevoir.", profileSensorsSectionTitle: "Capteurs", profileVisibilityActivity: "Niveau d’activité", - profileVisibilityDevice: "Appareil", profileDeviceLockedHint: "Ce capteur est toujours actif : il permet aux autres de voir depuis quel appareil vous vous connectez et ne peut pas être désactivé.", profileVisibilityKarma: "Score KARMA", profileVisibilityUbi: "UBI", @@ -758,7 +623,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "Clé GPG", - profileVisibilityClearnet: "Publier mon profil", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Boutiques", profileClearnetJobsLabel: "Offres d’emploi", @@ -812,7 +676,6 @@ module.exports = { " ou l’état de votre connexion.", ], walletSentToLine: ({ destination, amount }) => `Envoyer ECO ${amount} à ${destination}`, - walletSettingsTitle: "Portefeuille", walletSettingsDescription: "Intégrer Oasis avec votre portefeuille ECOin.", walletSettingsDocLink: "Guide d’installation d’ECOin", walletStatusMessages: { @@ -834,37 +697,19 @@ module.exports = { cipherTitle: "Chiffreur", cipherDescription: "Chiffrez et déchiffrez votre texte de manière symétrique (à l’aide d’un mot de passe partagé).", randomPassword: "Mot de passe aléatoire", - cipherEncryptTitle: "Chiffrer le texte", - cipherEncryptDescription: "Saisissez le texte à chiffrer", - cipherTextLabel: "Texte à chiffrer", cipherTextPlaceholder: "Saisissez le texte à chiffrer...", cipherPasswordLabel: "Définissez un mot de passe (minimum 32 caractères) pour chiffrer votre texte", cipherPasswordDecryptLabel: "Définissez un mot de passe (32 caractères minimum) pour déchiffrer votre texte", cipherPasswordPlaceholder: "Saisissez un mot de passe...", cipherEncryptButton: "Chiffrer", - cipherDecryptTitle: "Déchiffrer le texte", - cipherDecryptDescription: "Saisissez le texte à déchiffrer", cipherEncryptedMessageLabel: "Texte chiffré", cipherDecryptedMessageLabel: "Texte déchiffré", - cipherPasswordUsedLabel: "Mot de passe utilisé pour chiffrer (gardez-le !)", cipherEncryptedTextPlaceholder: "Saisissez le texte chiffré...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Saisissez le vecteur d’initialisation...", cipherDecryptButton: "Déchiffrer", password: "Mot de passe", text: "Texte", encryptedText: "Texte chiffré", iv: "Vecteur d’initialisation (IV)", - encryptTitle: "Chiffrez votre texte", - encryptDescription: "Saisissez le texte que vous souhaitez chiffrer et fournissez un mot de passe.", - encryptButton: "Chiffrer", - decryptTitle: "Déchiffrez votre texte", - decryptDescription: "Saisissez le texte chiffré et fournissez le même mot de passe que celui utilisé pour le chiffrement.", - decryptButton: "Déchiffrer", - passwordLengthError: "Le mot de passe doit comporter au moins 32 caractères.", - missingFieldsError: "Texte, mot de passe ou IV non fournis.", - encryptionError: "Erreur lors du chiffrement du texte.", - decryptionError: "Erreur lors du déchiffrement du texte.", bookmarkTitle: "Marque-pages", bookmarkDescription: "Découvrez et gérez des marque-pages dans votre réseau.", bookmarkAllSectionTitle: "Marque-pages", @@ -890,8 +735,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Optionnel", bookmarkTagsLabel: "Étiquettes", bookmarkTagsPlaceholder: "Saisissez des tags séparés par des virgules", - bookmarkCategoryLabel: "Catégorie", - bookmarkCategoryPlaceholder: "Optionnel", bookmarkLastVisitLabel: "Dernière visite", bookmarkSearchPlaceholder: "Rechercher URL, tags, catégorie, auteur...", bookmarkSortRecent: "Plus récents", @@ -906,8 +749,6 @@ module.exports = { noLastVisit: "Aucune dernière visite", videoTitle: "Vidéos", videoDescription: "Explorez et gérez du contenu vidéo dans votre réseau.", - videoPluginTitle: "Titre", - videoPluginDescription: "Description", videoMineSectionTitle: "Vos vidéos", videoCreateSectionTitle: "Téléverser une vidéo", videoUpdateSectionTitle: "Mettre à jour la vidéo", @@ -939,7 +780,6 @@ module.exports = { videoSortOldest: "Les plus anciennes", videoSortTop: "Les plus votées", videoSearchButton: "Rechercher", - videoMessageAuthorButton: "MP", videoUpdatedAt: "Mis à jour", videoNoMatch: "Aucune vidéo ne correspond à votre recherche.", documentTitle: "Documents", @@ -980,8 +820,6 @@ module.exports = { documentUpdatedAt: "Mis à jour", audioTitle: "Audios", audioDescription: "Explorez et gérez du contenu audio dans votre réseau.", - audioPluginTitle: "Titre", - audioPluginDescription: "Description", audioMineSectionTitle: "Vos audios", audioCreateSectionTitle: "Téléverser un audio", audioUpdateSectionTitle: "Mettre à jour l’audio", @@ -992,7 +830,6 @@ module.exports = { audioFilterMine: "À MOI", audioFilterRecent: "RÉCENTS", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Téléverser un audio", audioUpdateButton: "Mettre à jour", audioDeleteButton: "Supprimer", @@ -1019,6 +856,7 @@ module.exports = { audioFilterFavorites: "FAVORIS", favoritesTitle: "Favoris", favoritesDescription: "Tous vos favoris au même endroit.", + favoritesSearchPlaceholder: "Rechercher dans les favoris...", favoritesFilterAll: "TOUS", favoritesFilterRecent: "RÉCENTS", favoritesFilterAudios: "AUDIOS", @@ -1034,18 +872,13 @@ module.exports = { favoritesNoItems: "Aucun favori pour le moment.", yourContacts: "Vos contacts", allInhabitants: "Habitants", - allCVs: "Tous les CV", + allCVs: "CV", discoverPeople: "Découvrez des habitants dans votre réseau.", - allInhabitantsButton: "TOUS", - contactsButton: "SOUTIENS", - CVsButton: "CVs", - matchSkills: "Faire correspondre des compétences", - matchSkillsButton: "FAIRE CORRESPONDRE LES COMPÉTENCES", - suggestedButton: "SUGGÉRÉS", searchInhabitantsPlaceholder: "FILTRER les habitants PAR NOM …", filterLocation: "FILTRER les habitants PAR LOCALISATION …", filterLanguage: "FILTRER les habitants PAR LANGUE …", filterSkills: "FILTRER les habitants PAR COMPÉTENCES …", + cvSkillsCount: "Compétences", applyFilters: "Appliquer les filtres", locationLabel: "Localisation", languagesLabel: "Langues", @@ -1054,17 +887,18 @@ module.exports = { mutualFollowers: "Soutiens mutuels", suggestedFollowsYou: "Te suit", latestInteractions: "Dernières interactions", - viewAvatar: "Voir l’Avatar", - viewCV: "Voir le CV", suggestedSectionTitle: "Suggérés", topkarmaSectionTitle: "Meilleur Karma", topecoSectionTitle: "Meilleur Éco", topactivitySectionTitle: "Top activité", + "TOP INACTIVITYButton": "PLUS INACTIFS", + topinactivitySectionTitle: "Habitants les moins actifs", blockedSectionTitle: "Bloqués", gallerySectionTitle: "GALERIE", - blockedButton: "BLOQUÉS", + topSectionTitle: "TOP", blockedLabel: "Utilisateur bloqué", inhabitantviewDetails: "Voir les détails", + cvVisitButton: "Voir le CV", keepReading: "Lire la suite...", oasisId: "ID", noInhabitantsFound: "Aucun habitant trouvé pour l’instant.", @@ -1077,6 +911,7 @@ module.exports = { parliamentFilterCandidatures: "CANDIDATURES", parliamentFilterProposals: "PROPOSITIONS", parliamentFilterLaws: "LOIS", + parliamentFilterRevocations: "RÉVOCATIONS", parliamentFilterHistorical: "HISTORIQUE", parliamentFilterLeaders: "DIRIGEANTS", parliamentFilterRules: "RÈGLES", @@ -1102,10 +937,8 @@ module.exports = { parliamentPoliciesDeclined: "LOIS REJETÉES", parliamentPoliciesDiscarded: "LOIS REJETÉES", parliamentEfficiency: "% EFFICACITÉ", - parliamentFilterRevocations: 'RÉVOCATIONS', parliamentRevocationFormTitle: 'Révoquer la Loi', parliamentRevocationLaw: 'Loi', - parliamentRevocationTitle: 'Titre', parliamentRevocationReasons: 'Motifs', parliamentCurrentRevocationsTitle: 'Révocations en Cours', parliamentFutureRevocationsTitle: 'Révocations à Venir', @@ -1117,23 +950,12 @@ module.exports = { parliamentNoGovernments: "Il n’y a pas encore de gouvernements.", parliamentCandidatureFormTitle: "Proposer une Candidature", parliamentCandidatureIdPh: "ID Oasis (@...) ou nom de la tribu", - parliamentCandidatureSlogan: "Slogan (max 140 car.)", - parliamentCandidatureSloganPh: "Un court slogan", parliamentCandidatureMethod: "Méthode", parliamentCandidatureProposeBtn: "Proposer une Candidature", - parliamentThDate: "Date de proposition", - parliamentThSlogan: "Slogan", - parliamentThSince: "Profil depuis", - parliamentThVotes: "Votes reçus", - parliamentThVoteAction: "Voter", - parliamentTypeUser: "Habitant", - parliamentTypeTribe: "Tribu", parliamentVoteBtn: "Voter", parliamentProposalFormTitle: "Proposer une Loi", parliamentProposalDescription: "Description (≤1000)", parliamentProposalPublish: "Publier la Proposition", - parliamentFinalize: "Finaliser", - parliamentDeadline: "Date limite", parliamentNoProposals: "Il n’y a pas encore de propositions de loi.", parliamentNoLaws: "Il n’y a pas encore de lois approuvées.", parliamentMethodDEMOCRACY: "Démocratie", @@ -1151,29 +973,21 @@ module.exports = { parliamentVotesSlashTotal: "Votes/Total", parliamentVotesNeeded: "Votes Requis", parliamentFutureLawsTitle: "Lois futures", - parliamentNoFutureLaws: "Pas encore de lois futures", parliamentVoteAction: "Voter", - parliamentLeadersTitle: "Dirigeants", parliamentThLeader: "AVATAR", parliamentPopulation: "Population", - parliamentThType: "Type", - parliamentThInPower: "Au pouvoir", parliamentThPresented: "CANDIDATURES", parliamentNoLeaders: "Aucun dirigeant", parliamentCandidaturesListTitle: "Liste des Candidatures", parliamentTimeRemaining: "Temps restant", - parliamentNoLeader: "Pas encore de dirigeants.", parliamentElectionsStatusTitle: "Prochain Gouvernement", parliamentProposalDeadlineLabel: "Date limite", parliamentProposalTimeLeft: "Temps restant", - parliamentProposalOnTrack: "En bonne voie pour être adoptée", - parliamentProposalOffTrack: "Soutien insuffisant", parliamentRulesTitle: "Fonctionnement du Parlement", parliamentRulesIntro: "Les élections se résolvent tous les 2 mois ; les candidatures sont continues et sont réinitialisées lorsqu’un gouvernement est choisi.", parliamentRulesCandidates: "Tout habitant peut se proposer, proposer un autre habitant ou n’importe quelle tribu. Chaque habitant peut proposer jusqu’à 3 candidatures par cycle ; les doublons dans le même cycle sont rejetés.", parliamentRulesElection: "Gagne la candidature ayant le plus de votes au moment de la résolution.", parliamentRulesTies: "En cas d’égalité : karma d’habitant le plus élevé ; sinon, profil le plus ancien ; sinon, proposition la plus précoce ; puis ordre lexicographique par ID.", - parliamentRulesFallback: "Si personne ne vote, la dernière candidature proposée gagne. S’il n’y a aucune candidature, une tribu aléatoire est sélectionnée.", parliamentRulesTerm: "L’onglet Gouvernement affiche le gouvernement actuel et ses statistiques.", parliamentRulesMethods: "Formes : Anarchie (majorité simple), Démocratie (50 % + 1), Majorité (80 %), Minorité (20 %), Karmatocratie (propositions au karma le plus élevé), Dictature (approbation instantanée).", parliamentRulesAnarchy: "L’Anarchie est le mode par défaut : si aucune candidature n’est élue à la résolution, l’Anarchie est proclamée. En Anarchie, tout habitant peut proposer des lois.", @@ -1195,11 +1009,7 @@ module.exports = { courtsCaseFormTitle: "Ouvrir une affaire", courtsCaseRespondent: "Accusé / Défendeur", courtsCaseRespondentPh: "ID Oasis (@...) ou nom de Tribu", - courtsCaseMediatorsAccuser: "Médiateurs (accusation)", courtsCaseMethod: "Méthode de résolution", - courtsCaseDescription: "Description (1000 caractères max)", - courtsCaseEvidenceTitle: "Preuves de l'affaire", - courtsCaseEvidenceHelp: "Joignez des images, audios, documents (PDF) ou vidéos qui appuient votre affaire.", courtsCaseSubmit: "Déposer l'affaire", courtsNominateJudge: "Nommer un juge", courtsJudgeId: "Juge", @@ -1245,22 +1055,6 @@ module.exports = { courtsRulesMisconduct: "Le harcèlement, la manipulation ou les preuves fabriquées peuvent entraîner une résolution négative immédiate.", courtsRulesGlossary: "Affaire : enregistrement d’un conflit. Preuves : éléments à l’appui des affirmations. Verdict : décision avec remède. Appel : demande de réexamen du verdict.", courtsFilterActions: "ACTIONS", - courtsNoActions: "Aucune action en attente pour votre rôle.", - courtsCaseTitlePlaceholder: "Brève description du conflit", - courtsCaseSeverity: "Gravité", - courtsCaseSeverityNone: "Sans étiquette de gravité", - courtsCaseSeverityLOW: "Faible", - courtsCaseSeverityMEDIUM: "Moyenne", - courtsCaseSeverityHIGH: "Élevée", - courtsCaseSeverityCRITICAL: "Critique", - courtsCaseSubject: "Sujet", - courtsCaseSubjectNone: "Sans étiquette de sujet", - courtsCaseSubjectBEHAVIOUR: "Comportement", - courtsCaseSubjectCONTENT: "Contenu", - courtsCaseSubjectGOVERNANCE: "Gouvernance / règles", - courtsCaseSubjectFINANCIAL: "Financier / ressources", - courtsCaseSubjectOTHER: "Autre", - courtsHiddenRespondent: "Caché (visible uniquement pour les rôles impliqués).", courtsThRole: "Rôle", courtsRoleAccuser: "Accusation", courtsRoleDefence: "Défense", @@ -1271,54 +1065,19 @@ module.exports = { courtsAssignJudgeBtn: "Choisir un juge", trendingTitle: "Tendances", exploreTrending: "Explorez le contenu le plus populaire dans votre réseau.", - bookmarkButton: "MARQUE-PAGES", - transferButton: "TRANSFERTS", - eventButton: "ÉVÉNEMENTS", - taskButton: "TÂCHES", votesButton: "GOUVERNANCE", - industryButton: "INDUSTRIE", - projectButton: "PROJETS", - shopProductButton: "PRODUITS", - reportButton: "RAPPORTS", - feedButton: "FLUX", - marketButton: "MARCHÉ", - imageButton: "IMAGES", - audioButton: "AUDIOS", - videoButton: "VIDÉOS", - documentButton: "DOCUMENTS", - torrentButton: "TORRENTS", - noTrendingFound: "Aucun contenu populaire trouvé.", - noContentMessage: "Aucun contenu populaire disponible pour le moment.", - trendingDescription: "Description", - trendingDate: "Date", - trendingLocation: "Localisation", - trendingPrice: "Prix", - trendingUrl: "URL", - trendingCategory: "Catégorie", - trendingStart: "Début", - trendingEnd: "Fin", - trendingPriority: "Priorité", - trendingStatus: "État", - trendingFrom: "De", - trendingTo: "À", - trendingConcept: "Concept", - trendingAmount: "Montant", - trendingDeadline: "Échéance", - trendingItemStatus: "Statut de l’article", - trendingTotalVotes: "Total des votes", + shopProductButton: "BOUTIQUE", trendingTotalOpinions: "Total des avis", trendingNoContentMessage: "Pas encore de tendances.", - trendingAuthor: "Par", - trendingCreatedAtLabel: "Créé le", trendingTotalCount: "Total des compteurs", tasksTitle: "Tâches", tasksDescription: "Découvrez et gérez des tâches dans votre réseau.", + taskSearchPlaceholder: "Rechercher des tâches...", taskTitleLabel: "Titre", taskDescriptionLabel: "Description", taskStartTimeLabel: "Date de début", taskEndTimeLabel: "Date de fin", taskPriorityLabel: "Priorité", - taskPrioritySelect: "Sélectionner la priorité", taskPriorityUrgent: "Urgente", taskPriorityHigh: "Élevée", taskPriorityMedium: "Moyenne", @@ -1328,13 +1087,13 @@ module.exports = { taskVisibilityLabel: "Visibilité", taskPublic: "public", taskPrivate: "privé", - taskCreatedAt: "Créé le", - taskBy: "Par", taskStatus: "État", taskStatusOpen: "Ouverte", taskStatusInProgress: "En cours", taskStatusClosed: "Fermée", taskAssignedTo: "Assignée à", + taskAssignedChip: "Assignée", + taskUnassignedChip: "Non assignée", taskAssignees: "Assignés", taskAssignButton: "M’assigner", taskUnassignButton: "Désassigner", @@ -1347,7 +1106,6 @@ module.exports = { taskFilterInProgress: "EN COURS", taskFilterClosed: "FERMÉES", taskFilterAssigned: "ASSIGNÉES", - taskFilterArchived: "ARCHIVÉES", taskFilterUrgent: "URGENTES", taskFilterHigh: "HAUTES", taskFilterMedium: "MOYENNES", @@ -1360,23 +1118,21 @@ module.exports = { taskInProgressTitle: "Tâches en cours", taskClosedTitle: "Tâches fermées", taskAssignedTitle: "Tâches assignées", - taskArchivedTitle: "Tâches archivées", - taskPublicTitle: "Tâches publiques", - taskPrivateTitle: "Tâches privées", notasks: "Aucune tâche disponible.", noLocation: "Aucune localisation spécifiée", taskSetStatus: "Définir l'état", - eventTitle: "Événements", eventDateLabel: "Date", + eventRecurrenceLabel: "Récurrence", + eventRecurrenceUntil: "Répéter jusqu'au", + eventRecurrenceHint: "Laissez la date de fin vide pour un événement unique.", + eventUpcomingDates: "Prochaines dates", eventsTitle: "Événements", eventsDescription: "Découvrez et gérez des événements dans votre réseau.", - eventDescription: "Description", + eventSearchPlaceholder: "Rechercher des événements...", eventPrice: "Prix", eventStatus: "État", - eventOrganizer: "Organisateur", eventAllSectionTitle: "Événements", eventMineSectionTitle: "Vos événements", - eventArchivedTitle: "Événements archivés", eventCreateSectionTitle: "Créer un événement", eventUpdateSectionTitle: "Mettre à jour l'événement", eventDeleteButton: "Supprimer", @@ -1384,11 +1140,26 @@ module.exports = { eventAddToCalendar: "Ajouter au calendrier", eventVisitCalendar: "Voir le calendrier", viewTask: "Voir la tâche", + viewEvent: "Voir l’événement", + viewPad: "Voir le pad", + viewMap: "Voir la carte", + viewCalendar: "Voir le calendrier", viewReport: "Voir le rapport", viewTransfer: "Voir le transfert", viewItem: "Voir l'élément", viewShop: "Voir la boutique", viewProject: "Voir le projet", + viewJob: "Voir l'Emploi", + viewPlace: "Voir le Lieu", + generatePdf: "Générer un PDF", + sharePm: "Partager par MP", + galleryImages: "Images (taille max : 50 Mo chacune)", + galleryPhotos: "Images", + galleryAddPhoto: "Ajouter une Image", + galleryRemovePhoto: "Retirer", + galleryVideo: "Vidéo (taille max : 50 Mo)", + galleryAddVideo: "Ajouter une Vidéo", + galleryRemoveVideo: "Retirer la vidéo", viewVotation: "Voir le vote", voteCastTitle: "Voter", voteResults: "Résultats", @@ -1396,29 +1167,15 @@ module.exports = { eventDescriptionLabel: "Description", eventDescriptionPlaceholder: "Saisissez la description de l'événement...", eventUpdateButton: "Mettre à jour", - eventAttendeesLabel: "Participants", - eventAttendeesPlaceholder: "Saisissez les participants, séparés par des virgules...", eventTagsLabel: "Étiquettes", - eventTagsPlaceholder: "Saisissez les étiquettes de l'événement, séparées par des virgules...", - eventTags: "Étiquettes", eventPriceLabel: "Prix", eventUrlLabel: "URL", eventAttendees: "Participants", - noAttendees: "Aucun participant pour l'instant", - eventCreatedAt: "Créé le", eventLocation: "Localisation", eventLocationLabel: "Localisation", - eventNoLocation: "Aucune localisation spécifiée", - eventNoURL: "Aucune URL spécifiée", - eventBy: "Par", noevents: "Aucun événement disponible.", eventDate: "Date", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "Assister à l'événement", - eventUnattendButton: "Ne plus assister à l'événement", - eventCreatedBy: "Créé par", - eventAttendeesCount: "Nombre de participants", - eventCreatedByYou: "Vous avez créé cet événement", eventFilterAll: "TOUS", eventFilterMine: "MIENS", eventFilterToday: "AUJOURD'HUI", @@ -1426,18 +1183,9 @@ module.exports = { eventFilterMonth: "CE MOIS", eventFilterYear: "CETTE ANNÉE", eventFilterArchived: "ARCHIVÉS", - eventTodayTitle: "Événements d'aujourd'hui", - eventThisWeekTitle: "Événements cette semaine", - eventThisMonthTitle: "Événements ce mois", - eventThisYearTitle: "Événements cette année", eventPrivacyLabel: "Visibilité", eventPublic: "Public", eventPrivate: "Privé", - eventPublicTitle: "Événements publics", - eventNoPrice: "Événement gratuit", - eventNoImage: "Aucune image téléchargée", - eventAttendConfirmation: "Vous assistez maintenant à cet événement", - eventUnattendConfirmation: "Vous ne participez plus à cet événement", eventAttended: "Présent", eventUnattended: "Absent", eventStatusOpen: "Ouvert", @@ -1448,6 +1196,10 @@ module.exports = { tagsTopSectionTitle: "Étiquettes principales", tagsCloudSectionTitle: "Nuage d'étiquettes", tagsFilterAll: "TOUS", + tagsFilterMine: "À MOI", + tagsFilterRecent: "RÉCENTES", + tagsMineSectionTitle: "Mes étiquettes", + tagsRecentSectionTitle: "Étiquettes récentes", tagsFilterTop: "TOP", tagsFilterCloud: "NUAGE", tagsNoItems: "Aucune étiquette disponible.", @@ -1491,18 +1243,12 @@ module.exports = { transfersDeadline: "Date limite", transfersTags: "Étiquettes", transfersStatus: "État", - transfersStatusUnconfirmed: "NON CONFIRMÉE", - transfersStatusClosed: "FERMÉE", - transfersStatusDiscarded: "REJETÉE", - transfersCreatedAt: "Créé le", transfersConfirmations: "CONFIRMATIONS", - transfersContainingBlock: "Bloc contenant", - transfersExportContract: "Contrat intelligent", + transfersExportContract: "Générer une Facture", transfersConfirmButton: "Confirmer le transfert", transfersNoItems: "Aucun transfert trouvé.", transfersMineSectionTitle: "Vos transferts", transfersUBISectionTitle: "Transferts RBU", - transfersMarketSectionTitle: "Transferts du marché", transfersTopSectionTitle: "Transferts principaux", transfersPendingSectionTitle: "Transferts en attente", transfersUnconfirmedSectionTitle: "Transferts non confirmés", @@ -1510,21 +1256,13 @@ module.exports = { transfersDiscardedSectionTitle: "Transferts rejetés", transfersCreateSectionTitle: "Créer un transfert", transfersAllSectionTitle: "Transferts", - transfersFilterFavs: "Favoris", - transfersFavsSectionTitle: "Transferts favoris", - transfersSearchLabel: "Recherche", transfersSearchPlaceholder: "Rechercher concept, tags, utilisateurs...", transfersMinAmountLabel: "Montant min.", transfersMaxAmountLabel: "Montant max.", - transfersSortLabel: "Trier par", transfersSortRecent: "Plus récents", transfersSortAmount: "Montant le plus élevé", transfersSortDeadline: "Échéance la plus proche", transfersSearchButton: "Rechercher", - transfersFavoriteButton: "Favori", - transfersUnfavoriteButton: "Retirer favori", - transfersMessageUserButton: "Message", - transfersExpiringSoonBadge: "BIENTÔT", transfersExpiredBadge: "EXPIRÉ", transfersUpdatedAt: "Mis à jour", transfersNoMatch: "Aucun transfert ne correspond à votre recherche.", @@ -1569,16 +1307,6 @@ module.exports = { voteNoQuestion: "Aucune question fournie", voteUnknownCreator: "Créateur inconnu", voteUnknownDate: "Date inconnue", - errorVoteNotFound: "Vote introuvable", - errorAlreadyVoted: "Vous avez déjà voté.", - errorVoteClosedCannotEdit: "Impossible de modifier un vote fermé", - errorVoteDeadlinePassed: "Le délai de ce vote est passé", - errorRetrievingVote: "Erreur lors de la récupération du vote", - errorCreatingVote: "Erreur lors de la création du vote", - errorVoteAlreadyVoted: "Impossible de modifier après avoir voté", - errorDeletingOldVote: "Erreur lors de la suppression du vote précédent", - errorCreatingUpdatedVote: "Erreur lors de la création du vote mis à jour", - errorCreatingTombstone: "Erreur lors de la création de la pierre tombale", voteDetailSectionTitle: 'Détails du vote', voteCommentsLabel: 'Commentaires', voteCommentsForumButton: 'Ouvrir la discussion', @@ -1588,7 +1316,6 @@ module.exports = { voteNewCommentButton: 'Publier le commentaire', voteNewCommentLabel: 'Ajouter un commentaire', cvTitle: "CV", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Modifier le CV", cvCreateSectionTitle: "Créer un CV", cvDescription: "Gérez et partagez vos compétences professionnelles et informations.", @@ -1607,19 +1334,16 @@ module.exports = { cvLocationLabel: "Localisation", cvStatusLabel: "État", cvPreferencesLabel: "Préférences", - cvOasisContributorLabel: "Contributeur d’Oasis", cvPersonal: "Personnel", cvOasis: "Contributeur d’Oasis (optionnel)", - cvOasisContributorView: "Contribution dans Oasis", + cvOasisContributorView: "Contribution", cvEducational: "Éducatif (optionnel)", cvEducationalView: "Éducatif", cvProfessional: "Professionnel (optionnel)", cvProfessionalView: "Professionnel", cvAvailability: "Disponibilité (optionnel)", - cvAvailabilityView: "Disponibilité", cvUpdateButton: "Mettre à jour", cvCreateButton: "Créer un CV", - cvContactLabel: "Contact", cvCreatedAt: "Créé le", cvUpdatedAt: "Mis à jour le", cvEditButton: "Mettre à jour", @@ -1628,8 +1352,103 @@ module.exports = { blogSubject: "Sujet", blogMessage: "Message", blogImage: "Télécharger un média (max: 50 Mo)", + blogMedia: "Pièces jointes (jusqu'à 8 images et une vidéo)", blogPublish: "Aperçu", - noPopularMessages: "Aucun message populaire publié pour l’instant", + pollsTitle: "Sondages", + dataTitle: "Correspondances", + dataDescription: "Explorez et visualisez les correspondances de votre réseau.", + dataFilterAll: "TOUT", + dataFilterMine: "LES MIENS", + dataFilterRecent: "RÉCENTS", + dataFilterTop: "TOP", + dataKindInhabitants: "HABITANTS", + dataKindJobs: "EMPLOIS", + dataKindProjects: "PROJETS", + dataKindEvents: "ÉVÉNEMENTS", + dataKindTribes: "TRIBUS", + dataKindMarket: "MARCHÉ", + dataKindHousing: "LOGEMENT", + dataKindIndustry: "INDUSTRIE", + dataKindTasks: "TÂCHES", + dataKindReports: "RAPPORTS", + dataKindVotes: "VOTES", + dataSearchPlaceholder: "Rechercher dans les données croisées...", + dataCohesionTitle: "Coefficient de cohésion (CC)", + dataCcShort: "CC", + dataCohesionHint: "Affinité moyenne entre tout ce que le réseau a publié.", + dataAffinity: "Affinité", + dataCommonTerms: "Mot-clé", + dataStatPeople: "CV", + dataStatConnected: "Connectés", + dataStatSkills: "Compétences", + dataBestMatch: "Meilleur match", + dataStatIsolated: "Isolés", + dataStatEntities: "Entités comparées", + dataStatTerms: "Termes distincts", + dataStatPairs: "Paires connectées", + dataMatchesTitle: "Correspondances", + dataMatchesHint: "Suggestions personnalisées de l'algorithme.", + dataTermsTitle: "Mots-clés", + dataTermsHint: "Les termes présents dans le plus de contenus.", + dataConnections: "Correspondances liées", + dataTopicTitle: "Tout ce qui touche à", + dataTopicHint: "Ce que l'algorithme relie à ce sujet", + dataNoMatches: "Aucune donnée croisée à afficher.", + dataNoProfile: "Publiez du contenu ou rédigez votre CV pour que l'algorithme apprenne ce qui vous intéresse.", + pollsDescription: "Module pour interroger le réseau et compter les réponses.", + pollFilterAll: "TOUS", + pollFilterMine: "LES MIENS", + pollFilterRecent: "RÉCENTS", + pollFilterTop: "TOP", + pollFilterVoted: "VOTÉS", + pollFilterOpen: "OUVERTS", + pollFilterClosed: "FERMÉS", + pollCreateButton: "Créer un Sondage", + pollCreateTitle: "Créer un Sondage", + pollEditTitle: "Modifier le Sondage", + pollQuestion: "Question", + pollQuestionPlaceholder: "Que voulez-vous demander ?", + pollOptions: "Options (une par ligne)", + pollOutcome: "Résultat", + pollNoVotesYet: "Pas encore de votes", + pollTie: "Égalité", + pollOptionsPlaceholder: "Place\nParc\nBar", + pollAnonymous: "Anonyme", + pollAnonymousLabel: "Sondage anonyme", + pollMultiple: "Choix multiple", + pollMultipleLabel: "Autoriser plusieurs réponses", + pollDeadline: "Date limite", + pollTags: "Étiquettes", + pollPublishButton: "Publier le Sondage", + pollUpdateButton: "Modifier", + pollCloseButton: "Fermer", + pollDeleteButton: "Supprimer", + pollVoteButton: "Voter", + pollChangeVote: "Changer de Vote", + pollVoters: "Votants", + pollComments: "Commentaires", + pollStatusLabel: "Statut", + pollStatusOpen: "OUVERT", + pollStatusClosed: "FERMÉ", + pollSearchPlaceholder: "Rechercher des sondages...", + pollsNoItems: "Aucun sondage trouvé.", + viewPoll: "Voir le Sondage", + pollChatCreate: "Créer un Sondage", + pollInChat: "Sondage", + blogTitle: "Blogs", + blogDescription: "Module pour découvrir et gérer les blogs.", + blogFilterAll: "TOUS", + blogFilterMine: "LES MIENS", + blogFilterRecent: "RÉCENTS", + blogFilterFavorites: "FAVORIS", + blogFilterTop: "TOP", + blogCreateButton: "Créer un Blog", + blogSearchPlaceholder: "Rechercher des blogs...", + blogComments: "Commentaires", + blogAllowComments: "Autoriser les commentaires", + blogCommentsClosed: "L'auteur a fermé les commentaires de ce blog.", + blogNoItems: "Aucun blog trouvé.", + viewBlog: "Voir le Blog", forumTitle: "Forums", forumCategoryLabel: "Catégorie", forumTitleLabel: "Titre", @@ -1637,43 +1456,22 @@ module.exports = { forumCreateButton: "Créer un forum", forumCreateSectionTitle: "Créer un forum", forumDescription: "Discutez ouvertement avec d’autres habitants de votre réseau.", + forumSearchPlaceholder: "Rechercher des forums...", forumFilterAll: "TOUS", forumFilterMine: "MIENS", forumFilterRecent: "RÉCENTS", forumFilterTop: "TOP", - forumMineSectionTitle: "Vos forums", - forumRecentSectionTitle: "Forums récents", - forumAllSectionTitle: "Forums", forumDeleteButton: "Supprimer", forumParticipants: "participants", forumMessages: "messages", - forumLastMessage: "Dernier message", forumMessageLabel: "Message", forumMessagePlaceholder: "Écrivez votre message...", forumSendButton: "Envoyer", - forumVisitForum: "Visiter le forum", noForums: "Aucun forum disponible pour l’instant.", - forumVisitButton: "Visiter le forum", - forumCatGENERAL: "Général", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Politique", - forumCatTECH: "Technologie", - forumCatSCIENCE: "Science", - forumCatMUSIC: "Musique", - forumCatART: "Art", - forumCatGAMING: "Jeux", - forumCatBOOKS: "Livres", - forumCatFILMS: "Films", - forumCatPHILOSOPHY: "Philosophie", - forumCatSOCIETY: "Société", - forumCatPRIVACY: "Vie privée", - forumCatCYBERWARFARE: "Cyberguerre", - forumCatSURVIVALISM: "Survivalisme", + forumVisitButton: "Visiter le Forum", + forumTopicLabel: "Sujet", imageTitle: "Images", imageDescription: "Explorez et gérez du contenu image dans votre réseau.", - imagePluginTitle: "Titre", - imagePluginDescription: "Description", imageMineSectionTitle: "Vos images", imageCreateSectionTitle: "Téléverser une image", imageUpdateSectionTitle: "Mettre à jour l'image", @@ -1682,14 +1480,12 @@ module.exports = { imageTopSectionTitle: "Top images", imageFavoritesSectionTitle: "Favoris", imageGallerySectionTitle: "Galerie", - imageMemeSectionTitle: "Mèmes", imageFilterAll: "TOUS", imageFilterMine: "À MOI", imageFilterRecent: "RÉCENTES", imageFilterTop: "TOP", imageFilterFavorites: "FAVORIS", imageFilterGallery: "GALERIE", - imageFilterMeme: "MÈMES", imageCreateButton: "Téléverser une image", imageUpdateButton: "Mettre à jour", imageDeleteButton: "Supprimer", @@ -1702,7 +1498,6 @@ module.exports = { imageTitlePlaceholder: "Facultatif", imageDescriptionLabel: "Description", imageDescriptionPlaceholder: "Facultatif", - imageMemeLabel: "MÈME ?", imageNoFile: "Aucun fichier image fourni", noImages: "Aucune image disponible.", imageSearchPlaceholder: "Rechercher par titre, tags, description, auteur…", @@ -1710,7 +1505,6 @@ module.exports = { imageSortOldest: "Les plus anciennes", imageSortTop: "Les plus votées", imageSearchButton: "Rechercher", - imageMessageAuthorButton: "Message", imageUpdatedAt: "Mis à jour", imageNoMatch: "Aucune image ne correspond à votre recherche.", feedTitle: "Fil", @@ -1722,7 +1516,6 @@ module.exports = { createFeedButton: "Envoyer le fil !", feedPlaceholder: "Que se passe-t-il ? (maximum 280 caractères)", TODAYButton: "AUJOURD’HUI", - CREATEButton: "Créer un fil", totalOpinions: "Total des opinions", moreVoted: "Le plus voté", noFeedsFound: "Aucun fil trouvé.", @@ -1744,20 +1537,12 @@ module.exports = { concept: "Concept", description: "Description", meme: "Mème", - activityContact: "Contact", - activityBy: "Nom", - activityPixelia: "Nouveau pixel ajouté", - viewImage: "Voir l’image", - playAudio: "Lire l’audio", - playVideo: "Lire la vidéo", typeRecent: "RÉCENT", - errorActivity: "Erreur lors de la récupération de l’activité", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "RÉCENT", typeTribe: "TRIBUS", typeLarp: "L.A.R.P.", typeInhabitants: "HABITANTS", - activityProfileUpdated: "a mis à jour son profil", typeAbout: "HABITANTS", typeCurriculum: "CVS", typeImage: "IMAGES", @@ -1801,8 +1586,6 @@ module.exports = { typeCourtsSettlementAccepted: "Tribunaux · Règlement accepté", typeCourtsNomination: "Tribunaux · Nomination", typeCourtsNominationVote: "Tribunaux · Vote de nomination", - activitySupport: "Nouvelle alliance forgée", - activityJoin: "Nouveau PUB rejoint", question: "Question", deadline: "Échéance", status: "Statut", @@ -1816,12 +1599,8 @@ module.exports = { date: "Date", category: "Catégorie", attendees: "Participants", - activitySpread: "->", - visitLink: "Visiter le lien", - viewDocument: "Voir le document", location: "Lieu", contentWarning: "Sujet", - personName: "Nom de l’habitant", bankWalletConnected: "Portefeuille ECOin", bankUbiReceived: "UBI reçu", bankTx: "Tx", @@ -1830,7 +1609,6 @@ module.exports = { link: "Lien", activityProjectFollow: "%OASIS% est maintenant %ACTION% ce projet %PROJECT%", activityProjectUnfollow: "%OASIS% est maintenant %ACTION% ce projet %PROJECT%", - activityProjectPledged: "%OASIS% a %ACTION% %AMOUNT% au projet %PROJECT%", following: "SUIVRE", unfollowing: "NE PLUS SUIVRE", pledged: "ENGAGÉ", @@ -1876,26 +1654,17 @@ module.exports = { courtsVotesSlashTotal: "OUI/TOTAL", courtsOpenVote: "Vote ouvert", courtsAnswerTitle: "Réponse", - courtsStanceADMIT: "Admettre", - courtsStanceDENY: "Refuser", - courtsStancePARTIAL: "Partiel", - courtsStanceCOUNTERCLAIM: "Demande reconventionnelle", - courtsStanceNEUTRAL: "Neutre", courtsVerdictResult: "Résultat", courtsVerdictOrders: "Ordonnances", courtsSettlementText: "Accord", courtsSettlementAccepted: "Accepté", - courtsSettlementPending: "En attente", courtsJudge: "Juge", courtsThSupports: "Soutiens", courtsFilterOpenCase: 'Ouvrir un dossier', - courtsEvidenceFileLabel: 'Fichier de preuve (image, audio, vidéo ou PDF)', - courtsCaseMediators: 'Médiateurs', courtsCaseMediatorsPh: 'IDs Oasis des médiateurs, séparés par des virgules', courtsMediatorsLabel: 'Médiateurs', courtsThCase: 'Dossier', courtsThCreatedAt: 'Date de début', - courtsThActions: 'Actions', courtsPublicPrefLabel: 'Visibilité après la résolution', courtsPublicPrefYes: "J'accepte que ce dossier soit entièrement public", courtsPublicPrefNo: 'Je préfère garder les détails privés', @@ -1903,8 +1672,11 @@ module.exports = { courtsMethodMEDIATION: 'Médiation', courtsNoCases: 'Aucun dossier.', reportsTitle: "Rapports", - reportsDescription: "Gérez et suivez les rapports liés aux problèmes, aux erreurs, aux abus et aux avertissements de contenu dans votre réseau.", + reportsDescription: "Gérez et suivez les signalements de votre réseau.", + reportsSearchPlaceholder: "Rechercher des rapports...", reportsFilterAll: "TOUS", + reportsFilterRecent: "RÉCENTS", + reportsFilterTop: "TOP", reportsFilterMine: "MIENS", reportsFilterFeatures: "FONCTIONS", reportsFilterBugs: "ERREURS", @@ -1917,18 +1689,13 @@ module.exports = { reportsFilterInvalid: "INVALIDES", reportsCreateButton: "Créer un rapport", reportsTitleLabel: "Titre", - reportsDescriptionLabel: "Description", - reportsDescriptionPlaceholder: "Veuillez fournir une description détaillée.", reportsCategory: "Catégorie", - reportsCategoryLabel: "Catégorie", reportsCategoryFeatures: "Fonctions", reportsCategoryBugs: "Erreurs", reportsCategoryAbuse: "Abus", - reportsCategoryContent: "Problèmes de Contenu", + reportsCategoryContent: "Contenu", reportsUpdateButton: "Mettre à jour", reportsDeleteButton: "Supprimer", - reportsDateLabel: "Date", - reportsUploadFile: "Télécharger un média (max: 50 Mo)", reportsMineSectionTitle: "Vos rapports", reportsFeaturesSectionTitle: "Demandes de fonctions", reportsBugsSectionTitle: "Erreurs", @@ -1936,11 +1703,6 @@ module.exports = { reportsContentSectionTitle: "Problèmes de contenu", reportsAllSectionTitle: "Rapports", reportsNoItems: "Aucun rapport disponible.", - reportsValidationTitle: "Veuillez saisir un titre valide.", - reportsValidationDescription: "La description ne peut pas être vide.", - reportsValidationCategory: "Veuillez sélectionner une catégorie.", - reportsCreatedAt: "Créé le", - reportsCreatedBy: "Par", reportsSeverity: "Gravité", reportsSeverityLow: "Faible", reportsSeverityMedium: "Moyenne", @@ -1951,13 +1713,10 @@ module.exports = { reportsStatusUnderReview: "En révision", reportsStatusResolved: "Résolu", reportsStatusInvalid: "Invalide", - reportsUpdateStatusButton: "Mettre à jour l’état", - reportsAnonymityOption: "Envoyer de façon anonyme", - reportsAnonymousAuthor: "Anonyme", reportsConfirmButton: "CONFIRMER LE RAPPORT !", reportsConfirmations: "Confirmations", reportsConfirmedSectionTitle: "Rapports confirmés", - reportsCreateTaskButton: "CRÉER UNE TÂCHE", + reportsCreateTaskButton: "Créer une tâche", reportsOpenSectionTitle: "Rapports ouverts", reportsUnderReviewSectionTitle: "Rapports en révision", reportsResolvedSectionTitle: "Rapports résolus", @@ -1994,6 +1753,20 @@ module.exports = { reportsRequestedActionLabel: 'Action demandée', reportsRequestedActionPlaceholder: 'Supprimer, masquer, étiqueter, avertir, etc.', tribesTitle: "Tribus", + tribeFilterAll: "TOUTES", + tribeFilterRecent: "RÉCENTES", + tribeFilterMine: "MIENNES", + tribeFilterMembership: "ADHÉSION", + tribeFilterSubtribes: "SOUS-TRIBUS", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALERIE", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MIENS", + tribeFeedFilterALL: "TOUS", + tribeFeedFilterRECENT: "RÉCENTS", + courtsStanceDENY: "Nier", + courtsStanceADMIT: "Admettre", + courtsStancePARTIAL: "Admettre en partie", tribeAllSectionTitle: "Tribus", tribeMineSectionTitle: "Vos tribus", tribeCreateSectionTitle: "Créer une tribu", @@ -2005,13 +1778,6 @@ module.exports = { tribeviewSubTribeButton: "Visiter la sous-tribu", tribeRootLabel: "RACINE", tribeDescription: "Explorez ou créez des tribus dans votre réseau.", - tribeFilterAll: "TOUS", - tribeFilterMine: "MIENS", - tribeFilterMembership: "MEMBRES", - tribeFilterRecent: "RÉCENTS", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "SOUS-TRIBUS", - tribeFilterGallery: "GALERIE", tribeMainTribeLabel: "TRIBU PRINCIPALE", tribeCreateButton: "Créer une tribu", tribeUpdateButton: "Mettre à jour", @@ -2030,13 +1796,8 @@ module.exports = { tribeModeLabel: "MODE", tribeIsAnonymousLabel: "STATUT", tribeMembersCount: "Membres", - tribeInviteCodePlaceholder: "Saisissez le code d’invitation", - tribeJoinByCodeButton: "Rejoindre avec un code", - tribeJoinButton: "REJOINDRE", tribeEnterInvite: "SAISIR LE CODE", tribeLeaveButton: "QUITTER", - tribeYes: "OUI", - tribeNo: "NON", tribePublic: "PUBLIQUE", tribePrivate: "PRIVÉE", tribeGenerateInvite: "INVITATION UNIQUE", @@ -2045,13 +1806,8 @@ module.exports = { tribeRemoveInvitation: "SUPPRIMER L’INVITATION", tribeCreatedAt: "Créé le", tribeAuthor: "Par", - tribeAuthorLabel: "AUTEUR", tribeStrict: "Strict", tribeOpen: "Ouverte", - tribeFeedFilterRECENT: "RÉCENTS", - tribeFeedFilterMINE: "MIENS", - tribeFeedFilterALL: "TOUS", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Repartages", tribeFeedRefeed: "Repartager", tribeFeedMessagePlaceholder: "Écrivez un feed…", @@ -2061,17 +1817,12 @@ module.exports = { tribeNotFound: "Tribu introuvable!", createTribeTitle: "Créer une tribu", updateTribeTitle: "Mettre à jour la tribu", - tribeSectionOverview: "Aperçu", tribeSectionInhabitants: "Habitants", tribeSectionVotations: "VOTATIONS", tribeSectionEvents: "ÉVÉNEMENTS", - tribeSectionReports: "Rapports", tribeSectionTasks: "TÂCHES", tribeSectionFeed: "FIL", tribeSectionForum: "FORUM", - tribeSectionMarket: "Marché", - tribeSectionJobs: "Emplois", - tribeSectionProjects: "Projets", tribeSectionMedia: "Média", tribeSectionImages: "IMAGES", tribeSectionAudios: "AUDIOS", @@ -2109,11 +1860,6 @@ module.exports = { tribeTaskStatusClosed: "FERMER", tribeTaskAssign: "ASSIGNER", tribeTaskUnassign: "DÉSASSIGNER", - tribeReportCreate: "Créer un rapport", - tribeReportsEmpty: "Aucun rapport pour l'instant.", - tribeReportTitle: "Titre", - tribeReportDescription: "Description", - tribeReportCategory: "Catégorie", tribeVotationCreate: "Créer une votation", tribeVotationsEmpty: "Aucune votation pour l'instant.", tribeVotationTitle: "Titre", @@ -2131,27 +1877,6 @@ module.exports = { tribeForumCategory: "Catégorie", tribeForumReply: "Répondre", tribeForumReplies: "Réponses", - tribeMarketCreate: "Créer une annonce", - tribeMarketEmpty: "Aucune annonce pour l'instant.", - tribeMarketTitle: "Titre", - tribeMarketDescription: "Description", - tribeMarketPrice: "Prix", - tribeMarketImage: "Image", - tribeMarketCategory: "Catégorie", - tribeJobCreate: "Créer un emploi", - tribeJobsEmpty: "Aucun emploi pour l'instant.", - tribeJobTitle: "Titre", - tribeJobDescription: "Description", - tribeJobLocation: "Lieu", - tribeJobSalary: "Salaire", - tribeJobDeadline: "Date limite", - tribeProjectCreate: "Créer un projet", - tribeProjectsEmpty: "Aucun projet pour l'instant.", - tribeProjectTitle: "Titre", - tribeProjectDescription: "Description", - tribeProjectGoal: "Objectif", - tribeProjectFunded: "Financé", - tribeProjectDeadline: "Date limite", tribeMediaUpload: "Télécharger un média", readDocument: "Lire le Document", tribeCreateImage: "Créer Image", @@ -2162,7 +1887,6 @@ module.exports = { tribeMediaEmpty: "Aucun média pour l'instant.", tribeMediaTitle: "Titre", tribeMediaDescription: "Description", - tribeMediaType: "Type", tribeMediaTypeImage: "Image", tribeMediaTypeVideo: "Vidéo", tribeMediaTypeAudio: "Audio", @@ -2172,11 +1896,6 @@ module.exports = { tribeInviteCodeText: "Code d'invitation : ", oasisVersionLabel: "Version d’Oasis", tribeInviteCodeHint: "Partagez ce code avec la personne que vous souhaitez inviter. Elle peut rejoindre via /invites → Tribes.", - tribeGroupTribe: "Tribu", - tribeGroupOffice: "Bureau", - tribeGroupNetwork: "Réseau", - tribeGroupEconomy: "Économie", - tribeGroupMedia: "Média", tribeStatusOpen: "OUVERT", tribeStatusClosed: "FERMÉ", tribeStatusInProgress: "EN COURS", @@ -2186,33 +1905,17 @@ module.exports = { tribePriorityCritical: "CRITIQUE", tribeTaskFilterAll: "TOUS", tribeMediaFilterAll: "TOUS", - tribeReportCatBug: "BUG", - tribeReportCatAbuse: "ABUS", - tribeReportCatContent: "CONTENU", - tribeReportCatOther: "AUTRE", tribeForumCatGeneral: "GÉNÉRAL", tribeForumCatProposal: "PROPOSITION", tribeForumCatQuestion: "QUESTION", tribeForumCatAnnouncement: "ANNONCE", - tribeMarketCatGoods: "BIENS", - tribeMarketCatServices: "SERVICES", - tribeMarketCatFood: "ALIMENTATION", - tribeMarketCatOther: "AUTRE", tribeStatusLabel: "Statut", tribeSubTribes: "SOUS-TRIBUS", tribeSubTribesCreate: "Créer Sous-Tribu", tribeSubTribesStrictDenied: "Le mode strict de la tribu ne vous permet pas de créer de nouvelles sous-tribus. Veuillez contacter l'administrateur.", - tribeSubTribesEmpty: "Aucune sous-tribu créée, pour l'instant.", - tribeActivityJoined: "REJOINT", - tribeActivityLeft: "QUITTÉ", - tribeActivityFeed: "FIL", tribeActivityRefeed: "REPARTAGE", - tribeGroupAnalytics: "Analytiques", - tribeGroupCreative: "Créatif", tribeSectionActivity: "ACTIVITÉ", tribeSectionTrending: "TENDANCES", - tribeSectionOpinions: "OPINIONS", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "TAGS", tribeSectionSearch: "RECHERCHE", tribeActivityEmpty: "Aucune activité pour le moment.", @@ -2224,25 +1927,15 @@ module.exports = { tribeTrendingPeriodWeek: "Cette Semaine", tribeTrendingPeriodAll: "Tout", tribeTrendingEngagement: "engagement", - tribeOpinionsEmpty: "Aucune opinion pour le moment.", - tribeOpinionsCast: "Voter", - tribeOpinionsRankings: "Classements", - tribeOpinionsAlreadyVoted: "Déjà voté", tribeTopCategory: "Plus voté", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Toile collaborative de pixel art.", - tribePixeliaPaint: "Peindre", - tribePixeliaContributors: "contributeurs", - tribePixeliaTotalPixels: "pixels peints", tribeTagsEmpty: "Aucun tag trouvé.", - tribeTagsCloud: "Nuage de Tags", - tribeTagsContentWith: "Contenu avec le tag", tribeSearchPlaceholder: "Rechercher dans la tribu...", tribeSearchEmpty: "Aucun résultat.", tribeSearchResults: "Résultats", tribeSearchMinChars: "Entrez au moins 2 caractères pour rechercher.", agendaTitle: "Agenda", agendaDescription: "Ici vous pouvez trouver tous vos éléments assignés.", + agendaSearchPlaceholder: "Rechercher dans l’agenda...", agendaFilterAll: "TOUS", agendaFilterToday: "AUJOURD’HUI", agendaFilterUpcoming: "À VENIR", @@ -2263,18 +1956,7 @@ module.exports = { agendaNoItems: "Aucune affectation trouvée.", agendaDiscardButton: "Écarter", agendaRestoreButton: "Restaurer", - agendaAuthor: "Par", - agendaCreatedAt: "Créé le", - agendaTitleLabel: "Titre", agendaMembersCount: "Membres", - agendaDescriptionLabel: "Description", - agendaStatus: "État", - agendaVisibility: "Visibilité", - agendaEventDate: "Date de l’événement", - agendaEventLocation: "Localisation", - agendaEventPrice: "Prix", - agendaEventUrl: "URL", - agendaTaskStart: "Heure de début", agendaLocationLabel: "Localisation", agendaYes: "OUI", agendaNo: "NON", @@ -2284,11 +1966,6 @@ module.exports = { agendareportCategory: "Catégorie", agendareportSeverity: "Gravité", agendareportStatus: "État", - agendareportDescription: "Description", - agendaTaskEnd: "Heure de fin", - agendaTaskPriority: "Priorité", - agendaTransferFrom: "De", - agendaTransferTo: "À", agendaTransferConcept: "Concept", agendaTransferAmount: "Montant", agendaTransferDeadline: "Date limite", @@ -2298,47 +1975,7 @@ module.exports = { voteNow: "Votez maintenant", alreadyVoted: "Vous avez déjà donné votre avis.", noOpinionsFound: "Aucune opinion trouvée.", - RECENTButton: "RÉCENT", TOPButton: "TOP", - interestingButton: "INTÉRESSANT", - necessaryButton: "NÉCESSAIRE", - funnyButton: "AMUSANT", - disgustingButton: "DÉGOUTANT", - sensibleButton: "SENSIBLE", - propagandaButton: "PROPAGANDE", - adultOnlyButton: "ADULTE SEULEMENT", - boringButton: "ENNUYEUX", - confusingButton: "CONFUS", - usefulButton: "UTILE", - informativeButton: "INFORMATIF", - wellResearchedButton: "BIEN RECHERCHÉ", - accurateButton: "PRÉCIS", - needsSourcesButton: "BESOIN DE SOURCES", - wrongButton: "FAUX", - lowQualityButton: "FAIBLE QUALITÉ", - creativeButton: "CRÉATIF", - insightfulButton: "PERSPECTIF", - actionableButton: "RÉALISABLE", - inspiringButton: "INSPIRANT", - loveButton: "AMOUR", - clearButton: "CLAIR", - upliftingButton: "ÉLÉVANT", - unnecessaryButton: "INUTILE", - rejectedButton: "REJETÉ", - misleadingButton: "TROMPEUR", - offTopicButton: "HORS SUJET", - duplicateButton: "DUPE", - clickbaitButton: "APPÂT À CLIC", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "VIOLENT", - toxicButton: "TOXIQUE", - harassmentButton: "HARCÈLEMENT", - hateButton: "HAINE", - scamButton: "ESCROQUERIE", - triggeringButton: "PROVOCANT", - opinionsCreatedAt: "Créé à", opinionsTotalCount: "Total des opinions", voteInteresting: "Intéressant", voteNecessary: "Nécessaire", @@ -2375,7 +2012,6 @@ module.exports = { voteCreative: "Créatif", voteSpam: "Spam", voteAdultOnly: "Adultes uniquement", - publishBlog: "Publier un blog", privateMessage: "MP", pmSendTitle: "Messages privés", pmSend: "Envoyer !", @@ -2386,7 +2022,6 @@ module.exports = { pmComposeTitle: "Envoyer un message", pmRecipients: "Destinataires", pmRecipientsHint: "Saisissez les IDs Oasis séparés par des virgules", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Jusqu'à 7 destinataires par message.", pmTextPlaceholder: "Corps limité à 7000 caractères.", pmSubject: "Sujet", @@ -2410,7 +2045,6 @@ module.exports = { pmCrypterCharsLabel: "caractères", pmInvalidRecipients: "Identifiant Oasis invalide (devrait ressembler à @…=.ed25519).", pmEncryptionLabel: "Chiffrement", - pmFile: "Fichier joint", private: "Privés", privateDescription: "Vos messages chiffrés.", privateInbox: "BOÎTE DE RÉCEPTION", @@ -2420,18 +2054,14 @@ module.exports = { noPrivateMessages: "Aucun message privé.", pmReply: "Répondre", pmReplies: "réponses", - pmNew: "nouvelles", - pmMarkRead: "Marquer comme lu", inReplyTo: "EN RÉPONSE À", pmPreview: "Aperçu", pmPreviewTitle: "Aperçu", performed: "→", pmFromLabel: "De :", pmToLabel: "À :", - pmInvalidMessage: "Message non valide", pmNoSubject: "(sans objet)", pmSubjectLabel: "Objet :", - pmBodyLabel: "Corps", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2449,8 +2079,6 @@ module.exports = { inboxJobSubscribedTitle: "Nouvelle inscription à votre offre d’emploi", pmInhabitantWithId: "Habitat avec ID OASIS :", pmHasSubscribedToYourJobOffer: "s’est inscrit à votre offre d’emploi", - inboxProjectCreatedTitle: "Nouveau projet créé", - pmHasCreatedAProject: "a créé un projet", inboxMarketItemSoldTitle: "Article vendu", inboxShopSoldTitle: "Produit vendu", pmYourItem: "Votre article", @@ -2460,7 +2088,6 @@ module.exports = { pmHasPledged: "a contribué", pmToYourProject: "à votre projet", blockchain: 'Explorateur de blocs', - blockchainTitle: 'Explorateur de blocs', blockchainDescription: 'Explorez et visualisez les blocs de la chaîne.', blockchainNoBlocks: 'Aucun bloc trouvé sur la chaîne.', blockchainStatsTitle: 'Statistiques', @@ -2472,16 +2099,10 @@ module.exports = { blockchainBlockCarbon: 'Empreinte carbone', blockchainBlockType: 'Type', blockchainBlockTimestamp: 'Horodatage', - blockchainBlockContent: 'Bloc', - blockchainBlockURL: 'URL :', - blockchainContent: 'Bloc', - blockchainContentPreview: 'Aperçu du contenu du bloc', blockchainLatestDatagram: 'Dernier Datagramme', - blockchainDatagram: 'Datagramme', - blockchainDetails: 'Voir les détails du bloc', - blockchainViewBlockexplorer: "Voir dans le blockexplorer", - blockchainBlockInfo: 'Informations du bloc', - blockchainBlockDetails: 'Détails du bloc sélectionné', + blockchainDatagram: "Datagramme", + blockchainDetails: "Voir les Détails du Bloc", + blockchainViewBlockexplorer: "Voir dans le Blockexplorer", blockchainBack: 'Retour à l’explorateur', banking: 'Banque', bankingTitle: 'Banque', @@ -2491,21 +2112,17 @@ module.exports = { bankRules: 'Règles', pending: 'En attente', closed: 'Fermées', - bankBack: 'Retour à la Banque', bankViewTx: 'Voir la Tx', bankClaimNow: 'Réclamer', bankClaimUBI: 'Réclamer RBU !', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'Aucune allocation RBU en attente pour cette époque.', bankEpoch: 'Époque', bankPool: 'Fonds (cette époque)', bankWeightsSum: 'Somme des poids', - bankAllocations: 'Attributions', bankNoAllocations: 'Aucune attribution trouvée.', bankNoEpochs: 'Aucune époque trouvée.', bankEpochAllocations: 'Attributions de l’époque', @@ -2524,9 +2141,6 @@ module.exports = { bankYourFundsMonth: "Vos fonds (ce mois-ci)", bankIndustryBalance: "Production industrielle (estimée)", bankUserBalance: 'Votre solde', - ecoWalletNotConfigured: 'Portefeuille ECOin non configuré', - editWallet: 'Modifier le portefeuille', - addWallet: 'Ajouter un portefeuille', bankAddresses: 'Adresses', bankNoAddresses: 'Aucune adresse trouvée.', bankUser: 'ID d’Oasis', @@ -2551,16 +2165,8 @@ module.exports = { search: 'Rechercher !', bankLocal: 'Local', bankFromOasis: 'Oasis', - bankMyAddress: 'Votre adresse', - bankRemoveMyAddress: 'Supprimer mon adresse', - bankNotRemovableOasis: 'Les adresses ne peuvent pas être supprimées localement', bankingUserEngagementScore: "Score KARMA", - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "PAS DE FONDS!", bankUbiAvailableOk: "DISPONIBLE!", bankUbiAvailability: "RBU (réseau)", @@ -2577,13 +2183,6 @@ module.exports = { shopsTitle: "Boutiques", shopDescription: "Découvrez et gérez les boutiques du réseau.", shopTitle: "Boutique", - shopFilterAll: "TOUTES", - shopFilterMine: "MIENNES", - shopFilterRecent: "RÉCENTES", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUITS", - shopFilterPrices: "PRIX", - shopFilterFavorites: "FAVORIS", shopUpload: "Créer Boutique", shopAllSectionTitle: "Toutes les Boutiques", shopMineSectionTitle: "Mes Boutiques", @@ -2600,16 +2199,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Publier sur le Clearnet", - shopClearnetUnpublish: "Retirer du Clearnet", - shopClearnetUrlLabel: "URL Clearnet", - shopClearnetWarning: "Publier sur le Clearnet rend cette boutique indexable par les moteurs de recherche et robots externes.", shopAddFavorite: "Ajouter Favori", shopRemoveFavorite: "Retirer Favori", shopOpen: "OUVERTE", shopClosed: "FERMÉE", - shopOpenShop: "Ouvrir Boutique", - shopCloseShop: "Fermer Boutique", shopMakePrivate: "RENDRE PRIVÉE (E2E)", shopMakePublic: "RENDRE PUBLIQUE", shopProducts: "Produits", @@ -2637,8 +2230,6 @@ module.exports = { shopOrderPrice: "Prix", shopOrderBuyer: "Acheteur", shopBackToShop: "Retour à la Boutique", - shopShareUrl: "URL de partage", - shopVisitShop: "VISITER BOUTIQUE", marketVisitItem: "VOIR L’ARTICLE", shopStatus: "STATUT", shopCreatedAt: "CRÉÉ", @@ -2647,12 +2238,10 @@ module.exports = { shopLocation: "Localisation", shopTags: "Étiquettes", shopVisibility: "Visibilité", - shopImage: "Image", shopShortDescription: "Description Courte", shopShortDescriptionPlaceholder: "Description breve pour les cartes (max 160 caracteres)", shopTitlePlaceholder: "Nom de votre boutique", shopDescriptionPlaceholder: "Description détaillée de votre boutique", - shopUrlPlaceholder: "https://url-de-votre-boutique.com", shopLocationPlaceholder: "Ville, Pays", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Titre de la carte", @@ -2669,7 +2258,6 @@ module.exports = { bankUnitMinutes: "minutes", bankUnitDays: "jours", bankExchangeNoData: 'Aucune donnée disponible', - bankExchangeIndex: 'Valeur d’ECOin (1h)', bankInflation: 'Inflation d’ECOin (anual)', bankInflationMonthly: 'Inflation d’ECOin (mensual)', bankExchangeChartTitle: 'Progression de la valeur d’ECOin au fil du temps', @@ -2683,38 +2271,17 @@ module.exports = { bankingSyncStatusOutdated: 'Obsolète', statsTitle: 'Statistiques', statistics: "Statistiques", - statsInhabitant: "Statistiques de l'habitant", statsDescription: "Découvrez des statistiques sur votre réseau.", ALLButton: "TOUT", MINEButton: "MIENS", TOMBSTONEButton: "SUPPRESSIONS", - statsYou: "Vous", - statsUserId: "ID Oasis", statsCreatedAt: "Créé le", statsYourContent: "Contenu", statsYourOpinions: "Avis", - statsYourTombstone: "Suppressions", - statsNetwork: "Réseau", - statsTotalInhabitants: "Habitants", - statsDiscoveredTribes: "Tribus (publiques)", - statsPrivateDiscoveredTribes: "Tribus (privées)", statsNetworkContent: "Contenu", - statsYourMarket: "Marché", - statsYourJob: "Emplois", - statsYourProject: "Projets", - statsYourTransfer: "Transferts", - statsYourForum: "Forums", statsNetworkOpinions: "Avis", - statsDiscoveredMarket: "Marché", - statsDiscoveredJob: "Emplois", - statsDiscoveredProject: "Projets", - statsBankingTitle: "Banque", statsEcoWalletLabel: "Portefeuille ECOIN", statsEcoWalletNotConfigured: "Non configuré !", - statsTotalEcoAddresses: "Adresses totales", - statsDiscoveredTransfer: "Transferts", - statsDiscoveredForum: "Forums", - statsNetworkTombstone: "Suppressions", statsBookmark: "Signets", statsEvent: "Événements", statsTask: "Tâches", @@ -2736,16 +2303,12 @@ module.exports = { statsAiExchange: "IA", statsPUBs: 'PUBs', statsPost: "Publications", - statsOasisID: "ID Oasis", statsSize: "Total (taille)", statsBlockchainSize: "Blockchain (taille)", statsBlobsSize: "Blobs (taille)", statsActivity7d: "Activité (7 derniers jours)", statsActivity7dTotal: "Total 7 jours", statsActivity30dTotal: "Total 30 jours", - statsKarmaScore: "Score KARMA", - statsPublic: "Public", - statsPrivate: "Privé", day: "Jour", messages: "Messages", statsProject: "Projets", @@ -2757,30 +2320,14 @@ module.exports = { statsProjectsCancelled: "Annulés", statsProjectsGoalTotal: "Objectif total", statsProjectsPledgedTotal: "Montant promis total", - statsProjectsSuccessRate: "Taux de réussite", - statsProjectsAvgProgress: "Progression moyenne", - statsProjectsMedianProgress: "Progression médiane", - statsProjectsActiveFundingAvg: "Financement actif moyen", - statsJobsTitle: "Emplois", - statsJobsTotal: "Emplois au total", - statsJobsOpen: "Ouverts", - statsJobsClosed: "Fermés", - statsJobsOpenVacants: "Postes ouverts", - statsJobsSubscribersTotal: "Abonnés au total", - statsJobsAvgSalary: "Salaire moyen", - statsJobsMedianSalary: "Salaire médian", statsMarketTitle: "Marché", statsMarketTotal: "Articles au total", statsMarketForSale: "À vendre", statsMarketReserved: "Réservés", statsMarketClosed: "Fermés", statsMarketSold: "Vendus", - statsMarketRevenue: "Chiffre d'affaires", - statsMarketAvgSoldPrice: "Prix de vente moyen", statsUsersTitle: "Habitants", user: "Habitant", - statsTombstoneTitle: "Suppressions", - statsNetworkTombstones: "Suppressions du réseau", statsTombstoneRatio: "Taux de suppressions (%)", statsParliamentCandidature: "Candidatures au parlement", statsParliamentTerm: "Mandats parlementaires", @@ -2807,30 +2354,21 @@ module.exports = { aiConfiguration: "Configurer le prompt", aiPromptUsed: "Invite", aiClearHistory: "Effacer l’historique du chat", - aiSharePrompt: "Ajouter cette réponse à l’entraînement collectif ?", - aiShareYes: "Oui", - aiShareNo: "Non", - aiSharedLabel: "Ajoutée à l’entraînement", - aiRejectedLabel: "Non ajoutée à l’entraînement", aiServerError: "L’IA n’a pas pu répondre. Réessayez.", aiInputPlaceholder: "Qu'est-ce qu'Oasis ?", typeAiExchange: "IA", aiApproveTrain: "Ajouter à l’entraînement collectif", aiRejectTrain: "Ne pas entraîner", - aiTrainPending: "En attente d’approbation", aiTrainApproved: "Approuvé pour l’entraînement", aiTrainRejected: "Rejeté pour l’entraînement", aiSnippetsUsed: "Fragments utilisés", aiSnippetsLearned: "Fragments appris", statsAITraining: "Entraînement de l’IA", - aiApproveCustomTrain: "Entraîner avec cette réponse personnalisée", aiCustomAnswerPlaceholder: "Écrivez votre réponse personnalisée…", - statsAIExchanges: "Échanges de modèles", marketMineSectionTitle: "Vos articles", marketCreateSectionTitle: "Créer un article", marketUpdateSectionTitle: "Mettre à jour", marketAllSectionTitle: "Marché", - marketRecentSectionTitle: "Marché récent", marketTitle: "Marché", marketDescription: "Un marché pour échanger des biens ou des services dans votre réseau.", marketFilterAll: "TOUS", @@ -2860,14 +2398,11 @@ module.exports = { marketItemDeadline: "Date limite", marketItemIncludesShipping: "Livraison incluse ?", marketItemHighestBid: "Meilleure offre", - marketItemHighestBidder: "Meilleur enchérisseur", marketItemStock: "Réserve", marketOutOfStock: "Rupture de stock", - marketItemBidTime: "Date de l'enchère", marketActionsUpdate: "Mettre à jour", marketUpdateButton: "Mettre à jour", marketActionsDelete: "Supprimer", - marketActionsSold: "Marquer comme vendu", marketActionsChangeStatus: "CHANGER LE STATUT", marketActionsBuy: "ACHETER !", marketAuctionBids: "Offres en cours", @@ -2876,21 +2411,17 @@ module.exports = { marketNoItems: "Aucun article disponible pour le moment.", marketYourBid: "Votre offre", marketCreateFormImageLabel: "Télécharger un média (max: 50 Mo)", - marketSearchLabel: "Rechercher", marketSearchPlaceholder: "Rechercher par titre ou tags", marketMinPriceLabel: "Prix minimum", marketMaxPriceLabel: "Prix maximum", - marketSortLabel: "Trier par", marketSortRecent: "Les plus récents", marketSortPrice: "Prix", marketSortDeadline: "Date limite", marketSearchButton: "Rechercher", marketAuctionEndsIn: "Se termine", marketAuctionEnded: "Terminé", - marketMyBidBadge: "Vous avez enchéri", marketNoItemsMatch: "Aucun article ne correspond à votre recherche.", housingTitle: "Logement", - housingLabel: "Logement", housingDescriptionText: "Découvrez et gérez des lieux dans votre réseau.", modulesHousingLabel: "Logement", modulesHousingDescription: "Module pour découvrir et gérer des lieux.", @@ -2934,14 +2465,7 @@ module.exports = { housingAvailableFrom: "Disponible à partir du", housingAvailableTo: "Disponible jusqu'au", housingTags: "Étiquettes", - housingImages: "Photos (taille max : 50 Mo chacune)", - housingRemovePhoto: "Retirer", spreadEditWarning: "Ce contenu perdra ses partages après modification", - housingRemoveVideo: "Retirer la vidéo", - housingAddPhoto: "Ajouter une photo", - housingAddVideo: "Ajouter une vidéo", - housingVideo: "Vidéo (taille max : 50 Mo)", - housingPhotos: "Photos", housingRequests: "Demandes", housingRequestButton: "Demander", housingCancelButton: "Annuler la demande", @@ -3010,7 +2534,6 @@ module.exports = { jobLocationPresencial: "Présentiel", jobLocationRemote: "À distance", jobVacantsPlaceholder: "Nombre de postes vacants", - jobSalaryPlaceholder: "Salaire en ECO pour 1 heure", jobImage: "Télécharger un média (max: 50 Mo)", jobTasks: "Tâches", jobType: "Type d’emploi", @@ -3020,7 +2543,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Emplois les mieux payés", createJobButton: "Publier un emploi", - viewDetailsButton: "Voir les détails", noJobsFound: "Aucune offre d’emploi trouvée.", jobAuthor: "Par", jobTypeFreelance: "Autonome", @@ -3032,10 +2554,6 @@ module.exports = { jobsHoursOffered: "Heures offertes", jobsHoursRequested: "Heures demandées en échange", jobsExchangeSkill: "Compétence demandée en échange", - jobsHoursOfferedPlaceholder: "ex. 4", - jobsHoursRequestedPlaceholder: "ex. 4", - jobsExchangeSkillPlaceholder: "ex. menuiserie, design", - jobExchangeHint: "Pour les emplois en échange d’heures, remplissez les champs ci-dessous au lieu du salaire.", jobTimePartial: "Partiel", jobTimeComplete: "Complet", jobsDeleteButton: "SUPPRIMER", @@ -3043,28 +2561,17 @@ module.exports = { jobsFilterApplied: "POSTULÉ", jobsAppliedTitle: "Mes candidatures", jobsAppliedBadge: "Candidaté", - jobsFilterFavs: "Favoris", - jobsFavsTitle: "Favoris", - jobsFilterNeeds: "Besoin d'aide", - jobsNeedsTitle: "Besoin d'aide", - jobsSearchLabel: "Recherche", jobsSearchPlaceholder: "Rechercher titre, tags, description...", jobsMinSalaryLabel: "Salaire min.", jobsMaxSalaryLabel: "Salaire max.", - jobsSortLabel: "Trier par", jobsSortRecent: "Plus récents", jobsSortSalary: "Salaire le plus élevé", jobsSortSubscribers: "Plus de candidats", jobsSearchButton: "Rechercher", - jobsFavoriteButton: "Favori", - jobsUnfavoriteButton: "Retirer favori", - jobsMessageAuthorButton: "MP", jobsApplicants: "Candidats", jobsUpdatedAt: "Mis à jour", jobSetOpen: "Marquer ouvert", - jobNewBadge: "NOUVEAU", jobsTagsLabel: "Étiquettes", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "Aucune offre ne correspond à votre recherche.", industrySearchPlaceholder: "Rechercher des usines…", industryAllSectors: "Tous les secteurs", @@ -3072,9 +2579,7 @@ module.exports = { industryAdvanceTo: "Passer à", industryAmount: "Montant", industryApproveBuild: "Approuver", - industryBackToFacility: "← Usine", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Blueprint d’industrie", industryBlueprints: "Blueprints", industryBuild: "Build", industryBuildNotes: "Notes", @@ -3087,18 +2592,13 @@ module.exports = { industryBuilds: "Builds", industryBuildTitle: "Titre", industryContribute: "Contribuer", - industryContributeEco: "Contribuer en ECO", - industryContributeLabor: "Contribuer du travail", industryContributeButton: "Contribuer", - industryContributeMaterial: "Contribuer du matériel", industryContributions: "Contributions", - industryContributors: "contributeurs", industryCreateBlueprintButton: "Créer un blueprint", industryDistribute: "Distribuer", industryDistributeButton: "Distribuer par parts", industryDistribution: "Distribution", industryEcoAmount: "Montant (ECO)", - industryEcoContribHint: "Les contributions en ECO sont transférées à l'intendant en tant que dépositaire de la trésorerie du build.", industryEditBlueprint: "Modifier le blueprint", industryFacility: "Usine", industryKindLabel: "Type", @@ -3107,13 +2607,10 @@ module.exports = { industryKind_eco: "Fonds", industryLaborHours: "Main-d'œuvre (heures)", industryHours: "Heures", - industryLicense: "Licence", industryMaterialItem: "Matériel", industryMaterials: "Matériaux", - industryMaterialsHint: "Un matériau par ligne, au format nom:quantité:prix.", industryEstMaterials: "Total matériaux", industryEstLabor: "Total main-d'œuvre", - industryEstTaxes: "Taxes", industryEstTotal: "Prix estimé", industryBuildingPrice: "Prix de fabrication", industryFinalPrice: "Prix final", @@ -3123,19 +2620,13 @@ module.exports = { industryNewBlueprint: "Nouveau blueprint", industryNewBuild: "Proposer un build", industryEditBuild: "Modifier la production", - industryNoBlueprint: "— aucun —", industryNeedBlueprint: "Créez d'abord un plan : chaque production en fabrique un.", industryNoBlueprints: "Aucun blueprint pour l'instant.", industryNoBuilds: "Aucun build pour l'instant.", industryNote: "Note", industryOutput: "Sortie", - industryOutputItem: "Nom du produit", industryOutputKind: "Type de produit", - industryOutputQty: "Unités par production", - industryOutputUnit: "Unité de mesure", industryOutputValue: "Valeur de sortie (ECO, p. ex. de la vente)", - industryPayout: "Paiement", - industryPoints: "Karma", industryPostJob: "Créer un emploi", industryPot: "Cagnotte", industryProposeBuildButton: "Proposer le build", @@ -3143,8 +2634,6 @@ module.exports = { industryAuthor: "Auteur", industrySellOnMarket: "Envoyer au marché", industrySendToProjects: "Créer un projet", - industryShare: "Part", - industryShares: "Parts", industrySkills: "Compétences", industryTreasury: "Trésorerie", industryKind_physical: "Physique", @@ -3158,6 +2647,16 @@ module.exports = { industryBuildStatus_FAILED: "ÉCHOUÉ", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Une offre correspond à votre CV", + jobsBotMatchIntro: "Une offre correspond à votre CV.", + jobsBotMatchJob: "Emploi", + jobsBotMatchHint: "Vous recevez ceci parce que votre CV est géré par l'IA. Vous pouvez le désactiver dans votre CV.", + cvAiManaged: "Géré par l'IA", + switchOn: "ACTIVÉ", + switchOff: "DÉSACTIVÉ", + cvAiManagedHint: "Si activé, JobsBot vous prévient par message privé quand une offre correspond à votre CV.", + cvMatchThreshold: "Me prévenir à partir de ce niveau de correspondance", housingBotRequestedTitle: "Quelqu’un a demandé l’un de vos lieux.", housingBotCancelledTitle: "Une demande sur l’un de vos lieux a été annulée.", housingBotYouRequestedTitle: "Vous avez demandé un lieu.", @@ -3186,22 +2685,14 @@ module.exports = { industryRulesDistribution: "Lorsqu'une production est terminée, le steward répartit le pot (les fonds de la production plus la valeur de vente) entre les contributeurs, au prorata de leurs parts.", industryRulesTreasury: "Les contributions en ECO sont détenues par l'intendant comme dépositaire de la trésorerie du build jusqu'à la distribution ; tous les mouvements sont enregistrés sur le réseau et les litiges peuvent aller aux Courts.", industryJobs: "Emplois", - industryNoJobs: "Aucun poste pour l'instant.", - industryCreatePosition: "Créer un poste", - industryViewCV: "CV", industryReportButton: "Signaler", industryCreateTask: "Créer une tâche", industryOpenDispute: "Ouvrir un litige", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "p. ex. unité, kg, licence", - industryOutputItemPlaceholder: "ex. robot", - industryOutputQtyPlaceholder: "ex. 5", - industrySkillsPlaceholder: "p. ex. soudure, réseaux, installation-solaire", industryCreateInvite: "Générer une invitation", industryPauseVotes: "Votes de statut", industryTitle: "Industrie", industryDescription: "Module pour gérer collectivement les moyens de production.", - industryLabel: "Industrie", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "DISTRIBUTION", @@ -3250,9 +2741,7 @@ module.exports = { industryInviteNeeded: "Vous avez besoin d'une invitation pour rejoindre.", industryPauseButton: "Voter la pause", industryResumeButton: "Voter la reprise", - industryEditButton: "Modifier", industryDeleteButton: "Supprimer", - industryBackToList: "← Industrie", industryPendingApplicants: "Candidatures en attente", industryVotesYes: "oui", industryVotesNo: "non", @@ -3260,23 +2749,13 @@ module.exports = { industryAdmit: "Admettre", industryReject: "Rejeter", industryDissolveTitle: "Dissoudre l'usine", - industryDissolveHint: "La dissolution requiert un vote collectif ; l'intendant ne peut pas dissoudre seul.", industryDissolveVote: "Voter la dissolution", - industrySector_software: "Logiciel", - industrySector_hardware: "Matériel", - industrySector_agriculture: "Agriculture", - industrySector_textile: "Textile", - industrySector_energy: "Énergie", - industrySector_food: "Alimentation", - industrySector_construction: "Construction", - industrySector_media: "Médias", - industrySector_services: "Services", - industrySector_other: "Autre", industryPolicy_open: "Ouverte", industryPolicy_vote: "Par vote", industryPolicy_invite: "Sur invitation", projectsTitle: "Projets", projectsDescription: "Créez, financez et suivez des projets communautaires dans votre réseau.", + projectSearchPlaceholder: "Rechercher des projets...", projectCreateProject: "Créer un projet", projectCreateButton: "Créer un projet", projectUpdateButton: "METTRE À JOUR", @@ -3320,14 +2799,8 @@ module.exports = { projectPledgeTitle: "Soutenez ce projet", projectPledgePlaceholder: "Montant en ECO", projectBounties: "Récompenses", - projectBountiesInputLabel: "Récompenses (une par ligne : Titre|Montant [ECO]|Description)", - projectBountiesPlaceholder: "Réparer un bug UI|100|Lien vers le problème\nRédiger de la documentation|250|Exemples d'utilisation", projectNoBounties: "Aucune récompense trouvée.", projectTitle: "Titre", - projectAddBountyTitle: "Ajouter une nouvelle récompense", - projectBountyTitle: "Titre de la récompense", - projectBountyAmount: "Montant (ECO)", - projectBountyDescription: "Description", projectMilestoneSelect: "Sélectionner un jalon", projectBountyCreateButton: "Créer une récompense", projectBountyStatus: "Statut de la récompense", @@ -3342,19 +2815,15 @@ module.exports = { projectMilestoneTitle: "Titre du jalon", projectMilestoneTargetPercent: "Pourcentage (%)", projectMilestoneDueDate: "Date", - projectMilestoneCreateButton: "Créer un jalon", projectMilestoneStatus: "Statut du jalon", projectMilestoneOpen: "ouvert", projectMilestoneDone: "complété", projectMilestoneDue: "échéance", - projectNoMilestones: "Aucun jalon trouvé.", projectMilestoneMarkDone: "Marquer comme fait", projectMilestoneTitlePlaceholder: "Entrez le titre du jalon", projectMilestoneDescriptionPlaceholder: "Entrez la description de ce jalon", projectMilestoneDescription: "Description du jalon", - projectBudgetGoal: "Budget (Objectif)", projectBudgetAssigned: "Assigné aux récompenses", - projectBudgetRemaining: "Restant", projectBudgetOver: "⚠ Budget dépassé : ce qui est assigné dépasse l’objectif", projectFollowers: "Suiveurs", projectFollowersTitle: "Suiveurs", @@ -3367,7 +2836,6 @@ module.exports = { projectBackersTotalPledged: "Total engagé", projectBackersYourPledge: "Votre engagement", projectBackersNone: "Pas encore d'engagement.", - projectNoRemainingBudget: "Aucun budget restant.", projectFilterApplied: "POSTULÉ", projectAppliedTitle: "POSTULÉ", projectFilterBackers: "MÉCÈNES", @@ -3376,30 +2844,15 @@ module.exports = { projectBackerAmount: "Total engagé", projectBackerPledges: "Engagements", projectBackerProjects: "Projets", - projectPledgeAmount: "Montant", projectSelectMilestoneOrBounty: "Sélectionner un jalon ou une récompense", projectPledgeButton: "Soutenir", footerLicense: "GPLv3", - footerPackage: "Paquet", - footerVersion: "Version", modulesModuleName: "Nom", modulesModuleDescription: "Description", modulesModuleStatus: "Statut", modulesTotalModulesLabel: "Modules chargés", modulesEnabledModulesLabel: "Activés", modulesDisabledModulesLabel: "Désactivés", - modulesPopularLabel: "Populaire", - modulesPopularDescription: "Module pour recevoir les publications tendance, les plus vues ou les plus commentées.", - modulesTopicsLabel: "Sujets", - modulesTopicsDescription: "Module pour recevoir des catégories de discussion basées sur des intérêts partagés.", - modulesSummariesLabel: "Résumé", - modulesSummariesDescription: "Module pour recevoir des résumés de discussions ou publications longues.", - modulesLatestLabel: "Derniers", - modulesLatestDescription: "Module pour recevoir les publications et discussions les plus récentes.", - modulesThreadsLabel: "Fils", - modulesThreadsDescription: "Module pour recevoir des conversations groupées par sujet ou question.", - modulesMultiverseLabel: "Multivers", - modulesMultiverseDescription: "Module pour recevoir du contenu d’autres pairs fédérés.", modulesInvitesLabel: "Invitations", modulesInvitesDescription: "Module pour gérer et appliquer des codes d'invitation.", modulesWalletLabel: "Portefeuille", @@ -3444,8 +2897,12 @@ module.exports = { modulesOpinionsDescription: "Module pour découvrir et voter des opinions.", modulesTransfersLabel: "Transferts", modulesTransfersDescription: "Module pour découvrir et gérer les contrats intelligents (transferts).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Gérez vos autres comptes du fédiverse, y compris l'envoi et la réception de contenu.", + modulesFediverseLabel: "Multivers", + modulesBlogsLabel: "Blogs", + modulesBlogsDescription: "Module pour découvrir et gérer les blogs.", + modulesPollsLabel: "Sondages", + modulesPollsDescription: "Module pour interroger le réseau et compter les réponses.", + modulesFediverseDescription: "Gérez vos autres comptes du multiverse, y compris l'envoi et la réception de contenu.", modulesFeedLabel: "Fil", modulesFeedDescription: "Module pour découvrir et partager des textes courts (flux).", modulesPixeliaLabel: "Pixelia", @@ -3477,44 +2934,44 @@ module.exports = { visibilityMakeHidden: "Cacher", invitesInhabitantsTitle: "Habitants", invitesInhabitantsFollow: "Suivre", - aiNavPlaceholder: "Où veux-tu aller ?", + aiNavPlaceholder: "Décrivez ce qu'il vous faut...", aiNavDisabled: "La navigation par IA est désactivée.", - aiNavResultsTitle: "Suggestions de navigation IA", + aiNavResultsTitle: "Suggestions AINav", aiNavQueryLabel: "Requête", - aiNavResultsDescription: "Choisissez l'itinéraire qui correspond le mieux à ce que vous cherchez.", - aiNavResultPath: "Route", - aiNavResultDescription: "Ce que vous pouvez y faire", aiNavResultMatch: "Correspondance", aiNavResultsEmpty: "Aucune route correspondante. Essayez /search.", - aiNavSearchInstead: "Rechercher plutôt", modulesAINavLabel: "AINav", modulesAINavDescription: "Module pour des requêtes en langage naturel sur le contenu du réseau.", - directConnect: "Connexion Directe", directConnectDescription: "Connectez-vous directement à un pair en saisissant son adresse IP, port et clé publique. Le pair sera ajouté comme connexion suivie.", peerHost: "IP", peerPort: "Port (par défaut : 8008)", peerPublicKey: "Clé publique (@...ed25519)", connectAndFollow: "Connecter", - deviceSourceLabel: "Appareil", modulesPresetTitle: "Configurations Communes", - modulesPreset_minimal: "Minimal", - modulesPreset_basic: "Basique", - modulesPreset_social: "Social", - modulesPreset_economy: "Économie", - modulesPreset_full: "Complet", + workflowsTitle: "Workflows", + workflowsDescription: "Un workflow définit le thème et les modules actifs.", + workflowsSet: "Appliquer le workflow", + workflow_default: "Par défaut", + workflow_jobs: "Emploi", + workflow_ruling: "Gouvernance", + workflow_politics: "Politique", + workflow_social: "Social", + workflow_business: "Affaires", + workflow_night: "Nuit", + workflow_mobile: "Mobile", statsCarbonFootprintTitle: "Empreinte Carbone", - statsCarbonFootprintNetwork: "Empreinte carbone du réseau", - statsCarbonFootprintYours: "Votre empreinte carbone", statsCarbonTombstone: "Empreinte du tombstoning", - feedSuccessMsg: "Feed publié avec succès !", - dominantOpinionLabel: "Opinion dominante", uploadMedia: "Télécharger un média (max: 50 Mo)", invitesUnfollow: "Ne plus suivre", invitesFollow: "Suivre", invitesUnfollowedInvites: "Non fédérés", invitesNoUnfollowed: "Aucun pub non fédéré.", blockchainContentDeleted: "Ce contenu a été supprimé", - visitContent: "Voir le contenu", + visitContent: "Visiter le Contenu", + favoriteAdd: "Épingler aux Favoris", + pmContentTooltip: "Envoyer un Message Privé", + favoriteRemove: "Retirer des Favoris", + reportContent: "Signaler le Contenu", bankEcoinHours: "Équivalence ECOin en temps", mapsLabel: "Cartes", mapTitle: "Cartes", @@ -3542,14 +2999,13 @@ module.exports = { mapDescriptionLabel: "Description", mapDescriptionPlaceholder: "Décrivez la carte ou l'emplacement...", mapTypeLabel: "Type de carte", - mapTypeSingle: "UNIQUE (emplacement initial uniquement)", - mapTypeOpen: "OUVERT (tout le monde peut ajouter des marqueurs)", - mapTypeClosed: "FERMÉ (seul le créateur ajoute des marqueurs)", + mapInviteMode: "Invitation", + mapTypeSingle: "UNIQUE", + mapTypeOpen: "OUVERT", + mapTypeClosed: "FERMÉ", mapTagsLabel: "Étiquettes", mapTagsPlaceholder: "Entrez des étiquettes séparées par des virgules", mapUrlLabel: "URL de la carte", - mapPickCoordLabel: "Ou sélectionnez un emplacement sur la grille :", - mapMarkersLabel: "marqueurs", mapMarkersTitle: "Marqueurs", mapMarkerDefault: "Marqueur", mapMarkerLatLabel: "Latitude du marqueur", @@ -3576,14 +3032,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pads", modulesPadsDescription: "Module pour gérer les éditeurs de texte collaboratifs.", - padFilterAll: "TOUS", - padFilterMine: "MES PADS", - padFilterRecent: "RÉCENT", - padFilterOpen: "OUVERT", - padFilterClosed: "FERMÉ", padCreate: "Créer Pad", - padUpdate: "Modifier Pad", - padDelete: "Supprimer Pad", + padUpdate: "Modifier", + padDelete: "Supprimer", padTitleLabel: "Titre", padTitlePlaceholder: "Entrez le titre du pad...", padStatusLabel: "Statut", @@ -3594,14 +3045,7 @@ module.exports = { padTagsLabel: "Tags", padTagsPlaceholder: "tag1, tag2, ...", padMembersLabel: "Membres", - padVisitPad: "Visiter le Pad", - padShareUrl: "Partager URL", padCreated: "Créé", - padAuthor: "Auteur", - padGenerateCode: "Générer un Code", - padInviteCodeLabel: "Code d'Invitation", - padInviteCodePlaceholder: "Entrez le code d'invitation...", - padValidateInvite: "Valider", padStartEditing: "COMMENCER À ÉDITER !", padEditorPlaceholder: "Commencez à écrire...", padSubmitEntry: "Envoyer", @@ -3614,12 +3058,11 @@ module.exports = { padClosedSectionTitle: "Pads Fermés", padCreateSectionTitle: "Créer un Nouveau Pad", padUpdateSectionTitle: "Modifier le Pad", - padInviteGenerated: "Code d'Invitation Généré", typePad: "PADS", padNew: "NOUVEAU", padAddFavorite: "Ajouter aux Favoris", padRemoveFavorite: "Retirer des Favoris", - padClose: "Fermer le pad", + padClose: "Fermer", padBackToEditor: "Retour à l'éditeur", padSearchPlaceholder: "Rechercher des pads...", @@ -3627,8 +3070,6 @@ module.exports = { modulesChatsDescription: "Module pour découvrir et gérer les chats chiffrés.", typeChat: "CHATS", typeChatMessage: "MESSAGE CHAT", - chatLabel: "CHATS", - chatMessageLabel: "MESSAGES CHAT", chatsTitle: "Chats", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3636,56 +3077,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Description", - chatMessageReply: "Réponse", - chatMessageLabel: "Message", chatCategory: "Catégorie", chatStatus: "STATUT", - chatFilterAll: "TOUS", - chatFilterMine: "MIEN", - chatFilterRecent: "RÉCENT", - chatFilterFavorites: "FAVORIS", - chatFilterOpen: "OUVERT", - chatFilterClosed: "FERMÉ", chatCreate: "Créer Chat", - chatUpdate: "Modifier Chat", - chatDelete: "Supprimer Chat", + chatUpdate: "Mettre à jour", + chatDelete: "Supprimer", chatClose: "Fermer Chat", chatVisitChat: "VOIR CHAT", chatUntitled: "Chat sans titre", chatNoItems: "Aucun chat trouvé.", chatParticipants: "Participants", - chatStartChatting: "COMMENCER À CHATTER!", - chatGenerateCode: "Générer Code", - chatShareUrl: "Partager URL", + chatMessagesLabel: "Messages", + chatThreadsLabel: "Fils", chatCreatedAt: "CRÉÉ", chatSearchPlaceholder: "Rechercher chats...", chatStatusOpen: "OUVERT", chatStatusInviteOnly: "SUR INVITATION", chatStatusClosed: "FERMÉ", chatSendMessage: "Envoyer", + chatJumpLatest: "Dernier message", + chatPickChat: "Choisissez un chat pour l'ouvrir", + chatNoneYet: "Aucun chat disponible pour l'instant.", + activitySearchPlaceholder: "Chercher dans l'activité...", + trendingSearchPlaceholder: "Chercher dans les tendances...", + opinionsSearchPlaceholder: "Chercher dans les opinions...", + votesSearchPlaceholder: "Chercher dans les votations...", + welcomeStepUxTitle: "Choisissez votre interface", + welcomeStepUxText: "Choisissez l'apparence d'Oasis. Modifiable ensuite dans les réglages.", + welcomeStepUxAction: "Utiliser cette vue", + chatRateLimitTitle: "Trop de messages", + chatRateLimitMessage: "Vous avez atteint la limite de messages que ce salon accepte en une heure. Réessayez plus tard.", chatMessagePlaceholder: "Tapez votre message...", chatNoMessages: "Pas encore de messages.", - chatLeave: "Quitter Chat", - chatInviteCodeLabel: "Entrez le code d'invitation", - chatJoinByInvite: "Rejoindre", chatTitlePlaceholder: "Titre du chat", chatDescriptionPlaceholder: "Description du chat", chatTagsPlaceholder: "tag1, tag2, tag3", chatImageLabel: "Sélectionnez un fichier image (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Code d'Invitation", chatAuthor: "Auteur", - chatCreated: "Créé", chatAddFavorite: "Ajouter aux Favoris", chatRemoveFavorite: "Retirer des Favoris", chatPM: "MP", chatStatusLabel: "Statut", chatCategoryLabel: "Catégorie", - chatParticipantsLabel: "Participants", gamesTitle: "Jeux", gamesDescription: "Découvrez et jouez à des jeux.", gamesFilterAll: "TOUS", gamesPlayButton: "JOUER!", - gamesBackToGames: "Retour aux Jeux", modulesGamesLabel: "Jeux", modulesGamesDescription: "Module pour découvrir et jouer à des jeux.", modulesGraphosLabel: "Graphos", @@ -3702,8 +3139,6 @@ module.exports = { gamesArkanoidDesc: "Cassez toutes les briques avec votre raquette et votre balle. Un défi arcade classique.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Ping-pong classique contre une IA. Le premier à 5 points gagne.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Course contre la montre! Évitez les obstacles et atteignez l'arrivée à temps.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Pilotez votre vaisseau dans un champ d'astéroïdes. Détruisez-les avant qu'ils ne vous touchent.", gamesRockPaperScissorsTitle: "Pierre Feuille Ciseaux", @@ -3724,8 +3159,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3736,12 +3169,6 @@ module.exports = { modulesCalendarsLabel: "Calendriers", modulesCalendarsDescription: "Module pour découvrir et gérer les calendriers.", typeCalendar: "CALENDRIERS", - calendarFilterAll: "TOUS", - calendarFilterMine: "LES MIENS", - calendarFilterOpen: "OUVERT", - calendarFilterClosed: "FERMÉ", - calendarFilterRecent: "RÉCENTS", - calendarFilterFavorites: "FAVORIS", calendarCreate: "Créer un calendrier", calendarUpdate: "Mettre à jour", calendarDelete: "Supprimer", @@ -3754,24 +3181,17 @@ module.exports = { calendarTagsLabel: "Étiquettes", calendarTagsPlaceholder: "tag1, tag2...", calendarParticipantsLabel: "Participants", - calendarParticipantsCount: "Participants", - calendarVisitCalendar: "Visiter le calendrier", calendarCreated: "Créé", - calendarAuthor: "Auteur", calendarJoin: "Rejoindre", calendarGenerateInvite: "Générer une invitation", - calendarInviteCodePlaceholder: "Entrez le code d'invitation...", - calendarValidateInvite: "Valider le code", - calendarJoined: "Rejoint", - calendarAddDate: "Ajouter une date", - calendarAddNote: "Ajouter une note", calendarDateLabel: "Date", calendarDatePlaceholder: "Décrivez cette date...", - calendarNoteLabel: "Note", + calendarNoteLabel: "Notes", calendarNotePlaceholder: "Ajouter une note...", calendarFirstDateLabel: "Date", calendarFirstNoteLabel: "Notes", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Sans répétition", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3782,8 +3202,6 @@ module.exports = { calendarsDescription: "Découvrez et gérez les calendriers de votre réseau.", calendarMonthPrev: "← Précédent", calendarMonthNext: "Suivant →", - calendarMonthLabel: "Dates", - calendarsShareUrl: "URL de partage", calendarAllSectionTitle: "Calendriers", calendarRecentSectionTitle: "Calendriers Récents", calendarFavoritesSectionTitle: "Favoris", @@ -3797,7 +3215,6 @@ module.exports = { calendarRemoveFavorite: "Retirer des favoris", calendarSearchPlaceholder: "Rechercher des calendriers...", calendarAddEntry: "Ajouter une entrée", - calendarLeave: "Quitter le calendrier", statsCalendar: "Calendriers", statsCalendarDate: "Dates de calendrier", statsCalendarNote: "Notes de calendrier", @@ -3844,7 +3261,6 @@ module.exports = { torrentSortOldest: "Plus anciens", torrentSortTop: "Plus votés", torrentNoMatch: "Aucun torrent correspondant.", - torrentMessageAuthorButton: "Envoyer un Message à l'Auteur", torrentUpdatedAt: "Mis à jour", statsTorrent: "Torrents", typeTorrent: "TORRENTS", @@ -3852,10 +3268,18 @@ module.exports = { modulesTorrentsDescription: "Module pour découvrir et gérer les torrents.", favoritesFilterTorrents: "TORRENTS", favoritesFilterMarket: "MARCHÉ", + favoritesFilterEvents: "ÉVÉNEMENTS", + favoritesFilterForum: "FORUM", + favoritesFilterHousing: "LOGEMENT", + favoritesFilterJobs: "EMPLOIS", + favoritesFilterProjects: "PROJETS", + favoritesFilterReports: "RAPPORTS", + favoritesFilterTasks: "TÂCHES", + favoritesFilterTransfers: "TRANSFERTS", + favoritesFilterVotes: "VOTES", favoritesFilterShopProducts: "ARTICLES BOUTIQUE", tribeSectionTorrents: "TORRENTS", tribeCreateTorrent: "Téléverser un Torrent", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Souhait", settingsWishDesc: "Configurez le souhait de votre Avatar.", settingsWishWhole: "Multiverse", @@ -3866,16 +3290,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "L'envoi est un garde-fou UX. La réception est un filtre d'attention.", - pmBlockedNonMutual: "Vous ne pouvez envoyer des MP qu'aux habitants en soutien mutuel.", inhabitantsPendingFollowsTitle: "Demandes de soutien en attente", inhabitantsPendingAccept: "Accepter", inhabitantsPendingReject: "Refuser", - bxEncrypted: "CHIFFRÉ", - bxEncryptedHexLabel: "Texte chiffré (aperçu)", tribeSectionGovernance: "GOUVERNANCE", - tribeSubStatusPublic: "PUBLIQUE", - tribeSubStatusPrivate: "PRIVÉE", - tribeSubInheritedPrivate: "PRIVÉE (héritée de la tribu principale)", tribePadInviteRequired: "Vous n'avez pas accès au pad. Demandez une invitation.", tribeChatInviteRequired: "Vous n'avez pas accès au chat. Demandez une invitation.", tribeGovernanceDesc: "Gouvernance interne de cette tribu.", @@ -3915,44 +3333,31 @@ module.exports = { tribeGovNoHistorical: "Aucun enregistrement pour l’instant", logsTitle: "Journal", logsDescription: "Enregistrez votre expérience sur le réseau.", - logsReadMore: "Lire la suite", logsViewTitle: "Journal", logsColumnType: "Type", logsView: "Voir", - logsManualPrompt: "Écrivez votre journal", logsUpdateButton: "Mettre à jour", - logsEditTitle: "Éditer une entrée", - logsCreateDescription: "Enregistrez votre expérience...", + logsEditTitle: "Mettre à jour le journal", logsCreateTitle: "Créer une entrée", logsWriteButton: "Écrire", logsTextPlaceholder: "Décrivez vos expériences...", - logsTextField: "Texte", - logsLabelPlaceholder: "Libellé...", - logsLabelField: "Écrivez votre journal (libellé)", - logsAiDisabledWarn: "Activez le module IA dans /modules pour utiliser les entrées écrites par l'IA.", - logsAiContextValue: "Jour de blockchain", - logsAiContext: "Contexte", - logsAiModStatus: "AImod", - logsModeApply: "Appliquer !", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manuel", logsModeAI: "IA", - logsColumnDelete: "Supprimer", - logsColumnEdit: "Éditer", logsColumnLog: "Journal", logsColumnDate: "Date", logsDelete: "Supprimer", - logsEdit: "Éditer", + logsEdit: "Mettre à jour", logsFilterAlways: "TOUJOURS", logsFilterYear: "ANNÉE", logsFilterMonth: "MOIS", logsFilterWeek: "SEMAINE", logsFilterToday: "AUJOURD'HUI", - logsFilterRecent: "RÉCENTS", - logsFilterAll: "TOUS", + logsComments: "Commentaires", + logsAuthorEntries: "Entrées", logsCreate: "Créer une entrée", logsExport: "Exporter le journal", - logsExportOne: "Exporter", + logsExportOne: "Exporter le journal", logsViewDetails: "Voir les détails", logsGenerateButton: "Générer le texte", logsSearchText: "Chercher dans les journaux...", @@ -3962,31 +3367,25 @@ module.exports = { modulesLogsLabel: "Journal", modulesLogsDescription: "Module pour enregistrer (via un assistant IA) vos expériences.", statsLogsTitle: "Journal", - statsLogsEntries: "Entrées", typeLog: "JOURNAL", - blockchainCycle: "Cycle", larpTitle: "L.A.R.P.", larpDescription: "Une couche de jeu de rôle grandeur nature pour l'expérimentation collaborative.", + larpNoHousesMatch: "Aucune maison ne correspond à votre recherche.", + larpSearchPlaceholder: "Rechercher des maisons...", larpAllHouses: "Maisons :", larpFilterRuling: "RÈGNE", larpFilterHouses: "MAISONS", larpFilterRules: "FAQ", larpRulesTitle: "FAQ du L.A.R.P.", - larpRulesEntryTitle: "Maison de départ", larpRulesEntryText: "Chaque habitant commence dans ACADEMIA par défaut. Depuis ACADEMIA, choisis une maison dans le panneau \"Rejoindre une maison\" : cela ouvre son test d'entrée. Réponds aux 10 questions et soumets. Si tu dépasses le seuil (7/10), tu es admis automatiquement dans cette maison ; sinon, tu es rejeté et tu restes dans ACADEMIA. Dans tous les cas, le système enregistre ton OasisID et le cycle de la tentative et empêche un nouvel essai jusqu'à la fin du délai de 30 cycles.", - larpRulesLeaveText: "Les membres de toute maison peuvent retourner à ACADEMIA à tout moment depuis leur page de maison ; cela réinitialise leur appartenance mais ne lève pas le délai du test.", - larpRulesGovernanceTitle: "Mur de gouvernance", larpRulesGovernanceText: "Pendant son cycle, la maison régnante arbore l'insigne \"Règne\" et est la seule dont le Mur est exposé publiquement sous l'onglet RÈGNE.", - larpRulesSignTitle: "Emblème L.A.R.P.", + larpRulesWallText: "Chaque maison a un Mur où écrivent ses membres. Le Mur d'une maison est privé, sauf celui de la maison au pouvoir et celui de l'ACADEMIA, que tout le monde peut lire.", larpRulesSignText: "Les habitants peuvent l'activer (dans /profile/edit > Capteurs) pour afficher l'image de leur maison actuelle comme un sceau sur leur profil, leur fiche d'auteur et d'habitant. Le sceau renvoie à la page de la maison.", larpPostsTitle: "Mur", larpPostsEmpty: "Aucune publication pour le moment.", - larpPostLabel: "Nouvelle publication", larpPostPlaceholder: "Qu'a cette maison à dire ?", - larpPostPublic: "Public (visible par tous, sinon réservé aux membres)", larpPostSubmit: "Publier", - larpPostMembersOnly: "Membres seulement", larpCycleLabel: "Cycle :", bankRulesArchTaxFormula: "ARCH Tax(user) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory", bankRulesArchTaxNote: "ARCH Tax reflects the long-term cost of growing and maintaining the network archive: the older your data lives in the network, the larger your share of the maintenance cost.", @@ -4032,12 +3431,9 @@ module.exports = { bankTaxesLookupNote: "Entre un ID de bloc pour le rechercher dans ton flux local.", bankTaxesUserNoteChipsClick: "Clique sur n'importe quel chip pour inspecter son bloc dans le blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Code d'invitation", larpRulesInviteEntryText: "Les membres des maisons peuvent générer des codes d'invitation qui donnent un accès direct à la maison.", larpRulesOneHouseText: "Tu ne peux appartenir qu'à une seule maison à la fois. Si tu n'appartiens à aucune, tu es dans ACADEMIA. Chaque page de maison (sauf ACADEMIA) affiche un bouton « Quitter la Maison » à ses membres qui remet l'appartenance à ACADEMIA. Quitter n'annule PAS le délai du test.", - larpRulesOneHouseTitle: "Une maison à la fois", - larpRulesTestEntry: "Test WILL", - larpRulesTestEntryText: "Chaque option pondère une ou plusieurs maisons ; lors de l'envoi, le système additionne les scores et t'admet automatiquement dans la maison ayant le score le plus élevé.", + larpRulesTestEntryText: "Dans le test WILL, chaque option pondère une ou plusieurs maisons ; à l'envoi, le système additionne les scores et vous admet automatiquement dans la maison la mieux notée.", larpWillTestHint: "Une fois terminé, on t'assignera la maison qui correspond le mieux à tes réponses. Tes réponses individuelles sont traitées localement et ne sont jamais stockées — seule l'attribution de maison résultante est publiée dans ton flux.", larpWillTestTitle: "Test WILL", settingsLanDesc: "Annoncer périodiquement ce pair aux autres instances d'Oasis sur le même réseau local. Désactiver pour arrêter les diffusions UDP.", @@ -4056,36 +3452,30 @@ module.exports = { aiExchangeMarkHelpful: "+1 utile", larpCyclesUntilRuling: "Prochain cycle de gouvernance", larpVisitTribe: "Visiter la tribu", - larpGoverning: "Règne :", + larpStartJourney: "Commencer le voyage", + larpGoverning: "Gouverne :", + larpStartHere: "Commencez ici :", larpMyHouse: "Ma Maison :", larpMembersCount: "Membres", - larpMembersTitle: "Membres", - larpNoMembers: "Aucun membre pour le moment.", larpRolesLabel: "Rôles", larpFunctionLabel: "Fonction", larpMonthLabel: "Cycle de gouvernance", larpLeaveToAcademia: "Retour à ACADEMIA", - larpAcademiaJoinTitle: "Rejoindre une maison", - larpAcademiaJoinHint: "Passe le test psychologique de profil pour être affecté à la maison qui te correspond le mieux, ou utilise un code d'invitation partagé par un membre d'une maison.", - larpTakeTestButton: "Passer le test de profil", + larpAcademiaJoinTitle: "Maisons L.A.R.P.", larpInviteRedeem: "Rejoindre la Maison", larpInviteCreate: "Générer un code d'invitation", larpInvitePlaceholder: "Code d'invitation", larpInviteBannerTitle: "Nouveau code d'invitation", larpInviteBannerHint: "Partage ce code avec une personne en ACADEMIA. Il expire dans 30 cycles ou après une utilisation.", - larpTestAssignedHouse: "Maison attribuée", larpTestRankingTitle: "Score par maison", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Code d'invitation de maison", invitesHouseJoinButton: "Rejoindre la Maison", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Impôts", bankOverviewYourTaxes: "Tes impôts", - bankTaxesNetworkTitle: "Impôts du réseau", bankTaxesEcoTaxTitle: "ECO Tax", bankTaxesArchTaxTitle: "ARCH Tax", - bankTaxesUserTitle: "Tes impôts", bankTaxesUserAmount: "Ton ECO Tax (prix à rendre)", bankTaxesArchTaxUserAmount: "Ton ARCH Tax (prix à rendre)", bankTaxesArchTaxFirstBlock: "Âge de ton premier bloc", @@ -4136,16 +3526,13 @@ module.exports = { bankRulesEcoTaxRate: "Taux", bankRulesArchTaxRate: "Taux", bankRulesCarbonFactor: "Facteur carbone", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "Aucun tombstone dans le réseau pour le moment.", blockchainBlockNotAvailable: "Ce bloc n'est pas disponible dans ton feed local. Il appartient peut-être à un peer dont tu ne réplique pas encore les données.", blockchainBackToBlockexplorer: "Retour au blockexplorer", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", - audioTranscodeTitle: "BCS Transcode", audioTranscodeDetailTitle: "Transcode", audioTranscodeDetailDescription: "Décode la charge utile incrustée et la carte de composition d'origine de la blockchain.", - audioTranscodeStegoTitle: "Incrusté dans la forme d'onde", audioTranscodeStegoOasisId: "Par", audioTranscodeStegoTimestamp: "Généré le", audioTranscodeStegoMessage: "TEXT", @@ -4153,9 +3540,7 @@ module.exports = { audioTranscodeStegoUnknown: "—", audioTranscodeStegoNotFound: "Aucune charge stéganographique n'a pu être décodée depuis cet audio.", audioTranscodeCompositionEmpty: "Cet audio ne contient pas de composition blockchain enregistrée.", - audioBackToAudio: "Retour à l'audio", audioBackToBcs: "Retour à BCS", - audioAuthorLabel: "Auteur", melodyCompositionTitle: "Carte de composition blockchain", melodyFilterMine: "MIEN", melodyByLabel: "Par", @@ -4169,7 +3554,6 @@ module.exports = { melodyUploadBcsNameNote: "L'audio sera publié sous le nom auto-généré", larpLastAttemptTitle: "Ta dernière tentative", larpLastAttemptHouse: "Maison", - larpLastAttemptResult: "Résultat", larpLastAttemptWhen: "Quand", larpLastAttemptCooldown: "Prochaine tentative dans", larpTestTitle: "Test d'entrée", @@ -4178,29 +3562,14 @@ module.exports = { larpTestCooldownActive: "Prochain test disponible dans", larpTestCooldownDays: "cycles", larpTestResultTitle: "Résultat du test", - larpTestPassed: "Test réussi — bienvenue !", - larpTestFailed: "Test non réussi", larpTestScore: "Score", larpTestNextAttempt: "Tu pourras tenter un autre test dans 30 cycles.", larpGoToHouse: "Aller à ta maison", larpBackToAcademia: "Retour à ACADEMIA", - larpBackToHouses: "◀ Maisons", larpBadgeYou: "Toi", larpBadgeRuling: "Règne", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Module pour la couche de jeu de rôle grandeur nature d'Oasis (les 9 Maisons).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Face à un problème complexe, que fais-tu en premier ?", larpProfileQ1O1: "Parler aux autres pour trouver un consensus", larpProfileQ1O2: "Construire un prototype à tester", diff --git a/src/client/assets/translations/oasis_hi.js b/src/client/assets/translations/oasis_hi.js index 2fff7c2..062769c 100644 --- a/src/client/assets/translations/oasis_hi.js +++ b/src/client/assets/translations/oasis_hi.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { hi: { - languageName: "हिन्दी", shopOrderStatusPaid: "भुगतान प्राप्त", shopOrderStatusReceived: "प्राप्त", shopOrderMarkPaid: "भुगतान प्राप्त चिह्नित करें", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "आपके पास अभी कोई खरीद नहीं है।", shopOrderPmSeller: "PM Seller", shopOrderSeller: "विक्रेता", - shopOrderPaymentConcept: "भुगतान", shopOrderInvoice: "चालान", shopOrderInvoiceConcept: "चालान", shopOrderStatusPending: "लंबित", shopOrderStatusAccepted: "स्वीकृत", shopOrderStatusRejected: "अस्वीकृत", shopOrderStatusShipped: "भेजा गया", - shopOrderStatusDelivered: "वितरित", shopOrderAccept: "स्वीकार करें", shopOrderReject: "अस्वीकार करें", shopOrderMarkShipped: "भेजा गया चिह्नित करें", - shopOrderMarkDelivered: "वितरित चिह्नित करें", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "स्मार्ट अनुबंध", shopOrderContractConcept: "दुकान ऑर्डर", shopOrdersPending: "लंबित ऑर्डर", all: "सभी", @@ -55,14 +50,13 @@ module.exports = { viewJson: "JSON देखें", matchScore: "मिलान स्कोर", preferencesLabel: "प्राथमिकताएं", - inhabitantProfileTitle: "निवासी प्रोफ़ाइल", + inhabitantProfileTitle: "निवासी", contentWarningLabel: "सामग्री चेतावनी", invalidPost: "अमान्य सामग्री", invalidPostHint: "इस संदेश में अमान्य/खाली पाठ है।", spreadBy: "द्वारा", spreadChron: "प्रसार", spreaded: "प्रसारित", - spreadMore: "और", spreadContentUnavailable: "सामग्री अभी उपलब्ध नहीं (प्रतिकृति लंबित)", filteredByTag: "टैग द्वारा फ़िल्टर", filteredByTagTitle: "टैग द्वारा फ़िल्टर", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "कोई गंभीरता नहीं", calendarDeleteDate: "तारीख हटाएं", calendarIntervalUntil: "तक", - bookmarkCategory: "श्रेणी", bookmarkLastVisit: "अंतिम विज़िट", profileClearnetBookmarksLabel: "बुकमार्क", - forumFilterHot: "लोकप्रिय", invitesPort: "पोर्ट", currentlyUnrecheable: "त्रुटि!", peerHostValidation: "मान्य IPv4 (जैसे 192.168.1.100) या होस्टनाम (जैसे pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "वार्षिक अधिकतम अनुमान", statsCarbonNetwork: "नेटवर्क कुल", statsCarbonOfEstMax: "अनुमानित अधिकतम क्षमता का", + statsCarbonYearProgress: "वर्ष बीत चुका", + statsNetworkTitle: "नेटवर्क", + statsStorageTitle: "भंडारण", + statsEcoTaxTitle: "ECO कर", + statsAccountTitle: "खाता", + statsAveragesTitle: "औसत", statsCarbonOfNetwork: "नेटवर्क कुल का", statsCarbonUser: "आपका फुटप्रिंट", statsContentCountColumn: "गिनती", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "शीर्ष टैग", statsTopTypesTitle: "शीर्ष सामग्री प्रकार", statsTotalMsgs: "कुल संदेश", - feedViewDetails: "विवरण देखें", - eventFileLabel: "छवि संलग्न करें", - taskFileLabel: "छवि संलग्न करें", - courtsRespondentRequired: "प्रतिवादी आईडी आवश्यक है", extended: "मल्टीवर्स", extendedDescription: [ "जब आप किसी का समर्थन करते हैं तो आप उनके द्वारा समर्थित निवासियों की पोस्ट डाउनलोड कर सकते हैं, और वे पोस्ट यहाँ नवीनता के अनुसार क्रमबद्ध दिखाई देती हैं।", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "दिखा रहे", graphosYou: "आप", graphosTotalNodes: "कुल नोड्स", - manualMode: "मैनुअल मोड", mentions: "उल्लेख", mentionsDescription: [ - strong("वे पोस्ट जो आपको @उल्लेख करती हैं"), - ", नवीनता के अनुसार क्रमबद्ध।", + strong("हर संदेश जो आपको @उल्लेख करता है"), + ".", ], - nextPage: "अगला", - previousPage: "पिछला", noMentions: "आपको अभी तक कोई @उल्लेख नहीं मिला है।", + mentionsSearchPlaceholder: "उल्लेख खोजें...", privateReminders: "रिमाइंडर", inboxFiltersLabel: "फ़िल्टर:", inboxToggleToMutuals: "पारस्परिक पर स्विच करें", inboxToggleToWhole: "सभी पर स्विच करें", - privateFrom: "से", - privateTo: "को", privateDate: "दिनांक", pmReply: "उत्तर दें", pmReplies: "उत्तर", - pmNew: "नया", - pmMarkRead: "पढ़ा हुआ चिह्नित करें", inReplyTo: "के उत्तर में", pmPreview: "पूर्वावलोकन", pmPreviewTitle: "संदेश पूर्वावलोकन", peers: "पीयर", searchDescription: "विवरण", - imageSearch: "छवि खोज", searchFromLabel: "से", searchToLabel: "तक", - searchMinOpinionsLabel: "न्यून. राय", - searchInhabitantLabel: "निवासी (Oasis ID)", searchQueryLabel: "क्वेरी", searchPerPageLabel: "प्रति पृष्ठ परिणाम", settings: "सेटिंग्स", @@ -245,68 +230,39 @@ module.exports = { melodyDescription: 'अपनी ब्लॉकचेन की धुन बजाएँ — हर ब्लॉक एक स्वर बन जाता है।', melodyEmpty: 'अभी कोई स्वर नहीं — आपकी ब्लॉकचेन ने अभी कोई ब्लॉक नहीं बनाया है।', melodyCompositionTitle: 'रचना', - melodyCompositionHelp: 'आपकी ब्लॉकचेन का हर ब्लॉक उसके प्रकार और आकार के अनुसार एक संगीत स्वर बन जाता है।', - melodyStatsTitle: 'प्रकार विश्लेषण', - melodyInhabitantLabel: 'निवासी', melodyTotalBlocks: 'स्वर', - melodyType: 'प्रकार', - melodyCount: 'ब्लॉक', melodyFilterMine: 'मेरी', melodyFilterAll: 'सभी', - melodyFilterShare: 'धुन अपलोड करें', - melodyShareTitle: 'अपनी धुन साझा करें', - melodyShareHelp: 'अपनी मौजूदा धुन का स्नैपशॉट प्रकाशित करें ताकि अन्य सुन और रीमिक्स कर सकें।', - melodyShareTitleLabel: 'शीर्षक (वैकल्पिक)', - melodyShareTitlePlaceholder: 'एक ब्लॉकचेन भूत', - melodyShareSubmit: 'धुन प्रकाशित करें', - melodyNoShared: 'अभी तक कोई ब्लॉकचेन धुन नहीं।', melodyRegenerate: 'पुनः उत्पन्न करें', melodyDownload: "BCS डाउनलोड करें", - profileActivityTitle: 'गतिविधि', - profileActivityMore: 'सारी गतिविधि देखें', profileContentSectionTitle: 'अवतार सामग्री', profileContentHelp: 'चुनें कि आपके अवतार पर कौन से मॉड्यूल दिखाए जाएँगे।', profileSensorsHelp: 'आपके अवतार पर दिखाई जाने वाली वैकल्पिक मेट्रिक्स।', profileClearnetHelp: 'Oasis के बाहर से एक्सेस किए जा सकने वाले मॉड्यूल।', profileHubAll: 'सभी', - profileHubTitle: 'सार्वजनिक सामग्री', - footerPulseTitle: 'पल्स', - footerPulsePeers: 'पीयर', - footerPulseInbox: 'इनबॉक्स', - footerPulseSync: 'अंतिम सिंक', - footerPulseEcoValue: 'ECO/घंटा', - footerPulseLastActivity: 'अंतिम गतिविधि', footerLicenseLabel: 'लाइसेंस', profileSwitchToOasis: 'Oasis पर वापस जाएँ', - profileSwitchToClearnet: 'Clearnet में गोता लगाएँ', - profileVisibilityFediverse: "फ़ेडिवर्स", - profileSwitchToFediverse: "फ़ेडिवर्स में गोता लगाएँ", - coordLabel: 'निर्देशांक (जैसे, A3)', - coordPlaceholder: 'निर्देशांक दर्ज करें', + profileVisibilityFediverse: "मल्टीवर्स", contributorsTitle: "योगदानकर्ता", - pixeliaBy: "द्वारा", colorLabel: 'रंग चुनें', paintButton: 'रंग भरें!', - invalidCoordinate: 'गलत निर्देशांक', - goToMuralButton: "भित्तिचित्र देखें", totalPixels: 'कुल पिक्सेल', modules: "मॉड्यूल", modulesViewTitle: "मॉड्यूल", modulesViewDescription: "मॉड्यूल सक्षम या अक्षम करके अपना वातावरण सेट करें।", inbox: "इनबॉक्स", multiverse: "मल्टीवर्स", - fediverse: "फ़ेडिवर्स", - fediverseDescription: "अपने अन्य फ़ेडिवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।", + fediverse: "मल्टीवर्स", + fediverseDescription: "अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।", fediverseStatus: "स्थिति", - fediverseDisconnected: "फ़ेडिवर्स डिस्कनेक्ट है। %LINK% या कनेक्शन स्थिति जाँचें।", - fediverseSettingsTitle: "फ़ेडिवर्स", + fediverseDisconnected: "मल्टीवर्स डिस्कनेक्ट है। %LINK% या कनेक्शन स्थिति जाँचें।", + fediverseSettingsTitle: "मल्टीवर्स", fediverseInstanceLabel: "पता", fediverseTokenLabel: "एक्सेस टोकन", fediverseTokenHelp: "अपना एक्सेस टोकन सेट करें। इसका उपयोग Oasis के भीतर से आपके Mastodon खाते को प्रबंधित करने के लिए किया जाएगा।", fediverseConnect: "कनेक्ट करें", fediverseConnectedAs: "इस रूप में कनेक्टेड", fediverseDisconnect: "डिस्कनेक्ट करें", - fediverseEmpty: "जब आप अपनी %LINK% से अन्य फ़ेडिवर्स खाते कनेक्ट करेंगे, तो आप उन्हें यहाँ से प्रबंधित कर सकते हैं।", fediverseEmptyLink: "सेटिंग्स", fediverseComposePlaceholder: "आप क्या सोच रहे हैं?", fediverseReplyPlaceholder: "अपना जवाब लिखें…", @@ -315,21 +271,15 @@ module.exports = { fediverseReply: "जवाब दें", fediverseBoosted: "ने बूस्ट किया", fediverseNoPosts: "आपकी टाइमलाइन खाली है।", - fediverseThread: "थ्रेड", fediverseTimeline: "टाइमलाइन्स", - fediverseManageTimeline: "टाइमलाइन प्रबंधित करें", fediverseFollowers: "फ़ॉलोअर्स", fediverseFollowing: "फ़ॉलोइंग", fediversePosts: "पोस्ट", fediverseJoined: "शामिल हुए", - fediverseOverview: "अवलोकन", fediverseRefresh: "रिफ़्रेश", fediverseWrite: "लिखें", fediversePreview: "पूर्वावलोकन", - fediverseEdit: "संपादित करें", - fediverseOpenFeed: "फ़ीड देखें", fediverseManage: "प्रबंधित करें", - fediverseStatusNotConnected: "कनेक्ट नहीं है", fediverseError: "Mastodon से संपर्क नहीं हो सका।", fediverseErrInstance: "अमान्य इंस्टेंस URL।", fediverseErrAuth: "अमान्य या समाप्त टोकन।", @@ -340,17 +290,6 @@ module.exports = { fediverseErrPost: "प्रकाशित नहीं हो सका।", fediverseErrMedia: "फ़ाइल अपलोड नहीं हो सकी।", fediverseErrEmpty: "कुछ लिखें या फ़ाइल जोड़ें।", - popularLabel: "हाइलाइट्स", - topicsLabel: "विषय", - latestLabel: "नवीनतम", - summariesLabel: "सारांश", - threadsLabel: "थ्रेड्स", - multiverseLabel: "मल्टीवर्स", - inboxLabel: "इनबॉक्स", - invitesLabel: "आमंत्रण", - walletLabel: "वॉलेट", - legacyLabel: "कुंजियाँ", - cipherLabel: "क्रिप्टर", bookmarksLabel: "बुकमार्क", videosLabel: "वीडियो", torrentsLabel: "टोरेंट", @@ -361,18 +300,14 @@ module.exports = { inhabitantsLabel: "निवासी", trendingLabel: "ट्रेंडिंग", eventsLabel: "कार्यक्रम", - tasksLabel: "कार्य", apply: "लागू करें", menuPersonal: "व्यक्तिगत", - menuContent: "सामग्री", - menuBlogs: "ब्लॉग", menuGovernance: "शासन", menuOffice: "कार्यालय", - menuMultiverse: "मल्टीवर्स", - menuNetwork: "नेटवर्क", + menuNetwork: "समुदाय", menuCreative: "रचनात्मक", menuEconomy: "अर्थव्यवस्था", - menuMedia: "मीडिया", + menuMedia: "पुस्तकालय", menuTools: "उपकरण", comment: "टिप्पणी", subtopic: "उपविषय", @@ -382,13 +317,6 @@ module.exports = { follow: "समर्थन करें", block: "ब्लॉक करें", unblock: "अनब्लॉक करें", - newerPosts: "नई पोस्ट", - olderPosts: "पुरानी पोस्ट", - feedRangeEmpty: "इस फ़ीड के लिए दी गई सीमा खाली है। देखने का प्रयास करें ", - seeFullFeed: "पूरी फ़ीड", - feedEmpty: "Oasis नेटवर्क ने इस खाते से कभी कोई पोस्ट नहीं देखी है।", - beginningOfFeed: "यह फ़ीड की शुरुआत है", - noNewerPosts: "अभी तक कोई नई पोस्ट प्राप्त नहीं हुई है।", relationshipNotFollowing: "आपका समर्थन नहीं किया गया है", relationshipTheyFollow: "आपका समर्थन करते हैं", relationshipMutuals: "पारस्परिक समर्थन", @@ -398,16 +326,12 @@ module.exports = { relationshipBlockedBy: "आप ब्लॉक हैं", relationshipMutualBlock: "पारस्परिक ब्लॉक", relationshipNone: "आप समर्थन नहीं कर रहे हैं", - relationshipConflict: "विवाद", relationshipBlockingPost: "ब्लॉक की गई पोस्ट", viewLikes: "प्रसार देखें", spreadedDescription: "निवासी द्वारा प्रसारित पोस्ट की सूची।", - totalspreads: "कुल प्रसार", - attachFiles: "फ़ाइलें संलग्न करें", preview: "पूर्वावलोकन", publish: "लिखें", contentWarningPlaceholder: "पोस्ट में विषय जोड़ें (वैकल्पिक)", - privateWarningPlaceholder: "निजी पोस्ट भेजने के लिए निवासी जोड़ें (वैकल्पिक)", publishWarningPlaceholder: "मुख्य पाठ 7000 वर्णों तक सीमित।", publishTooLong: "आपकी पोस्ट बहुत लंबी है। कृपया इसे छोटा करें।", publishCustomDescription: [ @@ -416,8 +340,6 @@ module.exports = { commentWarning: [ "याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।", ], - commentPublic: "सार्वजनिक", - commentPrivate: "निजी", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -437,7 +359,6 @@ module.exports = { "।", ], publishCustom: "उन्नत पोस्ट लिखें", - subtopicLabel: "इस पोस्ट का उपविषय बनाएँ", messagePreview: "पोस्ट पूर्वावलोकन", mentionsMatching: "मिलते-जुलते उल्लेख", mentionsName: "नाम", @@ -460,24 +381,19 @@ module.exports = { ssbLogStream: "ब्लॉकचेन", ssbLogStreamDescription: "ब्लॉकचेन स्ट्रीम के लिए संदेश सीमा कॉन्फ़िगर करें।", saveSettings: "सेटिंग्स सहेजें", - exportTitle: "डेटा निर्यात करें", exportDescription: "अपनी कुंजी एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", exportDataTitle: "बैकअप", exportDataDescription: "अपना डेटा डाउनलोड करें (गुप्त कुंजी शामिल नहीं!)", exportDataButton: "डेटाबेस डाउनलोड करें", - pubWallet: "PUB वॉलेट", - pubWalletDescription: "PUB वॉलेट URL सेट करें। इसका उपयोग PUB लेनदेन (UBI सहित) के लिए किया जाएगा।", - pubWalletConfiguration: "कॉन्फ़िगरेशन सहेजें", - importTitle: "डेटा आयात करें", importDescription: "अपना अवतार सक्रिय करने के लिए अपनी एन्क्रिप्टेड गुप्त कुंजी (निजी कुंजी) आयात करें", - importAttach: "एन्क्रिप्टेड फ़ाइल संलग्न करें (.enc)", - passwordLengthInfo: "पासवर्ड कम से कम 32 अक्षर लंबा होना चाहिए।", passwordImport: "डेटा को डिक्रिप्ट करने के लिए अपना पासवर्ड लिखें जो आपके सिस्टम होम पर सहेजा जाएगा (नाम: secret)", exportPasswordPlaceholder: "लोअरकेस, अपरकेस, संख्याएँ और प्रतीक उपयोग करें", fileInfo: "आपकी एन्क्रिप्टेड गुप्त कुंजी आपके डिवाइस पर डाउनलोड की जाएगी (नाम: oasis.enc)", developer: "विकास", devTitle: "विकास", welcomeBannerText: "OASIS में स्वागत है। अपना अवतार सेट करने के लिए इन आसान चरणों का पालन करें।", + aiSuggestionBanner: "सुझाव:", + aiSuggestionsEnable: "AI सुझाव", welcomeBannerAction: "शुरू करें!", welcomeTitle: "स्वागत है", welcomeStepGreetingAction: "भेजें", @@ -520,14 +436,9 @@ module.exports = { devParentFolder: "मूल फ़ोल्डर", devOpenFolder: "खोलें", devDescription: "इस नोड पर चल रहे स्रोत कोड का अन्वेषण करें।", - devTreeTitle: "फ़ाइलें", - devSearchTitle: "कोड में खोजें", - devMapTitle: "मॉड्यूल", devRoot: "मूल", - devRootButton: "मूल", devSearchPlaceholder: "कोड में खोजने के लिए पाठ", devAnyExtension: "कोई भी फ़ाइल", - devSearchButton: "खोजें", devStatsFiles: "फ़ाइलें", devStatsLines: "पंक्तियाँ", devStatsModules: "मॉड्यूल", @@ -564,16 +475,13 @@ module.exports = { languageDescription: "यदि आप दूसरी भाषा उपयोग करना चाहते हैं, तो यहाँ चुनें।", setLanguage: "भाषा सेट करें", - peerConnections: "पीयर", peerConnectionsIntro: "अन्य पीयर के साथ अपने सभी कनेक्शन प्रबंधित करें।", peerConnectionsTitle: "कनेक्शन", online: "ऑनलाइन", offline: "ऑफ़लाइन", discovered: 'खोजे गए', unknown: 'अज्ञात', - lanBroadcastLabel: "LAN प्रसारण", lanBroadcastActive: "सक्रिय (LAN पर UDP मल्टीकास्ट)", - lanBroadcastDisabled: "अक्षम (pub मोड)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -586,8 +494,6 @@ module.exports = { noConnections: "कोई पीयर कनेक्ट नहीं है।", noDiscovered: "कोई पीयर नहीं मिला।", noUnknownPeers: "मित्र-ग्राफ में कोई अज्ञात पीयर नहीं।", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -597,9 +503,6 @@ module.exports = { peerImport: "आयात", peerImportTitle: "पीयर सूची आयात करें", peerImportPlaceholder: "प्रति पंक्ति एक multiserver पता पेस्ट करें, या एक .txt फ़ाइल अपलोड करें…", - noSupportedConnections: "कोई समर्थित पीयर नहीं।", - noBlockedConnections: "कोई ब्लॉक किया गया पीयर नहीं।", - noRecommendedConnections: "कोई अनुशंसित पीयर नहीं।", connectionActionIntro: "", startNetworking: "नेटवर्किंग शुरू करें", @@ -613,9 +516,19 @@ module.exports = { homePageDescription: "चुनें कि कौन सा मॉड्यूल आपका होम पेज हो।", saveHomePage: "होम सेट करें", invites: "आमंत्रण", - invitesTitle: "आमंत्रण", - invitesInvites: "आमंत्रण", invitesDescription: "अपने नेटवर्क में आमंत्रण कोड प्रबंधित करें और लागू करें।", + invitesPubsHint: "किसी पब का आमंत्रण कोड चिपकाएँ ताकि उससे संघ बने और उसके निवासियों की प्रतिकृति शुरू हो।", + invitesFederationsHint: "जिन पब से आप जुड़े हैं: उन्हें ताज़ा करें, अनुपलब्ध हटाएँ या सूची निर्यात करें।", + invitesHousesHint: "LARP के किसी घर में शामिल होने और उसकी अर्थव्यवस्था में भाग लेने के लिए घर का कोड डालें।", + invitesTribesHint: "सदस्य बनने और निजी सामग्री तक पहुँचने के लिए ट्राइब का कोड डालें।", + invitesChatsHint: "बातचीत और उसके थ्रेड में शामिल होने के लिए चैट का कोड डालें।", + invitesPadsHint: "साझा दस्तावेज़ पर साथ लिखने के लिए पैड का कोड डालें।", + invitesCalendarsHint: "तारीख़ें और अनुस्मारक साझा करने के लिए कैलेंडर का कोड डालें।", + invitesEventsHint: "निजी आयोजन में शामिल होने के लिए इवेंट का कोड डालें।", + invitesForumsHint: "निजी फ़ोरम में पढ़ने और उत्तर देने के लिए फ़ोरम का कोड डालें।", + invitesMapsHint: "साझा नक़्शे पर जगहें देखने और जोड़ने के लिए मानचित्र का कोड डालें।", + invitesShopsHint: "किसी दुकान और उसके कैटलॉग में शामिल होने के लिए दुकान का कोड डालें।", + invitesInhabitantsHint: "एक-दूसरे को फ़ॉलो करने और सामग्री साझा करने के लिए निवासी का कोड डालें।", invitesTribesTitle: "जनजातियाँ", invitesTribeInviteCodePlaceholder: "जनजाति आमंत्रण कोड दर्ज करें", invitesTribeJoinButton: "जनजाति में शामिल हों", @@ -646,7 +559,6 @@ module.exports = { invitesAlreadyFederated: "आप पहले से ही इस पब के साथ फेडरेटेड हैं।", invitesFederationsTitle: "संघ", invitesAcceptedInvites: "संघीय", - invitesNoInvites: "अभी तक कोई आमंत्रण स्वीकार नहीं किया गया।", invitesUnfollow: "अनफ़ॉलो करें", invitesFollow: "फ़ॉलो करें", invitesUnfollowedInvites: "असंघीय", @@ -666,39 +578,24 @@ module.exports = { panicMode: "आपातकालीन मोड!", encryptData: "अपनी ब्लॉकचेन एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", decryptData: "अपनी ब्लॉकचेन डिक्रिप्ट करने के लिए पासवर्ड दर्ज करें", - panicModeDescription: "अपनी ब्लॉकचेन एन्क्रिप्ट/डिक्रिप्ट या हटाएँ", removeDataDescription: "चेतावनी: यह प्रक्रिया पूर्ववत नहीं की जा सकती।", - encryptPanicButton: "ब्लॉकचेन एन्क्रिप्ट करें", - decryptPanicButton: "ब्लॉकचेन डिक्रिप्ट करें", removePanicButton: "अपना सारा डेटा हटाएँ!", searchTitle: "खोज", searchDescriptionLabel: "अपने नेटवर्क में सामग्री खोजें।", - searchLanguagesLabel: "भाषाएँ", - searchSkillsLabel: "कौशल", searchPlaceholder:"सामग्री खोजें...", - searchDateLabel:"दिनांक", searchLocationLabel:"स्थान", searchPriceLabel:"मूल्य", - searchUrlLabel:"URL", searchCategoryLabel:"श्रेणी", - searchStartLabel:"प्रारंभ समय", - searchEndLabel:"समाप्ति समय", searchPriorityLabel:"प्राथमिकता", searchStatusLabel:"स्थिति", statusLabel:"स्थिति", - totalVotesLabel:"कुल मत", noResultsFound:"कोई परिणाम नहीं मिला।", votesOption:"मत विकल्प", voteYesLabel:"हाँ", voteNoLabel:"नहीं", allTypesLabel: "असीमित", - ABSTENTIONLabel:"तटस्थता", YESLabel:"हाँ", NOLabel:"नहीं", - FOLLOW_MAJORITYLabel: "बहुमत का पालन करें", - CONFUSEDLabel: "भ्रमित", - NOT_INTERESTEDLabel: "रुचि नहीं", - StatusLabel:"स्थिति", votesOptionYesLabel:"हाँ", votesOptionNoLabel:"नहीं", votesOptionAbstentionLabel:"तटस्थता", @@ -706,7 +603,6 @@ module.exports = { votesCreatedByLabel:"द्वारा बनाया गया", voteStatusOpen:"खुला", voteStatusClosed:"बंद", - imageSearchLabel: "छवियों को खोजने के लिए शब्द दर्ज करें।", commentDescription: ({ parentUrl }) => [ " ने टिप्पणी की ", a({ href: parentUrl }, " थ्रेड पर"), @@ -717,53 +613,20 @@ module.exports = { a({ href: parentUrl }, " एक पोस्ट से"), ], subtopicTitle: ({ authorName }) => [`@${authorName} की पोस्ट पर उपविषय`], - mysteryDescription: "एक रहस्यमय पोस्ट प्रकाशित की", oasisDescription: "OASIS परियोजना नेटवर्क", searchSubmit: "खोजें...", - postLabel: "पोस्ट", - aboutLabel: "निवासी", - feedLabel: "फ़ीड", votesLabel: "मतदान", - reportLabel: "रिपोर्ट", - imageLabel: "छवियाँ", - videoLabel: "वीडियो", - audioLabel: "ऑडियो", - documentLabel: "दस्तावेज़", - torrentLabel: "टॉरेंट", pdfFallbackLabel: "PDF दस्तावेज़", - eventLabel: "कार्यक्रम", - taskLabel: "कार्य", - transferLabel: "स्थानांतरण", - curriculumLabel: "पाठ्यक्रम", - bookmarkLabel: "बुकमार्क", - tribeLabel: "जनजातियाँ", - marketLabel: "बाज़ार", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "वॉलेट", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "जमा करें", - subjectLabel: "विषय", editProfile: "अवतार संपादित करें", - profileQrAlt: "प्रोफ़ाइल QR कोड", - profileQrHint: "इस Oasis ID को कॉपी करने के लिए स्कैन करें।", oasisIdLabel: "OasisID", - spreadLabel: "फैलाएँ", - spreadHint: "अपने समर्थकों को फैलाएँ (फ़ीड से प्रतिकृति)।", + spreadContent: "प्रतिकृति बनाएँ", welcomePmSubject: "Hello World!", - welcomePmBody: "Oasis में आपका स्वागत है — एक स्वतंत्र, पीयर-टू-पीयर, फ़ेडरेटेड और एन्क्रिप्टेड सोशल नेटवर्क, जिसकी वास्तुकला वितरित और केवल-आमंत्रण आधारित है।\n\nशुरुआत के लिए कुछ रोचक स्थान:\n\n- /profile — अपना अवतार, नाम, विवरण और कौन से मॉड्यूल आपके सार्वजनिक पक्ष पर दिखेंगे, संपादित करें।\n- /invites — व्यापक नेटवर्क के साथ फेडरेट करने के लिए एक pub जोड़ें।\n- /peers — देखें कौन जुड़ा है, अपनी LAN फिर से स्कैन करें, पीयर सूचियाँ निर्यात या आयात करें।\n- /inhabitants — दूसरों के अवतार खोजें और देखें।\n- /tribes — एंड-टू-एंड एन्क्रिप्शन वाले निजी समूह बनाएँ या उनमें शामिल हों।\n- /inbox — निजी संदेश पढ़ें और भेजें।\n- /activity — हाल की गतिविधि देखें — आपकी और आपके नेटवर्क की।\n- /publish — पोस्ट लिखें, या चित्र, ऑडियो, वीडियो, दस्तावेज़ साझा करें।\n- /search — नेटवर्क की सामग्री को प्रकार के अनुसार खोजें।\n\nकनेक्ट करने के लिए कुछ दिलचस्प जगहें:\n\n- /fediverse — अपने अन्य फ़ेडिवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।\n\nयह संदेश आपके द्वारा निजी रूप से स्वयं को भेजा गया था, इसलिए इसे प्राप्त करने के लिए किसी कनेक्शन की आवश्यकता नहीं थी।", - profileVisibilityTitle: "सार्वजनिक प्रोफ़ाइल दृश्यता", - profileVisibilityHint: "तय करें कि आपकी प्रोफ़ाइल में अन्य निवासी कौन से क्षेत्र देखें। डिफ़ॉल्ट रूप से केवल Karma दिखाया जाता है।", + welcomePmBody: "Oasis में आपका स्वागत है — एक स्वतंत्र, पीयर-टू-पीयर, फ़ेडरेटेड और एन्क्रिप्टेड सोशल नेटवर्क, जिसकी वास्तुकला वितरित और केवल-आमंत्रण आधारित है।\n\nशुरुआत के लिए कुछ रोचक स्थान:\n\n- /profile — अपना अवतार, नाम, विवरण और कौन से मॉड्यूल आपके सार्वजनिक पक्ष पर दिखेंगे, संपादित करें।\n- /invites — व्यापक नेटवर्क के साथ फेडरेट करने के लिए एक pub जोड़ें।\n- /peers — देखें कौन जुड़ा है, अपनी LAN फिर से स्कैन करें, पीयर सूचियाँ निर्यात या आयात करें।\n- /inhabitants — दूसरों के अवतार खोजें और देखें।\n- /tribes — एंड-टू-एंड एन्क्रिप्शन वाले निजी समूह बनाएँ या उनमें शामिल हों।\n- /inbox — निजी संदेश पढ़ें और भेजें।\n- /activity — हाल की गतिविधि देखें — आपकी और आपके नेटवर्क की।\n- /publish — पोस्ट लिखें, या चित्र, ऑडियो, वीडियो, दस्तावेज़ साझा करें।\n- /search — नेटवर्क की सामग्री को प्रकार के अनुसार खोजें।\n\nकनेक्ट करने के लिए कुछ दिलचस्प जगहें:\n\n- /multiverse — अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।\n\nयह संदेश आपके द्वारा निजी रूप से स्वयं को भेजा गया था, इसलिए इसे प्राप्त करने के लिए किसी कनेक्शन की आवश्यकता नहीं थी।", profileSensorsSectionTitle: "सेंसर", profileVisibilityActivity: "गतिविधि स्तर", - profileVisibilityDevice: "डिवाइस", profileDeviceLockedHint: "यह सेंसर हमेशा चालू रहता है: यह दूसरों को दिखाता है कि आप किस डिवाइस से कनेक्ट होते हैं और इसे अक्षम नहीं किया जा सकता।", profileVisibilityKarma: "KARMA स्कोर", profileVisibilityUbi: "UBI", @@ -771,7 +634,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "GPG कुंजी", - profileVisibilityClearnet: "मेरी प्रोफ़ाइल प्रकाशित करें", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "दुकानें", profileClearnetJobsLabel: "नौकरियाँ", @@ -825,7 +687,6 @@ module.exports = { " या कनेक्शन स्थिति।", ], walletSentToLine: ({ destination, amount }) => `ECO ${amount} भेजा गया ${destination} को`, - walletSettingsTitle: "वॉलेट", walletSettingsDescription: "Oasis को अपने ECOin वॉलेट के साथ एकीकृत करें।", walletSettingsDocLink: "ECOin स्थापना मार्गदर्शिका", walletStatusMessages: { @@ -847,37 +708,19 @@ module.exports = { cipherTitle: "क्रिप्टर", cipherDescription: "अपने टेक्स्ट को सममित रूप से एन्क्रिप्ट और डिक्रिप्ट करें (साझा पासवर्ड का उपयोग करके)।", randomPassword: "यादृच्छिक पासवर्ड", - cipherEncryptTitle: "टेक्स्ट एन्क्रिप्ट करें", - cipherEncryptDescription: "एन्क्रिप्ट करने के लिए टेक्स्ट दर्ज करें", - cipherTextLabel: "एन्क्रिप्ट करने के लिए टेक्स्ट", cipherTextPlaceholder: "एन्क्रिप्ट करने के लिए टेक्स्ट दर्ज करें...", cipherPasswordLabel: "अपना टेक्स्ट एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", cipherPasswordDecryptLabel: "अपना टेक्स्ट डिक्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", cipherPasswordPlaceholder: "पासवर्ड दर्ज करें...", cipherEncryptButton: "एन्क्रिप्ट करें", - cipherDecryptTitle: "टेक्स्ट डिक्रिप्ट करें", - cipherDecryptDescription: "डिक्रिप्ट करने के लिए टेक्स्ट दर्ज करें", cipherEncryptedMessageLabel: "एन्क्रिप्टेड टेक्स्ट", cipherDecryptedMessageLabel: "डिक्रिप्टेड टेक्स्ट", - cipherPasswordUsedLabel: "एन्क्रिप्ट करने के लिए उपयोग किया गया पासवर्ड (इसे रखें!)", cipherEncryptedTextPlaceholder: "एन्क्रिप्टेड टेक्स्ट दर्ज करें...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "इनिशियलाइज़ेशन वेक्टर दर्ज करें...", cipherDecryptButton: "डिक्रिप्ट करें", password: "पासवर्ड", text: "टेक्स्ट", encryptedText: "एन्क्रिप्टेड टेक्स्ट", iv: "इनिशियलाइज़ेशन वेक्टर (IV)", - encryptTitle: "अपना टेक्स्ट एन्क्रिप्ट करें", - encryptDescription: "वह टेक्स्ट दर्ज करें जिसे आप एन्क्रिप्ट करना चाहते हैं और पासवर्ड प्रदान करें।", - encryptButton: "एन्क्रिप्ट करें", - decryptTitle: "अपना टेक्स्ट डिक्रिप्ट करें", - decryptDescription: "एन्क्रिप्टेड टेक्स्ट दर्ज करें और एन्क्रिप्शन के लिए उपयोग किया गया वही पासवर्ड प्रदान करें।", - decryptButton: "डिक्रिप्ट करें", - passwordLengthError: "पासवर्ड कम से कम 32 अक्षर लंबा होना चाहिए।", - missingFieldsError: "टेक्स्ट, पासवर्ड या IV प्रदान नहीं किया गया।", - encryptionError: "टेक्स्ट एन्क्रिप्ट करने में त्रुटि।", - decryptionError: "टेक्स्ट डिक्रिप्ट करने में त्रुटि।", bookmarkTitle: "बुकमार्क", bookmarkDescription: "अपने नेटवर्क में बुकमार्क खोजें और प्रबंधित करें।", bookmarkAllSectionTitle: "बुकमार्क", @@ -903,8 +746,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "वैकल्पिक", bookmarkTagsLabel: "टैग", bookmarkTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", - bookmarkCategoryLabel: "श्रेणी", - bookmarkCategoryPlaceholder: "वैकल्पिक", bookmarkLastVisitLabel: "अंतिम विज़िट", bookmarkSearchPlaceholder: "URL, टैग, श्रेणी, लेखक खोजें...", bookmarkSortRecent: "सबसे हाल का", @@ -919,8 +760,6 @@ module.exports = { noLastVisit: "कोई अंतिम विज़िट नहीं", videoTitle: "वीडियो", videoDescription: "अपने नेटवर्क में वीडियो सामग्री खोजें और प्रबंधित करें।", - videoPluginTitle: "शीर्षक", - videoPluginDescription: "विवरण", videoMineSectionTitle: "आपके वीडियो", videoCreateSectionTitle: "वीडियो अपलोड करें", videoUpdateSectionTitle: "वीडियो अपडेट करें", @@ -952,7 +791,6 @@ module.exports = { videoSortOldest: "सबसे पुराना", videoSortTop: "सर्वाधिक मतदान", videoSearchButton: "खोजें", - videoMessageAuthorButton: "PM", videoUpdatedAt: "अपडेट किया गया", videoNoMatch: "आपकी खोज से कोई वीडियो मेल नहीं खाता।", documentTitle: "दस्तावेज़", @@ -993,8 +831,6 @@ module.exports = { documentUpdatedAt: "अपडेट किया गया", audioTitle: "ऑडियो", audioDescription: "अपने नेटवर्क में ऑडियो सामग्री खोजें और प्रबंधित करें।", - audioPluginTitle: "शीर्षक", - audioPluginDescription: "विवरण", audioMineSectionTitle: "आपके ऑडियो", audioCreateSectionTitle: "ऑडियो अपलोड करें", audioUpdateSectionTitle: "ऑडियो अपडेट करें", @@ -1005,7 +841,6 @@ module.exports = { audioFilterMine: "मेरे", audioFilterRecent: "हाल के", audioFilterTop: "शीर्ष", - audioFilterBlockchain: "ब्लॉकचेन", audioCreateButton: "ऑडियो अपलोड करें", audioUpdateButton: "अपडेट", audioDeleteButton: "हटाएँ", @@ -1032,6 +867,7 @@ module.exports = { audioFilterFavorites: "पसंदीदा", favoritesTitle: "पसंदीदा", favoritesDescription: "आपकी सभी पसंदीदा सामग्री एक ही स्थान पर।", + favoritesSearchPlaceholder: "पसंदीदा खोजें...", favoritesFilterAll: "सभी", favoritesFilterRecent: "हाल के", favoritesFilterAudios: "ऑडियो", @@ -1047,18 +883,13 @@ module.exports = { favoritesNoItems: "अभी तक कोई पसंदीदा नहीं।", yourContacts: "आपके संपर्क", allInhabitants: "निवासी", - allCVs: "सभी CVs", + allCVs: "CVs", discoverPeople: "अपने नेटवर्क में निवासियों को खोजें।", - allInhabitantsButton: "सभी", - contactsButton: "समर्थन", - CVsButton: "बायोडाटा", - matchSkills: "कौशल मिलान", - matchSkillsButton: "कौशल मिलान", - suggestedButton: "सुझाए गए", searchInhabitantsPlaceholder: "नाम से निवासी फ़िल्टर करें …", filterLocation: "स्थान से निवासी फ़िल्टर करें …", filterLanguage: "भाषा से निवासी फ़िल्टर करें …", filterSkills: "कौशल से निवासी फ़िल्टर करें …", + cvSkillsCount: "कौशल", applyFilters: "फ़िल्टर लागू करें", locationLabel: "स्थान", languagesLabel: "भाषाएँ", @@ -1067,17 +898,18 @@ module.exports = { mutualFollowers: "पारस्परिक अनुयायी", suggestedFollowsYou: "आपको फ़ॉलो करता है", latestInteractions: "नवीनतम बातचीत", - viewAvatar: "अवतार देखें", - viewCV: "CV देखें", suggestedSectionTitle: "सुझाए गए", topkarmaSectionTitle: "शीर्ष कर्मा", topecoSectionTitle: "शीर्ष इको", topactivitySectionTitle: "शीर्ष गतिविधि", + "TOP INACTIVITYButton": "सबसे निष्क्रिय", + topinactivitySectionTitle: "सबसे कम सक्रिय निवासी", blockedSectionTitle: "ब्लॉक किए गए", gallerySectionTitle: "गैलरी", - blockedButton: "ब्लॉक किए गए", + topSectionTitle: "शीर्ष", blockedLabel: "ब्लॉक किया गया उपयोगकर्ता", inhabitantviewDetails: "विवरण देखें", + cvVisitButton: "CV देखें", keepReading: "पढ़ते रहें...", oasisId: "ID", noInhabitantsFound: "अभी तक कोई निवासी नहीं मिला।", @@ -1087,10 +919,11 @@ module.exports = { parliamentTitle: "संसद", parliamentDescription: "शासन के रूपों और सामूहिक प्रबंधन कानूनों का अन्वेषण करें।", parliamentFilterGovernment: "सरकार", - parliamentFilterCandidatures: "उम्मीदवारी", + parliamentFilterCandidatures: "उम्मीदवारियाँ", parliamentFilterProposals: "प्रस्ताव", parliamentFilterLaws: "कानून", - parliamentFilterHistorical: "ऐतिहासिक", + parliamentFilterRevocations: "निरसन", + parliamentFilterHistorical: "इतिहास", parliamentFilterLeaders: "नेता", parliamentFilterRules: "नियम", parliamentGovernmentCard: "वर्तमान सरकार", @@ -1115,10 +948,8 @@ module.exports = { parliamentPoliciesDeclined: "अस्वीकृत कानून", parliamentPoliciesDiscarded: "निरस्त कानून", parliamentEfficiency: "% दक्षता", - parliamentFilterRevocations: 'निरसन', parliamentRevocationFormTitle: 'कानून निरसन', parliamentRevocationLaw: 'कानून', - parliamentRevocationTitle: 'शीर्षक', parliamentRevocationReasons: 'कारण', parliamentRevocationPublish: 'निरसन प्रकाशित करें', parliamentCurrentRevocationsTitle: 'वर्तमान निरसन', @@ -1131,23 +962,12 @@ module.exports = { parliamentNoGovernments: "अभी तक कोई सरकार नहीं है।", parliamentCandidatureFormTitle: "उम्मीदवारी प्रस्तावित करें", parliamentCandidatureIdPh: "Oasis ID (@...) या जनजाति का नाम", - parliamentCandidatureSlogan: "नारा (अधिकतम 140 अक्षर)", - parliamentCandidatureSloganPh: "एक छोटा आदर्श वाक्य", parliamentCandidatureMethod: "पद्धति", parliamentCandidatureProposeBtn: "उम्मीदवारी प्रकाशित करें", - parliamentThDate: "प्रस्ताव तिथि", - parliamentThSlogan: "नारा", - parliamentThSince: "प्रोफ़ाइल से", - parliamentThVotes: "प्राप्त मत", - parliamentThVoteAction: "मत दें", - parliamentTypeUser: "निवासी", - parliamentTypeTribe: "जनजाति", parliamentVoteBtn: "मत दें", parliamentProposalFormTitle: "कानून प्रस्तावित करें", parliamentProposalDescription: "विवरण (≤1000)", parliamentProposalPublish: "प्रस्ताव प्रकाशित करें", - parliamentFinalize: "अंतिम रूप दें", - parliamentDeadline: "समय सीमा", parliamentNoProposals: "अभी तक कोई कानून प्रस्ताव नहीं है।", parliamentNoLaws: "अभी तक कोई स्वीकृत कानून नहीं है।", parliamentMethodDEMOCRACY: "लोकतंत्र", @@ -1165,29 +985,21 @@ module.exports = { parliamentVotesSlashTotal: "मत/कुल", parliamentVotesNeeded: "आवश्यक मत", parliamentFutureLawsTitle: "भविष्य के कानून", - parliamentNoFutureLaws: "अभी तक कोई भविष्य के कानून नहीं।", parliamentVoteAction: "मत दें", - parliamentLeadersTitle: "नेता", parliamentThLeader: "अवतार", parliamentPopulation: "जनसंख्या", - parliamentThType: "प्रकार", - parliamentThInPower: "सत्ता में", parliamentThPresented: "उम्मीदवारी", parliamentNoLeaders: "अभी तक कोई नेता नहीं।", parliamentCandidaturesListTitle: "उम्मीदवारी सूची", parliamentTimeRemaining: "शेष समय", - parliamentNoLeader: "अभी तक कोई विजयी उम्मीदवारी नहीं।", parliamentElectionsStatusTitle: "अगली सरकार", parliamentProposalDeadlineLabel: "समय सीमा", parliamentProposalTimeLeft: "शेष समय", - parliamentProposalOnTrack: "पारित होने की राह पर", - parliamentProposalOffTrack: "अभी तक पर्याप्त समर्थन नहीं", parliamentRulesTitle: "संसद कैसे काम करती है", parliamentRulesIntro: "चुनाव हर 2 महीने में हल होते हैं; उम्मीदवारी निरंतर होती है और सरकार चुने जाने पर रीसेट हो जाती है।", parliamentRulesCandidates: "कोई भी निवासी अपने आप को, किसी अन्य निवासी को, या किसी जनजाति को प्रस्तावित कर सकता है। प्रत्येक निवासी प्रति चक्र अधिकतम 3 उम्मीदवारी प्रस्तावित कर सकता है; एक ही चक्र में दोहराव अस्वीकार किए जाते हैं।", parliamentRulesElection: "विजेता वह उम्मीदवारी है जिसे समाधान के समय सबसे अधिक मत प्राप्त हों।", parliamentRulesTies: "टाई-ब्रेक क्रम: सर्वोच्च निवासी कर्म; यदि बराबर, सबसे पुरानी प्रोफ़ाइल; यदि अभी भी बराबर, सबसे पहला प्रस्ताव; फिर शब्दकोषीय ID द्वारा।", - parliamentRulesFallback: "यदि कोई मत नहीं देता, तो नवीनतम प्रस्तावित उम्मीदवारी जीतती है। यदि कोई उम्मीदवारी नहीं है, तो एक यादृच्छिक जनजाति चुनी जाती है।", parliamentRulesTerm: "सरकार टैब वर्तमान सरकार और आँकड़े दिखाता है।", parliamentRulesMethods: "रूप: अराजकता (साधारण बहुमत), लोकतंत्र (50%+1), बहुमत (80%), अल्पमत (20%), कर्मतंत्र (सर्वोच्च-कर्म प्रस्ताव), तानाशाही (तत्काल अनुमोदन)।", parliamentRulesAnarchy: "अराजकता डिफ़ॉल्ट मोड है: यदि समाधान पर कोई उम्मीदवारी नहीं चुनी जाती, तो अराजकता घोषित होती है। अराजकता के तहत, कोई भी निवासी कानून प्रस्तावित कर सकता है।", @@ -1209,11 +1021,7 @@ module.exports = { courtsCaseFormTitle: "मामला खोलें", courtsCaseRespondent: "आरोपी / प्रतिवादी", courtsCaseRespondentPh: "Oasis ID (@...) या जनजाति का नाम", - courtsCaseMediatorsAccuser: "मध्यस्थ (वादी)", courtsCaseMethod: "समाधान पद्धति", - courtsCaseDescription: "विवरण (अधिकतम 1000 अक्षर)", - courtsCaseEvidenceTitle: "मामले के साक्ष्य", - courtsCaseEvidenceHelp: "अपने मामले का समर्थन करने वाली छवियाँ, ऑडियो, दस्तावेज़ (PDF) या वीडियो संलग्न करें।", courtsCaseSubmit: "मामला दायर करें", courtsNominateJudge: "न्यायाधीश नामांकित करें", courtsJudgeId: "न्यायाधीश", @@ -1258,22 +1066,6 @@ module.exports = { courtsRulesMisconduct: "उत्पीड़न, हेरफेर, या मनगढ़ंत साक्ष्य तत्काल नकारात्मक समाधान का कारण बन सकते हैं।", courtsRulesGlossary: "मामला: विवाद का रिकॉर्ड। साक्ष्य: दावों का समर्थन करने वाली सामग्री। फैसला: उपाय के साथ निर्णय। अपील: फैसले की समीक्षा का अनुरोध।", courtsFilterActions: "कार्रवाई", - courtsNoActions: "आपकी भूमिका के लिए कोई लंबित कार्रवाई नहीं।", - courtsCaseTitlePlaceholder: "विवाद का संक्षिप्त विवरण", - courtsCaseSeverity: "गंभीरता", - courtsCaseSeverityNone: "कोई गंभीरता टैग नहीं", - courtsCaseSeverityLOW: "कम", - courtsCaseSeverityMEDIUM: "मध्यम", - courtsCaseSeverityHIGH: "उच्च", - courtsCaseSeverityCRITICAL: "गंभीर", - courtsCaseSubject: "विषय", - courtsCaseSubjectNone: "कोई विषय टैग नहीं", - courtsCaseSubjectBEHAVIOUR: "व्यवहार", - courtsCaseSubjectCONTENT: "सामग्री", - courtsCaseSubjectGOVERNANCE: "शासन / नियम", - courtsCaseSubjectFINANCIAL: "वित्तीय / संसाधन", - courtsCaseSubjectOTHER: "अन्य", - courtsHiddenRespondent: "छुपा हुआ (केवल संबंधित भूमिकाओं को दिखाई देता है)।", courtsThRole: "भूमिका", courtsRoleAccuser: "वादी", courtsRoleDefence: "बचाव", @@ -1284,54 +1076,19 @@ module.exports = { courtsAssignJudgeBtn: "न्यायाधीश चुनें", trendingTitle: "ट्रेंडिंग", exploreTrending: "अपने नेटवर्क में सबसे लोकप्रिय सामग्री खोजें।", - bookmarkButton: "बुकमार्क", - transferButton: "स्थानांतरण", - eventButton: "कार्यक्रम", - taskButton: "कार्य", votesButton: "मतदान", - industryButton: "उद्योग", - projectButton: "परियोजनाएं", - shopProductButton: "उत्पाद", - reportButton: "रिपोर्ट", - feedButton: "फ़ीड", - marketButton: "बाज़ार", - imageButton: "छवियाँ", - audioButton: "ऑडियो", - videoButton: "वीडियो", - documentButton: "दस्तावेज़", - torrentButton: "टॉरेंट", - noTrendingFound: "कोई ट्रेंडिंग सामग्री नहीं मिली।", - noContentMessage: "अभी तक कोई ट्रेंडिंग सामग्री उपलब्ध नहीं।", - trendingDescription: "विवरण", - trendingDate: "दिनांक", - trendingLocation: "स्थान", - trendingPrice: "मूल्य", - trendingUrl: "URL", - trendingCategory: "श्रेणी", - trendingStart: "प्रारंभ", - trendingEnd: "समाप्ति", - trendingPriority: "प्राथमिकता", - trendingStatus: "स्थिति", - trendingFrom: "से", - trendingTo: "को", - trendingConcept: "अवधारणा", - trendingAmount: "राशि", - trendingDeadline: "समय सीमा", - trendingItemStatus: "आइटम स्थिति", - trendingTotalVotes: "कुल मत", + shopProductButton: "दुकान", trendingTotalOpinions: "कुल राय", trendingNoContentMessage: "अभी तक कोई ट्रेंडिंग नहीं है।", - trendingAuthor: "द्वारा", - trendingCreatedAtLabel: "बनाया गया", trendingTotalCount: "कुल संख्या", tasksTitle: "कार्य", tasksDescription: "अपने नेटवर्क में कार्य खोजें और प्रबंधित करें।", + taskSearchPlaceholder: "कार्य खोजें...", taskTitleLabel: "शीर्षक", taskDescriptionLabel: "विवरण", taskStartTimeLabel: "प्रारंभ समय", taskEndTimeLabel: "समाप्ति समय", taskPriorityLabel: "प्राथमिकता", - taskPrioritySelect: "प्राथमिकता चुनें", taskPriorityUrgent: "अत्यावश्यक", taskPriorityHigh: "उच्च", taskPriorityMedium: "मध्यम", @@ -1341,13 +1098,13 @@ module.exports = { taskVisibilityLabel: "दृश्यता", taskPublic: "सार्वजनिक", taskPrivate: "निजी", - taskCreatedAt: "बनाया गया", - taskBy: "द्वारा", taskStatus: "स्थिति", taskStatusOpen: "खुला", taskStatusInProgress: "प्रगति में", taskStatusClosed: "बंद", taskAssignedTo: "को सौंपा गया", + taskAssignedChip: "सौंपा गया", + taskUnassignedChip: "असौंपा", taskAssignees: "सौंपे गए", taskAssignButton: "मुझे सौंपें", taskUnassignButton: "सौंपना रद्द करें", @@ -1360,7 +1117,6 @@ module.exports = { taskFilterInProgress: "प्रगति में", taskFilterClosed: "बंद", taskFilterAssigned: "सौंपे गए", - taskFilterArchived: "संग्रहीत", taskFilterUrgent: "अत्यावश्यक", taskFilterHigh: "उच्च", taskFilterMedium: "मध्यम", @@ -1373,23 +1129,21 @@ module.exports = { taskInProgressTitle: "प्रगति में कार्य", taskClosedTitle: "बंद कार्य", taskAssignedTitle: "सौंपे गए कार्य", - taskArchivedTitle: "संग्रहीत कार्य", - taskPublicTitle: "सार्वजनिक कार्य", - taskPrivateTitle: "निजी कार्य", notasks: "कोई कार्य उपलब्ध नहीं।", noLocation: "कोई स्थान निर्दिष्ट नहीं", taskSetStatus: "स्थिति सेट करें", - eventTitle: "कार्यक्रम", eventDateLabel: "दिनांक", + eventRecurrenceLabel: "पुनरावृत्ति", + eventRecurrenceUntil: "इस तिथि तक दोहराएँ", + eventRecurrenceHint: "एकल इवेंट के लिए अंतिम तिथि खाली छोड़ें।", + eventUpcomingDates: "आगामी तिथियाँ", eventsTitle: "कार्यक्रम", eventsDescription: "अपने नेटवर्क में कार्यक्रम खोजें और प्रबंधित करें।", - eventDescription: "विवरण", + eventSearchPlaceholder: "कार्यक्रम खोजें...", eventPrice: "मूल्य", eventStatus: "स्थिति", - eventOrganizer: "आयोजक", eventAllSectionTitle: "कार्यक्रम", eventMineSectionTitle: "आपके कार्यक्रम", - eventArchivedTitle: "संग्रहीत कार्यक्रम", eventCreateSectionTitle: "कार्यक्रम बनाएँ", eventUpdateSectionTitle: "कार्यक्रम अपडेट करें", eventDeleteButton: "हटाएँ", @@ -1397,11 +1151,26 @@ module.exports = { eventAddToCalendar: "कैलेंडर में जोड़ें", eventVisitCalendar: "कैलेंडर देखें", viewTask: "कार्य देखें", + viewEvent: "इवेंट देखें", + viewPad: "पैड देखें", + viewMap: "मानचित्र देखें", + viewCalendar: "कैलेंडर देखें", viewReport: "रिपोर्ट देखें", viewTransfer: "स्थानांतरण देखें", viewItem: "आइटम देखें", viewShop: "दुकान देखें", viewProject: "परियोजना देखें", + viewJob: "नौकरी देखें", + viewPlace: "स्थान देखें", + generatePdf: "PDF बनाएँ", + sharePm: "PM से साझा करें", + galleryImages: "छवियाँ (अधिकतम आकार: 50MB प्रत्येक)", + galleryPhotos: "छवियाँ", + galleryAddPhoto: "छवि जोड़ें", + galleryRemovePhoto: "हटाएँ", + galleryVideo: "वीडियो (अधिकतम आकार: 50MB)", + galleryAddVideo: "वीडियो जोड़ें", + galleryRemoveVideo: "वीडियो हटाएँ", viewVotation: "मतदान देखें", voteCastTitle: "मतदान करें", voteResults: "परिणाम", @@ -1409,29 +1178,15 @@ module.exports = { eventDescriptionLabel: "विवरण", eventDescriptionPlaceholder: "कार्यक्रम विवरण दर्ज करें...", eventUpdateButton: "अपडेट", - eventAttendeesLabel: "उपस्थित", - eventAttendeesPlaceholder: "अल्पविराम से अलग करके उपस्थित दर्ज करें...", eventTagsLabel: "टैग", - eventTagsPlaceholder: "अल्पविराम से अलग करके कार्यक्रम टैग दर्ज करें...", - eventTags: "टैग", eventPriceLabel: "मूल्य", eventUrlLabel: "URL", eventAttendees: "उपस्थित", - noAttendees: "अभी तक कोई उपस्थित नहीं", - eventCreatedAt: "बनाया गया", eventLocation: "स्थान", eventLocationLabel: "स्थान", - eventNoLocation: "कोई स्थान निर्दिष्ट नहीं", - eventNoURL: "कोई URL निर्दिष्ट नहीं", - eventBy: "द्वारा", noevents: "कोई कार्यक्रम उपलब्ध नहीं।", eventDate: "दिनांक", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "कार्यक्रम में शामिल हों", - eventUnattendButton: "कार्यक्रम छोड़ें", - eventCreatedBy: "द्वारा बनाया गया", - eventAttendeesCount: "उपस्थित संख्या", - eventCreatedByYou: "आपने यह कार्यक्रम बनाया", eventFilterAll: "सभी", eventFilterMine: "मेरे", eventFilterToday: "आज", @@ -1439,18 +1194,9 @@ module.exports = { eventFilterMonth: "इस महीने", eventFilterYear: "इस वर्ष", eventFilterArchived: "संग्रहीत", - eventTodayTitle: "आज के कार्यक्रम", - eventThisWeekTitle: "इस सप्ताह के कार्यक्रम", - eventThisMonthTitle: "इस महीने के कार्यक्रम", - eventThisYearTitle: "इस वर्ष के कार्यक्रम", eventPrivacyLabel: "दृश्यता", eventPublic: "सार्वजनिक", eventPrivate: "निजी", - eventPublicTitle: "सार्वजनिक कार्यक्रम", - eventNoPrice: "निःशुल्क कार्यक्रम", - eventNoImage: "कोई छवि अपलोड नहीं की गई", - eventAttendConfirmation: "अब आप इस कार्यक्रम में शामिल हैं", - eventUnattendConfirmation: "अब आप इस कार्यक्रम में शामिल नहीं हैं", eventAttended: "शामिल हुए", eventUnattended: "शामिल नहीं", eventStatusOpen: "खुला", @@ -1461,6 +1207,10 @@ module.exports = { tagsTopSectionTitle: "शीर्ष टैग", tagsCloudSectionTitle: "टैग क्लाउड", tagsFilterAll: "सभी", + tagsFilterMine: "मेरे", + tagsFilterRecent: "हाल के", + tagsMineSectionTitle: "मेरे टैग", + tagsRecentSectionTitle: "हाल के टैग", tagsFilterTop: "शीर्ष", tagsFilterCloud: "क्लाउड", tagsNoItems: "कोई टैग उपलब्ध नहीं।", @@ -1504,18 +1254,12 @@ module.exports = { transfersDeadline: "समय सीमा", transfersTags: "टैग", transfersStatus: "स्थिति", - transfersStatusUnconfirmed: "अपुष्ट", - transfersStatusClosed: "बंद", - transfersStatusDiscarded: "निरस्त", - transfersCreatedAt: "बनाया गया", transfersConfirmations: "पुष्टि", - transfersContainingBlock: "धारक ब्लॉक", - transfersExportContract: "स्मार्ट अनुबंध", + transfersExportContract: "बिल बनाएँ", transfersConfirmButton: "स्थानांतरण पुष्टि करें", transfersNoItems: "कोई स्थानांतरण नहीं मिला।", transfersMineSectionTitle: "आपके स्थानांतरण", transfersUBISectionTitle: "UBI स्थानांतरण", - transfersMarketSectionTitle: "बाज़ार स्थानांतरण", transfersTopSectionTitle: "शीर्ष स्थानांतरण", transfersPendingSectionTitle: "लंबित स्थानांतरण", transfersUnconfirmedSectionTitle: "अपुष्ट स्थानांतरण", @@ -1523,21 +1267,13 @@ module.exports = { transfersDiscardedSectionTitle: "निरस्त स्थानांतरण", transfersCreateSectionTitle: "स्थानांतरण बनाएँ", transfersAllSectionTitle: "स्थानांतरण", - transfersFilterFavs: "पसंदीदा", - transfersFavsSectionTitle: "पसंदीदा स्थानांतरण", - transfersSearchLabel: "खोज", transfersSearchPlaceholder: "अवधारणा, टैग, उपयोगकर्ता खोजें...", transfersMinAmountLabel: "न्यूनतम राशि", transfersMaxAmountLabel: "अधिकतम राशि", - transfersSortLabel: "क्रमबद्ध करें", transfersSortRecent: "सबसे हाल का", transfersSortAmount: "सबसे अधिक राशि", transfersSortDeadline: "निकटतम समय सीमा", transfersSearchButton: "खोजें", - transfersFavoriteButton: "पसंदीदा", - transfersUnfavoriteButton: "पसंदीदा हटाएँ", - transfersMessageUserButton: "संदेश", - transfersExpiringSoonBadge: "समाप्त हो रहा है", transfersExpiredBadge: "समाप्त", transfersUpdatedAt: "अपडेट किया गया", transfersNoMatch: "आपकी खोज से कोई स्थानांतरण मेल नहीं खाता।", @@ -1582,16 +1318,6 @@ module.exports = { voteNoQuestion: "कोई प्रश्न प्रदान नहीं किया गया", voteUnknownCreator: "अज्ञात निर्माता", voteUnknownDate: "अज्ञात दिनांक", - errorVoteNotFound: "मत नहीं मिला", - errorAlreadyVoted: "आपने पहले ही राय दे दी है।", - errorVoteClosedCannotEdit: "आप बंद मतदान को संपादित नहीं कर सकते", - errorVoteDeadlinePassed: "इस मतदान की समय सीमा बीत चुकी है", - errorRetrievingVote: "मत प्राप्त करने में त्रुटि", - errorCreatingVote: "मत बनाने में त्रुटि", - errorVoteAlreadyVoted: "राय दिए जाने के बाद संपादित नहीं किया जा सकता", - errorDeletingOldVote: "पुरानी राय हटाने में त्रुटि", - errorCreatingUpdatedVote: "अपडेटेड राय बनाने में त्रुटि", - errorCreatingTombstone: "टॉम्बस्टोन बनाने में त्रुटि", voteDetailSectionTitle: 'मत विवरण', voteCommentsLabel: 'टिप्पणियाँ', voteCommentsForumButton: 'चर्चा खोलें', @@ -1601,7 +1327,6 @@ module.exports = { voteNewCommentButton: 'टिप्पणी पोस्ट करें', voteNewCommentLabel: 'टिप्पणी जोड़ें', cvTitle: "CV", - cvLabel: "बायोडाटा (CV)", cvEditSectionTitle: "CV संपादित करें", cvCreateSectionTitle: "CV बनाएँ", cvDescription: "अपने पेशेवर कौशल और जानकारी प्रबंधित करें और साझा करें।", @@ -1620,19 +1345,16 @@ module.exports = { cvLocationLabel: "स्थान", cvStatusLabel: "स्थिति", cvPreferencesLabel: "प्राथमिकताएँ", - cvOasisContributorLabel: "Oasis योगदानकर्ता", cvPersonal: "व्यक्तिगत", cvOasis: "Oasis योगदानकर्ता (वैकल्पिक)", - cvOasisContributorView: "Oasis योगदान", + cvOasisContributorView: "योगदान", cvEducational: "शैक्षिक (वैकल्पिक)", cvEducationalView: "शैक्षिक", cvProfessional: "पेशेवर (वैकल्पिक)", cvProfessionalView: "पेशेवर", cvAvailability: "उपलब्धता (वैकल्पिक)", - cvAvailabilityView: "उपलब्धता", cvUpdateButton: "अपडेट", cvCreateButton: "CV बनाएँ", - cvContactLabel: "संपर्क", cvCreatedAt: "बनाया गया", cvUpdatedAt: "अपडेट किया गया", cvEditButton: "अपडेट", @@ -1641,8 +1363,103 @@ module.exports = { blogSubject: "विषय", blogMessage: "संदेश", blogImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + blogMedia: "अनुलग्नक (8 चित्र और एक वीडियो तक)", blogPublish: "पूर्वावलोकन", - noPopularMessages: "अभी तक कोई लोकप्रिय संदेश प्रकाशित नहीं हुआ", + pollsTitle: "सर्वेक्षण", + dataTitle: "मिलान", + dataDescription: "अपने नेटवर्क के मेल खोजें और देखें।", + dataFilterAll: "सभी", + dataFilterMine: "मेरे", + dataFilterRecent: "हाल के", + dataFilterTop: "शीर्ष", + dataKindInhabitants: "निवासी", + dataKindJobs: "नौकरियाँ", + dataKindProjects: "परियोजनाएँ", + dataKindEvents: "इवेंट्स", + dataKindTribes: "जनजातियाँ", + dataKindMarket: "मार्केट", + dataKindHousing: "आवास", + dataKindIndustry: "उद्योग", + dataKindTasks: "कार्य", + dataKindReports: "रिपोर्ट्स", + dataKindVotes: "मतदान", + dataSearchPlaceholder: "क्रॉस-डेटा में खोजें...", + dataCohesionTitle: "संसक्ति गुणांक (CC)", + dataCcShort: "CC", + dataCohesionHint: "नेटवर्क ने जो कुछ प्रकाशित किया है, उसके बीच औसत समानता।", + dataAffinity: "समानता", + dataCommonTerms: "कीवर्ड", + dataStatPeople: "CVs", + dataStatConnected: "जुड़े हुए", + dataStatSkills: "कौशल", + dataBestMatch: "सर्वश्रेष्ठ मैच", + dataStatIsolated: "अलग-थलग", + dataStatEntities: "तुलना की गई इकाइयाँ", + dataStatTerms: "विशिष्ट शब्द", + dataStatPairs: "जुड़े हुए जोड़े", + dataMatchesTitle: "मेल", + dataMatchesHint: "एल्गोरिद्म के व्यक्तिगत सुझाव।", + dataTermsTitle: "मुख्य शब्द", + dataTermsHint: "वे शब्द जो सबसे अधिक सामग्री में आते हैं।", + dataConnections: "जुड़े मिलान", + dataTopicTitle: "इससे संबंधित सब कुछ:", + dataTopicHint: "एल्गोरिद्म इस विषय से क्या जोड़ता है", + dataNoMatches: "दिखाने के लिए क्रॉस-डेटा नहीं।", + dataNoProfile: "सामग्री प्रकाशित करें या अपना CV लिखें ताकि एल्गोरिद्म जान सके कि आपकी रुचि किसमें है।", + pollsDescription: "नेटवर्क से पूछने और उत्तर गिनने का मॉड्यूल।", + pollFilterAll: "सभी", + pollFilterMine: "मेरे", + pollFilterRecent: "हाल के", + pollFilterTop: "शीर्ष", + pollFilterVoted: "मतदान किया", + pollFilterOpen: "खुले", + pollFilterClosed: "बंद", + pollCreateButton: "सर्वेक्षण बनाएँ", + pollCreateTitle: "सर्वेक्षण बनाएँ", + pollEditTitle: "सर्वेक्षण संपादित करें", + pollQuestion: "प्रश्न", + pollQuestionPlaceholder: "आप क्या पूछना चाहते हैं?", + pollOptions: "विकल्प (प्रति पंक्ति एक)", + pollOutcome: "परिणाम", + pollNoVotesYet: "अभी कोई वोट नहीं", + pollTie: "बराबरी", + pollOptionsPlaceholder: "चौक\nपार्क\nबार", + pollAnonymous: "गुमनाम", + pollAnonymousLabel: "गुमनाम सर्वेक्षण", + pollMultiple: "बहुविकल्प", + pollMultipleLabel: "कई उत्तरों की अनुमति दें", + pollDeadline: "समय सीमा", + pollTags: "टैग", + pollPublishButton: "सर्वेक्षण प्रकाशित करें", + pollUpdateButton: "अपडेट करें", + pollCloseButton: "बंद करें", + pollDeleteButton: "हटाएं", + pollVoteButton: "मत दें", + pollChangeVote: "वोट बदलें", + pollVoters: "मतदाता", + pollComments: "टिप्पणियाँ", + pollStatusLabel: "स्थिति", + pollStatusOpen: "खुला", + pollStatusClosed: "बंद", + pollSearchPlaceholder: "सर्वेक्षण खोजें...", + pollsNoItems: "कोई सर्वेक्षण नहीं मिला।", + viewPoll: "सर्वेक्षण देखें", + pollChatCreate: "सर्वेक्षण बनाएँ", + pollInChat: "सर्वेक्षण", + blogTitle: "ब्लॉग", + blogDescription: "ब्लॉग खोजने और प्रबंधित करने का मॉड्यूल।", + blogFilterAll: "सभी", + blogFilterMine: "मेरे", + blogFilterRecent: "हाल के", + blogFilterFavorites: "पसंदीदा", + blogFilterTop: "शीर्ष", + blogCreateButton: "ब्लॉग बनाएँ", + blogSearchPlaceholder: "ब्लॉग खोजें...", + blogComments: "टिप्पणियाँ", + blogAllowComments: "टिप्पणियाँ अनुमति दें", + blogCommentsClosed: "लेखक ने इस ब्लॉग की टिप्पणियाँ बंद कर दी हैं।", + blogNoItems: "कोई ब्लॉग नहीं मिला।", + viewBlog: "ब्लॉग देखें", forumTitle: "मंच", forumCategoryLabel: "श्रेणी", forumTitleLabel: "शीर्षक", @@ -1650,43 +1467,22 @@ module.exports = { forumCreateButton: "मंच बनाएँ", forumCreateSectionTitle: "मंच बनाएँ", forumDescription: "अपने नेटवर्क के अन्य निवासियों से खुलकर बात करें।", + forumSearchPlaceholder: "फ़ोरम खोजें...", forumFilterAll: "सभी", forumFilterMine: "मेरे", forumFilterRecent: "हाल के", forumFilterTop: "शीर्ष", - forumMineSectionTitle: "आपके मंच", - forumRecentSectionTitle: "हाल के मंच", - forumAllSectionTitle: "मंच", forumDeleteButton: "हटाएँ", forumParticipants: "प्रतिभागी", forumMessages: "संदेश", - forumLastMessage: "अंतिम संदेश", forumMessageLabel: "संदेश", forumMessagePlaceholder: "अपना संदेश लिखें...", forumSendButton: "भेजें", - forumVisitForum: "मंच देखें", noForums: "कोई मंच नहीं मिला।", - forumVisitButton: "मंच देखें", - forumCatGENERAL: "सामान्य", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "राजनीति", - forumCatTECH: "प्रौद्योगिकी", - forumCatSCIENCE: "विज्ञान", - forumCatMUSIC: "संगीत", - forumCatART: "कला", - forumCatGAMING: "गेमिंग", - forumCatBOOKS: "पुस्तकें", - forumCatFILMS: "फ़िल्में", - forumCatPHILOSOPHY: "दर्शन", - forumCatSOCIETY: "समाज", - forumCatPRIVACY: "गोपनीयता", - forumCatCYBERWARFARE: "साइबरयुद्ध", - forumCatSURVIVALISM: "जीवनवाद", + forumVisitButton: "फ़ोरम देखें", + forumTopicLabel: "विषय", imageTitle: "छवियाँ", imageDescription: "अपने नेटवर्क में छवि सामग्री खोजें और प्रबंधित करें।", - imagePluginTitle: "शीर्षक", - imagePluginDescription: "विवरण", imageMineSectionTitle: "आपकी छवियाँ", imageCreateSectionTitle: "छवि अपलोड करें", imageUpdateSectionTitle: "छवि अपडेट करें", @@ -1695,14 +1491,12 @@ module.exports = { imageTopSectionTitle: "शीर्ष छवियाँ", imageFavoritesSectionTitle: "पसंदीदा", imageGallerySectionTitle: "गैलरी", - imageMemeSectionTitle: "मीम्स", imageFilterAll: "सभी", imageFilterMine: "मेरे", imageFilterRecent: "हाल के", imageFilterTop: "शीर्ष", imageFilterFavorites: "पसंदीदा", imageFilterGallery: "गैलरी", - imageFilterMeme: "मीम्स", imageCreateButton: "छवि अपलोड करें", imageUpdateButton: "अपडेट", imageDeleteButton: "हटाएँ", @@ -1715,7 +1509,6 @@ module.exports = { imageTitlePlaceholder: "वैकल्पिक", imageDescriptionLabel: "विवरण", imageDescriptionPlaceholder: "वैकल्पिक", - imageMemeLabel: "मीम के रूप में चिह्नित करें", imageNoFile: "कोई छवि फ़ाइल प्रदान नहीं की गई", noImages: "कोई छवि उपलब्ध नहीं।", imageSearchPlaceholder: "शीर्षक, टैग, विवरण, लेखक खोजें...", @@ -1723,7 +1516,6 @@ module.exports = { imageSortOldest: "सबसे पुराना", imageSortTop: "सर्वाधिक मतदान", imageSearchButton: "खोजें", - imageMessageAuthorButton: "संदेश", imageUpdatedAt: "अपडेट किया गया", imageNoMatch: "आपकी खोज से कोई छवि मेल नहीं खाती।", feedTitle: "फ़ीड", @@ -1731,7 +1523,6 @@ module.exports = { createFeedButton: "फ़ीड भेजें!", feedPlaceholder: "क्या हो रहा है? (अधिकतम 280 अक्षर)", TODAYButton: "आज", - CREATEButton: "फ़ीड बनाएँ", totalOpinions: "कुल राय", moreVoted: "अधिक मतदान", noFeedsFound: "कोई फ़ीड नहीं मिली।", @@ -1754,20 +1545,12 @@ module.exports = { concept: "अवधारणा", description: "विवरण", meme: "मीम", - activityContact: "संपर्क", - activityBy: "नाम", - activityPixelia: "नया पिक्सेल जोड़ा गया", - viewImage: "छवि देखें", - playAudio: "ऑडियो चलाएँ", - playVideo: "वीडियो चलाएँ", typeRecent: "हाल के", - errorActivity: "गतिविधि प्राप्त करने में त्रुटि", + typeTop: "शीर्ष", typePost: "ब्लॉग्स", - recentButton: "हाल का", typeTribe: "जनजातियाँ", typeLarp: "L.A.R.P.", typeInhabitants: "निवासी", - activityProfileUpdated: "ने अपनी प्रोफ़ाइल अपडेट की", typeAbout: "निवासी", typeCurriculum: "CVS", typeImage: "छवियाँ", @@ -1811,8 +1594,6 @@ module.exports = { typeCourtsSettlementAccepted: "न्यायालय · समझौता स्वीकृत", typeCourtsNomination: "न्यायालय · नामांकन", typeCourtsNominationVote: "न्यायालय · नामांकन मत", - activitySupport: "नया गठबंधन बना", - activityJoin: "नए PUB में शामिल हुए", question: "प्रश्न", deadline: "समय सीमा", status: "स्थिति", @@ -1826,12 +1607,8 @@ module.exports = { date: "दिनांक", category: "श्रेणी", attendees: "उपस्थित", - activitySpread: "->", - visitLink: "लिंक देखें", - viewDocument: "दस्तावेज़ देखें", location: "स्थान", contentWarning: "विषय", - personName: "निवासी का नाम", bankWalletConnected: "ECOin वॉलेट", bankUbiReceived: "UBI प्राप्त", bankTx: "Tx", @@ -1841,7 +1618,6 @@ module.exports = { link: "लिंक", activityProjectFollow: "%OASIS% अब इस परियोजना %PROJECT% को %ACTION% कर रहा है", activityProjectUnfollow: "%OASIS% अब इस परियोजना %PROJECT% को %ACTION% कर रहा है", - activityProjectPledged: "%OASIS% ने परियोजना %PROJECT% को %AMOUNT% %ACTION% किया है", following: "फ़ॉलो कर रहे हैं", unfollowing: "अनफ़ॉलो कर रहे हैं", pledged: "प्रतिज्ञा", @@ -1887,26 +1663,17 @@ module.exports = { courtsVotesSlashTotal: "हाँ/कुल", courtsOpenVote: "मतदान खोलें", courtsAnswerTitle: "उत्तर", - courtsStanceADMIT: "स्वीकार", - courtsStanceDENY: "अस्वीकार", - courtsStancePARTIAL: "आंशिक", - courtsStanceCOUNTERCLAIM: "प्रतिदावा", - courtsStanceNEUTRAL: "तटस्थ", courtsVerdictResult: "परिणाम", courtsVerdictOrders: "आदेश", courtsSettlementText: "समझौता", courtsSettlementAccepted: "स्वीकृत", - courtsSettlementPending: "लंबित", courtsJudge: "न्यायाधीश", courtsThSupports: "समर्थन", courtsFilterOpenCase: 'मामला खोलें', - courtsEvidenceFileLabel: 'साक्ष्य फ़ाइल (छवि, ऑडियो, वीडियो या PDF)', - courtsCaseMediators: 'मध्यस्थ', courtsCaseMediatorsPh: 'मध्यस्थ Oasis IDs, अल्पविराम से अलग', courtsMediatorsLabel: 'मध्यस्थ', courtsThCase: 'मामला', courtsThCreatedAt: 'प्रारंभ तिथि', - courtsThActions: 'कार्रवाई', courtsPublicPrefLabel: 'समाधान के बाद दृश्यता', courtsPublicPrefYes: 'मैं सहमत हूँ कि यह मामला पूर्ण रूप से सार्वजनिक हो सकता है', courtsPublicPrefNo: 'मैं विवरण निजी रखना पसंद करता हूँ', @@ -1914,8 +1681,11 @@ module.exports = { courtsMethodMEDIATION: 'मध्यस्थता', courtsNoCases: 'कोई मामला नहीं।', reportsTitle: "रिपोर्ट", - reportsDescription: "अपने नेटवर्क में मुद्दों, बग, दुरुपयोग और सामग्री चेतावनियों से संबंधित रिपोर्ट प्रबंधित करें और ट्रैक करें।", + reportsDescription: "अपने नेटवर्क की रिपोर्टों को प्रबंधित करें और उन पर नज़र रखें।", + reportsSearchPlaceholder: "रिपोर्ट खोजें...", reportsFilterAll: "सभी", + reportsFilterRecent: "हाल के", + reportsFilterTop: "शीर्ष", reportsFilterMine: "मेरे", reportsFilterFeatures: "सुविधाएँ", reportsFilterBugs: "बग", @@ -1928,18 +1698,13 @@ module.exports = { reportsFilterInvalid: "अमान्य", reportsCreateButton: "रिपोर्ट बनाएँ", reportsTitleLabel: "शीर्षक", - reportsDescriptionLabel: "विवरण", - reportsDescriptionPlaceholder: "कृपया विस्तृत विवरण प्रदान करें।", reportsCategory: "श्रेणी", - reportsCategoryLabel: "श्रेणी", reportsCategoryFeatures: "सुविधाएँ", reportsCategoryBugs: "बग", reportsCategoryAbuse: "दुरुपयोग", - reportsCategoryContent: "सामग्री समस्याएँ", + reportsCategoryContent: "सामग्री", reportsUpdateButton: "अपडेट", reportsDeleteButton: "हटाएँ", - reportsDateLabel: "दिनांक", - reportsUploadFile: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", reportsMineSectionTitle: "आपकी रिपोर्ट", reportsFeaturesSectionTitle: "सुविधा अनुरोध", reportsBugsSectionTitle: "बग", @@ -1947,11 +1712,6 @@ module.exports = { reportsContentSectionTitle: "सामग्री समस्याएँ", reportsAllSectionTitle: "रिपोर्ट", reportsNoItems: "कोई रिपोर्ट उपलब्ध नहीं।", - reportsValidationTitle: "कृपया एक वैध शीर्षक दर्ज करें।", - reportsValidationDescription: "विवरण खाली नहीं हो सकता।", - reportsValidationCategory: "कृपया एक श्रेणी चुनें।", - reportsCreatedAt: "बनाया गया", - reportsCreatedBy: "द्वारा", reportsSeverity: "गंभीरता", reportsSeverityLow: "कम", reportsSeverityMedium: "मध्यम", @@ -1962,9 +1722,6 @@ module.exports = { reportsStatusUnderReview: "समीक्षाधीन", reportsStatusResolved: "हल किया गया", reportsStatusInvalid: "अमान्य", - reportsUpdateStatusButton: "स्थिति अपडेट करें", - reportsAnonymityOption: "गुमनाम रूप से जमा करें", - reportsAnonymousAuthor: "गुमनाम", reportsConfirmButton: "रिपोर्ट पुष्टि करें!", reportsConfirmations: "पुष्टि", reportsConfirmedSectionTitle: "पुष्ट रिपोर्ट", @@ -2012,6 +1769,20 @@ module.exports = { reportsRequestedActionLabel: 'अनुरोधित कार्रवाई', reportsRequestedActionPlaceholder: 'हटाएँ, छुपाएँ, टैग करें, चेतावनी दें, आदि।', tribesTitle: "जनजातियाँ", + tribeFilterAll: "सभी", + tribeFilterRecent: "हाल के", + tribeFilterMine: "मेरे", + tribeFilterMembership: "सदस्यता", + tribeFilterSubtribes: "उप-जनजातियाँ", + tribeFilterTop: "शीर्ष", + tribeFilterGallery: "गैलरी", + tribeFeedFilterTOP: "शीर्ष", + tribeFeedFilterMINE: "मेरे", + tribeFeedFilterALL: "सभी", + tribeFeedFilterRECENT: "हाल के", + courtsStanceDENY: "इनकार", + courtsStanceADMIT: "स्वीकार", + courtsStancePARTIAL: "आंशिक स्वीकार", tribeAllSectionTitle: "जनजातियाँ", tribeMineSectionTitle: "आपकी जनजातियाँ", tribeCreateSectionTitle: "जनजाति बनाएँ", @@ -2023,13 +1794,6 @@ module.exports = { tribeviewSubTribeButton: "उप-जनजाति देखें", tribeRootLabel: "मूल", tribeDescription: "अपने नेटवर्क में जनजातियाँ खोजें या बनाएँ।", - tribeFilterAll: "सभी", - tribeFilterMine: "मेरे", - tribeFilterMembership: "सदस्यता", - tribeFilterRecent: "हाल के", - tribeFilterTop: "शीर्ष", - tribeFilterSubtribes: "उप-जनजातियाँ", - tribeFilterGallery: "गैलरी", tribeMainTribeLabel: "मुख्य जनजाति", tribeCreateButton: "जनजाति बनाएँ", tribeUpdateButton: "अपडेट", @@ -2048,13 +1812,8 @@ module.exports = { tribeModeLabel: "मोड", tribeIsAnonymousLabel: "स्थिति", tribeMembersCount: "सदस्य", - tribeInviteCodePlaceholder: "आमंत्रण कोड दर्ज करें", - tribeJoinByCodeButton: "कोड से जुड़ें", - tribeJoinButton: "शामिल हों", tribeEnterInvite: "कोड दर्ज करें", tribeLeaveButton: "छोड़ें", - tribeYes: "हाँ", - tribeNo: "नहीं", tribePublic: "सार्वजनिक", tribePrivate: "निजी", tribeGenerateInvite: "एकल निमंत्रण", @@ -2063,13 +1822,8 @@ module.exports = { tribeRemoveInvitation: "निमंत्रण हटाएँ", tribeCreatedAt: "बनाया गया", tribeAuthor: "द्वारा", - tribeAuthorLabel: "लेखक", tribeStrict: "सख़्त", tribeOpen: "खुला", - tribeFeedFilterRECENT: "हाल के", - tribeFeedFilterMINE: "मेरे", - tribeFeedFilterALL: "सभी", - tribeFeedFilterTOP: "शीर्ष", tribeFeedRefeeds: "रीफ़ीड", tribeFeedRefeed: "रीफ़ीड", tribeFeedMessagePlaceholder: "एक फ़ीड लिखें…", @@ -2079,17 +1833,12 @@ module.exports = { tribeNotFound: "जनजाति नहीं मिली!", createTribeTitle: "जनजाति बनाएँ", updateTribeTitle: "जनजाति अपडेट करें", - tribeSectionOverview: "अवलोकन", tribeSectionInhabitants: "निवासी", tribeSectionVotations: "मतदान", tribeSectionEvents: "कार्यक्रम", - tribeSectionReports: "रिपोर्ट", tribeSectionTasks: "कार्य", tribeSectionFeed: "फ़ीड", tribeSectionForum: "मंच", - tribeSectionMarket: "बाज़ार", - tribeSectionJobs: "नौकरियाँ", - tribeSectionProjects: "परियोजनाएँ", tribeSectionMedia: "मीडिया", tribeSectionImages: "छवियाँ", tribeSectionAudios: "ऑडियो", @@ -2127,11 +1876,6 @@ module.exports = { tribeTaskStatusClosed: "बंद करें", tribeTaskAssign: "सौंपें", tribeTaskUnassign: "सौंपना रद्द करें", - tribeReportCreate: "रिपोर्ट बनाएँ", - tribeReportsEmpty: "अभी तक कोई रिपोर्ट नहीं।", - tribeReportTitle: "शीर्षक", - tribeReportDescription: "विवरण", - tribeReportCategory: "श्रेणी", tribeVotationCreate: "मतदान बनाएँ", tribeVotationsEmpty: "अभी तक कोई मतदान नहीं।", tribeVotationTitle: "शीर्षक", @@ -2149,27 +1893,6 @@ module.exports = { tribeForumCategory: "श्रेणी", tribeForumReply: "उत्तर दें", tribeForumReplies: "उत्तर", - tribeMarketCreate: "लिस्टिंग बनाएँ", - tribeMarketEmpty: "अभी तक कोई लिस्टिंग नहीं।", - tribeMarketTitle: "शीर्षक", - tribeMarketDescription: "विवरण", - tribeMarketPrice: "मूल्य", - tribeMarketImage: "छवि", - tribeMarketCategory: "श्रेणी", - tribeJobCreate: "नौकरी बनाएँ", - tribeJobsEmpty: "अभी तक कोई नौकरी नहीं।", - tribeJobTitle: "शीर्षक", - tribeJobDescription: "विवरण", - tribeJobLocation: "स्थान", - tribeJobSalary: "वेतन", - tribeJobDeadline: "समय सीमा", - tribeProjectCreate: "परियोजना बनाएँ", - tribeProjectsEmpty: "अभी तक कोई परियोजना नहीं।", - tribeProjectTitle: "शीर्षक", - tribeProjectDescription: "विवरण", - tribeProjectGoal: "लक्ष्य", - tribeProjectFunded: "वित्तपोषित", - tribeProjectDeadline: "समय सीमा", tribeMediaUpload: "मीडिया अपलोड करें", readDocument: "दस्तावेज़ पढ़ें", tribeCreateImage: "छवि बनाएँ", @@ -2180,7 +1903,6 @@ module.exports = { tribeMediaEmpty: "अभी तक कोई मीडिया नहीं।", tribeMediaTitle: "शीर्षक", tribeMediaDescription: "विवरण", - tribeMediaType: "प्रकार", tribeMediaTypeImage: "छवि", tribeMediaTypeVideo: "वीडियो", tribeMediaTypeAudio: "ऑडियो", @@ -2190,11 +1912,6 @@ module.exports = { tribeInviteCodeText: "आमंत्रण कोड: ", oasisVersionLabel: "Oasis संस्करण", tribeInviteCodeHint: "इस कोड को साझा करें जिसे आप आमंत्रित करना चाहते हैं। वे /invites → Tribes से शामिल हो सकते हैं।", - tribeGroupTribe: "जनजाति", - tribeGroupOffice: "कार्यालय", - tribeGroupNetwork: "नेटवर्क", - tribeGroupEconomy: "अर्थव्यवस्था", - tribeGroupMedia: "मीडिया", tribeStatusOpen: "खुला", tribeStatusClosed: "बंद", tribeStatusInProgress: "प्रगति में", @@ -2204,33 +1921,17 @@ module.exports = { tribePriorityCritical: "गंभीर", tribeTaskFilterAll: "सभी", tribeMediaFilterAll: "सभी", - tribeReportCatBug: "बग", - tribeReportCatAbuse: "दुरुपयोग", - tribeReportCatContent: "सामग्री", - tribeReportCatOther: "अन्य", tribeForumCatGeneral: "सामान्य", tribeForumCatProposal: "प्रस्ताव", tribeForumCatQuestion: "प्रश्न", tribeForumCatAnnouncement: "घोषणा", - tribeMarketCatGoods: "सामान", - tribeMarketCatServices: "सेवाएँ", - tribeMarketCatFood: "भोजन", - tribeMarketCatOther: "अन्य", tribeStatusLabel: "स्थिति", tribeSubTribes: "उप-जनजातियाँ", tribeSubTribesCreate: "उप-जनजाति बनाएँ", tribeSubTribesStrictDenied: "जनजाति का सख्त मोड आपको नई उप-जनजातियाँ बनाने की अनुमति नहीं देता। कृपया प्रशासक से संपर्क करें।", - tribeSubTribesEmpty: "अभी तक कोई उप-जनजाति नहीं बनाई गई।", - tribeActivityJoined: "शामिल हुए", - tribeActivityLeft: "छोड़ दिया", - tribeActivityFeed: "फ़ीड", tribeActivityRefeed: "रीफ़ीड", - tribeGroupAnalytics: "विश्लेषिकी", - tribeGroupCreative: "रचनात्मक", tribeSectionActivity: "गतिविधि", tribeSectionTrending: "ट्रेंडिंग", - tribeSectionOpinions: "राय", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "टैग", tribeSectionSearch: "खोज", tribeActivityEmpty: "अभी तक कोई गतिविधि नहीं।", @@ -2242,25 +1943,15 @@ module.exports = { tribeTrendingPeriodWeek: "इस सप्ताह", tribeTrendingPeriodAll: "सभी समय", tribeTrendingEngagement: "सहभागिता", - tribeOpinionsEmpty: "अभी तक कोई राय नहीं।", - tribeOpinionsCast: "मत दें", - tribeOpinionsRankings: "रैंकिंग", - tribeOpinionsAlreadyVoted: "पहले ही मतदान किया", tribeTopCategory: "अधिक मतदान", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "सहयोगी पिक्सेल कला कैनवास।", - tribePixeliaPaint: "रंग भरें", - tribePixeliaContributors: "योगदानकर्ता", - tribePixeliaTotalPixels: "रंगे गए पिक्सेल", tribeTagsEmpty: "कोई टैग नहीं मिला।", - tribeTagsCloud: "टैग क्लाउड", - tribeTagsContentWith: "टैग वाली सामग्री", tribeSearchPlaceholder: "जनजाति सामग्री खोजें...", tribeSearchEmpty: "कोई परिणाम नहीं मिला।", tribeSearchResults: "परिणाम", tribeSearchMinChars: "खोजने के लिए कम से कम 2 अक्षर दर्ज करें।", agendaTitle: "एजेंडा", agendaDescription: "यहाँ आप अपने सभी सौंपे गए आइटम पा सकते हैं।", + agendaSearchPlaceholder: "एजेंडा खोजें...", agendaFilterAll: "सभी", agendaFilterToday: "आज", agendaFilterUpcoming: "आगामी", @@ -2279,20 +1970,9 @@ module.exports = { agendaFilterProjects: "परियोजनाएँ", agendaFilterCalendars: "कैलेंडर", agendaNoItems: "कोई सौंपे गए आइटम नहीं मिले।", - agendaAuthor: "द्वारा", agendaDiscardButton: "निरस्त करें", agendaRestoreButton: "पुनर्स्थापित करें", - agendaCreatedAt: "बनाया गया", - agendaTitleLabel: "शीर्षक", agendaMembersCount: "सदस्य", - agendaDescriptionLabel: "विवरण", - agendaStatus: "स्थिति", - agendaVisibility: "दृश्यता", - agendaEventDate: "कार्यक्रम तिथि", - agendaEventLocation: "स्थान", - agendaEventPrice: "मूल्य", - agendaEventUrl: "URL", - agendaTaskStart: "प्रारंभ समय", agendaLocationLabel: "स्थान", agendaYes: "हाँ", agendaNo: "नहीं", @@ -2302,11 +1982,6 @@ module.exports = { agendareportCategory: "श्रेणी", agendareportSeverity: "गंभीरता", agendareportStatus: "स्थिति", - agendareportDescription: "विवरण", - agendaTaskEnd: "समाप्ति समय", - agendaTaskPriority: "प्राथमिकता", - agendaTransferFrom: "से", - agendaTransferTo: "को", agendaTransferConcept: "अवधारणा", agendaTransferAmount: "राशि", agendaTransferDeadline: "समय सीमा", @@ -2316,47 +1991,7 @@ module.exports = { voteNow: "अभी मतदान करें", alreadyVoted: "आपने पहले ही राय दे दी है।", noOpinionsFound: "कोई राय नहीं मिली।", - RECENTButton: "हाल के", TOPButton: "शीर्ष", - interestingButton: "दिलचस्प", - necessaryButton: "आवश्यक", - funnyButton: "मज़ेदार", - disgustingButton: "घृणित", - sensibleButton: "समझदार", - propagandaButton: "प्रचार", - adultOnlyButton: "केवल वयस्क", - boringButton: "उबाऊ", - confusingButton: "भ्रमित करने वाला", - usefulButton: "उपयोगी", - informativeButton: "सूचनाप्रद", - wellResearchedButton: "अच्छी तरह शोधित", - accurateButton: "सटीक", - needsSourcesButton: "स्रोत चाहिए", - wrongButton: "गलत", - lowQualityButton: "निम्न गुणवत्ता", - creativeButton: "रचनात्मक", - insightfulButton: "अंतर्दृष्टिपूर्ण", - actionableButton: "कार्रवाई योग्य", - inspiringButton: "प्रेरणादायक", - loveButton: "प्यार", - clearButton: "स्पष्ट", - upliftingButton: "उत्थानकारी", - unnecessaryButton: "अनावश्यक", - rejectedButton: "अस्वीकृत", - misleadingButton: "भ्रामक", - offTopicButton: "विषय से हटकर", - duplicateButton: "डुप्लिकेट", - clickbaitButton: "क्लिकबेट", - spamButton: "स्पैम", - trollButton: "ट्रोल", - nsfwButton: "NSFW", - violentButton: "हिंसक", - toxicButton: "विषाक्त", - harassmentButton: "उत्पीड़न", - hateButton: "घृणा", - scamButton: "धोखाधड़ी", - triggeringButton: "उत्तेजक", - opinionsCreatedAt: "बनाया गया", opinionsTotalCount: "कुल राय", voteInteresting: "दिलचस्प", voteNecessary: "आवश्यक", @@ -2393,7 +2028,6 @@ module.exports = { voteCreative: "रचनात्मक", voteSpam: "स्पैम", voteAdultOnly: "केवल वयस्क", - publishBlog: "ब्लॉग प्रकाशित करें", privateMessage: "PM", pmSendTitle: "निजी संदेश", pmSend: "भेजें!", @@ -2404,7 +2038,6 @@ module.exports = { pmComposeTitle: "संदेश भेजें", pmRecipients: "प्राप्तकर्ता", pmRecipientsHint: "अल्पविराम से अलग Oasis IDs दर्ज करें", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "प्रति संदेश अधिकतम 7 प्राप्तकर्ता।", pmTextPlaceholder: "मुख्य पाठ 7000 वर्णों तक सीमित।", pmSubject: "विषय", @@ -2428,7 +2061,6 @@ module.exports = { pmCrypterCharsLabel: "अक्षर", pmInvalidRecipients: "अमान्य Oasis ID (यह @…=.ed25519 जैसा होना चाहिए)।", pmEncryptionLabel: "एन्क्रिप्शन", - pmFile: "संलग्नक", private: "निजी", privateDescription: "आपके एन्क्रिप्टेड संदेश।", privateInbox: "इनबॉक्स", @@ -2438,10 +2070,8 @@ module.exports = { noPrivateMessages: "कोई निजी संदेश नहीं।", pmFromLabel: "से:", pmToLabel: "को:", - pmInvalidMessage: "अमान्य संदेश", pmNoSubject: "(कोई विषय नहीं)", pmSubjectLabel: "विषय:", - pmBodyLabel: "मुख्य भाग", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2459,8 +2089,6 @@ module.exports = { inboxJobSubscribedTitle: "आपके नौकरी प्रस्ताव के लिए नई सदस्यता", pmInhabitantWithId: "OASIS ID वाला निवासी:", pmHasSubscribedToYourJobOffer: "ने आपके नौकरी प्रस्ताव की सदस्यता ली है", - inboxProjectCreatedTitle: "नई परियोजना बनाई गई", - pmHasCreatedAProject: "ने एक परियोजना बनाई है", inboxMarketItemSoldTitle: "आइटम बिक गया", inboxShopSoldTitle: "उत्पाद बिका", pmYourItem: "आपका आइटम", @@ -2470,7 +2098,6 @@ module.exports = { pmHasPledged: "ने प्रतिज्ञा की है", pmToYourProject: "आपकी परियोजना को", blockchain: 'BlockExplorer', - blockchainTitle: 'BlockExplorer', blockchainDescription: 'ब्लॉकचेन में ब्लॉक खोजें और विज़ुअलाइज़ करें।', blockchainNoBlocks: 'ब्लॉकचेन में कोई ब्लॉक नहीं मिला।', blockchainStatsTitle: 'आँकड़े', @@ -2482,19 +2109,17 @@ module.exports = { blockchainBlockCarbon: 'कार्बन फुटप्रिंट', blockchainBlockType: 'प्रकार', blockchainBlockTimestamp: 'टाइमस्टैम्प', - blockchainBlockContent: 'ब्लॉक', - blockchainBlockURL: 'URL:', - blockchainContent: 'ब्लॉक', - blockchainContentPreview: 'ब्लॉक सामग्री का पूर्वावलोकन', blockchainLatestDatagram: 'नवीनतम डेटाग्राम', - blockchainDatagram: 'डेटाग्राम', - blockchainDetails: 'ब्लॉक विवरण देखें', - blockchainViewBlockexplorer: "ब्लॉकएक्सप्लोरर में देखें", - blockchainBlockInfo: 'ब्लॉक जानकारी', - blockchainBlockDetails: 'चयनित ब्लॉक का विवरण', + blockchainDatagram: "डेटाग्राम", + blockchainDetails: "ब्लॉक विवरण देखें", + blockchainViewBlockexplorer: "Blockexplorer में देखें", blockchainBack: 'BlockExplorer पर वापस जाएँ', blockchainContentDeleted: "यह सामग्री टॉम्बस्टोन कर दी गई है", visitContent: "सामग्री देखें", + favoriteAdd: "पसंदीदा में पिन करें", + pmContentTooltip: "निजी संदेश भेजें", + favoriteRemove: "पसंदीदा से हटाएँ", + reportContent: "सामग्री की रिपोर्ट करें", banking: 'बैंकिंग', bankingTitle: 'बैंकिंग', bankingDescription: "ECOin अर्थव्यवस्था: शेष, यूबीआई, कर और उद्योग मूल्य।", @@ -2503,21 +2128,17 @@ module.exports = { bankRules: 'नियम', pending: 'लंबित', closed: 'बंद', - bankBack: 'बैंकिंग पर वापस जाएँ', bankViewTx: 'Tx देखें', bankClaimNow: 'अभी दावा करें', bankClaimUBI: 'UBI का दावा करें!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'इस अवधि के लिए कोई लंबित UBI आवंटन नहीं।', bankEpoch: 'युग', bankPool: 'पूल (यह युग)', bankWeightsSum: 'भारों का योग', - bankAllocations: 'आवंटन', bankNoAllocations: 'कोई आवंटन नहीं मिला।', bankNoEpochs: 'कोई युग नहीं मिला।', bankEpochAllocations: 'युग आवंटन', @@ -2536,9 +2157,6 @@ module.exports = { bankYourFundsMonth: "आपकी निधि (इस माह)", bankIndustryBalance: "औद्योगिक उत्पादन (अनुमानित)", bankUserBalance: 'आपका शेष', - ecoWalletNotConfigured: 'ECOin वॉलेट कॉन्फ़िगर नहीं है', - editWallet: 'वॉलेट संपादित करें', - addWallet: 'वॉलेट जोड़ें', bankAddresses: 'पते', bankNoAddresses: 'कोई पता नहीं मिला।', bankUser: 'Oasis ID', @@ -2563,15 +2181,7 @@ module.exports = { search: 'खोजें!', bankLocal: 'स्थानीय', bankFromOasis: 'Oasis', - bankMyAddress: 'आपका पता', - bankRemoveMyAddress: 'मेरा पता हटाएँ', - bankNotRemovableOasis: 'पते स्थानीय रूप से नहीं हटाए जा सकते', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "कोई धन नहीं!", bankUbiAvailableOk: "उपलब्ध!", bankUbiAvailability: "UBI (नेटवर्क)", @@ -2588,13 +2198,6 @@ module.exports = { shopsTitle: "दुकानें", shopDescription: "नेटवर्क में दुकानें खोजें और प्रबंधित करें।", shopTitle: "दुकान", - shopFilterAll: "सभी", - shopFilterMine: "मेरी", - shopFilterRecent: "हालिया", - shopFilterTop: "शीर्ष", - shopFilterProducts: "उत्पाद", - shopFilterPrices: "मूल्य", - shopFilterFavorites: "पसंदीदा", shopUpload: "दुकान बनाएं", shopAllSectionTitle: "सभी दुकानें", shopMineSectionTitle: "मेरी दुकानें", @@ -2611,16 +2214,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Clearnet पर प्रकाशित करें", - shopClearnetUnpublish: "Clearnet से हटाएं", - shopClearnetUrlLabel: "Clearnet URL", - shopClearnetWarning: "Clearnet पर प्रकाशित करने से यह दुकान बाहरी सर्च इंजन और क्रॉलर द्वारा अनुक्रमणीय हो जाती है।", shopAddFavorite: "पसंदीदा जोड़ें", shopRemoveFavorite: "पसंदीदा हटाएं", shopOpen: "खुली", shopClosed: "बंद", - shopOpenShop: "दुकान खोलें", - shopCloseShop: "दुकान बंद करें", shopMakePrivate: "निजी बनाएं (E2E)", shopMakePublic: "सार्वजनिक बनाएं", shopProducts: "उत्पाद", @@ -2648,8 +2245,6 @@ module.exports = { shopOrderPrice: "मूल्य", shopOrderBuyer: "खरीदार", shopBackToShop: "दुकान पर वापस", - shopShareUrl: "शेयर URL", - shopVisitShop: "दुकान देखें", marketVisitItem: "आइटम देखें", shopStatus: "स्थिति", shopCreatedAt: "बनाया गया", @@ -2658,12 +2253,10 @@ module.exports = { shopLocation: "स्थान", shopTags: "टैग", shopVisibility: "दृश्यता", - shopImage: "छवि", shopShortDescription: "संक्षिप्त विवरण", shopShortDescriptionPlaceholder: "दुकान कार्ड के लिए संक्षिप्त विवरण (अधिकतम 160 अक्षर)", shopTitlePlaceholder: "आपकी दुकान का नाम", shopDescriptionPlaceholder: "आपकी दुकान का विस्तृत विवरण", - shopUrlPlaceholder: "https://aapki-dukan-url.com", shopLocationPlaceholder: "शहर, देश", shopTagsPlaceholder: "टैग1, टैग2, टैग3", mapTitlePlaceholder: "मानचित्र शीर्षक", @@ -2681,7 +2274,6 @@ module.exports = { bankUnitMinutes: "मिनट", bankUnitDays: "दिन", bankExchangeNoData: 'कोई डेटा उपलब्ध नहीं', - bankExchangeIndex: 'ECOin मूल्य (1h)', bankInflation: 'ECOin मुद्रास्फीति (anual)', bankInflationMonthly: 'ECOin मुद्रास्फीति (mensual)', bankExchangeChartTitle: 'समय के साथ ECOin मूल्य की प्रगति', @@ -2695,38 +2287,17 @@ module.exports = { bankingSyncStatusOutdated: 'पुराना', statsTitle: 'सांख्यिकी', statistics: "सांख्यिकी", - statsInhabitant: "निवासी सांख्यिकी", statsDescription: "अपने नेटवर्क के बारे में सांख्यिकी खोजें।", ALLButton: "सभी", MINEButton: "मेरे", TOMBSTONEButton: "टॉम्बस्टोन", - statsYou: "आप", - statsUserId: "Oasis ID", statsCreatedAt: "बनाया गया", statsYourContent: "सामग्री", statsYourOpinions: "राय", - statsYourTombstone: "टॉम्बस्टोन", - statsNetwork: "नेटवर्क", - statsTotalInhabitants: "निवासी", - statsDiscoveredTribes: "जनजातियाँ (सार्वजनिक)", - statsPrivateDiscoveredTribes: "जनजातियाँ (निजी)", statsNetworkContent: "सामग्री", - statsYourMarket: "बाज़ार", - statsYourJob: "नौकरियाँ", - statsYourProject: "परियोजनाएँ", - statsYourTransfer: "स्थानांतरण", - statsYourForum: "मंच", statsNetworkOpinions: "राय", - statsDiscoveredMarket: "बाज़ार", - statsDiscoveredJob: "नौकरियाँ", - statsDiscoveredProject: "परियोजनाएँ", - statsBankingTitle: "बैंकिंग", statsEcoWalletLabel: "ECOIN वॉलेट", statsEcoWalletNotConfigured: "कॉन्फ़िगर नहीं!", - statsTotalEcoAddresses: "कुल पते", - statsDiscoveredTransfer: "स्थानांतरण", - statsDiscoveredForum: "मंच", - statsNetworkTombstone: "टॉम्बस्टोन", statsBookmark: "बुकमार्क", statsEvent: "कार्यक्रम", statsTask: "कार्य", @@ -2748,16 +2319,12 @@ module.exports = { statsAiExchange: "AI", statsPUBs: 'PUBs', statsPost: "पोस्ट", - statsOasisID: "Oasis ID", statsSize: "कुल (आकार)", statsBlockchainSize: "ब्लॉकचेन (आकार)", statsBlobsSize: "ब्लॉब (आकार)", statsActivity7d: "गतिविधि (पिछले 7 दिन)", statsActivity7dTotal: "7-दिन कुल", statsActivity30dTotal: "30-दिन कुल", - statsKarmaScore: "कर्म स्कोर", - statsPublic: "सार्वजनिक", - statsPrivate: "निजी", day: "दिन", messages: "संदेश", statsProject: "परियोजनाएँ", @@ -2769,30 +2336,14 @@ module.exports = { statsProjectsCancelled: "रद्द", statsProjectsGoalTotal: "कुल लक्ष्य", statsProjectsPledgedTotal: "कुल प्रतिज्ञा", - statsProjectsSuccessRate: "सफलता दर", - statsProjectsAvgProgress: "औसत प्रगति", - statsProjectsMedianProgress: "मध्यांश प्रगति", - statsProjectsActiveFundingAvg: "औसत सक्रिय वित्तपोषण", - statsJobsTitle: "नौकरियाँ", - statsJobsTotal: "कुल नौकरियाँ", - statsJobsOpen: "खुली", - statsJobsClosed: "बंद", - statsJobsOpenVacants: "खुली रिक्तियाँ", - statsJobsSubscribersTotal: "कुल सदस्य", - statsJobsAvgSalary: "औसत वेतन", - statsJobsMedianSalary: "मध्यांश वेतन", statsMarketTitle: "बाज़ार", statsMarketTotal: "कुल आइटम", statsMarketForSale: "बिक्री के लिए", statsMarketReserved: "आरक्षित", statsMarketClosed: "बंद", statsMarketSold: "बेचा गया", - statsMarketRevenue: "राजस्व", - statsMarketAvgSoldPrice: "औसत बिक्री मूल्य", statsUsersTitle: "निवासी", user: "निवासी", - statsTombstoneTitle: "टॉम्बस्टोन", - statsNetworkTombstones: "नेटवर्क टॉम्बस्टोन", statsTombstoneRatio: "टॉम्बस्टोन अनुपात (%)", statsParliamentCandidature: "संसद उम्मीदवारी", statsParliamentTerm: "संसद कार्यकाल", @@ -2819,30 +2370,21 @@ module.exports = { aiConfiguration: "प्रॉम्प्ट सेट करें", aiPromptUsed: "प्रॉम्प्ट", aiClearHistory: "चैट इतिहास साफ़ करें", - aiSharePrompt: "यह उत्तर सामूहिक प्रशिक्षण में जोड़ें?", - aiShareYes: "हाँ", - aiShareNo: "नहीं", - aiSharedLabel: "प्रशिक्षण में जोड़ा गया", - aiRejectedLabel: "प्रशिक्षण में नहीं जोड़ा गया", aiServerError: "AI उत्तर नहीं दे सका। कृपया पुनः प्रयास करें।", aiInputPlaceholder: "Oasis क्या है?", typeAiExchange: "AI", aiApproveTrain: "सामूहिक प्रशिक्षण में जोड़ें", aiRejectTrain: "प्रशिक्षण न करें", - aiTrainPending: "अनुमोदन लंबित", aiTrainApproved: "प्रशिक्षण के लिए अनुमोदित", aiTrainRejected: "प्रशिक्षण के लिए अस्वीकृत", aiSnippetsUsed: "उपयोग किए गए अंश", aiSnippetsLearned: "सीखे गए अंश", statsAITraining: "AI प्रशिक्षण", - aiApproveCustomTrain: "इस कस्टम उत्तर का उपयोग करके प्रशिक्षित करें", aiCustomAnswerPlaceholder: "अपना कस्टम उत्तर लिखें…", - statsAIExchanges: "मॉडल आदान-प्रदान", marketMineSectionTitle: "आपके आइटम", marketCreateSectionTitle: "आइटम बनाएँ", marketUpdateSectionTitle: "अपडेट", marketAllSectionTitle: "बाज़ार", - marketRecentSectionTitle: "हाल का बाज़ार", marketTitle: "बाज़ार", marketDescription: "अपने नेटवर्क में सामान या सेवाओं के आदान-प्रदान के लिए एक बाज़ार।", marketFilterAll: "सभी", @@ -2872,14 +2414,11 @@ module.exports = { marketItemDeadline: "समय सीमा", marketItemIncludesShipping: "शिपिंग शामिल है?", marketItemHighestBid: "सबसे ऊँची बोली", - marketItemHighestBidder: "सबसे ऊँची बोली लगाने वाला", marketItemStock: "स्टॉक", marketOutOfStock: "स्टॉक में नहीं", - marketItemBidTime: "बोली समय", marketActionsUpdate: "अपडेट", marketUpdateButton: "अपडेट", marketActionsDelete: "हटाएँ", - marketActionsSold: "बिका हुआ चिह्नित करें", marketActionsChangeStatus: "स्थिति बदलें", marketActionsBuy: "खरीदें!", marketAuctionBids: "वर्तमान बोलियाँ", @@ -2888,21 +2427,17 @@ module.exports = { marketNoItems: "अभी तक कोई आइटम उपलब्ध नहीं।", marketYourBid: "आपकी बोली", marketCreateFormImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", - marketSearchLabel: "खोज", marketSearchPlaceholder: "शीर्षक या टैग खोजें", marketMinPriceLabel: "न्यूनतम मूल्य", marketMaxPriceLabel: "अधिकतम मूल्य", - marketSortLabel: "क्रमबद्ध करें", marketSortRecent: "सबसे हाल का", marketSortPrice: "मूल्य", marketSortDeadline: "समय सीमा", marketSearchButton: "खोजें", marketAuctionEndsIn: "समाप्त होता है", marketAuctionEnded: "समाप्त हो गया", - marketMyBidBadge: "आपकी बोली", marketNoItemsMatch: "आपकी खोज से कोई आइटम मेल नहीं खाता।", housingTitle: "आवास", - housingLabel: "आवास", housingDescriptionText: "अपने नेटवर्क में जगहें खोजें और प्रबंधित करें।", modulesHousingLabel: "आवास", modulesHousingDescription: "जगहें खोजने और प्रबंधित करने का मॉड्यूल।", @@ -2946,14 +2481,7 @@ module.exports = { housingAvailableFrom: "से उपलब्ध", housingAvailableTo: "तक उपलब्ध", housingTags: "टैग", - housingImages: "तस्वीरें (अधिकतम: 50MB प्रत्येक)", - housingRemovePhoto: "हटाएं", spreadEditWarning: "संपादित करने पर यह सामग्री अपने स्प्रेड खो देगी", - housingRemoveVideo: "वीडियो हटाएं", - housingAddPhoto: "फ़ोटो जोड़ें", - housingAddVideo: "वीडियो जोड़ें", - housingVideo: "वीडियो (अधिकतम: 50MB)", - housingPhotos: "तस्वीरें", housingRequests: "अनुरोध", housingRequestButton: "अनुरोध करें", housingCancelButton: "अनुरोध रद्द करें", @@ -3022,7 +2550,6 @@ module.exports = { jobLocationPresencial: "स्थानीय", jobLocationRemote: "दूरस्थ", jobVacantsPlaceholder: "पदों की संख्या", - jobSalaryPlaceholder: "1 समर्पित घंटे के लिए ECO में वेतन", jobImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", jobTasks: "कार्य", jobType: "नौकरी प्रकार", @@ -3032,7 +2559,6 @@ module.exports = { jobsFilterTop: "शीर्ष", jobsTopTitle: "शीर्ष वेतन नौकरियाँ", createJobButton: "नौकरी प्रकाशित करें", - viewDetailsButton: "विवरण देखें", noJobsFound: "कोई नौकरी प्रस्ताव नहीं मिला।", jobAuthor: "द्वारा", jobTypeFreelance: "फ्रीलांसर", @@ -3044,10 +2570,6 @@ module.exports = { jobsHoursOffered: "दिए गए घंटे", jobsHoursRequested: "बदले में माँगे गए घंटे", jobsExchangeSkill: "बदले में चाहिए कौशल", - jobsHoursOfferedPlaceholder: "जैसे 4", - jobsHoursRequestedPlaceholder: "जैसे 4", - jobsExchangeSkillPlaceholder: "जैसे बढ़ईगिरी, डिज़ाइन", - jobExchangeHint: "घंटों के आदान-प्रदान वाली नौकरियों के लिए, वेतन के बजाय नीचे के फ़ील्ड भरें।", jobTimePartial: "अंशकालिक", jobTimeComplete: "पूर्णकालिक", jobsDeleteButton: "हटाएँ", @@ -3055,28 +2577,17 @@ module.exports = { jobsFilterApplied: "आवेदित", jobsAppliedTitle: "मेरे आवेदन", jobsAppliedBadge: "आवेदित", - jobsFilterFavs: "पसंदीदा", - jobsFavsTitle: "पसंदीदा", - jobsFilterNeeds: "मदद चाहिए", - jobsNeedsTitle: "मदद चाहिए", - jobsSearchLabel: "खोज", jobsSearchPlaceholder: "शीर्षक, टैग, विवरण खोजें...", jobsMinSalaryLabel: "न्यूनतम वेतन", jobsMaxSalaryLabel: "अधिकतम वेतन", - jobsSortLabel: "क्रमबद्ध करें", jobsSortRecent: "सबसे हाल का", jobsSortSalary: "सबसे अधिक वेतन", jobsSortSubscribers: "सबसे अधिक आवेदक", jobsSearchButton: "खोजें", - jobsFavoriteButton: "पसंदीदा", - jobsUnfavoriteButton: "पसंदीदा हटाएँ", - jobsMessageAuthorButton: "PM", jobsApplicants: "आवेदक", jobsUpdatedAt: "अपडेट किया गया", jobSetOpen: "खुली सेट करें", - jobNewBadge: "नया", jobsTagsLabel: "टैग", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "आपकी खोज से कोई नौकरी मेल नहीं खाती।", industrySearchPlaceholder: "फैक्टरियाँ खोजें…", industryAllSectors: "सभी क्षेत्र", @@ -3084,9 +2595,7 @@ module.exports = { industryAdvanceTo: "पर सेट करें", industryAmount: "राशि", industryApproveBuild: "मंज़ूर करें", - industryBackToFacility: "← फैक्टरी", industryBlueprint: "ब्लूप्रिंट", - industryBlueprintLabel: "उद्योग ब्लूप्रिंट", industryBlueprints: "ब्लूप्रिंट", industryBuild: "बिल्ड", industryBuildNotes: "नोट्स", @@ -3099,18 +2608,13 @@ module.exports = { industryBuilds: "बिल्ड्स", industryBuildTitle: "शीर्षक", industryContribute: "योगदान करें", - industryContributeEco: "ECO योगदान करें", - industryContributeLabor: "श्रम योगदान करें", industryContributeButton: "योगदान करें", - industryContributeMaterial: "सामग्री योगदान करें", industryContributions: "योगदान", - industryContributors: "योगदानकर्ता", industryCreateBlueprintButton: "ब्लूप्रिंट बनाएं", industryDistribute: "वितरण करें", industryDistributeButton: "हिस्सों के अनुसार वितरण", industryDistribution: "वितरण", industryEcoAmount: "राशि (ECO)", - industryEcoContribHint: "ECO योगदान बिल्ड के कोष के संरक्षक के रूप में प्रबंधक को स्थानांतरित किए जाते हैं।", industryEditBlueprint: "ब्लूप्रिंट संपादित करें", industryFacility: "फैक्टरी", industryKindLabel: "प्रकार", @@ -3119,13 +2623,10 @@ module.exports = { industryKind_eco: "निधि", industryLaborHours: "श्रम (घंटे)", industryHours: "घंटे", - industryLicense: "लाइसेंस", industryMaterialItem: "सामग्री", industryMaterials: "सामग्री", - industryMaterialsHint: "प्रति पंक्ति एक सामग्री, प्रारूप नाम:मात्रा:मूल्य।", industryEstMaterials: "कुल सामग्री", industryEstLabor: "कुल श्रम", - industryEstTaxes: "कर", industryEstTotal: "अनुमानित मूल्य", industryBuildingPrice: "निर्माण मूल्य", industryFinalPrice: "अंतिम मूल्य", @@ -3135,19 +2636,13 @@ module.exports = { industryNewBlueprint: "नया ब्लूप्रिंट", industryNewBuild: "बिल्ड प्रस्तावित करें", industryEditBuild: "उत्पादन संपादित करें", - industryNoBlueprint: "— कोई नहीं —", industryNeedBlueprint: "पहले ब्लूप्रिंट बनाएँ: हर उत्पादन उसी को बनाता है।", industryNoBlueprints: "अभी तक कोई ब्लूप्रिंट नहीं।", industryNoBuilds: "अभी तक कोई बिल्ड नहीं।", industryNote: "नोट", industryOutput: "आउटपुट", - industryOutputItem: "उत्पाद का नाम", industryOutputKind: "उत्पाद का प्रकार", - industryOutputQty: "प्रति उत्पादन इकाइयाँ", - industryOutputUnit: "माप की इकाई", industryOutputValue: "आउटपुट मूल्य (ECO, जैसे बिक्री से)", - industryPayout: "भुगतान", - industryPoints: "Karma", industryPostJob: "नौकरी बनाएँ", industryPot: "कोष", industryProposeBuildButton: "बिल्ड प्रस्तावित करें", @@ -3155,8 +2650,6 @@ module.exports = { industryAuthor: "लेखक", industrySellOnMarket: "बाज़ार में भेजें", industrySendToProjects: "प्रोजेक्ट बनाएँ", - industryShare: "हिस्सा", - industryShares: "हिस्से", industrySkills: "कौशल", industryTreasury: "कोष", industryKind_physical: "भौतिक", @@ -3170,6 +2663,16 @@ module.exports = { industryBuildStatus_FAILED: "विफल", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "एक नौकरी आपके CV से मेल खाती है", + jobsBotMatchIntro: "एक नौकरी आपके CV से मेल खाती है।", + jobsBotMatchJob: "नौकरी", + jobsBotMatchHint: "यह इसलिए मिला क्योंकि आपका CV AI द्वारा प्रबंधित है। आप इसे CV में बंद कर सकते हैं।", + cvAiManaged: "AI प्रबंधित", + switchOn: "चालू", + switchOff: "बंद", + cvAiManagedHint: "चालू होने पर, JobsBot निजी संदेश से बताता है जब कोई नौकरी आपके CV से मेल खाती है।", + cvMatchThreshold: "इस मेल स्तर से सूचित करें", housingBotRequestedTitle: "किसी ने आपकी एक जगह का अनुरोध किया है।", housingBotCancelledTitle: "आपकी एक जगह का अनुरोध रद्द कर दिया गया है।", housingBotYouRequestedTitle: "आपने एक जगह का अनुरोध किया।", @@ -3198,22 +2701,14 @@ module.exports = { industryRulesDistribution: "उत्पादन पूरा होने पर स्टीवर्ड पॉट (उत्पादन की निधि और बिक्री मूल्य) को योगदानकर्ताओं में उनके हिस्से के अनुपात में बाँटता है।", industryRulesTreasury: "ECO योगदान वितरण तक प्रबंधक द्वारा बिल्ड कोष के संरक्षक के रूप में रखे जाते हैं; सभी लेन-देन नेटवर्क पर दर्ज होते हैं और विवाद Courts में जा सकते हैं।", industryJobs: "नौकरियाँ", - industryNoJobs: "अभी तक कोई पद नहीं।", - industryCreatePosition: "पद बनाएं", - industryViewCV: "सीवी", industryReportButton: "रिपोर्ट", industryCreateTask: "कार्य बनाएँ", industryOpenDispute: "विवाद खोलें", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "जैसे इकाई, kg, लाइसेंस", - industryOutputItemPlaceholder: "जैसे robot", - industryOutputQtyPlaceholder: "जैसे 5", - industrySkillsPlaceholder: "जैसे सोल्डरिंग, नेटवर्किंग, सौर-स्थापना", industryCreateInvite: "आमंत्रण उत्पन्न करें", industryPauseVotes: "स्थिति मत", industryTitle: "उद्योग", industryDescription: "उत्पादन के साधनों को सामूहिक रूप से प्रबंधित करने का मॉड्यूल।", - industryLabel: "उद्योग", typeIndustryBuild: "बिल्ड", typeIndustryBlueprint: "ब्लूप्रिंट", typeIndustryAllocation: "वितरण", @@ -3262,9 +2757,7 @@ module.exports = { industryInviteNeeded: "शामिल होने के लिए आपको आमंत्रण चाहिए।", industryPauseButton: "रोकने के लिए मतदान", industryResumeButton: "फिर से शुरू करने के लिए मतदान", - industryEditButton: "संपादित करें", industryDeleteButton: "हटाएं", - industryBackToList: "← उद्योग", industryPendingApplicants: "लंबित आवेदक", industryVotesYes: "हाँ", industryVotesNo: "नहीं", @@ -3272,23 +2765,13 @@ module.exports = { industryAdmit: "स्वीकार करें", industryReject: "अस्वीकार करें", industryDissolveTitle: "फैक्टरी विघटित करें", - industryDissolveHint: "विघटन के लिए सामूहिक मतदान आवश्यक है; प्रबंधक अकेले विघटित नहीं कर सकता।", industryDissolveVote: "विघटन के लिए मतदान", - industrySector_software: "सॉफ्टवेयर", - industrySector_hardware: "हार्डवेयर", - industrySector_agriculture: "कृषि", - industrySector_textile: "वस्त्र", - industrySector_energy: "ऊर्जा", - industrySector_food: "खाद्य", - industrySector_construction: "निर्माण", - industrySector_media: "मीडिया", - industrySector_services: "सेवाएं", - industrySector_other: "अन्य", industryPolicy_open: "खुला", industryPolicy_vote: "मतदान से", industryPolicy_invite: "केवल आमंत्रण", projectsTitle: "परियोजनाएँ", projectsDescription: "अपने नेटवर्क में समुदाय-संचालित परियोजनाएँ बनाएँ, वित्तपोषित करें और अनुसरण करें।", + projectSearchPlaceholder: "परियोजनाएँ खोजें...", projectCreateProject: "परियोजना बनाएँ", projectCreateButton: "परियोजना बनाएँ", projectUpdateButton: "अपडेट", @@ -3332,14 +2815,8 @@ module.exports = { projectPledgeTitle: "इस परियोजना का समर्थन करें", projectPledgePlaceholder: "ECO में राशि", projectBounties: "इनाम", - projectBountiesInputLabel: "इनाम (प्रति पंक्ति एक: शीर्षक|राशि [ECO]|विवरण)", - projectBountiesPlaceholder: "UI बग ठीक करें|100|समस्या का लिंक\nडॉक्स लिखें|250|उपयोग उदाहरण रूपरेखा", projectNoBounties: "कोई इनाम नहीं मिला।", projectTitle: "शीर्षक", - projectAddBountyTitle: "नया इनाम", - projectBountyTitle: "इनाम शीर्षक", - projectBountyAmount: "राशि (ECO)", - projectBountyDescription: "विवरण", projectMilestoneSelect: "मील का पत्थर चुनें", projectBountyCreateButton: "इनाम बनाएँ", projectBountyStatus: "इनाम स्थिति", @@ -3354,19 +2831,15 @@ module.exports = { projectMilestoneTitle: "मील का पत्थर शीर्षक", projectMilestoneTargetPercent: "प्रतिशत (%)", projectMilestoneDueDate: "दिनांक", - projectMilestoneCreateButton: "मील का पत्थर बनाएँ", projectMilestoneStatus: "मील का पत्थर स्थिति", projectMilestoneOpen: "खुला", projectMilestoneDone: "पूर्ण", projectMilestoneDue: "देय", - projectNoMilestones: "कोई मील का पत्थर नहीं मिला।", projectMilestoneMarkDone: "पूर्ण चिह्नित करें", projectMilestoneTitlePlaceholder: "मील का पत्थर शीर्षक दर्ज करें", projectMilestoneDescriptionPlaceholder: "इस मील के पत्थर का विवरण दर्ज करें", projectMilestoneDescription: "मील का पत्थर विवरण", - projectBudgetGoal: "बजट (लक्ष्य)", projectBudgetAssigned: "इनामों को सौंपा गया", - projectBudgetRemaining: "शेष", projectBudgetOver: "बजट से अधिक: सौंपा गया लक्ष्य से अधिक है", projectFollowers: "अनुसरणकर्ता", projectFollowersTitle: "अनुसरणकर्ता", @@ -3379,7 +2852,6 @@ module.exports = { projectBackersTotalPledged: "कुल प्रतिज्ञा", projectBackersYourPledge: "आपकी प्रतिज्ञा", projectBackersNone: "अभी तक कोई प्रतिज्ञा नहीं।", - projectNoRemainingBudget: "कोई शेष बजट नहीं।", projectFilterBackers: "समर्थक", projectFilterApplied: "आवेदित", projectAppliedTitle: "आवेदित", @@ -3388,30 +2860,15 @@ module.exports = { projectBackerAmount: "कुल योगदान", projectBackerPledges: "प्रतिज्ञाएँ", projectBackerProjects: "परियोजनाएँ", - projectPledgeAmount: "राशि", projectSelectMilestoneOrBounty: "मील का पत्थर या इनाम चुनें", projectPledgeButton: "प्रतिज्ञा करें", footerLicense: "GPLv3", - footerPackage: "पैकेज", - footerVersion: "संस्करण", modulesModuleName: "नाम", modulesModuleDescription: "विवरण", modulesModuleStatus: "स्थिति", modulesTotalModulesLabel: "लोड किए गए मॉड्यूल", modulesEnabledModulesLabel: "सक्षम", modulesDisabledModulesLabel: "अक्षम", - modulesPopularLabel: "लोकप्रिय", - modulesPopularDescription: "ट्रेंडिंग, सबसे अधिक देखी गई या सबसे अधिक टिप्पणी की गई पोस्ट प्राप्त करने का मॉड्यूल।", - modulesTopicsLabel: "विषय", - modulesTopicsDescription: "साझा रुचियों पर आधारित चर्चा श्रेणियाँ प्राप्त करने का मॉड्यूल।", - modulesSummariesLabel: "सारांश", - modulesSummariesDescription: "लंबी चर्चाओं या पोस्ट के सारांश प्राप्त करने का मॉड्यूल।", - modulesLatestLabel: "नवीनतम", - modulesLatestDescription: "सबसे हाल की पोस्ट और चर्चाएँ प्राप्त करने का मॉड्यूल।", - modulesThreadsLabel: "थ्रेड्स", - modulesThreadsDescription: "विषय या प्रश्न के अनुसार समूहीकृत बातचीत प्राप्त करने का मॉड्यूल।", - modulesMultiverseLabel: "मल्टीवर्स", - modulesMultiverseDescription: "अन्य संघीय पीयर से सामग्री प्राप्त करने का मॉड्यूल।", modulesInvitesLabel: "आमंत्रण", modulesInvitesDescription: "आमंत्रण कोड प्रबंधित और लागू करने का मॉड्यूल।", modulesWalletLabel: "वॉलेट", @@ -3452,8 +2909,12 @@ module.exports = { modulesOpinionsDescription: "राय खोजने और मतदान करने का मॉड्यूल।", modulesTransfersLabel: "स्थानांतरण", modulesTransfersDescription: "स्मार्ट-कॉन्ट्रैक्ट (स्थानांतरण) खोजने और प्रबंधित करने का मॉड्यूल।", - modulesFediverseLabel: "फ़ेडिवर्स", - modulesFediverseDescription: "अपने अन्य फ़ेडिवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।", + modulesFediverseLabel: "मल्टीवर्स", + modulesBlogsLabel: "ब्लॉग", + modulesBlogsDescription: "ब्लॉग खोजने और प्रबंधित करने का मॉड्यूल।", + modulesPollsLabel: "सर्वेक्षण", + modulesPollsDescription: "नेटवर्क से पूछने और उत्तर गिनने का मॉड्यूल।", + modulesFediverseDescription: "अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।", modulesFeedLabel: "फ़ीड", modulesFeedDescription: "लघु-पाठ (फ़ीड) खोजने और साझा करने का मॉड्यूल।", modulesParliamentLabel: "संसद", @@ -3489,37 +2950,33 @@ module.exports = { visibilityMakeHidden: "छिपाएँ", invitesInhabitantsTitle: "निवासी", invitesInhabitantsFollow: "फॉलो करें", - aiNavPlaceholder: "आप कहाँ जाना चाहते हैं?", + aiNavPlaceholder: "बताएँ आपको क्या चाहिए...", aiNavDisabled: "AI नेविगेशन अक्षम है।", - aiNavResultsTitle: "AI नेविगेशन सुझाव", + aiNavResultsTitle: "AINav सुझाव", aiNavQueryLabel: "प्रश्न", - aiNavResultsDescription: "अपने अनुरूप मार्ग चुनें।", - aiNavResultPath: "मार्ग", - aiNavResultDescription: "क्या किया जा सकता है", aiNavResultMatch: "मेल", aiNavResultsEmpty: "कोई मेल खाता मार्ग नहीं। /search आज़माएँ।", - aiNavSearchInstead: "इसके बजाय खोजें", modulesAINavLabel: "AINav", modulesAINavDescription: "नेटवर्क की सामग्री पर प्राकृतिक भाषा में प्रश्न करने का मॉड्यूल।", - directConnect: "सीधा कनेक्शन", directConnectDescription: "किसी पीयर से सीधे कनेक्ट करने के लिए उनका IP पता, पोर्ट और सार्वजनिक कुंजी दर्ज करें। पीयर को एक अनुसरित कनेक्शन के रूप में जोड़ा जाएगा।", peerHost: "IP", peerPort: "पोर्ट (डिफ़ॉल्ट: 8008)", peerPublicKey: "सार्वजनिक कुंजी (@...ed25519)", connectAndFollow: "कनेक्ट करें", - deviceSourceLabel: "डिवाइस स्रोत", modulesPresetTitle: "सामान्य कॉन्फ़िगरेशन", - modulesPreset_minimal: "न्यूनतम", - modulesPreset_basic: "बुनियादी", - modulesPreset_social: "सामाजिक", - modulesPreset_economy: "अर्थव्यवस्था", - modulesPreset_full: "पूर्ण", + workflowsTitle: "वर्कफ़्लो", + workflowsDescription: "वर्कफ़्लो थीम और सक्रिय मॉड्यूल तय करता है।", + workflowsSet: "वर्कफ़्लो लागू करें", + workflow_default: "डिफ़ॉल्ट", + workflow_jobs: "रोज़गार", + workflow_ruling: "शासन", + workflow_politics: "राजनीति", + workflow_social: "सामाजिक", + workflow_business: "व्यापार", + workflow_night: "रात", + workflow_mobile: "मोबाइल", statsCarbonFootprintTitle: "कार्बन फुटप्रिंट", - statsCarbonFootprintNetwork: "नेटवर्क कार्बन फुटप्रिंट", - statsCarbonFootprintYours: "आपका कार्बन फुटप्रिंट", statsCarbonTombstone: "टॉम्बस्टोनिंग फुटप्रिंट", - feedSuccessMsg: "फ़ीड सफलतापूर्वक प्रकाशित!", - dominantOpinionLabel: "प्रमुख राय", uploadMedia: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", feedOpenDiscussion: "चर्चा खोलें", feedDetailTitle: "फ़ीड", @@ -3552,14 +3009,13 @@ module.exports = { mapDescriptionLabel: "विवरण", mapDescriptionPlaceholder: "मानचित्र या स्थान का वर्णन करें...", mapTypeLabel: "मानचित्र प्रकार", - mapTypeSingle: "एकल (केवल प्रारंभिक स्थान)", - mapTypeOpen: "खुला (कोई भी मार्कर जोड़ सकता है)", - mapTypeClosed: "बंद (केवल निर्माता मार्कर जोड़ता है)", + mapInviteMode: "आमंत्रण", + mapTypeSingle: "एकल", + mapTypeOpen: "खुला", + mapTypeClosed: "बंद", mapTagsLabel: "टैग", mapTagsPlaceholder: "अल्पविराम से अलग टैग दर्ज करें", mapUrlLabel: "मानचित्र URL", - mapPickCoordLabel: "या ग्रिड पर स्थान चुनें:", - mapMarkersLabel: "मार्कर", mapMarkersTitle: "मार्कर", mapMarkerDefault: "मार्कर", mapMarkerLatLabel: "मार्कर अक्षांश", @@ -3586,14 +3042,9 @@ module.exports = { padTitle: "पैड", modulesPadsLabel: "पैड्स", modulesPadsDescription: "सहयोगी पाठ संपादकों को प्रबंधित करने का मॉड्यूल।", - padFilterAll: "सभी", - padFilterMine: "मेरे", - padFilterRecent: "हालिया", - padFilterOpen: "खुला", - padFilterClosed: "बंद", padCreate: "पैड बनाएं", - padUpdate: "पैड अपडेट करें", - padDelete: "पैड हटाएं", + padUpdate: "अपडेट करें", + padDelete: "हटाएं", padTitleLabel: "शीर्षक", padTitlePlaceholder: "पैड का शीर्षक दर्ज करें...", padStatusLabel: "स्थिति", @@ -3604,14 +3055,7 @@ module.exports = { padTagsLabel: "टैग", padTagsPlaceholder: "टैग1, टैग2, ...", padMembersLabel: "सदस्य", - padVisitPad: "पैड देखें", - padShareUrl: "URL साझा करें", padCreated: "बनाया गया", - padAuthor: "लेखक", - padGenerateCode: "कोड बनाएं", - padInviteCodeLabel: "आमंत्रण कोड", - padInviteCodePlaceholder: "आमंत्रण कोड दर्ज करें...", - padValidateInvite: "सत्यापित करें", padStartEditing: "संपादन शुरू करें!", padEditorPlaceholder: "लिखना शुरू करें...", padSubmitEntry: "सबमिट करें", @@ -3624,12 +3068,11 @@ module.exports = { padClosedSectionTitle: "बंद पैड्स", padCreateSectionTitle: "नया पैड बनाएं", padUpdateSectionTitle: "पैड अपडेट करें", - padInviteGenerated: "आमंत्रण कोड बनाया गया", typePad: "पैड्स", padNew: "नया", padAddFavorite: "पसंदीदा में जोड़ें", padRemoveFavorite: "पसंदीदा से हटाएं", - padClose: "पैड बंद करें", + padClose: "बंद करें", padBackToEditor: "संपादक पर वापस", padSearchPlaceholder: "पैड खोजें...", @@ -3637,8 +3080,6 @@ module.exports = { modulesChatsDescription: "एन्क्रिप्टेड चैट खोजने और प्रबंधित करने का मॉड्यूल।", typeChat: "चैट्स", typeChatMessage: "चैट संदेश", - chatLabel: "चैट्स", - chatMessageLabel: "चैट संदेश", chatsTitle: "चैट्स", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3646,56 +3087,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "विवरण", - chatMessageReply: "उत्तर", - chatMessageLabel: "संदेश", chatCategory: "श्रेणी", chatStatus: "स्थिति", - chatFilterAll: "सभी", - chatFilterMine: "मेरे", - chatFilterRecent: "हाल के", - chatFilterFavorites: "पसंदीदा", - chatFilterOpen: "खुले", - chatFilterClosed: "बंद", chatCreate: "चैट बनाएं", - chatUpdate: "चैट अपडेट करें", - chatDelete: "चैट हटाएं", + chatUpdate: "अपडेट", + chatDelete: "हटाएं", chatClose: "चैट बंद करें", chatVisitChat: "चैट देखें", chatUntitled: "बिना शीर्षक चैट", chatNoItems: "कोई चैट नहीं मिली।", chatParticipants: "प्रतिभागी", - chatStartChatting: "चैट शुरू करें!", - chatGenerateCode: "कोड बनाएं", - chatShareUrl: "URL शेयर करें", + chatMessagesLabel: "संदेश", + chatThreadsLabel: "थ्रेड", chatCreatedAt: "बनाया गया", chatSearchPlaceholder: "चैट खोजें...", chatStatusOpen: "खुला", chatStatusInviteOnly: "केवल आमंत्रण", chatStatusClosed: "बंद", chatSendMessage: "भेजें", + chatJumpLatest: "नवीनतम संदेश", + chatPickChat: "खोलने के लिए एक चैट चुनें", + chatNoneYet: "अभी तक कोई चैट उपलब्ध नहीं है।", + activitySearchPlaceholder: "गतिविधि में खोजें...", + trendingSearchPlaceholder: "ट्रेंडिंग में खोजें...", + opinionsSearchPlaceholder: "राय में खोजें...", + votesSearchPlaceholder: "मतदान में खोजें...", + welcomeStepUxTitle: "अपना इंटरफ़ेस चुनें", + welcomeStepUxText: "तय करें Oasis कैसा दिखे। बाद में सेटिंग्स में बदल सकते हैं।", + welcomeStepUxAction: "यह दृश्य उपयोग करें", + chatRateLimitTitle: "बहुत अधिक संदेश", + chatRateLimitMessage: "आप इस कक्ष की प्रति घंटा संदेश सीमा तक पहुँच गए हैं। बाद में पुनः प्रयास करें।", chatMessagePlaceholder: "संदेश लिखें...", chatNoMessages: "अभी तक कोई संदेश नहीं।", - chatLeave: "चैट छोड़ें", - chatInviteCodeLabel: "आमंत्रण कोड दर्ज करें", - chatJoinByInvite: "शामिल हों", chatTitlePlaceholder: "चैट का शीर्षक", chatDescriptionPlaceholder: "चैट का विवरण", chatTagsPlaceholder: "टैग1, टैग2", chatImageLabel: "छवि फ़ाइल चुनें (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "आमंत्रण कोड", chatAuthor: "लेखक", - chatCreated: "बनाया", chatAddFavorite: "पसंदीदा में जोड़ें", chatRemoveFavorite: "पसंदीदा से हटाएं", chatPM: "PM", chatStatusLabel: "स्थिति", chatCategoryLabel: "श्रेणी", - chatParticipantsLabel: "प्रतिभागी", gamesTitle: "खेल", gamesDescription: "कुछ खेल खोजें और खेलें।", gamesFilterAll: "सभी", gamesPlayButton: "खेलें!", - gamesBackToGames: "खेलों पर वापस जाएं", modulesGamesLabel: "खेल", modulesGamesDescription: "कुछ खेल खोजने और खेलने का मॉड्यूल।", modulesGraphosLabel: "ग्राफोस", @@ -3712,8 +3149,6 @@ module.exports = { gamesArkanoidDesc: "अपने पैडल और गेंद से सभी ईंटें तोड़ें। एक क्लासिक आर्केड चुनौती।", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "AI के खिलाफ क्लासिक पिंग-पोंग। 5 पॉइंट पहले पाने वाला जीतता है।", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "समय के खिलाफ दौड़! यातायात से बचें और समय से पहले मंजिल पर पहुंचें।", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "क्षुद्रग्रह क्षेत्र में अपना यान उड़ाएं। उन्हें आने से पहले नष्ट करें।", gamesRockPaperScissorsTitle: "पत्थर कागज कैंची", @@ -3734,8 +3169,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3746,12 +3179,6 @@ module.exports = { modulesCalendarsLabel: "कैलेंडर", modulesCalendarsDescription: "कैलेंडर खोजने और प्रबंधित करने का मॉड्यूल।", typeCalendar: "कैलेंडर", - calendarFilterAll: "सभी", - calendarFilterMine: "मेरे", - calendarFilterOpen: "खुला", - calendarFilterClosed: "बंद", - calendarFilterRecent: "हाल के", - calendarFilterFavorites: "पसंदीदा", calendarCreate: "कैलेंडर बनाएं", calendarUpdate: "अपडेट करें", calendarDelete: "हटाएं", @@ -3764,24 +3191,17 @@ module.exports = { calendarTagsLabel: "टैग", calendarTagsPlaceholder: "टैग1, टैग2...", calendarParticipantsLabel: "प्रतिभागी", - calendarParticipantsCount: "प्रतिभागी", - calendarVisitCalendar: "कैलेंडर देखें", calendarCreated: "बनाया गया", - calendarAuthor: "लेखक", calendarJoin: "जुड़ें", calendarGenerateInvite: "आमंत्रण बनाएं", - calendarInviteCodePlaceholder: "आमंत्रण कोड दर्ज करें...", - calendarValidateInvite: "कोड सत्यापित करें", - calendarJoined: "जुड़े हुए", - calendarAddDate: "तारीख जोड़ें", - calendarAddNote: "नोट जोड़ें", calendarDateLabel: "तारीख", calendarDatePlaceholder: "इस तारीख का वर्णन करें...", - calendarNoteLabel: "नोट", + calendarNoteLabel: "नोट्स", calendarNotePlaceholder: "नोट जोड़ें...", calendarFirstDateLabel: "तारीख", calendarFirstNoteLabel: "नोट्स", calendarIntervalLabel: "Interval", + calendarIntervalNone: "कोई पुनरावृत्ति नहीं", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3792,8 +3212,6 @@ module.exports = { calendarsDescription: "अपने नेटवर्क में कैलेंडर खोजें और प्रबंधित करें।", calendarMonthPrev: "← पिछला", calendarMonthNext: "अगला →", - calendarMonthLabel: "तारीखें", - calendarsShareUrl: "शेयर URL", calendarAllSectionTitle: "कैलेंडर", calendarRecentSectionTitle: "हाल के कैलेंडर", calendarFavoritesSectionTitle: "पसंदीदा", @@ -3807,7 +3225,6 @@ module.exports = { calendarRemoveFavorite: "पसंदीदा से हटाएं", calendarSearchPlaceholder: "कैलेंडर खोजें...", calendarAddEntry: "प्रविष्टि जोड़ें", - calendarLeave: "कैलेंडर छोड़ें", statsCalendar: "कैलेंडर", statsCalendarDate: "कैलेंडर तारीखें", statsCalendarNote: "कैलेंडर नोट", @@ -3854,7 +3271,6 @@ module.exports = { torrentSortOldest: "सबसे पुराने", torrentSortTop: "सबसे अधिक वोट", torrentNoMatch: "कोई मिलान टॉरेंट नहीं।", - torrentMessageAuthorButton: "लेखक को संदेश भेजें", torrentUpdatedAt: "अपडेट किया गया", statsTorrent: "टॉरेंट", typeTorrent: "टॉरेंट", @@ -3862,10 +3278,18 @@ module.exports = { modulesTorrentsDescription: "टॉरेंट खोजने और प्रबंधित करने का मॉड्यूल।", favoritesFilterTorrents: "टॉरेंट", favoritesFilterMarket: "मार्केट", + favoritesFilterEvents: "इवेंट्स", + favoritesFilterForum: "फ़ोरम", + favoritesFilterHousing: "आवास", + favoritesFilterJobs: "नौकरियाँ", + favoritesFilterProjects: "परियोजनाएँ", + favoritesFilterReports: "रिपोर्ट्स", + favoritesFilterTasks: "कार्य", + favoritesFilterTransfers: "स्थानांतरण", + favoritesFilterVotes: "मतदान", favoritesFilterShopProducts: "दुकान वस्तुएं", tribeSectionTorrents: "टॉरेंट", tribeCreateTorrent: "टॉरेंट अपलोड करें", - tribeMediaTypeTorrent: "टॉरेंट", settingsWishTitle: "इच्छा", settingsWishDesc: "अपने अवतार की इच्छा कॉन्फ़िगर करें।", settingsWishWhole: "Multiverse", @@ -3876,16 +3300,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "आउटबाउंड UX गार्डरेल है। इनबाउंड ध्यान फ़िल्टर है।", - pmBlockedNonMutual: "केवल पारस्परिक समर्थन वाले निवासियों को PM भेज सकते हैं।", inhabitantsPendingFollowsTitle: "लंबित समर्थन अनुरोध", inhabitantsPendingAccept: "स्वीकार", inhabitantsPendingReject: "अस्वीकार", - bxEncrypted: "एन्क्रिप्टेड", - bxEncryptedHexLabel: "सिफरटेक्स्ट (पूर्वावलोकन)", tribeSectionGovernance: "शासन", - tribeSubStatusPublic: "सार्वजनिक", - tribeSubStatusPrivate: "निजी", - tribeSubInheritedPrivate: "निजी (मुख्य जनजाति से विरासत)", tribePadInviteRequired: "पैड तक पहुंच नहीं। निमंत्रण मांगें।", tribeChatInviteRequired: "चैट तक पहुंच नहीं। निमंत्रण मांगें।", tribeGovernanceDesc: "इस जनजाति का आंतरिक शासन।", @@ -3925,44 +3343,31 @@ module.exports = { tribeGovNoHistorical: "अभी तक कोई रिकॉर्ड नहीं", logsTitle: "लॉग", logsDescription: "नेटवर्क पर अपना अनुभव रिकॉर्ड करें।", - logsReadMore: "और पढ़ें", logsViewTitle: "लॉग", logsColumnType: "प्रकार", logsView: "देखें", - logsManualPrompt: "अपनी लॉग लिखें", logsUpdateButton: "अपडेट करें", - logsEditTitle: "प्रविष्टि संपादित करें", - logsCreateDescription: "अपना अनुभव रिकॉर्ड करें...", + logsEditTitle: "लॉग अपडेट करें", logsCreateTitle: "प्रविष्टि बनाएँ", logsWriteButton: "लिखें", logsTextPlaceholder: "अपने अनुभव वर्णित करें...", - logsTextField: "पाठ", - logsLabelPlaceholder: "लेबल...", - logsLabelField: "अपनी लॉग लिखें (लेबल)", - logsAiDisabledWarn: "एआई लिखित लॉग के लिए /modules में एआई मॉड्यूल सक्षम करें।", - logsAiContextValue: "ब्लॉकचेन दिन", - logsAiContext: "संदर्भ", - logsAiModStatus: "AImod", - logsModeApply: "लागू करें!", logsModeAIWritten: "AI-Assistant", logsModeManual: "मैन्युअल", logsModeAI: "एआई", - logsColumnDelete: "हटाएँ", - logsColumnEdit: "संपादित करें", logsColumnLog: "लॉग", logsColumnDate: "दिनांक", logsDelete: "हटाएँ", - logsEdit: "संपादित करें", + logsEdit: "अपडेट करें", logsFilterAlways: "हमेशा", logsFilterYear: "पिछला वर्ष", logsFilterMonth: "पिछला महीना", logsFilterWeek: "पिछला सप्ताह", logsFilterToday: "आज", - logsFilterRecent: "हाल के", - logsFilterAll: "सभी", + logsComments: "टिप्पणियाँ", + logsAuthorEntries: "प्रविष्टियाँ", logsCreate: "प्रविष्टि बनाएँ", logsExport: "लॉग निर्यात करें", - logsExportOne: "निर्यात", + logsExportOne: "लॉग निर्यात करें", logsViewDetails: "विवरण देखें", logsGenerateButton: "पाठ जनरेट करें", logsSearchText: "लॉग में खोजें...", @@ -3972,31 +3377,25 @@ module.exports = { modulesLogsLabel: "लॉग", modulesLogsDescription: "(एआई सहायक के माध्यम से) अपने अनुभव रिकॉर्ड करने के लिए मॉड्यूल।", statsLogsTitle: "लॉग", - statsLogsEntries: "प्रविष्टियाँ", typeLog: "लॉग", - blockchainCycle: "चक्र", larpTitle: "L.A.R.P.", larpDescription: "सहयोगात्मक प्रयोग के लिए एक लाइव-एक्शन रोल-प्लेइंग परत।", + larpNoHousesMatch: "आपकी खोज से कोई हाउस मेल नहीं खाता।", + larpSearchPlaceholder: "हाउस खोजें...", larpAllHouses: "गृह:", larpFilterRuling: "शासन", larpFilterHouses: "गृह", larpFilterRules: "FAQ", larpRulesTitle: "L.A.R.P. FAQ", - larpRulesEntryTitle: "प्रारंभिक गृह", larpRulesEntryText: "हर निवासी डिफ़ॉल्ट रूप से ACADEMIA में शुरू होता है। ACADEMIA से, \"गृह में शामिल हों\" पैनल में कोई गृह चुनें: इससे उसका प्रवेश परीक्षण खुलता है। 10 प्रश्नों के उत्तर दें और सबमिट करें। यदि आप सीमा (7/10) पार करते हैं, तो आपको स्वचालित रूप से उस गृह में स्वीकार कर लिया जाता है; नहीं तो अस्वीकार कर ACADEMIA में रखा जाता है। दोनों ही मामलों में सिस्टम आपके OasisID और प्रयास के चक्र को दर्ज करता है और 30 चक्रों के कूलडाउन समाप्त होने तक पुनः प्रयास से रोकता है।", - larpRulesLeaveText: "किसी भी गृह के सदस्य अपने गृह पृष्ठ से कभी भी ACADEMIA में लौट सकते हैं; इससे उनकी सदस्यता रीसेट हो जाती है, परंतु परीक्षण कूलडाउन समाप्त नहीं होता।", - larpRulesGovernanceTitle: "शासन दीवार", larpRulesGovernanceText: "अपने चक्र के दौरान, शासक गृह \"शासन\" बैज पहनता है और एकमात्र है जिसकी दीवार शासन टैब के तहत सार्वजनिक रूप से दिखाई जाती है।", - larpRulesSignTitle: "L.A.R.P. प्रतीक", + larpRulesWallText: "हर घर की एक दीवार होती है जहाँ उसके सदस्य लिखते हैं। किसी घर की दीवार निजी होती है, सिवाय शासक घर और ACADEMIA की, जिन्हें कोई भी पढ़ सकता है।", larpRulesSignText: "निवासी इसे चालू कर सकते हैं (/profile/edit > सेंसर) ताकि उनके वर्तमान गृह की छवि उनके प्रोफ़ाइल, लेखक और निवासी कार्ड पर मुहर के रूप में दिखे। मुहर गृह पृष्ठ से जुड़ी होती है।", larpPostsTitle: "दीवार", larpPostsEmpty: "अभी कोई पोस्ट नहीं।", - larpPostLabel: "नई पोस्ट", larpPostPlaceholder: "यह गृह क्या कहना चाहता है?", - larpPostPublic: "सार्वजनिक (किसी को भी दिखे, अन्यथा केवल सदस्यों को)", larpPostSubmit: "प्रकाशित करें", - larpPostMembersOnly: "केवल सदस्य", larpCycleLabel: "चक्र:", audioBackToBcs: "Back to BCS", audioFilterBcs: "BCS", @@ -4113,12 +3512,9 @@ module.exports = { bankTaxesLookupNote: "अपने स्थानीय फ़ीड में देखने के लिए ब्लॉक ID दर्ज करें।", bankTaxesUserNoteChipsClick: "ब्लॉकexplorer में इसके ब्लॉक का निरीक्षण करने के लिए किसी भी चिप पर क्लिक करें।", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "आमंत्रण कोड", larpRulesInviteEntryText: "गृह सदस्य आमंत्रण कोड बना सकते हैं जो गृह तक सीधी पहुंच देते हैं।", larpRulesOneHouseText: "आप किसी भी समय अधिकतम एक गृह से संबंध रख सकते हैं। यदि आप किसी से संबंधित नहीं हैं, तो आप ACADEMIA में हैं। हर गैर-ACADEMIA गृह पृष्ठ अपने सदस्यों को \"गृह छोड़ें\" बटन दिखाता है जो सदस्यता को ACADEMIA पर रीसेट कर देता है। छोड़ने से परीक्षण कूलडाउन समाप्त नहीं होता।", - larpRulesOneHouseTitle: "एक समय में एक गृह", - larpRulesTestEntry: "WILL परीक्षण", - larpRulesTestEntryText: "प्रत्येक विकल्प एक या अधिक गृहों को वज़न देता है; जमा करने पर, सिस्टम अंकों को जोड़ता है और आपको सबसे अधिक अंक वाले गृह में स्वत: स्वीकार करता है।", + larpRulesTestEntryText: "WILL परीक्षण में हर विकल्प एक या अधिक घरों को भार देता है; भेजने पर सिस्टम अंक जोड़ता है और सबसे अधिक अंक वाले घर में आपको स्वतः प्रवेश देता है।", larpWillTestHint: "पूरा होने पर, आपको वह गृह सौंपा जाएगा जो आपके उत्तरों के साथ सबसे अच्छा मेल खाता है। आपके व्यक्तिगत उत्तरों को स्थानीय रूप से संसाधित किया जाता है और कभी संग्रहीत नहीं किया जाता — केवल परिणामी गृह असाइनमेंट आपकी फ़ीड पर प्रकाशित होता है।", larpWillTestTitle: "WILL परीक्षण", settingsLanDesc: "इस पीयर को समय-समय पर उसी स्थानीय नेटवर्क में अन्य Oasis इंस्टेंस को घोषित करें। UDP प्रसारण रोकने के लिए अक्षम करें।", @@ -4137,31 +3533,27 @@ module.exports = { aiExchangeMarkHelpful: "+1 सहायक", larpCyclesUntilRuling: "अगला शासन चक्र", larpVisitTribe: "जनजाति देखें", + larpStartJourney: "यात्रा शुरू करें", larpGoverning: "शासन:", + larpStartHere: "यहाँ से शुरू करें:", larpMyHouse: "मेरा गृह:", larpMembersCount: "सदस्य", - larpMembersTitle: "सदस्य", - larpNoMembers: "अभी कोई सदस्य नहीं।", larpRolesLabel: "भूमिकाएँ", larpFunctionLabel: "कार्य", larpMonthLabel: "शासन चक्र", larpLeaveToAcademia: "ACADEMIA लौटें", - larpAcademiaJoinTitle: "गृह में शामिल हों", - larpAcademiaJoinHint: "मनोवैज्ञानिक प्रोफ़ाइल परीक्षण दें ताकि आपको आपके लिए सबसे उपयुक्त गृह सौंपा जाए, या किसी गृह सदस्य द्वारा साझा किया गया आमंत्रण कोड भुनाएँ।", - larpTakeTestButton: "प्रोफ़ाइल परीक्षण दें", + larpAcademiaJoinTitle: "L.A.R.P. गृह", larpInviteRedeem: "गृह में शामिल हों", larpInviteCreate: "आमंत्रण कोड बनाएँ", larpInvitePlaceholder: "आमंत्रण कोड", larpInviteBannerTitle: "नया आमंत्रण कोड", larpInviteBannerHint: "इस कोड को ACADEMIA में किसी के साथ साझा करें। यह 30 चक्रों या एक उपयोग के बाद समाप्त हो जाता है।", - larpTestAssignedHouse: "नियत गृह", larpTestRankingTitle: "गृह के अनुसार स्कोर", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "गृह आमंत्रण कोड", invitesHouseJoinButton: "गृह में शामिल हों", larpLastAttemptTitle: "आपका पिछला प्रयास", larpLastAttemptHouse: "गृह", - larpLastAttemptResult: "परिणाम", larpLastAttemptWhen: "कब", larpLastAttemptCooldown: "अगला प्रयास", larpTestTitle: "प्रवेश परीक्षण", @@ -4170,37 +3562,14 @@ module.exports = { larpTestCooldownActive: "अगला परीक्षण उपलब्ध", larpTestCooldownDays: "चक्र", larpTestResultTitle: "परीक्षण परिणाम", - larpTestPassed: "परीक्षण पास — स्वागत है!", - larpTestFailed: "परीक्षण पास नहीं हुआ", larpTestScore: "स्कोर", larpTestNextAttempt: "आप 30 चक्रों के बाद एक और परीक्षण दे सकते हैं।", larpGoToHouse: "अपने गृह पर जाएँ", larpBackToAcademia: "ACADEMIA लौटें", - larpBackToHouses: "◀ गृह", larpBadgeYou: "आप", larpBadgeRuling: "शासन", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Oasis की लाइव-एक्शन रोल-प्लेइंग परत (9 गृह) के लिए मॉड्यूल।", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - ecoinTaxLabel: "ECOin Tax", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - statsEcoTaxTitle: "ECO Tax", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - audioBackToAudio: "Back to audio", - audioAuthorLabel: "Author", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "जब आप किसी जटिल समस्या का सामना करते हैं, तो पहले क्या करते हैं?", larpProfileQ1O1: "सहमति खोजने के लिए दूसरों से बात करना", larpProfileQ1O2: "परीक्षण के लिए प्रोटोटाइप बनाना", diff --git a/src/client/assets/translations/oasis_it.js b/src/client/assets/translations/oasis_it.js index ddbe490..e30d008 100644 --- a/src/client/assets/translations/oasis_it.js +++ b/src/client/assets/translations/oasis_it.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { it: { - languageName: "Italiano", shopOrderStatusPaid: "Pagamento ricevuto", shopOrderStatusReceived: "Ricevuto", shopOrderMarkPaid: "Segna pagamento ricevuto", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Non hai ancora acquisti.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Venditore", - shopOrderPaymentConcept: "Pagamento", shopOrderInvoice: "Fattura", shopOrderInvoiceConcept: "Fattura", shopOrderStatusPending: "In attesa", shopOrderStatusAccepted: "Accettato", shopOrderStatusRejected: "Rifiutato", shopOrderStatusShipped: "Spedito", - shopOrderStatusDelivered: "Consegnato", shopOrderAccept: "Accetta", shopOrderReject: "Rifiuta", shopOrderMarkShipped: "Segna spedito", - shopOrderMarkDelivered: "Segna consegnato", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Contratto", shopOrderContractConcept: "Ordine negozio", shopOrdersPending: "Ordini in sospeso", all: "Tutti", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Vedi JSON", matchScore: "Punteggio di corrispondenza", preferencesLabel: "Preferenze", - inhabitantProfileTitle: "Profilo abitante", + inhabitantProfileTitle: "Abitante", contentWarningLabel: "Avviso sul contenuto", invalidPost: "Contenuto non valido", invalidPostHint: "Questo messaggio ha testo vuoto/non valido.", spreadBy: "Da", spreadChron: "Diffusione", spreaded: "Diffuso", - spreadMore: "altro", spreadContentUnavailable: "Contenuto non ancora disponibile (replica in sospeso)", filteredByTag: "Filtrato per tag", filteredByTagTitle: "Filtrato per tag", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Nessuna gravità", calendarDeleteDate: "Elimina data", calendarIntervalUntil: "Fino a", - bookmarkCategory: "Categoria", bookmarkLastVisit: "Ultima visita", profileClearnetBookmarksLabel: "Segnalibri", - forumFilterHot: "Caldi", invitesPort: "Porta", currentlyUnrecheable: "ERRORE!", peerHostValidation: "IPv4 valido (es. 192.168.1.100) o hostname (es. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Stima max annuale", statsCarbonNetwork: "Totale rete", statsCarbonOfEstMax: "della capacità max stimata", + statsCarbonYearProgress: "dell'anno trascorso", + statsNetworkTitle: "Rete", + statsStorageTitle: "Archiviazione", + statsEcoTaxTitle: "Tassa ECO", + statsAccountTitle: "Account", + statsAveragesTitle: "Medie", statsCarbonOfNetwork: "del totale della rete", statsCarbonUser: "La tua impronta", statsContentCountColumn: "Conteggio", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Tag principali", statsTopTypesTitle: "Tipi di contenuto principali", statsTotalMsgs: "Messaggi totali", - feedViewDetails: "Vedi dettagli", - eventFileLabel: "Allega immagine", - taskFileLabel: "Allega immagine", - courtsRespondentRequired: "L'ID del convenuto è obbligatorio", extended: "Multiverso", extendedDescription: [ "Quando supporti qualcuno, puoi scaricare i post degli abitanti che supportano, e questi appaiono qui, ordinati per data.", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "Mostrando", graphosYou: "Tu", graphosTotalNodes: "Nodi totali", - manualMode: "Modalità manuale", mentions: "Menzioni", mentionsDescription: [ - strong("Post che ti @menzionano"), - ", ordinati per data.", + strong("Ogni messaggio che ti @menziona"), + ".", ], - nextPage: "Avanti", - previousPage: "Indietro", noMentions: "Non hai ancora ricevuto @menzioni.", + mentionsSearchPlaceholder: "Cerca menzioni...", privateReminders: "PROMEMORIA", inboxFiltersLabel: "Filtri:", inboxToggleToMutuals: "Passa a reciproci", inboxToggleToWhole: "Passa a tutti", - privateFrom: "Da", - privateTo: "A", privateDate: "Data", pmReply: "Rispondi", pmReplies: "risposte", - pmNew: "nuove", - pmMarkRead: "Segna come letto", inReplyTo: "IN RISPOSTA A", pmPreview: "Anteprima", pmPreviewTitle: "Anteprima messaggio", peers: "Peer", searchDescription: "Descrizione", - imageSearch: "Ricerca immagini", searchFromLabel: "Da", searchToLabel: "A", - searchMinOpinionsLabel: "Min opinioni", - searchInhabitantLabel: "Abitante (Oasis ID)", searchQueryLabel: "Ricerca", searchPerPageLabel: "Risultati per pagina", settings: "Impostazioni", @@ -244,67 +229,38 @@ module.exports = { melodyTitle: 'Melody', melodyDescription: 'Riproduce la melodia della tua blockchain — ogni blocco diventa una nota.', melodyEmpty: 'Nessuna nota ancora — la tua blockchain non ha ancora prodotto blocchi.', - melodyCompositionHelp: 'Ogni blocco della tua blockchain diventa una nota musicale in base al tipo e alla dimensione.', - melodyStatsTitle: 'Suddivisione per tipo', - melodyInhabitantLabel: 'Abitante', melodyTotalBlocks: 'Note', - melodyType: 'Tipo', - melodyCount: 'Blocchi', melodyFilterAll: 'TUTTE', - melodyFilterShare: 'Carica melodia', - melodyShareTitle: 'Condividi la tua melodia', - melodyShareHelp: 'Pubblica un’istantanea della tua melodia attuale per farla ascoltare e remixare ad altri.', - melodyShareTitleLabel: 'Titolo (opzionale)', - melodyShareTitlePlaceholder: 'Un fantasma di blockchain', - melodyShareSubmit: 'Pubblica melodia', - melodyNoShared: 'Nessuna melodia di blockchain ancora.', melodyRegenerate: 'Rigenera', melodyDownload: "Scarica BCS", - profileActivityTitle: 'Attività', - profileActivityMore: 'Vedi tutta l’attività', profileContentSectionTitle: 'Contenuto dell’Avatar', profileContentHelp: 'Scegli quali moduli mostrare nel tuo avatar.', profileSensorsHelp: 'Metriche opzionali mostrate nel tuo avatar.', profileClearnetHelp: 'Moduli accessibili dall’esterno di Oasis.', profileHubAll: 'Tutto', - profileHubTitle: 'Contenuto Pubblico', - footerPulseTitle: 'Pulse', - footerPulsePeers: 'Peer', - footerPulseInbox: 'Inbox', - footerPulseSync: 'Ultima sinc.', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Ultima attività', footerLicenseLabel: 'Licenza', profileSwitchToOasis: 'Torna a Oasis', - profileSwitchToClearnet: 'Immergiti in Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Tuffati nel fediverso", - coordLabel: 'Coordinate (es. A3)', - coordPlaceholder: 'Inserisci coordinata', + profileVisibilityFediverse: "Multiverso", contributorsTitle: "Contributori", - pixeliaBy: "di", colorLabel: 'Scegli un colore', paintButton: 'Dipingi!', - invalidCoordinate: 'Coordinata errata', - goToMuralButton: "Vedi murale", totalPixels: 'Pixel totali', modules: "Moduli", modulesViewTitle: "Moduli", modulesViewDescription: "Configura il tuo ambiente attivando o disattivando i moduli.", inbox: "Posta in arrivo", multiverse: "Multiverso", - fediverse: "Fediverse", - fediverseDescription: "Gestisci i tuoi altri account del fediverso, inclusi l'invio e la ricezione di contenuti.", + fediverse: "Multiverso", + fediverseDescription: "Gestisci i tuoi altri account del multiverso, inclusi l'invio e la ricezione di contenuti.", fediverseStatus: "Stato", - fediverseDisconnected: "Fediverso disconnesso. Controlla %LINK% o lo stato della connessione.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiverso disconnesso. Controlla %LINK% o lo stato della connessione.", + fediverseSettingsTitle: "Multiverso", fediverseInstanceLabel: "Indirizzo", fediverseTokenLabel: "Token di accesso", fediverseTokenHelp: "Imposta il tuo token di accesso. Sarà usato per gestire il tuo account Mastodon da Oasis.", fediverseConnect: "Connetti", fediverseConnectedAs: "Connesso come", fediverseDisconnect: "Disconnetti", - fediverseEmpty: "Quando colleghi altri account del fediverso dalle %LINK%, puoi gestirli da qui.", fediverseEmptyLink: "impostazioni", fediverseComposePlaceholder: "A cosa stai pensando?", fediverseReplyPlaceholder: "Scrivi la tua risposta…", @@ -313,21 +269,15 @@ module.exports = { fediverseReply: "Rispondi", fediverseBoosted: "ha rilanciato", fediverseNoPosts: "La tua timeline è vuota.", - fediverseThread: "Discussione", fediverseTimeline: "Cronologie", - fediverseManageTimeline: "Gestisci la cronologia", fediverseFollowers: "Follower", fediverseFollowing: "Seguiti", fediversePosts: "Post", fediverseJoined: "Iscritto", - fediverseOverview: "Panoramica", fediverseRefresh: "Aggiorna", fediverseWrite: "Scrivi", fediversePreview: "Anteprima", - fediverseEdit: "Modifica", - fediverseOpenFeed: "Visita il feed", fediverseManage: "Gestisci", - fediverseStatusNotConnected: "Non connesso", fediverseError: "Impossibile contattare Mastodon.", fediverseErrInstance: "URL dell'istanza non valido.", fediverseErrAuth: "Token non valido o scaduto.", @@ -338,17 +288,6 @@ module.exports = { fediverseErrPost: "Impossibile pubblicare.", fediverseErrMedia: "Impossibile caricare il file.", fediverseErrEmpty: "Scrivi qualcosa o allega un file.", - popularLabel: "In evidenza", - topicsLabel: "Argomenti", - latestLabel: "Più recenti", - summariesLabel: "Riassunti", - threadsLabel: "Discussioni", - multiverseLabel: "Multiverso", - inboxLabel: "Posta in arrivo", - invitesLabel: "Inviti", - walletLabel: "Portafoglio", - legacyLabel: "Chiavi", - cipherLabel: "Crittografia", bookmarksLabel: "Segnalibri", videosLabel: "Video", torrentsLabel: "Torrents", @@ -359,18 +298,14 @@ module.exports = { inhabitantsLabel: "Abitanti", trendingLabel: "Tendenze", eventsLabel: "Eventi", - tasksLabel: "Compiti", apply: "Applica", menuPersonal: "Personale", - menuContent: "Contenuto", - menuBlogs: "Blog", menuGovernance: "Governance", menuOffice: "Ufficio", - menuMultiverse: "Multiverso", - menuNetwork: "Rete", + menuNetwork: "Comunità", menuCreative: "Creativo", menuEconomy: "Economia", - menuMedia: "Media", + menuMedia: "Biblioteca", menuTools: "Strumenti", comment: "Commento", subtopic: "Sotto-argomento", @@ -380,13 +315,6 @@ module.exports = { follow: "Supporta", block: "Blocca", unblock: "Sblocca", - newerPosts: "Post più recenti", - olderPosts: "Post più vecchi", - feedRangeEmpty: "L'intervallo indicato è vuoto per questo feed. Prova a visualizzare il ", - seeFullFeed: "feed completo", - feedEmpty: "La rete Oasis non ha mai visto post da questo account.", - beginningOfFeed: "Questo è l'inizio del feed", - noNewerPosts: "Non sono ancora stati ricevuti post più recenti.", relationshipNotFollowing: "Non ti supporta", relationshipTheyFollow: "Ti supporta", relationshipMutuals: "Supporto reciproco", @@ -396,16 +324,12 @@ module.exports = { relationshipBlockedBy: "Ti ha bloccato", relationshipMutualBlock: "Blocco reciproco", relationshipNone: "Non stai supportando", - relationshipConflict: "Conflitto", relationshipBlockingPost: "Post bloccato", viewLikes: "Vedi diffusioni", spreadedDescription: "Lista dei post diffusi dall'abitante.", - totalspreads: "Diffusioni totali", - attachFiles: "Allega file", preview: "Anteprima", publish: "Pubblica", contentWarningPlaceholder: "Aggiungi un oggetto al post (opzionale)", - privateWarningPlaceholder: "Aggiungi abitanti per inviare un post privato (opzionale)", publishWarningPlaceholder: "Corpo limitato a 7000 caratteri.", publishTooLong: "Il tuo post è troppo lungo. Accorcialo, per favore.", publishCustomDescription: [ @@ -414,8 +338,6 @@ module.exports = { commentWarning: [ "RICORDA: A causa della tecnologia blockchain, una volta pubblicato un post non può essere modificato né eliminato.", ], - commentPublic: "pubblico", - commentPrivate: "privato", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -435,7 +357,6 @@ module.exports = { ".", ], publishCustom: "Scrivi un post avanzato", - subtopicLabel: "Crea un sotto-argomento di questo post", messagePreview: "Anteprima post", mentionsMatching: "Menzioni corrispondenti", mentionsName: "Nome", @@ -458,24 +379,19 @@ module.exports = { ssbLogStream: "Blokchain", ssbLogStreamDescription: "Configura il limite di messaggi per i flussi della Blockchain.", saveSettings: "Salva impostazioni", - exportTitle: "Esporta dati", exportDescription: "Imposta una password (minimo 32 caratteri) per crittografare la tua chiave", exportDataTitle: "Backup", exportDataDescription: "Scarica i tuoi dati (chiave segreta esclusa!)", exportDataButton: "Scarica database", - pubWallet: "Portafoglio PUB", - pubWalletDescription: "Imposta l'URL del portafoglio PUB. Verrà utilizzato per le transazioni PUB (inclusa la UBI).", - pubWalletConfiguration: "Salva configurazione", - importTitle: "Importa dati", importDescription: "Importa il tuo segreto crittografato (chiave privata) per attivare il tuo avatar", - importAttach: "Allega file crittografato (.enc)", - passwordLengthInfo: "La password deve avere almeno 32 caratteri.", passwordImport: "Scrivi la tua password per decifrare i dati che verranno salvati nella home del sistema (nome: secret)", exportPasswordPlaceholder: "Usa minuscole, maiuscole, numeri e simboli", fileInfo: "La tua chiave segreta crittografata verrà scaricata sul tuo dispositivo (nome: oasis.enc)", developer: "Sviluppo", devTitle: "Sviluppo", welcomeBannerText: "Benvenuta in OASIS. Segui questi passi rapidi per configurare il tuo avatar.", + aiSuggestionBanner: "Suggerimento:", + aiSuggestionsEnable: "Suggerimenti dell'IA", welcomeBannerAction: "Inizia!", welcomeTitle: "Benvenuta", welcomeStepGreetingAction: "Invia", @@ -518,14 +434,9 @@ module.exports = { devParentFolder: "Cartella superiore", devOpenFolder: "apri", devDescription: "Esplora il codice sorgente in esecuzione su questo nodo.", - devTreeTitle: "File", - devSearchTitle: "Cerca nel codice", - devMapTitle: "Moduli", devRoot: "radice", - devRootButton: "RADICE", devSearchPlaceholder: "Testo da cercare nel codice", devAnyExtension: "Qualsiasi file", - devSearchButton: "Cerca", devStatsFiles: "File", devStatsLines: "Righe", devStatsModules: "Moduli", @@ -562,16 +473,13 @@ module.exports = { languageDescription: "Se desideri usare un'altra lingua, selezionala qui.", setLanguage: "Imposta lingua", - peerConnections: "Peer", peerConnectionsIntro: "Gestisci tutte le tue connessioni con altri peer.", peerConnectionsTitle: "Connessioni", online: "Online", offline: "Offline", discovered: 'Scoperti', unknown: 'Sconosciuto', - lanBroadcastLabel: "Broadcast LAN", lanBroadcastActive: "Attivo (multicast UDP sulla LAN)", - lanBroadcastDisabled: "Disattivato (modalità pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -584,8 +492,6 @@ module.exports = { noConnections: "Nessun peer connesso.", noDiscovered: "Nessun peer scoperto.", noUnknownPeers: "Nessun peer sconosciuto nel grafo delle amicizie.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -595,9 +501,6 @@ module.exports = { peerImport: "Importa", peerImportTitle: "Importa lista peer", peerImportPlaceholder: "Incolla un indirizzo multiserver per riga, o carica un file .txt…", - noSupportedConnections: "Nessun peer supportato.", - noBlockedConnections: "Nessun peer bloccato.", - noRecommendedConnections: "Nessun peer consigliato.", connectionActionIntro: "", startNetworking: "Avvia rete", @@ -611,9 +514,19 @@ module.exports = { homePageDescription: "Seleziona quale modulo vuoi come pagina iniziale.", saveHomePage: "Imposta home", invites: "Inviti", - invitesTitle: "Inviti", - invitesInvites: "Inviti", invitesDescription: "Gestisci e applica codici invito nella tua rete.", + invitesPubsHint: "Incolla un codice d'invito di un pub per federarti con lui e replicarne gli abitanti.", + invitesFederationsHint: "Pub con cui sei federato: aggiornali, togli quelli irraggiungibili o esporta l'elenco.", + invitesHousesHint: "Inserisci un codice casa per unirti a una casa del LARP e partecipare alla sua economia.", + invitesTribesHint: "Inserisci un codice tribù per diventarne membro e accedere ai contenuti privati.", + invitesChatsHint: "Inserisci un codice chat per unirti alla conversazione e ai suoi thread.", + invitesPadsHint: "Inserisci un codice pad per scrivere insieme su un documento condiviso.", + invitesCalendarsHint: "Inserisci un codice calendario per condividere date e promemoria.", + invitesEventsHint: "Inserisci un codice evento per partecipare a un evento privato.", + invitesForumsHint: "Inserisci un codice forum per leggere e rispondere in un forum privato.", + invitesMapsHint: "Inserisci un codice mappa per vedere e aggiungere luoghi su una mappa condivisa.", + invitesShopsHint: "Inserisci un codice negozio per unirti a un negozio e al suo catalogo.", + invitesInhabitantsHint: "Inserisci un codice abitante per seguirvi a vicenda e scambiare contenuti.", invitesTribesTitle: "Tribù", invitesTribeInviteCodePlaceholder: "Inserisci codice invito tribù", invitesTribeJoinButton: "Unisciti alla tribù", @@ -644,7 +557,6 @@ module.exports = { invitesAlreadyFederated: "Sei già federato con questo pub.", invitesFederationsTitle: "Federazioni", invitesAcceptedInvites: "Federate", - invitesNoInvites: "Nessun invito accettato ancora.", invitesUnfollow: "Smetti di seguire", invitesFollow: "Segui", invitesUnfollowedInvites: "Non federate", @@ -664,39 +576,24 @@ module.exports = { panicMode: "Modalità panico!", encryptData: "Imposta una password (minimo 32 caratteri) per crittografare la tua blockchain", decryptData: "Inserisci la password per decifrare la tua blockchain", - panicModeDescription: "Crittografa/Decifra o ELIMINA la tua blockchain", removeDataDescription: "ATTENZIONE: Questo processo non può essere annullato.", - encryptPanicButton: "Crittografa blockchain", - decryptPanicButton: "Decifra blockchain", removePanicButton: "ELIMINA TUTTI I TUOI DATI!", searchTitle: "Cerca", searchDescriptionLabel: "Cerca contenuti nella tua rete.", - searchLanguagesLabel: "Lingue", - searchSkillsLabel: "Competenze", searchPlaceholder:"Cerca contenuti...", - searchDateLabel:"Data", searchLocationLabel:"Posizione", searchPriceLabel:"Prezzo", - searchUrlLabel:"URL", searchCategoryLabel:"Categoria", - searchStartLabel:"Inizio", - searchEndLabel:"Fine", searchPriorityLabel:"Priorità", searchStatusLabel:"Stato", statusLabel:"Stato", - totalVotesLabel:"Voti totali", noResultsFound:"Nessun risultato trovato.", votesOption:"Opzioni di voto", voteYesLabel:"Sì", voteNoLabel:"No", allTypesLabel: "TUTTI", - ABSTENTIONLabel:"ASTENSIONE", YESLabel:"SÌ", NOLabel:"NO", - FOLLOW_MAJORITYLabel: "SEGUI MAGGIORANZA", - CONFUSEDLabel: "CONFUSO", - NOT_INTERESTEDLabel: "NON INTERESSATO", - StatusLabel:"Stato", votesOptionYesLabel:"Sì", votesOptionNoLabel:"No", votesOptionAbstentionLabel:"Astensione", @@ -704,7 +601,6 @@ module.exports = { votesCreatedByLabel:"Creato da", voteStatusOpen:"APERTO", voteStatusClosed:"CHIUSO", - imageSearchLabel: "Inserisci parole per cercare immagini etichettate con esse.", commentDescription: ({ parentUrl }) => [ " ha commentato in ", a({ href: parentUrl }, " discussione"), @@ -715,53 +611,20 @@ module.exports = { a({ href: parentUrl }, " un post"), ], subtopicTitle: ({ authorName }) => [`Sotto-argomento del post di @${authorName}`], - mysteryDescription: "ha pubblicato un post misterioso", oasisDescription: "Rete del Progetto OASIS", searchSubmit: "Cerca...", - postLabel: "POST", - aboutLabel: "ABITANTI", - feedLabel: "FEED", votesLabel: "VOTAZIONI", - reportLabel: "SEGNALAZIONI", - imageLabel: "IMMAGINI", - videoLabel: "VIDEO", - audioLabel: "AUDIO", - documentLabel: "DOCUMENTI", - torrentLabel: "TORRENT", pdfFallbackLabel: "Documento PDF", - eventLabel: "EVENTI", - taskLabel: "COMPITI", - transferLabel: "TRASFERIMENTI", - curriculumLabel: "CURRICULUM", - bookmarkLabel: "SEGNALIBRI", - tribeLabel: "TRIBÙ", - marketLabel: "MERCATO", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "PORTAFOGLI", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Invia", - subjectLabel: "Oggetto", editProfile: "Modifica avatar", - profileQrAlt: "Codice QR del profilo", - profileQrHint: "Scansiona per copiare questo Oasis ID.", oasisIdLabel: "OasisID", - spreadLabel: "Diffondi", - spreadHint: "Diffondi questo a chi ti supporta (replica via il tuo feed).", + spreadContent: "Replica", welcomePmSubject: "Hello World!", - welcomePmBody: "Benvenuto su Oasis — un social network libero, peer-to-peer, federato e cifrato, con un'architettura distribuita solo su invito.\n\nAlcuni posti interessanti da cui partire:\n\n- /profile — Modifica il tuo avatar, nome, descrizione e quali moduli appaiono sul tuo lato pubblico.\n- /invites — Aggiungi un pub per federarti con il resto della rete.\n- /peers — Vedi chi è connesso, riscansiona la LAN, esporta o importa liste di peer.\n- /inhabitants — Scopri e visita gli avatar di altre persone.\n- /tribes — Crea o unisciti a gruppi privati cifrati end-to-end.\n- /inbox — Leggi e invia messaggi privati.\n- /activity — Vedi l'attività recente, tua e della tua rete.\n- /publish — Scrivi un post o condividi un'immagine, un audio, un video o un documento.\n- /search — Cerca i contenuti della rete per tipo.\n\nAlcuni luoghi interessanti per connettersi:\n\n- /fediverse — Gestisci i tuoi altri account del fediverso, inclusi l'invio e la ricezione di contenuti.\n\nQuesto messaggio è stato inviato privatamente da te a te stesso, perciò non serviva alcuna connessione per riceverlo.", - profileVisibilityTitle: "Visibilità del profilo pubblico", - profileVisibilityHint: "Scegli quali campi mostrano gli altri abitanti nel tuo profilo. Per impostazione predefinita appare solo Karma.", + welcomePmBody: "Benvenuto su Oasis — un social network libero, peer-to-peer, federato e cifrato, con un'architettura distribuita solo su invito.\n\nAlcuni posti interessanti da cui partire:\n\n- /profile — Modifica il tuo avatar, nome, descrizione e quali moduli appaiono sul tuo lato pubblico.\n- /invites — Aggiungi un pub per federarti con il resto della rete.\n- /peers — Vedi chi è connesso, riscansiona la LAN, esporta o importa liste di peer.\n- /inhabitants — Scopri e visita gli avatar di altre persone.\n- /tribes — Crea o unisciti a gruppi privati cifrati end-to-end.\n- /inbox — Leggi e invia messaggi privati.\n- /activity — Vedi l'attività recente, tua e della tua rete.\n- /publish — Scrivi un post o condividi un'immagine, un audio, un video o un documento.\n- /search — Cerca i contenuti della rete per tipo.\n\nAlcuni luoghi interessanti per connettersi:\n\n- /multiverse — Gestisci i tuoi altri account del multiverso, inclusi l'invio e la ricezione di contenuti.\n\nQuesto messaggio è stato inviato privatamente da te a te stesso, perciò non serviva alcuna connessione per riceverlo.", profileSensorsSectionTitle: "Sensori", profileVisibilityActivity: "Livello di attività", - profileVisibilityDevice: "Dispositivo", profileDeviceLockedHint: "Questo sensore è sempre attivo: mostra agli altri da quale dispositivo ti connetti e non può essere disattivato.", profileVisibilityKarma: "Punteggio KARMA", profileVisibilityUbi: "UBI", @@ -769,7 +632,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "Chiave GPG", - profileVisibilityClearnet: "Pubblica il mio profilo", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Negozi", profileClearnetJobsLabel: "Lavori", @@ -823,7 +685,6 @@ module.exports = { " o lo stato della connessione.", ], walletSentToLine: ({ destination, amount }) => `Inviati ECO ${amount} a ${destination}`, - walletSettingsTitle: "Portafoglio", walletSettingsDescription: "Integra Oasis con il tuo portafoglio ECOin.", walletSettingsDocLink: "Guida all'installazione di ECOin", walletStatusMessages: { @@ -845,37 +706,19 @@ module.exports = { cipherTitle: "Crittografia", cipherDescription: "Crittografa e decifra il tuo testo simmetricamente (usando una password condivisa).", randomPassword: "Password casuale", - cipherEncryptTitle: "Crittografa testo", - cipherEncryptDescription: "Inserisci il testo da crittografare", - cipherTextLabel: "Testo da crittografare", cipherTextPlaceholder: "Inserisci il testo da crittografare...", cipherPasswordLabel: "Imposta una password (minimo 32 caratteri) per crittografare il testo", cipherPasswordDecryptLabel: "Imposta una password (minimo 32 caratteri) per decifrare il testo", cipherPasswordPlaceholder: "Inserisci una password...", cipherEncryptButton: "Crittografa", - cipherDecryptTitle: "Decifra testo", - cipherDecryptDescription: "Inserisci il testo da decifrare", cipherEncryptedMessageLabel: "Testo crittografato", cipherDecryptedMessageLabel: "Testo decifrato", - cipherPasswordUsedLabel: "Password usata per crittografare (conservala!)", cipherEncryptedTextPlaceholder: "Inserisci il testo crittografato...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Inserisci il vettore di inizializzazione...", cipherDecryptButton: "Decifra", password: "Password", text: "Testo", encryptedText: "Testo crittografato", iv: "Vettore di inizializzazione (IV)", - encryptTitle: "Crittografa il tuo testo", - encryptDescription: "Inserisci il testo che vuoi crittografare e fornisci una password.", - encryptButton: "Crittografa", - decryptTitle: "Decifra il tuo testo", - decryptDescription: "Inserisci il testo crittografato e fornisci la stessa password usata per la crittografia.", - decryptButton: "Decifra", - passwordLengthError: "La password deve avere almeno 32 caratteri.", - missingFieldsError: "Testo, password o IV non forniti.", - encryptionError: "Errore durante la crittografia del testo.", - decryptionError: "Errore durante la decifratura del testo.", bookmarkTitle: "Segnalibri", bookmarkDescription: "Scopri e gestisci i segnalibri nella tua rete.", bookmarkAllSectionTitle: "Segnalibri", @@ -901,8 +744,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Opzionale", bookmarkTagsLabel: "Tag", bookmarkTagsPlaceholder: "Inserisci tag separati da virgole", - bookmarkCategoryLabel: "Categoria", - bookmarkCategoryPlaceholder: "Opzionale", bookmarkLastVisitLabel: "Ultima visita", bookmarkSearchPlaceholder: "Cerca URL, tag, categoria, autore...", bookmarkSortRecent: "Più recenti", @@ -917,8 +758,6 @@ module.exports = { noLastVisit: "Nessuna ultima visita", videoTitle: "Video", videoDescription: "Esplora e gestisci contenuti video nella tua rete.", - videoPluginTitle: "Titolo", - videoPluginDescription: "Descrizione", videoMineSectionTitle: "I tuoi video", videoCreateSectionTitle: "Carica video", videoUpdateSectionTitle: "Aggiorna video", @@ -950,7 +789,6 @@ module.exports = { videoSortOldest: "Più vecchi", videoSortTop: "Più votati", videoSearchButton: "Cerca", - videoMessageAuthorButton: "PM", videoUpdatedAt: "Aggiornato", videoNoMatch: "Nessun video corrisponde alla ricerca.", documentTitle: "Documenti", @@ -991,8 +829,6 @@ module.exports = { documentUpdatedAt: "Aggiornato", audioTitle: "Audio", audioDescription: "Esplora e gestisci contenuti audio nella tua rete.", - audioPluginTitle: "Titolo", - audioPluginDescription: "Descrizione", audioMineSectionTitle: "I tuoi audio", audioCreateSectionTitle: "Carica audio", audioUpdateSectionTitle: "Aggiorna audio", @@ -1003,7 +839,6 @@ module.exports = { audioFilterMine: "MIEI", audioFilterRecent: "RECENTI", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Carica audio", audioUpdateButton: "Aggiorna", audioDeleteButton: "Elimina", @@ -1030,6 +865,7 @@ module.exports = { audioFilterFavorites: "PREFERITI", favoritesTitle: "Preferiti", favoritesDescription: "Tutti i tuoi contenuti preferiti in un unico posto.", + favoritesSearchPlaceholder: "Cerca nei preferiti...", favoritesFilterAll: "TUTTI", favoritesFilterRecent: "RECENTI", favoritesFilterAudios: "AUDIO", @@ -1045,18 +881,13 @@ module.exports = { favoritesNoItems: "Nessun preferito ancora.", yourContacts: "I tuoi contatti", allInhabitants: "Abitanti", - allCVs: "Tutti i CV", + allCVs: "CV", discoverPeople: "Scopri abitanti nella tua rete.", - allInhabitantsButton: "TUTTI", - contactsButton: "SUPPORTATI", - CVsButton: "CV", - matchSkills: "Abbina competenze", - matchSkillsButton: "ABBINA COMPETENZE", - suggestedButton: "SUGGERITI", searchInhabitantsPlaceholder: "FILTRA abitanti PER NOME …", filterLocation: "FILTRA abitanti PER POSIZIONE …", filterLanguage: "FILTRA abitanti PER LINGUA …", filterSkills: "FILTRA abitanti PER COMPETENZE …", + cvSkillsCount: "Competenze", applyFilters: "Applica filtri", locationLabel: "Posizione", languagesLabel: "Lingue", @@ -1065,17 +896,18 @@ module.exports = { mutualFollowers: "Follower reciproci", suggestedFollowsYou: "Ti segue", latestInteractions: "Ultime interazioni", - viewAvatar: "Vedi avatar", - viewCV: "Vedi CV", suggestedSectionTitle: "Suggeriti", topkarmaSectionTitle: "Top Karma", topecoSectionTitle: "Top Eco", topactivitySectionTitle: "Top Attività", + "TOP INACTIVITYButton": "PIÙ INATTIVI", + topinactivitySectionTitle: "Abitanti meno attivi", blockedSectionTitle: "Bloccati", gallerySectionTitle: "GALLERIA", - blockedButton: "BLOCCATI", + topSectionTitle: "TOP", blockedLabel: "Abitante bloccato", inhabitantviewDetails: "Vedi dettagli", + cvVisitButton: "Visita il CV", keepReading: "Continua a leggere...", oasisId: "ID", noInhabitantsFound: "Nessun abitante trovato ancora.", @@ -1088,6 +920,7 @@ module.exports = { parliamentFilterCandidatures: "CANDIDATURE", parliamentFilterProposals: "PROPOSTE", parliamentFilterLaws: "LEGGI", + parliamentFilterRevocations: "REVOCHE", parliamentFilterHistorical: "STORICO", parliamentFilterLeaders: "LEADER", parliamentFilterRules: "REGOLE", @@ -1113,10 +946,8 @@ module.exports = { parliamentPoliciesDeclined: "LEGGI RESPINTE", parliamentPoliciesDiscarded: "LEGGI SCARTATE", parliamentEfficiency: "% EFFICIENZA", - parliamentFilterRevocations: 'REVOCHE', parliamentRevocationFormTitle: 'Revoca legge', parliamentRevocationLaw: 'Legge', - parliamentRevocationTitle: 'Titolo', parliamentRevocationReasons: 'Motivazioni', parliamentRevocationPublish: 'Pubblica revoca', parliamentCurrentRevocationsTitle: 'Revoche attuali', @@ -1129,23 +960,12 @@ module.exports = { parliamentNoGovernments: "Non ci sono ancora governi.", parliamentCandidatureFormTitle: "Proponi candidatura", parliamentCandidatureIdPh: "Oasis ID (@...) o nome tribù", - parliamentCandidatureSlogan: "Slogan (max 140 caratteri)", - parliamentCandidatureSloganPh: "Un breve motto", parliamentCandidatureMethod: "Metodo", parliamentCandidatureProposeBtn: "Pubblica candidatura", - parliamentThDate: "Data proposta", - parliamentThSlogan: "Slogan", - parliamentThSince: "Profilo dal", - parliamentThVotes: "Voti ricevuti", - parliamentThVoteAction: "Vota", - parliamentTypeUser: "Abitante", - parliamentTypeTribe: "Tribù", parliamentVoteBtn: "Vota", parliamentProposalFormTitle: "Proponi legge", parliamentProposalDescription: "Descrizione (≤1000)", parliamentProposalPublish: "Pubblica proposta", - parliamentFinalize: "Finalizza", - parliamentDeadline: "Scadenza", parliamentNoProposals: "Non ci sono ancora proposte di legge.", parliamentNoLaws: "Non ci sono ancora leggi approvate.", parliamentMethodDEMOCRACY: "Democrazia", @@ -1163,29 +983,21 @@ module.exports = { parliamentVotesSlashTotal: "Voti/Totale", parliamentVotesNeeded: "Voti necessari", parliamentFutureLawsTitle: "Leggi future", - parliamentNoFutureLaws: "Nessuna legge futura, per ora.", parliamentVoteAction: "Vota", - parliamentLeadersTitle: "Leader", parliamentThLeader: "AVATAR", parliamentPopulation: "Popolazione", - parliamentThType: "Tipo", - parliamentThInPower: "Al potere", parliamentThPresented: "CANDIDATURE", parliamentNoLeaders: "Nessun leader, per ora.", parliamentCandidaturesListTitle: "Lista delle candidature", parliamentTimeRemaining: "Tempo rimanente", - parliamentNoLeader: "Nessuna candidatura vincente, per ora.", parliamentElectionsStatusTitle: "Prossimo governo", parliamentProposalDeadlineLabel: "Scadenza", parliamentProposalTimeLeft: "Tempo rimanente", - parliamentProposalOnTrack: "In linea per l'approvazione", - parliamentProposalOffTrack: "Supporto insufficiente", parliamentRulesTitle: "Come funziona il Parlamento", parliamentRulesIntro: "Le elezioni si risolvono ogni 2 mesi; le candidature sono continue e si azzerano quando un governo viene scelto.", parliamentRulesCandidates: "Qualsiasi abitante può proporre se stesso, un altro abitante o qualsiasi tribù. Ogni abitante può proporre fino a 3 candidature per ciclo; i duplicati nello stesso ciclo vengono rifiutati.", parliamentRulesElection: "Il vincitore è la candidatura con il maggior numero di voti al momento della risoluzione.", parliamentRulesTies: "Ordine di spareggio: karma più alto dell'abitante; in caso di parità, profilo più vecchio; se ancora in parità, proposta più antica; poi ordine lessicografico per ID.", - parliamentRulesFallback: "Se nessuno vota, vince l'ultima candidatura proposta. Se non ci sono candidature, viene selezionata una tribù casuale.", parliamentRulesTerm: "La scheda Governo mostra il governo attuale e le statistiche.", parliamentRulesMethods: "Forme: Anarchia (maggioranza semplice), Democrazia (50%+1), Maggioranza (80%), Minoranza (20%), Karmatocrazia (proposte con karma più alto), Dittatura (approvazione istantanea).", parliamentRulesAnarchy: "L'Anarchia è la modalità predefinita: se nessuna candidatura viene eletta alla risoluzione, viene proclamata l'Anarchia. In Anarchia, qualsiasi abitante può proporre leggi.", @@ -1207,11 +1019,7 @@ module.exports = { courtsCaseFormTitle: "Apri caso", courtsCaseRespondent: "Accusato / Convenuto", courtsCaseRespondentPh: "Oasis ID (@...) o nome tribù", - courtsCaseMediatorsAccuser: "Mediatori (accusatore)", courtsCaseMethod: "Metodo di risoluzione", - courtsCaseDescription: "Descrizione (max 1000 caratteri)", - courtsCaseEvidenceTitle: "Prove del caso", - courtsCaseEvidenceHelp: "Allega immagini, audio, documenti (PDF) o video a supporto del tuo caso.", courtsCaseSubmit: "Presenta caso", courtsNominateJudge: "Nomina giudice", courtsJudgeId: "Giudice", @@ -1256,22 +1064,6 @@ module.exports = { courtsRulesMisconduct: "Molestie, manipolazione o prove fabbricate possono portare a una risoluzione negativa immediata.", courtsRulesGlossary: "Caso: registro di un conflitto. Prove: materiali a supporto delle affermazioni. Verdetto: decisione con rimedio. Appello: richiesta di revisione del verdetto.", courtsFilterActions: "AZIONI", - courtsNoActions: "Nessuna azione in sospeso per il tuo ruolo.", - courtsCaseTitlePlaceholder: "Breve descrizione del conflitto", - courtsCaseSeverity: "Gravità", - courtsCaseSeverityNone: "Nessun livello di gravità", - courtsCaseSeverityLOW: "Bassa", - courtsCaseSeverityMEDIUM: "Media", - courtsCaseSeverityHIGH: "Alta", - courtsCaseSeverityCRITICAL: "Critico", - courtsCaseSubject: "Argomento", - courtsCaseSubjectNone: "Nessun argomento", - courtsCaseSubjectBEHAVIOUR: "Comportamento", - courtsCaseSubjectCONTENT: "Contenuto", - courtsCaseSubjectGOVERNANCE: "Governance / regole", - courtsCaseSubjectFINANCIAL: "Finanze / risorse", - courtsCaseSubjectOTHER: "Altro", - courtsHiddenRespondent: "Nascosto (visibile solo ai ruoli coinvolti).", courtsThRole: "Ruolo", courtsRoleAccuser: "Accusatore", courtsRoleDefence: "Difesa", @@ -1282,54 +1074,19 @@ module.exports = { courtsAssignJudgeBtn: "Scegli giudice", trendingTitle: "Tendenze", exploreTrending: "Esplora i contenuti più popolari nella tua rete.", - bookmarkButton: "SEGNALIBRI", - transferButton: "TRASFERIMENTI", - eventButton: "EVENTI", - taskButton: "COMPITI", votesButton: "VOTAZIONI", - industryButton: "INDUSTRIA", - projectButton: "PROGETTI", - shopProductButton: "PRODOTTI", - reportButton: "SEGNALAZIONI", - feedButton: "FEED", - marketButton: "MERCATO", - imageButton: "IMMAGINI", - audioButton: "AUDIO", - videoButton: "VIDEO", - documentButton: "DOCUMENTI", - torrentButton: "TORRENT", - noTrendingFound: "Nessun contenuto di tendenza trovato.", - noContentMessage: "Nessun contenuto di tendenza disponibile.", - trendingDescription: "Descrizione", - trendingDate: "Data", - trendingLocation: "Posizione", - trendingPrice: "Prezzo", - trendingUrl: "URL", - trendingCategory: "Categoria", - trendingStart: "Inizio", - trendingEnd: "Fine", - trendingPriority: "Priorità", - trendingStatus: "Stato", - trendingFrom: "Da", - trendingTo: "A", - trendingConcept: "Concetto", - trendingAmount: "Importo", - trendingDeadline: "Scadenza", - trendingItemStatus: "Stato articolo", - trendingTotalVotes: "Voti totali", + shopProductButton: "NEGOZIO", trendingTotalOpinions: "Opinioni totali", trendingNoContentMessage: "Ancora nessuna tendenza.", - trendingAuthor: "Di", - trendingCreatedAtLabel: "Creato il", trendingTotalCount: "Conteggio totale", tasksTitle: "Compiti", tasksDescription: "Scopri e gestisci compiti nella tua rete.", + taskSearchPlaceholder: "Cerca attività...", taskTitleLabel: "Titolo", taskDescriptionLabel: "Descrizione", taskStartTimeLabel: "Ora di inizio", taskEndTimeLabel: "Ora di fine", taskPriorityLabel: "Priorità", - taskPrioritySelect: "Seleziona priorità", taskPriorityUrgent: "Urgente", taskPriorityHigh: "Alta", taskPriorityMedium: "Media", @@ -1339,13 +1096,13 @@ module.exports = { taskVisibilityLabel: "Visibilità", taskPublic: "pubblico", taskPrivate: "privato", - taskCreatedAt: "Creato il", - taskBy: "Di", taskStatus: "Stato", taskStatusOpen: "Apri", taskStatusInProgress: "In corso", taskStatusClosed: "Chiuso", taskAssignedTo: "Assegnato a", + taskAssignedChip: "Assegnata", + taskUnassignedChip: "Non assegnata", taskAssignees: "Assegnatari", taskAssignButton: "Assegna a me", taskUnassignButton: "Rimuovi assegnazione", @@ -1358,7 +1115,6 @@ module.exports = { taskFilterInProgress: "IN CORSO", taskFilterClosed: "CHIUSI", taskFilterAssigned: "ASSEGNATI", - taskFilterArchived: "ARCHIVIATI", taskFilterUrgent: "URGENTE", taskFilterHigh: "ALTA", taskFilterMedium: "MEDIA", @@ -1371,23 +1127,21 @@ module.exports = { taskInProgressTitle: "Compiti in corso", taskClosedTitle: "Compiti chiusi", taskAssignedTitle: "Compiti assegnati", - taskArchivedTitle: "Compiti archiviati", - taskPublicTitle: "Compiti pubblici", - taskPrivateTitle: "Compiti privati", notasks: "Nessun compito disponibile.", noLocation: "Nessuna posizione specificata", taskSetStatus: "Imposta stato", - eventTitle: "Eventi", eventDateLabel: "Data", + eventRecurrenceLabel: "Ricorrenza", + eventRecurrenceUntil: "Ripeti fino al", + eventRecurrenceHint: "Lascia vuota la data finale per un evento singolo.", + eventUpcomingDates: "Prossime date", eventsTitle: "Eventi", eventsDescription: "Scopri e gestisci eventi nella tua rete.", - eventDescription: "Descrizione", + eventSearchPlaceholder: "Cerca eventi...", eventPrice: "Prezzo", eventStatus: "Stato", - eventOrganizer: "Organizzatore", eventAllSectionTitle: "Eventi", eventMineSectionTitle: "I tuoi eventi", - eventArchivedTitle: "Eventi archiviati", eventCreateSectionTitle: "Crea evento", eventUpdateSectionTitle: "Aggiorna evento", eventDeleteButton: "Elimina", @@ -1395,11 +1149,26 @@ module.exports = { eventAddToCalendar: "Aggiungi al calendario", eventVisitCalendar: "Vai al calendario", viewTask: "Visualizza attività", + viewEvent: "Vedi evento", + viewPad: "Vedi pad", + viewMap: "Vedi mappa", + viewCalendar: "Vedi calendario", viewReport: "Visualizza segnalazione", viewTransfer: "Visualizza trasferimento", viewItem: "Visualizza articolo", viewShop: "Visualizza negozio", viewProject: "Visualizza progetto", + viewJob: "Vedi Lavoro", + viewPlace: "Vedi Luogo", + generatePdf: "Genera PDF", + sharePm: "Condividi via MP", + galleryImages: "Immagini (dimensione max: 50MB ciascuna)", + galleryPhotos: "Immagini", + galleryAddPhoto: "Aggiungi Immagine", + galleryRemovePhoto: "Rimuovi", + galleryVideo: "Video (dimensione max: 50MB)", + galleryAddVideo: "Aggiungi Video", + galleryRemoveVideo: "Rimuovi video", viewVotation: "Visualizza votazione", voteCastTitle: "Esprimi il voto", voteResults: "Risultati", @@ -1407,29 +1176,15 @@ module.exports = { eventDescriptionLabel: "Descrizione", eventDescriptionPlaceholder: "Inserisci descrizione evento...", eventUpdateButton: "Aggiorna", - eventAttendeesLabel: "Partecipanti", - eventAttendeesPlaceholder: "Inserisci partecipanti, separati da virgole...", eventTagsLabel: "Tag", - eventTagsPlaceholder: "Inserisci tag evento, separati da virgole...", - eventTags: "Tag", eventPriceLabel: "Prezzo", eventUrlLabel: "URL", eventAttendees: "Partecipanti", - noAttendees: "Nessun partecipante", - eventCreatedAt: "Creato il", eventLocation: "Posizione", eventLocationLabel: "Posizione", - eventNoLocation: "Nessuna posizione specificata", - eventNoURL: "Nessun URL specificato", - eventBy: "Di", noevents: "Nessun evento disponibile.", eventDate: "Data", - eventDateFormat: "DD:MM:YYYY HH:mm", eventAttendButton: "Partecipa all'evento", - eventUnattendButton: "Lascia l'evento", - eventCreatedBy: "Creato da", - eventAttendeesCount: "Numero partecipanti", - eventCreatedByYou: "Hai creato questo evento", eventFilterAll: "TUTTI", eventFilterMine: "MIEI", eventFilterToday: "OGGI", @@ -1437,18 +1192,9 @@ module.exports = { eventFilterMonth: "QUESTO MESE", eventFilterYear: "QUEST'ANNO", eventFilterArchived: "ARCHIVIATI", - eventTodayTitle: "Eventi di oggi", - eventThisWeekTitle: "Eventi di questa settimana", - eventThisMonthTitle: "Eventi di questo mese", - eventThisYearTitle: "Eventi di quest'anno", eventPrivacyLabel: "Visibilità", eventPublic: "Pubblico", eventPrivate: "Privato", - eventPublicTitle: "Eventi pubblici", - eventNoPrice: "Evento gratuito", - eventNoImage: "Nessuna immagine caricata", - eventAttendConfirmation: "Stai partecipando a questo evento", - eventUnattendConfirmation: "Non partecipi più a questo evento", eventAttended: "Partecipato", eventUnattended: "Non partecipato", eventStatusOpen: "Aperto", @@ -1459,6 +1205,10 @@ module.exports = { tagsTopSectionTitle: "Tag più usati", tagsCloudSectionTitle: "Nuvola di tag", tagsFilterAll: "TUTTI", + tagsFilterMine: "MIE", + tagsFilterRecent: "RECENTI", + tagsMineSectionTitle: "Le mie etichette", + tagsRecentSectionTitle: "Etichette recenti", tagsFilterTop: "TOP", tagsFilterCloud: "NUVOLA", tagsNoItems: "Nessun tag disponibile.", @@ -1502,18 +1252,12 @@ module.exports = { transfersDeadline: "Scadenza", transfersTags: "Tag", transfersStatus: "Stato", - transfersStatusUnconfirmed: "NON CONFERMATO", - transfersStatusClosed: "CHIUSO", - transfersStatusDiscarded: "SCARTATO", - transfersCreatedAt: "Creato il", transfersConfirmations: "CONFERME", - transfersContainingBlock: "Blocco contenitore", - transfersExportContract: "Contratto intelligente", + transfersExportContract: "Genera Fattura", transfersConfirmButton: "Conferma trasferimento", transfersNoItems: "Nessun trasferimento trovato.", transfersMineSectionTitle: "I tuoi trasferimenti", transfersUBISectionTitle: "Trasferimenti RBU", - transfersMarketSectionTitle: "Trasferimenti di mercato", transfersTopSectionTitle: "Trasferimenti principali", transfersPendingSectionTitle: "Trasferimenti in attesa", transfersUnconfirmedSectionTitle: "Trasferimenti non confermati", @@ -1521,21 +1265,13 @@ module.exports = { transfersDiscardedSectionTitle: "Trasferimenti scartati", transfersCreateSectionTitle: "Crea trasferimento", transfersAllSectionTitle: "Trasferimenti", - transfersFilterFavs: "Preferiti", - transfersFavsSectionTitle: "Trasferimenti preferiti", - transfersSearchLabel: "Cerca", transfersSearchPlaceholder: "Cerca concetto, tag, abitanti...", transfersMinAmountLabel: "Importo minimo", transfersMaxAmountLabel: "Importo massimo", - transfersSortLabel: "Ordina per", transfersSortRecent: "Più recenti", transfersSortAmount: "Importo più alto", transfersSortDeadline: "Scadenza più vicina", transfersSearchButton: "Cerca", - transfersFavoriteButton: "Preferito", - transfersUnfavoriteButton: "Rimuovi preferito", - transfersMessageUserButton: "Messaggio", - transfersExpiringSoonBadge: "IN SCADENZA", transfersExpiredBadge: "SCADUTO", transfersUpdatedAt: "Aggiornato", transfersNoMatch: "Nessun trasferimento corrisponde alla ricerca.", @@ -1580,16 +1316,6 @@ module.exports = { voteNoQuestion: "Nessuna domanda fornita", voteUnknownCreator: "Creatore sconosciuto", voteUnknownDate: "Data sconosciuta", - errorVoteNotFound: "Voto non trovato", - errorAlreadyVoted: "Hai già espresso un'opinione.", - errorVoteClosedCannotEdit: "Non puoi modificare una votazione chiusa", - errorVoteDeadlinePassed: "La scadenza per questa votazione è passata", - errorRetrievingVote: "Errore nel recupero del voto", - errorCreatingVote: "Errore nella creazione del voto", - errorVoteAlreadyVoted: "Non puoi modificare dopo aver espresso un'opinione", - errorDeletingOldVote: "Errore nell'eliminazione della vecchia opinione", - errorCreatingUpdatedVote: "Errore nella creazione dell'opinione aggiornata", - errorCreatingTombstone: "Errore nella creazione del tombstone", voteDetailSectionTitle: 'Dettagli voto', voteCommentsLabel: 'Commenti', voteCommentsForumButton: 'Apri discussione', @@ -1599,7 +1325,6 @@ module.exports = { voteNewCommentButton: 'Pubblica commento', voteNewCommentLabel: 'Aggiungi un commento', cvTitle: "Curriculum", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Modifica CV", cvCreateSectionTitle: "Crea CV", cvDescription: "Gestisci e condividi le tue competenze e informazioni professionali.", @@ -1618,19 +1343,16 @@ module.exports = { cvLocationLabel: "Posizione", cvStatusLabel: "Stato", cvPreferencesLabel: "Preferenze", - cvOasisContributorLabel: "Contributore Oasis", cvPersonal: "Personale", cvOasis: "Contributore Oasis (opzionale)", - cvOasisContributorView: "Contributo Oasis", + cvOasisContributorView: "Contributo", cvEducational: "Formazione (opzionale)", cvEducationalView: "Formazione", cvProfessional: "Professionale (opzionale)", cvProfessionalView: "Professionale", cvAvailability: "Disponibilità (opzionale)", - cvAvailabilityView: "Disponibilità", cvUpdateButton: "Aggiorna", cvCreateButton: "Crea CV", - cvContactLabel: "Contatto", cvCreatedAt: "Creato il", cvUpdatedAt: "Aggiornato il", cvEditButton: "Aggiorna", @@ -1639,8 +1361,103 @@ module.exports = { blogSubject: "Oggetto", blogMessage: "Messaggio", blogImage: "Carica media (max: 50MB)", + blogMedia: "Allegati (fino a 8 immagini e un video)", blogPublish: "Anteprima", - noPopularMessages: "Nessun messaggio popolare pubblicato ancora", + pollsTitle: "Sondaggi", + dataTitle: "Corrispondenze", + dataDescription: "Esplora e visualizza le corrispondenze della tua rete.", + dataFilterAll: "TUTTI", + dataFilterMine: "I MIEI", + dataFilterRecent: "RECENTI", + dataFilterTop: "TOP", + dataKindInhabitants: "ABITANTI", + dataKindJobs: "LAVORI", + dataKindProjects: "PROGETTI", + dataKindEvents: "EVENTI", + dataKindTribes: "TRIBÙ", + dataKindMarket: "MERCATO", + dataKindHousing: "ALLOGGI", + dataKindIndustry: "INDUSTRIA", + dataKindTasks: "COMPITI", + dataKindReports: "RAPPORTI", + dataKindVotes: "VOTAZIONI", + dataSearchPlaceholder: "Cerca nei dati incrociati...", + dataCohesionTitle: "Coefficiente di coesione (CC)", + dataCcShort: "CC", + dataCohesionHint: "Affinità media fra tutto ciò che la rete ha pubblicato.", + dataAffinity: "Affinità", + dataCommonTerms: "Parola chiave", + dataStatPeople: "CV", + dataStatConnected: "Collegati", + dataStatSkills: "Competenze", + dataBestMatch: "Miglior match", + dataStatIsolated: "Isolati", + dataStatEntities: "Entità confrontate", + dataStatTerms: "Termini distinti", + dataStatPairs: "Coppie collegate", + dataMatchesTitle: "Corrispondenze", + dataMatchesHint: "Suggerimenti personalizzati dell'algoritmo.", + dataTermsTitle: "Parole chiave", + dataTermsHint: "I termini che compaiono nel maggior numero di contenuti.", + dataConnections: "Corrispondenze collegate", + dataTopicTitle: "Tutto ciò che riguarda", + dataTopicHint: "Ciò che l'algoritmo collega a questo tema", + dataNoMatches: "Nessun dato incrociato da mostrare.", + dataNoProfile: "Pubblica contenuti o scrivi il tuo CV così l'algoritmo impara cosa ti interessa.", + pollsDescription: "Modulo per interrogare la rete e contare le risposte.", + pollFilterAll: "TUTTI", + pollFilterMine: "I MIEI", + pollFilterRecent: "RECENTI", + pollFilterTop: "TOP", + pollFilterVoted: "VOTATI", + pollFilterOpen: "APERTI", + pollFilterClosed: "CHIUSI", + pollCreateButton: "Crea Sondaggio", + pollCreateTitle: "Crea Sondaggio", + pollEditTitle: "Modifica Sondaggio", + pollQuestion: "Domanda", + pollQuestionPlaceholder: "Cosa vuoi chiedere?", + pollOptions: "Opzioni (una per riga)", + pollOutcome: "Risultato", + pollNoVotesYet: "Ancora nessun voto", + pollTie: "Pareggio", + pollOptionsPlaceholder: "Piazza\nParco\nBar", + pollAnonymous: "Anonimo", + pollAnonymousLabel: "Sondaggio anonimo", + pollMultiple: "Scelta multipla", + pollMultipleLabel: "Consenti più risposte", + pollDeadline: "Scadenza", + pollTags: "Etichette", + pollPublishButton: "Pubblica Sondaggio", + pollUpdateButton: "Aggiorna", + pollCloseButton: "Chiudi", + pollDeleteButton: "Elimina", + pollVoteButton: "Vota", + pollChangeVote: "Cambia Voto", + pollVoters: "Votanti", + pollComments: "Commenti", + pollStatusLabel: "Stato", + pollStatusOpen: "APERTO", + pollStatusClosed: "CHIUSO", + pollSearchPlaceholder: "Cerca sondaggi...", + pollsNoItems: "Nessun sondaggio trovato.", + viewPoll: "Vedi Sondaggio", + pollChatCreate: "Crea Sondaggio", + pollInChat: "Sondaggio", + blogTitle: "Blog", + blogDescription: "Modulo per scoprire e gestire i blog.", + blogFilterAll: "TUTTI", + blogFilterMine: "I MIEI", + blogFilterRecent: "RECENTI", + blogFilterFavorites: "PREFERITI", + blogFilterTop: "TOP", + blogCreateButton: "Crea Blog", + blogSearchPlaceholder: "Cerca blog...", + blogComments: "Commenti", + blogAllowComments: "Consenti commenti", + blogCommentsClosed: "L'autore ha chiuso i commenti di questo blog.", + blogNoItems: "Nessun blog trovato.", + viewBlog: "Vedi Blog", forumTitle: "Forum", forumCategoryLabel: "Categoria", forumTitleLabel: "Titolo", @@ -1648,43 +1465,22 @@ module.exports = { forumCreateButton: "Crea forum", forumCreateSectionTitle: "Crea forum", forumDescription: "Parla apertamente con altri abitanti nella tua rete.", + forumSearchPlaceholder: "Cerca forum...", forumFilterAll: "TUTTI", forumFilterMine: "MIEI", forumFilterRecent: "RECENTI", forumFilterTop: "TOP", - forumMineSectionTitle: "I tuoi forum", - forumRecentSectionTitle: "Forum recenti", - forumAllSectionTitle: "Forum", forumDeleteButton: "Elimina", forumParticipants: "partecipanti", forumMessages: "messaggi", - forumLastMessage: "Ultimo messaggio", forumMessageLabel: "Messaggio", forumMessagePlaceholder: "Scrivi il tuo messaggio...", forumSendButton: "Invia", - forumVisitForum: "Visita forum", noForums: "Nessun forum trovato.", - forumVisitButton: "Visita forum", - forumCatGENERAL: "Generale", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Politica", - forumCatTECH: "Tecnologia", - forumCatSCIENCE: "Scienza", - forumCatMUSIC: "Musica", - forumCatART: "Arte", - forumCatGAMING: "Gaming", - forumCatBOOKS: "Libri", - forumCatFILMS: "Film", - forumCatPHILOSOPHY: "Filosofia", - forumCatSOCIETY: "Società", - forumCatPRIVACY: "Privacy", - forumCatCYBERWARFARE: "Cyberwarfare", - forumCatSURVIVALISM: "Survivalismo", + forumVisitButton: "Vedi Forum", + forumTopicLabel: "Argomento", imageTitle: "Immagini", imageDescription: "Esplora e gestisci immagini nella tua rete.", - imagePluginTitle: "Titolo", - imagePluginDescription: "Descrizione", imageMineSectionTitle: "Le tue immagini", imageCreateSectionTitle: "Carica immagine", imageUpdateSectionTitle: "Aggiorna immagine", @@ -1693,14 +1489,12 @@ module.exports = { imageTopSectionTitle: "Immagini più votate", imageFavoritesSectionTitle: "Preferiti", imageGallerySectionTitle: "Galleria", - imageMemeSectionTitle: "Meme", imageFilterAll: "TUTTE", imageFilterMine: "MIE", imageFilterRecent: "RECENTI", imageFilterTop: "TOP", imageFilterFavorites: "PREFERITE", imageFilterGallery: "GALLERIA", - imageFilterMeme: "MEME", imageCreateButton: "Carica immagine", imageUpdateButton: "Aggiorna", imageDeleteButton: "Elimina", @@ -1713,7 +1507,6 @@ module.exports = { imageTitlePlaceholder: "Opzionale", imageDescriptionLabel: "Descrizione", imageDescriptionPlaceholder: "Opzionale", - imageMemeLabel: "MEME?", imageNoFile: "Nessun file immagine fornito", noImages: "Nessuna immagine disponibile.", imageSearchPlaceholder: "Cerca titolo, tag, descrizione, autore...", @@ -1721,7 +1514,6 @@ module.exports = { imageSortOldest: "Più vecchie", imageSortTop: "Più votate", imageSearchButton: "Cerca", - imageMessageAuthorButton: "Messaggio", imageUpdatedAt: "Aggiornato", imageNoMatch: "Nessuna immagine corrisponde alla ricerca.", feedTitle: "Feed", @@ -1729,7 +1521,6 @@ module.exports = { createFeedButton: "Invia Feed!", feedPlaceholder: "Cosa succede? (max 280 caratteri)", TODAYButton: "OGGI", - CREATEButton: "Crea Feed", totalOpinions: "Opinioni totali", moreVoted: "Più votato", noFeedsFound: "Nessun feed trovato.", @@ -1752,20 +1543,12 @@ module.exports = { concept: "Concetto", description: "Descrizione", meme: "Meme", - activityContact: "Contatto", - activityBy: "Nome", - activityPixelia: "Nuovo pixel aggiunto", - viewImage: "Vedi immagine", - playAudio: "Riproduci audio", - playVideo: "Riproduci video", typeRecent: "RECENTI", - errorActivity: "Errore nel recupero dell'attività", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "RECENTI", typeTribe: "TRIBÙ", typeLarp: "L.A.R.P.", typeInhabitants: "ABITANTI", - activityProfileUpdated: "ha aggiornato il profilo", typeAbout: "ABITANTI", typeCurriculum: "CVS", typeImage: "IMMAGINI", @@ -1809,8 +1592,6 @@ module.exports = { typeCourtsSettlementAccepted: "Tribunali · Accordo accettato", typeCourtsNomination: "Tribunali · Nomina", typeCourtsNominationVote: "Tribunali · Voto di nomina", - activitySupport: "Nuova alleanza forgiata", - activityJoin: "Nuovo PUB unito", question: "Domanda", deadline: "Scadenza", status: "Stato", @@ -1824,12 +1605,8 @@ module.exports = { date: "Data", category: "Categoria", attendees: "Partecipanti", - activitySpread: "->", - visitLink: "Visita link", - viewDocument: "Vedi documento", location: "Posizione", contentWarning: "Oggetto", - personName: "Nome abitante", bankWalletConnected: "Portafoglio ECOin", bankUbiReceived: "UBI ricevuto", bankTx: "Tx", @@ -1839,7 +1616,6 @@ module.exports = { link: "Link", activityProjectFollow: "%OASIS% ora sta %ACTION% questo progetto %PROJECT%", activityProjectUnfollow: "%OASIS% ora sta %ACTION% questo progetto %PROJECT%", - activityProjectPledged: "%OASIS% ha %ACTION% %AMOUNT% al progetto %PROJECT%", following: "SEGUENDO", unfollowing: "NON SEGUENDO", pledged: "CONTRIBUITO", @@ -1885,26 +1661,17 @@ module.exports = { courtsVotesSlashTotal: "SÌ / TOTALE", courtsOpenVote: "Apri votazione", courtsAnswerTitle: "Rispondi alla denuncia", - courtsStanceADMIT: "Ammetti", - courtsStanceDENY: "Nega", - courtsStancePARTIAL: "Parziale", - courtsStanceCOUNTERCLAIM: "Controdenuncia", - courtsStanceNEUTRAL: "Neutrale", courtsVerdictResult: "Risultato", courtsVerdictOrders: "Ordini", courtsSettlementText: "Condizioni", courtsSettlementAccepted: "Accettato", - courtsSettlementPending: "In attesa", courtsJudge: "Giudice", courtsThSupports: "Supporti", courtsFilterOpenCase: 'Apri caso', - courtsEvidenceFileLabel: 'File di prova (immagine, audio, video o PDF)', - courtsCaseMediators: 'Mediatori', courtsCaseMediatorsPh: 'Oasis ID dei mediatori, separati da virgola', courtsMediatorsLabel: 'Mediatori', courtsThCase: 'Caso', courtsThCreatedAt: 'Data di inizio', - courtsThActions: 'Azioni', courtsPublicPrefLabel: 'Visibilità dopo la risoluzione', courtsPublicPrefYes: 'Acconsento che questo caso sia completamente pubblico', courtsPublicPrefNo: 'Preferisco mantenere i dettagli privati', @@ -1912,8 +1679,11 @@ module.exports = { courtsMethodMEDIATION: 'Mediazione', courtsNoCases: 'Nessun caso.', reportsTitle: "Rapporti", - reportsDescription: "Gestisci e monitora le segnalazioni relative a problemi, bug, abusi e avvisi sui contenuti nella tua rete.", + reportsDescription: "Gestisci e segui le segnalazioni della tua rete.", + reportsSearchPlaceholder: "Cerca segnalazioni...", reportsFilterAll: "TUTTI", + reportsFilterRecent: "RECENTI", + reportsFilterTop: "TOP", reportsFilterMine: "MIEI", reportsFilterFeatures: "FUNZIONALITÀ", reportsFilterBugs: "BUG", @@ -1926,18 +1696,13 @@ module.exports = { reportsFilterInvalid: "NON VALIDI", reportsCreateButton: "Crea segnalazione", reportsTitleLabel: "Titolo", - reportsDescriptionLabel: "Descrizione", - reportsDescriptionPlaceholder: "Fornisci una descrizione dettagliata.", reportsCategory: "Categoria", - reportsCategoryLabel: "Categoria", reportsCategoryFeatures: "Funzionalità", reportsCategoryBugs: "Bug", reportsCategoryAbuse: "Abuso", - reportsCategoryContent: "Problemi di contenuto", + reportsCategoryContent: "Contenuto", reportsUpdateButton: "Aggiorna", reportsDeleteButton: "Elimina", - reportsDateLabel: "Data", - reportsUploadFile: "Carica media (max: 50MB)", reportsMineSectionTitle: "Le tue segnalazioni", reportsFeaturesSectionTitle: "Richieste di funzionalità", reportsBugsSectionTitle: "Bug", @@ -1945,11 +1710,6 @@ module.exports = { reportsContentSectionTitle: "Problemi di contenuto", reportsAllSectionTitle: "Rapporti", reportsNoItems: "Nessuna segnalazione disponibile.", - reportsValidationTitle: "Inserisci un titolo valido.", - reportsValidationDescription: "La descrizione non può essere vuota.", - reportsValidationCategory: "Seleziona una categoria.", - reportsCreatedAt: "Creato il", - reportsCreatedBy: "Di", reportsSeverity: "Gravità", reportsSeverityLow: "Bassa", reportsSeverityMedium: "Media", @@ -1960,13 +1720,10 @@ module.exports = { reportsStatusUnderReview: "In revisione", reportsStatusResolved: "Risolto", reportsStatusInvalid: "Non valido", - reportsUpdateStatusButton: "Aggiorna stato", - reportsAnonymityOption: "Invia in modo anonimo", - reportsAnonymousAuthor: "Anonimo", reportsConfirmButton: "CONFERMA SEGNALAZIONE!", reportsConfirmations: "Conferme", reportsConfirmedSectionTitle: "Segnalazioni confermate", - reportsCreateTaskButton: "CREA COMPITO", + reportsCreateTaskButton: "Crea Compito", reportsOpenSectionTitle: "Segnalazioni aperte", reportsUnderReviewSectionTitle: "Segnalazioni in revisione", reportsResolvedSectionTitle: "Segnalazioni risolte", @@ -2010,6 +1767,20 @@ module.exports = { reportsRequestedActionLabel: 'Azione richiesta', reportsRequestedActionPlaceholder: 'Rimuovi, nascondi, tagga, avvisa, ecc.', tribesTitle: "Tribù", + tribeFilterAll: "TUTTE", + tribeFilterRecent: "RECENTI", + tribeFilterMine: "MIE", + tribeFilterMembership: "ADESIONE", + tribeFilterSubtribes: "SOTTOTRIBÙ", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALLERIA", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MIEI", + tribeFeedFilterALL: "TUTTI", + tribeFeedFilterRECENT: "RECENTI", + courtsStanceDENY: "Nega", + courtsStanceADMIT: "Ammetti", + courtsStancePARTIAL: "Ammetti in parte", tribeAllSectionTitle: "Tribù", tribeMineSectionTitle: "Le tue tribù", tribeCreateSectionTitle: "Crea tribù", @@ -2021,13 +1792,6 @@ module.exports = { tribeviewSubTribeButton: "Visita Sotto-Tribù", tribeRootLabel: "RADICE", tribeDescription: "Esplora o crea tribù nella tua rete.", - tribeFilterAll: "TUTTE", - tribeFilterMine: "MIE", - tribeFilterMembership: "ISCRIZIONE", - tribeFilterRecent: "RECENTI", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "SOTTO-TRIBÙ", - tribeFilterGallery: "GALLERIA", tribeMainTribeLabel: "TRIBÙ PRINCIPALE", tribeCreateButton: "Crea tribù", tribeUpdateButton: "Aggiorna", @@ -2046,13 +1810,8 @@ module.exports = { tribeModeLabel: "MODE", tribeIsAnonymousLabel: "STATO", tribeMembersCount: "Membri", - tribeInviteCodePlaceholder: "Inserisci codice invito", - tribeJoinByCodeButton: "Unisciti con codice", - tribeJoinButton: "UNISCITI", tribeEnterInvite: "INSERISCI CODICE", tribeLeaveButton: "ESCI", - tribeYes: "SÌ", - tribeNo: "NO", tribePublic: "PUBBLICO", tribePrivate: "PRIVATO", tribeGenerateInvite: "INVITO SINGOLO", @@ -2061,13 +1820,8 @@ module.exports = { tribeRemoveInvitation: "RIMUOVI INVITO", tribeCreatedAt: "Creato il", tribeAuthor: "Di", - tribeAuthorLabel: "AUTORE", tribeStrict: "Rigoroso", tribeOpen: "Aperto", - tribeFeedFilterRECENT: "RECENTI", - tribeFeedFilterMINE: "MIEI", - tribeFeedFilterALL: "TUTTI", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Ricondivisioni", tribeFeedRefeed: "Ricondividi", tribeFeedMessagePlaceholder: "Scrivi un feed…", @@ -2077,17 +1831,12 @@ module.exports = { tribeNotFound: "Tribù non trovata!", createTribeTitle: "Crea tribù", updateTribeTitle: "Aggiorna tribù", - tribeSectionOverview: "Panoramica", tribeSectionInhabitants: "Abitanti", tribeSectionVotations: "VOTAZIONI", tribeSectionEvents: "EVENTI", - tribeSectionReports: "Segnalazioni", tribeSectionTasks: "COMPITI", tribeSectionFeed: "FEED", tribeSectionForum: "FORUM", - tribeSectionMarket: "Mercato", - tribeSectionJobs: "Lavori", - tribeSectionProjects: "Progetti", tribeSectionMedia: "Media", tribeSectionImages: "IMMAGINI", tribeSectionAudios: "AUDIO", @@ -2125,11 +1874,6 @@ module.exports = { tribeTaskStatusClosed: "CHIUDI", tribeTaskAssign: "ASSEGNA", tribeTaskUnassign: "RIMUOVI", - tribeReportCreate: "Crea segnalazione", - tribeReportsEmpty: "Nessuna segnalazione.", - tribeReportTitle: "Titolo", - tribeReportDescription: "Descrizione", - tribeReportCategory: "Categoria", tribeVotationCreate: "Crea votazione", tribeVotationsEmpty: "Nessuna votazione.", tribeVotationTitle: "Titolo", @@ -2147,27 +1891,6 @@ module.exports = { tribeForumCategory: "Categoria", tribeForumReply: "Rispondi", tribeForumReplies: "Risposte", - tribeMarketCreate: "Crea annuncio", - tribeMarketEmpty: "Nessun annuncio.", - tribeMarketTitle: "Titolo", - tribeMarketDescription: "Descrizione", - tribeMarketPrice: "Prezzo", - tribeMarketImage: "Immagine", - tribeMarketCategory: "Categoria", - tribeJobCreate: "Crea lavoro", - tribeJobsEmpty: "Nessun lavoro.", - tribeJobTitle: "Titolo", - tribeJobDescription: "Descrizione", - tribeJobLocation: "Posizione", - tribeJobSalary: "Stipendio", - tribeJobDeadline: "Scadenza", - tribeProjectCreate: "Crea progetto", - tribeProjectsEmpty: "Nessun progetto.", - tribeProjectTitle: "Titolo", - tribeProjectDescription: "Descrizione", - tribeProjectGoal: "Obiettivo", - tribeProjectFunded: "Finanziato", - tribeProjectDeadline: "Scadenza", tribeMediaUpload: "Carica media", readDocument: "Leggi Documento", tribeCreateImage: "Crea Immagine", @@ -2178,7 +1901,6 @@ module.exports = { tribeMediaEmpty: "Nessun media.", tribeMediaTitle: "Titolo", tribeMediaDescription: "Descrizione", - tribeMediaType: "Tipo", tribeMediaTypeImage: "Immagine", tribeMediaTypeVideo: "Video", tribeMediaTypeAudio: "Audio", @@ -2188,11 +1910,6 @@ module.exports = { tribeInviteCodeText: "Codice invito: ", oasisVersionLabel: "Versione di Oasis", tribeInviteCodeHint: "Condividi questo codice con chi vuoi invitare. Può unirsi tramite /invites → Tribes.", - tribeGroupTribe: "Tribù", - tribeGroupOffice: "Ufficio", - tribeGroupNetwork: "Rete", - tribeGroupEconomy: "Economia", - tribeGroupMedia: "Media", tribeStatusOpen: "APERTO", tribeStatusClosed: "CHIUSO", tribeStatusInProgress: "IN CORSO", @@ -2202,33 +1919,17 @@ module.exports = { tribePriorityCritical: "CRITICA", tribeTaskFilterAll: "TUTTI", tribeMediaFilterAll: "TUTTI", - tribeReportCatBug: "BUG", - tribeReportCatAbuse: "ABUSO", - tribeReportCatContent: "CONTENUTO", - tribeReportCatOther: "ALTRO", tribeForumCatGeneral: "GENERALE", tribeForumCatProposal: "PROPOSTA", tribeForumCatQuestion: "DOMANDA", tribeForumCatAnnouncement: "ANNUNCIO", - tribeMarketCatGoods: "BENI", - tribeMarketCatServices: "SERVIZI", - tribeMarketCatFood: "CIBO", - tribeMarketCatOther: "ALTRO", tribeStatusLabel: "Stato", tribeSubTribes: "SOTTO-TRIBÙ", tribeSubTribesCreate: "Crea Sotto-Tribù", tribeSubTribesStrictDenied: "La modalità rigida della tribù non ti consente di creare nuove sotto-tribù. Si prega di contattare l'amministratore.", - tribeSubTribesEmpty: "Nessuna sotto-tribù creata.", - tribeActivityJoined: "ISCRITTO", - tribeActivityLeft: "USCITO", - tribeActivityFeed: "FEED", tribeActivityRefeed: "RICONDIVISIONE", - tribeGroupAnalytics: "Analisi", - tribeGroupCreative: "Creativo", tribeSectionActivity: "ATTIVITÀ", tribeSectionTrending: "TENDENZE", - tribeSectionOpinions: "OPINIONI", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "TAG", tribeSectionSearch: "RICERCA", tribeActivityEmpty: "Nessuna attività.", @@ -2240,25 +1941,15 @@ module.exports = { tribeTrendingPeriodWeek: "Questa settimana", tribeTrendingPeriodAll: "Sempre", tribeTrendingEngagement: "coinvolgimento", - tribeOpinionsEmpty: "Nessuna opinione.", - tribeOpinionsCast: "Vota", - tribeOpinionsRankings: "Classifiche", - tribeOpinionsAlreadyVoted: "Già votato", tribeTopCategory: "Più votato", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Tela collaborativa di pixel art.", - tribePixeliaPaint: "Dipingi", - tribePixeliaContributors: "contributori", - tribePixeliaTotalPixels: "pixel dipinti", tribeTagsEmpty: "Nessun tag trovato.", - tribeTagsCloud: "Nuvola di tag", - tribeTagsContentWith: "Contenuto con tag", tribeSearchPlaceholder: "Cerca nei contenuti della tribù...", tribeSearchEmpty: "Nessun risultato trovato.", tribeSearchResults: "Risultati", tribeSearchMinChars: "Inserisci almeno 2 caratteri per cercare.", agendaTitle: "Agenda", agendaDescription: "Qui trovi tutti gli elementi assegnati a te.", + agendaSearchPlaceholder: "Cerca nell'agenda...", agendaFilterAll: "TUTTI", agendaFilterToday: "OGGI", agendaFilterUpcoming: "PROSSIMI", @@ -2277,20 +1968,9 @@ module.exports = { agendaFilterProjects: "PROGETTI", agendaFilterCalendars: "CALENDARI", agendaNoItems: "Nessun incarico trovato.", - agendaAuthor: "Di", agendaDiscardButton: "Scarta", agendaRestoreButton: "Ripristina", - agendaCreatedAt: "Creato il", - agendaTitleLabel: "Titolo", agendaMembersCount: "Membri", - agendaDescriptionLabel: "Descrizione", - agendaStatus: "Stato", - agendaVisibility: "Visibilità", - agendaEventDate: "Data evento", - agendaEventLocation: "Posizione", - agendaEventPrice: "Prezzo", - agendaEventUrl: "URL", - agendaTaskStart: "Ora di inizio", agendaLocationLabel: "Posizione", agendaYes: "SÌ", agendaNo: "NO", @@ -2300,11 +1980,6 @@ module.exports = { agendareportCategory: "Categoria", agendareportSeverity: "Gravità", agendareportStatus: "Stato", - agendareportDescription: "Descrizione", - agendaTaskEnd: "Ora di fine", - agendaTaskPriority: "Priorità", - agendaTransferFrom: "Da", - agendaTransferTo: "A", agendaTransferConcept: "Concetto", agendaTransferAmount: "Importo", agendaTransferDeadline: "Scadenza", @@ -2314,47 +1989,7 @@ module.exports = { voteNow: "Vota ora", alreadyVoted: "Hai già espresso un'opinione.", noOpinionsFound: "Nessuna opinione trovata.", - RECENTButton: "RECENT", TOPButton: "TOP", - interestingButton: "INTERESSANTE", - necessaryButton: "NECESSARIO", - funnyButton: "DIVERTENTE", - disgustingButton: "DISGUSTOSO", - sensibleButton: "SENSIBILE", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "SOLO ADULTI", - boringButton: "NOIOSO", - confusingButton: "CONFUSO", - usefulButton: "UTILE", - informativeButton: "INFORMATIVO", - wellResearchedButton: "BEN DOCUMENTATO", - accurateButton: "ACCURATO", - needsSourcesButton: "SERVONO FONTI", - wrongButton: "SBAGLIATO", - lowQualityButton: "BASSA QUALITÀ", - creativeButton: "CREATIVO", - insightfulButton: "PERSPICACE", - actionableButton: "ATTUABILE", - inspiringButton: "ISPIRANTE", - loveButton: "AMORE", - clearButton: "CHIARO", - upliftingButton: "EDIFICANTE", - unnecessaryButton: "INUTILE", - rejectedButton: "RIFIUTATO", - misleadingButton: "FUORVIANTE", - offTopicButton: "FUORI TEMA", - duplicateButton: "DUPLICATO", - clickbaitButton: "CLICKBAIT", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "VIOLENTO", - toxicButton: "TOSSICO", - harassmentButton: "MOLESTIA", - hateButton: "ODIO", - scamButton: "TRUFFA", - triggeringButton: "DISTURBANTE", - opinionsCreatedAt: "Creato il", opinionsTotalCount: "Opinioni totali", voteInteresting: "Interessante", voteNecessary: "Necessario", @@ -2391,7 +2026,6 @@ module.exports = { voteCreative: "Creativo", voteSpam: "Spam", voteAdultOnly: "Solo adulti", - publishBlog: "Pubblica post", privateMessage: "PM", pmSendTitle: "Messaggi privati", pmSend: "Invia!", @@ -2402,7 +2036,6 @@ module.exports = { pmComposeTitle: "Invia un messaggio", pmRecipients: "Destinatari", pmRecipientsHint: "Inserisci Oasis ID separati da virgole", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Fino a 7 destinatari per messaggio.", pmTextPlaceholder: "Corpo limitato a 7000 caratteri.", pmSubject: "Oggetto", @@ -2426,7 +2059,6 @@ module.exports = { pmCrypterCharsLabel: "caratteri", pmInvalidRecipients: "Oasis ID non valido (dovrebbe essere tipo @…=.ed25519).", pmEncryptionLabel: "Cifratura", - pmFile: "Allegato", private: "Privato", privateDescription: "I tuoi messaggi crittografati.", privateInbox: "POSTA IN ARRIVO", @@ -2436,10 +2068,8 @@ module.exports = { noPrivateMessages: "Nessun messaggio privato.", pmFromLabel: "Da:", pmToLabel: "A:", - pmInvalidMessage: "Messaggio non valido", pmNoSubject: "(senza oggetto)", pmSubjectLabel: "Oggetto:", - pmBodyLabel: "Messaggio", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2457,8 +2087,6 @@ module.exports = { inboxJobSubscribedTitle: "Nuova iscrizione alla tua offerta di lavoro", pmInhabitantWithId: "Abitante con Oasis ID:", pmHasSubscribedToYourJobOffer: "si è iscritto alla tua offerta di lavoro", - inboxProjectCreatedTitle: "Nuovo progetto creato", - pmHasCreatedAProject: "ha creato un progetto", inboxMarketItemSoldTitle: "Articolo venduto", inboxShopSoldTitle: "Prodotto venduto", pmYourItem: "Il tuo articolo", @@ -2468,7 +2096,6 @@ module.exports = { pmHasPledged: "ha contribuito", pmToYourProject: "al tuo progetto", blockchain: 'BlockExplorer', - blockchainTitle: 'BlockExplorer', blockchainDescription: 'Esplora e visualizza i blocchi nella blockchain.', blockchainNoBlocks: 'Nessun blocco trovato nella blockchain.', blockchainStatsTitle: 'Statistiche', @@ -2480,19 +2107,17 @@ module.exports = { blockchainBlockCarbon: 'Impronta di carbonio', blockchainBlockType: 'Tipo', blockchainBlockTimestamp: 'Data e ora', - blockchainBlockContent: 'Blocco', - blockchainBlockURL: 'URL:', - blockchainContent: 'Blocco', - blockchainContentPreview: 'Anteprima del contenuto del blocco', blockchainLatestDatagram: 'Ultimo Datagramma', - blockchainDatagram: 'Datagramma', - blockchainDetails: 'Vedi dettagli blocco', - blockchainViewBlockexplorer: "Vedi nel blockexplorer", - blockchainBlockInfo: 'Informazioni blocco', - blockchainBlockDetails: 'Dettagli del blocco selezionato', + blockchainDatagram: "Datagramma", + blockchainDetails: "Vedi i Dettagli del Blocco", + blockchainViewBlockexplorer: "Vedi nel Blockexplorer", blockchainBack: 'Torna al BlockExplorer', blockchainContentDeleted: "Questo contenuto è stato rimosso (tombstone)", - visitContent: "Visita contenuto", + visitContent: "Visita il Contenuto", + favoriteAdd: "Aggiungi ai Preferiti", + pmContentTooltip: "Invia un Messaggio Privato", + favoriteRemove: "Togli dai Preferiti", + reportContent: "Segnala il Contenuto", banking: 'Banking', bankingTitle: 'Banking', bankingDescription: "L'economia ECOin: saldo, reddito di base, tasse e valore dell'industria.", @@ -2501,21 +2126,17 @@ module.exports = { bankRules: 'Regole', pending: 'In attesa', closed: 'Chiuso', - bankBack: 'Torna alla Banca', bankViewTx: 'Vedi Tx', bankClaimNow: 'Riscuoti ora', bankClaimUBI: 'Richiedi RBU!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'Nessuna assegnazione RBU in sospeso per questa epoca.', bankEpoch: 'Epoca', bankPool: 'Pool (questa epoca)', bankWeightsSum: 'Somma dei pesi', - bankAllocations: 'Allocazioni', bankNoAllocations: 'Nessuna allocazione trovata.', bankNoEpochs: 'Nessuna epoca trovata.', bankEpochAllocations: 'Allocazioni epoca', @@ -2534,9 +2155,6 @@ module.exports = { bankYourFundsMonth: "I tuoi fondi (questo mese)", bankIndustryBalance: "Produzione industriale (stimata)", bankUserBalance: 'Il tuo saldo', - ecoWalletNotConfigured: 'Portafoglio ECOin non configurato', - editWallet: 'Modifica portafoglio', - addWallet: 'Aggiungi portafoglio', bankAddresses: 'Indirizzi', bankNoAddresses: 'Nessun indirizzo trovato.', bankUser: 'Oasis ID', @@ -2561,15 +2179,7 @@ module.exports = { search: 'Cerca!', bankLocal: 'Locale', bankFromOasis: 'Oasis', - bankMyAddress: 'Il tuo indirizzo', - bankRemoveMyAddress: 'Rimuovi il mio indirizzo', - bankNotRemovableOasis: 'Gli indirizzi non possono essere rimossi localmente', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "NESSUN FONDO!", bankUbiAvailableOk: "DISPONIBILE!", bankUbiAvailability: "RBU (rete)", @@ -2586,13 +2196,6 @@ module.exports = { shopsTitle: "Negozi", shopDescription: "Scopri e gestisci negozi nella rete.", shopTitle: "Negozio", - shopFilterAll: "TUTTI", - shopFilterMine: "MIEI", - shopFilterRecent: "RECENTI", - shopFilterTop: "TOP", - shopFilterProducts: "PRODOTTI", - shopFilterPrices: "PREZZI", - shopFilterFavorites: "PREFERITI", shopUpload: "Crea Negozio", shopAllSectionTitle: "Tutti i Negozi", shopMineSectionTitle: "I Miei Negozi", @@ -2609,16 +2212,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Pubblica su Clearnet", - shopClearnetUnpublish: "Rimuovi dal Clearnet", - shopClearnetUrlLabel: "URL Clearnet", - shopClearnetWarning: "Pubblicare su Clearnet rende questo negozio indicizzabile da motori di ricerca e crawler esterni.", shopAddFavorite: "Aggiungi Preferito", shopRemoveFavorite: "Rimuovi Preferito", shopOpen: "APERTO", shopClosed: "CHIUSO", - shopOpenShop: "Apri Negozio", - shopCloseShop: "Chiudi Negozio", shopMakePrivate: "RENDI PRIVATO (E2E)", shopMakePublic: "RENDI PUBBLICO", shopProducts: "Prodotti", @@ -2646,8 +2243,6 @@ module.exports = { shopOrderPrice: "Prezzo", shopOrderBuyer: "Acquirente", shopBackToShop: "Torna al Negozio", - shopShareUrl: "URL di condivisione", - shopVisitShop: "VISITA NEGOZIO", marketVisitItem: "VEDI OGGETTO", shopStatus: "STATO", shopCreatedAt: "CREATO", @@ -2656,12 +2251,10 @@ module.exports = { shopLocation: "Posizione", shopTags: "Tag", shopVisibility: "Visibilità", - shopImage: "Immagine", shopShortDescription: "Descrizione Breve", shopShortDescriptionPlaceholder: "Descrizione breve per le schede (max 160 caratteri)", shopTitlePlaceholder: "Nome del tuo negozio", shopDescriptionPlaceholder: "Descrizione dettagliata del tuo negozio", - shopUrlPlaceholder: "https://url-del-tuo-negozio.com", shopLocationPlaceholder: "Città, Paese", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Titolo della mappa", @@ -2679,7 +2272,6 @@ module.exports = { bankUnitMinutes: "minuti", bankUnitDays: "giorni", bankExchangeNoData: 'Nessun dato disponibile', - bankExchangeIndex: 'Valore ECOin (1h)', bankInflation: 'Inflazione ECOin (anual)', bankInflationMonthly: 'Inflazione ECOin (mensual)', bankExchangeChartTitle: 'Progressione del valore ECOin nel tempo', @@ -2693,38 +2285,17 @@ module.exports = { bankingSyncStatusOutdated: 'Non aggiornato', statsTitle: 'Statistiche', statistics: "Statistiche", - statsInhabitant: "Statistiche abitante", statsDescription: "Scopri le statistiche della tua rete.", ALLButton: "ALL", MINEButton: "MINE", TOMBSTONEButton: "TOMBSTONES", - statsYou: "Tu", - statsUserId: "Oasis ID", statsCreatedAt: "Creato il", statsYourContent: "Contenuto", statsYourOpinions: "Opinioni", - statsYourTombstone: "Tombstone", - statsNetwork: "Rete", - statsTotalInhabitants: "Abitanti", - statsDiscoveredTribes: "Tribù (Pubbliche)", - statsPrivateDiscoveredTribes: "Tribù (Private)", statsNetworkContent: "Contenuto", - statsYourMarket: "Mercato", - statsYourJob: "Lavori", - statsYourProject: "Progetti", - statsYourTransfer: "Trasferimenti", - statsYourForum: "Forum", statsNetworkOpinions: "Opinioni", - statsDiscoveredMarket: "Mercato", - statsDiscoveredJob: "Lavori", - statsDiscoveredProject: "Progetti", - statsBankingTitle: "Banca", statsEcoWalletLabel: "Portafoglio ECOIN", statsEcoWalletNotConfigured: "Non configurato!", - statsTotalEcoAddresses: "Indirizzi totali", - statsDiscoveredTransfer: "Trasferimenti", - statsDiscoveredForum: "Forum", - statsNetworkTombstone: "Tombstone", statsBookmark: "Segnalibri", statsEvent: "Eventi", statsTask: "Compiti", @@ -2746,16 +2317,12 @@ module.exports = { statsAiExchange: "AI", statsPUBs: 'PUBs', statsPost: "Post", - statsOasisID: "Oasis ID", statsSize: "Totale (dimensione)", statsBlockchainSize: "Blockchain (dimensione)", statsBlobsSize: "Blob (dimensione)", statsActivity7d: "Attività (ultimi 7 giorni)", statsActivity7dTotal: "Totale 7 giorni", statsActivity30dTotal: "Totale 30 giorni", - statsKarmaScore: "Punteggio KARMA", - statsPublic: "Pubblico", - statsPrivate: "Privato", day: "Giorno", messages: "Messaggi", statsProject: "Progetti", @@ -2767,30 +2334,14 @@ module.exports = { statsProjectsCancelled: "Annullato", statsProjectsGoalTotal: "Obiettivo totale", statsProjectsPledgedTotal: "Contribuito totale", - statsProjectsSuccessRate: "Tasso di successo", - statsProjectsAvgProgress: "Progresso medio", - statsProjectsMedianProgress: "Progresso mediano", - statsProjectsActiveFundingAvg: "Finanziamento attivo medio", - statsJobsTitle: "Lavori", - statsJobsTotal: "Lavori totali", - statsJobsOpen: "Aperti", - statsJobsClosed: "Chiusi", - statsJobsOpenVacants: "Posti vacanti aperti", - statsJobsSubscribersTotal: "Iscritti totali", - statsJobsAvgSalary: "Stipendio medio", - statsJobsMedianSalary: "Stipendio mediano", statsMarketTitle: "Mercato", statsMarketTotal: "Articoli totali", statsMarketForSale: "In vendita", statsMarketReserved: "Riservato", statsMarketClosed: "Chiuso", statsMarketSold: "Venduto", - statsMarketRevenue: "Entrate", - statsMarketAvgSoldPrice: "Prezzo medio venduto", statsUsersTitle: "Abitanti", user: "Abitante", - statsTombstoneTitle: "Tombstone", - statsNetworkTombstones: "Tombstone della rete", statsTombstoneRatio: "Rapporto tombstone (%)", statsParliamentCandidature: "Candidature parlamento", statsParliamentTerm: "Mandati parlamento", @@ -2817,30 +2368,21 @@ module.exports = { aiConfiguration: "Imposta prompt", aiPromptUsed: "Prompt", aiClearHistory: "Cancella cronologia chat", - aiSharePrompt: "Aggiungere questa risposta all'addestramento collettivo?", - aiShareYes: "Sì", - aiShareNo: "No", - aiSharedLabel: "Aggiunto all'addestramento", - aiRejectedLabel: "Non aggiunto all'addestramento", aiServerError: "L'AI non ha potuto rispondere. Riprova.", aiInputPlaceholder: "Cos'è Oasis?", typeAiExchange: "AI", aiApproveTrain: "Aggiungi all'addestramento collettivo", aiRejectTrain: "Non addestrare", - aiTrainPending: "In attesa di approvazione", aiTrainApproved: "Approvato per l'addestramento", aiTrainRejected: "Rifiutato per l'addestramento", aiSnippetsUsed: "Snippet utilizzati", aiSnippetsLearned: "Snippet appresi", statsAITraining: "Addestramento AI", - aiApproveCustomTrain: "Addestra usando questa risposta personalizzata", aiCustomAnswerPlaceholder: "Scrivi la tua risposta personalizzata…", - statsAIExchanges: "Scambi modello", marketMineSectionTitle: "I tuoi articoli", marketCreateSectionTitle: "Crea articolo", marketUpdateSectionTitle: "Aggiorna", marketAllSectionTitle: "Mercato", - marketRecentSectionTitle: "Mercato recente", marketTitle: "Mercato", marketDescription: "Un mercato per scambiare beni o servizi nella tua rete.", marketFilterAll: "TUTTI", @@ -2870,14 +2412,11 @@ module.exports = { marketItemDeadline: "Scadenza", marketItemIncludesShipping: "Spedizione inclusa?", marketItemHighestBid: "Offerta più alta", - marketItemHighestBidder: "Miglior offerente", marketItemStock: "Disponibilità", marketOutOfStock: "Esaurito", - marketItemBidTime: "Ora dell'offerta", marketActionsUpdate: "Aggiorna", marketUpdateButton: "Aggiorna", marketActionsDelete: "Elimina", - marketActionsSold: "Segna come venduto", marketActionsChangeStatus: "CAMBIA STATO", marketActionsBuy: "COMPRA!", marketAuctionBids: "Offerte attuali", @@ -2886,21 +2425,17 @@ module.exports = { marketNoItems: "Nessun articolo disponibile ancora.", marketYourBid: "La tua offerta", marketCreateFormImageLabel: "Carica media (max: 50MB)", - marketSearchLabel: "Cerca", marketSearchPlaceholder: "Cerca titolo o tag", marketMinPriceLabel: "Prezzo minimo", marketMaxPriceLabel: "Prezzo massimo", - marketSortLabel: "Ordina per", marketSortRecent: "Più recenti", marketSortPrice: "Prezzo", marketSortDeadline: "Scadenza", marketSearchButton: "Cerca", marketAuctionEndsIn: "Termina", marketAuctionEnded: "Terminata", - marketMyBidBadge: "Hai offerto", marketNoItemsMatch: "Nessun articolo corrisponde alla ricerca.", housingTitle: "Alloggi", - housingLabel: "Alloggi", housingDescriptionText: "Scopri e gestisci luoghi nella tua rete.", modulesHousingLabel: "Alloggi", modulesHousingDescription: "Modulo per scoprire e gestire luoghi.", @@ -2944,14 +2479,7 @@ module.exports = { housingAvailableFrom: "Disponibile dal", housingAvailableTo: "Disponibile fino al", housingTags: "Etichette", - housingImages: "Foto (dimensione max: 50MB ciascuna)", - housingRemovePhoto: "Rimuovi", spreadEditWarning: "Questo contenuto perderà gli spread dopo la modifica", - housingRemoveVideo: "Rimuovi video", - housingAddPhoto: "Aggiungi foto", - housingAddVideo: "Aggiungi video", - housingVideo: "Video (dimensione max: 50MB)", - housingPhotos: "Foto", housingRequests: "Richieste", housingRequestButton: "Richiedi", housingCancelButton: "Annulla richiesta", @@ -3020,7 +2548,6 @@ module.exports = { jobLocationPresencial: "In sede", jobLocationRemote: "Da remoto", jobVacantsPlaceholder: "Numero di posizioni", - jobSalaryPlaceholder: "Stipendio in ECO per 1 ora dedicata", jobImage: "Carica media (max: 50MB)", jobTasks: "Compiti", jobType: "Tipo lavoro", @@ -3030,7 +2557,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Lavori con stipendio più alto", createJobButton: "Pubblica lavoro", - viewDetailsButton: "Vedi dettagli", noJobsFound: "Nessuna offerta di lavoro trovata.", jobAuthor: "Di", jobTypeFreelance: "Freelance", @@ -3042,10 +2568,6 @@ module.exports = { jobsHoursOffered: "Ore offerte", jobsHoursRequested: "Ore richieste in cambio", jobsExchangeSkill: "Competenza richiesta in cambio", - jobsHoursOfferedPlaceholder: "es. 4", - jobsHoursRequestedPlaceholder: "es. 4", - jobsExchangeSkillPlaceholder: "es. falegnameria, design", - jobExchangeHint: "Per i lavori in scambio di ore, compila i campi seguenti invece dello stipendio.", jobTimePartial: "Part-time", jobTimeComplete: "Full-time", jobsDeleteButton: "ELIMINA", @@ -3053,28 +2575,17 @@ module.exports = { jobsFilterApplied: "CANDIDATURE", jobsAppliedTitle: "Le mie candidature", jobsAppliedBadge: "Candidato", - jobsFilterFavs: "Preferiti", - jobsFavsTitle: "Preferiti", - jobsFilterNeeds: "Serve aiuto", - jobsNeedsTitle: "Serve aiuto", - jobsSearchLabel: "Cerca", jobsSearchPlaceholder: "Cerca titolo, tag, descrizione...", jobsMinSalaryLabel: "Stipendio minimo", jobsMaxSalaryLabel: "Stipendio massimo", - jobsSortLabel: "Ordina per", jobsSortRecent: "Più recenti", jobsSortSalary: "Stipendio più alto", jobsSortSubscribers: "Più candidati", jobsSearchButton: "Cerca", - jobsFavoriteButton: "Preferito", - jobsUnfavoriteButton: "Rimuovi preferito", - jobsMessageAuthorButton: "PM", jobsApplicants: "Candidati", jobsUpdatedAt: "Aggiornato", jobSetOpen: "Segna come aperto", - jobNewBadge: "NUOVO", jobsTagsLabel: "Tag", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "Nessun lavoro corrisponde alla ricerca.", industrySearchPlaceholder: "Cerca fabbriche…", industryAllSectors: "Tutti i settori", @@ -3082,9 +2593,7 @@ module.exports = { industryAdvanceTo: "Imposta a", industryAmount: "Importo", industryApproveBuild: "Approva", - industryBackToFacility: "← Fabbrica", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Blueprint di Industria", industryBlueprints: "Blueprint", industryBuild: "Build", industryBuildNotes: "Note", @@ -3097,18 +2606,13 @@ module.exports = { industryBuilds: "Build", industryBuildTitle: "Titolo", industryContribute: "Contribuisci", - industryContributeEco: "Contribuisci ECO", - industryContributeLabor: "Contribuisci lavoro", industryContributeButton: "Contribuisci", - industryContributeMaterial: "Contribuisci materiale", industryContributions: "Contributi", - industryContributors: "contributori", industryCreateBlueprintButton: "Crea blueprint", industryDistribute: "Distribuisci", industryDistributeButton: "Distribuisci per quote", industryDistribution: "Distribuzione", industryEcoAmount: "Importo (ECO)", - industryEcoContribHint: "I contributi in ECO vengono trasferiti all'amministratore come custode della tesoreria del build.", industryEditBlueprint: "Modifica blueprint", industryFacility: "Fabbrica", industryKindLabel: "Tipo", @@ -3117,13 +2621,10 @@ module.exports = { industryKind_eco: "Fondi", industryLaborHours: "Lavoro (ore)", industryHours: "Ore", - industryLicense: "Licenza", industryMaterialItem: "Materiale", industryMaterials: "Materiali", - industryMaterialsHint: "Un materiale per riga, nel formato nome:quantità:prezzo.", industryEstMaterials: "Totale materiali", industryEstLabor: "Totale lavoro", - industryEstTaxes: "Tasse", industryEstTotal: "Prezzo stimato", industryBuildingPrice: "Prezzo di costruzione", industryFinalPrice: "Prezzo finale", @@ -3133,19 +2634,13 @@ module.exports = { industryNewBlueprint: "Nuovo blueprint", industryNewBuild: "Proponi un build", industryEditBuild: "Modifica produzione", - industryNoBlueprint: "— nessuno —", industryNeedBlueprint: "Crea prima un progetto: ogni produzione ne fabbrica uno.", industryNoBlueprints: "Ancora nessun blueprint.", industryNoBuilds: "Ancora nessun build.", industryNote: "Nota", industryOutput: "Output", - industryOutputItem: "Nome del prodotto", industryOutputKind: "Tipo di prodotto", - industryOutputQty: "Unità per produzione", - industryOutputUnit: "Unità di misura", industryOutputValue: "Valore di output (ECO, es. dalla vendita)", - industryPayout: "Pagamento", - industryPoints: "Karma", industryPostJob: "Crea lavoro", industryPot: "Monte", industryProposeBuildButton: "Proponi build", @@ -3153,8 +2648,6 @@ module.exports = { industryAuthor: "Autore", industrySellOnMarket: "Invia al mercato", industrySendToProjects: "Crea progetto", - industryShare: "Quota", - industryShares: "Quote", industrySkills: "Competenze", industryTreasury: "Tesoreria", industryKind_physical: "Fisico", @@ -3168,6 +2661,16 @@ module.exports = { industryBuildStatus_FAILED: "FALLITO", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Un lavoro corrisponde al tuo curriculum", + jobsBotMatchIntro: "Un lavoro corrisponde al tuo curriculum.", + jobsBotMatchJob: "Lavoro", + jobsBotMatchHint: "Ricevi questo perché il tuo curriculum è gestito dall'IA. Puoi disattivarlo nel tuo CV.", + cvAiManaged: "Gestito dall'IA", + switchOn: "ATTIVO", + switchOff: "DISATTIVO", + cvAiManagedHint: "Se attivo, JobsBot ti avvisa con un messaggio privato quando un lavoro corrisponde al tuo curriculum.", + cvMatchThreshold: "Avvisami da questo livello di corrispondenza", housingBotRequestedTitle: "Qualcuno ha richiesto uno dei tuoi luoghi.", housingBotCancelledTitle: "Una richiesta su uno dei tuoi luoghi è stata annullata.", housingBotYouRequestedTitle: "Hai richiesto un luogo.", @@ -3196,22 +2699,14 @@ module.exports = { industryRulesDistribution: "Quando una produzione è completata, lo steward distribuisce il monte (i fondi della produzione più il valore di vendita) tra i contributori, in proporzione alle loro quote.", industryRulesTreasury: "I contributi in ECO sono custoditi dall'amministratore come tesoreria del build fino alla distribuzione; tutti i movimenti sono registrati sulla rete e le dispute possono andare alle Courts.", industryJobs: "Lavori", - industryNoJobs: "Ancora nessuna posizione.", - industryCreatePosition: "Crea posizione", - industryViewCV: "CV", industryReportButton: "Segnala", industryCreateTask: "Crea attività", industryOpenDispute: "Apri controversia", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "es. unità, kg, licenza", - industryOutputItemPlaceholder: "es. robot", - industryOutputQtyPlaceholder: "es. 5", - industrySkillsPlaceholder: "es. saldatura, reti, installazione-solare", industryCreateInvite: "Genera invito", industryPauseVotes: "Voti di stato", industryTitle: "Industria", industryDescription: "Modulo per gestire collettivamente i mezzi di produzione.", - industryLabel: "Industria", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "DISTRIBUZIONE", @@ -3260,9 +2755,7 @@ module.exports = { industryInviteNeeded: "Serve un invito per unirti.", industryPauseButton: "Vota la pausa", industryResumeButton: "Vota la ripresa", - industryEditButton: "Modifica", industryDeleteButton: "Elimina", - industryBackToList: "← Industria", industryPendingApplicants: "Richieste in sospeso", industryVotesYes: "sì", industryVotesNo: "no", @@ -3270,23 +2763,13 @@ module.exports = { industryAdmit: "Ammetti", industryReject: "Rifiuta", industryDissolveTitle: "Sciogli fabbrica", - industryDissolveHint: "Lo scioglimento richiede un voto collettivo; l'amministratore non può sciogliere da solo.", industryDissolveVote: "Vota lo scioglimento", - industrySector_software: "Software", - industrySector_hardware: "Hardware", - industrySector_agriculture: "Agricoltura", - industrySector_textile: "Tessile", - industrySector_energy: "Energia", - industrySector_food: "Alimentare", - industrySector_construction: "Costruzioni", - industrySector_media: "Media", - industrySector_services: "Servizi", - industrySector_other: "Altro", industryPolicy_open: "Aperta", industryPolicy_vote: "Per voto", industryPolicy_invite: "Solo su invito", projectsTitle: "Progetti", projectsDescription: "Crea, finanzia e segui progetti comunitari nella tua rete.", + projectSearchPlaceholder: "Cerca progetti...", projectCreateProject: "Crea progetto", projectCreateButton: "Crea progetto", projectUpdateButton: "AGGIORNA", @@ -3330,14 +2813,8 @@ module.exports = { projectPledgeTitle: "Supporta questo progetto", projectPledgePlaceholder: "Importo in ECO", projectBounties: "Taglie", - projectBountiesInputLabel: "Taglie (una per riga: Titolo|Importo [ECO]|Descrizione)", - projectBountiesPlaceholder: "Correggi bug UI|100|Link al problema\nScrivi documentazione|250|Descrivi esempi d'uso", projectNoBounties: "Nessuna taglia trovata.", projectTitle: "Titolo", - projectAddBountyTitle: "Nuova taglia", - projectBountyTitle: "Titolo taglia", - projectBountyAmount: "Importo (ECO)", - projectBountyDescription: "Descrizione", projectMilestoneSelect: "Seleziona traguardo", projectBountyCreateButton: "Crea taglia", projectBountyStatus: "Stato taglia", @@ -3352,19 +2829,15 @@ module.exports = { projectMilestoneTitle: "Titolo traguardo", projectMilestoneTargetPercent: "Percentuale (%)", projectMilestoneDueDate: "Data", - projectMilestoneCreateButton: "Crea traguardo", projectMilestoneStatus: "Stato traguardo", projectMilestoneOpen: "aperto", projectMilestoneDone: "completato", projectMilestoneDue: "scadenza", - projectNoMilestones: "Nessun traguardo trovato.", projectMilestoneMarkDone: "Segna come completato", projectMilestoneTitlePlaceholder: "Inserisci titolo traguardo", projectMilestoneDescriptionPlaceholder: "Inserisci descrizione per questo traguardo", projectMilestoneDescription: "Descrizione traguardo", - projectBudgetGoal: "Budget (obiettivo)", projectBudgetAssigned: "Assegnato alle taglie", - projectBudgetRemaining: "Rimanente", projectBudgetOver: "⚠ Budget superato: l'assegnato supera l'obiettivo", projectFollowers: "Sostenitori", projectFollowersTitle: "Sostenitori", @@ -3377,7 +2850,6 @@ module.exports = { projectBackersTotalPledged: "Totale contribuito", projectBackersYourPledge: "Il tuo contributo", projectBackersNone: "Nessun contributo ancora.", - projectNoRemainingBudget: "Nessun budget rimanente.", projectFilterBackers: "FINANZIATORI", projectFilterApplied: "CANDIDATURE", projectAppliedTitle: "CANDIDATURE", @@ -3386,30 +2858,15 @@ module.exports = { projectBackerAmount: "Totale contribuito", projectBackerPledges: "Contributi", projectBackerProjects: "Progetti", - projectPledgeAmount: "Importo", projectSelectMilestoneOrBounty: "Seleziona traguardo o taglia", projectPledgeButton: "Contribuisci", footerLicense: "GPLv3", - footerPackage: "Pacchetto", - footerVersion: "Versione", modulesModuleName: "Nome", modulesModuleDescription: "Descrizione", modulesModuleStatus: "Stato", modulesTotalModulesLabel: "Moduli caricati", modulesEnabledModulesLabel: "Attivato", modulesDisabledModulesLabel: "Disattivato", - modulesPopularLabel: "In evidenza", - modulesPopularDescription: "Modulo per ricevere i post più popolari, più visti o più commentati.", - modulesTopicsLabel: "Argomenti", - modulesTopicsDescription: "Modulo per ricevere categorie di discussione basate su interessi comuni.", - modulesSummariesLabel: "Riassunti", - modulesSummariesDescription: "Modulo per ricevere riassunti di discussioni o post lunghi.", - modulesLatestLabel: "Più recenti", - modulesLatestDescription: "Modulo per ricevere i post e le discussioni più recenti.", - modulesThreadsLabel: "Discussioni", - modulesThreadsDescription: "Modulo per ricevere conversazioni raggruppate per argomento o domanda.", - modulesMultiverseLabel: "Multiverso", - modulesMultiverseDescription: "Modulo per ricevere contenuti da altri peer federati.", modulesInvitesLabel: "Inviti", modulesInvitesDescription: "Modulo per gestire e applicare codici invito.", modulesWalletLabel: "Portafoglio", @@ -3450,8 +2907,12 @@ module.exports = { modulesOpinionsDescription: "Modulo per scoprire e votare opinioni.", modulesTransfersLabel: "Trasferimenti", modulesTransfersDescription: "Modulo per scoprire e gestire i contratti intelligenti (trasferimenti).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Gestisci i tuoi altri account del fediverso, inclusi l'invio e la ricezione di contenuti.", + modulesFediverseLabel: "Multiverso", + modulesBlogsLabel: "Blog", + modulesBlogsDescription: "Modulo per scoprire e gestire i blog.", + modulesPollsLabel: "Sondaggi", + modulesPollsDescription: "Modulo per interrogare la rete e contare le risposte.", + modulesFediverseDescription: "Gestisci i tuoi altri account del multiverso, inclusi l'invio e la ricezione di contenuti.", modulesFeedLabel: "Feed", modulesFeedDescription: "Modulo per scoprire e condividere testi brevi (feed).", modulesParliamentLabel: "Parlamento", @@ -3487,37 +2948,33 @@ module.exports = { visibilityMakeHidden: "Rendi nascosta", invitesInhabitantsTitle: "Abitanti", invitesInhabitantsFollow: "Segui", - aiNavPlaceholder: "Dove vuoi andare?", + aiNavPlaceholder: "Descrivi cosa ti serve...", aiNavDisabled: "La navigazione con IA è disattivata.", - aiNavResultsTitle: "Suggerimenti di navigazione IA", + aiNavResultsTitle: "Suggerimenti AINav", aiNavQueryLabel: "Richiesta", - aiNavResultsDescription: "Scegli il percorso più adatto a ciò che stai cercando.", - aiNavResultPath: "Percorso", - aiNavResultDescription: "Cosa puoi fare", aiNavResultMatch: "Corrispondenza", aiNavResultsEmpty: "Nessun percorso corrispondente. Prova /search.", - aiNavSearchInstead: "Cerca invece", modulesAINavLabel: "AINav", modulesAINavDescription: "Modulo per query in linguaggio naturale sui contenuti della rete.", - directConnect: "Connessione diretta", directConnectDescription: "Connettiti direttamente a un peer inserendo indirizzo IP, porta e chiave pubblica.", peerHost: "IP", peerPort: "Porta (predefinita: 8008)", peerPublicKey: "Chiave pubblica (@...ed25519)", connectAndFollow: "Connetti", - deviceSourceLabel: "Dispositivo", modulesPresetTitle: "Configurazioni Comuni", - modulesPreset_minimal: "Minimo", - modulesPreset_basic: "Base", - modulesPreset_social: "Sociale", - modulesPreset_economy: "Economia", - modulesPreset_full: "Completo", + workflowsTitle: "Workflow", + workflowsDescription: "Un workflow imposta il tema e quali moduli sono attivi.", + workflowsSet: "Applica workflow", + workflow_default: "Predefinito", + workflow_jobs: "Lavoro", + workflow_ruling: "Governo", + workflow_politics: "Politica", + workflow_social: "Sociale", + workflow_business: "Affari", + workflow_night: "Notte", + workflow_mobile: "Mobile", statsCarbonFootprintTitle: "Impronta di carbonio", - statsCarbonFootprintNetwork: "Impronta di carbonio della rete", - statsCarbonFootprintYours: "La tua impronta di carbonio", statsCarbonTombstone: "Impronta del tombstoning", - feedSuccessMsg: "Feed pubblicato con successo!", - dominantOpinionLabel: "Opinione dominante", uploadMedia: "Carica media (max: 50MB)", courtsRespondentInvalid: "Deve essere un ID SSB valido (@...ed25519)", @@ -3551,14 +3008,13 @@ module.exports = { mapDescriptionLabel: "Descrizione", mapDescriptionPlaceholder: "Descrivi la mappa o la posizione...", mapTypeLabel: "Tipo di mappa", - mapTypeSingle: "SINGOLO (solo posizione iniziale)", - mapTypeOpen: "APERTO (chiunque può aggiungere marcatori)", - mapTypeClosed: "CHIUSO (solo il creatore aggiunge marcatori)", + mapInviteMode: "Invito", + mapTypeSingle: "SINGOLO", + mapTypeOpen: "APERTO", + mapTypeClosed: "CHIUSO", mapTagsLabel: "Tag", mapTagsPlaceholder: "Inserisci tag separati da virgole", mapUrlLabel: "URL della mappa", - mapPickCoordLabel: "Oppure seleziona una posizione sulla griglia:", - mapMarkersLabel: "marcatori", mapMarkersTitle: "Marcatori", mapMarkerDefault: "Marcatore", mapMarkerLatLabel: "Latitudine marcatore", @@ -3585,14 +3041,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pad", modulesPadsDescription: "Modulo per gestire editor di testo collaborativi.", - padFilterAll: "TUTTI", - padFilterMine: "MIO", - padFilterRecent: "RECENTE", - padFilterOpen: "APERTO", - padFilterClosed: "CHIUSO", padCreate: "Crea Pad", - padUpdate: "Aggiorna Pad", - padDelete: "Elimina Pad", + padUpdate: "Aggiorna", + padDelete: "Elimina", padTitleLabel: "Titolo", padTitlePlaceholder: "Inserisci il titolo del pad...", padStatusLabel: "Stato", @@ -3603,14 +3054,7 @@ module.exports = { padTagsLabel: "Tag", padTagsPlaceholder: "tag1, tag2, ...", padMembersLabel: "Membri", - padVisitPad: "Visita Pad", - padShareUrl: "Condividi URL", padCreated: "Creato", - padAuthor: "Autore", - padGenerateCode: "Genera Codice", - padInviteCodeLabel: "Codice Invito", - padInviteCodePlaceholder: "Inserisci il codice invito...", - padValidateInvite: "Valida", padStartEditing: "INIZIA A MODIFICARE!", padEditorPlaceholder: "Inizia a scrivere...", padSubmitEntry: "Invia", @@ -3623,12 +3067,11 @@ module.exports = { padClosedSectionTitle: "Pad Chiusi", padCreateSectionTitle: "Crea Nuovo Pad", padUpdateSectionTitle: "Aggiorna Pad", - padInviteGenerated: "Codice Invito Generato", typePad: "PADS", padNew: "NUOVO", padAddFavorite: "Aggiungi ai Preferiti", padRemoveFavorite: "Rimuovi dai Preferiti", - padClose: "Chiudi Pad", + padClose: "Chiudi", padBackToEditor: "Torna all'editor", padSearchPlaceholder: "Cerca pad...", @@ -3636,8 +3079,6 @@ module.exports = { modulesChatsDescription: "Modulo per scoprire e gestire chat cifrate.", typeChat: "CHATS", typeChatMessage: "MESSAGGIO CHAT", - chatLabel: "CHAT", - chatMessageLabel: "MESSAGGI CHAT", chatsTitle: "Chat", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3645,56 +3086,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Descrizione", - chatMessageReply: "Risposta", - chatMessageLabel: "Messaggio", chatCategory: "Categoria", chatStatus: "STATO", - chatFilterAll: "TUTTI", - chatFilterMine: "MIO", - chatFilterRecent: "RECENTE", - chatFilterFavorites: "PREFERITI", - chatFilterOpen: "APERTO", - chatFilterClosed: "CHIUSO", chatCreate: "Crea Chat", - chatUpdate: "Aggiorna Chat", - chatDelete: "Elimina Chat", + chatUpdate: "Aggiorna", + chatDelete: "Elimina", chatClose: "Chiudi Chat", chatVisitChat: "VISITA CHAT", chatUntitled: "Chat senza titolo", chatNoItems: "Nessuna chat trovata.", chatParticipants: "Partecipanti", - chatStartChatting: "INIZIA A CHATTARE!", - chatGenerateCode: "Genera Codice", - chatShareUrl: "Condividi URL", + chatMessagesLabel: "Messaggi", + chatThreadsLabel: "Discussioni", chatCreatedAt: "CREATO", chatSearchPlaceholder: "Cerca chat...", chatStatusOpen: "APERTO", chatStatusInviteOnly: "SOLO SU INVITO", chatStatusClosed: "CHIUSO", chatSendMessage: "Invia", + chatJumpLatest: "Ultimo Messaggio", + chatPickChat: "Scegli una chat per aprirla", + chatNoneYet: "Nessuna chat disponibile, per ora.", + activitySearchPlaceholder: "Cerca nell'attività...", + trendingSearchPlaceholder: "Cerca nelle tendenze...", + opinionsSearchPlaceholder: "Cerca nelle opinioni...", + votesSearchPlaceholder: "Cerca nelle votazioni...", + welcomeStepUxTitle: "Scegli la tua interfaccia", + welcomeStepUxText: "Decidi l'aspetto di Oasis. Potrai cambiarlo nelle impostazioni.", + welcomeStepUxAction: "Usa questa vista", + chatRateLimitTitle: "Troppi messaggi", + chatRateLimitMessage: "Hai raggiunto il limite di messaggi che questa stanza accetta in un'ora. Riprova più tardi.", chatMessagePlaceholder: "Scrivi il tuo messaggio...", chatNoMessages: "Ancora nessun messaggio.", - chatLeave: "Abbandona Chat", - chatInviteCodeLabel: "Inserisci codice invito", - chatJoinByInvite: "Unisciti", chatTitlePlaceholder: "Titolo chat", chatDescriptionPlaceholder: "Descrizione chat", chatTagsPlaceholder: "tag1, tag2, tag3", chatImageLabel: "Seleziona un file immagine (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Codice Invito", chatAuthor: "Autore", - chatCreated: "Creato", chatAddFavorite: "Aggiungi ai Preferiti", chatRemoveFavorite: "Rimuovi dai Preferiti", chatPM: "MP", chatStatusLabel: "Stato", chatCategoryLabel: "Categoria", - chatParticipantsLabel: "Partecipanti", gamesTitle: "Giochi", gamesDescription: "Scopri e gioca ad alcuni giochi.", gamesFilterAll: "TUTTI", gamesPlayButton: "GIOCA!", - gamesBackToGames: "Torna ai Giochi", modulesGamesLabel: "Giochi", modulesGamesDescription: "Modulo per scoprire e giocare ad alcuni giochi.", modulesGraphosLabel: "Graphos", @@ -3711,8 +3148,6 @@ module.exports = { gamesArkanoidDesc: "Rompi tutti i mattoni con la tua racchetta e la pallina. Una sfida arcade classica.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Ping-pong classico contro un'IA. Il primo a 5 punti vince.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Corsa contro il tempo! Evita il traffico e raggiungi il traguardo prima che scada.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Pilota la tua navicella in un campo di asteroidi. Sparali prima che ti colpiscano.", gamesRockPaperScissorsTitle: "Carta Forbici Sasso", @@ -3733,8 +3168,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3745,12 +3178,6 @@ module.exports = { modulesCalendarsLabel: "Calendari", modulesCalendarsDescription: "Modulo per scoprire e gestire i calendari.", typeCalendar: "CALENDARI", - calendarFilterAll: "TUTTI", - calendarFilterMine: "I MIEI", - calendarFilterOpen: "APERTO", - calendarFilterClosed: "CHIUSO", - calendarFilterRecent: "RECENTI", - calendarFilterFavorites: "PREFERITI", calendarCreate: "Crea calendario", calendarUpdate: "Aggiorna", calendarDelete: "Elimina", @@ -3763,24 +3190,17 @@ module.exports = { calendarTagsLabel: "Tag", calendarTagsPlaceholder: "tag1, tag2...", calendarParticipantsLabel: "Partecipanti", - calendarParticipantsCount: "Partecipanti", - calendarVisitCalendar: "Visita il calendario", calendarCreated: "Creato", - calendarAuthor: "Autore", calendarJoin: "Partecipa", calendarGenerateInvite: "Genera invito", - calendarInviteCodePlaceholder: "Inserisci il codice di invito...", - calendarValidateInvite: "Convalida codice", - calendarJoined: "Iscritto", - calendarAddDate: "Aggiungi data", - calendarAddNote: "Aggiungi nota", calendarDateLabel: "Data", calendarDatePlaceholder: "Descrivi questa data...", - calendarNoteLabel: "Nota", + calendarNoteLabel: "Note", calendarNotePlaceholder: "Aggiungi una nota...", calendarFirstDateLabel: "Data", calendarFirstNoteLabel: "Note", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Senza ripetizione", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3791,8 +3211,6 @@ module.exports = { calendarsDescription: "Scopri e gestisci i calendari nella tua rete.", calendarMonthPrev: "← Precedente", calendarMonthNext: "Successivo →", - calendarMonthLabel: "Date", - calendarsShareUrl: "URL di condivisione", calendarAllSectionTitle: "Calendari", calendarRecentSectionTitle: "Calendari Recenti", calendarFavoritesSectionTitle: "Preferiti", @@ -3806,7 +3224,6 @@ module.exports = { calendarRemoveFavorite: "Rimuovi dai preferiti", calendarSearchPlaceholder: "Cerca calendari...", calendarAddEntry: "Aggiungi Voce", - calendarLeave: "Lascia Calendario", statsCalendar: "Calendari", statsCalendarDate: "Date calendario", statsCalendarNote: "Note calendario", @@ -3853,7 +3270,6 @@ module.exports = { torrentSortOldest: "Più vecchi", torrentSortTop: "Più votati", torrentNoMatch: "Nessun torrent corrispondente.", - torrentMessageAuthorButton: "Invia Messaggio all'Autore", torrentUpdatedAt: "Aggiornato", statsTorrent: "Torrent", typeTorrent: "TORRENT", @@ -3861,10 +3277,18 @@ module.exports = { modulesTorrentsDescription: "Modulo per scoprire e gestire i torrent.", favoritesFilterTorrents: "TORRENT", favoritesFilterMarket: "MERCATO", + favoritesFilterEvents: "EVENTI", + favoritesFilterForum: "FORUM", + favoritesFilterHousing: "ALLOGGI", + favoritesFilterJobs: "LAVORI", + favoritesFilterProjects: "PROGETTI", + favoritesFilterReports: "RAPPORTI", + favoritesFilterTasks: "COMPITI", + favoritesFilterTransfers: "TRASFERIMENTI", + favoritesFilterVotes: "VOTAZIONI", favoritesFilterShopProducts: "ARTICOLI NEGOZIO", tribeSectionTorrents: "TORRENT", tribeCreateTorrent: "Carica Torrent", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Desiderio", settingsWishDesc: "Configura il desiderio del tuo Avatar.", settingsWishWhole: "Multiverse", @@ -3875,16 +3299,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "L'invio è un guardrail UX. La ricezione è un filtro di attenzione.", - pmBlockedNonMutual: "Puoi inviare MP solo ad abitanti in supporto reciproco.", inhabitantsPendingFollowsTitle: "Richieste di supporto in attesa", inhabitantsPendingAccept: "Accetta", inhabitantsPendingReject: "Rifiuta", - bxEncrypted: "CRITTOGRAFATO", - bxEncryptedHexLabel: "Testo cifrato (anteprima)", tribeSectionGovernance: "GOVERNANCE", - tribeSubStatusPublic: "PUBBLICA", - tribeSubStatusPrivate: "PRIVATA", - tribeSubInheritedPrivate: "PRIVATA (ereditata dalla tribù principale)", tribePadInviteRequired: "Non hai accesso al pad. Richiedi un invito.", tribeChatInviteRequired: "Non hai accesso alla chat. Richiedi un invito.", tribeGovernanceDesc: "Governance interna di questa tribù.", @@ -3924,44 +3342,31 @@ module.exports = { tribeGovNoHistorical: "Ancora nessun record", logsTitle: "Diario", logsDescription: "Registra la tua esperienza nella rete.", - logsReadMore: "Leggi di più", logsViewTitle: "Diario", logsColumnType: "Tipo", logsView: "Vedi", - logsManualPrompt: "Scrivi il tuo diario", logsUpdateButton: "Aggiorna", - logsEditTitle: "Modifica voce", - logsCreateDescription: "Registra la tua esperienza...", + logsEditTitle: "Aggiorna registro", logsCreateTitle: "Crea voce", logsWriteButton: "Scrivi", logsTextPlaceholder: "Descrivi le tue esperienze...", - logsTextField: "Testo", - logsLabelPlaceholder: "Etichetta...", - logsLabelField: "Scrivi il tuo diario (etichetta)", - logsAiDisabledWarn: "Attiva il modulo IA in /modules per usare le voci scritte dall'IA.", - logsAiContextValue: "Giorno di blockchain", - logsAiContext: "Contesto", - logsAiModStatus: "AImod", - logsModeApply: "Applica!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manuale", logsModeAI: "IA", - logsColumnDelete: "Elimina", - logsColumnEdit: "Modifica", logsColumnLog: "Diario", logsColumnDate: "Data", logsDelete: "Elimina", - logsEdit: "Modifica", + logsEdit: "Aggiorna", logsFilterAlways: "SEMPRE", logsFilterYear: "ULTIMO ANNO", logsFilterMonth: "ULTIMO MESE", logsFilterWeek: "ULTIMA SETTIMANA", logsFilterToday: "OGGI", - logsFilterRecent: "RECENTI", - logsFilterAll: "TUTTI", + logsComments: "Commenti", + logsAuthorEntries: "Voci", logsCreate: "Crea voce", logsExport: "Esporta diario", - logsExportOne: "Esporta", + logsExportOne: "Esporta registro", logsViewDetails: "Vedi dettagli", logsGenerateButton: "Genera testo", logsSearchText: "Cerca nei diari...", @@ -3971,31 +3376,25 @@ module.exports = { modulesLogsLabel: "Diario", modulesLogsDescription: "Modulo per registrare (tramite assistente IA) le tue esperienze.", statsLogsTitle: "Diario", - statsLogsEntries: "Voci", typeLog: "DIARIO", - blockchainCycle: "Ciclo", larpTitle: "L.A.R.P.", larpDescription: "Uno strato di gioco di ruolo dal vivo per la sperimentazione collaborativa.", + larpNoHousesMatch: "Nessuna casa corrisponde alla tua ricerca.", + larpSearchPlaceholder: "Cerca case...", larpAllHouses: "Case:", larpFilterRuling: "GOVERNA", larpFilterHouses: "CASE", larpFilterRules: "FAQ", larpRulesTitle: "FAQ del L.A.R.P.", - larpRulesEntryTitle: "Casa iniziale", larpRulesEntryText: "Ogni abitante inizia in ACADEMIA per impostazione predefinita. Da ACADEMIA, scegli una casa dal pannello \"Unisciti a una casa\": questo apre il suo test d'ingresso. Rispondi alle 10 domande e invia. Se superi la soglia (7/10), sei ammesso automaticamente in quella casa; altrimenti vieni rifiutato e rimani in ACADEMIA. In entrambi i casi il sistema registra il tuo OasisID e il ciclo del tentativo e impedisce un nuovo tentativo fino allo scadere del periodo di attesa di 30 cicli.", - larpRulesLeaveText: "I membri di qualsiasi casa possono tornare ad ACADEMIA in qualsiasi momento dalla pagina della propria casa; ciò ripristina la loro appartenenza, ma non annulla il periodo di attesa del test.", - larpRulesGovernanceTitle: "Muro di governo", larpRulesGovernanceText: "Durante il suo ciclo, la casa governante porta l'insegna \"Governa\" ed è l'unica il cui Muro è visibile pubblicamente sotto la scheda GOVERNA.", - larpRulesSignTitle: "Emblema L.A.R.P.", + larpRulesWallText: "Ogni casa ha un Muro dove scrivono i suoi membri. Il Muro di una casa è privato, tranne quello della casa al governo e quello dell'ACADEMIA, che chiunque può leggere.", larpRulesSignText: "Gli abitanti possono attivarlo (in /profile/edit > Sensori) per mostrare l'immagine della loro casa attuale come sigillo sul profilo, sulla scheda autore e abitante. Il sigillo rimanda alla pagina della casa.", larpPostsTitle: "Muro", larpPostsEmpty: "Ancora nessuna pubblicazione.", - larpPostLabel: "Nuova pubblicazione", larpPostPlaceholder: "Cosa ha da dire questa casa?", - larpPostPublic: "Pubblico (visibile a chiunque, altrimenti solo ai membri)", larpPostSubmit: "Pubblica", - larpPostMembersOnly: "Solo membri", larpCycleLabel: "Ciclo:", bankRulesArchTaxFormula: "ARCH Tax(user) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory", bankRulesArchTaxNote: "ARCH Tax reflects the long-term cost of growing and maintaining the network archive: the older your data lives in the network, the larger your share of the maintenance cost.", @@ -4033,12 +3432,9 @@ module.exports = { bankTaxesLookupNote: "Inserisci un ID di blocco per cercarlo nel tuo feed locale.", bankTaxesUserNoteChipsClick: "Clicca su qualsiasi chip per ispezionare il suo blocco nel blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Codice d'invito", larpRulesInviteEntryText: "I membri delle case possono generare codici di invito che danno accesso diretto alla casa.", larpRulesOneHouseText: "Puoi appartenere al massimo a una casa in ogni momento. Se non appartieni a nessuna, sei in ACADEMIA. Ogni pagina di casa (non ACADEMIA) mostra ai suoi membri un pulsante \"Lascia la Casa\" che reimposta l'appartenenza ad ACADEMIA. Uscire NON annulla il periodo di attesa del test.", - larpRulesOneHouseTitle: "Una casa alla volta", - larpRulesTestEntry: "Test WILL", - larpRulesTestEntryText: "Ogni opzione pondera una o più case; all'invio, il sistema somma i punteggi e ti ammette automaticamente nella casa con il punteggio più alto.", + larpRulesTestEntryText: "Nel test WILL ogni opzione pondera una o più case; all'invio il sistema somma i punteggi e ti ammette automaticamente nella casa con il punteggio più alto.", larpWillTestHint: "Una volta completato, ti verrà assegnata la casa che meglio corrisponde alle tue risposte. Le tue risposte individuali vengono elaborate localmente e mai memorizzate — solo l'assegnazione di casa risultante viene pubblicata nel tuo feed.", larpWillTestTitle: "Test WILL", settingsLanDesc: "Annuncia periodicamente questo peer ad altre istanze di Oasis sulla stessa rete locale. Disabilita per interrompere le trasmissioni UDP.", @@ -4057,36 +3453,30 @@ module.exports = { aiExchangeMarkHelpful: "+1 utile", larpCyclesUntilRuling: "Prossimo ciclo di governo", larpVisitTribe: "Visita la tribù", + larpStartJourney: "Inizia il viaggio", larpGoverning: "Governa:", + larpStartHere: "Inizia qui:", larpMyHouse: "La mia Casa:", larpMembersCount: "Membri", - larpMembersTitle: "Membri", - larpNoMembers: "Ancora nessun membro.", larpRolesLabel: "Ruoli", larpFunctionLabel: "Funzione", larpMonthLabel: "Ciclo di governo", larpLeaveToAcademia: "Torna ad ACADEMIA", - larpAcademiaJoinTitle: "Unisciti a una casa", - larpAcademiaJoinHint: "Sostieni il test psicologico di profilo per essere assegnato alla casa che meglio si adatta a te, oppure usa un codice di invito condiviso da un membro di una casa.", - larpTakeTestButton: "Sostieni il test di profilo", + larpAcademiaJoinTitle: "Case L.A.R.P.", larpInviteRedeem: "Unisciti alla Casa", larpInviteCreate: "Genera codice di invito", larpInvitePlaceholder: "Codice di invito", larpInviteBannerTitle: "Nuovo codice di invito", larpInviteBannerHint: "Condividi questo codice con qualcuno in ACADEMIA. Scade tra 30 cicli o dopo un singolo uso.", - larpTestAssignedHouse: "Casa assegnata", larpTestRankingTitle: "Punteggio per casa", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Codice di invito di casa", invitesHouseJoinButton: "Unisciti alla Casa", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Tasse", bankOverviewYourTaxes: "Le tue tasse", - bankTaxesNetworkTitle: "Tasse della rete", bankTaxesEcoTaxTitle: "ECO Tax", bankTaxesArchTaxTitle: "ARCH Tax", - bankTaxesUserTitle: "Le tue tasse", bankTaxesUserAmount: "La tua ECO Tax (prezzo da restituire)", bankTaxesArchTaxUserAmount: "La tua ARCH Tax (prezzo da restituire)", bankTaxesArchTaxFirstBlock: "Età del tuo primo blocco", @@ -4137,16 +3527,13 @@ module.exports = { bankRulesEcoTaxRate: "Aliquota", bankRulesArchTaxRate: "Aliquota", bankRulesCarbonFactor: "Fattore di carbonio", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "Ancora nessun tombstone nella rete.", blockchainBlockNotAvailable: "Questo blocco non è disponibile nel tuo feed locale. Potrebbe appartenere a un peer da cui non stai ancora replicando.", blockchainBackToBlockexplorer: "Torna al blockexplorer", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", - audioTranscodeTitle: "BCS Transcode", audioTranscodeDetailTitle: "Transcode", audioTranscodeDetailDescription: "Decodifica il payload incorporato e la mappa di composizione originale della blockchain.", - audioTranscodeStegoTitle: "Incorporato nella forma d'onda", audioTranscodeStegoOasisId: "Da", audioTranscodeStegoTimestamp: "Generato il", audioTranscodeStegoMessage: "TEXT", @@ -4154,9 +3541,7 @@ module.exports = { audioTranscodeStegoUnknown: "—", audioTranscodeStegoNotFound: "Nessun payload steganografico è stato decodificato da questo audio.", audioTranscodeCompositionEmpty: "Questo audio non include una composizione blockchain salvata.", - audioBackToAudio: "Torna all'audio", audioBackToBcs: "Torna a BCS", - audioAuthorLabel: "Autore", melodyCompositionTitle: "Mappa di composizione blockchain", melodyFilterMine: "MIO", melodyByLabel: "Da", @@ -4170,7 +3555,6 @@ module.exports = { melodyUploadBcsNameNote: "L'audio sarà pubblicato col nome auto-generato", larpLastAttemptTitle: "Il tuo ultimo tentativo", larpLastAttemptHouse: "Casa", - larpLastAttemptResult: "Risultato", larpLastAttemptWhen: "Quando", larpLastAttemptCooldown: "Prossimo tentativo in", larpTestTitle: "Test d'ingresso", @@ -4179,29 +3563,14 @@ module.exports = { larpTestCooldownActive: "Prossimo test disponibile tra", larpTestCooldownDays: "cicli", larpTestResultTitle: "Risultato del test", - larpTestPassed: "Test superato — benvenuto!", - larpTestFailed: "Test non superato", larpTestScore: "Punteggio", larpTestNextAttempt: "Puoi tentare un altro test tra 30 cicli.", larpGoToHouse: "Vai alla tua casa", larpBackToAcademia: "Torna ad ACADEMIA", - larpBackToHouses: "◀ Case", larpBadgeYou: "Tu", larpBadgeRuling: "Governa", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Modulo per lo strato di gioco di ruolo dal vivo di Oasis (le 9 Case).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Di fronte a un problema complesso, cosa fai per primo?", larpProfileQ1O1: "Parlare con altri per cercare il consenso", larpProfileQ1O2: "Costruire un prototipo da testare", diff --git a/src/client/assets/translations/oasis_pt.js b/src/client/assets/translations/oasis_pt.js index ef902d5..4d3ecd8 100644 --- a/src/client/assets/translations/oasis_pt.js +++ b/src/client/assets/translations/oasis_pt.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { pt: { - languageName: "Português", shopOrderStatusPaid: "Pagamento recebido", shopOrderStatusReceived: "Recebido", shopOrderMarkPaid: "Marcar pagamento recebido", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "Ainda não tens compras.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Vendedor", - shopOrderPaymentConcept: "Pagamento", shopOrderInvoice: "Fatura", shopOrderInvoiceConcept: "Fatura", shopOrderStatusPending: "Pendente", shopOrderStatusAccepted: "Aceite", shopOrderStatusRejected: "Rejeitado", shopOrderStatusShipped: "Enviado", - shopOrderStatusDelivered: "Entregue", shopOrderAccept: "Aceitar", shopOrderReject: "Rejeitar", shopOrderMarkShipped: "Marcar enviado", - shopOrderMarkDelivered: "Marcar entregue", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Contrato", shopOrderContractConcept: "Encomenda de loja", shopOrdersPending: "Encomendas pendentes", all: "Todos", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Ver JSON", matchScore: "Pontuação de correspondência", preferencesLabel: "Preferências", - inhabitantProfileTitle: "Perfil do habitante", + inhabitantProfileTitle: "Habitante", contentWarningLabel: "Aviso de conteúdo", invalidPost: "Conteúdo inválido", invalidPostHint: "Esta mensagem tem texto vazio/inválido.", spreadBy: "Por", spreadChron: "Difusão", spreaded: "Difundido", - spreadMore: "mais", spreadContentUnavailable: "Conteúdo ainda não disponível (replicação pendente)", filteredByTag: "Filtrado por etiqueta", filteredByTagTitle: "Filtrado por etiqueta", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Sem gravidade", calendarDeleteDate: "Eliminar data", calendarIntervalUntil: "Até", - bookmarkCategory: "Categoria", bookmarkLastVisit: "Última visita", profileClearnetBookmarksLabel: "Marcadores", - forumFilterHot: "Populares", invitesPort: "Porta", currentlyUnrecheable: "ERRO!", peerHostValidation: "IPv4 válido (ex. 192.168.1.100) ou nome de host (ex. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Estimativa máx. anual", statsCarbonNetwork: "Total da rede", statsCarbonOfEstMax: "da capacidade máx. estimada", + statsCarbonYearProgress: "do ano decorrido", + statsNetworkTitle: "Rede", + statsStorageTitle: "Armazenamento", + statsEcoTaxTitle: "Taxa ECO", + statsAccountTitle: "Conta", + statsAveragesTitle: "Médias", statsCarbonOfNetwork: "do total da rede", statsCarbonUser: "A tua pegada", statsContentCountColumn: "Quantidade", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "Principais etiquetas", statsTopTypesTitle: "Principais tipos de conteúdo", statsTotalMsgs: "Total de mensagens", - feedViewDetails: "Ver detalhes", - eventFileLabel: "Anexar imagem", - taskFileLabel: "Anexar imagem", - courtsRespondentRequired: "O ID do réu é obrigatório", extended: "Multiverso", extendedDescription: [ "Quando apoias alguém, podes descarregar publicações dos habitantes que apoiam, e estas aparecem aqui, ordenadas por data.", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "Mostrando", graphosYou: "Você", graphosTotalNodes: "Total de nós", - manualMode: "Modo manual", mentions: "Menções", mentionsDescription: [ - strong("Publicações que te @mencionam"), - ", ordenadas por data.", + strong("Todas as mensagens que te @mencionam"), + ".", ], - nextPage: "Seguinte", - previousPage: "Anterior", noMentions: "Ainda não recebeste @menções.", + mentionsSearchPlaceholder: "Procurar menções...", privateReminders: "LEMBRETES", inboxFiltersLabel: "Filtros:", inboxToggleToMutuals: "Mudar para mútuos", inboxToggleToWhole: "Mudar para todos", - privateFrom: "De", - privateTo: "Para", privateDate: "Data", pmReply: "Responder", pmReplies: "respostas", - pmNew: "novas", - pmMarkRead: "Marcar como lido", inReplyTo: "EM RESPOSTA A", pmPreview: "Pré-visualizar", pmPreviewTitle: "Pré-visualização da mensagem", peers: "Pares", searchDescription: "Descrição", - imageSearch: "Pesquisa de imagens", searchFromLabel: "De", searchToLabel: "Até", - searchMinOpinionsLabel: "Mín opiniões", - searchInhabitantLabel: "Habitante (Oasis ID)", searchQueryLabel: "Pesquisa", searchPerPageLabel: "Resultados por página", settings: "Definições", @@ -244,67 +229,38 @@ module.exports = { melodyTitle: 'Melody', melodyDescription: 'Toca a melodia da tua blockchain — cada bloco torna-se uma nota.', melodyEmpty: 'Ainda sem notas — a tua blockchain ainda não produziu nenhum bloco.', - melodyCompositionHelp: 'Cada bloco da tua blockchain torna-se uma nota musical segundo o seu tipo e tamanho.', - melodyStatsTitle: 'Distribuição por tipo', - melodyInhabitantLabel: 'Habitante', melodyTotalBlocks: 'Notas', - melodyType: 'Tipo', - melodyCount: 'Blocos', melodyFilterAll: 'TODAS', - melodyFilterShare: 'Carregar melodia', - melodyShareTitle: 'Partilha a tua melodia', - melodyShareHelp: 'Publica um instantâneo da tua melodia atual para que outros a oiçam e remixem.', - melodyShareTitleLabel: 'Título (opcional)', - melodyShareTitlePlaceholder: 'Um fantasma de blockchain', - melodyShareSubmit: 'Publicar melodia', - melodyNoShared: 'Ainda sem melodias de blockchain.', melodyRegenerate: 'Regenerar', melodyDownload: "Descarregar BCS", - profileActivityTitle: 'Atividade', - profileActivityMore: 'Ver toda a atividade', profileContentSectionTitle: 'Conteúdo do Avatar', profileContentHelp: 'Escolhe quais módulos serão exibidos no teu avatar.', profileSensorsHelp: 'Métricas opcionais exibidas no teu avatar.', profileClearnetHelp: 'Módulos acessíveis a partir de fora do Oasis.', profileHubAll: 'Tudo', - profileHubTitle: 'Conteúdo Público', - footerPulseTitle: 'Pulso', - footerPulsePeers: 'Pares', - footerPulseInbox: 'Caixa', - footerPulseSync: 'Última sinc.', - footerPulseEcoValue: 'ECO/h', - footerPulseLastActivity: 'Última atividade', footerLicenseLabel: 'Licença', profileSwitchToOasis: 'Voltar para Oasis', - profileSwitchToClearnet: 'Mergulha na Clearnet', - profileVisibilityFediverse: "Fediverse", - profileSwitchToFediverse: "Mergulhar no fediverso", - coordLabel: 'Coordenada (ex.: A3)', - coordPlaceholder: 'Introduz coordenada', + profileVisibilityFediverse: "Multiverso", contributorsTitle: "Contribuidores", - pixeliaBy: "por", colorLabel: 'Escolhe uma cor', paintButton: 'Pintar!', - invalidCoordinate: 'Coordenada incorreta', - goToMuralButton: "Ver mural", totalPixels: 'Total de pixéis', modules: "Módulos", modulesViewTitle: "Módulos", modulesViewDescription: "Configura o teu ambiente ativando ou desativando módulos.", inbox: "Caixa de entrada", multiverse: "Multiverso", - fediverse: "Fediverse", - fediverseDescription: "Faça a gestão das suas outras contas do fediverso, incluindo enviar e receber conteúdo.", + fediverse: "Multiverso", + fediverseDescription: "Faça a gestão das suas outras contas do multiverso, incluindo enviar e receber conteúdo.", fediverseStatus: "Estado", - fediverseDisconnected: "Fediverso desligado. Verifique %LINK% ou o estado da ligação.", - fediverseSettingsTitle: "Fediverse", + fediverseDisconnected: "Multiverso desligado. Verifique %LINK% ou o estado da ligação.", + fediverseSettingsTitle: "Multiverso", fediverseInstanceLabel: "Endereço", fediverseTokenLabel: "Token de acesso", fediverseTokenHelp: "Defina o seu token de acesso. Será usado para gerir a sua conta de Mastodon a partir do Oasis.", fediverseConnect: "Ligar", fediverseConnectedAs: "Conectado como", fediverseDisconnect: "Desconectar", - fediverseEmpty: "Quando ligar outras contas do fediverso nas %LINK%, poderá geri-las a partir daqui.", fediverseEmptyLink: "suas definições", fediverseComposePlaceholder: "No que está pensando?", fediverseReplyPlaceholder: "Escreva a sua resposta…", @@ -313,21 +269,15 @@ module.exports = { fediverseReply: "Responder", fediverseBoosted: "impulsionou", fediverseNoPosts: "A sua timeline está vazia.", - fediverseThread: "Tópico", fediverseTimeline: "Cronologias", - fediverseManageTimeline: "Gerir cronologia", fediverseFollowers: "Seguidores", fediverseFollowing: "A seguir", fediversePosts: "Publicações", fediverseJoined: "Aderiu", - fediverseOverview: "Resumo", fediverseRefresh: "Atualizar", fediverseWrite: "Escrever", fediversePreview: "Pré-visualizar", - fediverseEdit: "Editar", - fediverseOpenFeed: "Ver feed", fediverseManage: "Gerir", - fediverseStatusNotConnected: "Não conectado", fediverseError: "Não foi possível contactar o Mastodon.", fediverseErrInstance: "URL de instância inválido.", fediverseErrAuth: "Token inválido ou expirado.", @@ -338,17 +288,6 @@ module.exports = { fediverseErrPost: "Não foi possível publicar.", fediverseErrMedia: "Não foi possível enviar o ficheiro.", fediverseErrEmpty: "Escreva algo ou anexe um ficheiro.", - popularLabel: "Destaques", - topicsLabel: "Tópicos", - latestLabel: "Mais recentes", - summariesLabel: "Resumos", - threadsLabel: "Conversas", - multiverseLabel: "Multiverso", - inboxLabel: "Caixa de entrada", - invitesLabel: "Convites", - walletLabel: "Carteira", - legacyLabel: "Chaves", - cipherLabel: "Encriptação", bookmarksLabel: "Marcadores", videosLabel: "Vídeos", torrentsLabel: "Torrents", @@ -359,18 +298,14 @@ module.exports = { inhabitantsLabel: "Habitantes", trendingLabel: "Tendências", eventsLabel: "Eventos", - tasksLabel: "Tarefas", apply: "Aplicar", menuPersonal: "Pessoal", - menuContent: "Conteúdo", - menuBlogs: "Blogues", menuGovernance: "Governação", menuOffice: "Escritório", - menuMultiverse: "Multiverso", - menuNetwork: "Rede", + menuNetwork: "Comunidade", menuCreative: "Criativo", menuEconomy: "Economia", - menuMedia: "Multimédia", + menuMedia: "Biblioteca", menuTools: "Ferramentas", comment: "Comentário", subtopic: "Subtópico", @@ -380,13 +315,6 @@ module.exports = { follow: "Apoiar", block: "Bloquear", unblock: "Desbloquear", - newerPosts: "Publicações mais recentes", - olderPosts: "Publicações mais antigas", - feedRangeEmpty: "O intervalo indicado está vazio para este feed. Tenta ver o ", - seeFullFeed: "feed completo", - feedEmpty: "A rede Oasis nunca viu publicações desta conta.", - beginningOfFeed: "Este é o início do feed", - noNewerPosts: "Ainda não foram recebidas publicações mais recentes.", relationshipNotFollowing: "Não te apoia", relationshipTheyFollow: "Apoia-te", relationshipMutuals: "Apoio mútuo", @@ -396,16 +324,12 @@ module.exports = { relationshipBlockedBy: "Estás bloqueado", relationshipMutualBlock: "Bloqueio mútuo", relationshipNone: "Não estás a apoiar", - relationshipConflict: "Conflito", relationshipBlockingPost: "Publicação bloqueada", viewLikes: "Ver difusões", spreadedDescription: "Lista de publicações difundidas pelo habitante.", - totalspreads: "Total de difusões", - attachFiles: "Anexar ficheiros", preview: "Pré-visualizar", publish: "Publicar", contentWarningPlaceholder: "Adiciona um assunto à publicação (opcional)", - privateWarningPlaceholder: "Adiciona habitantes para enviar uma publicação privada (opcional)", publishWarningPlaceholder: "Corpo limitado a 7000 caracteres.", publishTooLong: "A tua publicação é demasiado longa. Encurta-a, por favor.", publishCustomDescription: [ @@ -414,8 +338,6 @@ module.exports = { commentWarning: [ "LEMBRA-TE: Devido à tecnologia blockchain, uma vez publicado, não pode ser editado nem eliminado.", ], - commentPublic: "público", - commentPrivate: "privado", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -435,7 +357,6 @@ module.exports = { ".", ], publishCustom: "Escrever publicação avançada", - subtopicLabel: "Criar um subtópico desta publicação", messagePreview: "Pré-visualização da publicação", mentionsMatching: "Menções correspondentes", mentionsName: "Nome", @@ -458,24 +379,19 @@ module.exports = { ssbLogStream: "Blokchain", ssbLogStreamDescription: "Configura o limite de mensagens para os fluxos da Blockchain.", saveSettings: "Guardar definições", - exportTitle: "Exportar dados", exportDescription: "Define uma senha (mínimo 32 caracteres) para encriptar a tua chave", exportDataTitle: "Cópia de segurança", exportDataDescription: "Descarrega os teus dados (chave secreta excluída!)", exportDataButton: "Descarregar base de dados", - pubWallet: "Carteira PUB", - pubWalletDescription: "Define o URL da carteira PUB. Será usado para transações PUB (incluindo o UBI).", - pubWalletConfiguration: "Guardar configuração", - importTitle: "Importar dados", importDescription: "Importa o teu segredo encriptado (chave privada) para ativar o teu avatar", - importAttach: "Anexar ficheiro encriptado (.enc)", - passwordLengthInfo: "A senha deve ter pelo menos 32 caracteres.", passwordImport: "Escreve a tua senha para decifrar os dados que serão guardados no teu diretório pessoal (nome: secret)", exportPasswordPlaceholder: "Usa minúsculas, maiúsculas, números e símbolos", fileInfo: "A tua chave secreta encriptada será descarregada para o teu dispositivo (nome: oasis.enc)", developer: "Desenvolvimento", devTitle: "Desenvolvimento", welcomeBannerText: "Bem-vinda ao OASIS. Segue estes passos rápidos para configurar o teu avatar.", + aiSuggestionBanner: "Sugestão:", + aiSuggestionsEnable: "Sugestões da IA", welcomeBannerAction: "Começar!", welcomeTitle: "Bem-vinda", welcomeStepGreetingAction: "Enviar", @@ -518,14 +434,9 @@ module.exports = { devParentFolder: "Pasta superior", devOpenFolder: "abrir", devDescription: "Explora o código-fonte em execução neste nó.", - devTreeTitle: "Ficheiros", - devSearchTitle: "Procurar no código", - devMapTitle: "Módulos", devRoot: "raiz", - devRootButton: "RAIZ", devSearchPlaceholder: "Texto a procurar no código", devAnyExtension: "Qualquer ficheiro", - devSearchButton: "Procurar", devStatsFiles: "Ficheiros", devStatsLines: "Linhas", devStatsModules: "Módulos", @@ -562,16 +473,13 @@ module.exports = { languageDescription: "Se preferires usar outro idioma, seleciona-o aqui.", setLanguage: "Definir idioma", - peerConnections: "Pares", peerConnectionsIntro: "Gere todas as tuas ligações com outros pares.", peerConnectionsTitle: "Ligações", online: "Online", offline: "Offline", discovered: 'Descobertos', unknown: 'Desconhecido', - lanBroadcastLabel: "Difusão LAN", lanBroadcastActive: "Ativa (multicast UDP na LAN)", - lanBroadcastDisabled: "Desativada (modo pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -584,8 +492,6 @@ module.exports = { noConnections: "Nenhum par conectado.", noDiscovered: "Nenhum par descoberto.", noUnknownPeers: "Sem pares desconhecidos no grafo de amizades.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -595,9 +501,6 @@ module.exports = { peerImport: "Importar", peerImportTitle: "Importar lista de peers", peerImportPlaceholder: "Cola um endereço multiserver por linha, ou carrega um ficheiro .txt…", - noSupportedConnections: "Nenhum par apoiado.", - noBlockedConnections: "Nenhum par bloqueado.", - noRecommendedConnections: "Nenhum par recomendado.", connectionActionIntro: "", startNetworking: "Iniciar rede", @@ -611,9 +514,19 @@ module.exports = { homePageDescription: "Seleciona qual módulo queres como página inicial.", saveHomePage: "Definir início", invites: "Convites", - invitesTitle: "Convites", - invitesInvites: "Convites", invitesDescription: "Gere e aplica códigos de convite na tua rede.", + invitesPubsHint: "Cola um código de convite de um pub para te federares com ele e replicar os seus habitantes.", + invitesFederationsHint: "Pubs com que estás federado: atualiza-os, remove os inacessíveis ou exporta a lista.", + invitesHousesHint: "Introduz um código de casa para entrares numa casa do LARP e participar na sua economia.", + invitesTribesHint: "Introduz um código de tribo para te tornares membro e aceder ao conteúdo privado.", + invitesChatsHint: "Introduz um código de chat para entrares na conversa e nos seus tópicos.", + invitesPadsHint: "Introduz um código de pad para escreverem juntos num documento partilhado.", + invitesCalendarsHint: "Introduz um código de calendário para partilhar datas e lembretes.", + invitesEventsHint: "Introduz um código de evento para entrares num evento privado.", + invitesForumsHint: "Introduz um código de fórum para leres e responderes num fórum privado.", + invitesMapsHint: "Introduz um código de mapa para veres e acrescentares lugares num mapa partilhado.", + invitesShopsHint: "Introduz um código de loja para entrares numa loja e no seu catálogo.", + invitesInhabitantsHint: "Introduz um código de habitante para se seguirem e trocarem conteúdo.", invitesTribesTitle: "Tribos", invitesTribeInviteCodePlaceholder: "Introduz código de convite da tribo", invitesTribeJoinButton: "Aderir à tribo", @@ -644,7 +557,6 @@ module.exports = { invitesAlreadyFederated: "Você já está federado com este pub.", invitesFederationsTitle: "Federações", invitesAcceptedInvites: "Federadas", - invitesNoInvites: "Ainda sem convites aceites.", invitesUnfollow: "Deixar de seguir", invitesFollow: "Seguir", invitesUnfollowedInvites: "Não federadas", @@ -664,39 +576,24 @@ module.exports = { panicMode: "Modo pânico!", encryptData: "Define uma senha (mínimo 32 caracteres) para encriptar a tua blockchain", decryptData: "Introduz a senha para decifrar a tua blockchain", - panicModeDescription: "Encriptar/Decifrar ou ELIMINAR a tua blockchain", removeDataDescription: "AVISO: Este processo não pode ser revertido.", - encryptPanicButton: "Encriptar blockchain", - decryptPanicButton: "Decifrar blockchain", removePanicButton: "ELIMINAR TODOS OS TEUS DADOS!", searchTitle: "Pesquisa", searchDescriptionLabel: "Pesquisa conteúdo na tua rede.", - searchLanguagesLabel: "Idiomas", - searchSkillsLabel: "Competências", searchPlaceholder:"Pesquisar conteúdo...", - searchDateLabel:"Data", searchLocationLabel:"Localização", searchPriceLabel:"Preço", - searchUrlLabel:"URL", searchCategoryLabel:"Categoria", - searchStartLabel:"Hora de início", - searchEndLabel:"Hora de fim", searchPriorityLabel:"Prioridade", searchStatusLabel:"Estado", statusLabel:"Estado", - totalVotesLabel:"Total de votos", noResultsFound:"Nenhum resultado encontrado.", votesOption:"Opções de voto", voteYesLabel:"Sim", voteNoLabel:"Não", allTypesLabel: "ILIMITADO", - ABSTENTIONLabel:"ABSTENÇÃO", YESLabel:"SIM", NOLabel:"NÃO", - FOLLOW_MAJORITYLabel: "SEGUIR MAIORIA", - CONFUSEDLabel: "CONFUSO", - NOT_INTERESTEDLabel: "SEM INTERESSE", - StatusLabel:"Estado", votesOptionYesLabel:"Sim", votesOptionNoLabel:"Não", votesOptionAbstentionLabel:"Abstenção", @@ -704,7 +601,6 @@ module.exports = { votesCreatedByLabel:"Criado por", voteStatusOpen:"ABERTO", voteStatusClosed:"FECHADO", - imageSearchLabel: "Introduz palavras para pesquisar imagens etiquetadas com elas.", commentDescription: ({ parentUrl }) => [ " comentou em ", a({ href: parentUrl }, " conversa"), @@ -715,53 +611,20 @@ module.exports = { a({ href: parentUrl }, " uma publicação"), ], subtopicTitle: ({ authorName }) => [`Subtópico na publicação de @${authorName}`], - mysteryDescription: "publicou uma publicação misteriosa", oasisDescription: "Rede do Projeto OASIS", searchSubmit: "Pesquisar...", - postLabel: "PUBLICAÇÕES", - aboutLabel: "HABITANTES", - feedLabel: "FEEDS", votesLabel: "VOTAÇÕES", - reportLabel: "DENÚNCIAS", - imageLabel: "IMAGENS", - videoLabel: "VÍDEOS", - audioLabel: "ÁUDIOS", - documentLabel: "DOCUMENTOS", - torrentLabel: "TORRENTS", pdfFallbackLabel: "Documento PDF", - eventLabel: "EVENTOS", - taskLabel: "TAREFAS", - transferLabel: "TRANSFERÊNCIAS", - curriculumLabel: "CURRÍCULO", - bookmarkLabel: "MARCADORES", - tribeLabel: "TRIBOS", - marketLabel: "MERCADO", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "CARTEIRAS", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Enviar", - subjectLabel: "Assunto", editProfile: "Editar avatar", - profileQrAlt: "Código QR do perfil", - profileQrHint: "Lê para copiar este Oasis ID.", oasisIdLabel: "OasisID", - spreadLabel: "Difundir", - spreadHint: "Difunde isto aos teus apoiantes (replica pelo teu feed).", + spreadContent: "Replicar", welcomePmSubject: "Hello World!", - welcomePmBody: "Bem-vindo ao Oasis — uma rede social livre, peer-to-peer, federada e cifrada, com uma arquitetura distribuída apenas por convite.\n\nAlguns locais interessantes por onde começar:\n\n- /profile — Edita o teu avatar, nome, descrição e quais módulos aparecem no teu lado público.\n- /invites — Adiciona um pub para te federares com o resto da rede.\n- /peers — Vê quem está ligado, faz nova varredura da LAN, exporta ou importa listas de peers.\n- /inhabitants — Descobre e visita os avatares de outras pessoas.\n- /tribes — Cria ou junta-te a grupos privados com cifragem ponta-a-ponta.\n- /inbox — Lê e envia mensagens privadas.\n- /activity — Vê a atividade recente, tua e da tua rede.\n- /publish — Escreve um post ou partilha uma imagem, áudio, vídeo ou documento.\n- /search — Pesquise o conteúdo da rede por tipo.\n\nAlguns lugares interessantes para conectar:\n\n- /fediverse — Faça a gestão das suas outras contas do fediverso, incluindo enviar e receber conteúdo.\n\nEsta mensagem foi enviada de forma privada de ti para ti mesmo, por isso não foi necessária qualquer ligação para a receber.", - profileVisibilityTitle: "Visibilidade do perfil público", - profileVisibilityHint: "Escolhe que campos os outros habitantes veem no teu perfil. Por defeito apenas Karma é mostrado.", + welcomePmBody: "Bem-vindo ao Oasis — uma rede social livre, peer-to-peer, federada e cifrada, com uma arquitetura distribuída apenas por convite.\n\nAlguns locais interessantes por onde começar:\n\n- /profile — Edita o teu avatar, nome, descrição e quais módulos aparecem no teu lado público.\n- /invites — Adiciona um pub para te federares com o resto da rede.\n- /peers — Vê quem está ligado, faz nova varredura da LAN, exporta ou importa listas de peers.\n- /inhabitants — Descobre e visita os avatares de outras pessoas.\n- /tribes — Cria ou junta-te a grupos privados com cifragem ponta-a-ponta.\n- /inbox — Lê e envia mensagens privadas.\n- /activity — Vê a atividade recente, tua e da tua rede.\n- /publish — Escreve um post ou partilha uma imagem, áudio, vídeo ou documento.\n- /search — Pesquise o conteúdo da rede por tipo.\n\nAlguns lugares interessantes para conectar:\n\n- /multiverse — Faça a gestão das suas outras contas do multiverso, incluindo enviar e receber conteúdo.\n\nEsta mensagem foi enviada de forma privada de ti para ti mesmo, por isso não foi necessária qualquer ligação para a receber.", profileSensorsSectionTitle: "Sensores", profileVisibilityActivity: "Nível de atividade", - profileVisibilityDevice: "Dispositivo", profileDeviceLockedHint: "Este sensor está sempre ativo: permite que outros vejam de que dispositivo te conectas e não pode ser desativado.", profileVisibilityKarma: "Pontuação KARMA", profileVisibilityUbi: "UBI", @@ -769,7 +632,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "Chave GPG", - profileVisibilityClearnet: "Publicar o meu perfil", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Lojas", profileClearnetJobsLabel: "Empregos", @@ -823,7 +685,6 @@ module.exports = { " ou o estado da ligação.", ], walletSentToLine: ({ destination, amount }) => `Enviado ECO ${amount} para ${destination}`, - walletSettingsTitle: "Carteira", walletSettingsDescription: "Integra o Oasis com a tua carteira ECOin.", walletSettingsDocLink: "Guia de instalação ECOin", walletStatusMessages: { @@ -845,37 +706,19 @@ module.exports = { cipherTitle: "Encriptação", cipherDescription: "Encripta e decifra o teu texto simetricamente (usando uma senha partilhada).", randomPassword: "Senha aleatória", - cipherEncryptTitle: "Encriptar texto", - cipherEncryptDescription: "Introduz o texto a encriptar", - cipherTextLabel: "Texto a encriptar", cipherTextPlaceholder: "Introduz o texto a encriptar...", cipherPasswordLabel: "Define uma senha (mínimo 32 caracteres) para encriptar o teu texto", cipherPasswordDecryptLabel: "Define uma senha (mínimo 32 caracteres) para decifrar o seu texto", cipherPasswordPlaceholder: "Introduz uma senha...", cipherEncryptButton: "Encriptar", - cipherDecryptTitle: "Decifrar texto", - cipherDecryptDescription: "Introduz o texto a decifrar", cipherEncryptedMessageLabel: "Texto encriptado", cipherDecryptedMessageLabel: "Texto decifrado", - cipherPasswordUsedLabel: "Senha usada para encriptar (guarda-a!)", cipherEncryptedTextPlaceholder: "Introduz o texto encriptado...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Introduz o vetor de inicialização...", cipherDecryptButton: "Decifrar", password: "Senha", text: "Texto", encryptedText: "Texto encriptado", iv: "Vetor de inicialização (IV)", - encryptTitle: "Encriptar o teu texto", - encryptDescription: "Introduz o texto que queres encriptar e fornece uma senha.", - encryptButton: "Encriptar", - decryptTitle: "Decifrar o teu texto", - decryptDescription: "Introduz o texto encriptado e fornece a mesma senha usada para encriptar.", - decryptButton: "Decifrar", - passwordLengthError: "A senha deve ter pelo menos 32 caracteres.", - missingFieldsError: "Texto, senha ou IV não fornecidos.", - encryptionError: "Erro ao encriptar o texto.", - decryptionError: "Erro ao decifrar o texto.", bookmarkTitle: "Marcadores", bookmarkDescription: "Descobre e gere marcadores na tua rede.", bookmarkAllSectionTitle: "Marcadores", @@ -901,8 +744,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Opcional", bookmarkTagsLabel: "Tags", bookmarkTagsPlaceholder: "Introduz tags separadas por vírgulas", - bookmarkCategoryLabel: "Categoria", - bookmarkCategoryPlaceholder: "Opcional", bookmarkLastVisitLabel: "Última visita", bookmarkSearchPlaceholder: "Pesquisar URL, tags, categoria, autor...", bookmarkSortRecent: "Mais recentes", @@ -917,8 +758,6 @@ module.exports = { noLastVisit: "Sem última visita", videoTitle: "Vídeos", videoDescription: "Explora e gere conteúdo de vídeo na tua rede.", - videoPluginTitle: "Título", - videoPluginDescription: "Descrição", videoMineSectionTitle: "Os teus vídeos", videoCreateSectionTitle: "Carregar vídeo", videoUpdateSectionTitle: "Atualizar vídeo", @@ -950,7 +789,6 @@ module.exports = { videoSortOldest: "Mais antigos", videoSortTop: "Mais votados", videoSearchButton: "Pesquisa", - videoMessageAuthorButton: "MP", videoUpdatedAt: "Atualizado", videoNoMatch: "Nenhum vídeo corresponde à tua pesquisa.", documentTitle: "Documentos", @@ -991,8 +829,6 @@ module.exports = { documentUpdatedAt: "Atualizado", audioTitle: "Áudios", audioDescription: "Explora e gere conteúdo de áudio na tua rede.", - audioPluginTitle: "Título", - audioPluginDescription: "Descrição", audioMineSectionTitle: "Os teus áudios", audioCreateSectionTitle: "Carregar áudio", audioUpdateSectionTitle: "Atualizar áudio", @@ -1003,7 +839,6 @@ module.exports = { audioFilterMine: "MEUS", audioFilterRecent: "RECENTES", audioFilterTop: "TOP", - audioFilterBlockchain: "BLOCKCHAIN", audioCreateButton: "Carregar áudio", audioUpdateButton: "Atualizar", audioDeleteButton: "Eliminar", @@ -1030,6 +865,7 @@ module.exports = { audioFilterFavorites: "FAVORITOS", favoritesTitle: "Favoritos", favoritesDescription: "Todos os teus conteúdos favoritos num só lugar.", + favoritesSearchPlaceholder: "Pesquisar nos favoritos...", favoritesFilterAll: "TODOS", favoritesFilterRecent: "RECENTES", favoritesFilterAudios: "ÁUDIOS", @@ -1045,18 +881,13 @@ module.exports = { favoritesNoItems: "Ainda sem favoritos.", yourContacts: "Os teus contactos", allInhabitants: "Habitantes", - allCVs: "Todos os CVs", + allCVs: "CVs", discoverPeople: "Descobre habitantes na tua rede.", - allInhabitantsButton: "TODOS", - contactsButton: "APOIOS", - CVsButton: "CVs", - matchSkills: "Combinar competências", - matchSkillsButton: "COMBINAR COMPETÊNCIAS", - suggestedButton: "SUGERIDOS", searchInhabitantsPlaceholder: "FILTRAR habitantes POR NOME …", filterLocation: "FILTRAR habitantes POR LOCALIZAÇÃO …", filterLanguage: "FILTRAR habitantes POR IDIOMA …", filterSkills: "FILTRAR habitantes POR COMPETÊNCIAS …", + cvSkillsCount: "Competências", applyFilters: "Aplicar filtros", locationLabel: "Localização", languagesLabel: "Idiomas", @@ -1065,17 +896,18 @@ module.exports = { mutualFollowers: "Seguidores mútuos", suggestedFollowsYou: "Segue-te", latestInteractions: "Interações recentes", - viewAvatar: "Ver Avatar", - viewCV: "Ver CV", suggestedSectionTitle: "Sugeridos", topkarmaSectionTitle: "Melhor Karma", topecoSectionTitle: "Melhor Eco", topactivitySectionTitle: "Top Atividade", + "TOP INACTIVITYButton": "MAIS INATIVOS", + topinactivitySectionTitle: "Habitantes menos ativos", blockedSectionTitle: "Bloqueados", gallerySectionTitle: "GALERIA", - blockedButton: "BLOQUEADOS", + topSectionTitle: "TOP", blockedLabel: "Habitante bloqueado", inhabitantviewDetails: "Ver detalhes", + cvVisitButton: "Visitar CV", keepReading: "Continuar lendo...", oasisId: "ID", noInhabitantsFound: "Ainda sem habitantes encontrados.", @@ -1088,6 +920,7 @@ module.exports = { parliamentFilterCandidatures: "CANDIDATURAS", parliamentFilterProposals: "PROPOSTAS", parliamentFilterLaws: "LEIS", + parliamentFilterRevocations: "REVOGAÇÕES", parliamentFilterHistorical: "HISTÓRICO", parliamentFilterLeaders: "LÍDERES", parliamentFilterRules: "REGRAS", @@ -1113,10 +946,8 @@ module.exports = { parliamentPoliciesDeclined: "LEIS REJEITADAS", parliamentPoliciesDiscarded: "LEIS DESCARTADAS", parliamentEfficiency: "% EFICIÊNCIA", - parliamentFilterRevocations: 'REVOGAÇÕES', parliamentRevocationFormTitle: 'Revogar lei', parliamentRevocationLaw: 'Lei', - parliamentRevocationTitle: 'Título', parliamentRevocationReasons: 'Motivos', parliamentRevocationPublish: 'Publicar revogação', parliamentCurrentRevocationsTitle: 'Revogações atuais', @@ -1129,23 +960,12 @@ module.exports = { parliamentNoGovernments: "Ainda sem governos.", parliamentCandidatureFormTitle: "Propor candidatura", parliamentCandidatureIdPh: "Oasis ID (@...) ou nome da tribo", - parliamentCandidatureSlogan: "Slogan (máx 140 caracteres)", - parliamentCandidatureSloganPh: "Um lema curto", parliamentCandidatureMethod: "Método", parliamentCandidatureProposeBtn: "Publicar candidatura", - parliamentThDate: "Data da proposta", - parliamentThSlogan: "Slogan", - parliamentThSince: "Perfil desde", - parliamentThVotes: "Votos recebidos", - parliamentThVoteAction: "Votar", - parliamentTypeUser: "Habitante", - parliamentTypeTribe: "Tribo", parliamentVoteBtn: "Votar", parliamentProposalFormTitle: "Propor lei", parliamentProposalDescription: "Descrição (≤1000)", parliamentProposalPublish: "Publicar proposta", - parliamentFinalize: "Finalizar", - parliamentDeadline: "Prazo", parliamentNoProposals: "Ainda sem propostas de lei.", parliamentNoLaws: "Ainda sem leis aprovadas.", parliamentMethodDEMOCRACY: "Democracia", @@ -1163,29 +983,21 @@ module.exports = { parliamentVotesSlashTotal: "Votos/Total", parliamentVotesNeeded: "Votos necessários", parliamentFutureLawsTitle: "Leis futuras", - parliamentNoFutureLaws: "Ainda sem leis futuras.", parliamentVoteAction: "Votar", - parliamentLeadersTitle: "Líderes", parliamentThLeader: "AVATAR", parliamentPopulation: "População", - parliamentThType: "Tipo", - parliamentThInPower: "No poder", parliamentThPresented: "CANDIDATURAS", parliamentNoLeaders: "Ainda sem líderes.", parliamentCandidaturesListTitle: "Lista de candidaturas", parliamentTimeRemaining: "Tempo restante", - parliamentNoLeader: "Ainda sem candidatura vencedora.", parliamentElectionsStatusTitle: "Próximo governo", parliamentProposalDeadlineLabel: "Prazo", parliamentProposalTimeLeft: "Tempo restante", - parliamentProposalOnTrack: "A caminho da aprovação", - parliamentProposalOffTrack: "Apoio insuficiente", parliamentRulesTitle: "Como funciona o Parlamento", parliamentRulesIntro: "As eleições resolvem-se a cada 2 meses; as candidaturas são contínuas e reiniciam quando um governo é escolhido.", parliamentRulesCandidates: "Qualquer habitante pode propor-se a si, a outro habitante ou a qualquer tribo. Cada habitante pode propor até 3 candidaturas por ciclo; duplicados no mesmo ciclo são rejeitados.", parliamentRulesElection: "O vencedor é a candidatura com mais votos no momento da resolução.", parliamentRulesTies: "Desempate: maior karma do habitante; se empatado, perfil mais antigo; se ainda empatado, proposta mais antiga; depois ordem lexicográfica por ID.", - parliamentRulesFallback: "Se ninguém votar, a última candidatura proposta vence. Se não houver candidaturas, uma tribo aleatória é selecionada.", parliamentRulesTerm: "O separador Governo mostra o governo atual e estatísticas.", parliamentRulesMethods: "Formas: Anarquia (maioria simples), Democracia (50%+1), Maioria (80%), Minoria (20%), Karmatocracia (propostas com maior karma), Ditadura (aprovação instantânea).", parliamentRulesAnarchy: "A Anarquia é o modo predefinido: se nenhuma candidatura for eleita na resolução, a Anarquia é proclamada. Sob Anarquia, qualquer habitante pode propor leis.", @@ -1207,11 +1019,7 @@ module.exports = { courtsCaseFormTitle: "Abrir caso", courtsCaseRespondent: "Acusado / Demandado", courtsCaseRespondentPh: "Oasis ID (@...) ou nome da tribo", - courtsCaseMediatorsAccuser: "Mediadores (acusação)", courtsCaseMethod: "Método de resolução", - courtsCaseDescription: "Descrição (máx 1000 caracteres)", - courtsCaseEvidenceTitle: "Provas do caso", - courtsCaseEvidenceHelp: "Anexa imagens, áudios, documentos (PDF) ou vídeos que sustentem o teu caso.", courtsCaseSubmit: "Apresentar caso", courtsNominateJudge: "Nomear juiz", courtsJudgeId: "Juiz", @@ -1256,22 +1064,6 @@ module.exports = { courtsRulesMisconduct: "Assédio, manipulação ou provas fabricadas podem levar a resolução negativa imediata.", courtsRulesGlossary: "Caso: registo de um conflito. Provas: materiais que sustentam alegações. Veredicto: decisão com medida. Recurso: pedido de revisão do veredicto.", courtsFilterActions: "AÇÕES", - courtsNoActions: "Sem ações pendentes para o teu papel.", - courtsCaseTitlePlaceholder: "Breve descrição do conflito", - courtsCaseSeverity: "Gravidade", - courtsCaseSeverityNone: "Sem etiqueta de gravidade", - courtsCaseSeverityLOW: "Baixa", - courtsCaseSeverityMEDIUM: "Média", - courtsCaseSeverityHIGH: "Alta", - courtsCaseSeverityCRITICAL: "Crítica", - courtsCaseSubject: "Tópico", - courtsCaseSubjectNone: "Sem etiqueta de tópico", - courtsCaseSubjectBEHAVIOUR: "Comportamento", - courtsCaseSubjectCONTENT: "Conteúdo", - courtsCaseSubjectGOVERNANCE: "Governação / regras", - courtsCaseSubjectFINANCIAL: "Financeiro / recursos", - courtsCaseSubjectOTHER: "Outro", - courtsHiddenRespondent: "Oculto (visível apenas para os envolvidos).", courtsThRole: "Papel", courtsRoleAccuser: "Acusador", courtsRoleDefence: "Defesa", @@ -1282,54 +1074,19 @@ module.exports = { courtsAssignJudgeBtn: "Escolher juiz", trendingTitle: "Tendências", exploreTrending: "Explora o conteúdo mais popular na tua rede.", - bookmarkButton: "MARCADORES", - transferButton: "TRANSFERÊNCIAS", - eventButton: "EVENTOS", - taskButton: "TAREFAS", votesButton: "VOTAÇÕES", - industryButton: "INDÚSTRIA", - projectButton: "PROJETOS", - shopProductButton: "PRODUTOS", - reportButton: "RELATÓRIOS", - feedButton: "FEED", - marketButton: "MERCADO", - imageButton: "IMAGENS", - audioButton: "ÁUDIOS", - videoButton: "VÍDEOS", - documentButton: "DOCUMENTOS", - torrentButton: "TORRENTS", - noTrendingFound: "Nenhum conteúdo em tendência encontrado.", - noContentMessage: "Ainda sem conteúdo em tendência disponível.", - trendingDescription: "Descrição", - trendingDate: "Data", - trendingLocation: "Localização", - trendingPrice: "Preço", - trendingUrl: "URL", - trendingCategory: "Categoria", - trendingStart: "Início", - trendingEnd: "Fim", - trendingPriority: "Prioridade", - trendingStatus: "Estado", - trendingFrom: "De", - trendingTo: "Para", - trendingConcept: "Conceito", - trendingAmount: "Montante", - trendingDeadline: "Prazo", - trendingItemStatus: "Estado do item", - trendingTotalVotes: "Total de votos", + shopProductButton: "LOJA", trendingTotalOpinions: "Total de opiniões", trendingNoContentMessage: "Ainda não há tendências.", - trendingAuthor: "Por", - trendingCreatedAtLabel: "Criado em", trendingTotalCount: "Contagem total", tasksTitle: "Tarefas", tasksDescription: "Descobre e gere tarefas na tua rede.", + taskSearchPlaceholder: "Pesquisar tarefas...", taskTitleLabel: "Título", taskDescriptionLabel: "Descrição", taskStartTimeLabel: "Hora de início", taskEndTimeLabel: "Hora de fim", taskPriorityLabel: "Prioridade", - taskPrioritySelect: "Selecionar prioridade", taskPriorityUrgent: "Urgente", taskPriorityHigh: "Alta", taskPriorityMedium: "Média", @@ -1339,13 +1096,13 @@ module.exports = { taskVisibilityLabel: "Visibilidade", taskPublic: "público", taskPrivate: "privado", - taskCreatedAt: "Criado em", - taskBy: "Por", taskStatus: "Estado", taskStatusOpen: "Abrir", taskStatusInProgress: "Em progresso", taskStatusClosed: "Fechado", taskAssignedTo: "Atribuído a", + taskAssignedChip: "Atribuída", + taskUnassignedChip: "Por atribuir", taskAssignees: "Atribuídos", taskAssignButton: "Atribuir a mim", taskUnassignButton: "Remover", @@ -1358,7 +1115,6 @@ module.exports = { taskFilterInProgress: "EM PROGRESSO", taskFilterClosed: "FECHADO", taskFilterAssigned: "ATRIBUÍDO", - taskFilterArchived: "ARQUIVADO", taskFilterUrgent: "URGENTE", taskFilterHigh: "ALTA", taskFilterMedium: "MÉDIA", @@ -1371,23 +1127,21 @@ module.exports = { taskInProgressTitle: "Tarefas em progresso", taskClosedTitle: "Tarefas fechadas", taskAssignedTitle: "Tarefas atribuídas", - taskArchivedTitle: "Tarefas arquivadas", - taskPublicTitle: "Tarefas públicas", - taskPrivateTitle: "Tarefas privadas", notasks: "Sem tarefas disponíveis.", noLocation: "Sem localização especificada", taskSetStatus: "Definir estado", - eventTitle: "Eventos", eventDateLabel: "Data", + eventRecurrenceLabel: "Recorrência", + eventRecurrenceUntil: "Repetir até", + eventRecurrenceHint: "Deixa a data final vazia para um evento único.", + eventUpcomingDates: "Próximas datas", eventsTitle: "Eventos", eventsDescription: "Descobre e gere eventos na tua rede.", - eventDescription: "Descrição", + eventSearchPlaceholder: "Pesquisar eventos...", eventPrice: "Preço", eventStatus: "Estado", - eventOrganizer: "Organizador", eventAllSectionTitle: "Eventos", eventMineSectionTitle: "Os teus eventos", - eventArchivedTitle: "Eventos arquivados", eventCreateSectionTitle: "Criar evento", eventUpdateSectionTitle: "Atualizar evento", eventDeleteButton: "Eliminar", @@ -1395,11 +1149,26 @@ module.exports = { eventAddToCalendar: "Adicionar ao calendário", eventVisitCalendar: "Ver calendário", viewTask: "Ver tarefa", + viewEvent: "Ver evento", + viewPad: "Ver pad", + viewMap: "Ver mapa", + viewCalendar: "Ver calendário", viewReport: "Ver relatório", viewTransfer: "Ver transferência", viewItem: "Ver item", viewShop: "Ver loja", viewProject: "Ver projeto", + viewJob: "Ver Emprego", + viewPlace: "Ver Lugar", + generatePdf: "Gerar PDF", + sharePm: "Partilhar por MP", + galleryImages: "Imagens (tamanho máx: 50MB cada)", + galleryPhotos: "Imagens", + galleryAddPhoto: "Adicionar Imagem", + galleryRemovePhoto: "Remover", + galleryVideo: "Vídeo (tamanho máx: 50MB)", + galleryAddVideo: "Adicionar Vídeo", + galleryRemoveVideo: "Remover vídeo", viewVotation: "Ver votação", voteCastTitle: "Emitir Voto", voteResults: "Resultados", @@ -1407,29 +1176,15 @@ module.exports = { eventDescriptionLabel: "Descrição", eventDescriptionPlaceholder: "Introduz a descrição do evento...", eventUpdateButton: "Atualizar", - eventAttendeesLabel: "Participantes", - eventAttendeesPlaceholder: "Introduz participantes, separados por vírgulas...", eventTagsLabel: "Tags", - eventTagsPlaceholder: "Introduz tags do evento, separadas por vírgulas...", - eventTags: "Tags", eventPriceLabel: "Preço", eventUrlLabel: "URL", eventAttendees: "Participantes", - noAttendees: "Ainda sem participantes", - eventCreatedAt: "Criado em", eventLocation: "Localização", eventLocationLabel: "Localização", - eventNoLocation: "Sem localização especificada", - eventNoURL: "Sem URL especificado", - eventBy: "Por", noevents: "Sem eventos disponíveis.", eventDate: "Data", - eventDateFormat: "DD:MM:AAAA HH:mm", eventAttendButton: "Participar no evento", - eventUnattendButton: "Sair do evento", - eventCreatedBy: "Criado por", - eventAttendeesCount: "Número de participantes", - eventCreatedByYou: "Criaste este evento", eventFilterAll: "TODOS", eventFilterMine: "MEUS", eventFilterToday: "HOJE", @@ -1437,18 +1192,9 @@ module.exports = { eventFilterMonth: "ESTE MÊS", eventFilterYear: "ESTE ANO", eventFilterArchived: "ARQUIVADO", - eventTodayTitle: "Eventos de hoje", - eventThisWeekTitle: "Eventos desta semana", - eventThisMonthTitle: "Eventos deste mês", - eventThisYearTitle: "Eventos deste ano", eventPrivacyLabel: "Visibilidade", eventPublic: "Público", eventPrivate: "Privado", - eventPublicTitle: "Eventos públicos", - eventNoPrice: "Evento gratuito", - eventNoImage: "Sem imagem carregada", - eventAttendConfirmation: "You are now attending this event", - eventUnattendConfirmation: "You are no longer attending this event", eventAttended: "Presente", eventUnattended: "Ausente", eventStatusOpen: "Abrir", @@ -1459,6 +1205,10 @@ module.exports = { tagsTopSectionTitle: "Tags populares", tagsCloudSectionTitle: "Nuvem de tags", tagsFilterAll: "TODOS", + tagsFilterMine: "MINHAS", + tagsFilterRecent: "RECENTES", + tagsMineSectionTitle: "As minhas etiquetas", + tagsRecentSectionTitle: "Etiquetas recentes", tagsFilterTop: "TOP", tagsFilterCloud: "NUVEM", tagsNoItems: "Sem tags disponíveis.", @@ -1502,18 +1252,12 @@ module.exports = { transfersDeadline: "Prazo", transfersTags: "Tags", transfersStatus: "Estado", - transfersStatusUnconfirmed: "NÃO CONFIRMADO", - transfersStatusClosed: "FECHADO", - transfersStatusDiscarded: "DESCARTADO", - transfersCreatedAt: "Criado em", transfersConfirmations: "CONFIRMAÇÕES", - transfersContainingBlock: "Bloco contendor", - transfersExportContract: "Contrato inteligente", + transfersExportContract: "Gerar Fatura", transfersConfirmButton: "Confirmar transferência", transfersNoItems: "Sem transferências encontradas.", transfersMineSectionTitle: "As tuas transferências", transfersUBISectionTitle: "Transferências RBU", - transfersMarketSectionTitle: "Transferências de mercado", transfersTopSectionTitle: "Transferências mais votadas", transfersPendingSectionTitle: "Transferências pendentes", transfersUnconfirmedSectionTitle: "Transferências não confirmadas", @@ -1521,21 +1265,13 @@ module.exports = { transfersDiscardedSectionTitle: "Transferências descartadas", transfersCreateSectionTitle: "Criar transferência", transfersAllSectionTitle: "Transferências", - transfersFilterFavs: "Favoritos", - transfersFavsSectionTitle: "Transferências favoritas", - transfersSearchLabel: "Pesquisa", transfersSearchPlaceholder: "Pesquisar conceito, tags, utilizadores...", transfersMinAmountLabel: "Montante mínimo", transfersMaxAmountLabel: "Montante máximo", - transfersSortLabel: "Ordenar por", transfersSortRecent: "Mais recentes", transfersSortAmount: "Maior montante", transfersSortDeadline: "Prazo mais próximo", transfersSearchButton: "Pesquisa", - transfersFavoriteButton: "Favorito", - transfersUnfavoriteButton: "Remover favorito", - transfersMessageUserButton: "Mensagem", - transfersExpiringSoonBadge: "A EXPIRAR", transfersExpiredBadge: "EXPIRADO", transfersUpdatedAt: "Atualizado", transfersNoMatch: "Nenhuma transferência corresponde à tua pesquisa.", @@ -1580,16 +1316,6 @@ module.exports = { voteNoQuestion: "Sem questão fornecida", voteUnknownCreator: "Criador desconhecido", voteUnknownDate: "Data desconhecida", - errorVoteNotFound: "Votação não encontrada", - errorAlreadyVoted: "Já deste a tua opinião.", - errorVoteClosedCannotEdit: "Não podes editar uma votação fechada", - errorVoteDeadlinePassed: "O prazo desta votação já passou", - errorRetrievingVote: "Erro ao obter votação", - errorCreatingVote: "Erro ao criar votação", - errorVoteAlreadyVoted: "Não é possível editar após a opinião ter sido emitida", - errorDeletingOldVote: "Erro ao eliminar opinião anterior", - errorCreatingUpdatedVote: "Erro ao criar opinião atualizada", - errorCreatingTombstone: "Erro ao criar tombstone", voteDetailSectionTitle: 'Detalhes da votação', voteCommentsLabel: 'Comentários', voteCommentsForumButton: 'Abrir discussão', @@ -1599,7 +1325,6 @@ module.exports = { voteNewCommentButton: 'Publicar comentário', voteNewCommentLabel: 'Adicionar comentário', cvTitle: "Currículo", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Editar CV", cvCreateSectionTitle: "Criar CV", cvDescription: "Gere e partilha as tuas competências e informações profissionais.", @@ -1618,19 +1343,16 @@ module.exports = { cvLocationLabel: "Localização", cvStatusLabel: "Estado", cvPreferencesLabel: "Preferências", - cvOasisContributorLabel: "Contribuidor Oasis", cvPersonal: "Pessoal", cvOasis: "Contribuidor Oasis (opcional)", - cvOasisContributorView: "Contribuição Oasis", + cvOasisContributorView: "Contribuição", cvEducational: "Educativo (opcional)", cvEducationalView: "Educativo", cvProfessional: "Profissional (opcional)", cvProfessionalView: "Profissional", cvAvailability: "Disponibilidade (opcional)", - cvAvailabilityView: "Disponibilidade", cvUpdateButton: "Atualizar", cvCreateButton: "Criar CV", - cvContactLabel: "Contacto", cvCreatedAt: "Criado em", cvUpdatedAt: "Atualizado em", cvEditButton: "Atualizar", @@ -1639,8 +1361,103 @@ module.exports = { blogSubject: "Assunto", blogMessage: "Mensagem", blogImage: "Carregar mídia (máx: 50MB)", + blogMedia: "Anexos (até 8 imagens e um vídeo)", blogPublish: "Pré-visualizar", - noPopularMessages: "Ainda sem mensagens populares publicadas", + pollsTitle: "Sondagens", + dataTitle: "Correspondências", + dataDescription: "Explora e visualiza as correspondências da tua rede.", + dataFilterAll: "TUDO", + dataFilterMine: "MEUS", + dataFilterRecent: "RECENTES", + dataFilterTop: "TOP", + dataKindInhabitants: "HABITANTES", + dataKindJobs: "EMPREGOS", + dataKindProjects: "PROJETOS", + dataKindEvents: "EVENTOS", + dataKindTribes: "TRIBOS", + dataKindMarket: "MERCADO", + dataKindHousing: "HABITAÇÃO", + dataKindIndustry: "INDÚSTRIA", + dataKindTasks: "TAREFAS", + dataKindReports: "RELATÓRIOS", + dataKindVotes: "VOTAÇÕES", + dataSearchPlaceholder: "Procurar nos dados cruzados...", + dataCohesionTitle: "Coeficiente de coesão (CC)", + dataCcShort: "CC", + dataCohesionHint: "Afinidade média entre tudo o que a rede publicou.", + dataAffinity: "Afinidade", + dataCommonTerms: "Palavra-chave", + dataStatPeople: "CVs", + dataStatConnected: "Ligados", + dataStatSkills: "Habilidades", + dataBestMatch: "Melhor match", + dataStatIsolated: "Isolados", + dataStatEntities: "Entidades comparadas", + dataStatTerms: "Termos distintos", + dataStatPairs: "Pares ligados", + dataMatchesTitle: "Correspondências", + dataMatchesHint: "Sugestões personalizadas do algoritmo.", + dataTermsTitle: "Palavras-chave", + dataTermsHint: "Os termos que aparecem em mais conteúdos.", + dataConnections: "Correspondências ligadas", + dataTopicTitle: "Tudo o que se relaciona com", + dataTopicHint: "O que o algoritmo relaciona com este tema", + dataNoMatches: "Sem dados cruzados para mostrar.", + dataNoProfile: "Publica conteúdo ou escreve o teu CV para que o algoritmo aprenda o que te interessa.", + pollsDescription: "Módulo para perguntar à rede e contar as respostas.", + pollFilterAll: "TODAS", + pollFilterMine: "MINHAS", + pollFilterRecent: "RECENTES", + pollFilterTop: "TOP", + pollFilterVoted: "VOTADAS", + pollFilterOpen: "ABERTAS", + pollFilterClosed: "FECHADAS", + pollCreateButton: "Criar Sondagem", + pollCreateTitle: "Criar Sondagem", + pollEditTitle: "Editar Sondagem", + pollQuestion: "Pergunta", + pollQuestionPlaceholder: "O que queres perguntar?", + pollOptions: "Opções (uma por linha)", + pollOutcome: "Resultado", + pollNoVotesYet: "Ainda sem votos", + pollTie: "Empate", + pollOptionsPlaceholder: "Praça\nParque\nBar", + pollAnonymous: "Anónima", + pollAnonymousLabel: "Sondagem anónima", + pollMultiple: "Escolha múltipla", + pollMultipleLabel: "Permitir várias respostas", + pollDeadline: "Prazo", + pollTags: "Etiquetas", + pollPublishButton: "Publicar Sondagem", + pollUpdateButton: "Atualizar", + pollCloseButton: "Fechar", + pollDeleteButton: "Eliminar", + pollVoteButton: "Votar", + pollChangeVote: "Mudar Voto", + pollVoters: "Votantes", + pollComments: "Comentários", + pollStatusLabel: "Estado", + pollStatusOpen: "ABERTA", + pollStatusClosed: "FECHADA", + pollSearchPlaceholder: "Procurar sondagens...", + pollsNoItems: "Nenhuma sondagem encontrada.", + viewPoll: "Ver Sondagem", + pollChatCreate: "Criar Sondagem", + pollInChat: "Sondagem", + blogTitle: "Blogs", + blogDescription: "Módulo para descobrir e gerir blogs.", + blogFilterAll: "TODOS", + blogFilterMine: "MEUS", + blogFilterRecent: "RECENTES", + blogFilterFavorites: "FAVORITOS", + blogFilterTop: "TOP", + blogCreateButton: "Criar Blog", + blogSearchPlaceholder: "Procurar blogs...", + blogComments: "Comentários", + blogAllowComments: "Permitir comentários", + blogCommentsClosed: "O autor fechou os comentários deste blog.", + blogNoItems: "Nenhum blog encontrado.", + viewBlog: "Ver Blog", forumTitle: "Fóruns", forumCategoryLabel: "Categoria", forumTitleLabel: "Título", @@ -1648,43 +1465,22 @@ module.exports = { forumCreateButton: "Criar fórum", forumCreateSectionTitle: "Criar fórum", forumDescription: "Conversa abertamente com outros habitantes na tua rede.", + forumSearchPlaceholder: "Pesquisar fóruns...", forumFilterAll: "TODOS", forumFilterMine: "MEUS", forumFilterRecent: "RECENTES", forumFilterTop: "TOP", - forumMineSectionTitle: "Os teus fóruns", - forumRecentSectionTitle: "Fóruns recentes", - forumAllSectionTitle: "Fóruns", forumDeleteButton: "Eliminar", forumParticipants: "participantes", forumMessages: "mensagens", - forumLastMessage: "Última mensagem", forumMessageLabel: "Mensagem", forumMessagePlaceholder: "Escreve a tua mensagem...", forumSendButton: "Enviar", - forumVisitForum: "Visitar fórum", noForums: "Sem fóruns encontrados.", - forumVisitButton: "Visitar fórum", - forumCatGENERAL: "Geral", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Política", - forumCatTECH: "Tecnologia", - forumCatSCIENCE: "Ciência", - forumCatMUSIC: "Música", - forumCatART: "Arte", - forumCatGAMING: "Jogos", - forumCatBOOKS: "Livros", - forumCatFILMS: "Filmes", - forumCatPHILOSOPHY: "Filosofia", - forumCatSOCIETY: "Sociedade", - forumCatPRIVACY: "Privacidade", - forumCatCYBERWARFARE: "Guerra cibernética", - forumCatSURVIVALISM: "Sobrevivencialismo", + forumVisitButton: "Ver Fórum", + forumTopicLabel: "Tópico", imageTitle: "Imagens", imageDescription: "Explora e gere conteúdo de imagens na tua rede.", - imagePluginTitle: "Título", - imagePluginDescription: "Descrição", imageMineSectionTitle: "As tuas imagens", imageCreateSectionTitle: "Carregar imagem", imageUpdateSectionTitle: "Atualizar imagem", @@ -1693,14 +1489,12 @@ module.exports = { imageTopSectionTitle: "Imagens mais votadas", imageFavoritesSectionTitle: "Favoritos", imageGallerySectionTitle: "Galeria", - imageMemeSectionTitle: "Memes", imageFilterAll: "TODOS", imageFilterMine: "MEUS", imageFilterRecent: "RECENTES", imageFilterTop: "TOP", imageFilterFavorites: "FAVORITOS", imageFilterGallery: "GALERIA", - imageFilterMeme: "MEMES", imageCreateButton: "Carregar imagem", imageUpdateButton: "Atualizar", imageDeleteButton: "Eliminar", @@ -1713,7 +1507,6 @@ module.exports = { imageTitlePlaceholder: "Opcional", imageDescriptionLabel: "Descrição", imageDescriptionPlaceholder: "Opcional", - imageMemeLabel: "MEME?", imageNoFile: "Nenhum ficheiro de imagem fornecido", noImages: "Sem imagens disponíveis.", imageSearchPlaceholder: "Pesquisar título, tags, descrição, autor...", @@ -1721,7 +1514,6 @@ module.exports = { imageSortOldest: "Mais antigos", imageSortTop: "Mais votados", imageSearchButton: "Pesquisa", - imageMessageAuthorButton: "Mensagem", imageUpdatedAt: "Atualizado", imageNoMatch: "Nenhuma imagem corresponde à tua pesquisa.", feedTitle: "Feed", @@ -1729,7 +1521,6 @@ module.exports = { createFeedButton: "Enviar Feed!", feedPlaceholder: "O que se passa? (máx 280 caracteres)", TODAYButton: "HOJE", - CREATEButton: "Criar Feed", totalOpinions: "Total de opiniões", moreVoted: "Mais votado", noFeedsFound: "Sem feeds encontrados.", @@ -1752,20 +1543,12 @@ module.exports = { concept: "Conceito", description: "Descrição", meme: "Meme", - activityContact: "Contacto", - activityBy: "Nome", - activityPixelia: "Novo pixel adicionado", - viewImage: "Ver imagem", - playAudio: "Reproduzir áudio", - playVideo: "Reproduzir vídeo", typeRecent: "RECENTES", - errorActivity: "Erro ao obter atividade", + typeTop: "TOP", typePost: "BLOGS", - recentButton: "RECENTES", typeTribe: "TRIBOS", typeLarp: "L.A.R.P.", typeInhabitants: "HABITANTES", - activityProfileUpdated: "atualizou seu perfil", typeAbout: "HABITANTES", typeCurriculum: "CVS", typeImage: "IMAGENS", @@ -1809,8 +1592,6 @@ module.exports = { typeCourtsSettlementAccepted: "Tribunais · Acordo aceite", typeCourtsNomination: "Tribunais · Nomeação", typeCourtsNominationVote: "Tribunais · Voto de nomeação", - activitySupport: "Nova aliança formada", - activityJoin: "Novo PUB aderido", question: "Pergunta", deadline: "Prazo", status: "Estado", @@ -1824,12 +1605,8 @@ module.exports = { date: "Data", category: "Categoria", attendees: "Participantes", - activitySpread: "->", - visitLink: "Visitar link", - viewDocument: "Ver documento", location: "Localização", contentWarning: "Assunto", - personName: "Nome do habitante", bankWalletConnected: "Carteira ECOin", bankUbiReceived: "UBI recebido", bankTx: "Tx", @@ -1839,7 +1616,6 @@ module.exports = { link: "Link", activityProjectFollow: "%OASIS% está agora a %ACTION% este projeto %PROJECT%", activityProjectUnfollow: "%OASIS% está agora a %ACTION% este projeto %PROJECT%", - activityProjectPledged: "%OASIS% %ACTION% %AMOUNT% ao projeto %PROJECT%", following: "A SEGUIR", unfollowing: "A DEIXAR DE SEGUIR", pledged: "COMPROMETIDO", @@ -1885,26 +1661,17 @@ module.exports = { courtsVotesSlashTotal: "YES/TOTAL", courtsOpenVote: "Open vote", courtsAnswerTitle: "Answer", - courtsStanceADMIT: "Admit", - courtsStanceDENY: "Deny", - courtsStancePARTIAL: "Partial", - courtsStanceCOUNTERCLAIM: "Reconvenção", - courtsStanceNEUTRAL: "Neutro", courtsVerdictResult: "Result", courtsVerdictOrders: "Orders", courtsSettlementText: "Settlement", courtsSettlementAccepted: "Aceite", - courtsSettlementPending: "Pendente", courtsJudge: "Juiz", courtsThSupports: "Supports", courtsFilterOpenCase: 'Open Case', - courtsEvidenceFileLabel: 'Ficheiro de prova (imagem, áudio, vídeo ou PDF)', - courtsCaseMediators: 'Mediadores', courtsCaseMediatorsPh: 'Mediator Oasis IDs, separated by comma', courtsMediatorsLabel: 'Mediadores', courtsThCase: 'Case', courtsThCreatedAt: 'Start date', - courtsThActions: 'Actions', courtsPublicPrefLabel: 'Visibility after resolution', courtsPublicPrefYes: 'I agree this case can be fully public', courtsPublicPrefNo: 'I prefer to keep the details private', @@ -1912,8 +1679,11 @@ module.exports = { courtsMethodMEDIATION: 'Mediation', courtsNoCases: 'No cases.', reportsTitle: "Relatórios", - reportsDescription: "Gere e acompanha relatórios relacionados com problemas, bugs, abusos e avisos de conteúdo na tua rede.", + reportsDescription: "Gere e acompanha os relatos da tua rede.", + reportsSearchPlaceholder: "Pesquisar relatórios...", reportsFilterAll: "TODOS", + reportsFilterRecent: "RECENTES", + reportsFilterTop: "TOP", reportsFilterMine: "MEUS", reportsFilterFeatures: "FUNCIONALIDADES", reportsFilterBugs: "BUGS", @@ -1926,18 +1696,13 @@ module.exports = { reportsFilterInvalid: "INVÁLIDO", reportsCreateButton: "Criar relatório", reportsTitleLabel: "Título", - reportsDescriptionLabel: "Descrição", - reportsDescriptionPlaceholder: "Por favor, fornece uma descrição detalhada.", reportsCategory: "Categoria", - reportsCategoryLabel: "Categoria", reportsCategoryFeatures: "Funcionalidades", reportsCategoryBugs: "Bugs", reportsCategoryAbuse: "Abuso", - reportsCategoryContent: "Problemas de conteúdo", + reportsCategoryContent: "Conteúdo", reportsUpdateButton: "Atualizar", reportsDeleteButton: "Eliminar", - reportsDateLabel: "Data", - reportsUploadFile: "Carregar mídia (máx: 50MB)", reportsMineSectionTitle: "Os teus relatórios", reportsFeaturesSectionTitle: "Pedidos de funcionalidades", reportsBugsSectionTitle: "Bugs", @@ -1945,11 +1710,6 @@ module.exports = { reportsContentSectionTitle: "Problemas de conteúdo", reportsAllSectionTitle: "Relatórios", reportsNoItems: "Sem relatórios disponíveis.", - reportsValidationTitle: "Por favor, introduz um título válido.", - reportsValidationDescription: "A descrição não pode estar vazia.", - reportsValidationCategory: "Por favor, seleciona uma categoria.", - reportsCreatedAt: "Criado em", - reportsCreatedBy: "By", reportsSeverity: "Gravidade", reportsSeverityLow: "Baixa", reportsSeverityMedium: "Média", @@ -1960,13 +1720,10 @@ module.exports = { reportsStatusUnderReview: "Em análise", reportsStatusResolved: "Resolvido", reportsStatusInvalid: "Inválido", - reportsUpdateStatusButton: "Atualizar estado", - reportsAnonymityOption: "Enviar anonimamente", - reportsAnonymousAuthor: "Anónimo", reportsConfirmButton: "CONFIRMAR RELATÓRIO!", reportsConfirmations: "Confirmações", reportsConfirmedSectionTitle: "Relatórios confirmados", - reportsCreateTaskButton: "CRIAR TAREFA", + reportsCreateTaskButton: "Criar Tarefa", reportsOpenSectionTitle: "Relatórios abertos", reportsUnderReviewSectionTitle: "Relatórios em análise", reportsResolvedSectionTitle: "Relatórios resolvidos", @@ -2010,6 +1767,20 @@ module.exports = { reportsRequestedActionLabel: 'Ação solicitada', reportsRequestedActionPlaceholder: 'Remover, ocultar, etiquetar, avisar, etc.', tribesTitle: "Tribos", + tribeFilterAll: "TODAS", + tribeFilterRecent: "RECENTES", + tribeFilterMine: "MINHAS", + tribeFilterMembership: "ADESÃO", + tribeFilterSubtribes: "SUBTRIBOS", + tribeFilterTop: "TOP", + tribeFilterGallery: "GALERIA", + tribeFeedFilterTOP: "TOP", + tribeFeedFilterMINE: "MEUS", + tribeFeedFilterALL: "TODOS", + tribeFeedFilterRECENT: "RECENTES", + courtsStanceDENY: "Negar", + courtsStanceADMIT: "Admitir", + courtsStancePARTIAL: "Admitir em parte", tribeAllSectionTitle: "Tribos", tribeMineSectionTitle: "As tuas tribos", tribeCreateSectionTitle: "Criar tribo", @@ -2021,13 +1792,6 @@ module.exports = { tribeviewSubTribeButton: "Visitar sub-tribo", tribeRootLabel: "RAIZ", tribeDescription: "Explora ou cria tribos na tua rede.", - tribeFilterAll: "TODOS", - tribeFilterMine: "MEUS", - tribeFilterMembership: "MEMBROS", - tribeFilterRecent: "RECENTES", - tribeFilterTop: "TOP", - tribeFilterSubtribes: "SUB-TRIBOS", - tribeFilterGallery: "GALERIA", tribeMainTribeLabel: "TRIBO PRINCIPAL", tribeCreateButton: "Criar tribo", tribeUpdateButton: "Atualizar", @@ -2046,13 +1810,8 @@ module.exports = { tribeModeLabel: "MODE", tribeIsAnonymousLabel: "ESTADO", tribeMembersCount: "Members", - tribeInviteCodePlaceholder: "Introduz código de convite", - tribeJoinByCodeButton: "Aderir com código", - tribeJoinButton: "ADERIR", tribeEnterInvite: "INSERIR CONVITE", tribeLeaveButton: "SAIR", - tribeYes: "SIM", - tribeNo: "NÃO", tribePublic: "PÚBLICO", tribePrivate: "PRIVADO", tribeGenerateInvite: "CONVITE ÚNICO", @@ -2061,13 +1820,8 @@ module.exports = { tribeRemoveInvitation: "REMOVER CONVITE", tribeCreatedAt: "Criado em", tribeAuthor: "Por", - tribeAuthorLabel: "AUTOR", tribeStrict: "Restrito", tribeOpen: "Abrir", - tribeFeedFilterRECENT: "RECENTES", - tribeFeedFilterMINE: "MEUS", - tribeFeedFilterALL: "TODOS", - tribeFeedFilterTOP: "TOP", tribeFeedRefeeds: "Republicações", tribeFeedRefeed: "Republicar", tribeFeedMessagePlaceholder: "Escreve um feed…", @@ -2077,17 +1831,12 @@ module.exports = { tribeNotFound: "Tribo não encontrada!", createTribeTitle: "Criar tribo", updateTribeTitle: "Atualizar tribo", - tribeSectionOverview: "Visão geral", tribeSectionInhabitants: "Habitantes", tribeSectionVotations: "VOTAÇÕES", tribeSectionEvents: "EVENTOS", - tribeSectionReports: "Relatórios", tribeSectionTasks: "TAREFAS", tribeSectionFeed: "FEED", tribeSectionForum: "FÓRUM", - tribeSectionMarket: "Mercado", - tribeSectionJobs: "Empregos", - tribeSectionProjects: "Projetos", tribeSectionMedia: "Média", tribeSectionImages: "IMAGENS", tribeSectionAudios: "ÁUDIOS", @@ -2125,11 +1874,6 @@ module.exports = { tribeTaskStatusClosed: "FECHAR", tribeTaskAssign: "ATRIBUIR", tribeTaskUnassign: "REMOVER", - tribeReportCreate: "Criar relatório", - tribeReportsEmpty: "Ainda sem relatórios.", - tribeReportTitle: "Título", - tribeReportDescription: "Descrição", - tribeReportCategory: "Categoria", tribeVotationCreate: "Criar votação", tribeVotationsEmpty: "Ainda sem votações.", tribeVotationTitle: "Título", @@ -2147,27 +1891,6 @@ module.exports = { tribeForumCategory: "Categoria", tribeForumReply: "Responder", tribeForumReplies: "Respostas", - tribeMarketCreate: "Criar anúncio", - tribeMarketEmpty: "Ainda sem anúncios.", - tribeMarketTitle: "Título", - tribeMarketDescription: "Descrição", - tribeMarketPrice: "Preço", - tribeMarketImage: "Imagem", - tribeMarketCategory: "Categoria", - tribeJobCreate: "Criar emprego", - tribeJobsEmpty: "Ainda sem empregos.", - tribeJobTitle: "Título", - tribeJobDescription: "Descrição", - tribeJobLocation: "Localização", - tribeJobSalary: "Salário", - tribeJobDeadline: "Prazo", - tribeProjectCreate: "Criar projeto", - tribeProjectsEmpty: "Ainda sem projetos.", - tribeProjectTitle: "Título", - tribeProjectDescription: "Descrição", - tribeProjectGoal: "Objetivo", - tribeProjectFunded: "Financiado", - tribeProjectDeadline: "Prazo", tribeMediaUpload: "Carregar média", readDocument: "Ler Documento", tribeCreateImage: "Criar Imagem", @@ -2178,7 +1901,6 @@ module.exports = { tribeMediaEmpty: "Ainda sem média.", tribeMediaTitle: "Título", tribeMediaDescription: "Descrição", - tribeMediaType: "Tipo", tribeMediaTypeImage: "Imagem", tribeMediaTypeVideo: "Vídeo", tribeMediaTypeAudio: "Áudio", @@ -2188,11 +1910,6 @@ module.exports = { tribeInviteCodeText: "Código de convite: ", oasisVersionLabel: "Versão do Oasis", tribeInviteCodeHint: "Partilha este código com quem queres convidar. Pode entrar via /invites → Tribes.", - tribeGroupTribe: "Tribo", - tribeGroupOffice: "Escritório", - tribeGroupNetwork: "Rede", - tribeGroupEconomy: "Economia", - tribeGroupMedia: "Média", tribeStatusOpen: "ABERTO", tribeStatusClosed: "FECHADO", tribeStatusInProgress: "EM PROGRESSO", @@ -2202,33 +1919,17 @@ module.exports = { tribePriorityCritical: "CRÍTICA", tribeTaskFilterAll: "TODOS", tribeMediaFilterAll: "TODOS", - tribeReportCatBug: "BUG", - tribeReportCatAbuse: "ABUSO", - tribeReportCatContent: "CONTEÚDO", - tribeReportCatOther: "OUTRO", tribeForumCatGeneral: "GERAL", tribeForumCatProposal: "PROPOSTA", tribeForumCatQuestion: "PERGUNTA", tribeForumCatAnnouncement: "ANÚNCIO", - tribeMarketCatGoods: "BENS", - tribeMarketCatServices: "SERVIÇOS", - tribeMarketCatFood: "ALIMENTAÇÃO", - tribeMarketCatOther: "OUTRO", tribeStatusLabel: "Estado", tribeSubTribes: "SUB-TRIBOS", tribeSubTribesCreate: "Criar Sub-Tribo", tribeSubTribesStrictDenied: "O modo estrito da tribo não permite criar novas sub-tribos. Por favor, entre em contato com o administrador.", - tribeSubTribesEmpty: "Ainda sem sub-tribos criadas.", - tribeActivityJoined: "ADERIU", - tribeActivityLeft: "SAIU", - tribeActivityFeed: "FEED", tribeActivityRefeed: "REPUBLICAÇÃO", - tribeGroupAnalytics: "Análises", - tribeGroupCreative: "Criativo", tribeSectionActivity: "ATIVIDADE", tribeSectionTrending: "TENDÊNCIAS", - tribeSectionOpinions: "OPINIÕES", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "TAGS", tribeSectionSearch: "PESQUISA", tribeActivityEmpty: "Ainda sem atividade.", @@ -2240,25 +1941,15 @@ module.exports = { tribeTrendingPeriodWeek: "Esta semana", tribeTrendingPeriodAll: "Todo o tempo", tribeTrendingEngagement: "envolvimento", - tribeOpinionsEmpty: "Ainda sem opiniões.", - tribeOpinionsCast: "Votar", - tribeOpinionsRankings: "Classificações", - tribeOpinionsAlreadyVoted: "Já votado", tribeTopCategory: "Mais votado", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Tela colaborativa de pixel art.", - tribePixeliaPaint: "Pintar", - tribePixeliaContributors: "contribuidores", - tribePixeliaTotalPixels: "pixeis pintados", tribeTagsEmpty: "Nenhum tag encontrado.", - tribeTagsCloud: "Nuvem de tags", - tribeTagsContentWith: "Conteúdo com tag", tribeSearchPlaceholder: "Pesquisar conteúdo da tribo...", tribeSearchEmpty: "Nenhum resultado encontrado.", tribeSearchResults: "Resultados", tribeSearchMinChars: "Introduz pelo menos 2 caracteres para pesquisar.", agendaTitle: "Agenda", agendaDescription: "Aqui podes encontrar todos os teus itens atribuídos.", + agendaSearchPlaceholder: "Pesquisar na agenda...", agendaFilterAll: "TODOS", agendaFilterToday: "HOJE", agendaFilterUpcoming: "PRÓXIMOS", @@ -2277,20 +1968,9 @@ module.exports = { agendaFilterProjects: "PROJETOS", agendaFilterCalendars: "CALENDÁRIOS", agendaNoItems: "Sem atribuições encontradas.", - agendaAuthor: "Por", agendaDiscardButton: "Descartar", agendaRestoreButton: "Restaurar", - agendaCreatedAt: "Criado em", - agendaTitleLabel: "Título", agendaMembersCount: "Membros", - agendaDescriptionLabel: "Descrição", - agendaStatus: "Estado", - agendaVisibility: "Visibilidade", - agendaEventDate: "Data do evento", - agendaEventLocation: "Localização", - agendaEventPrice: "Preço", - agendaEventUrl: "URL", - agendaTaskStart: "Hora de início", agendaLocationLabel: "Localização", agendaYes: "SIM", agendaNo: "NÃO", @@ -2300,11 +1980,6 @@ module.exports = { agendareportCategory: "Categoria", agendareportSeverity: "Gravidade", agendareportStatus: "Estado", - agendareportDescription: "Descrição", - agendaTaskEnd: "Hora de fim", - agendaTaskPriority: "Prioridade", - agendaTransferFrom: "De", - agendaTransferTo: "Para", agendaTransferConcept: "Concept", agendaTransferAmount: "Montante", agendaTransferDeadline: "Deadline", @@ -2314,47 +1989,7 @@ module.exports = { voteNow: "Votar agora", alreadyVoted: "You have already opined.", noOpinionsFound: "Sem opiniões encontradas.", - RECENTButton: "RECENT", TOPButton: "TOP", - interestingButton: "INTERESSANTE", - necessaryButton: "NECESSÁRIO", - funnyButton: "ENGRAÇADO", - disgustingButton: "REPUGNANTE", - sensibleButton: "SENSÍVEL", - propagandaButton: "PROPAGANDA", - adultOnlyButton: "PARA ADULTOS", - boringButton: "ABORRECIDO", - confusingButton: "CONFUSO", - usefulButton: "ÚTIL", - informativeButton: "INFORMATIVO", - wellResearchedButton: "BEM PESQUISADO", - accurateButton: "PRECISO", - needsSourcesButton: "PRECISA FONTES", - wrongButton: "ERRADO", - lowQualityButton: "BAIXA QUALIDADE", - creativeButton: "CRIATIVO", - insightfulButton: "PERSPICAZ", - actionableButton: "ACIONÁVEL", - inspiringButton: "INSPIRING", - loveButton: "AMOR", - clearButton: "CLARO", - upliftingButton: "EDIFICANTE", - unnecessaryButton: "DESNECESSÁRIO", - rejectedButton: "REJEITADO", - misleadingButton: "ENGANOSO", - offTopicButton: "FORA DO TÓPICO", - duplicateButton: "DUPLICADO", - clickbaitButton: "CLICKBAIT", - spamButton: "SPAM", - trollButton: "TROLL", - nsfwButton: "NSFW", - violentButton: "VIOLENTO", - toxicButton: "TÓXICO", - harassmentButton: "ASSÉDIO", - hateButton: "ÓDIO", - scamButton: "FRAUDE", - triggeringButton: "PERTURBANTE", - opinionsCreatedAt: "Criado em", opinionsTotalCount: "Total de opiniões", voteInteresting: "Interessante", voteNecessary: "Necessário", @@ -2391,7 +2026,6 @@ module.exports = { voteCreative: "Criativo", voteSpam: "Spam", voteAdultOnly: "Para adultos", - publishBlog: "Publicar blog", privateMessage: "MP", pmSendTitle: "Mensagens privadas", pmSend: "Enviar!", @@ -2402,7 +2036,6 @@ module.exports = { pmComposeTitle: "Enviar uma mensagem", pmRecipients: "Destinatários", pmRecipientsHint: "Introduz Oasis IDs separados por vírgulas", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "Até 7 destinatários por mensagem.", pmTextPlaceholder: "Corpo limitado a 7000 caracteres.", pmSubject: "Assunto", @@ -2426,7 +2059,6 @@ module.exports = { pmCrypterCharsLabel: "caracteres", pmInvalidRecipients: "Oasis ID inválido (deveria ser como @…=.ed25519).", pmEncryptionLabel: "Cifragem", - pmFile: "Anexo", private: "Privado", privateDescription: "Your encrypted messages.", privateInbox: "CAIXA DE ENTRADA", @@ -2436,10 +2068,8 @@ module.exports = { noPrivateMessages: "No private messages.", pmFromLabel: "De:", pmToLabel: "Para:", - pmInvalidMessage: "Mensagem inválida", pmNoSubject: "(sem assunto)", pmSubjectLabel: "Assunto:", - pmBodyLabel: "Corpo", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2457,8 +2087,6 @@ module.exports = { inboxJobSubscribedTitle: "Nova subscrição à tua oferta de emprego", pmInhabitantWithId: "Habitante com Oasis ID:", pmHasSubscribedToYourJobOffer: "subscreveu a tua oferta de emprego", - inboxProjectCreatedTitle: "Novo projeto criado", - pmHasCreatedAProject: "criou um projeto", inboxMarketItemSoldTitle: "Item vendido", inboxShopSoldTitle: "Produto vendido", pmYourItem: "O teu item", @@ -2468,7 +2096,6 @@ module.exports = { pmHasPledged: "comprometeu", pmToYourProject: "ao teu projeto", blockchain: 'BlockExplorer', - blockchainTitle: 'BlockExplorer', blockchainDescription: 'Explore and visualize the blocks in the blockchain.', blockchainNoBlocks: 'No blocks found in the blockchain.', blockchainStatsTitle: 'Estatísticas', @@ -2480,19 +2107,17 @@ module.exports = { blockchainBlockCarbon: 'Pegada de carbono', blockchainBlockType: 'Type', blockchainBlockTimestamp: 'Timestamp', - blockchainBlockContent: 'Block', - blockchainBlockURL: 'URL:', - blockchainContent: 'Block', - blockchainContentPreview: 'Preview of the block content', blockchainLatestDatagram: 'Último Datagrama', - blockchainDatagram: 'Datagrama', - blockchainDetails: 'View block details', - blockchainViewBlockexplorer: "Ver no blockexplorer", - blockchainBlockInfo: 'Block Information', - blockchainBlockDetails: 'Details of the selected block', + blockchainDatagram: "Datagrama", + blockchainDetails: "Ver Detalhes do Bloco", + blockchainViewBlockexplorer: "Ver no Blockexplorer", blockchainBack: 'Back to Blockexplorer', blockchainContentDeleted: "Este conteúdo foi eliminado (tombstone)", - visitContent: "Visitar conteúdo", + visitContent: "Visitar Conteúdo", + favoriteAdd: "Fixar nos Favoritos", + pmContentTooltip: "Enviar Mensagem Privada", + favoriteRemove: "Remover dos Favoritos", + reportContent: "Denunciar Conteúdo", banking: 'Banking', bankingTitle: 'Banking', bankingDescription: "A economia ECOin: saldo, RBU, taxas e valor da indústria.", @@ -2501,21 +2126,17 @@ module.exports = { bankRules: 'Rules', pending: 'Pending', closed: 'Closed', - bankBack: 'Back to Banking', bankViewTx: 'View Tx', bankClaimNow: 'Claim now', bankClaimUBI: 'Reivindicar RBU!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: 'Nenhuma alocação RBU pendente para esta época.', bankEpoch: 'Epoch', bankPool: 'Pool (this epoch)', bankWeightsSum: 'Sum of weights', - bankAllocations: 'Allocations', bankNoAllocations: 'No allocations found.', bankNoEpochs: 'No epochs found.', bankEpochAllocations: 'Epoch allocations', @@ -2534,9 +2155,6 @@ module.exports = { bankYourFundsMonth: "Os teus fundos (este mês)", bankIndustryBalance: "Produção industrial (estimada)", bankUserBalance: 'Your Balance', - ecoWalletNotConfigured: 'ECOin Wallet not configured', - editWallet: 'Edit wallet', - addWallet: 'Add wallet', bankAddresses: 'Addresses', bankNoAddresses: 'No addresses found.', bankUser: 'Oasis ID', @@ -2561,15 +2179,7 @@ module.exports = { search: 'Search!', bankLocal: 'Local', bankFromOasis: 'Oasis', - bankMyAddress: 'Your address', - bankRemoveMyAddress: 'Remove my address', - bankNotRemovableOasis: 'Addresses cannot be removed locally', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "SEM FUNDOS!", bankUbiAvailableOk: "DISPONÍVEL!", bankUbiAvailability: "RBU (rede)", @@ -2586,13 +2196,6 @@ module.exports = { shopsTitle: "Lojas", shopDescription: "Descubra e gerencie lojas na rede.", shopTitle: "Loja", - shopFilterAll: "TODAS", - shopFilterMine: "MINHAS", - shopFilterRecent: "RECENTES", - shopFilterTop: "TOP", - shopFilterProducts: "PRODUTOS", - shopFilterPrices: "PREÇOS", - shopFilterFavorites: "FAVORITAS", shopUpload: "Criar Loja", shopAllSectionTitle: "Todas as Lojas", shopMineSectionTitle: "Minhas Lojas", @@ -2609,16 +2212,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Publicar na Clearnet", - shopClearnetUnpublish: "Remover da Clearnet", - shopClearnetUrlLabel: "URL Clearnet", - shopClearnetWarning: "Publicar na Clearnet torna esta loja indexável por motores de busca e rastreadores externos.", shopAddFavorite: "Adicionar Favorito", shopRemoveFavorite: "Remover Favorito", shopOpen: "ABERTA", shopClosed: "FECHADA", - shopOpenShop: "Abrir Loja", - shopCloseShop: "Fechar Loja", shopMakePrivate: "TORNAR PRIVADA (E2E)", shopMakePublic: "TORNAR PÚBLICA", shopProducts: "Produtos", @@ -2646,8 +2243,6 @@ module.exports = { shopOrderPrice: "Preço", shopOrderBuyer: "Comprador", shopBackToShop: "Voltar à Loja", - shopShareUrl: "URL de partilha", - shopVisitShop: "VISITAR LOJA", marketVisitItem: "VER ARTIGO", shopStatus: "ESTADO", shopCreatedAt: "CRIADO", @@ -2656,12 +2251,10 @@ module.exports = { shopLocation: "Localização", shopTags: "Tags", shopVisibility: "Visibilidade", - shopImage: "Imagem", shopShortDescription: "Descricao Curta", shopShortDescriptionPlaceholder: "Descricao breve para os cartoes (max 160 caracteres)", shopTitlePlaceholder: "Nome da sua loja", shopDescriptionPlaceholder: "Descricao detalhada da sua loja", - shopUrlPlaceholder: "https://url-da-sua-loja.com", shopLocationPlaceholder: "Cidade, Pais", shopTagsPlaceholder: "tag1, tag2, tag3", mapTitlePlaceholder: "Titulo do mapa", @@ -2679,7 +2272,6 @@ module.exports = { bankUnitMinutes: "minutos", bankUnitDays: "dias", bankExchangeNoData: 'No data available', - bankExchangeIndex: 'ECOin Value (1h)', bankInflation: 'ECOin Inflation (anual)', bankInflationMonthly: 'ECOin Inflation (mensual)', bankExchangeChartTitle: 'Progressão do valor de ECOin ao longo do tempo', @@ -2693,38 +2285,17 @@ module.exports = { bankingSyncStatusOutdated: 'Outdated', statsTitle: 'Statistics', statistics: "Estatísticas", - statsInhabitant: "Estatísticas do habitante", statsDescription: "Descobre estatísticas sobre a tua rede.", ALLButton: "ALL", MINEButton: "MINE", TOMBSTONEButton: "TOMBSTONES", - statsYou: "Tu", - statsUserId: "Oasis ID", statsCreatedAt: "Criado em", statsYourContent: "Conteúdo", statsYourOpinions: "Opiniões", - statsYourTombstone: "Tombstones", - statsNetwork: "Rede", - statsTotalInhabitants: "Habitantes", - statsDiscoveredTribes: "Tribos (públicas)", - statsPrivateDiscoveredTribes: "Tribos (privadas)", statsNetworkContent: "Conteúdo", - statsYourMarket: "Mercado", - statsYourJob: "Empregos", - statsYourProject: "Projetos", - statsYourTransfer: "Transferências", - statsYourForum: "Fóruns", statsNetworkOpinions: "Opiniões", - statsDiscoveredMarket: "Mercado", - statsDiscoveredJob: "Empregos", - statsDiscoveredProject: "Projetos", - statsBankingTitle: "Banca", statsEcoWalletLabel: "Carteira ECOIN", statsEcoWalletNotConfigured: "Não configurada!", - statsTotalEcoAddresses: "Total de endereços", - statsDiscoveredTransfer: "Transferências", - statsDiscoveredForum: "Fóruns", - statsNetworkTombstone: "Tombstones", statsBookmark: "Marcadores", statsEvent: "Eventos", statsTask: "Tarefas", @@ -2746,16 +2317,12 @@ module.exports = { statsAiExchange: "IA", statsPUBs: 'PUBs', statsPost: "Publicações", - statsOasisID: "Oasis ID", statsSize: "Total (tamanho)", statsBlockchainSize: "Blockchain (tamanho)", statsBlobsSize: "Blobs (tamanho)", statsActivity7d: "Atividade (últimos 7 dias)", statsActivity7dTotal: "Total 7 dias", statsActivity30dTotal: "Total 30 dias", - statsKarmaScore: "Pontuação KARMA", - statsPublic: "Público", - statsPrivate: "Privado", day: "Day", messages: "Mensagens", statsProject: "Projetos", @@ -2767,30 +2334,14 @@ module.exports = { statsProjectsCancelled: "Cancelado", statsProjectsGoalTotal: "Objetivo total", statsProjectsPledgedTotal: "Total comprometido", - statsProjectsSuccessRate: "Taxa de sucesso", - statsProjectsAvgProgress: "Progresso médio", - statsProjectsMedianProgress: "Progresso mediano", - statsProjectsActiveFundingAvg: "Financiamento ativo médio", - statsJobsTitle: "Empregos", - statsJobsTotal: "Total de empregos", - statsJobsOpen: "Abrir", - statsJobsClosed: "Fechado", - statsJobsOpenVacants: "Vagas abertas", - statsJobsSubscribersTotal: "Total de subscritores", - statsJobsAvgSalary: "Salário médio", - statsJobsMedianSalary: "Salário mediano", statsMarketTitle: "Mercado", statsMarketTotal: "Total de itens", statsMarketForSale: "À venda", statsMarketReserved: "Reservado", statsMarketClosed: "Fechado", statsMarketSold: "Vendido", - statsMarketRevenue: "Receita", - statsMarketAvgSoldPrice: "Preço médio de venda", statsUsersTitle: "Habitantes", user: "Habitante", - statsTombstoneTitle: "Tombstones", - statsNetworkTombstones: "Tombstones da rede", statsTombstoneRatio: "Rácio de tombstones (%)", statsParliamentCandidature: "Candidaturas parlamentares", statsParliamentTerm: "Mandatos parlamentares", @@ -2817,30 +2368,21 @@ module.exports = { aiConfiguration: "Definir prompt", aiPromptUsed: "Prompt", aiClearHistory: "Limpar histórico de conversa", - aiSharePrompt: "Adicionar esta resposta ao treino coletivo?", - aiShareYes: "Sim", - aiShareNo: "Não", - aiSharedLabel: "Adicionado ao treino", - aiRejectedLabel: "Não adicionado ao treino", aiServerError: "A IA não conseguiu responder. Por favor, tenta novamente.", aiInputPlaceholder: "What is Oasis?", typeAiExchange: "IA", aiApproveTrain: "Adicionar ao treino coletivo", aiRejectTrain: "Não treinar", - aiTrainPending: "Aprovação pendente", aiTrainApproved: "Aprovado para treino", aiTrainRejected: "Rejeitado para treino", aiSnippetsUsed: "Excertos usados", aiSnippetsLearned: "Snippets learned", statsAITraining: "AI training", - aiApproveCustomTrain: "Treinar com esta resposta personalizada", aiCustomAnswerPlaceholder: "Escreve a tua resposta personalizada…", - statsAIExchanges: "Model Exchanges", marketMineSectionTitle: "Os teus itens", marketCreateSectionTitle: "Criar item", marketUpdateSectionTitle: "Atualizar", marketAllSectionTitle: "Mercado", - marketRecentSectionTitle: "Mercado recente", marketTitle: "Mercado", marketDescription: "Um mercado para trocar bens ou serviços na tua rede.", marketFilterAll: "TODOS", @@ -2870,14 +2412,11 @@ module.exports = { marketItemDeadline: "Prazo", marketItemIncludesShipping: "Inclui envio?", marketItemHighestBid: "Maior licitação", - marketItemHighestBidder: "Maior licitante", marketItemStock: "Disponibilidade", marketOutOfStock: "Esgotado", - marketItemBidTime: "Hora da licitação", marketActionsUpdate: "Atualizar", marketUpdateButton: "Atualizar", marketActionsDelete: "Eliminar", - marketActionsSold: "Marcar como vendido", marketActionsChangeStatus: "ALTERAR ESTADO", marketActionsBuy: "COMPRAR!", marketAuctionBids: "Licitações atuais", @@ -2886,21 +2425,17 @@ module.exports = { marketNoItems: "Ainda sem itens disponíveis.", marketYourBid: "A tua licitação", marketCreateFormImageLabel: "Carregar mídia (máx: 50MB)", - marketSearchLabel: "Pesquisa", marketSearchPlaceholder: "Pesquisar título ou tags", marketMinPriceLabel: "Preço mínimo", marketMaxPriceLabel: "Preço máximo", - marketSortLabel: "Ordenar por", marketSortRecent: "Mais recentes", marketSortPrice: "Preço", marketSortDeadline: "Prazo", marketSearchButton: "Pesquisa", marketAuctionEndsIn: "Termina", marketAuctionEnded: "Terminado", - marketMyBidBadge: "Licitaste", marketNoItemsMatch: "Nenhum item corresponde à tua pesquisa.", housingTitle: "Habitação", - housingLabel: "Habitação", housingDescriptionText: "Descobre e gere lugares na tua rede.", modulesHousingLabel: "Habitação", modulesHousingDescription: "Módulo para descobrir e gerir lugares.", @@ -2944,14 +2479,7 @@ module.exports = { housingAvailableFrom: "Disponível desde", housingAvailableTo: "Disponível até", housingTags: "Etiquetas", - housingImages: "Fotos (tamanho máx.: 50MB cada)", - housingRemovePhoto: "Remover", spreadEditWarning: "Este conteúdo perderá os spreads ao editá-lo", - housingRemoveVideo: "Remover vídeo", - housingAddPhoto: "Adicionar foto", - housingAddVideo: "Adicionar vídeo", - housingVideo: "Vídeo (tamanho máx.: 50MB)", - housingPhotos: "Fotos", housingRequests: "Pedidos", housingRequestButton: "Pedir", housingCancelButton: "Cancelar pedido", @@ -3020,7 +2548,6 @@ module.exports = { jobLocationPresencial: "Presencial", jobLocationRemote: "Remoto", jobVacantsPlaceholder: "Número de posições", - jobSalaryPlaceholder: "Salário em ECO por 1 hora dedicada", jobImage: "Carregar mídia (máx: 50MB)", jobTasks: "Tarefas", jobType: "Tipo de emprego", @@ -3030,7 +2557,6 @@ module.exports = { jobsFilterTop: "TOP", jobsTopTitle: "Empregos com melhor salário", createJobButton: "Publicar emprego", - viewDetailsButton: "Ver detalhes", noJobsFound: "Sem ofertas de emprego encontradas.", jobAuthor: "Por", jobTypeFreelance: "Freelancer", @@ -3042,10 +2568,6 @@ module.exports = { jobsHoursOffered: "Horas oferecidas", jobsHoursRequested: "Horas pedidas em troca", jobsExchangeSkill: "Habilidade pedida em troca", - jobsHoursOfferedPlaceholder: "p. ex. 4", - jobsHoursRequestedPlaceholder: "p. ex. 4", - jobsExchangeSkillPlaceholder: "p. ex. carpintaria, design", - jobExchangeHint: "Para empregos de troca de horas, preencha os campos abaixo em vez do salário.", jobTimePartial: "Part-time", jobTimeComplete: "Full-time", jobsDeleteButton: "ELIMINAR", @@ -3053,28 +2575,17 @@ module.exports = { jobsFilterApplied: "CANDIDATADO", jobsAppliedTitle: "As minhas candidaturas", jobsAppliedBadge: "Candidatado", - jobsFilterFavs: "Favoritos", - jobsFavsTitle: "Favoritos", - jobsFilterNeeds: "Precisa ajuda", - jobsNeedsTitle: "Precisa ajuda", - jobsSearchLabel: "Pesquisa", jobsSearchPlaceholder: "Pesquisar título, tags, descrição...", jobsMinSalaryLabel: "Salário mínimo", jobsMaxSalaryLabel: "Salário máximo", - jobsSortLabel: "Ordenar por", jobsSortRecent: "Mais recentes", jobsSortSalary: "Maior salário", jobsSortSubscribers: "Mais candidatos", jobsSearchButton: "Pesquisa", - jobsFavoriteButton: "Favorito", - jobsUnfavoriteButton: "Remover favorito", - jobsMessageAuthorButton: "MP", jobsApplicants: "Candidatos", jobsUpdatedAt: "Atualizado", jobSetOpen: "Set open", - jobNewBadge: "NOVO", jobsTagsLabel: "Tags", - jobsTagsPlaceholder: "tag1, tag2, tag3", noJobsMatch: "Nenhum emprego corresponde à tua pesquisa.", industrySearchPlaceholder: "Procurar fábricas…", industryAllSectors: "Todos os setores", @@ -3082,9 +2593,7 @@ module.exports = { industryAdvanceTo: "Definir para", industryAmount: "Quantia", industryApproveBuild: "Aprovar", - industryBackToFacility: "← Fábrica", industryBlueprint: "Blueprint", - industryBlueprintLabel: "Blueprint de Indústria", industryBlueprints: "Blueprints", industryBuild: "Build", industryBuildNotes: "Notas", @@ -3097,18 +2606,13 @@ module.exports = { industryBuilds: "Builds", industryBuildTitle: "Título", industryContribute: "Contribuir", - industryContributeEco: "Contribuir ECO", - industryContributeLabor: "Contribuir trabalho", industryContributeButton: "Contribuir", - industryContributeMaterial: "Contribuir material", industryContributions: "Contribuições", - industryContributors: "colaboradores", industryCreateBlueprintButton: "Criar blueprint", industryDistribute: "Distribuir", industryDistributeButton: "Distribuir por quotas", industryDistribution: "Distribuição", industryEcoAmount: "Quantia (ECO)", - industryEcoContribHint: "As contribuições em ECO são transferidas para o administrador como custodiante da tesouraria do build.", industryEditBlueprint: "Editar blueprint", industryFacility: "Fábrica", industryKindLabel: "Tipo", @@ -3117,13 +2621,10 @@ module.exports = { industryKind_eco: "Fundos", industryLaborHours: "Mão de obra (horas)", industryHours: "Horas", - industryLicense: "Licença", industryMaterialItem: "Material", industryMaterials: "Materiais", - industryMaterialsHint: "Um material por linha, no formato nome:quantidade:preço.", industryEstMaterials: "Total materiais", industryEstLabor: "Total mão de obra", - industryEstTaxes: "Impostos", industryEstTotal: "Preço estimado", industryBuildingPrice: "Preço de construção", industryFinalPrice: "Preço final", @@ -3133,19 +2634,13 @@ module.exports = { industryNewBlueprint: "Novo blueprint", industryNewBuild: "Propor um build", industryEditBuild: "Editar produção", - industryNoBlueprint: "— nenhum —", industryNeedBlueprint: "Cria primeiro um plano: cada produção fabrica um.", industryNoBlueprints: "Ainda não há blueprints.", industryNoBuilds: "Ainda não há builds.", industryNote: "Nota", industryOutput: "Saída", - industryOutputItem: "Nome do produto", industryOutputKind: "Tipo de produto", - industryOutputQty: "Unidades por produção", - industryOutputUnit: "Unidade de medida", industryOutputValue: "Valor de saída (ECO, ex. da venda)", - industryPayout: "Pagamento", - industryPoints: "Karma", industryPostJob: "Criar Emprego", industryPot: "Bolo", industryProposeBuildButton: "Propor build", @@ -3153,8 +2648,6 @@ module.exports = { industryAuthor: "Autor", industrySellOnMarket: "Enviar ao Mercado", industrySendToProjects: "Criar Projeto", - industryShare: "Quota", - industryShares: "Quotas", industrySkills: "Competências", industryTreasury: "Tesouraria", industryKind_physical: "Físico", @@ -3168,6 +2661,16 @@ module.exports = { industryBuildStatus_FAILED: "FALHADO", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Um emprego corresponde ao teu currículo", + jobsBotMatchIntro: "Um emprego corresponde ao teu currículo.", + jobsBotMatchJob: "Emprego", + jobsBotMatchHint: "Recebes isto porque o teu currículo é gerido por IA. Podes desativar no teu CV.", + cvAiManaged: "Gerido por IA", + switchOn: "LIGADO", + switchOff: "DESLIGADO", + cvAiManagedHint: "Se ativo, o JobsBot avisa-te por mensagem privada quando um emprego corresponde ao teu currículo.", + cvMatchThreshold: "Avisar a partir deste nível de correspondência", housingBotRequestedTitle: "Alguém pediu um dos teus lugares.", housingBotCancelledTitle: "Um pedido sobre um dos teus lugares foi cancelado.", housingBotYouRequestedTitle: "Pediste um lugar.", @@ -3196,22 +2699,14 @@ module.exports = { industryRulesDistribution: "Quando uma produção é concluída, o steward distribui o fundo (os fundos da produção mais o valor de venda) entre os contribuidores, proporcionalmente às suas quotas.", industryRulesTreasury: "As contribuições em ECO são guardadas pelo administrador como tesouraria do build até à distribuição; todos os movimentos ficam registados na rede e as disputas podem ir aos Courts.", industryJobs: "Empregos", - industryNoJobs: "Ainda não há vagas.", - industryCreatePosition: "Criar vaga", - industryViewCV: "CV", industryReportButton: "Denunciar", industryCreateTask: "Criar Tarefa", industryOpenDispute: "Abrir disputa", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "ex. unidade, kg, licença", - industryOutputItemPlaceholder: "ex. robô", - industryOutputQtyPlaceholder: "ex. 5", - industrySkillsPlaceholder: "ex. soldadura, redes, instalação-solar", industryCreateInvite: "Gerar convite", industryPauseVotes: "Votos de estado", industryTitle: "Indústria", industryDescription: "Módulo para gerir os meios de produção de forma coletiva.", - industryLabel: "Indústria", typeIndustryBuild: "BUILD", typeIndustryBlueprint: "BLUEPRINT", typeIndustryAllocation: "DISTRIBUIÇÃO", @@ -3260,9 +2755,7 @@ module.exports = { industryInviteNeeded: "Precisas de um convite para entrar.", industryPauseButton: "Votar pausar", industryResumeButton: "Votar retomar", - industryEditButton: "Editar", industryDeleteButton: "Eliminar", - industryBackToList: "← Indústria", industryPendingApplicants: "Candidaturas pendentes", industryVotesYes: "sim", industryVotesNo: "não", @@ -3270,23 +2763,13 @@ module.exports = { industryAdmit: "Admitir", industryReject: "Rejeitar", industryDissolveTitle: "Dissolver fábrica", - industryDissolveHint: "A dissolução requer um voto coletivo; o administrador não pode dissolver sozinho.", industryDissolveVote: "Votar dissolução", - industrySector_software: "Software", - industrySector_hardware: "Hardware", - industrySector_agriculture: "Agricultura", - industrySector_textile: "Têxtil", - industrySector_energy: "Energia", - industrySector_food: "Alimentação", - industrySector_construction: "Construção", - industrySector_media: "Mídia", - industrySector_services: "Serviços", - industrySector_other: "Outro", industryPolicy_open: "Aberta", industryPolicy_vote: "Por voto", industryPolicy_invite: "Apenas convite", projectsTitle: "Projetos", projectsDescription: "Cria, financia e acompanha projetos comunitários na tua rede.", + projectSearchPlaceholder: "Pesquisar projetos...", projectCreateProject: "Criar projeto", projectCreateButton: "Criar projeto", projectUpdateButton: "ATUALIZAR", @@ -3330,14 +2813,8 @@ module.exports = { projectPledgeTitle: "Apoiar este projeto", projectPledgePlaceholder: "Montante em ECO", projectBounties: "Recompensas", - projectBountiesInputLabel: "Recompensas (uma por linha: Título|Montante [ECO]|Descrição)", - projectBountiesPlaceholder: "Corrigir bug UI|100|Link para o problema\nEscrever docs|250|Exemplos de utilização", projectNoBounties: "Sem recompensas encontradas.", projectTitle: "Título", - projectAddBountyTitle: "Nova recompensa", - projectBountyTitle: "Título da recompensa", - projectBountyAmount: "Montante (ECO)", - projectBountyDescription: "Descrição", projectMilestoneSelect: "Selecionar marco", projectBountyCreateButton: "Criar recompensa", projectBountyStatus: "Estado da recompensa", @@ -3352,19 +2829,15 @@ module.exports = { projectMilestoneTitle: "Título do marco", projectMilestoneTargetPercent: "Percentagem (%)", projectMilestoneDueDate: "Data", - projectMilestoneCreateButton: "Criar marco", projectMilestoneStatus: "Estado do marco", projectMilestoneOpen: "aberto", projectMilestoneDone: "concluído", projectMilestoneDue: "prazo", - projectNoMilestones: "Sem marcos encontrados.", projectMilestoneMarkDone: "Mark as Done", projectMilestoneTitlePlaceholder: "Introduz o título do marco", projectMilestoneDescriptionPlaceholder: "Introduz a descrição para este marco", projectMilestoneDescription: "Descrição do marco", - projectBudgetGoal: "Orçamento (objetivo)", projectBudgetAssigned: "Atribuído a recompensas", - projectBudgetRemaining: "Restante", projectBudgetOver: "Acima do orçamento: atribuído excede o objetivo", projectFollowers: "Seguidores", projectFollowersTitle: "Seguidores", @@ -3377,7 +2850,6 @@ module.exports = { projectBackersTotalPledged: "Total comprometido", projectBackersYourPledge: "O teu compromisso", projectBackersNone: "Ainda sem compromissos.", - projectNoRemainingBudget: "Sem orçamento restante.", projectFilterBackers: "APOIANTES", projectFilterApplied: "CANDIDATADO", projectAppliedTitle: "CANDIDATADO", @@ -3386,30 +2858,15 @@ module.exports = { projectBackerAmount: "Total contribuído", projectBackerPledges: "Compromissos", projectBackerProjects: "Projetos", - projectPledgeAmount: "Montante", projectSelectMilestoneOrBounty: "Selecionar marco ou recompensa", projectPledgeButton: "Comprometer", footerLicense: "GPLv3", - footerPackage: "Pacote", - footerVersion: "Versão", modulesModuleName: "Nome", modulesModuleDescription: "Descrição", modulesModuleStatus: "Estado", modulesTotalModulesLabel: "Módulos carregados", modulesEnabledModulesLabel: "Ativado", modulesDisabledModulesLabel: "Desativado", - modulesPopularLabel: "Destaques", - modulesPopularDescription: "Módulo para receber publicações em tendência, mais vistas ou mais comentadas.", - modulesTopicsLabel: "Tópicos", - modulesTopicsDescription: "Módulo para receber categorias de discussão baseadas em interesses comuns.", - modulesSummariesLabel: "Resumos", - modulesSummariesDescription: "Módulo para receber resumos de discussões ou publicações longas.", - modulesLatestLabel: "Mais recentes", - modulesLatestDescription: "Módulo para receber as publicações e discussões mais recentes.", - modulesThreadsLabel: "Conversas", - modulesThreadsDescription: "Módulo para receber conversas agrupadas por tópico ou questão.", - modulesMultiverseLabel: "Multiverso", - modulesMultiverseDescription: "Módulo para receber conteúdo de outros pares federados.", modulesInvitesLabel: "Convites", modulesInvitesDescription: "Módulo para gerir e aplicar códigos de convite.", modulesWalletLabel: "Carteira", @@ -3450,8 +2907,12 @@ module.exports = { modulesOpinionsDescription: "Módulo para descobrir e votar em opiniões.", modulesTransfersLabel: "Transferências", modulesTransfersDescription: "Módulo para descobrir e gerir contratos inteligentes (transferências).", - modulesFediverseLabel: "Fediverse", - modulesFediverseDescription: "Faça a gestão das suas outras contas do fediverso, incluindo enviar e receber conteúdo.", + modulesFediverseLabel: "Multiverso", + modulesBlogsLabel: "Blogs", + modulesBlogsDescription: "Módulo para descobrir e gerir blogs.", + modulesPollsLabel: "Sondagens", + modulesPollsDescription: "Módulo para perguntar à rede e contar as respostas.", + modulesFediverseDescription: "Faça a gestão das suas outras contas do multiverso, incluindo enviar e receber conteúdo.", modulesFeedLabel: "Feed", modulesFeedDescription: "Módulo para descobrir e partilhar textos curtos (feeds).", modulesParliamentLabel: "Parlamento", @@ -3487,37 +2948,33 @@ module.exports = { visibilityMakeHidden: "Ocultar", invitesInhabitantsTitle: "Habitantes", invitesInhabitantsFollow: "Seguir", - aiNavPlaceholder: "Para onde queres ir?", + aiNavPlaceholder: "Descreve o que precisas...", aiNavDisabled: "A navegação por IA está desativada.", - aiNavResultsTitle: "Sugestões de navegação IA", + aiNavResultsTitle: "Sugestões AINav", aiNavQueryLabel: "Consulta", - aiNavResultsDescription: "Escolhe a rota que melhor corresponde ao que procuras.", - aiNavResultPath: "Rota", - aiNavResultDescription: "O que podes fazer", aiNavResultMatch: "Correspondência", aiNavResultsEmpty: "Sem rotas correspondentes. Tenta /search.", - aiNavSearchInstead: "Pesquisar em vez disso", modulesAINavLabel: "AINav", modulesAINavDescription: "Módulo para consultas em linguagem natural sobre o conteúdo da rede.", - directConnect: "Ligação direta", directConnectDescription: "Conecta-te diretamente a um par inserindo o endereço IP, porta e chave pública.", peerHost: "IP", peerPort: "Porta (predefinida: 8008)", peerPublicKey: "Chave pública (@...ed25519)", connectAndFollow: "Conectar", - deviceSourceLabel: "Dispositivo", modulesPresetTitle: "Configurações Comuns", - modulesPreset_minimal: "Mínimo", - modulesPreset_basic: "Básico", - modulesPreset_social: "Social", - modulesPreset_economy: "Economia", - modulesPreset_full: "Completo", + workflowsTitle: "Workflows", + workflowsDescription: "Um workflow define o tema e quais módulos estão ativos.", + workflowsSet: "Aplicar workflow", + workflow_default: "Predefinido", + workflow_jobs: "Emprego", + workflow_ruling: "Governo", + workflow_politics: "Política", + workflow_social: "Social", + workflow_business: "Negócios", + workflow_night: "Noite", + workflow_mobile: "Móvel", statsCarbonFootprintTitle: "Pegada de carbono", - statsCarbonFootprintNetwork: "Pegada de carbono da rede", - statsCarbonFootprintYours: "A tua pegada de carbono", statsCarbonTombstone: "Pegada do tombstoning", - feedSuccessMsg: "Feed publicado com sucesso!", - dominantOpinionLabel: "Opinião dominante", uploadMedia: "Carregar mídia (máx: 50MB)", courtsRespondentInvalid: "Demandado inválido", @@ -3551,14 +3008,13 @@ module.exports = { mapDescriptionLabel: "Descrição", mapDescriptionPlaceholder: "Descreva o mapa ou localização...", mapTypeLabel: "Tipo de mapa", - mapTypeSingle: "ÚNICO (apenas localização inicial)", - mapTypeOpen: "ABERTO (qualquer um pode adicionar marcadores)", - mapTypeClosed: "FECHADO (apenas o criador adiciona marcadores)", + mapInviteMode: "Convite", + mapTypeSingle: "ÚNICO", + mapTypeOpen: "ABERTO", + mapTypeClosed: "FECHADO", mapTagsLabel: "Tags", mapTagsPlaceholder: "Insira tags separadas por vírgulas", mapUrlLabel: "URL do mapa", - mapPickCoordLabel: "Ou selecione uma localização na grade:", - mapMarkersLabel: "marcadores", mapMarkersTitle: "Marcadores", mapMarkerDefault: "Marcador", mapMarkerLatLabel: "Latitude do marcador", @@ -3585,14 +3041,9 @@ module.exports = { padTitle: "Pad", modulesPadsLabel: "Pads", modulesPadsDescription: "Módulo para gerir editores de texto colaborativos.", - padFilterAll: "TODOS", - padFilterMine: "MEU", - padFilterRecent: "RECENTE", - padFilterOpen: "ABERTO", - padFilterClosed: "FECHADO", padCreate: "Criar Pad", - padUpdate: "Atualizar Pad", - padDelete: "Eliminar Pad", + padUpdate: "Atualizar", + padDelete: "Eliminar", padTitleLabel: "Título", padTitlePlaceholder: "Escreva o título do pad...", padStatusLabel: "Estado", @@ -3603,14 +3054,7 @@ module.exports = { padTagsLabel: "Tags", padTagsPlaceholder: "tag1, tag2, ...", padMembersLabel: "Membros", - padVisitPad: "Visitar Pad", - padShareUrl: "Partilhar URL", padCreated: "Criado", - padAuthor: "Autor", - padGenerateCode: "Gerar Código", - padInviteCodeLabel: "Código de Convite", - padInviteCodePlaceholder: "Introduza o código de convite...", - padValidateInvite: "Validar", padStartEditing: "COMEÇAR A EDITAR!", padEditorPlaceholder: "Comece a escrever...", padSubmitEntry: "Enviar", @@ -3623,12 +3067,11 @@ module.exports = { padClosedSectionTitle: "Pads Fechados", padCreateSectionTitle: "Criar Novo Pad", padUpdateSectionTitle: "Atualizar Pad", - padInviteGenerated: "Código de Convite Gerado", typePad: "PADS", padNew: "NOVO", padAddFavorite: "Adicionar aos Favoritos", padRemoveFavorite: "Remover dos Favoritos", - padClose: "Fechar Pad", + padClose: "Fechar", padBackToEditor: "Voltar ao editor", padSearchPlaceholder: "Pesquisar pads...", @@ -3636,8 +3079,6 @@ module.exports = { modulesChatsDescription: "Módulo para descobrir e gerir chats cifrados.", typeChat: "CHATS", typeChatMessage: "MENSAGEM CHAT", - chatLabel: "CHATS", - chatMessageLabel: "MENSAGENS CHAT", chatsTitle: "Chats", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3645,56 +3086,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Descrição", - chatMessageReply: "Resposta", - chatMessageLabel: "Mensagem", chatCategory: "Categoria", chatStatus: "ESTADO", - chatFilterAll: "TODOS", - chatFilterMine: "MEU", - chatFilterRecent: "RECENTE", - chatFilterFavorites: "FAVORITOS", - chatFilterOpen: "ABERTO", - chatFilterClosed: "FECHADO", chatCreate: "Criar Chat", - chatUpdate: "Atualizar Chat", - chatDelete: "Eliminar Chat", + chatUpdate: "Atualizar", + chatDelete: "Apagar", chatClose: "Fechar Chat", chatVisitChat: "VER CHAT", chatUntitled: "Chat sem título", chatNoItems: "Nenhum chat encontrado.", chatParticipants: "Participantes", - chatStartChatting: "COMEÇAR A CONVERSAR!", - chatGenerateCode: "Gerar Código", - chatShareUrl: "Partilhar URL", + chatMessagesLabel: "Mensagens", + chatThreadsLabel: "Tópicos", chatCreatedAt: "CRIADO", chatSearchPlaceholder: "Pesquisar chats...", chatStatusOpen: "ABERTO", chatStatusInviteOnly: "SÓ POR CONVITE", chatStatusClosed: "FECHADO", chatSendMessage: "Enviar", + chatJumpLatest: "Última Mensagem", + chatPickChat: "Escolhe um chat para o abrir", + chatNoneYet: "Ainda não há nenhum chat disponível.", + activitySearchPlaceholder: "Procurar na atividade...", + trendingSearchPlaceholder: "Procurar nas tendências...", + opinionsSearchPlaceholder: "Procurar nas opiniões...", + votesSearchPlaceholder: "Procurar nas votações...", + welcomeStepUxTitle: "Escolhe a tua interface", + welcomeStepUxText: "Decide como se vê o Oasis. Podes mudar depois nas definições.", + welcomeStepUxAction: "Usar esta vista", + chatRateLimitTitle: "Demasiadas mensagens", + chatRateLimitMessage: "Atingiste o limite de mensagens que esta sala aceita numa hora. Tenta mais tarde.", chatMessagePlaceholder: "Escreva a sua mensagem...", chatNoMessages: "Sem mensagens ainda.", - chatLeave: "Sair do Chat", - chatInviteCodeLabel: "Introduza o código de convite", - chatJoinByInvite: "Aderir", chatTitlePlaceholder: "Título do chat", chatDescriptionPlaceholder: "Descrição do chat", chatTagsPlaceholder: "tag1, tag2, tag3", chatImageLabel: "Seleciona um ficheiro de imagem (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Código de Convite", chatAuthor: "Autor", - chatCreated: "Criado", chatAddFavorite: "Adicionar aos Favoritos", chatRemoveFavorite: "Remover dos Favoritos", chatPM: "MP", chatStatusLabel: "Estado", chatCategoryLabel: "Categoria", - chatParticipantsLabel: "Participantes", gamesTitle: "Jogos", gamesDescription: "Descubra e jogue alguns jogos.", gamesFilterAll: "TODOS", gamesPlayButton: "JOGAR!", - gamesBackToGames: "Voltar aos Jogos", modulesGamesLabel: "Jogos", modulesGamesDescription: "Módulo para descobrir e jogar alguns jogos.", modulesGraphosLabel: "Graphos", @@ -3711,8 +3148,6 @@ module.exports = { gamesArkanoidDesc: "Quebre todos os tijolos com sua raquete e bola. Um clássico desafio arcade.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Ping-pong clássico contra uma IA. O primeiro a 5 pontos ganha.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Corrida contra o tempo! Desvie do tráfego e chegue à meta antes do tempo acabar.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Pilote sua nave por um campo de asteroides mortais. Destrua-os antes que te atinjam.", gamesRockPaperScissorsTitle: "Pedra Papel Tesoura", @@ -3733,8 +3168,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3745,12 +3178,6 @@ module.exports = { modulesCalendarsLabel: "Calendários", modulesCalendarsDescription: "Módulo para descobrir e gerir calendários.", typeCalendar: "CALENDÁRIOS", - calendarFilterAll: "TODOS", - calendarFilterMine: "OS MEUS", - calendarFilterOpen: "ABERTO", - calendarFilterClosed: "FECHADO", - calendarFilterRecent: "RECENTES", - calendarFilterFavorites: "FAVORITOS", calendarCreate: "Criar calendário", calendarUpdate: "Atualizar", calendarDelete: "Eliminar", @@ -3763,24 +3190,17 @@ module.exports = { calendarTagsLabel: "Etiquetas", calendarTagsPlaceholder: "etiqueta1, etiqueta2...", calendarParticipantsLabel: "Participantes", - calendarParticipantsCount: "Participantes", - calendarVisitCalendar: "Visitar calendário", calendarCreated: "Criado", - calendarAuthor: "Autor", calendarJoin: "Participar", calendarGenerateInvite: "Gerar convite", - calendarInviteCodePlaceholder: "Digite o código de convite...", - calendarValidateInvite: "Validar código", - calendarJoined: "Inscrito", - calendarAddDate: "Adicionar data", - calendarAddNote: "Adicionar nota", calendarDateLabel: "Data", calendarDatePlaceholder: "Descrever esta data...", - calendarNoteLabel: "Nota", + calendarNoteLabel: "Notas", calendarNotePlaceholder: "Adicionar uma nota...", calendarFirstDateLabel: "Data", calendarFirstNoteLabel: "Notas", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Sem repetição", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3791,8 +3211,6 @@ module.exports = { calendarsDescription: "Descubra e gerencie calendários na sua rede.", calendarMonthPrev: "← Anterior", calendarMonthNext: "Seguinte →", - calendarMonthLabel: "Datas", - calendarsShareUrl: "URL de partilha", calendarAllSectionTitle: "Calendários", calendarRecentSectionTitle: "Calendários Recentes", calendarFavoritesSectionTitle: "Favoritos", @@ -3806,7 +3224,6 @@ module.exports = { calendarRemoveFavorite: "Remover dos favoritos", calendarSearchPlaceholder: "Pesquisar calendários...", calendarAddEntry: "Adicionar Entrada", - calendarLeave: "Sair do Calendário", statsCalendar: "Calendários", statsCalendarDate: "Datas de calendário", statsCalendarNote: "Notas de calendário", @@ -3853,7 +3270,6 @@ module.exports = { torrentSortOldest: "Mais antigos", torrentSortTop: "Mais votados", torrentNoMatch: "Nenhum torrent correspondente.", - torrentMessageAuthorButton: "Enviar Mensagem ao Autor", torrentUpdatedAt: "Atualizado", statsTorrent: "Torrents", typeTorrent: "TORRENTS", @@ -3861,10 +3277,18 @@ module.exports = { modulesTorrentsDescription: "Módulo para descobrir e gerenciar torrents.", favoritesFilterTorrents: "TORRENTS", favoritesFilterMarket: "MERCADO", + favoritesFilterEvents: "EVENTOS", + favoritesFilterForum: "FÓRUM", + favoritesFilterHousing: "HABITAÇÃO", + favoritesFilterJobs: "EMPREGOS", + favoritesFilterProjects: "PROJETOS", + favoritesFilterReports: "RELATÓRIOS", + favoritesFilterTasks: "TAREFAS", + favoritesFilterTransfers: "TRANSFERÊNCIAS", + favoritesFilterVotes: "VOTAÇÕES", favoritesFilterShopProducts: "ITENS DA LOJA", tribeSectionTorrents: "TORRENTS", tribeCreateTorrent: "Enviar Torrent", - tribeMediaTypeTorrent: "Torrent", settingsWishTitle: "Desejo", settingsWishDesc: "Configure o desejo do seu Avatar.", settingsWishWhole: "Multiverse", @@ -3875,16 +3299,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "O envio é uma barreira de UX. O recebimento é um filtro de atenção.", - pmBlockedNonMutual: "Só pode enviar MPs a habitantes em apoio mútuo.", inhabitantsPendingFollowsTitle: "Pedidos de apoio pendentes", inhabitantsPendingAccept: "Aceitar", inhabitantsPendingReject: "Rejeitar", - bxEncrypted: "CRIPTOGRAFADO", - bxEncryptedHexLabel: "Texto cifrado (pré-visualização)", tribeSectionGovernance: "GOVERNANÇA", - tribeSubStatusPublic: "PÚBLICA", - tribeSubStatusPrivate: "PRIVADA", - tribeSubInheritedPrivate: "PRIVADA (herdada da tribo principal)", tribePadInviteRequired: "Sem acesso ao pad. Peça um convite.", tribeChatInviteRequired: "Sem acesso ao chat. Peça um convite.", tribeGovernanceDesc: "Governança interna desta tribo.", @@ -3924,44 +3342,31 @@ module.exports = { tribeGovNoHistorical: "Ainda nenhum registo", logsTitle: "Diário", logsDescription: "Regista a sua experiência na rede.", - logsReadMore: "Ler mais", logsViewTitle: "Diário", logsColumnType: "Tipo", logsView: "Ver", - logsManualPrompt: "Escreva o seu diário", logsUpdateButton: "Atualizar", - logsEditTitle: "Editar entrada", - logsCreateDescription: "Regista a sua experiência...", + logsEditTitle: "Atualizar registo", logsCreateTitle: "Criar entrada", logsWriteButton: "Escrever", logsTextPlaceholder: "Descreva as suas experiências...", - logsTextField: "Texto", - logsLabelPlaceholder: "Rótulo...", - logsLabelField: "Escreva o seu diário (rótulo)", - logsAiDisabledWarn: "Ative o módulo de IA em /modules para usar entradas escritas pela IA.", - logsAiContextValue: "Dia de blockchain", - logsAiContext: "Contexto", - logsAiModStatus: "AImod", - logsModeApply: "Aplicar!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Manual", logsModeAI: "IA", - logsColumnDelete: "Eliminar", - logsColumnEdit: "Editar", logsColumnLog: "Diário", logsColumnDate: "Data", logsDelete: "Eliminar", - logsEdit: "Editar", + logsEdit: "Atualizar", logsFilterAlways: "SEMPRE", logsFilterYear: "ÚLTIMO ANO", logsFilterMonth: "ÚLTIMO MÊS", logsFilterWeek: "ÚLTIMA SEMANA", logsFilterToday: "HOJE", - logsFilterRecent: "RECENTES", - logsFilterAll: "TODOS", + logsComments: "Comentários", + logsAuthorEntries: "Entradas", logsCreate: "Criar entrada", logsExport: "Exportar diário", - logsExportOne: "Exportar", + logsExportOne: "Exportar registo", logsViewDetails: "Ver detalhes", logsGenerateButton: "Gerar texto", logsSearchText: "Procurar nos diários...", @@ -3971,31 +3376,25 @@ module.exports = { modulesLogsLabel: "Diário", modulesLogsDescription: "Módulo para registar (via assistente de IA) as suas experiências.", statsLogsTitle: "Diário", - statsLogsEntries: "Entradas", typeLog: "DIÁRIO", - blockchainCycle: "Ciclo", larpTitle: "L.A.R.P.", larpDescription: "Uma camada de jogo de interpretação ao vivo para experimentação colaborativa.", + larpNoHousesMatch: "Nenhuma casa corresponde à sua pesquisa.", + larpSearchPlaceholder: "Pesquisar casas...", larpAllHouses: "Casas:", larpFilterRuling: "GOVERNA", larpFilterHouses: "CASAS", larpFilterRules: "FAQ", larpRulesTitle: "FAQ do L.A.R.P.", - larpRulesEntryTitle: "Casa inicial", larpRulesEntryText: "Cada habitante começa em ACADEMIA por defeito. A partir de ACADEMIA, escolhe uma casa no painel \"Entrar numa casa\": isto abre o seu teste de entrada. Responde às 10 perguntas e submete. Se passares o limiar (7/10), és automaticamente admitido nessa casa; caso contrário, és rejeitado e permaneces em ACADEMIA. Em qualquer caso o sistema regista o teu OasisID e o ciclo da tentativa e impede nova tentativa até decorrer o período de espera de 30 ciclos.", - larpRulesLeaveText: "Os membros de qualquer casa podem regressar a ACADEMIA a qualquer momento a partir da página da sua casa; isso repõe a sua participação, mas não anula o período de espera do teste.", - larpRulesGovernanceTitle: "Mural de governança", larpRulesGovernanceText: "Durante o seu ciclo, a casa governante exibe a insígnia \"Governa\" e é a única cujo Mural é exibido publicamente no separador GOVERNA.", - larpRulesSignTitle: "Emblema L.A.R.P.", + larpRulesWallText: "Cada casa tem um Muro onde os seus membros escrevem. O Muro de uma casa é privado, exceto o da casa governante e o da ACADEMIA, que qualquer pessoa pode ler.", larpRulesSignText: "Os habitantes podem ativá-lo (em /profile/edit > Sensores) para mostrar a imagem da sua casa atual como um selo no perfil, no cartão de autor e de habitante. O selo liga à página da casa.", larpPostsTitle: "Mural", larpPostsEmpty: "Ainda sem publicações.", - larpPostLabel: "Nova publicação", larpPostPlaceholder: "O que tem esta casa a dizer?", - larpPostPublic: "Público (visível para qualquer pessoa, senão só para membros)", larpPostSubmit: "Publicar", - larpPostMembersOnly: "Apenas membros", larpCycleLabel: "Ciclo:", audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.", audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.", @@ -4048,12 +3447,9 @@ module.exports = { bankTaxesLookupNote: "Introduz um ID de bloco para o procurar no teu feed local.", bankTaxesUserNoteChipsClick: "Clica em qualquer chip para inspecionar o seu bloco no blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Código de convite", larpRulesInviteEntryText: "Os membros das casas podem gerar códigos de convite que dão acesso direto à casa.", larpRulesOneHouseText: "Só podes pertencer a uma casa de cada vez. Se não pertenceres a nenhuma, estás em ACADEMIA. Cada página de casa (não ACADEMIA) mostra um botão \"Sair da Casa\" aos seus membros que reinicia a pertença a ACADEMIA. Sair NÃO cancela o tempo de espera do teste.", - larpRulesOneHouseTitle: "Uma casa de cada vez", - larpRulesTestEntry: "Teste WILL", - larpRulesTestEntryText: "Cada opção pondera uma ou mais casas; ao submeter, o sistema soma os pontos e admite-te automaticamente na casa com a maior pontuação.", + larpRulesTestEntryText: "No teste WILL cada opção pondera uma ou mais casas; ao enviar, o sistema soma as pontuações e admite-te automaticamente na casa com mais pontos.", larpWillTestHint: "Uma vez concluído, ser-te-á atribuída a casa que melhor corresponde às tuas respostas. As tuas respostas individuais são processadas localmente e nunca armazenadas — apenas a atribuição de casa resultante é publicada no teu feed.", larpWillTestTitle: "Teste WILL", settingsLanDesc: "Anuncia periodicamente este peer a outras instâncias do Oasis na mesma rede local. Desativar para parar as difusões UDP.", @@ -4072,36 +3468,30 @@ module.exports = { aiExchangeMarkHelpful: "+1 útil", larpCyclesUntilRuling: "Próximo ciclo de governança", larpVisitTribe: "Visitar tribo", + larpStartJourney: "Começar a jornada", larpGoverning: "Governa:", + larpStartHere: "Começa aqui:", larpMyHouse: "A minha Casa:", larpMembersCount: "Membros", - larpMembersTitle: "Membros", - larpNoMembers: "Ainda sem membros.", larpRolesLabel: "Funções", larpFunctionLabel: "Função", larpMonthLabel: "Ciclo de governança", larpLeaveToAcademia: "Voltar a ACADEMIA", - larpAcademiaJoinTitle: "Entrar numa casa", - larpAcademiaJoinHint: "Faz o teste psicológico de perfil para que te seja atribuída a casa que melhor encaixa contigo, ou usa um código de convite partilhado por um membro de uma casa.", - larpTakeTestButton: "Fazer o teste de perfil", + larpAcademiaJoinTitle: "Casas L.A.R.P.", larpInviteRedeem: "Entrar na Casa", larpInviteCreate: "Gerar código de convite", larpInvitePlaceholder: "Código de convite", larpInviteBannerTitle: "Novo código de convite", larpInviteBannerHint: "Partilha este código com alguém em ACADEMIA. Expira em 30 ciclos ou após um único uso.", - larpTestAssignedHouse: "Casa atribuída", larpTestRankingTitle: "Pontuação por casa", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Código de convite de casa", invitesHouseJoinButton: "Entrar na Casa", ecoTaxLabel: "ECO Tax", - ecoinTaxLabel: "ECOin Tax", bankTaxes: "Impostos", bankOverviewYourTaxes: "Os teus impostos", - bankTaxesNetworkTitle: "Impostos da rede", bankTaxesEcoTaxTitle: "ECO Tax", bankTaxesArchTaxTitle: "ARCH Tax", - bankTaxesUserTitle: "Os teus impostos", bankTaxesUserAmount: "A tua ECO Tax (preço a devolver)", bankTaxesArchTaxUserAmount: "A tua ARCH Tax (preço a devolver)", bankTaxesArchTaxFirstBlock: "Idade do teu primeiro bloco", @@ -4140,22 +3530,18 @@ module.exports = { bankRulesEcoTaxTitle: "ECO Tax", bankRulesArchTaxTitle: "ARCH Tax", bankRulesChipTitle: "Faixa de cor do chip ECO Tax", - statsEcoTaxTitle: "ECO Tax", statsTombstoneEmpty: "Ainda sem tombstones na rede.", blockchainBlockNotAvailable: "Este bloco não está disponível no teu feed local. Pode pertencer a um peer do qual ainda não replicas.", blockchainBackToBlockexplorer: "Voltar ao blockexplorer", audioFilterBcs: "BCS", audioTranscodeButton: "TRANSCODE", - audioTranscodeTitle: "BCS Transcode", audioTranscodeDetailTitle: "Transcodificar", audioTranscodeStegoOasisId: "Por", audioTranscodeStegoTimestamp: "Gerado em", audioTranscodeStegoMessage: "TEXT", audioTranscodeStegoEmpty: "(nenhum)", audioTranscodeStegoUnknown: "—", - audioBackToAudio: "Voltar ao áudio", audioBackToBcs: "Voltar ao BCS", - audioAuthorLabel: "Autor", melodyCompositionTitle: "Mapa de composição da blockchain", melodyFilterMine: "MEU", melodyByLabel: "Por", @@ -4169,7 +3555,6 @@ module.exports = { melodyUploadBcsNameNote: "O áudio será publicado com o nome auto-gerado", larpLastAttemptTitle: "A tua última tentativa", larpLastAttemptHouse: "Casa", - larpLastAttemptResult: "Resultado", larpLastAttemptWhen: "Quando", larpLastAttemptCooldown: "Próxima tentativa em", larpTestTitle: "Teste de entrada", @@ -4178,30 +3563,14 @@ module.exports = { larpTestCooldownActive: "Próximo teste disponível em", larpTestCooldownDays: "ciclos", larpTestResultTitle: "Resultado do teste", - larpTestPassed: "Teste passado — bem-vindo!", - larpTestFailed: "Teste não passado", larpTestScore: "Pontuação", larpTestNextAttempt: "Podes tentar outro teste em 30 ciclos.", larpGoToHouse: "Ir para a tua casa", larpBackToAcademia: "Voltar a ACADEMIA", - larpBackToHouses: "◀ Casas", larpBadgeYou: "Tu", larpBadgeRuling: "Governa", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Módulo para a camada de jogo de interpretação ao vivo do Oasis (as 9 Casas).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Diante de um problema complexo, o que fazes primeiro?", larpProfileQ1O1: "Falar com outras pessoas para procurar consenso", larpProfileQ1O2: "Construir um protótipo para testar", diff --git a/src/client/assets/translations/oasis_ru.js b/src/client/assets/translations/oasis_ru.js index d0fddbc..cd9fee9 100644 --- a/src/client/assets/translations/oasis_ru.js +++ b/src/client/assets/translations/oasis_ru.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { ru: { - languageName: "Русский", shopOrderStatusPaid: "Оплата получена", shopOrderStatusReceived: "Получено", shopOrderMarkPaid: "Отметить оплату полученной", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "У вас пока нет покупок.", shopOrderPmSeller: "PM Seller", shopOrderSeller: "Продавец", - shopOrderPaymentConcept: "Оплата", shopOrderInvoice: "Счёт", shopOrderInvoiceConcept: "Счёт", shopOrderStatusPending: "Ожидает", shopOrderStatusAccepted: "Принят", shopOrderStatusRejected: "Отклонён", shopOrderStatusShipped: "Отправлен", - shopOrderStatusDelivered: "Доставлен", shopOrderAccept: "Принять", shopOrderReject: "Отклонить", shopOrderMarkShipped: "Отметить отправленным", - shopOrderMarkDelivered: "Отметить доставленным", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "Смарт-контракт", shopOrderContractConcept: "Заказ магазина", shopOrdersPending: "Ожидающие заказы", all: "Все", @@ -55,14 +50,13 @@ module.exports = { viewJson: "Просмотр JSON", matchScore: "Совпадение", preferencesLabel: "Предпочтения", - inhabitantProfileTitle: "Профиль жителя", + inhabitantProfileTitle: "Житель", contentWarningLabel: "Предупреждение о контенте", invalidPost: "Недопустимое содержимое", invalidPostHint: "В этом сообщении пустой/недопустимый текст.", spreadBy: "От", spreadChron: "Распространение", spreaded: "Распространено", - spreadMore: "ещё", spreadContentUnavailable: "Контент пока недоступен (ожидается репликация)", filteredByTag: "Отфильтровано по тегу", filteredByTagTitle: "Отфильтровано по тегу", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "Без серьёзности", calendarDeleteDate: "Удалить дату", calendarIntervalUntil: "До", - bookmarkCategory: "Категория", bookmarkLastVisit: "Последний визит", profileClearnetBookmarksLabel: "Закладки", - forumFilterHot: "Популярные", invitesPort: "Порт", currentlyUnrecheable: "ОШИБКА!", peerHostValidation: "Корректный IPv4 (напр. 192.168.1.100) или имя хоста (напр. pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "Годовая макс. оценка", statsCarbonNetwork: "Всего по сети", statsCarbonOfEstMax: "от оценочной макс. ёмкости", + statsCarbonYearProgress: "года прошло", + statsNetworkTitle: "Сеть", + statsStorageTitle: "Хранилище", + statsEcoTaxTitle: "ECO-налог", + statsAccountTitle: "Аккаунт", + statsAveragesTitle: "Средние значения", statsCarbonOfNetwork: "от общего по сети", statsCarbonUser: "Ваш след", statsContentCountColumn: "Количество", @@ -200,15 +198,13 @@ module.exports = { graphosShowing: "Показано", graphosYou: "Вы", graphosTotalNodes: "Всего узлов", - manualMode: "Ручной режим", mentions: "Упоминания", mentionsDescription: [ - strong("Записи, в которых @упоминают вас"), - ", в обратном хронологическом порядке.", + strong("Каждое сообщение, где вас @упоминают"), + ".", ], - nextPage: "Далее", - previousPage: "Назад", noMentions: "Вы ещё не получали @упоминаний.", + mentionsSearchPlaceholder: "Поиск упоминаний...", private: "Входящие", privateInbox: "ВХОДЯЩИЕ", privateReminders: "НАПОМИНАНИЯ", @@ -216,15 +212,11 @@ module.exports = { inboxToggleToMutuals: "Переключить на взаимных", inboxToggleToWhole: "Переключить на всех", privateSent: "ОТПРАВЛЕННЫЕ", - privateFrom: "От", - privateTo: "Кому", privateDate: "Дата", privateDelete: "Удалить", pmCreateButton: "Написать ЛС", pmReply: "Ответить", pmReplies: "ответы", - pmNew: "новое", - pmMarkRead: "Отметить как прочитанное", inReplyTo: "В ОТВЕТ НА", pmPreview: "Предпросмотр", pmPreviewTitle: "Предпросмотр сообщения", @@ -233,11 +225,8 @@ module.exports = { privateDescription: ["Личные сообщения ",strong("зашифрованы вашим открытым ключом")," и могут иметь максимум 7 получателей."], search: "Поиск", searchDescription: "Описание", - imageSearch: "Поиск изображений", searchFromLabel: "С", searchToLabel: "До", - searchMinOpinionsLabel: "Мин. мнений", - searchInhabitantLabel: "Житель (Oasis ID)", searchQueryLabel: "Запрос", searchPerPageLabel: "Результатов на странице", settings: "Настройки", @@ -250,68 +239,39 @@ module.exports = { melodyDescription: 'Воспроизведите мелодию вашего блокчейна — каждый блок становится нотой.', melodyEmpty: 'Ещё нет нот — ваш блокчейн пока не создал ни одного блока.', melodyCompositionTitle: 'Композиция', - melodyCompositionHelp: 'Каждый блок вашего блокчейна становится музыкальной нотой по типу и размеру.', - melodyStatsTitle: 'Разбивка по типам', - melodyInhabitantLabel: 'Житель', melodyTotalBlocks: 'Ноты', - melodyType: 'Тип', - melodyCount: 'Блоки', melodyFilterMine: 'МОЁ', melodyFilterAll: 'ВСЕ', - melodyFilterShare: 'Загрузить мелодию', - melodyShareTitle: 'Поделитесь своей мелодией', - melodyShareHelp: 'Опубликуйте снимок вашей текущей мелодии, чтобы другие могли её услышать и переработать.', - melodyShareTitleLabel: 'Название (необязательно)', - melodyShareTitlePlaceholder: 'Призрак блокчейна', - melodyShareSubmit: 'Опубликовать мелодию', - melodyNoShared: 'Ещё нет мелодий блокчейна.', melodyRegenerate: 'Перегенерировать', melodyDownload: "Скачать BCS", - profileActivityTitle: 'Активность', - profileActivityMore: 'Вся активность', profileContentSectionTitle: 'Содержимое аватара', profileContentHelp: 'Выбери, какие модули будут отображаться в твоём аватаре.', profileSensorsHelp: 'Дополнительные метрики, отображаемые в аватаре.', profileClearnetHelp: 'Модули, доступные извне Oasis.', profileHubAll: 'Все', - profileHubTitle: 'Публичное содержимое', - footerPulseTitle: 'Пульс', - footerPulsePeers: 'Узлы', - footerPulseInbox: 'Входящие', - footerPulseSync: 'Посл. синх.', - footerPulseEcoValue: 'ECO/ч', - footerPulseLastActivity: 'Последняя активность', footerLicenseLabel: 'Лицензия', profileSwitchToOasis: 'Вернуться в Oasis', - profileSwitchToClearnet: 'Погрузиться в Clearnet', - profileVisibilityFediverse: "Федиверс", - profileSwitchToFediverse: "Погрузиться в федиверс", - coordLabel: 'Координата (напр., A3)', - coordPlaceholder: 'Введите координату', + profileVisibilityFediverse: "Мультивселенная", contributorsTitle: "Участники", - pixeliaBy: "автор", colorLabel: 'Выберите цвет', paintButton: 'Рисовать!', - invalidCoordinate: 'Неверная координата', - goToMuralButton: "Смотреть фреску", totalPixels: 'Всего пикселей', modules: "Модули", modulesViewTitle: "Модули", modulesViewDescription: "Настройте свою среду, включая или отключая модули.", inbox: "Входящие", multiverse: "Мультивселенная", - fediverse: "Федиверс", - fediverseDescription: "Управляйте своими другими аккаунтами федиверса, включая отправку и получение контента.", + fediverse: "Мультивселенная", + fediverseDescription: "Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.", fediverseStatus: "Статус", - fediverseDisconnected: "Федиверс отключён. Проверьте %LINK% или состояние подключения.", - fediverseSettingsTitle: "Федиверс", + fediverseDisconnected: "Мультивселенная отключён. Проверьте %LINK% или состояние подключения.", + fediverseSettingsTitle: "Мультивселенная", fediverseInstanceLabel: "Адрес", fediverseTokenLabel: "Токен доступа", fediverseTokenHelp: "Укажите ваш токен доступа. Он будет использоваться для управления вашим аккаунтом Mastodon из Oasis.", fediverseConnect: "Подключить", fediverseConnectedAs: "Подключено как", fediverseDisconnect: "Отключить", - fediverseEmpty: "Когда вы подключите другие аккаунты федиверса из %LINK%, вы сможете управлять ими отсюда.", fediverseEmptyLink: "настроек", fediverseComposePlaceholder: "О чём вы думаете?", fediverseReplyPlaceholder: "Напишите ответ…", @@ -320,21 +280,15 @@ module.exports = { fediverseReply: "Ответить", fediverseBoosted: "продвинул(а)", fediverseNoPosts: "Ваша лента пуста.", - fediverseThread: "Обсуждение", fediverseTimeline: "Ленты", - fediverseManageTimeline: "Управлять лентой", fediverseFollowers: "Подписчики", fediverseFollowing: "Подписки", fediversePosts: "Посты", fediverseJoined: "Регистрация", - fediverseOverview: "Обзор", fediverseRefresh: "Обновить", fediverseWrite: "Написать", fediversePreview: "Предпросмотр", - fediverseEdit: "Изменить", - fediverseOpenFeed: "Открыть ленту", fediverseManage: "Управление", - fediverseStatusNotConnected: "Не подключено", fediverseError: "Не удалось связаться с Mastodon.", fediverseErrInstance: "Неверный URL сервера.", fediverseErrAuth: "Неверный или просроченный токен.", @@ -345,17 +299,6 @@ module.exports = { fediverseErrPost: "Не удалось опубликовать.", fediverseErrMedia: "Не удалось загрузить файл.", fediverseErrEmpty: "Напишите что-нибудь или прикрепите файл.", - popularLabel: "Избранное", - topicsLabel: "Темы", - latestLabel: "Последние", - summariesLabel: "Сводки", - threadsLabel: "Обсуждения", - multiverseLabel: "Мультивселенная", - inboxLabel: "Входящие", - invitesLabel: "Приглашения", - walletLabel: "Кошелёк", - legacyLabel: "Ключи", - cipherLabel: "Шифратор", bookmarksLabel: "Закладки", videosLabel: "Видео", torrentsLabel: "Торренты", @@ -366,18 +309,14 @@ module.exports = { inhabitantsLabel: "Жители", trendingLabel: "В тренде", eventsLabel: "События", - tasksLabel: "Задачи", apply: "Применить", menuPersonal: "Личное", - menuContent: "Контент", - menuBlogs: "Блоги", menuGovernance: "Управление", menuOffice: "Офис", - menuMultiverse: "Мультивселенная", - menuNetwork: "Сеть", + menuNetwork: "Сообщество", menuCreative: "Творчество", menuEconomy: "Экономика", - menuMedia: "Медиа", + menuMedia: "Библиотека", menuTools: "Инструменты", comment: "Комментарий", subtopic: "Подтема", @@ -387,13 +326,6 @@ module.exports = { follow: "Поддержать", block: "Заблокировать", unblock: "Разблокировать", - newerPosts: "Более новые записи", - olderPosts: "Более старые записи", - feedRangeEmpty: "Данный диапазон пуст для этой ленты. Попробуйте просмотреть ", - seeFullFeed: "полную ленту", - feedEmpty: "Сеть Oasis никогда не видела записей от этого аккаунта.", - beginningOfFeed: "Это начало ленты", - noNewerPosts: "Более новых записей пока не получено.", relationshipNotFollowing: "Вас не поддерживают", relationshipTheyFollow: "Поддерживает вас", relationshipMutuals: "Взаимная поддержка", @@ -403,16 +335,12 @@ module.exports = { relationshipBlockedBy: "Вы заблокированы", relationshipMutualBlock: "Взаимная блокировка", relationshipNone: "Вы не поддерживаете", - relationshipConflict: "Конфликт", relationshipBlockingPost: "Заблокированная запись", viewLikes: "Посмотреть распространения", spreadedDescription: "Список записей, распространённых жителем.", - totalspreads: "Всего распространений", - attachFiles: "Прикрепить файлы", preview: "Предпросмотр", publish: "Написать", contentWarningPlaceholder: "Добавьте тему к записи (необязательно)", - privateWarningPlaceholder: "Добавьте жителей для отправки приватной записи (необязательно)", publishWarningPlaceholder: "Текст ограничен 7000 символами.", publishTooLong: "Ваш пост слишком длинный. Пожалуйста, сократите его.", publishCustomDescription: [ @@ -421,8 +349,6 @@ module.exports = { commentWarning: [ "ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.", ], - commentPublic: "публичный", - commentPrivate: "приватный", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -442,7 +368,6 @@ module.exports = { ".", ], publishCustom: "Написать расширенную запись", - subtopicLabel: "Создать подтему для этой записи", messagePreview: "Предпросмотр записи", mentionsMatching: "Совпадающие упоминания", mentionsName: "Имя", @@ -465,24 +390,19 @@ module.exports = { ssbLogStream: "Блокчейн", ssbLogStreamDescription: "Настройте лимит сообщений для потоков блокчейна.", saveSettings: "Сохранить настройки", - exportTitle: "Экспорт данных", exportDescription: "Установите пароль (минимум 32 символа) для шифрования вашего ключа", exportDataTitle: "Резервная копия", exportDataDescription: "Скачайте ваши данные (без секретного ключа!)", exportDataButton: "Скачать базу данных", - pubWallet: "PUB Кошелёк", - pubWalletDescription: "Установите URL кошелька PUB. Он будет использоваться для транзакций PUB (включая UBI).", - pubWalletConfiguration: "Сохранить конфигурацию", - importTitle: "Импорт данных", importDescription: "Импортируйте ваш зашифрованный секрет (приватный ключ) для активации аватара", - importAttach: "Прикрепить зашифрованный файл (.enc)", - passwordLengthInfo: "Пароль должен содержать минимум 32 символа.", passwordImport: "Введите пароль для расшифровки данных, которые будут сохранены в домашней директории системы (имя файла: secret)", exportPasswordPlaceholder: "Используйте строчные, заглавные буквы, цифры и символы", fileInfo: "Ваш зашифрованный секретный ключ будет скачан на ваше устройство (имя файла: oasis.enc)", developer: "Разработка", devTitle: "Разработка", welcomeBannerText: "Добро пожаловать в OASIS. Выполните эти быстрые шаги, чтобы настроить свой аватар.", + aiSuggestionBanner: "Совет:", + aiSuggestionsEnable: "Советы ИИ", welcomeBannerAction: "Начать!", welcomeTitle: "Добро пожаловать", welcomeStepGreetingAction: "Отправить", @@ -525,14 +445,9 @@ module.exports = { devParentFolder: "Родительская папка", devOpenFolder: "открыть", devDescription: "Изучайте исходный код, работающий на этом узле.", - devTreeTitle: "Файлы", - devSearchTitle: "Поиск по коду", - devMapTitle: "Модули", devRoot: "корень", - devRootButton: "КОРЕНЬ", devSearchPlaceholder: "Текст для поиска в коде", devAnyExtension: "Любой файл", - devSearchButton: "Искать", devStatsFiles: "Файлы", devStatsLines: "Строки", devStatsModules: "Модули", @@ -569,16 +484,13 @@ module.exports = { languageDescription: "Если вы хотите использовать другой язык, выберите его здесь.", setLanguage: "Установить язык", - peerConnections: "Узлы", peerConnectionsIntro: "Управляйте всеми подключениями к другим узлам.", peerConnectionsTitle: "Подключения", online: "В сети", offline: "Не в сети", discovered: 'Обнаружен', unknown: 'Неизвестно', - lanBroadcastLabel: "LAN-вещание", lanBroadcastActive: "Активно (UDP-multicast в LAN)", - lanBroadcastDisabled: "Отключено (режим pub)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -591,8 +503,6 @@ module.exports = { noConnections: "Нет подключённых узлов.", noDiscovered: "Нет обнаруженных узлов.", noUnknownPeers: "Нет неизвестных пиров в графе друзей.", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -602,9 +512,6 @@ module.exports = { peerImport: "Импорт", peerImportTitle: "Импорт списка пиров", peerImportPlaceholder: "Вставьте по одному multiserver-адресу на строку или загрузите .txt файл…", - noSupportedConnections: "Нет поддерживаемых узлов.", - noBlockedConnections: "Нет заблокированных узлов.", - noRecommendedConnections: "Нет рекомендованных узлов.", connectionActionIntro: "", startNetworking: "Запустить сеть", @@ -618,9 +525,19 @@ module.exports = { homePageDescription: "Выберите модуль, который будет вашей главной страницей.", saveHomePage: "Установить главную", invites: "Приглашения", - invitesTitle: "Приглашения", - invitesInvites: "Приглашения", invitesDescription: "Управляйте и применяйте коды приглашений в вашей сети.", + invitesPubsHint: "Вставьте пригласительный код паба, чтобы федерироваться с ним и начать реплицировать его жителей.", + invitesFederationsHint: "Пабы, с которыми вы федерированы: обновите их, удалите недоступные или экспортируйте список.", + invitesHousesHint: "Введите код дома, чтобы вступить в дом LARP и участвовать в его экономике.", + invitesTribesHint: "Введите код племени, чтобы стать участником и получить доступ к его закрытому содержимому.", + invitesChatsHint: "Введите код чата, чтобы присоединиться к беседе и её темам.", + invitesPadsHint: "Введите код пада, чтобы вместе писать в общем документе.", + invitesCalendarsHint: "Введите код календаря, чтобы делиться датами и напоминаниями.", + invitesEventsHint: "Введите код события, чтобы присоединиться к закрытому событию.", + invitesForumsHint: "Введите код форума, чтобы читать и отвечать в закрытом форуме.", + invitesMapsHint: "Введите код карты, чтобы видеть и добавлять места на общей карте.", + invitesShopsHint: "Введите код магазина, чтобы присоединиться к магазину и его каталогу.", + invitesInhabitantsHint: "Введите код жителя, чтобы подписаться друг на друга и обмениваться содержимым.", invitesTribesTitle: "Племена", invitesTribeInviteCodePlaceholder: "Введите код приглашения племени", invitesTribeJoinButton: "Вступить в племя", @@ -651,7 +568,6 @@ module.exports = { invitesAlreadyFederated: "Вы уже федерированы с этим пабом.", invitesFederationsTitle: "Федерации", invitesAcceptedInvites: "Федеративные", - invitesNoInvites: "Приглашения ещё не приняты.", invitesUnfollow: "Отписаться", invitesFollow: "Подписаться", invitesUnfollowedInvites: "Нефедеративные", @@ -671,39 +587,24 @@ module.exports = { panicMode: "Режим паники!", encryptData: "Установите пароль (минимум 32 символа) для шифрования вашего блокчейна", decryptData: "Введите пароль для расшифровки вашего блокчейна", - panicModeDescription: "Зашифровать/Расшифровать или УДАЛИТЬ ваш блокчейн", removeDataDescription: "ВНИМАНИЕ: Этот процесс нельзя отменить.", - encryptPanicButton: "Зашифровать блокчейн", - decryptPanicButton: "Расшифровать блокчейн", removePanicButton: "УДАЛИТЬ ВСЕ ДАННЫЕ!", searchTitle: "Поиск", searchDescriptionLabel: "Поиск контента в вашей сети.", - searchLanguagesLabel: "Языки", - searchSkillsLabel: "Навыки", searchPlaceholder:"Искать контент...", - searchDateLabel:"Дата", searchLocationLabel:"Местоположение", searchPriceLabel:"Цена", - searchUrlLabel:"URL", searchCategoryLabel:"Категория", - searchStartLabel:"Время начала", - searchEndLabel:"Время окончания", searchPriorityLabel:"Приоритет", searchStatusLabel:"Статус", statusLabel:"Статус", - totalVotesLabel:"Всего голосов", noResultsFound:"Результатов не найдено.", votesOption:"Варианты голосования", voteYesLabel:"За", voteNoLabel:"Против", allTypesLabel: "БЕЗ ОГРАНИЧЕНИЙ", - ABSTENTIONLabel:"ВОЗДЕРЖАНИЕ", YESLabel:"ЗА", NOLabel:"ПРОТИВ", - FOLLOW_MAJORITYLabel: "СЛЕДОВАТЬ БОЛЬШИНСТВУ", - CONFUSEDLabel: "ЗАМЕШАТЕЛЬСТВО", - NOT_INTERESTEDLabel: "НЕ ИНТЕРЕСНО", - StatusLabel:"Статус", votesOptionYesLabel:"За", votesOptionNoLabel:"Против", votesOptionAbstentionLabel:"Воздержание", @@ -711,7 +612,6 @@ module.exports = { votesCreatedByLabel:"Создано", voteStatusOpen:"ОТКРЫТО", voteStatusClosed:"ЗАКРЫТО", - imageSearchLabel: "Введите слова для поиска изображений с соответствующими метками.", commentDescription: ({ parentUrl }) => [ " прокомментировал ", a({ href: parentUrl }, " обсуждение"), @@ -722,53 +622,20 @@ module.exports = { a({ href: parentUrl }, " записи"), ], subtopicTitle: ({ authorName }) => [`Подтема записи @${authorName}`], - mysteryDescription: "опубликовал загадочную запись", oasisDescription: "Сеть проекта OASIS", searchSubmit: "Искать...", - postLabel: "ЗАПИСИ", - aboutLabel: "ЖИТЕЛИ", - feedLabel: "ЛЕНТЫ", votesLabel: "ГОЛОСОВАНИЯ", - reportLabel: "ОТЧЁТЫ", - imageLabel: "ИЗОБРАЖЕНИЯ", - videoLabel: "ВИДЕО", - audioLabel: "АУДИО", - documentLabel: "ДОКУМЕНТЫ", - torrentLabel: "ТОРРЕНТЫ", pdfFallbackLabel: "PDF документ", - eventLabel: "СОБЫТИЯ", - taskLabel: "ЗАДАЧИ", - transferLabel: "ПЕРЕВОДЫ", - curriculumLabel: "РЕЗЮМЕ", - bookmarkLabel: "ЗАКЛАДКИ", - tribeLabel: "ПЛЕМЕНА", - marketLabel: "РЫНОК", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "КОШЕЛЬКИ", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "Отправить", - subjectLabel: "Тема", editProfile: "Редактировать аватар", - profileQrAlt: "QR-код профиля", - profileQrHint: "Отсканируйте, чтобы скопировать этот Oasis ID.", oasisIdLabel: "OasisID", - spreadLabel: "Распространить", - spreadHint: "Распространить вашим сторонникам (через ваш feed).", + spreadContent: "Реплицировать", welcomePmSubject: "Hello World!", - welcomePmBody: "Добро пожаловать в Oasis — свободная, одноранговая, федеративная и зашифрованная социальная сеть с распределённой архитектурой только по приглашениям.\n\nНесколько интересных мест, с которых можно начать:\n\n- /profile — Отредактируй аватар, имя, описание и какие модули видны на твоей публичной стороне.\n- /invites — Добавь pub, чтобы федерироваться с остальной сетью.\n- /peers — Посмотри, кто на связи, пересканируй LAN, экспортируй или импортируй списки пиров.\n- /inhabitants — Открывай и заходи к аватарам других людей.\n- /tribes — Создавай или вступай в приватные группы со сквозным шифрованием.\n- /inbox — Читай и отправляй приватные сообщения.\n- /activity — Смотри свежую активность — свою и твоей сети.\n- /publish — Напиши пост или поделись изображением, аудио, видео или документом.\n- /search — Ищите содержимое сети по типу.\n\nНесколько интересных мест для подключения:\n\n- /fediverse — Управляйте своими другими аккаунтами федиверса, включая отправку и получение контента.\n\nЭто сообщение было отправлено приватно от тебя самому себе, поэтому для его получения не требовалось соединение.", - profileVisibilityTitle: "Видимость публичного профиля", - profileVisibilityHint: "Выберите поля, видимые другим жителям. По умолчанию показана только Карма.", + welcomePmBody: "Добро пожаловать в Oasis — свободная, одноранговая, федеративная и зашифрованная социальная сеть с распределённой архитектурой только по приглашениям.\n\nНесколько интересных мест, с которых можно начать:\n\n- /profile — Отредактируй аватар, имя, описание и какие модули видны на твоей публичной стороне.\n- /invites — Добавь pub, чтобы федерироваться с остальной сетью.\n- /peers — Посмотри, кто на связи, пересканируй LAN, экспортируй или импортируй списки пиров.\n- /inhabitants — Открывай и заходи к аватарам других людей.\n- /tribes — Создавай или вступай в приватные группы со сквозным шифрованием.\n- /inbox — Читай и отправляй приватные сообщения.\n- /activity — Смотри свежую активность — свою и твоей сети.\n- /publish — Напиши пост или поделись изображением, аудио, видео или документом.\n- /search — Ищите содержимое сети по типу.\n\nНесколько интересных мест для подключения:\n\n- /мультивселенной — Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.\n\nЭто сообщение было отправлено приватно от тебя самому себе, поэтому для его получения не требовалось соединение.", profileSensorsSectionTitle: "Сенсоры", profileVisibilityActivity: "Уровень активности", - profileVisibilityDevice: "Устройство", profileDeviceLockedHint: "Этот датчик всегда включён: он показывает другим, с какого устройства вы подключаетесь, и не может быть отключён.", profileVisibilityKarma: "Карма", profileVisibilityUbi: "UBI", @@ -776,7 +643,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "Ключ GPG", - profileVisibilityClearnet: "Опубликовать мой профиль", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "Магазины", profileClearnetJobsLabel: "Вакансии", @@ -830,7 +696,6 @@ module.exports = { " или состояние подключения.", ], walletSentToLine: ({ destination, amount }) => `Отправлено ECO ${amount} на ${destination}`, - walletSettingsTitle: "Кошелёк", walletSettingsDescription: "Интегрируйте Oasis с вашим кошельком ECOin.", walletSettingsDocLink: "Руководство по установке ECOin", walletStatusMessages: { @@ -852,37 +717,19 @@ module.exports = { cipherTitle: "Шифратор", cipherDescription: "Симметричное шифрование и расшифровка текста (с использованием общего пароля).", randomPassword: "Случайный пароль", - cipherEncryptTitle: "Зашифровать текст", - cipherEncryptDescription: "Введите текст для шифрования", - cipherTextLabel: "Текст для шифрования", cipherTextPlaceholder: "Введите текст для шифрования...", cipherPasswordLabel: "Установите пароль (минимум 32 символа) для шифрования текста", cipherPasswordDecryptLabel: "Установите пароль (минимум 32 символа) для расшифровки текста", cipherPasswordPlaceholder: "Введите пароль...", cipherEncryptButton: "Зашифровать", - cipherDecryptTitle: "Расшифровать текст", - cipherDecryptDescription: "Введите текст для расшифровки", cipherEncryptedMessageLabel: "Зашифрованный текст", cipherDecryptedMessageLabel: "Расшифрованный текст", - cipherPasswordUsedLabel: "Пароль, использованный для шифрования (сохраните его!)", cipherEncryptedTextPlaceholder: "Введите зашифрованный текст...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "Введите вектор инициализации...", cipherDecryptButton: "Расшифровать", password: "Пароль", text: "Текст", encryptedText: "Зашифрованный текст", iv: "Вектор инициализации (IV)", - encryptTitle: "Зашифровать текст", - encryptDescription: "Введите текст для шифрования и укажите пароль.", - encryptButton: "Зашифровать", - decryptTitle: "Расшифровать текст", - decryptDescription: "Введите зашифрованный текст и укажите тот же пароль, что использовался при шифровании.", - decryptButton: "Расшифровать", - passwordLengthError: "Пароль должен содержать минимум 32 символа.", - missingFieldsError: "Текст, пароль или IV не указаны.", - encryptionError: "Ошибка шифрования текста.", - decryptionError: "Ошибка расшифровки текста.", bookmarkTitle: "Закладки", bookmarkDescription: "Находите и управляйте закладками в вашей сети.", bookmarkAllSectionTitle: "Закладки", @@ -908,8 +755,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "Необязательно", bookmarkTagsLabel: "Теги", bookmarkTagsPlaceholder: "Введите теги через запятую", - bookmarkCategoryLabel: "Категория", - bookmarkCategoryPlaceholder: "Необязательно", bookmarkLastVisitLabel: "Последний визит", bookmarkSearchPlaceholder: "Искать URL, теги, категорию, автора...", bookmarkSortRecent: "Новейшие", @@ -924,8 +769,6 @@ module.exports = { noLastVisit: "Нет записи о посещении", videoTitle: "Видео", videoDescription: "Просматривайте и управляйте видеоконтентом в вашей сети.", - videoPluginTitle: "Название", - videoPluginDescription: "Описание", videoMineSectionTitle: "Ваши видео", videoCreateSectionTitle: "Загрузить видео", videoUpdateSectionTitle: "Обновить видео", @@ -957,7 +800,6 @@ module.exports = { videoSortOldest: "Старейшие", videoSortTop: "Больше голосов", videoSearchButton: "Искать", - videoMessageAuthorButton: "ЛС", videoUpdatedAt: "Обновлено", videoNoMatch: "Видео не найдены.", documentTitle: "Документы", @@ -998,8 +840,6 @@ module.exports = { documentUpdatedAt: "Обновлено", audioTitle: "Аудио", audioDescription: "Просматривайте и управляйте аудиоконтентом в вашей сети.", - audioPluginTitle: "Название", - audioPluginDescription: "Описание", audioMineSectionTitle: "Ваши аудио", audioCreateSectionTitle: "Загрузить аудио", audioUpdateSectionTitle: "Обновить аудио", @@ -1010,7 +850,6 @@ module.exports = { audioFilterMine: "МОИ", audioFilterRecent: "НЕДАВНИЕ", audioFilterTop: "ЛУЧШИЕ", - audioFilterBlockchain: "БЛОКЧЕЙН", audioCreateButton: "Загрузить аудио", audioUpdateButton: "Обновить", audioDeleteButton: "Удалить", @@ -1037,6 +876,7 @@ module.exports = { audioFilterFavorites: "ИЗБРАННОЕ", favoritesTitle: "Избранное", favoritesDescription: "Весь ваш избранный контент в одном месте.", + favoritesSearchPlaceholder: "Поиск в избранном...", favoritesFilterAll: "ВСЕ", favoritesFilterRecent: "НЕДАВНИЕ", favoritesFilterAudios: "АУДИО", @@ -1052,18 +892,13 @@ module.exports = { favoritesNoItems: "Пока нет избранного.", yourContacts: "Ваши контакты", allInhabitants: "Жители", - allCVs: "Все резюме", + allCVs: "Резюме", discoverPeople: "Находите жителей в вашей сети.", - allInhabitantsButton: "ВСЕ", - contactsButton: "ПОДДЕРЖКА", - CVsButton: "Резюме", - matchSkills: "Совпадение навыков", - matchSkillsButton: "СОВПАДЕНИЕ НАВЫКОВ", - suggestedButton: "РЕКОМЕНДОВАННЫЕ", searchInhabitantsPlaceholder: "ФИЛЬТР жителей ПО ИМЕНИ...", filterLocation: "ФИЛЬТР жителей ПО МЕСТОПОЛОЖЕНИЮ...", filterLanguage: "ФИЛЬТР жителей ПО ЯЗЫКУ...", filterSkills: "ФИЛЬТР жителей ПО НАВЫКАМ...", + cvSkillsCount: "Навыки", applyFilters: "Применить фильтры", locationLabel: "Местоположение", languagesLabel: "Языки", @@ -1072,17 +907,18 @@ module.exports = { mutualFollowers: "Общие подписчики", suggestedFollowsYou: "Подписан на тебя", latestInteractions: "Последние взаимодействия", - viewAvatar: "Смотреть аватар", - viewCV: "Смотреть резюме", suggestedSectionTitle: "Рекомендованные", topkarmaSectionTitle: "Лучшая Карма", topecoSectionTitle: "Лучшие Эко", topactivitySectionTitle: "Наибольшая активность", + "TOP INACTIVITYButton": "НЕАКТИВНЫЕ", + topinactivitySectionTitle: "Наименее активные жители", blockedSectionTitle: "Заблокированные", gallerySectionTitle: "ГАЛЕРЕЯ", - blockedButton: "ЗАБЛОКИРОВАННЫЕ", + topSectionTitle: "ТОП", blockedLabel: "Заблокированный пользователь", inhabitantviewDetails: "Подробнее", + cvVisitButton: "Открыть резюме", keepReading: "Продолжить чтение...", oasisId: "ID", noInhabitantsFound: "Жители пока не найдены.", @@ -1092,8 +928,9 @@ module.exports = { parliamentDescription: "Изучайте формы правления и коллективные законы управления.", parliamentFilterGovernment: "ПРАВИТЕЛЬСТВО", parliamentFilterCandidatures: "КАНДИДАТУРЫ", - parliamentFilterProposals: "ЗАКОНОПРОЕКТЫ", + parliamentFilterProposals: "ПРЕДЛОЖЕНИЯ", parliamentFilterLaws: "ЗАКОНЫ", + parliamentFilterRevocations: "ОТЗЫВЫ", parliamentFilterHistorical: "ИСТОРИЯ", parliamentFilterLeaders: "ЛИДЕРЫ", parliamentFilterRules: "ПРАВИЛА", @@ -1119,10 +956,8 @@ module.exports = { parliamentPoliciesDeclined: "ОТКЛОНЁННЫЕ ЗАКОНЫ", parliamentPoliciesDiscarded: "ОТМЕНЁННЫЕ ЗАКОНЫ", parliamentEfficiency: "% ЭФФЕКТИВНОСТЬ", - parliamentFilterRevocations: 'ОТЗЫВЫ', parliamentRevocationFormTitle: 'Отозвать закон', parliamentRevocationLaw: 'Закон', - parliamentRevocationTitle: 'Название', parliamentRevocationReasons: 'Причины', parliamentRevocationPublish: 'Опубликовать отзыв', parliamentCurrentRevocationsTitle: 'Текущие отзывы', @@ -1135,27 +970,15 @@ module.exports = { parliamentNoGovernments: "Правительств пока нет.", parliamentCandidatureFormTitle: "Предложить кандидатуру", parliamentCandidatureIdPh: "Oasis ID (@...) или название племени", - parliamentCandidatureSlogan: "Слоган (макс. 140 символов)", - parliamentCandidatureSloganPh: "Краткий девиз", parliamentCandidatureMethod: "Метод", parliamentCandidatureProposeBtn: "Опубликовать кандидатуру", - parliamentThType: "Тип", parliamentThId: "ID", - parliamentThDate: "Дата предложения", - parliamentThSlogan: "Слоган", parliamentThMethod: "Метод", parliamentThKarma: "Карма", - parliamentThSince: "Профиль с", - parliamentThVotes: "Получено голосов", - parliamentThVoteAction: "Голосовать", - parliamentTypeUser: "Житель", - parliamentTypeTribe: "Племя", parliamentVoteBtn: "Голосовать", parliamentProposalFormTitle: "Предложить закон", parliamentProposalDescription: "Описание (до 1000 символов)", parliamentProposalPublish: "Опубликовать законопроект", - parliamentFinalize: "Завершить", - parliamentDeadline: "Крайний срок", parliamentNoProposals: "Законопроектов пока нет.", parliamentNoLaws: "Принятых законов пока нет.", parliamentMethodDEMOCRACY: "Демократия", @@ -1170,28 +993,21 @@ module.exports = { parliamentVotesSlashTotal: "Голоса/Всего", parliamentVotesNeeded: "Необходимо голосов", parliamentFutureLawsTitle: "Будущие законы", - parliamentNoFutureLaws: "Будущих законов пока нет.", parliamentVoteAction: "Голосовать", - parliamentLeadersTitle: "Лидеры", parliamentThLeader: "АВАТАР", parliamentPopulation: "Население", - parliamentThInPower: "У власти", parliamentThPresented: "КАНДИДАТУРЫ", parliamentNoLeaders: "Лидеров пока нет.", parliamentCandidaturesListTitle: "Список кандидатур", parliamentTimeRemaining: "Оставшееся время", - parliamentNoLeader: "Лидирующей кандидатуры пока нет.", parliamentElectionsStatusTitle: "Следующее правительство", parliamentProposalDeadlineLabel: "Крайний срок", parliamentProposalTimeLeft: "Осталось времени", - parliamentProposalOnTrack: "На пути к принятию", - parliamentProposalOffTrack: "Недостаточно поддержки", parliamentRulesTitle: "Как работает Парламент", parliamentRulesIntro: "Выборы проводятся каждые 2 месяца; кандидатуры подаются непрерывно и сбрасываются при выборе правительства.", parliamentRulesCandidates: "Любой житель может выдвинуть себя, другого жителя или любое племя. Каждый житель может предложить до 3 кандидатур за цикл; дубликаты в одном цикле отклоняются.", parliamentRulesElection: "Побеждает кандидатура, набравшая наибольшее количество голосов на момент подведения итогов.", parliamentRulesTies: "Порядок разрешения ничьих: наивысшая karma жителя; при равенстве — самый старый профиль; при дальнейшем равенстве — самое раннее предложение; затем лексикографически по ID.", - parliamentRulesFallback: "Если никто не голосует, побеждает последняя предложенная кандидатура. Если кандидатур нет, выбирается случайное племя.", parliamentRulesTerm: "На вкладке «Правительство» отображается текущее правительство и статистика.", parliamentRulesMethods: "Формы: Анархия (простое большинство), Демократия (50%+1), Большинство (80%), Меньшинство (20%), Карматократия (законопроекты с наивысшей karma), Диктатура (мгновенное утверждение).", parliamentRulesAnarchy: "Анархия — режим по умолчанию: если ни одна кандидатура не избрана на момент подведения итогов, провозглашается Анархия. При Анархии любой житель может предлагать законы.", @@ -1213,11 +1029,7 @@ module.exports = { courtsCaseFormTitle: "Открыть дело", courtsCaseRespondent: "Обвиняемый / Ответчик", courtsCaseRespondentPh: "Oasis ID (@...) или название племени", - courtsCaseMediatorsAccuser: "Посредники (обвинитель)", courtsCaseMethod: "Метод разрешения", - courtsCaseDescription: "Описание (макс. 1000 символов)", - courtsCaseEvidenceTitle: "Доказательства по делу", - courtsCaseEvidenceHelp: "Прикрепите изображения, аудио, документы (PDF) или видео, подтверждающие вашу позицию.", courtsCaseSubmit: "Подать дело", courtsNominateJudge: "Выдвинуть судью", courtsJudgeId: "Судья", @@ -1262,22 +1074,6 @@ module.exports = { courtsRulesMisconduct: "Преследование, манипуляции или фабрикация доказательств могут привести к немедленному негативному решению.", courtsRulesGlossary: "Дело: запись о конфликте. Доказательство: материалы, подтверждающие утверждения. Вердикт: решение с мерой пресечения. Апелляция: запрос на пересмотр вердикта.", courtsFilterActions: "ДЕЙСТВИЯ", - courtsNoActions: "Нет ожидающих действий для вашей роли.", - courtsCaseTitlePlaceholder: "Краткое описание конфликта", - courtsCaseSeverity: "Серьёзность", - courtsCaseSeverityNone: "Без метки серьёзности", - courtsCaseSeverityLOW: "Низкая", - courtsCaseSeverityMEDIUM: "Средняя", - courtsCaseSeverityHIGH: "Высокая", - courtsCaseSeverityCRITICAL: "Критическая", - courtsCaseSubject: "Тема", - courtsCaseSubjectNone: "Без метки темы", - courtsCaseSubjectBEHAVIOUR: "Поведение", - courtsCaseSubjectCONTENT: "Контент", - courtsCaseSubjectGOVERNANCE: "Управление / правила", - courtsCaseSubjectFINANCIAL: "Финансы / ресурсы", - courtsCaseSubjectOTHER: "Другое", - courtsHiddenRespondent: "Скрыто (видно только участникам дела).", courtsThRole: "Роль", courtsRoleAccuser: "Обвинитель", courtsRoleDefence: "Защита", @@ -1288,55 +1084,19 @@ module.exports = { courtsAssignJudgeBtn: "Выбрать судью", trendingTitle: "В тренде", exploreTrending: "Изучайте самый популярный контент в вашей сети.", - RECENTButton: "НЕДАВНИЕ", - bookmarkButton: "ЗАКЛАДКИ", - transferButton: "ПЕРЕВОДЫ", - eventButton: "СОБЫТИЯ", - taskButton: "ЗАДАЧИ", votesButton: "ГОЛОСОВАНИЯ", - industryButton: "ПРОМЫШЛЕННОСТЬ", - projectButton: "ПРОЕКТЫ", - shopProductButton: "ТОВАРЫ", - reportButton: "ОТЧЁТЫ", - feedButton: "ЛЕНТА", - marketButton: "РЫНОК", - imageButton: "ИЗОБРАЖЕНИЯ", - audioButton: "АУДИО", - videoButton: "ВИДЕО", - documentButton: "ДОКУМЕНТЫ", - torrentButton: "ТОРРЕНТЫ", - noTrendingFound: "Трендовый контент не найден.", - noContentMessage: "Трендового контента пока нет.", - trendingDescription: "Описание", - trendingDate: "Дата", - trendingLocation: "Местоположение", - trendingPrice: "Цена", - trendingUrl: "URL", - trendingCategory: "Категория", - trendingStart: "Начало", - trendingEnd: "Конец", - trendingPriority: "Приоритет", - trendingStatus: "Статус", - trendingFrom: "От", - trendingTo: "Кому", - trendingConcept: "Концепция", - trendingAmount: "Сумма", - trendingDeadline: "Крайний срок", - trendingItemStatus: "Статус элемента", - trendingTotalVotes: "Всего голосов", + shopProductButton: "МАГАЗИН", trendingTotalOpinions: "Всего мнений", trendingNoContentMessage: "Трендов пока нет.", - trendingAuthor: "Автор", - trendingCreatedAtLabel: "Создано", trendingTotalCount: "Всего", tasksTitle: "Задачи", tasksDescription: "Находите и управляйте задачами в вашей сети.", + taskSearchPlaceholder: "Поиск задач...", taskTitleLabel: "Название", taskDescriptionLabel: "Описание", taskStartTimeLabel: "Время начала", taskEndTimeLabel: "Время окончания", taskPriorityLabel: "Приоритет", - taskPrioritySelect: "Выберите приоритет", taskPriorityUrgent: "Срочный", taskPriorityHigh: "Высокий", taskPriorityMedium: "Средний", @@ -1346,13 +1106,13 @@ module.exports = { taskVisibilityLabel: "Видимость", taskPublic: "публичная", taskPrivate: "приватная", - taskCreatedAt: "Создано", - taskBy: "Автор", taskStatus: "Статус", taskStatusOpen: "Открыта", taskStatusInProgress: "В работе", taskStatusClosed: "Закрыта", taskAssignedTo: "Назначено", + taskAssignedChip: "Назначено", + taskUnassignedChip: "Не назначено", taskAssignees: "Исполнители", taskAssignButton: "Назначить себе", taskUnassignButton: "Снять назначение", @@ -1365,7 +1125,6 @@ module.exports = { taskFilterInProgress: "В РАБОТЕ", taskFilterClosed: "ЗАКРЫТЫЕ", taskFilterAssigned: "НАЗНАЧЕННЫЕ", - taskFilterArchived: "АРХИВ", taskFilterUrgent: "СРОЧНЫЕ", taskFilterHigh: "ВЫСОКИЙ", taskFilterMedium: "СРЕДНИЙ", @@ -1378,23 +1137,21 @@ module.exports = { taskInProgressTitle: "Задачи в работе", taskClosedTitle: "Закрытые задачи", taskAssignedTitle: "Назначенные задачи", - taskArchivedTitle: "Архивные задачи", - taskPublicTitle: "Публичные задачи", - taskPrivateTitle: "Приватные задачи", notasks: "Нет доступных задач.", noLocation: "Местоположение не указано", taskSetStatus: "Установить статус", - eventTitle: "Событие", eventDateLabel: "Дата", + eventRecurrenceLabel: "Повторение", + eventRecurrenceUntil: "Повторять до", + eventRecurrenceHint: "Оставьте дату окончания пустой для разового события.", + eventUpcomingDates: "Ближайшие даты", eventsTitle: "События", eventsDescription: "Находите и управляйте событиями в вашей сети.", - eventDescription: "Описание", + eventSearchPlaceholder: "Поиск событий...", eventPrice: "Цена", eventStatus: "Статус", - eventOrganizer: "Организатор", eventAllSectionTitle: "События", eventMineSectionTitle: "Ваши события", - eventArchivedTitle: "Архивные события", eventCreateSectionTitle: "Создать событие", eventUpdateSectionTitle: "Обновить событие", eventDeleteButton: "Удалить", @@ -1402,11 +1159,26 @@ module.exports = { eventAddToCalendar: "Добавить в календарь", eventVisitCalendar: "Открыть календарь", viewTask: "Открыть задачу", + viewEvent: "Открыть событие", + viewPad: "Открыть пад", + viewMap: "Открыть карту", + viewCalendar: "Открыть календарь", viewReport: "Открыть отчёт", viewTransfer: "Открыть перевод", viewItem: "Открыть объект", viewShop: "Открыть магазин", viewProject: "Открыть проект", + viewJob: "Смотреть Вакансию", + viewPlace: "Смотреть Место", + generatePdf: "Создать PDF", + sharePm: "Отправить в ЛС", + galleryImages: "Изображения (макс. 50 МБ каждое)", + galleryPhotos: "Изображения", + galleryAddPhoto: "Добавить изображение", + galleryRemovePhoto: "Удалить", + galleryVideo: "Видео (макс. 50 МБ)", + galleryAddVideo: "Добавить видео", + galleryRemoveVideo: "Удалить видео", viewVotation: "Открыть голосование", voteCastTitle: "Проголосовать", voteResults: "Результаты", @@ -1414,31 +1186,15 @@ module.exports = { eventDescriptionLabel: "Описание", eventDescriptionPlaceholder: "Введите описание события...", eventUpdateButton: "Обновить", - eventAttendeesLabel: "Участники", - eventAttendeesPlaceholder: "Введите участников через запятую...", eventTagsLabel: "Теги", - eventTagsPlaceholder: "Введите теги через запятую...", - eventTags: "Теги", eventPriceLabel: "Цена", eventUrlLabel: "URL", eventAttendees: "Участники", - noAttendees: "Участников пока нет", - eventCreatedAt: "Создано", eventLocation: "Местоположение", eventLocationLabel: "Местоположение", - eventNoLocation: "Местоположение не указано", - eventNoURL: "URL не указан", - eventBy: "Автор", noevents: "Нет доступных событий.", eventDate: "Дата", - eventDateFormat: "ДД:ММ:ГГГГ ЧЧ:мм", eventAttendButton: "Принять участие", - eventUnattendButton: "Отменить участие", - eventCreatedBy: "Создано", - eventAttendeesCount: "Количество участников", - eventCreatedByYou: "Вы создали это событие", - eventAttendConfirmation: "Вы теперь участвуете в этом событии", - eventUnattendConfirmation: "Вы больше не участвуете в этом событии", eventFilterAll: "ВСЕ", eventFilterMine: "МОИ", eventFilterToday: "СЕГОДНЯ", @@ -1446,16 +1202,9 @@ module.exports = { eventFilterMonth: "ЭТОТ МЕСЯЦ", eventFilterYear: "ЭТОТ ГОД", eventFilterArchived: "АРХИВ", - eventTodayTitle: "Сегодняшние события", - eventThisWeekTitle: "События этой недели", - eventThisMonthTitle: "События этого месяца", - eventThisYearTitle: "События этого года", eventPrivacyLabel: "Видимость", eventPublic: "Публичное", eventPrivate: "Приватное", - eventPublicTitle: "Публичные события", - eventNoPrice: "Бесплатное событие", - eventNoImage: "Изображение не загружено", eventAttended: "Участвует", eventUnattended: "Не участвует", eventStatusOpen: "Открыто", @@ -1466,6 +1215,10 @@ module.exports = { tagsTopSectionTitle: "Популярные теги", tagsCloudSectionTitle: "Облако тегов", tagsFilterAll: "ВСЕ", + tagsFilterMine: "МОИ", + tagsFilterRecent: "НОВЫЕ", + tagsMineSectionTitle: "Мои теги", + tagsRecentSectionTitle: "Новые теги", tagsFilterTop: "ЛУЧШИЕ", tagsFilterCloud: "ОБЛАКО", tagsNoItems: "Нет доступных тегов.", @@ -1509,18 +1262,12 @@ module.exports = { transfersDeadline: "Крайний срок", transfersTags: "Теги", transfersStatus: "Статус", - transfersStatusUnconfirmed: "НЕПОДТВЕРЖДЁН", - transfersStatusClosed: "ЗАКРЫТ", - transfersStatusDiscarded: "ОТМЕНЁН", - transfersCreatedAt: "Создано", transfersConfirmations: "ПОДТВЕРЖДЕНИЯ", - transfersContainingBlock: "Содержащий блок", - transfersExportContract: "Смарт-контракт", + transfersExportContract: "Создать Счёт", transfersConfirmButton: "Подтвердить перевод", transfersNoItems: "Переводы не найдены.", transfersMineSectionTitle: "Ваши переводы", transfersUBISectionTitle: "UBI переводы", - transfersMarketSectionTitle: "Рыночные переводы", transfersTopSectionTitle: "Лучшие переводы", transfersPendingSectionTitle: "Ожидающие переводы", transfersUnconfirmedSectionTitle: "Неподтверждённые переводы", @@ -1528,21 +1275,13 @@ module.exports = { transfersDiscardedSectionTitle: "Отменённые переводы", transfersCreateSectionTitle: "Создать перевод", transfersAllSectionTitle: "Переводы", - transfersFilterFavs: "Избранное", - transfersFavsSectionTitle: "Избранные переводы", - transfersSearchLabel: "Поиск", transfersSearchPlaceholder: "Искать концепцию, теги, пользователей...", transfersMinAmountLabel: "Мин. сумма", transfersMaxAmountLabel: "Макс. сумма", - transfersSortLabel: "Сортировать по", transfersSortRecent: "Новейшие", transfersSortAmount: "Наибольшая сумма", transfersSortDeadline: "Ближайший срок", transfersSearchButton: "Искать", - transfersFavoriteButton: "В избранное", - transfersUnfavoriteButton: "Из избранного", - transfersMessageUserButton: "Написать", - transfersExpiringSoonBadge: "ИСТЕКАЕТ", transfersExpiredBadge: "ИСТЁК", transfersUpdatedAt: "Обновлено", transfersNoMatch: "Переводы не найдены по вашему запросу.", @@ -1587,16 +1326,6 @@ module.exports = { voteNoQuestion: "Вопрос не указан", voteUnknownCreator: "Неизвестный автор", voteUnknownDate: "Неизвестная дата", - errorVoteNotFound: "Голосование не найдено", - errorAlreadyVoted: "Вы уже высказали мнение.", - errorVoteClosedCannotEdit: "Нельзя редактировать закрытое голосование", - errorVoteDeadlinePassed: "Срок этого голосования истёк", - errorRetrievingVote: "Ошибка получения голосования", - errorCreatingVote: "Ошибка создания голосования", - errorVoteAlreadyVoted: "Нельзя редактировать после голосования", - errorDeletingOldVote: "Ошибка удаления старого мнения", - errorCreatingUpdatedVote: "Ошибка создания обновлённого мнения", - errorCreatingTombstone: "Ошибка создания записи об удалении", voteDetailSectionTitle: 'Детали голосования', voteCommentsLabel: 'Комментарии', voteCommentsForumButton: 'Открыть обсуждение', @@ -1606,7 +1335,6 @@ module.exports = { voteNewCommentButton: 'Отправить комментарий', voteNewCommentLabel: 'Добавить комментарий', cvTitle: "Резюме", - cvLabel: "Curriculum Vitae (CV)", cvEditSectionTitle: "Редактировать резюме", cvCreateSectionTitle: "Создать резюме", cvDescription: "Управляйте и делитесь профессиональными навыками и информацией.", @@ -1625,19 +1353,16 @@ module.exports = { cvLocationLabel: "Местоположение", cvStatusLabel: "Статус", cvPreferencesLabel: "Предпочтения", - cvOasisContributorLabel: "Участник Oasis", cvPersonal: "Личное", cvOasis: "Участник Oasis (необязательно)", - cvOasisContributorView: "Вклад в Oasis", + cvOasisContributorView: "Вклад", cvEducational: "Образование (необязательно)", cvEducationalView: "Образование", cvProfessional: "Профессиональное (необязательно)", cvProfessionalView: "Профессиональное", cvAvailability: "Доступность (необязательно)", - cvAvailabilityView: "Доступность", cvUpdateButton: "Обновить", cvCreateButton: "Создать резюме", - cvContactLabel: "Контакт", cvCreatedAt: "Создано", cvUpdatedAt: "Обновлено", cvEditButton: "Обновить", @@ -1646,8 +1371,103 @@ module.exports = { blogSubject: "Тема", blogMessage: "Сообщение", blogImage: "Загрузить медиа (макс: 50MB)", + blogMedia: "Вложения (до 8 изображений и одно видео)", blogPublish: "Предварительный просмотр", - noPopularMessages: "Популярных сообщений пока нет", + pollsTitle: "Опросы", + dataTitle: "Совпадения", + dataDescription: "Исследуйте и визуализируйте совпадения в вашей сети.", + dataFilterAll: "ВСЁ", + dataFilterMine: "МОИ", + dataFilterRecent: "НЕДАВНИЕ", + dataFilterTop: "ТОП", + dataKindInhabitants: "ЖИТЕЛИ", + dataKindJobs: "ВАКАНСИИ", + dataKindProjects: "ПРОЕКТЫ", + dataKindEvents: "СОБЫТИЯ", + dataKindTribes: "ПЛЕМЕНА", + dataKindMarket: "РЫНОК", + dataKindHousing: "ЖИЛЬЁ", + dataKindIndustry: "ПРОИЗВОДСТВО", + dataKindTasks: "ЗАДАЧИ", + dataKindReports: "ОТЧЁТЫ", + dataKindVotes: "ГОЛОСОВАНИЯ", + dataSearchPlaceholder: "Поиск по перекрёстным данным...", + dataCohesionTitle: "Коэффициент сплочённости (CC)", + dataCcShort: "CC", + dataCohesionHint: "Средняя близость между всем, что опубликовано в сети.", + dataAffinity: "Сходство", + dataCommonTerms: "Ключевое слово", + dataStatPeople: "Резюме", + dataStatConnected: "Связаны", + dataStatSkills: "Навыки", + dataBestMatch: "Лучшее совпадение", + dataStatIsolated: "Изолированы", + dataStatEntities: "Сравнённые сущности", + dataStatTerms: "Различных терминов", + dataStatPairs: "Связанные пары", + dataMatchesTitle: "Совпадения", + dataMatchesHint: "Персонализированные предложения алгоритма.", + dataTermsTitle: "Ключевые слова", + dataTermsHint: "Термины, встречающиеся в наибольшем числе материалов.", + dataConnections: "Связанные совпадения", + dataTopicTitle: "Всё, что связано с", + dataTopicHint: "Что алгоритм связывает с этой темой", + dataNoMatches: "Нет перекрёстных данных.", + dataNoProfile: "Публикуйте контент или заполните CV, чтобы алгоритм узнал, что вам интересно.", + pollsDescription: "Модуль, чтобы спросить сеть и подсчитать ответы.", + pollFilterAll: "ВСЕ", + pollFilterMine: "МОИ", + pollFilterRecent: "НЕДАВНИЕ", + pollFilterTop: "ТОП", + pollFilterVoted: "ПРОГОЛОСОВАЛ", + pollFilterOpen: "ОТКРЫТЫЕ", + pollFilterClosed: "ЗАКРЫТЫЕ", + pollCreateButton: "Создать опрос", + pollCreateTitle: "Создать опрос", + pollEditTitle: "Изменить опрос", + pollQuestion: "Вопрос", + pollQuestionPlaceholder: "Что вы хотите спросить?", + pollOptions: "Варианты (по одному в строке)", + pollOutcome: "Результат", + pollNoVotesYet: "Голосов пока нет", + pollTie: "Ничья", + pollOptionsPlaceholder: "Площадь\nПарк\nБар", + pollAnonymous: "Анонимный", + pollAnonymousLabel: "Анонимный опрос", + pollMultiple: "Множественный выбор", + pollMultipleLabel: "Разрешить несколько ответов", + pollDeadline: "Срок", + pollTags: "Метки", + pollPublishButton: "Опубликовать опрос", + pollUpdateButton: "Обновить", + pollCloseButton: "Закрыть", + pollDeleteButton: "Удалить", + pollVoteButton: "Голосовать", + pollChangeVote: "Изменить голос", + pollVoters: "Проголосовали", + pollComments: "Комментарии", + pollStatusLabel: "Статус", + pollStatusOpen: "ОТКРЫТ", + pollStatusClosed: "ЗАКРЫТ", + pollSearchPlaceholder: "Поиск опросов...", + pollsNoItems: "Опросы не найдены.", + viewPoll: "Смотреть опрос", + pollChatCreate: "Создать опрос", + pollInChat: "Опрос", + blogTitle: "Блоги", + blogDescription: "Модуль для поиска и управления блогами.", + blogFilterAll: "ВСЕ", + blogFilterMine: "МОИ", + blogFilterRecent: "НЕДАВНИЕ", + blogFilterFavorites: "ИЗБРАННОЕ", + blogFilterTop: "ТОП", + blogCreateButton: "Создать блог", + blogSearchPlaceholder: "Поиск блогов...", + blogComments: "Комментарии", + blogAllowComments: "Разрешить комментарии", + blogCommentsClosed: "Автор закрыл комментарии к этому блогу.", + blogNoItems: "Блоги не найдены.", + viewBlog: "Смотреть блог", forumTitle: "Форумы", forumCategoryLabel: "Категория", forumTitleLabel: "Название", @@ -1655,43 +1475,22 @@ module.exports = { forumCreateButton: "Создать форум", forumCreateSectionTitle: "Создать форум", forumDescription: "Общайтесь открыто с другими жителями вашей сети.", + forumSearchPlaceholder: "Поиск форумов...", forumFilterAll: "ВСЕ", forumFilterMine: "МОИ", forumFilterRecent: "НЕДАВНИЕ", forumFilterTop: "ТОП", - forumMineSectionTitle: "Ваши форумы", - forumRecentSectionTitle: "Последние форумы", - forumAllSectionTitle: "Форумы", forumDeleteButton: "Удалить", forumParticipants: "участники", forumMessages: "сообщения", - forumLastMessage: "Последнее сообщение", forumMessageLabel: "Сообщение", forumMessagePlaceholder: "Напишите сообщение...", forumSendButton: "Отправить", - forumVisitForum: "Посетить форум", noForums: "Форумы не найдены.", - forumVisitButton: "Посетить форум", - forumCatGENERAL: "Общее", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "Политика", - forumCatTECH: "Технологии", - forumCatSCIENCE: "Наука", - forumCatMUSIC: "Музыка", - forumCatART: "Искусство", - forumCatGAMING: "Игры", - forumCatBOOKS: "Книги", - forumCatFILMS: "Фильмы", - forumCatPHILOSOPHY: "Философия", - forumCatSOCIETY: "Общество", - forumCatPRIVACY: "Конфиденциальность", - forumCatCYBERWARFARE: "Кибервойна", - forumCatSURVIVALISM: "Выживание", + forumVisitButton: "Открыть форум", + forumTopicLabel: "Тема", imageTitle: "Изображения", imageDescription: "Исследуйте и управляйте изображениями в вашей сети.", - imagePluginTitle: "Название", - imagePluginDescription: "Описание", imageMineSectionTitle: "Ваши изображения", imageCreateSectionTitle: "Загрузить изображение", imageUpdateSectionTitle: "Обновить изображение", @@ -1700,14 +1499,12 @@ module.exports = { imageTopSectionTitle: "Топ изображений", imageFavoritesSectionTitle: "Избранное", imageGallerySectionTitle: "Галерея", - imageMemeSectionTitle: "Мемы", imageFilterAll: "ВСЕ", imageFilterMine: "МОИ", imageFilterRecent: "НЕДАВНИЕ", imageFilterTop: "ТОП", imageFilterFavorites: "ИЗБРАННОЕ", imageFilterGallery: "ГАЛЕРЕЯ", - imageFilterMeme: "МЕМЫ", imageCreateButton: "Загрузить изображение", imageUpdateButton: "Обновить", imageDeleteButton: "Удалить", @@ -1720,7 +1517,6 @@ module.exports = { imageTitlePlaceholder: "Необязательно", imageDescriptionLabel: "Описание", imageDescriptionPlaceholder: "Необязательно", - imageMemeLabel: "Отметить как МЕМ", imageNoFile: "Файл изображения не предоставлен", noImages: "Изображений нет.", imageSearchPlaceholder: "Поиск по названию, тегам, описанию, автору...", @@ -1728,7 +1524,6 @@ module.exports = { imageSortOldest: "Самые старые", imageSortTop: "С наибольшим рейтингом", imageSearchButton: "Поиск", - imageMessageAuthorButton: "Сообщение", imageUpdatedAt: "Обновлено", imageNoMatch: "Изображения не найдены.", feedTitle: "Лента", @@ -1739,7 +1534,6 @@ module.exports = { MINEButton: "Ваши посты", TODAYButton: "СЕГОДНЯ", TOPButton: "Топ постов", - CREATEButton: "Создать пост", totalOpinions: "Всего мнений", moreVoted: "Больше голосов", alreadyVoted: "Вы уже высказали мнение.", @@ -1764,20 +1558,12 @@ module.exports = { concept: "Концепция", description: "Описание", meme: "Мем", - activityContact: "Контакт", - activityBy: "Имя", - activityPixelia: "Добавлен новый пиксель", - viewImage: "Просмотр изображения", - playAudio: "Воспроизвести аудио", - playVideo: "Воспроизвести видео", typeRecent: "НЕДАВНИЕ", - errorActivity: "Ошибка получения активности", + typeTop: "ТОП", typePost: "БЛОГИ", - recentButton: "НЕДАВНИЕ", typeTribe: "ПЛЕМЕНА", typeLarp: "L.A.R.P.", typeInhabitants: "ЖИТЕЛИ", - activityProfileUpdated: "обновил профиль", typeAbout: "ЖИТЕЛИ", typeCurriculum: "РЕЗЮМЕ", typeImage: "ИЗОБРАЖЕНИЯ", @@ -1821,8 +1607,6 @@ module.exports = { typeCourtsSettlementAccepted: "Суды · Мировое соглашение принято", typeCourtsNomination: "Суды · Назначение", typeCourtsNominationVote: "Суды · Голосование за назначение", - activitySupport: "Заключён новый альянс", - activityJoin: "Присоединился к новому PUB", question: "Вопрос", deadline: "Срок", status: "Статус", @@ -1836,12 +1620,8 @@ module.exports = { date: "Дата", category: "Категория", attendees: "Участники", - activitySpread: "->", - visitLink: "Перейти по ссылке", - viewDocument: "Просмотр документа", location: "Местоположение", contentWarning: "Тема", - personName: "Имя жителя", bankWalletConnected: "Кошелёк ECOin", bankUbiReceived: "Получен UBI", bankTx: "Транзакция", @@ -1851,7 +1631,6 @@ module.exports = { link: "Ссылка", activityProjectFollow: "%OASIS% теперь %ACTION% этот проект %PROJECT%", activityProjectUnfollow: "%OASIS% теперь %ACTION% этот проект %PROJECT%", - activityProjectPledged: "%OASIS% внёс %ACTION% %AMOUNT% в проект %PROJECT%", following: "СЛЕЖУ", unfollowing: "ОТПИСАН", pledged: "ПОДДЕРЖАЛ", @@ -1898,34 +1677,28 @@ module.exports = { courtsVotesSlashTotal: "ЗА/ВСЕГО", courtsOpenVote: "Открытое голосование", courtsAnswerTitle: "Ответ", - courtsStanceADMIT: "Признаю", - courtsStanceDENY: "Отрицаю", - courtsStancePARTIAL: "Частично", - courtsStanceCOUNTERCLAIM: "Встречный иск", - courtsStanceNEUTRAL: "Нейтрально", courtsVerdictResult: "Результат", courtsVerdictOrders: "Предписания", courtsSettlementText: "Соглашение", courtsSettlementAccepted: "Принято", - courtsSettlementPending: "В ожидании", courtsJudge: "Судья", courtsThSupports: "Поддержки", courtsFilterOpenCase: "Открытое дело", - courtsEvidenceFileLabel: "Файл доказательства (изображение, аудио, видео или PDF)", - courtsCaseMediators: "Медиаторы", courtsCaseMediatorsPh: "Oasis ID медиаторов через запятую", courtsMediatorsLabel: "Медиаторы", courtsThCase: "Дело", courtsThCreatedAt: "Дата начала", - courtsThActions: "Действия", courtsPublicPrefLabel: "Видимость после решения", courtsPublicPrefYes: "Согласен, что это дело может быть полностью публичным", courtsPublicPrefNo: "Предпочитаю сохранить детали в тайне", courtsPublicPrefSubmit: "Сохранить настройку видимости", courtsNoCases: "Дел нет.", reportsTitle: "Отчёты", - reportsDescription: "Управляйте и отслеживайте отчёты, связанные с проблемами, ошибками, злоупотреблениями и предупреждениями в вашей сети.", + reportsDescription: "Управляйте отчётами вашей сети и следите за ними.", + reportsSearchPlaceholder: "Поиск отчётов...", reportsFilterAll: "ВСЕ", + reportsFilterRecent: "НОВЫЕ", + reportsFilterTop: "ТОП", reportsFilterMine: "МОИ", reportsFilterFeatures: "ФУНКЦИИ", reportsFilterBugs: "ОШИБКИ", @@ -1938,19 +1711,13 @@ module.exports = { reportsFilterInvalid: "НЕДЕЙСТВИТЕЛЬНЫЕ", reportsCreateButton: "Создать отчёт", reportsTitleLabel: "Название", - reportsDescriptionLabel: "Описание", - reportsDescriptionPlaceholder: "Пожалуйста, предоставьте подробное описание.", reportsCategory: "Категория", - reportsCategoryLabel: "Категория", reportsCategoryFeatures: "Функции", reportsCategoryBugs: "Ошибки", reportsCategoryAbuse: "Злоупотребления", - reportsCategoryContent: "Проблемы с контентом", + reportsCategoryContent: "Контент", reportsUpdateButton: "Обновить", reportsDeleteButton: "Удалить", - reportsDateLabel: "Дата", - reportsUploadFile: "Загрузить медиа (макс: 50MB)", - reportsCreatedBy: "Автор", reportsMineSectionTitle: "Ваши отчёты", reportsFeaturesSectionTitle: "Запросы функций", reportsBugsSectionTitle: "Ошибки", @@ -1958,10 +1725,6 @@ module.exports = { reportsContentSectionTitle: "Проблемы с контентом", reportsAllSectionTitle: "Отчёты", reportsNoItems: "Отчётов нет.", - reportsValidationTitle: "Введите допустимое название.", - reportsValidationDescription: "Описание не может быть пустым.", - reportsValidationCategory: "Выберите категорию.", - reportsCreatedAt: "Создано", reportsSeverity: "Серьёзность", reportsSeverityLow: "Низкая", reportsSeverityMedium: "Средняя", @@ -1972,13 +1735,10 @@ module.exports = { reportsStatusUnderReview: "На рассмотрении", reportsStatusResolved: "Решён", reportsStatusInvalid: "Недействительный", - reportsUpdateStatusButton: "Обновить статус", - reportsAnonymityOption: "Отправить анонимно", - reportsAnonymousAuthor: "Анонимный", reportsConfirmButton: "ПОДТВЕРДИТЬ ОТЧЁТ!", reportsConfirmations: "Подтверждения", reportsConfirmedSectionTitle: "Подтверждённые отчёты", - reportsCreateTaskButton: "СОЗДАТЬ ЗАДАЧУ", + reportsCreateTaskButton: "Создать задачу", reportsOpenSectionTitle: "Открытые отчёты", reportsUnderReviewSectionTitle: "Отчёты на рассмотрении", reportsResolvedSectionTitle: "Решённые отчёты", @@ -2022,6 +1782,20 @@ module.exports = { reportsRequestedActionLabel: "Запрашиваемое действие", reportsRequestedActionPlaceholder: "Удалить, скрыть, пометить, предупредить и т.д.", tribesTitle: "Племена", + tribeFilterAll: "ВСЕ", + tribeFilterRecent: "НЕДАВНИЕ", + tribeFilterMine: "МОИ", + tribeFilterMembership: "ЧЛЕНСТВО", + tribeFilterSubtribes: "ПОДПЛЕМЕНА", + tribeFilterTop: "ТОП", + tribeFilterGallery: "ГАЛЕРЕЯ", + tribeFeedFilterTOP: "ТОП", + tribeFeedFilterMINE: "МОИ", + tribeFeedFilterALL: "ВСЕ", + tribeFeedFilterRECENT: "НЕДАВНИЕ", + courtsStanceDENY: "Отрицать", + courtsStanceADMIT: "Признать", + courtsStancePARTIAL: "Признать частично", tribeAllSectionTitle: "Племена", tribeMineSectionTitle: "Ваши племена", tribeCreateSectionTitle: "Создать племя", @@ -2033,13 +1807,6 @@ module.exports = { tribeviewSubTribeButton: "Посетить под-племя", tribeRootLabel: "КОРЕНЬ", tribeDescription: "Исследуйте или создавайте племена в вашей сети.", - tribeFilterAll: "ВСЕ", - tribeFilterMine: "МОИ", - tribeFilterMembership: "ЧЛЕНСТВО", - tribeFilterRecent: "НЕДАВНИЕ", - tribeFilterTop: "ТОП", - tribeFilterSubtribes: "ПОДПЛЕМЕНА", - tribeFilterGallery: "ГАЛЕРЕЯ", tribeMainTribeLabel: "ГЛАВНОЕ ПЛЕМЯ", tribeCreateButton: "Создать племя", tribeUpdateButton: "Обновить", @@ -2058,13 +1825,8 @@ module.exports = { tribeModeLabel: "РЕЖИМ", tribeIsAnonymousLabel: "СТАТУС", tribeMembersCount: "Участники", - tribeInviteCodePlaceholder: "Введите код приглашения", - tribeJoinByCodeButton: "Войти с кодом", - tribeJoinButton: "ВСТУПИТЬ", tribeEnterInvite: "ВВЕСТИ КОД", tribeLeaveButton: "ПОКИНУТЬ", - tribeYes: "ДА", - tribeNo: "НЕТ", tribePublic: "ПУБЛИЧНОЕ", tribePrivate: "ЧАСТНОЕ", tribeGenerateInvite: "РАЗОВОЕ ПРИГЛАШЕНИЕ", @@ -2073,13 +1835,8 @@ module.exports = { tribeRemoveInvitation: "УДАЛИТЬ ПРИГЛАШЕНИЕ", tribeCreatedAt: "Создано", tribeAuthor: "Автор", - tribeAuthorLabel: "АВТОР", tribeStrict: "Строгое", tribeOpen: "Открытое", - tribeFeedFilterRECENT: "НЕДАВНИЕ", - tribeFeedFilterMINE: "МОИ", - tribeFeedFilterALL: "ВСЕ", - tribeFeedFilterTOP: "ТОП", tribeFeedRefeeds: "Переопубликации", tribeFeedRefeed: "Переопубликовать", tribeFeedMessagePlaceholder: "Написать пост…", @@ -2089,17 +1846,12 @@ module.exports = { tribeNotFound: "Племя не найдено!", createTribeTitle: "Создать племя", updateTribeTitle: "Обновить племя", - tribeSectionOverview: "Обзор", tribeSectionInhabitants: "Жители", tribeSectionVotations: "ГОЛОСОВАНИЯ", tribeSectionEvents: "СОБЫТИЯ", - tribeSectionReports: "Отчёты", tribeSectionTasks: "ЗАДАЧИ", tribeSectionFeed: "ЛЕНТА", tribeSectionForum: "ФОРУМ", - tribeSectionMarket: "Рынок", - tribeSectionJobs: "Вакансии", - tribeSectionProjects: "Проекты", tribeSectionMedia: "Медиа", tribeSectionImages: "ИЗОБРАЖЕНИЯ", tribeSectionAudios: "АУДИО", @@ -2137,11 +1889,6 @@ module.exports = { tribeTaskStatusClosed: "ЗАКРЫТЬ", tribeTaskAssign: "НАЗНАЧИТЬ", tribeTaskUnassign: "СНЯТЬ НАЗНАЧЕНИЕ", - tribeReportCreate: "Создать отчёт", - tribeReportsEmpty: "Отчётов пока нет.", - tribeReportTitle: "Название", - tribeReportDescription: "Описание", - tribeReportCategory: "Категория", tribeVotationCreate: "Создать голосование", tribeVotationsEmpty: "Голосований пока нет.", tribeVotationTitle: "Название", @@ -2159,27 +1906,6 @@ module.exports = { tribeForumCategory: "Категория", tribeForumReply: "Ответить", tribeForumReplies: "Ответы", - tribeMarketCreate: "Создать объявление", - tribeMarketEmpty: "Объявлений пока нет.", - tribeMarketTitle: "Название", - tribeMarketDescription: "Описание", - tribeMarketPrice: "Цена", - tribeMarketImage: "Изображение", - tribeMarketCategory: "Категория", - tribeJobCreate: "Создать вакансию", - tribeJobsEmpty: "Вакансий пока нет.", - tribeJobTitle: "Название", - tribeJobDescription: "Описание", - tribeJobLocation: "Местоположение", - tribeJobSalary: "Зарплата", - tribeJobDeadline: "Срок", - tribeProjectCreate: "Создать проект", - tribeProjectsEmpty: "Проектов пока нет.", - tribeProjectTitle: "Название", - tribeProjectDescription: "Описание", - tribeProjectGoal: "Цель", - tribeProjectFunded: "Финансировано", - tribeProjectDeadline: "Срок", tribeMediaUpload: "Загрузить медиа", readDocument: "Читать документ", tribeCreateImage: "Создать изображение", @@ -2190,7 +1916,6 @@ module.exports = { tribeMediaEmpty: "Медиа пока нет.", tribeMediaTitle: "Название", tribeMediaDescription: "Описание", - tribeMediaType: "Тип", tribeMediaTypeImage: "Изображение", tribeMediaTypeVideo: "Видео", tribeMediaTypeAudio: "Аудио", @@ -2200,11 +1925,6 @@ module.exports = { tribeInviteCodeText: "Код приглашения: ", oasisVersionLabel: "Версия Oasis", tribeInviteCodeHint: "Поделитесь этим кодом с тем, кого хотите пригласить. Он может присоединиться через /invites → Tribes.", - tribeGroupTribe: "Племя", - tribeGroupOffice: "Офис", - tribeGroupNetwork: "Сеть", - tribeGroupEconomy: "Экономика", - tribeGroupMedia: "Медиа", tribeStatusOpen: "ОТКРЫТОЕ", tribeStatusClosed: "ЗАКРЫТОЕ", tribeStatusInProgress: "В ПРОЦЕССЕ", @@ -2214,33 +1934,17 @@ module.exports = { tribePriorityCritical: "КРИТИЧЕСКИЙ", tribeTaskFilterAll: "ВСЕ", tribeMediaFilterAll: "ВСЕ", - tribeReportCatBug: "ОШИБКА", - tribeReportCatAbuse: "ЗЛОУПОТРЕБЛЕНИЕ", - tribeReportCatContent: "КОНТЕНТ", - tribeReportCatOther: "ДРУГОЕ", tribeForumCatGeneral: "ОБЩЕЕ", tribeForumCatProposal: "ПРЕДЛОЖЕНИЕ", tribeForumCatQuestion: "ВОПРОС", tribeForumCatAnnouncement: "ОБЪЯВЛЕНИЕ", - tribeMarketCatGoods: "ТОВАРЫ", - tribeMarketCatServices: "УСЛУГИ", - tribeMarketCatFood: "ЕДА", - tribeMarketCatOther: "ДРУГОЕ", tribeStatusLabel: "Статус", tribeSubTribes: "ПОДПЛЕМЕНА", tribeSubTribesCreate: "Создать подплемя", tribeSubTribesStrictDenied: "Строгий режим племени не позволяет создавать новые подплемена. Пожалуйста, свяжитесь с администратором.", - tribeSubTribesEmpty: "Подплемён пока не создано.", - tribeActivityJoined: "ВСТУПИЛ", - tribeActivityLeft: "ПОКИНУЛ", - tribeActivityFeed: "ЛЕНТА", tribeActivityRefeed: "ПЕРЕОПУБЛИКОВАЛ", - tribeGroupAnalytics: "Аналитика", - tribeGroupCreative: "Творчество", tribeSectionActivity: "АКТИВНОСТЬ", tribeSectionTrending: "ПОПУЛЯРНОЕ", - tribeSectionOpinions: "МНЕНИЯ", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "ТЕГИ", tribeSectionSearch: "ПОИСК", tribeActivityEmpty: "Активности пока нет.", @@ -2252,25 +1956,15 @@ module.exports = { tribeTrendingPeriodWeek: "Эта неделя", tribeTrendingPeriodAll: "За всё время", tribeTrendingEngagement: "вовлечённость", - tribeOpinionsEmpty: "Мнений пока нет.", - tribeOpinionsCast: "Голосовать", - tribeOpinionsRankings: "Рейтинги", - tribeOpinionsAlreadyVoted: "Уже проголосовали", tribeTopCategory: "Больше голосов", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "Совместный пиксель-арт.", - tribePixeliaPaint: "Рисовать", - tribePixeliaContributors: "участников", - tribePixeliaTotalPixels: "пикселей нарисовано", tribeTagsEmpty: "Тегов не найдено.", - tribeTagsCloud: "Облако тегов", - tribeTagsContentWith: "Контент с тегом", tribeSearchPlaceholder: "Поиск контента племени...", tribeSearchEmpty: "Результаты не найдены.", tribeSearchResults: "Результаты", tribeSearchMinChars: "Введите не менее 2 символов для поиска.", agendaTitle: "Повестка дня", agendaDescription: "Здесь вы можете найти все назначенные вам элементы.", + agendaSearchPlaceholder: "Поиск в повестке...", agendaFilterAll: "ВСЕ", agendaFilterToday: "СЕГОДНЯ", agendaFilterUpcoming: "БЛИЖАЙШИЕ", @@ -2289,20 +1983,9 @@ module.exports = { agendaFilterProjects: "ПРОЕКТЫ", agendaFilterCalendars: "КАЛЕНДАРИ", agendaNoItems: "Назначений не найдено.", - agendaAuthor: "Автор", agendaDiscardButton: "Отклонить", agendaRestoreButton: "Восстановить", - agendaCreatedAt: "Создано", - agendaTitleLabel: "Название", agendaMembersCount: "Участники", - agendaDescriptionLabel: "Описание", - agendaStatus: "Статус", - agendaVisibility: "Видимость", - agendaEventDate: "Дата события", - agendaEventLocation: "Местоположение", - agendaEventPrice: "Цена", - agendaEventUrl: "URL", - agendaTaskStart: "Время начала", agendaLocationLabel: "Местоположение", agendaYes: "ДА", agendaNo: "НЕТ", @@ -2312,11 +1995,6 @@ module.exports = { agendareportCategory: "Категория", agendareportSeverity: "Серьёзность", agendareportStatus: "Статус", - agendareportDescription: "Описание", - agendaTaskEnd: "Время окончания", - agendaTaskPriority: "Приоритет", - agendaTransferFrom: "От", - agendaTransferTo: "Кому", agendaTransferConcept: "Концепция", agendaTransferAmount: "Сумма", agendaTransferDeadline: "Срок", @@ -2324,45 +2002,6 @@ module.exports = { shareYourOpinions: "Открывайте и голосуйте за мнения в вашей сети.", voteNow: "Голосовать", noOpinionsFound: "Мнений не найдено.", - interestingButton: "ИНТЕРЕСНОЕ", - necessaryButton: "НЕОБХОДИМОЕ", - funnyButton: "СМЕШНОЕ", - disgustingButton: "ОТВРАТИТЕЛЬНОЕ", - sensibleButton: "РАЗУМНОЕ", - propagandaButton: "ПРОПАГАНДА", - adultOnlyButton: "ТОЛЬКО ДЛЯ ВЗРОСЛЫХ", - boringButton: "СКУЧНОЕ", - confusingButton: "ЗАПУТАННОЕ", - inspiringButton: "ВДОХНОВЛЯЮЩЕЕ", - spamButton: "СПАМ", - usefulButton: "ПОЛЕЗНОЕ", - informativeButton: "ИНФОРМАТИВНОЕ", - wellResearchedButton: "ХОРОШО ИССЛЕДОВАННОЕ", - accurateButton: "ТОЧНОЕ", - needsSourcesButton: "НУЖНЫ ИСТОЧНИКИ", - wrongButton: "НЕПРАВИЛЬНОЕ", - lowQualityButton: "НИЗКОЕ КАЧЕСТВО", - creativeButton: "ТВОРЧЕСКОЕ", - insightfulButton: "ПРОНИЦАТЕЛЬНОЕ", - actionableButton: "ПРИМЕНИМОЕ", - loveButton: "ЛЮБЛЮ", - clearButton: "ЯСНОЕ", - upliftingButton: "ПОДНИМАЮЩЕЕ НАСТРОЙ", - unnecessaryButton: "НЕНУЖНОЕ", - rejectedButton: "ОТКЛОНЁННОЕ", - misleadingButton: "ВВОДЯЩЕЕ В ЗАБЛУЖДЕНИЕ", - offTopicButton: "НЕ ПО ТЕМЕ", - duplicateButton: "ДУБЛИРОВАНИЕ", - clickbaitButton: "КЛИКБЕЙТ", - trollButton: "ТРОЛЛЬ", - nsfwButton: "NSFW", - violentButton: "НАСИЛИЕ", - toxicButton: "ТОКСИЧНОЕ", - harassmentButton: "ПРЕСЛЕДОВАНИЕ", - hateButton: "НЕНАВИСТЬ", - scamButton: "МОШЕННИЧЕСТВО", - triggeringButton: "ПРОВОКАЦИОННОЕ", - opinionsCreatedAt: "Создано", opinionsTotalCount: "Всего мнений", voteInteresting: "Интересное", voteNecessary: "Необходимое", @@ -2399,7 +2038,6 @@ module.exports = { voteCreative: "Творческое", voteSpam: "Спам", voteAdultOnly: "Только для взрослых", - publishBlog: "Опубликовать блог", privateMessage: "ЛС", pmSendTitle: "Личные сообщения", pmSend: "Отправить!", @@ -2410,7 +2048,6 @@ module.exports = { pmComposeTitle: "Отправить сообщение", pmRecipients: "Получатели", pmRecipientsHint: "Введите Oasis ID через запятую", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "До 7 получателей на сообщение.", pmTextPlaceholder: "Текст ограничен 7000 символами.", pmSubject: "Тема", @@ -2434,11 +2071,8 @@ module.exports = { pmCrypterCharsLabel: "символов", pmInvalidRecipients: "Недействительный Oasis ID (должен быть вида @…=.ed25519).", pmEncryptionLabel: "Шифрование", - pmFile: "Вложение", - pmInvalidMessage: "Недействительное сообщение", pmNoSubject: "(без темы)", pmSubjectLabel: "Тема:", - pmBodyLabel: "Тело", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2456,8 +2090,6 @@ module.exports = { inboxJobSubscribedTitle: "Новая подписка на вашу вакансию", pmInhabitantWithId: "Житель с OASIS ID:", pmHasSubscribedToYourJobOffer: "подписался на вашу вакансию", - inboxProjectCreatedTitle: "Создан новый проект", - pmHasCreatedAProject: "создал проект", inboxMarketItemSoldTitle: "Товар продан", inboxShopSoldTitle: "Товар продан", pmYourItem: "Ваш товар", @@ -2467,7 +2099,6 @@ module.exports = { pmHasPledged: "внёс", pmToYourProject: "в ваш проект", blockchain: "BlockExplorer", - blockchainTitle: "BlockExplorer", blockchainDescription: "Исследуйте и визуализируйте блоки в блокчейне.", blockchainNoBlocks: "Блоков в блокчейне не найдено.", blockchainStatsTitle: "Статистика", @@ -2479,19 +2110,17 @@ module.exports = { blockchainBlockCarbon: "Углеродный след", blockchainBlockType: "Тип", blockchainBlockTimestamp: "Временная метка", - blockchainBlockContent: "Блок", - blockchainBlockURL: "URL:", - blockchainContent: "Блок", - blockchainContentPreview: "Предварительный просмотр содержимого блока", blockchainLatestDatagram: "Последняя датаграмма", blockchainDatagram: "Датаграмма", - blockchainDetails: "Просмотр деталей блока", - blockchainViewBlockexplorer: "Открыть в blockexplorer", - blockchainBlockInfo: "Информация о блоке", - blockchainBlockDetails: "Детали выбранного блока", + blockchainDetails: "Посмотреть детали блока", + blockchainViewBlockexplorer: "Открыть в Blockexplorer", blockchainBack: "Назад в BlockExplorer", blockchainContentDeleted: "Этот контент был удалён", - visitContent: "Посетить контент", + visitContent: "Открыть контент", + favoriteAdd: "Закрепить в избранном", + pmContentTooltip: "Отправить личное сообщение", + favoriteRemove: "Убрать из избранного", + reportContent: "Пожаловаться на контент", banking: "Банкинг", bankingTitle: "Банкинг", bankingDescription: "Экономика ECOin: баланс, базовый доход, налоги и ценность промышленности.", @@ -2500,21 +2129,17 @@ module.exports = { bankRules: "Правила", pending: "В ожидании", closed: "Закрыто", - bankBack: "Назад в Банкинг", bankViewTx: "Просмотр транзакции", bankClaimNow: "Получить сейчас", bankClaimUBI: "Получить UBI!", bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: "Нет ожидающих распределений UBI для этой эпохи.", bankEpoch: "Эпоха", bankPool: "Пул (эта эпоха)", bankWeightsSum: "Сумма весов", - bankAllocations: "Распределения", bankNoAllocations: "Распределений не найдено.", bankNoEpochs: "Эпох не найдено.", bankEpochAllocations: "Распределения эпохи", @@ -2532,9 +2157,6 @@ module.exports = { bankYourFundsMonth: "Ваши средства (в этом месяце)", bankIndustryBalance: "Промышленное производство (оценка)", bankUserBalance: "Ваш баланс", - ecoWalletNotConfigured: "Кошелёк ECOin не настроен", - editWallet: "Редактировать кошелёк", - addWallet: "Добавить кошелёк", bankAddresses: "Адреса", bankNoAddresses: "Адресов не найдено.", bankUser: "Oasis ID", @@ -2558,15 +2180,7 @@ module.exports = { bankAddressDeleteConfirm: "Удалить этот адрес?", bankLocal: "Локальный", bankFromOasis: "Oasis", - bankMyAddress: "Ваш адрес", - bankRemoveMyAddress: "Удалить мой адрес", - bankNotRemovableOasis: "Адреса нельзя удалить локально", - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "НЕТ СРЕДСТВ!", bankUbiAvailableOk: "ДОСТУПНО!", bankUbiAvailability: "БОД (сеть)", @@ -2583,13 +2197,6 @@ module.exports = { shopsTitle: "Магазины", shopDescription: "Откройте и управляйте магазинами в сети.", shopTitle: "Магазин", - shopFilterAll: "ВСЕ", - shopFilterMine: "МОИ", - shopFilterRecent: "НЕДАВНИЕ", - shopFilterTop: "ТОП", - shopFilterProducts: "ТОВАРЫ", - shopFilterPrices: "ЦЕНЫ", - shopFilterFavorites: "ИЗБРАННЫЕ", shopUpload: "Создать магазин", shopAllSectionTitle: "Все магазины", shopMineSectionTitle: "Мои магазины", @@ -2606,16 +2213,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "Опубликовать в Clearnet", - shopClearnetUnpublish: "Убрать из Clearnet", - shopClearnetUrlLabel: "URL в Clearnet", - shopClearnetWarning: "Публикация в Clearnet делает этот магазин доступным для индексации поисковыми системами и внешними сканерами.", shopAddFavorite: "Добавить в избранное", shopRemoveFavorite: "Убрать из избранного", shopOpen: "ОТКРЫТ", shopClosed: "ЗАКРЫТ", - shopOpenShop: "Открыть магазин", - shopCloseShop: "Закрыть магазин", shopMakePrivate: "СДЕЛАТЬ ПРИВАТНОЙ (E2E)", shopMakePublic: "СДЕЛАТЬ ПУБЛИЧНОЙ", shopProducts: "Товары", @@ -2643,8 +2244,6 @@ module.exports = { shopOrderPrice: "Цена", shopOrderBuyer: "Покупатель", shopBackToShop: "Назад в магазин", - shopShareUrl: "Ссылка для обмена", - shopVisitShop: "ПОСЕТИТЬ МАГАЗИН", marketVisitItem: "ОТКРЫТЬ ТОВАР", shopStatus: "СТАТУС", shopCreatedAt: "СОЗДАН", @@ -2653,12 +2252,10 @@ module.exports = { shopLocation: "Местоположение", shopTags: "Теги", shopVisibility: "Видимость", - shopImage: "Изображение", shopShortDescription: "Краткое описание", shopShortDescriptionPlaceholder: "Краткое описание для карточек (макс. 160 символов)", shopTitlePlaceholder: "Название вашего магазина", shopDescriptionPlaceholder: "Подробное описание вашего магазина", - shopUrlPlaceholder: "https://url-vashego-magazina.ru", shopLocationPlaceholder: "Город, Страна", shopTagsPlaceholder: "тег1, тег2, тег3", mapTitlePlaceholder: "Название карты", @@ -2676,7 +2273,6 @@ module.exports = { bankUnitMinutes: "минуты", bankUnitDays: "дни", bankExchangeNoData: "Данные недоступны", - bankExchangeIndex: "Стоимость ECOin (1ч)", bankInflation: "Инфляция ECOin (anual)", bankInflationMonthly: "Инфляция ECOin (mensual)", bankExchangeChartTitle: "Динамика стоимости ECOin со временем", @@ -2690,36 +2286,15 @@ module.exports = { bankingSyncStatusOutdated: "Устарел", statsTitle: "Статистика", statistics: "Статистика", - statsInhabitant: "Статистика жителя", statsDescription: "Откройте статистику вашей сети.", TOMBSTONEButton: "НАДГРОБИЯ", - statsYou: "Вы", - statsUserId: "Oasis ID", statsCreatedAt: "Создано", statsYourContent: "Контент", statsYourOpinions: "Мнения", - statsYourTombstone: "Надгробия", - statsNetwork: "Сеть", - statsTotalInhabitants: "Жители", - statsDiscoveredTribes: "Племена (публичные)", - statsPrivateDiscoveredTribes: "Племена (частные)", statsNetworkContent: "Контент", - statsYourMarket: "Рынок", - statsYourJob: "Вакансии", - statsYourProject: "Проекты", - statsYourTransfer: "Переводы", - statsYourForum: "Форумы", statsNetworkOpinions: "Мнения", - statsDiscoveredMarket: "Рынок", - statsDiscoveredJob: "Вакансии", - statsDiscoveredProject: "Проекты", - statsBankingTitle: "Банкинг", statsEcoWalletLabel: "Кошелёк ECOIN", statsEcoWalletNotConfigured: "Не настроен!", - statsTotalEcoAddresses: "Всего адресов", - statsDiscoveredTransfer: "Переводы", - statsDiscoveredForum: "Форумы", - statsNetworkTombstone: "Надгробия", statsBookmark: "Закладки", statsEvent: "События", statsTask: "Задачи", @@ -2742,16 +2317,12 @@ module.exports = { statsAiExchange: "ИИ", statsPUBs: "PUBs", statsPost: "Посты", - statsOasisID: "Oasis ID", statsSize: "Итого (размер)", statsBlockchainSize: "Блокчейн (размер)", statsBlobsSize: "Блобы (размер)", statsActivity7d: "Активность (последние 7 дней)", statsActivity7dTotal: "Итого за 7 дней", statsActivity30dTotal: "Итого за 30 дней", - statsKarmaScore: "Очки КАРМЫ", - statsPublic: "Публичное", - statsPrivate: "Частное", messages: "Сообщения", statsProjectsTitle: "Проекты", statsProjectsTotal: "Всего проектов", @@ -2761,33 +2332,16 @@ module.exports = { statsProjectsCancelled: "Отменённые", statsProjectsGoalTotal: "Общая цель", statsProjectsPledgedTotal: "Всего поддержано", - statsProjectsSuccessRate: "Процент успеха", - statsProjectsAvgProgress: "Средний прогресс", - statsProjectsMedianProgress: "Медианный прогресс", - statsProjectsActiveFundingAvg: "Среднее активное финансирование", - statsJobsTitle: "Вакансии", - statsJobsTotal: "Всего вакансий", - statsJobsOpen: "Открытые", - statsJobsClosed: "Закрытые", - statsJobsOpenVacants: "Открытые места", - statsJobsSubscribersTotal: "Всего подписчиков", - statsJobsAvgSalary: "Средняя зарплата", - statsJobsMedianSalary: "Медианная зарплата", statsMarketTitle: "Рынок", statsMarketTotal: "Всего товаров", statsMarketForSale: "На продаже", statsMarketReserved: "Зарезервировано", statsMarketClosed: "Закрыто", statsMarketSold: "Продано", - statsMarketRevenue: "Выручка", - statsMarketAvgSoldPrice: "Средняя цена продажи", statsUsersTitle: "Жители", user: "Житель", - statsTombstoneTitle: "Надгробия", - statsNetworkTombstones: "Надгробия сети", statsTombstoneRatio: "Доля надгробий (%)", statsAITraining: "Обучение ИИ", - statsAIExchanges: "Обмены", statsParliamentCandidature: "Кандидатуры парламента", statsParliamentTerm: "Сроки парламента", statsParliamentProposal: "Предложения парламента", @@ -2813,27 +2367,19 @@ module.exports = { aiConfiguration: "Установить запрос", aiPromptUsed: "Запрос", aiClearHistory: "Очистить историю чата", - aiSharePrompt: "Добавить этот ответ в коллективное обучение?", - aiShareYes: "Да", - aiShareNo: "Нет", - aiSharedLabel: "Добавлено в обучение", - aiRejectedLabel: "Не добавлено в обучение", aiServerError: "ИИ не смог ответить. Пожалуйста, попробуйте снова.", typeAiExchange: "ИИ", aiApproveTrain: "Добавить в коллективное обучение", aiRejectTrain: "Не обучать", - aiTrainPending: "Ожидает одобрения", aiTrainApproved: "Одобрено для обучения", aiTrainRejected: "Отклонено для обучения", aiSnippetsUsed: "Использованные фрагменты", aiSnippetsLearned: "Изученные фрагменты", - aiApproveCustomTrain: "Обучить используя этот пользовательский ответ", aiCustomAnswerPlaceholder: "Напишите ваш пользовательский ответ…", marketMineSectionTitle: "Ваши товары", marketCreateSectionTitle: "Создать товар", marketUpdateSectionTitle: "Обновить", marketAllSectionTitle: "Рынок", - marketRecentSectionTitle: "Последние товары", marketTitle: "Рынок", marketDescription: "Торговая площадка для обмена товарами или услугами в вашей сети.", marketFilterAll: "ВСЕ", @@ -2863,14 +2409,11 @@ module.exports = { marketItemDeadline: "Срок", marketItemIncludesShipping: "Включена доставка?", marketItemHighestBid: "Наибольшая ставка", - marketItemHighestBidder: "Лидер аукциона", marketItemStock: "Запас", marketOutOfStock: "Нет в наличии", - marketItemBidTime: "Время ставки", marketActionsUpdate: "Обновить", marketUpdateButton: "Обновить", marketActionsDelete: "Удалить", - marketActionsSold: "Отметить как проданное", marketActionsChangeStatus: "ИЗМЕНИТЬ СТАТУС", marketActionsBuy: "КУПИТЬ!", marketAuctionBids: "Текущие ставки", @@ -2879,21 +2422,17 @@ module.exports = { marketNoItems: "Товаров пока нет.", marketYourBid: "Ваша ставка", marketCreateFormImageLabel: "Загрузить медиа (макс: 50MB)", - marketSearchLabel: "Поиск", marketSearchPlaceholder: "Поиск по названию или тегам", marketMinPriceLabel: "Мин. цена", marketMaxPriceLabel: "Макс. цена", - marketSortLabel: "Сортировать по", marketSortRecent: "Самые новые", marketSortPrice: "Цена", marketSortDeadline: "Срок", marketSearchButton: "Поиск", marketAuctionEndsIn: "Завершается", marketAuctionEnded: "Завершён", - marketMyBidBadge: "Ваша ставка", marketNoItemsMatch: "Товаров не найдено.", housingTitle: "Жильё", - housingLabel: "Жильё", housingDescriptionText: "Находите и управляйте местами в вашей сети.", modulesHousingLabel: "Жильё", modulesHousingDescription: "Модуль для поиска и управления местами.", @@ -2937,14 +2476,7 @@ module.exports = { housingAvailableFrom: "Доступно с", housingAvailableTo: "Доступно до", housingTags: "Теги", - housingImages: "Фотографии (макс. 50 МБ каждая)", - housingRemovePhoto: "Убрать", spreadEditWarning: "Этот контент потеряет спреды после редактирования", - housingRemoveVideo: "Убрать видео", - housingAddPhoto: "Добавить фото", - housingAddVideo: "Добавить видео", - housingVideo: "Видео (макс. 50 МБ)", - housingPhotos: "Фотографии", housingRequests: "Запросы", housingRequestButton: "Запросить", housingCancelButton: "Отменить запрос", @@ -3014,7 +2546,6 @@ module.exports = { jobLocationPresencial: "На месте", jobLocationRemote: "Удалённо", jobVacantsPlaceholder: "Количество позиций", - jobSalaryPlaceholder: "Зарплата в ECO за 1 час работы", jobImage: "Загрузить медиа (макс: 50MB)", jobTasks: "Задачи", jobType: "Тип занятости", @@ -3024,7 +2555,6 @@ module.exports = { jobsFilterTop: "ТОП", jobsTopTitle: "Топ вакансий по зарплате", createJobButton: "Опубликовать вакансию", - viewDetailsButton: "Просмотр деталей", noJobsFound: "Вакансий не найдено.", jobAuthor: "Автор", jobTypeFreelance: "Фриланс", @@ -3036,10 +2566,6 @@ module.exports = { jobsHoursOffered: "Предлагаемые часы", jobsHoursRequested: "Часы, запрашиваемые взамен", jobsExchangeSkill: "Запрашиваемый навык в обмен", - jobsHoursOfferedPlaceholder: "напр. 4", - jobsHoursRequestedPlaceholder: "напр. 4", - jobsExchangeSkillPlaceholder: "напр. плотничество, дизайн", - jobExchangeHint: "Для работ по обмену часами заполните поля ниже вместо зарплаты.", jobTimePartial: "Неполная занятость", jobTimeComplete: "Полная занятость", jobsDeleteButton: "УДАЛИТЬ", @@ -3047,27 +2573,16 @@ module.exports = { jobsFilterApplied: "ПОДАННЫЕ", jobsAppliedTitle: "Мои заявки", jobsAppliedBadge: "Подано", - jobsFilterFavs: "Избранное", - jobsFavsTitle: "Избранное", - jobsFilterNeeds: "Нужна помощь", - jobsNeedsTitle: "Нужна помощь", - jobsSearchLabel: "Поиск", jobsSearchPlaceholder: "Поиск по названию, тегам, описанию...", jobsMinSalaryLabel: "Мин. зарплата", jobsMaxSalaryLabel: "Макс. зарплата", - jobsSortLabel: "Сортировать по", jobsSortRecent: "Самые новые", jobsSortSalary: "Самая высокая зарплата", jobsSortSubscribers: "Больше всего заявок", jobsSearchButton: "Поиск", - jobsFavoriteButton: "Добавить в избранное", - jobsUnfavoriteButton: "Удалить из избранного", - jobsMessageAuthorButton: "ЛС", jobsApplicants: "Заявители", jobsUpdatedAt: "Обновлено", - jobNewBadge: "НОВАЯ", jobsTagsLabel: "Теги", - jobsTagsPlaceholder: "тег1, тег2, тег3", noJobsMatch: "Вакансий не найдено.", industrySearchPlaceholder: "Поиск фабрик…", industryAllSectors: "Все секторы", @@ -3075,9 +2590,7 @@ module.exports = { industryAdvanceTo: "Перевести в", industryAmount: "Сумма", industryApproveBuild: "Одобрить", - industryBackToFacility: "← Фабрика", industryBlueprint: "Чертёж", - industryBlueprintLabel: "Промышленный чертёж", industryBlueprints: "Чертежи", industryBuild: "Сборка", industryBuildNotes: "Заметки", @@ -3090,18 +2603,13 @@ module.exports = { industryBuilds: "Сборки", industryBuildTitle: "Название", industryContribute: "Внести вклад", - industryContributeEco: "Внести ECO", - industryContributeLabor: "Внести труд", industryContributeButton: "Внести вклад", - industryContributeMaterial: "Внести материал", industryContributions: "Вклады", - industryContributors: "участники", industryCreateBlueprintButton: "Создать чертёж", industryDistribute: "Распределить", industryDistributeButton: "Распределить по долям", industryDistribution: "Распределение", industryEcoAmount: "Сумма (ECO)", - industryEcoContribHint: "Вклады в ECO передаются управляющему как хранителю казны сборки.", industryEditBlueprint: "Редактировать чертёж", industryFacility: "Фабрика", industryKindLabel: "Тип", @@ -3110,13 +2618,10 @@ module.exports = { industryKind_eco: "Средства", industryLaborHours: "Труд (часы)", industryHours: "Часы", - industryLicense: "Лицензия", industryMaterialItem: "Материал", industryMaterials: "Материалы", - industryMaterialsHint: "Один материал в строке в формате название:количество:цена.", industryEstMaterials: "Итого материалы", industryEstLabor: "Итого труд", - industryEstTaxes: "Налоги", industryEstTotal: "Оценочная цена", industryBuildingPrice: "Цена изготовления", industryFinalPrice: "Итоговая цена", @@ -3126,19 +2631,13 @@ module.exports = { industryNewBlueprint: "Новый чертёж", industryNewBuild: "Предложить сборку", industryEditBuild: "Редактировать производство", - industryNoBlueprint: "— нет —", industryNeedBlueprint: "Сначала создайте чертёж: каждое производство изготавливает его.", industryNoBlueprints: "Пока нет чертежей.", industryNoBuilds: "Пока нет сборок.", industryNote: "Заметка", industryOutput: "Выход", - industryOutputItem: "Название продукта", industryOutputKind: "Тип продукта", - industryOutputQty: "Единиц за производство", - industryOutputUnit: "Единица измерения", industryOutputValue: "Стоимость выхода (ECO, напр. от продажи)", - industryPayout: "Выплата", - industryPoints: "Karma", industryPostJob: "Создать вакансию", industryPot: "Банк", industryProposeBuildButton: "Предложить сборку", @@ -3146,8 +2645,6 @@ module.exports = { industryAuthor: "Автор", industrySellOnMarket: "Отправить на рынок", industrySendToProjects: "Создать проект", - industryShare: "Доля", - industryShares: "Доли", industrySkills: "Навыки", industryTreasury: "Казна", industryKind_physical: "Физический", @@ -3161,6 +2658,16 @@ module.exports = { industryBuildStatus_FAILED: "ПРОВАЛЕНО", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "Вакансия совпадает с вашим резюме", + jobsBotMatchIntro: "Вакансия совпадает с вашим резюме.", + jobsBotMatchJob: "Вакансия", + jobsBotMatchHint: "Вы получаете это, потому что вашим резюме управляет ИИ. Отключить можно в резюме.", + cvAiManaged: "Управление ИИ", + switchOn: "ВКЛ", + switchOff: "ВЫКЛ", + cvAiManagedHint: "Если включено, JobsBot сообщит личным сообщением о подходящей вакансии.", + cvMatchThreshold: "Уведомлять с этого уровня совпадения", housingBotRequestedTitle: "Кто-то запросил одно из ваших мест.", housingBotCancelledTitle: "Запрос на одно из ваших мест отменён.", housingBotYouRequestedTitle: "Вы запросили место.", @@ -3189,22 +2696,14 @@ module.exports = { industryRulesDistribution: "После завершения производства стюард распределяет банк (средства производства плюс стоимость продажи) между участниками пропорционально их долям.", industryRulesTreasury: "Вклады в ECO хранит управляющий как хранитель казны сборки до распределения; все движения записываются в сети, а споры могут идти в Courts.", industryJobs: "Вакансии", - industryNoJobs: "Пока нет вакансий.", - industryCreatePosition: "Создать вакансию", - industryViewCV: "Резюме", industryReportButton: "Пожаловаться", industryCreateTask: "Создать задачу", industryOpenDispute: "Открыть спор", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "напр. шт., кг, лицензия", - industryOutputItemPlaceholder: "напр. робот", - industryOutputQtyPlaceholder: "напр. 5", - industrySkillsPlaceholder: "напр. пайка, сети, солнечная-установка", industryCreateInvite: "Создать приглашение", industryPauseVotes: "Голоса за статус", industryTitle: "Промышленность", industryDescription: "Модуль для коллективного управления средствами производства.", - industryLabel: "Промышленность", typeIndustryBuild: "СБОРКА", typeIndustryBlueprint: "ЧЕРТЁЖ", typeIndustryAllocation: "РАСПРЕДЕЛЕНИЕ", @@ -3253,9 +2752,7 @@ module.exports = { industryInviteNeeded: "Для вступления нужно приглашение.", industryPauseButton: "Голосовать за паузу", industryResumeButton: "Голосовать за возобновление", - industryEditButton: "Редактировать", industryDeleteButton: "Удалить", - industryBackToList: "← Промышленность", industryPendingApplicants: "Ожидающие заявки", industryVotesYes: "да", industryVotesNo: "нет", @@ -3263,23 +2760,13 @@ module.exports = { industryAdmit: "Принять", industryReject: "Отклонить", industryDissolveTitle: "Распустить фабрику", - industryDissolveHint: "Роспуск требует коллективного голосования; управляющий не может распустить её в одиночку.", industryDissolveVote: "Голосовать за роспуск", - industrySector_software: "ПО", - industrySector_hardware: "Оборудование", - industrySector_agriculture: "Сельское хозяйство", - industrySector_textile: "Текстиль", - industrySector_energy: "Энергетика", - industrySector_food: "Продукты", - industrySector_construction: "Строительство", - industrySector_media: "Медиа", - industrySector_services: "Услуги", - industrySector_other: "Другое", industryPolicy_open: "Открытая", industryPolicy_vote: "Голосованием", industryPolicy_invite: "Только по приглашению", projectsTitle: "Проекты", projectsDescription: "Создавайте, финансируйте и следите за проектами сообщества в вашей сети.", + projectSearchPlaceholder: "Поиск проектов...", projectCreateProject: "Создать проект", projectCreateButton: "Создать проект", projectUpdateButton: "ОБНОВИТЬ", @@ -3323,14 +2810,8 @@ module.exports = { projectPledgeTitle: "Поддержать проект", projectPledgePlaceholder: "Сумма в ECO", projectBounties: "Награды", - projectBountiesInputLabel: "Награды (по одной в строке: Название|Сумма [ECO]|Описание)", - projectBountiesPlaceholder: "Исправить баг UI|100|Ссылка на задачу\nНаписать документацию|250|Примеры использования", projectNoBounties: "Наград не найдено.", projectTitle: "Название", - projectAddBountyTitle: "Новая награда", - projectBountyTitle: "Название награды", - projectBountyAmount: "Сумма (ECO)", - projectBountyDescription: "Описание", projectMilestoneSelect: "Выбрать веху", projectBountyCreateButton: "Создать награду", projectBountyStatus: "Статус награды", @@ -3345,19 +2826,15 @@ module.exports = { projectMilestoneTitle: "Название вехи", projectMilestoneTargetPercent: "Процент (%)", projectMilestoneDueDate: "Дата", - projectMilestoneCreateButton: "Создать веху", projectMilestoneStatus: "Статус вехи", projectMilestoneOpen: "открытая", projectMilestoneDone: "завершена", projectMilestoneMarkDone: "Отметить завершённой", projectMilestoneDue: "дата", - projectNoMilestones: "Вех не найдено.", projectMilestoneTitlePlaceholder: "Введите название вехи", projectMilestoneDescriptionPlaceholder: "Введите описание этой вехи", projectMilestoneDescription: "Описание вехи", - projectBudgetGoal: "Бюджет (Цель)", projectBudgetAssigned: "Назначено на награды", - projectBudgetRemaining: "Остаток", projectBudgetOver: "⚠ Превышение бюджета: назначено больше цели", projectFollowers: "Подписчики", projectFollowersTitle: "Подписчики", @@ -3370,7 +2847,6 @@ module.exports = { projectBackersTotalPledged: "Всего поддержано", projectBackersYourPledge: "Ваш взнос", projectBackersNone: "Взносов пока нет.", - projectNoRemainingBudget: "Оставшегося бюджета нет.", projectFilterBackers: "СПОНСОРЫ", projectFilterApplied: "ПОДАННЫЕ", projectAppliedTitle: "ПОДАННЫЕ", @@ -3379,30 +2855,15 @@ module.exports = { projectBackerAmount: "Всего вложено", projectBackerPledges: "Взносы", projectBackerProjects: "Проекты", - projectPledgeAmount: "Сумма", projectSelectMilestoneOrBounty: "Выбрать веху или награду", projectPledgeButton: "Поддержать", footerLicense: "GPLv3", - footerPackage: "Пакет", - footerVersion: "Версия", modulesModuleName: "Имя", modulesModuleDescription: "Описание", modulesModuleStatus: "Статус", modulesTotalModulesLabel: "Загруженные модули", modulesEnabledModulesLabel: "Включённые", modulesDisabledModulesLabel: "Отключённые", - modulesPopularLabel: "Популярное", - modulesPopularDescription: "Модуль для получения популярных, наиболее просматриваемых или комментируемых постов.", - modulesTopicsLabel: "Темы", - modulesTopicsDescription: "Модуль для получения категорий обсуждений на основе общих интересов.", - modulesSummariesLabel: "Резюме", - modulesSummariesDescription: "Модуль для получения резюме длинных обсуждений или постов.", - modulesLatestLabel: "Последние", - modulesLatestDescription: "Модуль для получения последних постов и обсуждений.", - modulesThreadsLabel: "Треды", - modulesThreadsDescription: "Модуль для получения разговоров, сгруппированных по теме или вопросу.", - modulesMultiverseLabel: "Мультивселенная", - modulesMultiverseDescription: "Модуль для получения контента от других федеративных узлов.", modulesInvitesLabel: "Приглашения", modulesInvitesDescription: "Модуль для управления и применения кодов приглашений.", modulesWalletLabel: "Кошелёк", @@ -3443,8 +2904,12 @@ module.exports = { modulesOpinionsDescription: "Модуль для открытия и голосования за мнения.", modulesTransfersLabel: "Переводы", modulesTransfersDescription: "Модуль для открытия и управления смарт-контрактами (переводами).", - modulesFediverseLabel: "Федиверс", - modulesFediverseDescription: "Управляйте своими другими аккаунтами федиверса, включая отправку и получение контента.", + modulesFediverseLabel: "Мультивселенная", + modulesBlogsLabel: "Блоги", + modulesBlogsDescription: "Модуль для поиска и управления блогами.", + modulesPollsLabel: "Опросы", + modulesPollsDescription: "Модуль, чтобы спросить сеть и подсчитать ответы.", + modulesFediverseDescription: "Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.", modulesFeedLabel: "Лента", modulesFeedDescription: "Модуль для открытия и публикации коротких текстов (лента).", modulesParliamentLabel: "Парламент", @@ -3480,45 +2945,37 @@ module.exports = { visibilityMakeHidden: "Скрыть", invitesInhabitantsTitle: "Жители", invitesInhabitantsFollow: "Подписаться", - aiNavPlaceholder: "Куда вы хотите перейти?", + aiNavPlaceholder: "Опишите, что вам нужно...", aiNavDisabled: "Навигация с ИИ отключена.", - aiNavResultsTitle: "Предложения навигации с ИИ", + aiNavResultsTitle: "Подсказки AINav", aiNavQueryLabel: "Запрос", - aiNavResultsDescription: "Выберите маршрут, наиболее подходящий вашему запросу.", - aiNavResultPath: "Маршрут", - aiNavResultDescription: "Что можно сделать", aiNavResultMatch: "Совпадение", aiNavResultsEmpty: "Подходящих маршрутов нет. Попробуйте /search.", - aiNavSearchInstead: "Поиск вместо этого", modulesAINavLabel: "AINav", modulesAINavDescription: "Модуль для запросов на естественном языке к содержимому сети.", - directConnect: "Прямое подключение", directConnectDescription: "Подключитесь напрямую к узлу, введя его IP-адрес, порт и публичный ключ. Узел будет добавлен как отслеживаемое соединение.", peerHost: "IP", peerPort: "Порт (по умолчанию: 8008)", peerPublicKey: "Публичный ключ (@...ed25519)", connectAndFollow: "Подключиться", - deviceSourceLabel: "Источник устройства", modulesPresetTitle: "Общие конфигурации", - modulesPreset_minimal: "Минимальный", - modulesPreset_basic: "Базовая", - modulesPreset_social: "Социальный", - modulesPreset_economy: "Экономическая", - modulesPreset_full: "Полная", + workflowsTitle: "Рабочие режимы", + workflowsDescription: "Режим задаёт тему и набор активных модулей.", + workflowsSet: "Применить режим", + workflow_default: "По умолчанию", + workflow_jobs: "Работа", + workflow_ruling: "Управление", + workflow_politics: "Политика", + workflow_social: "Общение", + workflow_business: "Бизнес", + workflow_night: "Ночь", + workflow_mobile: "Мобильный", statsCarbonFootprintTitle: "Углеродный след", - statsCarbonFootprintNetwork: "Углеродный след сети", - statsCarbonFootprintYours: "Ваш углеродный след", statsCarbonTombstone: "Углеродный след надгробий", - feedSuccessMsg: "Пост успешно опубликован!", - dominantOpinionLabel: "Доминирующее мнение", uploadMedia: "Загрузить медиа (макс: 50MB)", - feedViewDetails: "Просмотр деталей", feedOpenDiscussion: "Открыть обсуждение", feedDetailTitle: "Лента", feedPostComment: "Опубликовать комментарий", - eventFileLabel: "Прикрепить изображение", - taskFileLabel: "Прикрепить изображение", - courtsRespondentRequired: "ID ответчика обязателен", courtsRespondentInvalid: "Должен быть действительным SSB ID (@...ed25519)", noComments: "Пока нет комментариев", bankAllocId: "ID распределения", @@ -3552,14 +3009,13 @@ module.exports = { mapDescriptionLabel: "Описание", mapDescriptionPlaceholder: "Опишите карту или местоположение...", mapTypeLabel: "Тип карты", - mapTypeSingle: "ОДИНОЧНЫЙ (только начальное местоположение)", - mapTypeOpen: "ОТКРЫТЫЙ (любой может добавлять маркеры)", - mapTypeClosed: "ЗАКРЫТЫЙ (только создатель добавляет маркеры)", + mapInviteMode: "Приглашение", + mapTypeSingle: "ОДИНОЧНЫЙ", + mapTypeOpen: "ОТКРЫТЫЙ", + mapTypeClosed: "ЗАКРЫТЫЙ", mapTagsLabel: "Теги", mapTagsPlaceholder: "Введите теги через запятую", mapUrlLabel: "URL карты", - mapPickCoordLabel: "Или выберите местоположение на сетке:", - mapMarkersLabel: "маркеры", mapMarkersTitle: "Маркеры", mapMarkerDefault: "Маркер", mapMarkerLatLabel: "Широта маркера", @@ -3586,14 +3042,9 @@ module.exports = { padTitle: "Пад", modulesPadsLabel: "Пады", modulesPadsDescription: "Модуль для управления совместными текстовыми редакторами.", - padFilterAll: "ВСЕ", - padFilterMine: "МОИ", - padFilterRecent: "НЕДАВНИЕ", - padFilterOpen: "ОТКРЫТЫЕ", - padFilterClosed: "ЗАКРЫТЫЕ", padCreate: "Создать Пад", - padUpdate: "Обновить Пад", - padDelete: "Удалить Пад", + padUpdate: "Обновить", + padDelete: "Удалить", padTitleLabel: "Заголовок", padTitlePlaceholder: "Введите заголовок пада...", padStatusLabel: "Статус", @@ -3604,14 +3055,7 @@ module.exports = { padTagsLabel: "Теги", padTagsPlaceholder: "тег1, тег2, ...", padMembersLabel: "Участники", - padVisitPad: "Посетить Пад", - padShareUrl: "Поделиться URL", padCreated: "Создано", - padAuthor: "Автор", - padGenerateCode: "Сгенерировать Код", - padInviteCodeLabel: "Код Приглашения", - padInviteCodePlaceholder: "Введите код приглашения...", - padValidateInvite: "Проверить", padStartEditing: "НАЧАТЬ РЕДАКТИРОВАНИЕ!", padEditorPlaceholder: "Начните писать...", padSubmitEntry: "Отправить", @@ -3624,12 +3068,11 @@ module.exports = { padClosedSectionTitle: "Закрытые Пады", padCreateSectionTitle: "Создать Новый Пад", padUpdateSectionTitle: "Обновить Пад", - padInviteGenerated: "Код Приглашения Сгенерирован", typePad: "ПАДЫ", padNew: "НОВЫЙ", padAddFavorite: "Добавить в Избранное", padRemoveFavorite: "Удалить из Избранного", - padClose: "Закрыть Pad", + padClose: "Закрыть", padBackToEditor: "Назад к редактору", padSearchPlaceholder: "Поиск падов...", @@ -3637,8 +3080,6 @@ module.exports = { modulesChatsDescription: "Модуль для обнаружения и управления зашифрованными чатами.", typeChat: "ЧАТЫ", typeChatMessage: "СООБЩЕНИЕ ЧАТА", - chatLabel: "ЧАТЫ", - chatMessageLabel: "СООБЩЕНИЯ ЧАТА", chatsTitle: "Чаты", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3646,56 +3087,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "Описание", - chatMessageReply: "Ответ", - chatMessageLabel: "Сообщение", chatCategory: "Категория", chatStatus: "СТАТУС", - chatFilterAll: "ВСЕ", - chatFilterMine: "МОИ", - chatFilterRecent: "НЕДАВНИЕ", - chatFilterFavorites: "ИЗБРАННОЕ", - chatFilterOpen: "ОТКРЫТЫЕ", - chatFilterClosed: "ЗАКРЫТЫЕ", chatCreate: "Создать Чат", - chatUpdate: "Обновить Чат", - chatDelete: "Удалить Чат", + chatUpdate: "Обновить", + chatDelete: "Удалить", chatClose: "Закрыть Чат", chatVisitChat: "ПЕРЕЙТИ В ЧАТ", chatUntitled: "Чат без названия", chatNoItems: "Чаты не найдены.", chatParticipants: "Участники", - chatStartChatting: "НАЧАТЬ ОБЩЕНИЕ!", - chatGenerateCode: "Создать Код", - chatShareUrl: "Поделиться URL", + chatMessagesLabel: "Сообщения", + chatThreadsLabel: "Темы", chatCreatedAt: "СОЗДАН", chatSearchPlaceholder: "Поиск чатов...", chatStatusOpen: "ОТКРЫТЫЙ", chatStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ", chatStatusClosed: "ЗАКРЫТЫЙ", chatSendMessage: "Отправить", + chatJumpLatest: "Последнее сообщение", + chatPickChat: "Выберите чат, чтобы открыть его", + chatNoneYet: "Пока нет доступных чатов.", + activitySearchPlaceholder: "Поиск по активности...", + trendingSearchPlaceholder: "Поиск в трендах...", + opinionsSearchPlaceholder: "Поиск в мнениях...", + votesSearchPlaceholder: "Поиск в голосованиях...", + welcomeStepUxTitle: "Выберите интерфейс", + welcomeStepUxText: "Выберите вид Oasis. Потом можно изменить в настройках.", + welcomeStepUxAction: "Использовать этот вид", + chatRateLimitTitle: "Слишком много сообщений", + chatRateLimitMessage: "Вы достигли лимита сообщений этой комнаты за час. Попробуйте позже.", chatMessagePlaceholder: "Введите сообщение...", chatNoMessages: "Сообщений пока нет.", - chatLeave: "Покинуть Чат", - chatInviteCodeLabel: "Введите код приглашения", - chatJoinByInvite: "Войти", chatTitlePlaceholder: "Название чата", chatDescriptionPlaceholder: "Описание чата", chatTagsPlaceholder: "тег1, тег2, тег3", chatImageLabel: "Выбрать файл изображения (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "Код Приглашения", chatAuthor: "Автор", - chatCreated: "Создан", chatAddFavorite: "Добавить в Избранное", chatRemoveFavorite: "Убрать из Избранного", chatPM: "ЛС", chatStatusLabel: "Статус", chatCategoryLabel: "Категория", - chatParticipantsLabel: "Участники", gamesTitle: "Игры", gamesDescription: "Откройте и играйте в игры.", gamesFilterAll: "ВСЕ", gamesPlayButton: "ИГРАТЬ!", - gamesBackToGames: "Назад к играм", modulesGamesLabel: "Игры", modulesGamesDescription: "Модуль для открытия и игры в игры.", modulesGraphosLabel: "Графос", @@ -3712,8 +3149,6 @@ module.exports = { gamesArkanoidDesc: "Разбейте все кирпичи своей ракеткой и мячом. Классическая аркада.", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "Классический пинг-понг против ИИ. Первый до 5 очков побеждает.", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "Гонка со временем! Уворачивайтесь от машин и доберитесь до финиша вовремя.", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "Пилотируйте корабль через астероидное поле. Уничтожайте их до столкновения.", gamesRockPaperScissorsTitle: "Камень Ножницы Бумага", @@ -3734,8 +3169,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3746,12 +3179,6 @@ module.exports = { modulesCalendarsLabel: "Календари", modulesCalendarsDescription: "Модуль для просмотра и управления календарями.", typeCalendar: "КАЛЕНДАРИ", - calendarFilterAll: "ВСЕ", - calendarFilterMine: "МОИ", - calendarFilterOpen: "ОТКРЫТЫЕ", - calendarFilterClosed: "ЗАКРЫТЫЕ", - calendarFilterRecent: "НЕДАВНИЕ", - calendarFilterFavorites: "ИЗБРАННОЕ", calendarCreate: "Создать календарь", calendarUpdate: "Обновить", calendarDelete: "Удалить", @@ -3764,24 +3191,17 @@ module.exports = { calendarTagsLabel: "Теги", calendarTagsPlaceholder: "тег1, тег2...", calendarParticipantsLabel: "Участники", - calendarParticipantsCount: "Участники", - calendarVisitCalendar: "Открыть календарь", calendarCreated: "Создан", - calendarAuthor: "Автор", calendarJoin: "Присоединиться", calendarGenerateInvite: "Создать приглашение", - calendarInviteCodePlaceholder: "Введите код приглашения...", - calendarValidateInvite: "Проверить код", - calendarJoined: "Участник", - calendarAddDate: "Добавить дату", - calendarAddNote: "Добавить заметку", calendarDateLabel: "Дата", calendarDatePlaceholder: "Опишите эту дату...", - calendarNoteLabel: "Заметка", + calendarNoteLabel: "Заметки", calendarNotePlaceholder: "Добавить заметку...", calendarFirstDateLabel: "Дата", calendarFirstNoteLabel: "Заметки", calendarIntervalLabel: "Interval", + calendarIntervalNone: "Без повторения", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3792,8 +3212,6 @@ module.exports = { calendarsDescription: "Находите и управляйте календарями в вашей сети.", calendarMonthPrev: "← Назад", calendarMonthNext: "Вперёд →", - calendarMonthLabel: "Даты", - calendarsShareUrl: "Поделиться URL", calendarAllSectionTitle: "Календари", calendarRecentSectionTitle: "Недавние календари", calendarFavoritesSectionTitle: "Избранное", @@ -3807,7 +3225,6 @@ module.exports = { calendarRemoveFavorite: "Убрать из избранного", calendarSearchPlaceholder: "Поиск календарей...", calendarAddEntry: "Добавить запись", - calendarLeave: "Покинуть календарь", statsCalendar: "Календари", statsCalendarDate: "Даты календаря", statsCalendarNote: "Заметки календаря", @@ -3854,7 +3271,6 @@ module.exports = { torrentSortOldest: "Самые старые", torrentSortTop: "Самые популярные", torrentNoMatch: "Совпадений не найдено.", - torrentMessageAuthorButton: "Написать Автору", torrentUpdatedAt: "Обновлено", statsTorrent: "Торренты", typeTorrent: "ТОРРЕНТЫ", @@ -3862,10 +3278,18 @@ module.exports = { modulesTorrentsDescription: "Модуль для поиска и управления торрентами.", favoritesFilterTorrents: "ТОРРЕНТЫ", favoritesFilterMarket: "РЫНОК", + favoritesFilterEvents: "СОБЫТИЯ", + favoritesFilterForum: "ФОРУМ", + favoritesFilterHousing: "ЖИЛЬЁ", + favoritesFilterJobs: "ВАКАНСИИ", + favoritesFilterProjects: "ПРОЕКТЫ", + favoritesFilterReports: "ОТЧЁТЫ", + favoritesFilterTasks: "ЗАДАЧИ", + favoritesFilterTransfers: "ПЕРЕВОДЫ", + favoritesFilterVotes: "ГОЛОСОВАНИЯ", favoritesFilterShopProducts: "ТОВАРЫ МАГАЗИНА", tribeSectionTorrents: "ТОРРЕНТЫ", tribeCreateTorrent: "Загрузить Торрент", - tribeMediaTypeTorrent: "Торрент", settingsWishTitle: "Желание", settingsWishDesc: "Настройте желание вашего Аватара.", settingsWishWhole: "Multiverse", @@ -3876,16 +3300,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "Исходящие — защита UX. Входящие — фильтр внимания.", - pmBlockedNonMutual: "Личные сообщения можно отправлять только жителям со взаимной поддержкой.", inhabitantsPendingFollowsTitle: "Ожидающие запросы на поддержку", inhabitantsPendingAccept: "Принять", inhabitantsPendingReject: "Отклонить", - bxEncrypted: "ЗАШИФРОВАНО", - bxEncryptedHexLabel: "Шифротекст (превью)", tribeSectionGovernance: "УПРАВЛЕНИЕ", - tribeSubStatusPublic: "ПУБЛИЧНАЯ", - tribeSubStatusPrivate: "ЧАСТНАЯ", - tribeSubInheritedPrivate: "ЧАСТНАЯ (унаследовано от главного племени)", tribePadInviteRequired: "Нет доступа к паду. Запросите приглашение.", tribeChatInviteRequired: "Нет доступа к чату. Запросите приглашение.", tribeGovernanceDesc: "Внутреннее управление этим племенем.", @@ -3925,44 +3343,31 @@ module.exports = { tribeGovNoHistorical: "Пока нет ни одной записи", logsTitle: "Журнал", logsDescription: "Записывайте свой опыт в сети.", - logsReadMore: "Читать далее", logsViewTitle: "Журнал", logsColumnType: "Тип", logsView: "Смотреть", - logsManualPrompt: "Напишите ваш журнал", logsUpdateButton: "Обновить", - logsEditTitle: "Редактировать запись", - logsCreateDescription: "Записывайте свой опыт...", + logsEditTitle: "Обновить запись", logsCreateTitle: "Создать запись", logsWriteButton: "Написать", logsTextPlaceholder: "Опишите ваши впечатления...", - logsTextField: "Текст", - logsLabelPlaceholder: "Метка...", - logsLabelField: "Напишите ваш журнал (метка)", - logsAiDisabledWarn: "Включите модуль ИИ в /modules для записей от ИИ.", - logsAiContextValue: "День блокчейна", - logsAiContext: "Контекст", - logsAiModStatus: "AImod", - logsModeApply: "Применить!", logsModeAIWritten: "AI-Assistant", logsModeManual: "Вручную", logsModeAI: "ИИ", - logsColumnDelete: "Удалить", - logsColumnEdit: "Редактировать", logsColumnLog: "Журнал", logsColumnDate: "Дата", logsDelete: "Удалить", - logsEdit: "Редактировать", + logsEdit: "Обновить", logsFilterAlways: "ВСЕГДА", logsFilterYear: "ГОД", logsFilterMonth: "МЕСЯЦ", logsFilterWeek: "НЕДЕЛЯ", logsFilterToday: "СЕГОДНЯ", - logsFilterRecent: "НЕДАВНИЕ", - logsFilterAll: "ВСЕ", + logsComments: "Комментарии", + logsAuthorEntries: "Записи", logsCreate: "Создать запись", logsExport: "Экспорт журнала", - logsExportOne: "Экспорт", + logsExportOne: "Экспортировать запись", logsViewDetails: "Подробнее", logsGenerateButton: "Сгенерировать текст", logsSearchText: "Искать в журналах...", @@ -3972,31 +3377,25 @@ module.exports = { modulesLogsLabel: "Журнал", modulesLogsDescription: "Модуль для записи (с помощью ИИ-ассистента) ваших впечатлений.", statsLogsTitle: "Журнал", - statsLogsEntries: "Записи", typeLog: "ЖУРНАЛ", - blockchainCycle: "Цикл", larpTitle: "L.A.R.P.", larpDescription: "Слой ролевой игры в реальном времени для совместных экспериментов.", + larpNoHousesMatch: "Нет домов, соответствующих запросу.", + larpSearchPlaceholder: "Поиск домов...", larpAllHouses: "Дома:", larpFilterRuling: "ПРАВИТ", larpFilterHouses: "ДОМА", larpFilterRules: "FAQ", larpRulesTitle: "L.A.R.P. FAQ", - larpRulesEntryTitle: "Стартовый дом", larpRulesEntryText: "Каждый житель по умолчанию начинает в ACADEMIA. Из ACADEMIA выберите дом в панели «Вступить в дом»: это откроет вступительный тест. Ответьте на 10 вопросов и отправьте. Если вы преодолеете порог (7/10), вы будете автоматически приняты в этот дом; иначе вас отклонят, и вы останетесь в ACADEMIA. В любом случае система записывает ваш OasisID и цикл попытки и не даёт повторить попытку до окончания периода ожидания в 30 циклов.", - larpRulesLeaveText: "Участники любого дома могут вернуться в ACADEMIA в любое время со страницы своего дома; это сбрасывает их членство, но не отменяет ожидание теста.", - larpRulesGovernanceTitle: "Стена управления", larpRulesGovernanceText: "В свой цикл правящий дом носит значок «Правит» и является единственным, чья Стена показывается публично под вкладкой ПРАВИТ.", - larpRulesSignTitle: "Эмблема L.A.R.P.", + larpRulesWallText: "У каждого дома есть Стена, где пишут его участники. Стена дома закрыта, кроме стены правящего дома и стены ACADEMIA, которые может читать любой.", larpRulesSignText: "Жители могут включить (в /profile/edit > Сенсоры) показ изображения своего текущего дома как знака в профиле, на карточке автора и жителя. Знак ведёт на страницу дома.", larpPostsTitle: "Стена", larpPostsEmpty: "Пока нет публикаций.", - larpPostLabel: "Новая публикация", larpPostPlaceholder: "Что должен сказать этот дом?", - larpPostPublic: "Публичная (видно всем, иначе только участникам)", larpPostSubmit: "Опубликовать", - larpPostMembersOnly: "Только участники", larpCycleLabel: "Цикл:", audioBackToBcs: "Back to BCS", audioFilterBcs: "BCS", @@ -4113,12 +3512,9 @@ module.exports = { bankTaxesLookupNote: "Введите ID блока, чтобы найти его в вашем локальном канале.", bankTaxesUserNoteChipsClick: "Нажмите на любой чип, чтобы проверить его блок в blockexplorer.", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "Код приглашения", larpRulesInviteEntryText: "Участники домов могут создавать коды приглашения, дающие прямой доступ к дому.", larpRulesOneHouseText: "Вы можете быть участником не более одного дома в любой момент. Если ни в одном — вы в ACADEMIA. Каждая страница дома (кроме ACADEMIA) показывает участникам кнопку «Покинуть Дом», которая сбрасывает членство к ACADEMIA. Выход НЕ отменяет ожидание теста.", - larpRulesOneHouseTitle: "По одному дому за раз", - larpRulesTestEntry: "WILL-тест", - larpRulesTestEntryText: "Каждый вариант взвешивает один или несколько домов; при отправке система суммирует баллы и автоматически принимает вас в дом с наибольшим количеством баллов.", + larpRulesTestEntryText: "В тесте WILL каждый вариант даёт вес одному или нескольким домам; при отправке система суммирует баллы и автоматически принимает вас в дом с наибольшим счётом.", larpWillTestHint: "После завершения вам будет назначен дом, который лучше всего соответствует вашим ответам. Ваши индивидуальные ответы обрабатываются локально и никогда не сохраняются — в ваш канал публикуется только результат назначения дома.", larpWillTestTitle: "WILL-тест", settingsLanDesc: "Периодически анонсировать этот узел другим экземплярам Oasis в той же локальной сети. Отключите, чтобы остановить UDP-вещание.", @@ -4137,31 +3533,27 @@ module.exports = { aiExchangeMarkHelpful: "+1 полезно", larpCyclesUntilRuling: "Следующий цикл управления", larpVisitTribe: "Посетить племя", + larpStartJourney: "Начать путь", larpGoverning: "Правит:", + larpStartHere: "Начните здесь:", larpMyHouse: "Мой дом:", larpMembersCount: "Участники", - larpMembersTitle: "Участники", - larpNoMembers: "Пока нет участников.", larpRolesLabel: "Роли", larpFunctionLabel: "Функция", larpMonthLabel: "Цикл управления", larpLeaveToAcademia: "Вернуться в ACADEMIA", - larpAcademiaJoinTitle: "Вступить в дом", - larpAcademiaJoinHint: "Пройдите психологический тест профиля, чтобы вас отнесли к дому, который больше всего вам подходит, или используйте код приглашения, которым поделился участник одного из домов.", - larpTakeTestButton: "Пройти тест профиля", + larpAcademiaJoinTitle: "Дома L.A.R.P.", larpInviteRedeem: "Вступить в Дом", larpInviteCreate: "Создать код приглашения", larpInvitePlaceholder: "Код приглашения", larpInviteBannerTitle: "Новый код приглашения", larpInviteBannerHint: "Поделитесь этим кодом с кем-то в ACADEMIA. Срок действия — 30 циклов или одно использование.", - larpTestAssignedHouse: "Назначенный дом", larpTestRankingTitle: "Очки по домам", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "Код приглашения дома", invitesHouseJoinButton: "Вступить в Дом", larpLastAttemptTitle: "Ваша последняя попытка", larpLastAttemptHouse: "Дом", - larpLastAttemptResult: "Результат", larpLastAttemptWhen: "Когда", larpLastAttemptCooldown: "Следующая попытка через", larpTestTitle: "Вступительный тест", @@ -4170,37 +3562,14 @@ module.exports = { larpTestCooldownActive: "Следующий тест доступен через", larpTestCooldownDays: "циклов", larpTestResultTitle: "Результат теста", - larpTestPassed: "Тест пройден — добро пожаловать!", - larpTestFailed: "Тест не пройден", larpTestScore: "Очки", larpTestNextAttempt: "Вы сможете пройти ещё один тест через 30 циклов.", larpGoToHouse: "Перейти в свой дом", larpBackToAcademia: "Назад в ACADEMIA", - larpBackToHouses: "◀ Дома", larpBadgeYou: "Вы", larpBadgeRuling: "Правит", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Модуль слоя ролевой игры в реальном времени Oasis (9 Домов).", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - ecoinTaxLabel: "ECOin Tax", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - statsEcoTaxTitle: "ECO Tax", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - audioBackToAudio: "Back to audio", - audioAuthorLabel: "Author", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "Столкнувшись со сложной проблемой, что вы делаете в первую очередь?", larpProfileQ1O1: "Говорить с другими, чтобы найти консенсус", larpProfileQ1O2: "Создать прототип для проверки", diff --git a/src/client/assets/translations/oasis_zh.js b/src/client/assets/translations/oasis_zh.js index 9db6873..4080916 100644 --- a/src/client/assets/translations/oasis_zh.js +++ b/src/client/assets/translations/oasis_zh.js @@ -1,7 +1,6 @@ const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); module.exports = { zh: { - languageName: "中文", shopOrderStatusPaid: "已收款", shopOrderStatusReceived: "已收到", shopOrderMarkPaid: "标记已收款", @@ -12,20 +11,16 @@ module.exports = { shopMyOrdersEmpty: "你还没有购买记录。", shopOrderPmSeller: "PM Seller", shopOrderSeller: "卖家", - shopOrderPaymentConcept: "付款", shopOrderInvoice: "发票", shopOrderInvoiceConcept: "发票", shopOrderStatusPending: "待处理", shopOrderStatusAccepted: "已接受", shopOrderStatusRejected: "已拒绝", shopOrderStatusShipped: "已发货", - shopOrderStatusDelivered: "已送达", shopOrderAccept: "接受", shopOrderReject: "拒绝", shopOrderMarkShipped: "标记为已发货", - shopOrderMarkDelivered: "标记为已送达", shopOrderPmBuyer: "PM Buyer", - shopOrderGenerateContract: "智能合约", shopOrderContractConcept: "商店订单", shopOrdersPending: "待处理订单", all: "全部", @@ -55,14 +50,13 @@ module.exports = { viewJson: "查看 JSON", matchScore: "匹配度", preferencesLabel: "偏好", - inhabitantProfileTitle: "居民资料", + inhabitantProfileTitle: "居民", contentWarningLabel: "内容警告", invalidPost: "无效内容", invalidPostHint: "此消息文本无效或为空。", spreadBy: "由", spreadChron: "传播", spreaded: "已传播", - spreadMore: "更多", spreadContentUnavailable: "内容尚不可用(等待同步)", filteredByTag: "按标签筛选", filteredByTagTitle: "按标签筛选", @@ -80,10 +74,8 @@ module.exports = { noSeverity: "无严重程度", calendarDeleteDate: "删除日期", calendarIntervalUntil: "直到", - bookmarkCategory: "分类", bookmarkLastVisit: "最近访问", profileClearnetBookmarksLabel: "书签", - forumFilterHot: "热门", invitesPort: "端口", currentlyUnrecheable: "错误!", peerHostValidation: "有效的 IPv4(如 192.168.1.100)或主机名(如 pub.example.com)", @@ -145,6 +137,12 @@ module.exports = { statsCarbonMaxAnnual: "年度最大估计", statsCarbonNetwork: "网络总计", statsCarbonOfEstMax: "占估计最大容量", + statsCarbonYearProgress: "年度已过", + statsNetworkTitle: "网络", + statsStorageTitle: "存储", + statsEcoTaxTitle: "ECO 税", + statsAccountTitle: "账户", + statsAveragesTitle: "平均值", statsCarbonOfNetwork: "占网络总计", statsCarbonUser: "你的足迹", statsContentCountColumn: "数量", @@ -156,10 +154,6 @@ module.exports = { statsTopTagsTitle: "热门标签", statsTopTypesTitle: "热门内容类型", statsTotalMsgs: "消息总数", - feedViewDetails: "查看详情", - eventFileLabel: "附加图片", - taskFileLabel: "附加图片", - courtsRespondentRequired: "需要被告ID", extended: "多元宇宙", extendedDescription: [ "当你支持某人时,你可能会下载他们所支持的居民的帖子,这些帖子会显示在这里,按时间倒序排列。", @@ -203,36 +197,27 @@ module.exports = { graphosShowing: "显示", graphosYou: "你", graphosTotalNodes: "节点总数", - manualMode: "手动模式", mentions: "提及", mentionsDescription: [ - strong("@提及你的帖子"), - ",按时间倒序排列。", + strong("每一条 @提到你的消息"), + "。", ], - nextPage: "下一页", - previousPage: "上一页", noMentions: "你还没有收到@提及。", + mentionsSearchPlaceholder: "搜索提及...", privateReminders: "提醒", inboxFiltersLabel: "筛选:", inboxToggleToMutuals: "切换为相互关注", inboxToggleToWhole: "切换为所有人", - privateFrom: "发件人", - privateTo: "收件人", privateDate: "日期", pmReply: "回复", pmReplies: "回复", - pmNew: "新消息", - pmMarkRead: "标记为已读", inReplyTo: "回复", pmPreview: "预览", pmPreviewTitle: "消息预览", peers: "节点", searchDescription: "描述", - imageSearch: "图片搜索", searchFromLabel: "从", searchToLabel: "到", - searchMinOpinionsLabel: "最少意见", - searchInhabitantLabel: "居民 (Oasis ID)", searchQueryLabel: "查询", searchPerPageLabel: "每页结果数", settings: "设置", @@ -245,68 +230,39 @@ module.exports = { melodyDescription: '播放你区块链的旋律 — 每个区块都会变成一个音符。', melodyEmpty: '还没有音符 — 你的区块链尚未产生任何区块。', melodyCompositionTitle: '作曲', - melodyCompositionHelp: '区块链中的每个区块都会根据其类型和大小变成一个音符。', - melodyStatsTitle: '类型分布', - melodyInhabitantLabel: '居民', melodyTotalBlocks: '音符', - melodyType: '类型', - melodyCount: '区块', melodyFilterMine: '我的', melodyFilterAll: '全部', - melodyFilterShare: '上传旋律', - melodyShareTitle: '分享你的旋律', - melodyShareHelp: '发布你当前旋律的快照,让别人收听和重新混音。', - melodyShareTitleLabel: '标题(可选)', - melodyShareTitlePlaceholder: '区块链幽灵', - melodyShareSubmit: '发布旋律', - melodyNoShared: '还没有区块链旋律。', melodyRegenerate: '重新生成', melodyDownload: "下载 BCS", - profileActivityTitle: '活动', - profileActivityMore: '查看所有活动', profileContentSectionTitle: '头像内容', profileContentHelp: '选择在你的头像中显示哪些模块。', profileSensorsHelp: '头像中显示的可选指标。', profileClearnetHelp: '可以从 Oasis 外部访问的模块。', profileHubAll: '全部', - profileHubTitle: '公开内容', - footerPulseTitle: '脉搏', - footerPulsePeers: '节点', - footerPulseInbox: '收件箱', - footerPulseSync: '上次同步', - footerPulseEcoValue: 'ECO/小时', - footerPulseLastActivity: '最近活动', footerLicenseLabel: '许可证', profileSwitchToOasis: '返回 Oasis', - profileSwitchToClearnet: '进入 Clearnet', - profileVisibilityFediverse: "联邦宇宙", - profileSwitchToFediverse: "潜入联邦宇宙", - coordLabel: '坐标(例如 A3)', - coordPlaceholder: '输入坐标', + profileVisibilityFediverse: "多元宇宙", contributorsTitle: "贡献者", - pixeliaBy: "作者", colorLabel: '选择颜色', paintButton: '画!', - invalidCoordinate: '坐标无效', - goToMuralButton: "查看壁画", totalPixels: '总像素数', modules: "模块", modulesViewTitle: "模块", modulesViewDescription: "通过启用或禁用模块来设置你的环境。", inbox: "收件箱", multiverse: "多元宇宙", - fediverse: "联邦宇宙", - fediverseDescription: "管理你的其他联邦宇宙账户,包括发送和接收内容。", + fediverse: "多元宇宙", + fediverseDescription: "管理你的其他多元宇宙账户,包括发送和接收内容。", fediverseStatus: "状态", - fediverseDisconnected: "联邦宇宙已断开。请检查%LINK%或连接状态。", - fediverseSettingsTitle: "联邦宇宙", + fediverseDisconnected: "多元宇宙已断开。请检查%LINK%或连接状态。", + fediverseSettingsTitle: "多元宇宙", fediverseInstanceLabel: "地址", fediverseTokenLabel: "访问令牌", fediverseTokenHelp: "设置你的访问令牌。它将用于在 Oasis 中管理你的 Mastodon 账户。", fediverseConnect: "连接", fediverseConnectedAs: "已连接为", fediverseDisconnect: "断开连接", - fediverseEmpty: "当你从%LINK%连接其他联邦宇宙账户后,便可在此管理它们。", fediverseEmptyLink: "设置", fediverseComposePlaceholder: "在想什么?", fediverseReplyPlaceholder: "写下你的回复…", @@ -315,21 +271,15 @@ module.exports = { fediverseReply: "回复", fediverseBoosted: "转嗷了", fediverseNoPosts: "你的时间线是空的。", - fediverseThread: "讨论串", fediverseTimeline: "时间线", - fediverseManageTimeline: "管理时间线", fediverseFollowers: "关注者", fediverseFollowing: "正在关注", fediversePosts: "嘟文", fediverseJoined: "加入于", - fediverseOverview: "概览", fediverseRefresh: "刷新", fediverseWrite: "撰写", fediversePreview: "预览", - fediverseEdit: "编辑", - fediverseOpenFeed: "查看信息流", fediverseManage: "管理", - fediverseStatusNotConnected: "未连接", fediverseError: "无法连接 Mastodon。", fediverseErrInstance: "实例地址无效。", fediverseErrAuth: "令牌无效或已过期。", @@ -340,17 +290,6 @@ module.exports = { fediverseErrPost: "无法发布。", fediverseErrMedia: "无法上传文件。", fediverseErrEmpty: "写点什么或添加文件。", - popularLabel: "精选", - topicsLabel: "话题", - latestLabel: "最新", - summariesLabel: "摘要", - threadsLabel: "讨论串", - multiverseLabel: "多元宇宙", - inboxLabel: "收件箱", - invitesLabel: "邀请", - walletLabel: "钱包", - legacyLabel: "密钥", - cipherLabel: "加密器", bookmarksLabel: "书签", videosLabel: "视频", torrentsLabel: "种子", @@ -361,18 +300,14 @@ module.exports = { inhabitantsLabel: "居民", trendingLabel: "热门", eventsLabel: "活动", - tasksLabel: "任务", apply: "应用", menuPersonal: "个人", - menuContent: "内容", - menuBlogs: "博客", menuGovernance: "治理", menuOffice: "办公", - menuMultiverse: "多元宇宙", - menuNetwork: "网络", + menuNetwork: "社区", menuCreative: "创意", menuEconomy: "经济", - menuMedia: "媒体", + menuMedia: "资料库", menuTools: "工具", comment: "评论", subtopic: "子话题", @@ -382,13 +317,6 @@ module.exports = { follow: "支持", block: "屏蔽", unblock: "取消屏蔽", - newerPosts: "更新的帖子", - olderPosts: "更早的帖子", - feedRangeEmpty: "该范围内没有内容。请尝试查看", - seeFullFeed: "完整动态", - feedEmpty: "Oasis 网络从未见过此账户的帖子。", - beginningOfFeed: "这是动态的起始位置", - noNewerPosts: "尚未收到更新的帖子。", relationshipNotFollowing: "你未被支持", relationshipTheyFollow: "支持你", relationshipMutuals: "互相支持", @@ -398,16 +326,12 @@ module.exports = { relationshipBlockedBy: "你被屏蔽了", relationshipMutualBlock: "互相屏蔽", relationshipNone: "你未支持", - relationshipConflict: "冲突", relationshipBlockingPost: "已屏蔽的帖子", viewLikes: "查看传播", spreadedDescription: "该居民传播的帖子列表。", - totalspreads: "总传播数", - attachFiles: "附加文件", preview: "预览", publish: "写作", contentWarningPlaceholder: "为帖子添加主题(可选)", - privateWarningPlaceholder: "添加居民以发送私密帖子(可选)", publishWarningPlaceholder: "正文上限 7000 个字符。", publishTooLong: "你的帖子太长了,请缩短。", publishCustomDescription: [ @@ -416,8 +340,6 @@ module.exports = { commentWarning: [ "提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。", ], - commentPublic: "公开", - commentPrivate: "私密", commentLabel: ({ publicOrPrivate, markdownUrl }) => [ ], publishLabel: ({ markdownUrl, linkTarget }) => [ @@ -437,7 +359,6 @@ module.exports = { "。", ], publishCustom: "撰写高级帖子", - subtopicLabel: "创建此帖子的子话题", messagePreview: "帖子预览", mentionsMatching: "匹配的提及", mentionsName: "名称", @@ -460,24 +381,19 @@ module.exports = { ssbLogStream: "区块链", ssbLogStreamDescription: "配置区块链流的消息限制。", saveSettings: "保存设置", - exportTitle: "导出数据", exportDescription: "设置密码(至少32个字符)以加密你的密钥", exportDataTitle: "备份", exportDataDescription: "下载你的数据(不包含私钥!)", exportDataButton: "下载数据库", - pubWallet: "PUB 钱包", - pubWalletDescription: "设置 PUB 钱包 URL。这将用于 PUB 交易(包括 UBI)。", - pubWalletConfiguration: "保存配置", - importTitle: "导入数据", importDescription: "导入你的加密私钥以启用你的头像", - importAttach: "附加加密文件 (.enc)", - passwordLengthInfo: "密码至少需要32个字符。", passwordImport: "输入密码以解密将保存在系统主目录的数据(文件名:secret)", exportPasswordPlaceholder: "使用小写字母、大写字母、数字和符号", fileInfo: "你的加密私钥将下载到你的设备(文件名:oasis.enc)", developer: "开发", devTitle: "开发", welcomeBannerText: "欢迎来到 OASIS。按这几个步骤设置你的化身。", + aiSuggestionBanner: "建议:", + aiSuggestionsEnable: "AI 建议", welcomeBannerAction: "开始设置!", welcomeTitle: "欢迎", welcomeStepGreetingAction: "发送", @@ -520,14 +436,9 @@ module.exports = { devParentFolder: "上级文件夹", devOpenFolder: "打开", devDescription: "浏览本节点上运行的源代码。", - devTreeTitle: "文件", - devSearchTitle: "搜索代码", - devMapTitle: "模块", devRoot: "根目录", - devRootButton: "根目录", devSearchPlaceholder: "要在代码中查找的文本", devAnyExtension: "任意文件", - devSearchButton: "搜索", devStatsFiles: "文件", devStatsLines: "行数", devStatsModules: "模块", @@ -564,16 +475,13 @@ module.exports = { languageDescription: "如果你想使用其他语言,请在此选择。", setLanguage: "设置语言", - peerConnections: "节点", peerConnectionsIntro: "管理与其他节点的所有连接。", peerConnectionsTitle: "连接", online: "在线", offline: "离线", discovered: '已发现', unknown: '未知', - lanBroadcastLabel: "LAN 广播", lanBroadcastActive: "已启用(LAN 上的 UDP 组播)", - lanBroadcastDisabled: "已停用(pub 模式)", peerSourceRpc: "RPC", peerSourceGossip: "Gossip", peerSourceEbt: "EBT", @@ -586,8 +494,6 @@ module.exports = { noConnections: "没有已连接的节点。", noDiscovered: "没有已发现的节点。", noUnknownPeers: "好友图中没有未知节点。", - peersTechnicalTitle: "Peers (technical)", - peersTechnicalIntro: "Technical info from gossip.json + conn.json. Toggle the connection from here.", peersTechnicalEmpty: "No peers registered yet.", peerConnect: "Connect", peerDisconnect: "Disconnect", @@ -597,9 +503,6 @@ module.exports = { peerImport: "导入", peerImportTitle: "导入对等节点列表", peerImportPlaceholder: "每行粘贴一个 multiserver 地址,或上传 .txt 文件……", - noSupportedConnections: "没有已支持的节点。", - noBlockedConnections: "没有已屏蔽的节点。", - noRecommendedConnections: "没有推荐的节点。", connectionActionIntro: "", startNetworking: "启动网络", @@ -613,9 +516,19 @@ module.exports = { homePageDescription: "选择你想要作为主页的模块。", saveHomePage: "设置主页", invites: "邀请", - invitesTitle: "邀请", - invitesInvites: "邀请", invitesDescription: "管理和应用你网络中的邀请码。", + invitesPubsHint: "粘贴 pub 邀请码,与它建立联邦并开始复制其居民。", + invitesFederationsHint: "已联邦的 pub:刷新、移除无法连接的,或导出列表。", + invitesHousesHint: "输入房屋代码以加入 LARP 房屋并参与其经济。", + invitesTribesHint: "输入部落代码以成为成员并访问其私有内容。", + invitesChatsHint: "输入聊天代码以加入对话及其话题。", + invitesPadsHint: "输入协作页代码,与他人共同编辑同一份文档。", + invitesCalendarsHint: "输入日历代码以共享日期与提醒。", + invitesEventsHint: "输入活动代码以加入私密活动。", + invitesForumsHint: "输入论坛代码以在私密论坛中阅读与回复。", + invitesMapsHint: "输入地图代码,在共享地图上查看和添加地点。", + invitesShopsHint: "输入店铺代码以加入店铺及其目录。", + invitesInhabitantsHint: "输入居民代码以互相关注并交换内容。", invitesTribesTitle: "部落", invitesTribeInviteCodePlaceholder: "输入部落邀请码", invitesTribeJoinButton: "加入部落", @@ -646,7 +559,6 @@ module.exports = { invitesAlreadyFederated: "您已与该 pub 建立联邦。", invitesFederationsTitle: "联邦", invitesAcceptedInvites: "已联邦", - invitesNoInvites: "尚未接受任何邀请。", invitesUnfollow: "取消关注", invitesFollow: "关注", invitesUnfollowedInvites: "未联邦", @@ -666,39 +578,24 @@ module.exports = { panicMode: "紧急模式!", encryptData: "设置密码(至少32个字符)以加密你的区块链", decryptData: "输入密码以解密你的区块链", - panicModeDescription: "加密/解密或删除你的区块链", removeDataDescription: "警告:此操作不可撤销。", - encryptPanicButton: "加密区块链", - decryptPanicButton: "解密区块链", removePanicButton: "删除所有数据!", searchTitle: "搜索", searchDescriptionLabel: "在你的网络中搜索内容。", - searchLanguagesLabel: "语言", - searchSkillsLabel: "技能", searchPlaceholder:"搜索内容...", - searchDateLabel:"日期", searchLocationLabel:"位置", searchPriceLabel:"价格", - searchUrlLabel:"URL", searchCategoryLabel:"类别", - searchStartLabel:"开始时间", - searchEndLabel:"结束时间", searchPriorityLabel:"优先级", searchStatusLabel:"状态", statusLabel:"状态", - totalVotesLabel:"总票数", noResultsFound:"未找到结果。", votesOption:"投票选项", voteYesLabel:"赞成", voteNoLabel:"反对", allTypesLabel: "无限制", - ABSTENTIONLabel:"弃权", YESLabel:"赞成", NOLabel:"反对", - FOLLOW_MAJORITYLabel: "跟随多数", - CONFUSEDLabel: "困惑", - NOT_INTERESTEDLabel: "不感兴趣", - StatusLabel:"状态", votesOptionYesLabel:"赞成", votesOptionNoLabel:"反对", votesOptionAbstentionLabel:"弃权", @@ -706,7 +603,6 @@ module.exports = { votesCreatedByLabel:"创建者", voteStatusOpen:"进行中", voteStatusClosed:"已关闭", - imageSearchLabel: "输入关键词以搜索带有相应标签的图片。", commentDescription: ({ parentUrl }) => [ " 评论了 ", a({ href: parentUrl }, " 讨论串"), @@ -718,53 +614,20 @@ module.exports = { " 创建了子话题", ], subtopicTitle: ({ authorName }) => [`@${authorName} 帖子的子话题`], - mysteryDescription: "发布了一篇神秘的帖子", oasisDescription: "OASIS 项目网络", searchSubmit: "搜索...", - postLabel: "帖子", - aboutLabel: "居民", - feedLabel: "动态", votesLabel: "投票", - reportLabel: "报告", - imageLabel: "图片", - videoLabel: "视频", - audioLabel: "音频", - documentLabel: "文档", - torrentLabel: "种子", pdfFallbackLabel: "PDF 文档", - eventLabel: "活动", - taskLabel: "任务", - transferLabel: "转账", - curriculumLabel: "简历", - bookmarkLabel: "书签", - tribeLabel: "部落", - marketLabel: "市场", shopLabel: "SHOPS", - shopProductLabel: "SHOP PRODUCTS", - mapLabel: "MAPS", - jobLabel: "JOBS", - forumLabel: "FORUMS", - projectLabel: "PROJECTS", - bankWalletLabel: "钱包", - bankClaimLabel: "UBI CLAIMS", voteLabel: "VOTES", - contactLabel: "CONTACTS", - pubLabel: "PUBS", submit: "提交", - subjectLabel: "主题", editProfile: "编辑头像", - profileQrAlt: "个人资料二维码", - profileQrHint: "扫码以复制此 Oasis ID。", oasisIdLabel: "OasisID", - spreadLabel: "转发", - spreadHint: "转发给你的支持者(通过你的 feed 复制)。", + spreadContent: "复制", welcomePmSubject: "Hello World!", - welcomePmBody: "欢迎来到 Oasis — 一个自由、点对点、联邦化且加密的社交网络,采用仅限邀请的分布式架构。\n\n一些值得开始探索的地方:\n\n- /profile —— 编辑你的头像、名字、简介以及在公开侧显示哪些模块。\n- /invites —— 添加一个 pub,与更广泛的网络联邦。\n- /peers —— 查看谁已连接,重新扫描局域网,导出或导入对等节点列表。\n- /inhabitants —— 发现并访问其他人的头像。\n- /tribes —— 创建或加入端到端加密的私人小组。\n- /inbox —— 阅读和发送私信。\n- /activity —— 查看最近的活动,你的和你网络中的。\n- /publish —— 写一篇帖子,或分享图片、音频、视频、文档。\n- /search — 按类型搜索网络内容。\n\n一些值得连接的地方:\n\n- /fediverse — 管理你的其他联邦宇宙账户,包括发送和接收内容。\n\n这条消息是私下从你发给你自己的,因此无需任何连接即可接收。", - profileVisibilityTitle: "公开资料可见性", - profileVisibilityHint: "选择其他居民在你的资料中可见的字段。默认仅显示 Karma。", + welcomePmBody: "欢迎来到 Oasis — 一个自由、点对点、联邦化且加密的社交网络,采用仅限邀请的分布式架构。\n\n一些值得开始探索的地方:\n\n- /profile —— 编辑你的头像、名字、简介以及在公开侧显示哪些模块。\n- /invites —— 添加一个 pub,与更广泛的网络联邦。\n- /peers —— 查看谁已连接,重新扫描局域网,导出或导入对等节点列表。\n- /inhabitants —— 发现并访问其他人的头像。\n- /tribes —— 创建或加入端到端加密的私人小组。\n- /inbox —— 阅读和发送私信。\n- /activity —— 查看最近的活动,你的和你网络中的。\n- /publish —— 写一篇帖子,或分享图片、音频、视频、文档。\n- /search — 按类型搜索网络内容。\n\n一些值得连接的地方:\n\n- /multiverse — 管理你的其他多元宇宙账户,包括发送和接收内容。\n\n这条消息是私下从你发给你自己的,因此无需任何连接即可接收。", profileSensorsSectionTitle: "传感器", profileVisibilityActivity: "活跃度", - profileVisibilityDevice: "设备", profileDeviceLockedHint: "此传感器始终开启:它让其他人看到你从哪个设备连接,并且无法关闭。", profileVisibilityKarma: "KARMA 评分", profileVisibilityUbi: "UBI", @@ -772,7 +635,6 @@ module.exports = { profileVisibilityEcoTax: "ECO Tax", profileVisibilityLarpSign: "L.A.R.P. Sign", profileVisibilityGpg: "GPG 密钥", - profileVisibilityClearnet: "发布我的资料", clearnetSectionTitle: "Clearnet", profileClearnetShopsLabel: "店铺", profileClearnetJobsLabel: "工作", @@ -826,7 +688,6 @@ module.exports = { " 或连接状态。", ], walletSentToLine: ({ destination, amount }) => `已发送 ECO ${amount} 至 ${destination}`, - walletSettingsTitle: "钱包", walletSettingsDescription: "将 Oasis 与你的 ECOin 钱包集成。", walletSettingsDocLink: "ECOin 安装指南", walletStatusMessages: { @@ -848,37 +709,19 @@ module.exports = { cipherTitle: "加密器", cipherDescription: "使用共享密码对文本进行对称加密和解密。", randomPassword: "随机密码", - cipherEncryptTitle: "加密文本", - cipherEncryptDescription: "输入要加密的文本", - cipherTextLabel: "要加密的文本", cipherTextPlaceholder: "输入要加密的文本...", cipherPasswordLabel: "设置密码(至少32个字符)以加密你的文本", cipherPasswordDecryptLabel: "设置密码(至少32个字符)以解密你的文本", cipherPasswordPlaceholder: "输入密码...", cipherEncryptButton: "加密", - cipherDecryptTitle: "解密文本", - cipherDecryptDescription: "输入要解密的文本", cipherEncryptedMessageLabel: "加密文本", cipherDecryptedMessageLabel: "解密文本", - cipherPasswordUsedLabel: "加密所用密码(请妥善保管!)", cipherEncryptedTextPlaceholder: "输入加密文本...", - cipherIvLabel: "IV", - cipherIvPlaceholder: "输入初始化向量...", cipherDecryptButton: "解密", password: "密码", text: "文本", encryptedText: "加密文本", iv: "初始化向量 (IV)", - encryptTitle: "加密你的文本", - encryptDescription: "输入要加密的文本并提供密码。", - encryptButton: "加密", - decryptTitle: "解密你的文本", - decryptDescription: "输入加密文本并提供相同的加密密码。", - decryptButton: "解密", - passwordLengthError: "密码至少需要32个字符。", - missingFieldsError: "未提供文本、密码或 IV。", - encryptionError: "加密文本时出错。", - decryptionError: "解密文本时出错。", bookmarkTitle: "书签", bookmarkDescription: "发现和管理你网络中的书签。", bookmarkAllSectionTitle: "书签", @@ -904,8 +747,6 @@ module.exports = { bookmarkDescriptionPlaceholder: "可选", bookmarkTagsLabel: "标签", bookmarkTagsPlaceholder: "输入标签,用逗号分隔", - bookmarkCategoryLabel: "类别", - bookmarkCategoryPlaceholder: "可选", bookmarkLastVisitLabel: "上次访问", bookmarkSearchPlaceholder: "搜索 URL、标签、类别、作者...", bookmarkSortRecent: "最近", @@ -920,8 +761,6 @@ module.exports = { noLastVisit: "无访问记录", videoTitle: "视频", videoDescription: "探索和管理你网络中的视频内容。", - videoPluginTitle: "标题", - videoPluginDescription: "描述", videoMineSectionTitle: "你的视频", videoCreateSectionTitle: "上传视频", videoUpdateSectionTitle: "更新视频", @@ -953,7 +792,6 @@ module.exports = { videoSortOldest: "最早", videoSortTop: "最多投票", videoSearchButton: "搜索", - videoMessageAuthorButton: "私信", videoUpdatedAt: "已更新", videoNoMatch: "没有匹配的视频。", documentTitle: "文档", @@ -994,8 +832,6 @@ module.exports = { documentUpdatedAt: "已更新", audioTitle: "音频", audioDescription: "探索和管理你网络中的音频内容。", - audioPluginTitle: "标题", - audioPluginDescription: "描述", audioMineSectionTitle: "你的音频", audioCreateSectionTitle: "上传音频", audioUpdateSectionTitle: "更新音频", @@ -1006,7 +842,6 @@ module.exports = { audioFilterMine: "我的", audioFilterRecent: "最近", audioFilterTop: "热门", - audioFilterBlockchain: "区块链", audioCreateButton: "上传音频", audioUpdateButton: "更新", audioDeleteButton: "删除", @@ -1033,6 +868,7 @@ module.exports = { audioFilterFavorites: "收藏", favoritesTitle: "收藏", favoritesDescription: "所有你收藏的内容集中在一处。", + favoritesSearchPlaceholder: "搜索收藏...", favoritesFilterAll: "全部", favoritesFilterRecent: "最近", favoritesFilterAudios: "音频", @@ -1048,18 +884,13 @@ module.exports = { favoritesNoItems: "还没有收藏。", yourContacts: "你的联系人", allInhabitants: "居民", - allCVs: "所有简历", + allCVs: "简历", discoverPeople: "发现你网络中的居民。", - allInhabitantsButton: "全部", - contactsButton: "支持", - CVsButton: "简历", - matchSkills: "匹配技能", - matchSkillsButton: "匹配技能", - suggestedButton: "推荐", searchInhabitantsPlaceholder: "按名称筛选居民...", filterLocation: "按位置筛选居民...", filterLanguage: "按语言筛选居民...", filterSkills: "按技能筛选居民...", + cvSkillsCount: "技能", applyFilters: "应用筛选", locationLabel: "位置", languagesLabel: "语言", @@ -1068,17 +899,18 @@ module.exports = { mutualFollowers: "共同关注者", suggestedFollowsYou: "关注了你", latestInteractions: "最近互动", - viewAvatar: "查看头像", - viewCV: "查看简历", suggestedSectionTitle: "推荐", topkarmaSectionTitle: "最高因缘值", topecoSectionTitle: "最佳生态", topactivitySectionTitle: "最高活跃度", + "TOP INACTIVITYButton": "最不活跃", + topinactivitySectionTitle: "最不活跃的居民", blockedSectionTitle: "已屏蔽", gallerySectionTitle: "画廊", - blockedButton: "已屏蔽", + topSectionTitle: "排行", blockedLabel: "已屏蔽用户", inhabitantviewDetails: "查看详情", + cvVisitButton: "查看简历", keepReading: "继续阅读...", oasisId: "ID", noInhabitantsFound: "尚未找到居民。", @@ -1091,8 +923,9 @@ module.exports = { parliamentFilterCandidatures: "候选", parliamentFilterProposals: "提案", parliamentFilterLaws: "法律", + parliamentFilterRevocations: "罢免", parliamentFilterHistorical: "历史", - parliamentFilterLeaders: "领袖", + parliamentFilterLeaders: "领导", parliamentFilterRules: "规则", parliamentGovernmentCard: "现任政府", parliamentActorInPowerInhabitant: '执政居民', @@ -1116,10 +949,8 @@ module.exports = { parliamentPoliciesDeclined: "否决的法律", parliamentPoliciesDiscarded: "废弃的法律", parliamentEfficiency: "% 效率", - parliamentFilterRevocations: '撤销', parliamentRevocationFormTitle: '撤销法律', parliamentRevocationLaw: '法律', - parliamentRevocationTitle: '标题', parliamentRevocationReasons: '理由', parliamentRevocationPublish: '发布撤销', parliamentCurrentRevocationsTitle: '当前撤销', @@ -1132,23 +963,12 @@ module.exports = { parliamentNoGovernments: "还没有政府。", parliamentCandidatureFormTitle: "提议候选", parliamentCandidatureIdPh: "Oasis ID (@...) 或部落名称", - parliamentCandidatureSlogan: "口号(最多140字)", - parliamentCandidatureSloganPh: "一个简短的口号", parliamentCandidatureMethod: "方式", parliamentCandidatureProposeBtn: "发布候选", - parliamentThDate: "提议日期", - parliamentThSlogan: "口号", - parliamentThSince: "注册时间", - parliamentThVotes: "获得票数", - parliamentThVoteAction: "投票", - parliamentTypeUser: "居民", - parliamentTypeTribe: "部落", parliamentVoteBtn: "投票", parliamentProposalFormTitle: "提议法律", parliamentProposalDescription: "描述(不超过1000字)", parliamentProposalPublish: "发布提案", - parliamentFinalize: "结束", - parliamentDeadline: "截止日期", parliamentNoProposals: "还没有法律提案。", parliamentNoLaws: "还没有已通过的法律。", parliamentMethodDEMOCRACY: "民主", @@ -1166,29 +986,21 @@ module.exports = { parliamentVotesSlashTotal: "票数/总计", parliamentVotesNeeded: "所需票数", parliamentFutureLawsTitle: "未来法律", - parliamentNoFutureLaws: "还没有未来法律。", parliamentVoteAction: "投票", - parliamentLeadersTitle: "领袖", parliamentThLeader: "头像", parliamentPopulation: "人口", - parliamentThType: "类型", - parliamentThInPower: "执政中", parliamentThPresented: "候选", parliamentNoLeaders: "还没有领袖。", parliamentCandidaturesListTitle: "候选列表", parliamentTimeRemaining: "剩余时间", - parliamentNoLeader: "尚无领先候选。", parliamentElectionsStatusTitle: "下届政府", parliamentProposalDeadlineLabel: "截止日期", parliamentProposalTimeLeft: "剩余时间", - parliamentProposalOnTrack: "有望通过", - parliamentProposalOffTrack: "支持不足", parliamentRulesTitle: "议会运作方式", parliamentRulesIntro: "选举每2个月进行一次;候选是持续的,在政府选定后重置。", parliamentRulesCandidates: "任何居民都可以提名自己、其他居民或任何部落。每位居民每个周期最多可提出3项候选;同一周期内的重复候选将被拒绝。", parliamentRulesElection: "获胜者是在结算时获得最多选票的候选。", parliamentRulesTies: "平局规则:最高居民 Karma;如果仍然平局,最早注册的;如果仍然平局,最早提出的;然后按 ID 字典序。", - parliamentRulesFallback: "如果没有人投票,最后提出的候选获胜。如果没有候选,将随机选择一个部落。", parliamentRulesTerm: "政府标签显示当前政府和统计数据。", parliamentRulesMethods: "形式:无政府(简单多数)、民主(50%+1)、多数(80%)、少数(20%)、Karma 制(最高 Karma 提案)、独裁(即时通过)。", parliamentRulesAnarchy: "无政府是默认模式:如果在结算时没有候选被选出,宣布无政府状态。在无政府状态下,任何居民都可以提议法律。", @@ -1210,11 +1022,7 @@ module.exports = { courtsCaseFormTitle: "开立案件", courtsCaseRespondent: "被告/答辩人", courtsCaseRespondentPh: "Oasis ID (@...) 或部落名称", - courtsCaseMediatorsAccuser: "调解员(原告方)", courtsCaseMethod: "解决方式", - courtsCaseDescription: "描述(最多1000字)", - courtsCaseEvidenceTitle: "案件证据", - courtsCaseEvidenceHelp: "附加图片、音频、文档(PDF)或视频以支持你的案件。", courtsCaseSubmit: "提交案件", courtsNominateJudge: "提名法官", courtsJudgeId: "法官", @@ -1259,22 +1067,6 @@ module.exports = { courtsRulesMisconduct: "骚扰、操纵或伪造证据可能导致立即不利裁决。", courtsRulesGlossary: "案件:冲突记录。证据:支持诉求的材料。裁决:附有补救措施的决定。上诉:请求审查裁决。", courtsFilterActions: "操作", - courtsNoActions: "你的角色没有待处理的操作。", - courtsCaseTitlePlaceholder: "冲突的简要描述", - courtsCaseSeverity: "严重程度", - courtsCaseSeverityNone: "无严重程度标签", - courtsCaseSeverityLOW: "低", - courtsCaseSeverityMEDIUM: "中", - courtsCaseSeverityHIGH: "高", - courtsCaseSeverityCRITICAL: "严重", - courtsCaseSubject: "主题", - courtsCaseSubjectNone: "无主题标签", - courtsCaseSubjectBEHAVIOUR: "行为", - courtsCaseSubjectCONTENT: "内容", - courtsCaseSubjectGOVERNANCE: "治理/规则", - courtsCaseSubjectFINANCIAL: "财务/资源", - courtsCaseSubjectOTHER: "其他", - courtsHiddenRespondent: "已隐藏(仅相关角色可见)。", courtsThRole: "角色", courtsRoleAccuser: "原告", courtsRoleDefence: "辩护方", @@ -1285,54 +1077,19 @@ module.exports = { courtsAssignJudgeBtn: "选择法官", trendingTitle: "热门", exploreTrending: "探索你网络中最受欢迎的内容。", - bookmarkButton: "书签", - transferButton: "转账", - eventButton: "活动", - taskButton: "任务", votesButton: "投票", - industryButton: "工业", - projectButton: "项目", - shopProductButton: "产品", - reportButton: "报告", - feedButton: "动态", - marketButton: "市场", - imageButton: "图片", - audioButton: "音频", - videoButton: "视频", - documentButton: "文档", - torrentButton: "种子", - noTrendingFound: "未找到热门内容。", - noContentMessage: "暂无热门内容。", - trendingDescription: "描述", - trendingDate: "日期", - trendingLocation: "位置", - trendingPrice: "价格", - trendingUrl: "URL", - trendingCategory: "类别", - trendingStart: "开始", - trendingEnd: "结束", - trendingPriority: "优先级", - trendingStatus: "状态", - trendingFrom: "发件人", - trendingTo: "收件人", - trendingConcept: "概念", - trendingAmount: "金额", - trendingDeadline: "截止日期", - trendingItemStatus: "项目状态", - trendingTotalVotes: "总票数", + shopProductButton: "商店", trendingTotalOpinions: "总观点数", trendingNoContentMessage: "暂时还没有热门内容。", - trendingAuthor: "作者", - trendingCreatedAtLabel: "创建于", trendingTotalCount: "总计", tasksTitle: "任务", tasksDescription: "发现和管理你网络中的任务。", + taskSearchPlaceholder: "搜索任务...", taskTitleLabel: "标题", taskDescriptionLabel: "描述", taskStartTimeLabel: "开始时间", taskEndTimeLabel: "结束时间", taskPriorityLabel: "优先级", - taskPrioritySelect: "选择优先级", taskPriorityUrgent: "紧急", taskPriorityHigh: "高", taskPriorityMedium: "中", @@ -1342,13 +1099,13 @@ module.exports = { taskVisibilityLabel: "可见性", taskPublic: "公开", taskPrivate: "私密", - taskCreatedAt: "创建于", - taskBy: "作者", taskStatus: "状态", taskStatusOpen: "开放", taskStatusInProgress: "进行中", taskStatusClosed: "已关闭", taskAssignedTo: "分配给", + taskAssignedChip: "已认领", + taskUnassignedChip: "未认领", taskAssignees: "被分配者", taskAssignButton: "分配给我", taskUnassignButton: "取消分配", @@ -1361,7 +1118,6 @@ module.exports = { taskFilterInProgress: "进行中", taskFilterClosed: "已关闭", taskFilterAssigned: "已分配", - taskFilterArchived: "已归档", taskFilterUrgent: "紧急", taskFilterHigh: "高", taskFilterMedium: "中", @@ -1374,23 +1130,21 @@ module.exports = { taskInProgressTitle: "进行中的任务", taskClosedTitle: "已关闭的任务", taskAssignedTitle: "已分配的任务", - taskArchivedTitle: "已归档的任务", - taskPublicTitle: "公开任务", - taskPrivateTitle: "私密任务", notasks: "没有可用的任务。", noLocation: "未指定位置", taskSetStatus: "设置状态", - eventTitle: "活动", eventDateLabel: "日期", + eventRecurrenceLabel: "重复", + eventRecurrenceUntil: "重复至", + eventRecurrenceHint: "一次性活动请留空结束日期。", + eventUpcomingDates: "接下来的日期", eventsTitle: "活动", eventsDescription: "发现和管理你网络中的活动。", - eventDescription: "描述", + eventSearchPlaceholder: "搜索活动...", eventPrice: "价格", eventStatus: "状态", - eventOrganizer: "组织者", eventAllSectionTitle: "活动", eventMineSectionTitle: "你的活动", - eventArchivedTitle: "已归档的活动", eventCreateSectionTitle: "创建活动", eventUpdateSectionTitle: "更新活动", eventDeleteButton: "删除", @@ -1398,11 +1152,26 @@ module.exports = { eventAddToCalendar: "添加到日历", eventVisitCalendar: "查看日历", viewTask: "查看任务", + viewEvent: "查看活动", + viewPad: "查看协作文档", + viewMap: "查看地图", + viewCalendar: "查看日历", viewReport: "查看报告", viewTransfer: "查看转账", viewItem: "查看物品", viewShop: "查看商店", viewProject: "查看项目", + viewJob: "查看工作", + viewPlace: "查看地点", + generatePdf: "生成 PDF", + sharePm: "通过私信分享", + galleryImages: "图片(每张最大 50MB)", + galleryPhotos: "图片", + galleryAddPhoto: "添加图片", + galleryRemovePhoto: "移除", + galleryVideo: "视频(最大 50MB)", + galleryAddVideo: "添加视频", + galleryRemoveVideo: "移除视频", viewVotation: "查看投票", voteCastTitle: "投票", voteResults: "结果", @@ -1410,29 +1179,15 @@ module.exports = { eventDescriptionLabel: "描述", eventDescriptionPlaceholder: "输入活动描述...", eventUpdateButton: "更新", - eventAttendeesLabel: "参与者", - eventAttendeesPlaceholder: "输入参与者,用逗号分隔...", eventTagsLabel: "标签", - eventTagsPlaceholder: "输入活动标签,用逗号分隔...", - eventTags: "标签", eventPriceLabel: "价格", eventUrlLabel: "URL", eventAttendees: "参与者", - noAttendees: "暂无参与者", - eventCreatedAt: "创建于", eventLocation: "位置", eventLocationLabel: "位置", - eventNoLocation: "未指定位置", - eventNoURL: "未指定 URL", - eventBy: "作者", noevents: "没有可用的活动。", eventDate: "日期", - eventDateFormat: "YYYY年MM月DD日 HH:mm", eventAttendButton: "参加活动", - eventUnattendButton: "取消参加", - eventCreatedBy: "创建者", - eventAttendeesCount: "参与人数", - eventCreatedByYou: "你创建了此活动", eventFilterAll: "全部", eventFilterMine: "我的", eventFilterToday: "今天", @@ -1440,18 +1195,9 @@ module.exports = { eventFilterMonth: "本月", eventFilterYear: "今年", eventFilterArchived: "已归档", - eventTodayTitle: "今天的活动", - eventThisWeekTitle: "本周的活动", - eventThisMonthTitle: "本月的活动", - eventThisYearTitle: "今年的活动", eventPrivacyLabel: "可见性", eventPublic: "公开", eventPrivate: "私密", - eventPublicTitle: "公开活动", - eventNoPrice: "免费活动", - eventNoImage: "未上传图片", - eventAttendConfirmation: "你现在正在参加此活动", - eventUnattendConfirmation: "你已取消参加此活动", eventAttended: "已参加", eventUnattended: "未参加", eventStatusOpen: "开放", @@ -1462,6 +1208,10 @@ module.exports = { tagsTopSectionTitle: "热门标签", tagsCloudSectionTitle: "标签云", tagsFilterAll: "全部", + tagsFilterMine: "我的", + tagsFilterRecent: "最新", + tagsMineSectionTitle: "我的标签", + tagsRecentSectionTitle: "最新标签", tagsFilterTop: "热门", tagsFilterCloud: "标签云", tagsNoItems: "没有可用的标签。", @@ -1505,18 +1255,12 @@ module.exports = { transfersDeadline: "截止日期", transfersTags: "标签", transfersStatus: "状态", - transfersStatusUnconfirmed: "未确认", - transfersStatusClosed: "已关闭", - transfersStatusDiscarded: "已废弃", - transfersCreatedAt: "创建于", transfersConfirmations: "确认", - transfersContainingBlock: "所在区块", - transfersExportContract: "智能合约", + transfersExportContract: "生成账单", transfersConfirmButton: "确认转账", transfersNoItems: "未找到转账。", transfersMineSectionTitle: "你的转账", transfersUBISectionTitle: "UBI 转账", - transfersMarketSectionTitle: "市场转账", transfersTopSectionTitle: "热门转账", transfersPendingSectionTitle: "待处理转账", transfersUnconfirmedSectionTitle: "未确认转账", @@ -1524,21 +1268,13 @@ module.exports = { transfersDiscardedSectionTitle: "已废弃转账", transfersCreateSectionTitle: "创建转账", transfersAllSectionTitle: "转账", - transfersFilterFavs: "收藏", - transfersFavsSectionTitle: "收藏的转账", - transfersSearchLabel: "搜索", transfersSearchPlaceholder: "搜索概念、标签、用户...", transfersMinAmountLabel: "最低金额", transfersMaxAmountLabel: "最高金额", - transfersSortLabel: "排序", transfersSortRecent: "最近", transfersSortAmount: "最高金额", transfersSortDeadline: "最近截止", transfersSearchButton: "搜索", - transfersFavoriteButton: "收藏", - transfersUnfavoriteButton: "取消收藏", - transfersMessageUserButton: "消息", - transfersExpiringSoonBadge: "即将到期", transfersExpiredBadge: "已过期", transfersUpdatedAt: "已更新", transfersNoMatch: "没有匹配的转账。", @@ -1583,16 +1319,6 @@ module.exports = { voteNoQuestion: "未提供问题", voteUnknownCreator: "未知创建者", voteUnknownDate: "未知日期", - errorVoteNotFound: "未找到投票", - errorAlreadyVoted: "你已经表达了意见。", - errorVoteClosedCannotEdit: "无法编辑已关闭的投票", - errorVoteDeadlinePassed: "此投票的截止日期已过", - errorRetrievingVote: "获取投票时出错", - errorCreatingVote: "创建投票时出错", - errorVoteAlreadyVoted: "意见提交后无法编辑", - errorDeletingOldVote: "删除旧意见时出错", - errorCreatingUpdatedVote: "创建更新的意见时出错", - errorCreatingTombstone: "创建墓碑时出错", voteDetailSectionTitle: '投票详情', voteCommentsLabel: '评论', voteCommentsForumButton: '公开讨论', @@ -1602,7 +1328,6 @@ module.exports = { voteNewCommentButton: '发表评论', voteNewCommentLabel: '添加评论', cvTitle: "简历", - cvLabel: "简历 (CV)", cvEditSectionTitle: "编辑简历", cvCreateSectionTitle: "创建简历", cvDescription: "管理和分享你的专业技能和信息。", @@ -1621,19 +1346,16 @@ module.exports = { cvLocationLabel: "位置", cvStatusLabel: "状态", cvPreferencesLabel: "偏好", - cvOasisContributorLabel: "Oasis 贡献者", cvPersonal: "个人", cvOasis: "Oasis 贡献者(可选)", - cvOasisContributorView: "Oasis 贡献", + cvOasisContributorView: "贡献", cvEducational: "教育(可选)", cvEducationalView: "教育", cvProfessional: "专业(可选)", cvProfessionalView: "专业", cvAvailability: "可用性(可选)", - cvAvailabilityView: "可用性", cvUpdateButton: "更新", cvCreateButton: "创建简历", - cvContactLabel: "联系方式", cvCreatedAt: "创建于", cvUpdatedAt: "更新于", cvEditButton: "更新", @@ -1642,8 +1364,103 @@ module.exports = { blogSubject: "主题", blogMessage: "消息", blogImage: "上传媒体(最大:50MB)", + blogMedia: "附件(最多 8 张图片和 1 个视频)", blogPublish: "预览", - noPopularMessages: "还没有发布热门消息", + pollsTitle: "投票", + dataTitle: "匹配", + dataDescription: "探索并可视化你的网络中的匹配。", + dataFilterAll: "全部", + dataFilterMine: "我的", + dataFilterRecent: "最近", + dataFilterTop: "最高", + dataKindInhabitants: "居民", + dataKindJobs: "工作", + dataKindProjects: "项目", + dataKindEvents: "活动", + dataKindTribes: "部落", + dataKindMarket: "市场", + dataKindHousing: "住房", + dataKindIndustry: "产业", + dataKindTasks: "任务", + dataKindReports: "报告", + dataKindVotes: "投票", + dataSearchPlaceholder: "搜索交叉数据...", + dataCohesionTitle: "凝聚系数 (CC)", + dataCcShort: "CC", + dataCohesionHint: "网络已发布内容之间的平均相近度。", + dataAffinity: "匹配度", + dataCommonTerms: "关键词", + dataStatPeople: "简历", + dataStatConnected: "已连接", + dataStatSkills: "技能", + dataBestMatch: "最佳匹配", + dataStatIsolated: "孤立", + dataStatEntities: "已比较的实体", + dataStatTerms: "不同词条", + dataStatPairs: "已连接的配对", + dataMatchesTitle: "匹配", + dataMatchesHint: "算法的个性化推荐。", + dataTermsTitle: "关键词", + dataTermsHint: "出现在最多内容中的词条。", + dataConnections: "关联匹配", + dataTopicTitle: "与此相关的一切:", + dataTopicHint: "算法与该主题关联的内容", + dataNoMatches: "没有可显示的交叉数据。", + dataNoProfile: "发布内容或填写简历,让算法了解你的兴趣。", + pollsDescription: "用于向网络提问并统计答案的模块。", + pollFilterAll: "全部", + pollFilterMine: "我的", + pollFilterRecent: "最近", + pollFilterTop: "热门", + pollFilterVoted: "已投票", + pollFilterOpen: "进行中", + pollFilterClosed: "已结束", + pollCreateButton: "创建投票", + pollCreateTitle: "创建投票", + pollEditTitle: "编辑投票", + pollQuestion: "问题", + pollQuestionPlaceholder: "你想问什么?", + pollOptions: "选项(每行一个)", + pollOutcome: "结果", + pollNoVotesYet: "尚无投票", + pollTie: "平局", + pollOptionsPlaceholder: "广场\n公园\n酒吧", + pollAnonymous: "匿名", + pollAnonymousLabel: "匿名投票", + pollMultiple: "多选", + pollMultipleLabel: "允许多个答案", + pollDeadline: "截止时间", + pollTags: "标签", + pollPublishButton: "发布投票", + pollUpdateButton: "更新", + pollCloseButton: "关闭", + pollDeleteButton: "删除", + pollVoteButton: "投票", + pollChangeVote: "修改投票", + pollVoters: "投票人", + pollComments: "评论", + pollStatusLabel: "状态", + pollStatusOpen: "进行中", + pollStatusClosed: "已结束", + pollSearchPlaceholder: "搜索投票...", + pollsNoItems: "未找到投票。", + viewPoll: "查看投票", + pollChatCreate: "创建投票", + pollInChat: "投票", + blogTitle: "博客", + blogDescription: "用于发现和管理博客的模块。", + blogFilterAll: "全部", + blogFilterMine: "我的", + blogFilterRecent: "最近", + blogFilterFavorites: "收藏", + blogFilterTop: "热门", + blogCreateButton: "创建博客", + blogSearchPlaceholder: "搜索博客...", + blogComments: "评论", + blogAllowComments: "允许评论", + blogCommentsClosed: "作者已关闭此博客的评论。", + blogNoItems: "未找到博客。", + viewBlog: "查看博客", forumTitle: "论坛", forumCategoryLabel: "类别", forumTitleLabel: "标题", @@ -1651,43 +1468,22 @@ module.exports = { forumCreateButton: "创建论坛", forumCreateSectionTitle: "创建论坛", forumDescription: "与你网络中的其他居民公开交流。", + forumSearchPlaceholder: "搜索论坛...", forumFilterAll: "全部", forumFilterMine: "我的", forumFilterRecent: "最近", forumFilterTop: "热门", - forumMineSectionTitle: "你的论坛", - forumRecentSectionTitle: "最近的论坛", - forumAllSectionTitle: "论坛", forumDeleteButton: "删除", forumParticipants: "参与者", forumMessages: "消息", - forumLastMessage: "最后消息", forumMessageLabel: "消息", forumMessagePlaceholder: "写下你的消息...", forumSendButton: "发送", - forumVisitForum: "访问论坛", noForums: "未找到论坛。", - forumVisitButton: "访问论坛", - forumCatGENERAL: "综合", - forumCatOASIS: "Oasis", - forumCatLARP: "L.A.R.P.", - forumCatPOLITICS: "政治", - forumCatTECH: "科技", - forumCatSCIENCE: "科学", - forumCatMUSIC: "音乐", - forumCatART: "艺术", - forumCatGAMING: "游戏", - forumCatBOOKS: "书籍", - forumCatFILMS: "电影", - forumCatPHILOSOPHY: "哲学", - forumCatSOCIETY: "社会", - forumCatPRIVACY: "隐私", - forumCatCYBERWARFARE: "网络战争", - forumCatSURVIVALISM: "生存主义", + forumVisitButton: "查看论坛", + forumTopicLabel: "主题", imageTitle: "图片", imageDescription: "探索和管理你网络中的图片内容。", - imagePluginTitle: "标题", - imagePluginDescription: "描述", imageMineSectionTitle: "你的图片", imageCreateSectionTitle: "上传图片", imageUpdateSectionTitle: "更新图片", @@ -1696,14 +1492,12 @@ module.exports = { imageTopSectionTitle: "热门图片", imageFavoritesSectionTitle: "收藏", imageGallerySectionTitle: "画廊", - imageMemeSectionTitle: "梗图", imageFilterAll: "全部", imageFilterMine: "我的", imageFilterRecent: "最近", imageFilterTop: "热门", imageFilterFavorites: "收藏", imageFilterGallery: "画廊", - imageFilterMeme: "梗图", imageCreateButton: "上传图片", imageUpdateButton: "更新", imageDeleteButton: "删除", @@ -1716,7 +1510,6 @@ module.exports = { imageTitlePlaceholder: "可选", imageDescriptionLabel: "描述", imageDescriptionPlaceholder: "可选", - imageMemeLabel: "标记为表情包", imageNoFile: "未提供图片文件", noImages: "没有可用的图片。", imageSearchPlaceholder: "搜索标题、标签、描述、作者...", @@ -1724,7 +1517,6 @@ module.exports = { imageSortOldest: "最早", imageSortTop: "最多投票", imageSearchButton: "搜索", - imageMessageAuthorButton: "消息", imageUpdatedAt: "已更新", imageNoMatch: "没有匹配的图片。", feedTitle: "动态", @@ -1732,7 +1524,6 @@ module.exports = { createFeedButton: "发送动态!", feedPlaceholder: "有什么新鲜事?(最多280字)", TODAYButton: "今天", - CREATEButton: "创建动态", totalOpinions: "总观点数", moreVoted: "最多投票", noFeedsFound: "未找到动态。", @@ -1755,20 +1546,12 @@ module.exports = { concept: "概念", description: "描述", meme: "表情包", - activityContact: "联系人", - activityBy: "名称", - activityPixelia: "新增像素", - viewImage: "查看图片", - playAudio: "播放音频", - playVideo: "播放视频", typeRecent: "最近", - errorActivity: "获取活动时出错", + typeTop: "排行", typePost: "博客", - recentButton: "最近", typeTribe: "部落", typeLarp: "L.A.R.P.", typeInhabitants: "居民", - activityProfileUpdated: "更新了个人资料", typeAbout: "居民", typeCurriculum: "简历", typeImage: "图片", @@ -1812,8 +1595,6 @@ module.exports = { typeCourtsSettlementAccepted: "法庭 · 和解接受", typeCourtsNomination: "法庭 · 提名", typeCourtsNominationVote: "法庭 · 提名投票", - activitySupport: "新联盟建立", - activityJoin: "加入新 PUB", question: "问题", deadline: "截止日期", status: "状态", @@ -1827,12 +1608,8 @@ module.exports = { date: "日期", category: "类别", attendees: "参与者", - activitySpread: "->", - visitLink: "访问链接", - viewDocument: "查看文档", location: "位置", contentWarning: "主题", - personName: "居民名称", bankWalletConnected: "ECOin 钱包", bankUbiReceived: "已收到 UBI", bankTx: "交易", @@ -1842,7 +1619,6 @@ module.exports = { link: "链接", activityProjectFollow: "%OASIS% 正在 %ACTION% 此项目 %PROJECT%", activityProjectUnfollow: "%OASIS% 正在 %ACTION% 此项目 %PROJECT%", - activityProjectPledged: "%OASIS% 已 %ACTION% %AMOUNT% 至项目 %PROJECT%", following: "关注中", unfollowing: "取消关注中", pledged: "已质押", @@ -1888,26 +1664,17 @@ module.exports = { courtsVotesSlashTotal: "赞成/总计", courtsOpenVote: "公开投票", courtsAnswerTitle: "答辩", - courtsStanceADMIT: "承认", - courtsStanceDENY: "否认", - courtsStancePARTIAL: "部分承认", - courtsStanceCOUNTERCLAIM: "反诉", - courtsStanceNEUTRAL: "中立", courtsVerdictResult: "结果", courtsVerdictOrders: "命令", courtsSettlementText: "和解", courtsSettlementAccepted: "已接受", - courtsSettlementPending: "待处理", courtsJudge: "法官", courtsThSupports: "支持", courtsFilterOpenCase: '开立案件', - courtsEvidenceFileLabel: '证据文件(图片、音频、视频或 PDF)', - courtsCaseMediators: '调解员', courtsCaseMediatorsPh: '调解员 Oasis ID,用逗号分隔', courtsMediatorsLabel: '调解员', courtsThCase: '案件', courtsThCreatedAt: '开始日期', - courtsThActions: '操作', courtsPublicPrefLabel: '解决后的可见性', courtsPublicPrefYes: '我同意此案件可完全公开', courtsPublicPrefNo: '我倾向于保持细节私密', @@ -1915,8 +1682,11 @@ module.exports = { courtsMethodMEDIATION: '调解', courtsNoCases: '没有案件。', reportsTitle: "报告", - reportsDescription: "管理和追踪你网络中与问题、漏洞、滥用和内容警告相关的报告。", + reportsDescription: "管理并跟踪你的网络中的报告。", + reportsSearchPlaceholder: "搜索举报...", reportsFilterAll: "全部", + reportsFilterRecent: "最新", + reportsFilterTop: "热门", reportsFilterMine: "我的", reportsFilterFeatures: "功能", reportsFilterBugs: "漏洞", @@ -1929,18 +1699,13 @@ module.exports = { reportsFilterInvalid: "无效", reportsCreateButton: "创建报告", reportsTitleLabel: "标题", - reportsDescriptionLabel: "描述", - reportsDescriptionPlaceholder: "请提供详细描述。", reportsCategory: "类别", - reportsCategoryLabel: "类别", reportsCategoryFeatures: "功能", reportsCategoryBugs: "漏洞", reportsCategoryAbuse: "滥用", - reportsCategoryContent: "内容问题", + reportsCategoryContent: "内容", reportsUpdateButton: "更新", reportsDeleteButton: "删除", - reportsDateLabel: "日期", - reportsUploadFile: "上传媒体(最大:50MB)", reportsMineSectionTitle: "你的报告", reportsFeaturesSectionTitle: "功能请求", reportsBugsSectionTitle: "漏洞", @@ -1948,11 +1713,6 @@ module.exports = { reportsContentSectionTitle: "内容问题", reportsAllSectionTitle: "报告", reportsNoItems: "没有可用的报告。", - reportsValidationTitle: "请输入有效的标题。", - reportsValidationDescription: "描述不能为空。", - reportsValidationCategory: "请选择一个类别。", - reportsCreatedAt: "创建于", - reportsCreatedBy: "作者", reportsSeverity: "严重程度", reportsSeverityLow: "低", reportsSeverityMedium: "中", @@ -1963,9 +1723,6 @@ module.exports = { reportsStatusUnderReview: "审查中", reportsStatusResolved: "已解决", reportsStatusInvalid: "无效", - reportsUpdateStatusButton: "更新状态", - reportsAnonymityOption: "匿名提交", - reportsAnonymousAuthor: "匿名", reportsConfirmButton: "确认报告!", reportsConfirmations: "确认", reportsConfirmedSectionTitle: "已确认的报告", @@ -2013,6 +1770,20 @@ module.exports = { reportsRequestedActionLabel: '请求的操作', reportsRequestedActionPlaceholder: '删除、隐藏、标记、警告等。', tribesTitle: "部落", + tribeFilterAll: "全部", + tribeFilterRecent: "最近", + tribeFilterMine: "我的", + tribeFilterMembership: "成员", + tribeFilterSubtribes: "子部落", + tribeFilterTop: "热门", + tribeFilterGallery: "图库", + tribeFeedFilterTOP: "热门", + tribeFeedFilterMINE: "我的", + tribeFeedFilterALL: "全部", + tribeFeedFilterRECENT: "最近", + courtsStanceDENY: "否认", + courtsStanceADMIT: "承认", + courtsStancePARTIAL: "部分承认", tribeAllSectionTitle: "部落", tribeMineSectionTitle: "你的部落", tribeCreateSectionTitle: "创建部落", @@ -2024,13 +1795,6 @@ module.exports = { tribeviewSubTribeButton: "访问子部落", tribeRootLabel: "根", tribeDescription: "探索或创建你网络中的部落。", - tribeFilterAll: "全部", - tribeFilterMine: "我的", - tribeFilterMembership: "成员资格", - tribeFilterRecent: "最近", - tribeFilterTop: "热门", - tribeFilterSubtribes: "子部落", - tribeFilterGallery: "画廊", tribeMainTribeLabel: "主部落", tribeCreateButton: "创建部落", tribeUpdateButton: "更新", @@ -2049,13 +1813,8 @@ module.exports = { tribeModeLabel: "模式", tribeIsAnonymousLabel: "状态", tribeMembersCount: "成员", - tribeInviteCodePlaceholder: "输入邀请码", - tribeJoinByCodeButton: "使用邀请码加入", - tribeJoinButton: "加入", tribeEnterInvite: "输入邀请码", tribeLeaveButton: "离开", - tribeYes: "是", - tribeNo: "否", tribePublic: "公开", tribePrivate: "私密", tribeGenerateInvite: "单次邀请", @@ -2064,13 +1823,8 @@ module.exports = { tribeRemoveInvitation: "移除邀请", tribeCreatedAt: "创建于", tribeAuthor: "作者", - tribeAuthorLabel: "作者", tribeStrict: "严格", tribeOpen: "开放", - tribeFeedFilterRECENT: "最近", - tribeFeedFilterMINE: "我的", - tribeFeedFilterALL: "全部", - tribeFeedFilterTOP: "热门", tribeFeedRefeeds: "转发", tribeFeedRefeed: "转发", tribeFeedMessagePlaceholder: "写一条动态…", @@ -2080,17 +1834,12 @@ module.exports = { tribeNotFound: "未找到部落!", createTribeTitle: "创建部落", updateTribeTitle: "更新部落", - tribeSectionOverview: "概览", tribeSectionInhabitants: "居民", tribeSectionVotations: "投票", tribeSectionEvents: "活动", - tribeSectionReports: "报告", tribeSectionTasks: "任务", tribeSectionFeed: "动态", tribeSectionForum: "论坛", - tribeSectionMarket: "市场", - tribeSectionJobs: "工作", - tribeSectionProjects: "项目", tribeSectionMedia: "媒体", tribeSectionImages: "图片", tribeSectionAudios: "音频", @@ -2128,11 +1877,6 @@ module.exports = { tribeTaskStatusClosed: "关闭", tribeTaskAssign: "分配", tribeTaskUnassign: "取消分配", - tribeReportCreate: "创建报告", - tribeReportsEmpty: "还没有报告。", - tribeReportTitle: "标题", - tribeReportDescription: "描述", - tribeReportCategory: "类别", tribeVotationCreate: "创建投票", tribeVotationsEmpty: "还没有投票。", tribeVotationTitle: "标题", @@ -2150,27 +1894,6 @@ module.exports = { tribeForumCategory: "类别", tribeForumReply: "回复", tribeForumReplies: "回复", - tribeMarketCreate: "创建商品", - tribeMarketEmpty: "还没有商品。", - tribeMarketTitle: "标题", - tribeMarketDescription: "描述", - tribeMarketPrice: "价格", - tribeMarketImage: "图片", - tribeMarketCategory: "类别", - tribeJobCreate: "创建工作", - tribeJobsEmpty: "还没有工作。", - tribeJobTitle: "标题", - tribeJobDescription: "描述", - tribeJobLocation: "位置", - tribeJobSalary: "薪资", - tribeJobDeadline: "截止日期", - tribeProjectCreate: "创建项目", - tribeProjectsEmpty: "还没有项目。", - tribeProjectTitle: "标题", - tribeProjectDescription: "描述", - tribeProjectGoal: "目标", - tribeProjectFunded: "已筹资", - tribeProjectDeadline: "截止日期", tribeMediaUpload: "上传媒体", readDocument: "阅读文档", tribeCreateImage: "创建图片", @@ -2181,7 +1904,6 @@ module.exports = { tribeMediaEmpty: "还没有媒体。", tribeMediaTitle: "标题", tribeMediaDescription: "描述", - tribeMediaType: "类型", tribeMediaTypeImage: "图片", tribeMediaTypeVideo: "视频", tribeMediaTypeAudio: "音频", @@ -2191,11 +1913,6 @@ module.exports = { tribeInviteCodeText: "邀请码:", oasisVersionLabel: "Oasis 版本", tribeInviteCodeHint: "将此邀请码分享给你想邀请的人,他们可在 /invites → Tribes 加入。", - tribeGroupTribe: "部落", - tribeGroupOffice: "办公", - tribeGroupNetwork: "网络", - tribeGroupEconomy: "经济", - tribeGroupMedia: "媒体", tribeStatusOpen: "开放", tribeStatusClosed: "已关闭", tribeStatusInProgress: "进行中", @@ -2205,33 +1922,17 @@ module.exports = { tribePriorityCritical: "严重", tribeTaskFilterAll: "全部", tribeMediaFilterAll: "全部", - tribeReportCatBug: "漏洞", - tribeReportCatAbuse: "滥用", - tribeReportCatContent: "内容", - tribeReportCatOther: "其他", tribeForumCatGeneral: "综合", tribeForumCatProposal: "提案", tribeForumCatQuestion: "问题", tribeForumCatAnnouncement: "公告", - tribeMarketCatGoods: "商品", - tribeMarketCatServices: "服务", - tribeMarketCatFood: "食品", - tribeMarketCatOther: "其他", tribeStatusLabel: "状态", tribeSubTribes: "子部落", tribeSubTribesCreate: "创建子部落", tribeSubTribesStrictDenied: "部落的严格模式不允许您创建新的子部落。请联系管理员。", - tribeSubTribesEmpty: "还没有创建子部落。", - tribeActivityJoined: "已加入", - tribeActivityLeft: "已离开", - tribeActivityFeed: "动态", tribeActivityRefeed: "转发", - tribeGroupAnalytics: "分析", - tribeGroupCreative: "创意", tribeSectionActivity: "活动记录", tribeSectionTrending: "热门", - tribeSectionOpinions: "观点", - tribeSectionPixelia: "PIXELIA", tribeSectionTags: "标签", tribeSectionSearch: "搜索", tribeActivityEmpty: "还没有活动。", @@ -2243,25 +1944,15 @@ module.exports = { tribeTrendingPeriodWeek: "本周", tribeTrendingPeriodAll: "全部时间", tribeTrendingEngagement: "参与度", - tribeOpinionsEmpty: "还没有观点。", - tribeOpinionsCast: "投票", - tribeOpinionsRankings: "排名", - tribeOpinionsAlreadyVoted: "已投票", tribeTopCategory: "最多投票", - tribePixeliaTitle: "Pixelia", - tribePixeliaDescription: "协作像素艺术画布。", - tribePixeliaPaint: "画", - tribePixeliaContributors: "贡献者", - tribePixeliaTotalPixels: "已绘制像素", tribeTagsEmpty: "未找到标签。", - tribeTagsCloud: "标签云", - tribeTagsContentWith: "带有标签的内容", tribeSearchPlaceholder: "搜索部落内容...", tribeSearchEmpty: "未找到结果。", tribeSearchResults: "结果", tribeSearchMinChars: "请输入至少2个字符进行搜索。", agendaTitle: "日程", agendaDescription: "在这里你可以找到所有分配给你的项目。", + agendaSearchPlaceholder: "搜索议程...", agendaFilterAll: "全部", agendaFilterToday: "今天", agendaFilterUpcoming: "即将到来", @@ -2280,20 +1971,9 @@ module.exports = { agendaFilterProjects: "项目", agendaFilterCalendars: "日历", agendaNoItems: "未找到分配项目。", - agendaAuthor: "作者", agendaDiscardButton: "丢弃", agendaRestoreButton: "恢复", - agendaCreatedAt: "创建于", - agendaTitleLabel: "标题", agendaMembersCount: "成员", - agendaDescriptionLabel: "描述", - agendaStatus: "状态", - agendaVisibility: "可见性", - agendaEventDate: "活动日期", - agendaEventLocation: "位置", - agendaEventPrice: "价格", - agendaEventUrl: "URL", - agendaTaskStart: "开始时间", agendaLocationLabel: "位置", agendaYes: "是", agendaNo: "否", @@ -2303,11 +1983,6 @@ module.exports = { agendareportCategory: "类别", agendareportSeverity: "严重程度", agendareportStatus: "状态", - agendareportDescription: "描述", - agendaTaskEnd: "结束时间", - agendaTaskPriority: "优先级", - agendaTransferFrom: "发起人", - agendaTransferTo: "接收人", agendaTransferConcept: "概念", agendaTransferAmount: "金额", agendaTransferDeadline: "截止日期", @@ -2317,47 +1992,7 @@ module.exports = { voteNow: "立即投票", alreadyVoted: "你已经表达了意见。", noOpinionsFound: "未找到观点。", - RECENTButton: "最近", TOPButton: "热门", - interestingButton: "有趣", - necessaryButton: "必要", - funnyButton: "搞笑", - disgustingButton: "恶心", - sensibleButton: "明智", - propagandaButton: "宣传", - adultOnlyButton: "仅限成人", - boringButton: "无聊", - confusingButton: "令人困惑", - usefulButton: "有用", - informativeButton: "信息丰富", - wellResearchedButton: "研究充分", - accurateButton: "准确", - needsSourcesButton: "需要来源", - wrongButton: "错误", - lowQualityButton: "低质量", - creativeButton: "有创意", - insightfulButton: "有洞察力", - actionableButton: "可操作", - inspiringButton: "鼓舞人心", - loveButton: "喜爱", - clearButton: "清晰", - upliftingButton: "振奋人心", - unnecessaryButton: "不必要", - rejectedButton: "被拒绝", - misleadingButton: "误导", - offTopicButton: "离题", - duplicateButton: "重复", - clickbaitButton: "标题党", - spamButton: "垃圾信息", - trollButton: "恶搞", - nsfwButton: "NSFW", - violentButton: "暴力", - toxicButton: "有毒", - harassmentButton: "骚扰", - hateButton: "仇恨", - scamButton: "诈骗", - triggeringButton: "触发性", - opinionsCreatedAt: "创建于", opinionsTotalCount: "总观点数", voteInteresting: "有趣", voteNecessary: "必要", @@ -2394,7 +2029,6 @@ module.exports = { voteCreative: "有创意", voteSpam: "垃圾信息", voteAdultOnly: "仅限成人", - publishBlog: "发布博客", privateMessage: "私信", pmSendTitle: "私信", pmSend: "发送!", @@ -2405,7 +2039,6 @@ module.exports = { pmComposeTitle: "发送消息", pmRecipients: "收件人", pmRecipientsHint: "输入 Oasis ID,用逗号分隔", - pmLevelOfExposition: "Level of exposition", pmLimitsHint: "每条消息最多 7 个收件人。", pmTextPlaceholder: "正文上限 7000 个字符。", pmSubject: "主题", @@ -2429,7 +2062,6 @@ module.exports = { pmCrypterCharsLabel: "字符", pmInvalidRecipients: "无效的 Oasis ID(应形如 @…=.ed25519)。", pmEncryptionLabel: "加密", - pmFile: "附件", private: "私密", privateDescription: "你的加密消息。", privateInbox: "收件箱", @@ -2439,10 +2071,8 @@ module.exports = { noPrivateMessages: "没有私信。", pmFromLabel: "发件人:", pmToLabel: "收件人:", - pmInvalidMessage: "无效消息", pmNoSubject: "(无主题)", pmSubjectLabel: "主题:", - pmBodyLabel: "正文", pmBotJobs: "JobsBot", pmBotProjects: "ProjectsBot", pmBotMarket: "MarketBot", @@ -2460,8 +2090,6 @@ module.exports = { inboxJobSubscribedTitle: "你的工作机会有新订阅", pmInhabitantWithId: "Oasis ID 为以下的居民:", pmHasSubscribedToYourJobOffer: "已订阅你的工作机会", - inboxProjectCreatedTitle: "新项目已创建", - pmHasCreatedAProject: "已创建一个项目", inboxMarketItemSoldTitle: "商品已售出", inboxShopSoldTitle: "商品已售出", pmYourItem: "你的商品", @@ -2471,7 +2099,6 @@ module.exports = { pmHasPledged: "已质押", pmToYourProject: "至你的项目", blockchain: '区块浏览器', - blockchainTitle: '区块浏览器', blockchainDescription: '探索和可视化区块链中的区块。', blockchainNoBlocks: '区块链中未找到区块。', blockchainStatsTitle: '统计', @@ -2483,19 +2110,17 @@ module.exports = { blockchainBlockCarbon: '碳足迹', blockchainBlockType: '类型', blockchainBlockTimestamp: '时间戳', - blockchainBlockContent: '区块', - blockchainBlockURL: 'URL:', - blockchainContent: '区块', - blockchainContentPreview: '区块内容预览', blockchainLatestDatagram: '最新数据报', - blockchainDatagram: '数据报', - blockchainDetails: '查看区块详情', - blockchainViewBlockexplorer: "在区块浏览器中查看", - blockchainBlockInfo: '区块信息', - blockchainBlockDetails: '所选区块的详情', + blockchainDatagram: "数据报", + blockchainDetails: "查看区块详情", + blockchainViewBlockexplorer: "在 Blockexplorer 中查看", blockchainBack: '返回区块浏览器', blockchainContentDeleted: "此内容已被标记为墓碑", - visitContent: "访问内容", + visitContent: "查看内容", + favoriteAdd: "固定到收藏", + pmContentTooltip: "发送私信", + favoriteRemove: "从收藏移除", + reportContent: "举报内容", banking: '银行', bankingTitle: '银行', bankingDescription: "ECOin 经济:余额、全民基本收入、税收与工业价值。", @@ -2504,21 +2129,17 @@ module.exports = { bankRules: '规则', pending: '待处理', closed: '已关闭', - bankBack: '返回银行', bankViewTx: '查看交易', bankClaimNow: '立即领取', bankClaimUBI: '领取 UBI!', bankClaimAndPay: 'Claim & Pay', bankClaimedPending: 'Claim pending...', - bankStatusUnclaimed: 'Unclaimed', bankStatusClaimed: 'Claimed', bankStatusExpired: 'Expired', bankPubOnly: 'PUB-only operation', - bankNoPendingUBI: '本期无待领取的 UBI 分配。', bankEpoch: '纪元', bankPool: '资金池(本纪元)', bankWeightsSum: '权重总和', - bankAllocations: '分配', bankNoAllocations: '未找到分配。', bankNoEpochs: '未找到纪元。', bankEpochAllocations: '纪元分配', @@ -2537,9 +2158,6 @@ module.exports = { bankYourFundsMonth: "你本月的资金", bankIndustryBalance: "工业产值(估算)", bankUserBalance: '你的余额', - ecoWalletNotConfigured: '未配置 ECOin 钱包', - editWallet: '编辑钱包', - addWallet: '添加钱包', bankAddresses: '地址', bankNoAddresses: '未找到地址。', bankUser: 'Oasis ID', @@ -2564,15 +2182,7 @@ module.exports = { search: '搜索!', bankLocal: '本地', bankFromOasis: 'Oasis', - bankMyAddress: '你的地址', - bankRemoveMyAddress: '移除我的地址', - bankNotRemovableOasis: '无法在本地移除地址', - bankingFutureUBI: "UBI", - pubIdTitle: "PUB Wallet", - pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", pubIdLabel: "PUB ID", - pubIdSave: "Save configuration", - pubIdPlaceholder: "@PUB_ID.ed25519", bankUbiAvailableNo: "资金不足!", bankUbiAvailableOk: "可用!", bankUbiAvailability: "全民基本收入(网络)", @@ -2589,13 +2199,6 @@ module.exports = { shopsTitle: "商店", shopDescription: "发现和管理网络中的商店。", shopTitle: "商店", - shopFilterAll: "全部", - shopFilterMine: "我的", - shopFilterRecent: "最近", - shopFilterTop: "热门", - shopFilterProducts: "产品", - shopFilterPrices: "价格", - shopFilterFavorites: "收藏", shopUpload: "创建商店", shopAllSectionTitle: "所有商店", shopMineSectionTitle: "我的商店", @@ -2612,16 +2215,10 @@ module.exports = { shopReachClearnet: "Clearnet", shopReachOasis: "Oasis", encryptedChipLabel: "E2E", - shopClearnetPublish: "发布到 Clearnet", - shopClearnetUnpublish: "从 Clearnet 撤下", - shopClearnetUrlLabel: "Clearnet 网址", - shopClearnetWarning: "发布到 Clearnet 后,本店铺可被外部搜索引擎和爬虫索引。", shopAddFavorite: "添加收藏", shopRemoveFavorite: "取消收藏", shopOpen: "开放", shopClosed: "关闭", - shopOpenShop: "开放商店", - shopCloseShop: "关闭商店", shopMakePrivate: "设为私密 (E2E)", shopMakePublic: "设为公开", shopProducts: "产品", @@ -2649,8 +2246,6 @@ module.exports = { shopOrderPrice: "价格", shopOrderBuyer: "买家", shopBackToShop: "返回商店", - shopShareUrl: "分享链接", - shopVisitShop: "访问商店", marketVisitItem: "查看商品", shopStatus: "状态", shopCreatedAt: "创建时间", @@ -2659,12 +2254,10 @@ module.exports = { shopLocation: "位置", shopTags: "标签", shopVisibility: "可见性", - shopImage: "图片", shopShortDescription: "简短描述", shopShortDescriptionPlaceholder: "店铺卡片简短描述(最多160个字符)", shopTitlePlaceholder: "您的店铺名称", shopDescriptionPlaceholder: "您的店铺详细描述", - shopUrlPlaceholder: "https://您的店铺网址.com", shopLocationPlaceholder: "城市,国家", shopTagsPlaceholder: "标签1, 标签2, 标签3", mapTitlePlaceholder: "地图标题", @@ -2682,7 +2275,6 @@ module.exports = { bankUnitMinutes: "分钟", bankUnitDays: "天", bankExchangeNoData: '无可用数据', - bankExchangeIndex: 'ECOin 价值(1小时)', bankInflation: 'ECOin 通胀率 (anual)', bankInflationMonthly: 'ECOin 通胀率 (mensual)', bankExchangeChartTitle: 'ECOin 价值随时间的演进', @@ -2696,38 +2288,17 @@ module.exports = { bankingSyncStatusOutdated: '已过时', statsTitle: '统计', statistics: "统计", - statsInhabitant: "居民统计", statsDescription: "发现你网络的统计数据。", ALLButton: "全部", MINEButton: "我的", TOMBSTONEButton: "墓碑", - statsYou: "你", - statsUserId: "Oasis ID", statsCreatedAt: "创建于", statsYourContent: "内容", statsYourOpinions: "观点", - statsYourTombstone: "墓碑", - statsNetwork: "网络", - statsTotalInhabitants: "居民", - statsDiscoveredTribes: "部落(公开)", - statsPrivateDiscoveredTribes: "部落(私密)", statsNetworkContent: "内容", - statsYourMarket: "市场", - statsYourJob: "工作", - statsYourProject: "项目", - statsYourTransfer: "转账", - statsYourForum: "论坛", statsNetworkOpinions: "观点", - statsDiscoveredMarket: "市场", - statsDiscoveredJob: "工作", - statsDiscoveredProject: "项目", - statsBankingTitle: "银行", statsEcoWalletLabel: "ECOIN 钱包", statsEcoWalletNotConfigured: "未配置!", - statsTotalEcoAddresses: "地址总数", - statsDiscoveredTransfer: "转账", - statsDiscoveredForum: "论坛", - statsNetworkTombstone: "墓碑", statsBookmark: "书签", statsEvent: "活动", statsTask: "任务", @@ -2749,16 +2320,12 @@ module.exports = { statsAiExchange: "AI", statsPUBs: 'PUB', statsPost: "帖子", - statsOasisID: "Oasis ID", statsSize: "总计(大小)", statsBlockchainSize: "区块链(大小)", statsBlobsSize: "Blob(大小)", statsActivity7d: "活动(最近7天)", statsActivity7dTotal: "7天总计", statsActivity30dTotal: "30天总计", - statsKarmaScore: "KARMA 评分", - statsPublic: "公开", - statsPrivate: "私密", day: "日", messages: "消息", statsProject: "项目", @@ -2770,30 +2337,14 @@ module.exports = { statsProjectsCancelled: "已取消", statsProjectsGoalTotal: "目标总额", statsProjectsPledgedTotal: "质押总额", - statsProjectsSuccessRate: "成功率", - statsProjectsAvgProgress: "平均进度", - statsProjectsMedianProgress: "中位数进度", - statsProjectsActiveFundingAvg: "平均活跃筹资", - statsJobsTitle: "工作", - statsJobsTotal: "工作总数", - statsJobsOpen: "开放", - statsJobsClosed: "已关闭", - statsJobsOpenVacants: "开放职位", - statsJobsSubscribersTotal: "订阅者总数", - statsJobsAvgSalary: "平均薪资", - statsJobsMedianSalary: "中位数薪资", statsMarketTitle: "市场", statsMarketTotal: "商品总数", statsMarketForSale: "在售", statsMarketReserved: "已预订", statsMarketClosed: "已关闭", statsMarketSold: "已售出", - statsMarketRevenue: "收入", - statsMarketAvgSoldPrice: "平均售价", statsUsersTitle: "居民", user: "居民", - statsTombstoneTitle: "墓碑", - statsNetworkTombstones: "网络墓碑", statsTombstoneRatio: "墓碑比率 (%)", statsParliamentCandidature: "议会候选", statsParliamentTerm: "议会任期", @@ -2820,30 +2371,21 @@ module.exports = { aiConfiguration: "设置提示语", aiPromptUsed: "提示语", aiClearHistory: "清除聊天记录", - aiSharePrompt: "将此回答添加到集体训练?", - aiShareYes: "是", - aiShareNo: "否", - aiSharedLabel: "已添加到训练", - aiRejectedLabel: "未添加到训练", aiServerError: "AI 无法回答。请重试。", aiInputPlaceholder: "什么是 Oasis?", typeAiExchange: "AI", aiApproveTrain: "添加到集体训练", aiRejectTrain: "不训练", - aiTrainPending: "待批准", aiTrainApproved: "已批准训练", aiTrainRejected: "已拒绝训练", aiSnippetsUsed: "使用的片段", aiSnippetsLearned: "已学习的片段", statsAITraining: "AI 训练", - aiApproveCustomTrain: "使用此自定义回答训练", aiCustomAnswerPlaceholder: "写下你的自定义回答…", - statsAIExchanges: "模型交流", marketMineSectionTitle: "你的商品", marketCreateSectionTitle: "创建商品", marketUpdateSectionTitle: "更新", marketAllSectionTitle: "市场", - marketRecentSectionTitle: "最近的市场", marketTitle: "市场", marketDescription: "在你的网络中交换商品或服务的市场。", marketFilterAll: "全部", @@ -2873,14 +2415,11 @@ module.exports = { marketItemDeadline: "截止日期", marketItemIncludesShipping: "包含运费?", marketItemHighestBid: "最高出价", - marketItemHighestBidder: "最高出价者", marketItemStock: "库存", marketOutOfStock: "缺货", - marketItemBidTime: "出价时间", marketActionsUpdate: "更新", marketUpdateButton: "更新", marketActionsDelete: "删除", - marketActionsSold: "标记为已售出", marketActionsChangeStatus: "更改状态", marketActionsBuy: "购买!", marketAuctionBids: "当前出价", @@ -2889,21 +2428,17 @@ module.exports = { marketNoItems: "暂无可用商品。", marketYourBid: "你的出价", marketCreateFormImageLabel: "上传媒体(最大:50MB)", - marketSearchLabel: "搜索", marketSearchPlaceholder: "搜索标题或标签", marketMinPriceLabel: "最低价格", marketMaxPriceLabel: "最高价格", - marketSortLabel: "排序", marketSortRecent: "最近", marketSortPrice: "价格", marketSortDeadline: "截止日期", marketSearchButton: "搜索", marketAuctionEndsIn: "结束于", marketAuctionEnded: "已结束", - marketMyBidBadge: "你已出价", marketNoItemsMatch: "没有匹配的商品。", housingTitle: "住所", - housingLabel: "住所", housingDescriptionText: "在你的网络中发现和管理住所。", modulesHousingLabel: "住所", modulesHousingDescription: "发现和管理住所的模块。", @@ -2947,14 +2482,7 @@ module.exports = { housingAvailableFrom: "可入住起始日", housingAvailableTo: "可入住截止日", housingTags: "标签", - housingImages: "照片(每张最大 50MB)", - housingRemovePhoto: "移除", spreadEditWarning: "编辑后此内容将失去已有的转发", - housingRemoveVideo: "移除视频", - housingAddPhoto: "添加照片", - housingAddVideo: "添加视频", - housingVideo: "视频(最大 50MB)", - housingPhotos: "照片", housingRequests: "申请", housingRequestButton: "申请", housingCancelButton: "取消申请", @@ -3023,7 +2551,6 @@ module.exports = { jobLocationPresencial: "现场", jobLocationRemote: "远程", jobVacantsPlaceholder: "职位数量", - jobSalaryPlaceholder: "每小时 ECO 薪资", jobImage: "上传媒体(最大:50MB)", jobTasks: "任务", jobType: "工作类型", @@ -3033,7 +2560,6 @@ module.exports = { jobsFilterTop: "热门", jobsTopTitle: "最高薪资工作", createJobButton: "发布工作", - viewDetailsButton: "查看详情", noJobsFound: "未找到工作机会。", jobAuthor: "作者", jobTypeFreelance: "自由职业", @@ -3045,10 +2571,6 @@ module.exports = { jobsHoursOffered: "提供的小时数", jobsHoursRequested: "请求的小时数", jobsExchangeSkill: "交换需要的技能", - jobsHoursOfferedPlaceholder: "如 4", - jobsHoursRequestedPlaceholder: "如 4", - jobsExchangeSkillPlaceholder: "如 木工、设计", - jobExchangeHint: "对于时间交换工作,请填写下面的字段,而不是薪水。", jobTimePartial: "兼职", jobTimeComplete: "全职", jobsDeleteButton: "删除", @@ -3056,28 +2578,17 @@ module.exports = { jobsFilterApplied: "已申请", jobsAppliedTitle: "我的申请", jobsAppliedBadge: "已申请", - jobsFilterFavs: "收藏", - jobsFavsTitle: "收藏", - jobsFilterNeeds: "需要帮助", - jobsNeedsTitle: "需要帮助", - jobsSearchLabel: "搜索", jobsSearchPlaceholder: "搜索标题、标签、描述...", jobsMinSalaryLabel: "最低薪资", jobsMaxSalaryLabel: "最高薪资", - jobsSortLabel: "排序", jobsSortRecent: "最近", jobsSortSalary: "最高薪资", jobsSortSubscribers: "最多申请者", jobsSearchButton: "搜索", - jobsFavoriteButton: "收藏", - jobsUnfavoriteButton: "取消收藏", - jobsMessageAuthorButton: "私信", jobsApplicants: "申请者", jobsUpdatedAt: "已更新", jobSetOpen: "设为开放", - jobNewBadge: "新", jobsTagsLabel: "标签", - jobsTagsPlaceholder: "标签1, 标签2, 标签3", noJobsMatch: "没有匹配的工作。", industrySearchPlaceholder: "搜索工厂…", industryAllSectors: "所有部门", @@ -3085,9 +2596,7 @@ module.exports = { industryAdvanceTo: "设为", industryAmount: "金额", industryApproveBuild: "批准", - industryBackToFacility: "← 工厂", industryBlueprint: "蓝图", - industryBlueprintLabel: "工业蓝图", industryBlueprints: "蓝图", industryBuild: "构建", industryBuildNotes: "备注", @@ -3100,18 +2609,13 @@ module.exports = { industryBuilds: "构建", industryBuildTitle: "标题", industryContribute: "贡献", - industryContributeEco: "贡献 ECO", - industryContributeLabor: "贡献劳动", industryContributeButton: "贡献", - industryContributeMaterial: "贡献材料", industryContributions: "贡献", - industryContributors: "贡献者", industryCreateBlueprintButton: "创建蓝图", industryDistribute: "分配", industryDistributeButton: "按份额分配", industryDistribution: "分配", industryEcoAmount: "金额 (ECO)", - industryEcoContribHint: "ECO 贡献将转给管理人,作为构建资金的托管人。", industryEditBlueprint: "编辑蓝图", industryFacility: "工厂", industryKindLabel: "类型", @@ -3120,13 +2624,10 @@ module.exports = { industryKind_eco: "资金", industryLaborHours: "人工(小时)", industryHours: "小时", - industryLicense: "许可", industryMaterialItem: "材料", industryMaterials: "材料", - industryMaterialsHint: "每行一种材料,格式为 名称:数量:价格。", industryEstMaterials: "材料总计", industryEstLabor: "人工总计", - industryEstTaxes: "税", industryEstTotal: "预计价格", industryBuildingPrice: "制造价格", industryFinalPrice: "最终价格", @@ -3136,19 +2637,13 @@ module.exports = { industryNewBlueprint: "新建蓝图", industryNewBuild: "提议构建", industryEditBuild: "编辑生产", - industryNoBlueprint: "— 无 —", industryNeedBlueprint: "请先创建蓝图:每次生产都基于蓝图。", industryNoBlueprints: "还没有蓝图。", industryNoBuilds: "还没有构建。", industryNote: "备注", industryOutput: "产出", - industryOutputItem: "产品名称", industryOutputKind: "产品类型", - industryOutputQty: "每次生产的单位数", - industryOutputUnit: "计量单位", industryOutputValue: "产出价值(ECO,例如来自销售)", - industryPayout: "支付", - industryPoints: "Karma", industryPostJob: "创建工作", industryPot: "资金池", industryProposeBuildButton: "提议构建", @@ -3156,8 +2651,6 @@ module.exports = { industryAuthor: "作者", industrySellOnMarket: "发送到市场", industrySendToProjects: "创建项目", - industryShare: "份额", - industryShares: "份额", industrySkills: "技能", industryTreasury: "资金", industryKind_physical: "实体", @@ -3171,6 +2664,16 @@ module.exports = { industryBuildStatus_FAILED: "已失败", pmBotIndustry: "IndustryBot", pmBotHousing: "HousingBot", + pmBotJobs: "JobsBot", + jobsBotMatchTitle: "有一份工作与你的简历匹配", + jobsBotMatchIntro: "有一份工作与你的简历匹配。", + jobsBotMatchJob: "工作", + jobsBotMatchHint: "你收到这条消息是因为你的简历由 AI 管理。可在简历中关闭。", + cvAiManaged: "AI 管理", + switchOn: "开启", + switchOff: "关闭", + cvAiManagedHint: "开启后,当有工作与你的简历匹配时,JobsBot 会通过私信通知你。", + cvMatchThreshold: "达到此匹配度时通知我", housingBotRequestedTitle: "有人申请了你的一处住所。", housingBotCancelledTitle: "一处住所的申请已被取消。", housingBotYouRequestedTitle: "你申请了一处住所。", @@ -3199,22 +2702,14 @@ module.exports = { industryRulesDistribution: "生产完成后,管理者将资金池(生产资金加销售价值)按贡献份额分配给贡献者。", industryRulesTreasury: "ECO 贡献由管理人作为构建资金托管人保管,直到分配;所有流动都记录在网络上,纠纷可提交 Courts。", industryJobs: "职位", - industryNoJobs: "还没有职位。", - industryCreatePosition: "创建职位", - industryViewCV: "简历", industryReportButton: "举报", industryCreateTask: "创建任务", industryOpenDispute: "发起争议", industryMaterialsPlaceholder: "solar-panel:2:120\nbattery:1:80\nkit:1:15", - industryOutputUnitPlaceholder: "例如 个、kg、许可证", - industryOutputItemPlaceholder: "例如 机器人", - industryOutputQtyPlaceholder: "例如 5", - industrySkillsPlaceholder: "例如 焊接、网络、太阳能安装", industryCreateInvite: "生成邀请", industryPauseVotes: "状态票数", industryTitle: "工业", industryDescription: "用于集体管理生产资料的模块。", - industryLabel: "工业", typeIndustryBuild: "构建", typeIndustryBlueprint: "蓝图", typeIndustryAllocation: "分配", @@ -3263,9 +2758,7 @@ module.exports = { industryInviteNeeded: "你需要邀请才能加入。", industryPauseButton: "投票暂停", industryResumeButton: "投票恢复", - industryEditButton: "编辑", industryDeleteButton: "删除", - industryBackToList: "← 工业", industryPendingApplicants: "待处理申请", industryVotesYes: "赞成", industryVotesNo: "反对", @@ -3273,23 +2766,13 @@ module.exports = { industryAdmit: "接纳", industryReject: "拒绝", industryDissolveTitle: "解散工厂", - industryDissolveHint: "解散需要集体投票;管理人不能单独解散。", industryDissolveVote: "投票解散", - industrySector_software: "软件", - industrySector_hardware: "硬件", - industrySector_agriculture: "农业", - industrySector_textile: "纺织", - industrySector_energy: "能源", - industrySector_food: "食品", - industrySector_construction: "建筑", - industrySector_media: "媒体", - industrySector_services: "服务", - industrySector_other: "其他", industryPolicy_open: "开放", industryPolicy_vote: "投票", industryPolicy_invite: "仅邀请", projectsTitle: "项目", projectsDescription: "创建、资助和关注你网络中的社区驱动项目。", + projectSearchPlaceholder: "搜索项目...", projectCreateProject: "创建项目", projectCreateButton: "创建项目", projectUpdateButton: "更新", @@ -3333,14 +2816,8 @@ module.exports = { projectPledgeTitle: "支持此项目", projectPledgePlaceholder: "ECO 金额", projectBounties: "悬赏", - projectBountiesInputLabel: "悬赏(每行一个:标题|金额 [ECO]|描述)", - projectBountiesPlaceholder: "修复 UI 漏洞|100|问题链接\n编写文档|250|列出使用示例", projectNoBounties: "未找到悬赏。", projectTitle: "标题", - projectAddBountyTitle: "新悬赏", - projectBountyTitle: "悬赏标题", - projectBountyAmount: "金额 (ECO)", - projectBountyDescription: "描述", projectMilestoneSelect: "选择里程碑", projectBountyCreateButton: "创建悬赏", projectBountyStatus: "悬赏状态", @@ -3355,19 +2832,15 @@ module.exports = { projectMilestoneTitle: "里程碑标题", projectMilestoneTargetPercent: "百分比 (%)", projectMilestoneDueDate: "日期", - projectMilestoneCreateButton: "创建里程碑", projectMilestoneStatus: "里程碑状态", projectMilestoneOpen: "开放", projectMilestoneDone: "已完成", projectMilestoneDue: "截止", - projectNoMilestones: "未找到里程碑。", projectMilestoneMarkDone: "标记为已完成", projectMilestoneTitlePlaceholder: "输入里程碑标题", projectMilestoneDescriptionPlaceholder: "输入此里程碑的描述", projectMilestoneDescription: "里程碑描述", - projectBudgetGoal: "预算(目标)", projectBudgetAssigned: "已分配至悬赏", - projectBudgetRemaining: "剩余", projectBudgetOver: "⚠ 超出预算:分配金额超过目标", projectFollowers: "关注者", projectFollowersTitle: "关注者", @@ -3380,7 +2853,6 @@ module.exports = { projectBackersTotalPledged: "质押总额", projectBackersYourPledge: "你的质押", projectBackersNone: "还没有质押。", - projectNoRemainingBudget: "没有剩余预算。", projectFilterBackers: "支持者", projectFilterApplied: "已申请", projectAppliedTitle: "已申请", @@ -3389,30 +2861,15 @@ module.exports = { projectBackerAmount: "总贡献", projectBackerPledges: "质押", projectBackerProjects: "项目", - projectPledgeAmount: "金额", projectSelectMilestoneOrBounty: "选择里程碑或悬赏", projectPledgeButton: "质押", footerLicense: "GPLv3", - footerPackage: "软件包", - footerVersion: "版本", modulesModuleName: "名称", modulesModuleDescription: "描述", modulesModuleStatus: "状态", modulesTotalModulesLabel: "已加载模块", modulesEnabledModulesLabel: "已启用", modulesDisabledModulesLabel: "已禁用", - modulesPopularLabel: "精选", - modulesPopularDescription: "接收热门、最多浏览或最多评论帖子的模块。", - modulesTopicsLabel: "话题", - modulesTopicsDescription: "接收基于共同兴趣的讨论类别的模块。", - modulesSummariesLabel: "摘要", - modulesSummariesDescription: "接收长讨论或帖子摘要的模块。", - modulesLatestLabel: "最新", - modulesLatestDescription: "接收最新帖子和讨论的模块。", - modulesThreadsLabel: "讨论串", - modulesThreadsDescription: "接收按话题或问题分组的对话的模块。", - modulesMultiverseLabel: "多元宇宙", - modulesMultiverseDescription: "接收来自其他联邦节点内容的模块。", modulesInvitesLabel: "邀请", modulesInvitesDescription: "管理和应用邀请码的模块。", modulesWalletLabel: "钱包", @@ -3453,8 +2910,12 @@ module.exports = { modulesOpinionsDescription: "发现和为观点投票的模块。", modulesTransfersLabel: "转账", modulesTransfersDescription: "发现和管理智能合约(转账)的模块。", - modulesFediverseLabel: "联邦宇宙", - modulesFediverseDescription: "管理你的其他联邦宇宙账户,包括发送和接收内容。", + modulesFediverseLabel: "多元宇宙", + modulesBlogsLabel: "博客", + modulesBlogsDescription: "用于发现和管理博客的模块。", + modulesPollsLabel: "投票", + modulesPollsDescription: "用于向网络提问并统计答案的模块。", + modulesFediverseDescription: "管理你的其他多元宇宙账户,包括发送和接收内容。", modulesFeedLabel: "动态", modulesFeedDescription: "发现和分享短文(动态)的模块。", modulesParliamentLabel: "议会", @@ -3490,37 +2951,33 @@ module.exports = { visibilityMakeHidden: "设为隐藏", invitesInhabitantsTitle: "居民", invitesInhabitantsFollow: "关注", - aiNavPlaceholder: "你想去哪里?", + aiNavPlaceholder: "描述你需要什么...", aiNavDisabled: "AI 导航已停用。", - aiNavResultsTitle: "AI 导航建议", + aiNavResultsTitle: "AINav 建议", aiNavQueryLabel: "查询", - aiNavResultsDescription: "选择最符合你需求的路径。", - aiNavResultPath: "路径", - aiNavResultDescription: "你可以做什么", aiNavResultMatch: "匹配度", aiNavResultsEmpty: "无匹配路径,请尝试 /search。", - aiNavSearchInstead: "改为搜索", modulesAINavLabel: "AINav", modulesAINavDescription: "用于以自然语言查询网络内容的模块。", - directConnect: "直接连接", directConnectDescription: "通过输入对方的 IP 地址、端口和公钥直接连接到节点。该节点将被添加为已关注的连接。", peerHost: "IP", peerPort: "端口(默认:8008)", peerPublicKey: "公钥 (@...ed25519)", connectAndFollow: "连接", - deviceSourceLabel: "设备来源", modulesPresetTitle: "常用配置", - modulesPreset_minimal: "极简", - modulesPreset_basic: "基础", - modulesPreset_social: "社交", - modulesPreset_economy: "经济", - modulesPreset_full: "完整", + workflowsTitle: "工作模式", + workflowsDescription: "工作模式会设定主题与启用的模块。", + workflowsSet: "应用工作模式", + workflow_default: "默认", + workflow_jobs: "工作", + workflow_ruling: "治理", + workflow_politics: "政治", + workflow_social: "社交", + workflow_business: "商务", + workflow_night: "夜间", + workflow_mobile: "移动端", statsCarbonFootprintTitle: "碳足迹", - statsCarbonFootprintNetwork: "网络碳足迹", - statsCarbonFootprintYours: "你的碳足迹", statsCarbonTombstone: "墓碑碳足迹", - feedSuccessMsg: "动态发布成功!", - dominantOpinionLabel: "主流观点", uploadMedia: "上传媒体(最大:50MB)", feedOpenDiscussion: "公开讨论", feedDetailTitle: "动态", @@ -3553,14 +3010,13 @@ module.exports = { mapDescriptionLabel: "描述", mapDescriptionPlaceholder: "描述地图或位置...", mapTypeLabel: "地图类型", - mapTypeSingle: "单一(仅初始位置)", - mapTypeOpen: "开放(任何人可添加标记)", - mapTypeClosed: "封闭(仅创建者可添加标记)", + mapInviteMode: "邀请", + mapTypeSingle: "单一", + mapTypeOpen: "开放", + mapTypeClosed: "封闭", mapTagsLabel: "标签", mapTagsPlaceholder: "输入以逗号分隔的标签", mapUrlLabel: "地图链接", - mapPickCoordLabel: "或在网格上选择位置:", - mapMarkersLabel: "标记", mapMarkersTitle: "标记", mapMarkerDefault: "标记", mapMarkerLatLabel: "标记纬度", @@ -3587,14 +3043,9 @@ module.exports = { padTitle: "协作板", modulesPadsLabel: "协作板", modulesPadsDescription: "管理协作文本编辑器的模块。", - padFilterAll: "全部", - padFilterMine: "我的", - padFilterRecent: "最近", - padFilterOpen: "开放", - padFilterClosed: "关闭", padCreate: "创建协作板", - padUpdate: "更新协作板", - padDelete: "删除协作板", + padUpdate: "更新", + padDelete: "删除", padTitleLabel: "标题", padTitlePlaceholder: "输入协作板标题...", padStatusLabel: "状态", @@ -3605,14 +3056,7 @@ module.exports = { padTagsLabel: "标签", padTagsPlaceholder: "标签1, 标签2, ...", padMembersLabel: "成员", - padVisitPad: "访问协作板", - padShareUrl: "分享链接", padCreated: "创建时间", - padAuthor: "作者", - padGenerateCode: "生成邀请码", - padInviteCodeLabel: "邀请码", - padInviteCodePlaceholder: "输入邀请码...", - padValidateInvite: "验证", padStartEditing: "开始编辑!", padEditorPlaceholder: "开始写作...", padSubmitEntry: "提交", @@ -3625,12 +3069,11 @@ module.exports = { padClosedSectionTitle: "关闭协作板", padCreateSectionTitle: "创建新协作板", padUpdateSectionTitle: "更新协作板", - padInviteGenerated: "邀请码已生成", typePad: "协作板", padNew: "新建", padAddFavorite: "添加到收藏", padRemoveFavorite: "从收藏中移除", - padClose: "关闭记事本", + padClose: "关闭", padBackToEditor: "返回编辑器", padSearchPlaceholder: "搜索共享文本...", @@ -3638,8 +3081,6 @@ module.exports = { modulesChatsDescription: "发现和管理加密聊天室的模块。", typeChat: "聊天", typeChatMessage: "聊天消息", - chatLabel: "聊天", - chatMessageLabel: "聊天消息", chatsTitle: "聊天", chatMineSectionTitle: "Your Chats", chatRecentTitle: "Recent Chats", @@ -3647,56 +3088,52 @@ module.exports = { chatOpenTitle: "Open Chats", chatClosedTitle: "Closed Chats", chatDescription: "描述", - chatMessageReply: "回复", - chatMessageLabel: "消息", chatCategory: "类别", chatStatus: "状态", - chatFilterAll: "全部", - chatFilterMine: "我的", - chatFilterRecent: "最近", - chatFilterFavorites: "收藏", - chatFilterOpen: "开放", - chatFilterClosed: "已关闭", chatCreate: "创建聊天", - chatUpdate: "更新聊天", - chatDelete: "删除聊天", + chatUpdate: "更新", + chatDelete: "删除", chatClose: "关闭聊天", chatVisitChat: "访问聊天", chatUntitled: "无标题聊天", chatNoItems: "未找到聊天。", chatParticipants: "参与者", - chatStartChatting: "开始聊天!", - chatGenerateCode: "生成代码", - chatShareUrl: "分享链接", + chatMessagesLabel: "消息", + chatThreadsLabel: "话题", chatCreatedAt: "创建时间", chatSearchPlaceholder: "搜索聊天...", chatStatusOpen: "开放", chatStatusInviteOnly: "仅限邀请", chatStatusClosed: "已关闭", chatSendMessage: "发送", + chatJumpLatest: "最新消息", + chatPickChat: "选择一个聊天以打开", + chatNoneYet: "目前还没有可用的聊天。", + activitySearchPlaceholder: "在动态中搜索...", + trendingSearchPlaceholder: "在热门中搜索...", + opinionsSearchPlaceholder: "在观点中搜索...", + votesSearchPlaceholder: "在表决中搜索...", + welcomeStepUxTitle: "选择你的界面", + welcomeStepUxText: "决定 Oasis 的外观。之后可在设置中更改。", + welcomeStepUxAction: "使用此视图", + chatRateLimitTitle: "消息过多", + chatRateLimitMessage: "你已达到该房间每小时的消息上限,请稍后再试。", chatMessagePlaceholder: "输入您的消息...", chatNoMessages: "暂无消息。", - chatLeave: "离开聊天", - chatInviteCodeLabel: "输入邀请码", - chatJoinByInvite: "加入", chatTitlePlaceholder: "聊天标题", chatDescriptionPlaceholder: "聊天描述", chatTagsPlaceholder: "标签1, 标签2", chatImageLabel: "选择图片文件 (.jpeg, .jpg, .png, .gif)", - chatInviteCode: "邀请码", chatAuthor: "作者", - chatCreated: "创建", chatAddFavorite: "添加到收藏", chatRemoveFavorite: "从收藏中移除", chatPM: "私信", chatStatusLabel: "状态", chatCategoryLabel: "类别", - chatParticipantsLabel: "参与者", gamesTitle: "游戏", gamesDescription: "发现并玩一些游戏。", gamesFilterAll: "全部", gamesPlayButton: "开始游戏!", - gamesBackToGames: "返回游戏", modulesGamesLabel: "游戏", modulesGamesDescription: "用于发现和玩游戏的模块。", modulesGraphosLabel: "Graphos", @@ -3713,8 +3150,6 @@ module.exports = { gamesArkanoidDesc: "用你的球拍和球打破所有砖块。经典街机挑战。", gamesPingPongTitle: "PingPong", gamesPingPongDesc: "与AI对战的经典乒乓球。先得5分者获胜。", - gamesOutrunTitle: "Outrun", - gamesOutrunDesc: "与时间赛跑!躲避交通障碍,在时间用完前到达终点。", gamesAsteroidsTitle: "Asteroids", gamesAsteroidsDesc: "驾驶飞船穿越小行星带。在它们撞上你之前将其摧毁。", gamesRockPaperScissorsTitle: "石头剪刀布", @@ -3735,8 +3170,6 @@ module.exports = { gamesAudioPendulumTitle: "Audio Pendulum", gamesAudioPendulumDesc: "Chaotic physics simulator with real-time audio synthesis. Angular velocities become frequencies, peaks become drum hits. No two simulations sound alike.", gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?", - gamesQuakeTitle: "Quake Arena", - gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", gamesFilterScoring: "SCORING", gamesHallOfFame: "Hall of Fame", gamesHallPlayer: "Player", @@ -3747,12 +3180,6 @@ module.exports = { modulesCalendarsLabel: "日历", modulesCalendarsDescription: "用于发现和管理日历的模块。", typeCalendar: "日历", - calendarFilterAll: "全部", - calendarFilterMine: "我的", - calendarFilterOpen: "开放", - calendarFilterClosed: "关闭", - calendarFilterRecent: "最近", - calendarFilterFavorites: "收藏", calendarCreate: "创建日历", calendarUpdate: "更新", calendarDelete: "删除", @@ -3765,24 +3192,17 @@ module.exports = { calendarTagsLabel: "标签", calendarTagsPlaceholder: "标签1, 标签2...", calendarParticipantsLabel: "参与者", - calendarParticipantsCount: "参与者", - calendarVisitCalendar: "访问日历", calendarCreated: "已创建", - calendarAuthor: "作者", calendarJoin: "加入", calendarGenerateInvite: "生成邀请", - calendarInviteCodePlaceholder: "输入邀请码...", - calendarValidateInvite: "验证邀请码", - calendarJoined: "已加入", - calendarAddDate: "添加日期", - calendarAddNote: "添加笔记", calendarDateLabel: "日期", calendarDatePlaceholder: "描述这个日期...", - calendarNoteLabel: "笔记", + calendarNoteLabel: "备注", calendarNotePlaceholder: "添加笔记...", calendarFirstDateLabel: "日期", calendarFirstNoteLabel: "备注", calendarIntervalLabel: "Interval", + calendarIntervalNone: "不重复", calendarIntervalWeekly: "Weekly", calendarIntervalMonthly: "Monthly", calendarIntervalYearly: "Yearly", @@ -3793,8 +3213,6 @@ module.exports = { calendarsDescription: "在您的网络中发现和管理日历。", calendarMonthPrev: "← 上一月", calendarMonthNext: "下一月 →", - calendarMonthLabel: "日期", - calendarsShareUrl: "分享链接", calendarAllSectionTitle: "日历", calendarRecentSectionTitle: "最近的日历", calendarFavoritesSectionTitle: "收藏", @@ -3808,7 +3226,6 @@ module.exports = { calendarRemoveFavorite: "从收藏移除", calendarSearchPlaceholder: "搜索日历...", calendarAddEntry: "添加条目", - calendarLeave: "离开日历", statsCalendar: "日历", statsCalendarDate: "日历日期", statsCalendarNote: "日历笔记", @@ -3855,7 +3272,6 @@ module.exports = { torrentSortOldest: "最旧", torrentSortTop: "最多投票", torrentNoMatch: "没有匹配的种子。", - torrentMessageAuthorButton: "给作者发消息", torrentUpdatedAt: "已更新", statsTorrent: "种子", typeTorrent: "种子", @@ -3863,10 +3279,18 @@ module.exports = { modulesTorrentsDescription: "发现和管理种子的模块。", favoritesFilterTorrents: "种子", favoritesFilterMarket: "市场", + favoritesFilterEvents: "活动", + favoritesFilterForum: "论坛", + favoritesFilterHousing: "住房", + favoritesFilterJobs: "工作", + favoritesFilterProjects: "项目", + favoritesFilterReports: "报告", + favoritesFilterTasks: "任务", + favoritesFilterTransfers: "转账", + favoritesFilterVotes: "投票", favoritesFilterShopProducts: "商店商品", tribeSectionTorrents: "种子", tribeCreateTorrent: "上传种子", - tribeMediaTypeTorrent: "种子", settingsWishTitle: "愿望", settingsWishDesc: "配置您的头像愿望。", settingsWishWhole: "Multiverse", @@ -3877,16 +3301,10 @@ module.exports = { settingsPmVisibilityWhole: "Multiverse", settingsPmVisibilityMutuals: "Only mutual-support", pmMutualNotice: "出站是 UX 保护。入站是关注过滤器。", - pmBlockedNonMutual: "只能向相互支持的居民发送私信。", inhabitantsPendingFollowsTitle: "待处理的支持请求", inhabitantsPendingAccept: "接受", inhabitantsPendingReject: "拒绝", - bxEncrypted: "已加密", - bxEncryptedHexLabel: "密文(预览)", tribeSectionGovernance: "治理", - tribeSubStatusPublic: "公开", - tribeSubStatusPrivate: "私密", - tribeSubInheritedPrivate: "私密(继承自主部落)", tribePadInviteRequired: "您无权访问 pad。请求邀请。", tribeChatInviteRequired: "您无权访问聊天。请求邀请。", tribeGovernanceDesc: "此部落的内部治理。", @@ -3926,44 +3344,31 @@ module.exports = { tribeGovNoHistorical: "暂无任何记录", logsTitle: "日志", logsDescription: "记录您在网络中的体验。", - logsReadMore: "阅读更多", logsViewTitle: "日志", logsColumnType: "类型", logsView: "查看", - logsManualPrompt: "撰写您的日志", logsUpdateButton: "更新", - logsEditTitle: "编辑条目", - logsCreateDescription: "记录您的体验...", + logsEditTitle: "更新日志", logsCreateTitle: "创建条目", logsWriteButton: "撰写", logsTextPlaceholder: "描述您的体验...", - logsTextField: "文本", - logsLabelPlaceholder: "标签...", - logsLabelField: "撰写您的日志(标签)", - logsAiDisabledWarn: "在 /modules 中启用 AI 模块以使用 AI 撰写的日志。", - logsAiContextValue: "区块链日", - logsAiContext: "上下文", - logsAiModStatus: "AImod", - logsModeApply: "应用!", logsModeAIWritten: "AI-Assistant", logsModeManual: "手动", logsModeAI: "AI", - logsColumnDelete: "删除", - logsColumnEdit: "编辑", logsColumnLog: "日志", logsColumnDate: "日期", logsDelete: "删除", - logsEdit: "编辑", + logsEdit: "更新", logsFilterAlways: "始终", logsFilterYear: "去年", logsFilterMonth: "上月", logsFilterWeek: "上周", logsFilterToday: "今天", - logsFilterRecent: "最近", - logsFilterAll: "全部", + logsComments: "评论", + logsAuthorEntries: "条目", logsCreate: "创建条目", logsExport: "导出日志", - logsExportOne: "导出", + logsExportOne: "导出日志", logsViewDetails: "查看详情", logsGenerateButton: "生成文本", logsSearchText: "在日志中搜索...", @@ -3973,31 +3378,25 @@ module.exports = { modulesLogsLabel: "日志", modulesLogsDescription: "用于(通过 AI 助手)记录体验的模块。", statsLogsTitle: "日志", - statsLogsEntries: "条目", typeLog: "日志", - blockchainCycle: "周期", larpTitle: "L.A.R.P.", larpDescription: "用于协作实验的实时角色扮演层。", + larpNoHousesMatch: "没有匹配的家族。", + larpSearchPlaceholder: "搜索家族...", larpAllHouses: "家族:", larpFilterRuling: "执政", larpFilterHouses: "家族", larpFilterRules: "FAQ", larpRulesTitle: "L.A.R.P. FAQ", - larpRulesEntryTitle: "起始家族", larpRulesEntryText: "每位居民默认从 ACADEMIA 开始。在 ACADEMIA 中,从“加入家族”面板选择一个家族:这将打开其入会测试。回答 10 道问题并提交。若达到阈值(7/10),你将被自动接纳进入该家族;否则将被拒绝,留在 ACADEMIA 中。无论如何,系统会记录你的 OasisID 和尝试周期,并在 30 个周期的冷却期结束前阻止再次尝试。", - larpRulesLeaveText: "任何家族的成员都可以随时从其家族页面返回 ACADEMIA;这样会重置其成员身份,但不会取消测试的冷却时间。", - larpRulesGovernanceTitle: "执政墙", larpRulesGovernanceText: "在其执政周期内,执政家族佩戴“执政”徽章,是唯一其墙面在“执政”标签下公开显示的家族。", - larpRulesSignTitle: "L.A.R.P. 徽章", + larpRulesWallText: "每个家族都有一面墙,供其成员书写。家族墙对外不公开,但执政家族的墙和 ACADEMIA 的墙人人可读。", larpRulesSignText: "居民可在 /profile/edit > 传感器 中启用,将当前家族的图像作为徽记显示在个人资料、作者卡和居民卡上。徽记链接到家族页面。", larpPostsTitle: "墙", larpPostsEmpty: "暂无发布。", - larpPostLabel: "新发布", larpPostPlaceholder: "这个家族想说什么?", - larpPostPublic: "公开(所有人可见,否则仅限成员)", larpPostSubmit: "发布", - larpPostMembersOnly: "仅成员", larpCycleLabel: "周期:", audioBackToBcs: "Back to BCS", audioFilterBcs: "BCS", @@ -4114,12 +3513,9 @@ module.exports = { bankTaxesLookupNote: "输入区块 ID 在本地数据流中查询。", bankTaxesUserNoteChipsClick: "点击任何标签以在 blockexplorer 中检查其区块。", mapUrlPlaceholder: "/maps/MAP_ID", - larpRulesInviteEntry: "邀请码", larpRulesInviteEntryText: "家族成员可以生成邀请码,提供对家族的直接访问。", larpRulesOneHouseText: "你在任何时刻最多只能属于一个家族。如果你不属于任何家族,你就在 ACADEMIA。每个非 ACADEMIA 的家族页面都向其成员显示一个\"离开家族\"按钮,将成员身份重置为 ACADEMIA。离开并不会取消测试冷却。", - larpRulesOneHouseTitle: "一次一个家族", - larpRulesTestEntry: "WILL 测试", - larpRulesTestEntryText: "每个选项对一个或多个家族加权;提交时,系统统计得分并自动将你纳入得分最高的家族。", + larpRulesTestEntryText: "在 WILL 测试中,每个选项会为一个或多个家族加权;提交后系统统计得分,并自动把你录入得分最高的家族。", larpWillTestHint: "完成后,你将被分配到与你的回答最匹配的家族。你的单个回答在本地处理,从不存储 — 只有最终的家族分配会发布到你的信息流。", larpWillTestTitle: "WILL 测试", settingsLanDesc: "定期向同一局域网中的其他 Oasis 实例广播此节点。禁用以停止 UDP 广播。", @@ -4138,31 +3534,27 @@ module.exports = { aiExchangeMarkHelpful: "+1 有帮助", larpCyclesUntilRuling: "下一执政周期", larpVisitTribe: "访问部落", + larpStartJourney: "开始旅程", larpGoverning: "执政:", + larpStartHere: "从这里开始:", larpMyHouse: "我的家族:", larpMembersCount: "成员", - larpMembersTitle: "成员", - larpNoMembers: "暂无成员。", larpRolesLabel: "角色", larpFunctionLabel: "功能", larpMonthLabel: "执政周期", larpLeaveToAcademia: "返回 ACADEMIA", - larpAcademiaJoinTitle: "加入家族", - larpAcademiaJoinHint: "进行心理画像测试以被分配到最适合你的家族,或使用家族成员分享的邀请码。", - larpTakeTestButton: "进行画像测试", + larpAcademiaJoinTitle: "L.A.R.P. 家族", larpInviteRedeem: "加入家族", larpInviteCreate: "生成邀请码", larpInvitePlaceholder: "邀请码", larpInviteBannerTitle: "新邀请码", larpInviteBannerHint: "将此代码分享给 ACADEMIA 中的某人。30 个周期后过期,或使用一次后失效。", - larpTestAssignedHouse: "已分配家族", larpTestRankingTitle: "各家族分数", invitesHousesTitle: "L.A.R.P.", invitesHouseInviteCodePlaceholder: "家族邀请码", invitesHouseJoinButton: "加入家族", larpLastAttemptTitle: "你最近的尝试", larpLastAttemptHouse: "家族", - larpLastAttemptResult: "结果", larpLastAttemptWhen: "时间", larpLastAttemptCooldown: "下次尝试还需", larpTestTitle: "入会测试", @@ -4171,37 +3563,14 @@ module.exports = { larpTestCooldownActive: "下次测试可用还需", larpTestCooldownDays: "周期", larpTestResultTitle: "测试结果", - larpTestPassed: "测试通过 — 欢迎!", - larpTestFailed: "测试未通过", larpTestScore: "得分", larpTestNextAttempt: "你可以在 30 个周期后再次尝试测试。", larpGoToHouse: "前往你的家族", larpBackToAcademia: "返回 ACADEMIA", - larpBackToHouses: "◀ 家族", larpBadgeYou: "你", larpBadgeRuling: "执政", modulesLarpLabel: "L.A.R.P.", modulesLarpDescription: "Oasis 实时角色扮演层(9 个家族)的模块。", - melodyUploadTitlePlaceholder: "Composition title", - melodyUploadDescPlaceholder: "Optional description", - ecoinTaxLabel: "ECOin Tax", - bankTaxesNetworkTitle: "Network Taxes", - bankTaxesUserTitle: "Your taxes", - bankTaxesUserNote: "Your ECO tax is deducted from the surplus the network generates on top of your UBI; the base UBI value is set as an immovable minimum. The tax is never deducted from the fixed amount that corresponds to each inhabitant as UBI. The deducted funds feed the wealth-redistribution algorithm and are channeled back to other inhabitants via their UBI claims. Those other inhabitants who receive more UBI for their projects will likely have some task dedicated to helping you reduce your ECO tax. Or they may dedicate themselves to reducing the ECO tax directly, and their ongoing contribution may be required by networking consensus.", - bankTaxesArchTaxNote: "ARCH Tax reflects the cost of growing and maintaining the network archive. It is computed from the time gap between your first published block and the newest block in the network — the longer your history has lived in the archive, the larger your share of the maintenance cost. Like ECO Tax, ARCH Tax is deducted from the surplus the network adds on top of your UBI; the base UBI is never reduced by it.", - bankTaxesExample: "Example", - bankTaxesSummaryNote: "Aggregated total across every tax type the network applies. Currently only ECO Tax (carbon footprint) is enabled; future tax types will appear as additional rows and contribute to the total.", - statsEcoTaxTitle: "ECO Tax", - audioTranscodeTitle: "BCS Transcode", - audioTranscodeDescription: "Interpretation of the audio: the original blockchain composition that produced it, plus the OasisID, timestamp and hidden message embedded into the waveform via steganography.", - audioTranscodeStegoTitle: "Embedded in the waveform", - audioBackToAudio: "Back to audio", - audioAuthorLabel: "Author", - mapZoomIn: "Zoom +", - mapZoomOut: "Zoom −", - mapClickToCreate: "Click on the map to select a location", - mapClickToAddMarker: "Click on the map to add a marker", - gameScoreLabel: "GAME SCORES", larpProfileQ1: "面对复杂问题时,你首先做什么?", larpProfileQ1O1: "与他人交谈以达成共识", larpProfileQ1O2: "构建原型进行测试", diff --git a/src/configs/agenda-config.json b/src/configs/agenda-config.json index 89bea0a..960b0ac 100644 --- a/src/configs/agenda-config.json +++ b/src/configs/agenda-config.json @@ -1,3 +1,3 @@ { "discardedItems": [] -} \ No newline at end of file +} diff --git a/src/configs/content_favorites.json b/src/configs/content_favorites.json new file mode 100644 index 0000000..c036334 --- /dev/null +++ b/src/configs/content_favorites.json @@ -0,0 +1,27 @@ +{ + "audios": [], + "blogs": [], + "bookmarks": [], + "calendars": [], + "chats": [], + "documents": [], + "events": [], + "forum": [], + "housing": [], + "images": [], + "jobs": [], + "logs": [], + "maps": [], + "market": [], + "pads": [], + "polls": [], + "projects": [], + "reports": [], + "shopProducts": [], + "shops": [], + "tasks": [], + "torrents": [], + "transfers": [], + "videos": [], + "votes": [] +} diff --git a/src/configs/shared-state.js b/src/configs/shared-state.js index dfed74b..75ef3b3 100644 --- a/src/configs/shared-state.js +++ b/src/configs/shared-state.js @@ -9,6 +9,9 @@ let _ecoValue = null; let _lastActivity = null; let _maxBlockBytes = 0; let _inhabitantCount = 0; +let _mentionsCount = 0; +let _bestMatch = null; +let _dismissedSuggestion = null; module.exports = { getInboxCount: () => _inboxCount, setInboxCount: (n) => { _inboxCount = n; }, @@ -30,6 +33,12 @@ module.exports = { setLastActivity: (a) => { _lastActivity = a; }, getMaxBlockBytes: () => _maxBlockBytes, setMaxBlockBytes: (n) => { if (Number(n) > _maxBlockBytes) _maxBlockBytes = Number(n); }, + getMentionsCount: () => _mentionsCount, + setMentionsCount: (n) => { _mentionsCount = Math.max(0, Number(n) || 0); }, getInhabitantCount: () => _inhabitantCount, - setInhabitantCount: (n) => { _inhabitantCount = Math.max(0, Number(n) || 0); } + setInhabitantCount: (n) => { _inhabitantCount = Math.max(0, Number(n) || 0); }, + getBestMatch: () => _bestMatch, + setBestMatch: (m) => { _bestMatch = m || null; }, + getDismissedSuggestion: () => _dismissedSuggestion, + setDismissedSuggestion: (href) => { _dismissedSuggestion = href || null; } }; diff --git a/src/maps/map_renderer.js b/src/maps/map_renderer.js index 0a63299..d1e56e3 100644 --- a/src/maps/map_renderer.js +++ b/src/maps/map_renderer.js @@ -81,14 +81,21 @@ pins = json.loads(sys.argv[1]) im = Image.open(sys.argv[2]).copy() draw = ImageDraw.Draw(im) -for p in pins: - x, y, main = p['x'], p['y'], p.get('main', False) - sw = 3 if main else 2 - sh = 18 if main else 13 +def draw_pin(draw, x, y, main): + sw = 7 if main else 5 + sh = 34 if main else 26 + head = 11 if main else 8 clr = '#e74c3c' if main else '#3498db' dark = '#c0392b' if main else '#2980b9' - draw.polygon([(x, y + 2), (x - sw, y - sh + sw * 2), (x + sw, y - sh + sw * 2)], fill=clr) - draw.ellipse([x - sw - 1, y - sh - sw, x + sw + 1, y - sh + sw], fill=dark, outline='white', width=1) + cy = y - sh + draw.polygon([(x, y + 2), (x - sw - 1, cy + sw), (x + sw + 1, cy + sw)], fill='white') + draw.polygon([(x, y), (x - sw, cy + sw), (x + sw, cy + sw)], fill=clr) + draw.ellipse([x - head - 2, cy - head - 2, x + head + 2, cy + head + 2], fill='white') + draw.ellipse([x - head, cy - head, x + head, cy + head], fill=clr, outline=dark, width=2) + draw.ellipse([x - head // 3, cy - head // 3, x + head // 3, cy + head // 3], fill='white') + +for p in pins: + draw_pin(draw, p['x'], p['y'], p.get('main', False)) im.save(sys.argv[3], optimize=True) `; @@ -193,15 +200,23 @@ cropped = canvas.crop((int(crop_x), int(crop_y), int(crop_x + vw), int(crop_y + result = cropped.resize((1024, 1024), Image.LANCZOS) draw = ImageDraw.Draw(result) +def draw_pin(draw, x, y, main): + sw = 7 if main else 5 + sh = 34 if main else 26 + head = 11 if main else 8 + clr = '#e74c3c' if main else '#3498db' + dark = '#c0392b' if main else '#2980b9' + cy = y - sh + draw.polygon([(x, y + 2), (x - sw - 1, cy + sw), (x + sw + 1, cy + sw)], fill='white') + draw.polygon([(x, y), (x - sw, cy + sw), (x + sw, cy + sw)], fill=clr) + draw.ellipse([x - head - 2, cy - head - 2, x + head + 2, cy + head + 2], fill='white') + draw.ellipse([x - head, cy - head, x + head, cy + head], fill=clr, outline=dark, width=2) + draw.ellipse([x - head // 3, cy - head // 3, x + head // 3, cy + head // 3], fill='white') + for p in pins: px, py, main = p['px'], p['py'], p.get('main', False) - if -20 <= px <= 1044 and -20 <= py <= 1044: - sw = 3 if main else 2 - sh = 18 if main else 13 - clr = '#e74c3c' if main else '#3498db' - dark = '#c0392b' if main else '#2980b9' - draw.polygon([(px, py + 2), (px - sw, py - sh + sw * 2), (px + sw, py - sh + sw * 2)], fill=clr) - draw.ellipse([px - sw - 1, py - sh - sw, px + sw + 1, py - sh + sw], fill=dark, outline='white', width=1) + if -40 <= px <= 1064 and -40 <= py <= 1064: + draw_pin(draw, px, py, main) result.save(out_file, optimize=True) `; diff --git a/src/models/bookmarking_model.js b/src/models/bookmarking_model.js index 144fb96..86a2bea 100644 --- a/src/models/bookmarking_model.js +++ b/src/models/bookmarking_model.js @@ -145,7 +145,6 @@ module.exports = ({ cooler }) => { updatedAt: c.updatedAt || null, lastVisit: c.lastVisit || null, tags: safeArr(c.tags), - category: c.category || "", description: c.description || "", opinions, opinions_inhabitants: voters, @@ -182,7 +181,7 @@ module.exports = ({ cooler }) => { return root; }, - async createBookmark(url, tagsRaw, description, category, lastVisit) { + async createBookmark(url, tagsRaw, description, lastVisit) { const ssbClient = await openSsb(); const now = new Date().toISOString(); @@ -195,7 +194,6 @@ module.exports = ({ cooler }) => { url: u, tags: normalizeTags(tagsRaw), description: description || "", - category: category || "", createdAt: now, updatedAt: now, lastVisit: coerceLastVisit(lastVisit), @@ -231,7 +229,6 @@ module.exports = ({ cooler }) => { url, tags: updatedData.tags !== undefined ? normalizeTags(updatedData.tags) : safeArr(oldMsg.content.tags), description: updatedData.description !== undefined ? updatedData.description || "" : oldMsg.content.description || "", - category: updatedData.category !== undefined ? updatedData.category || "" : oldMsg.content.category || "", lastVisit: coerceLastVisit(updatedData.lastVisit || oldMsg.content.lastVisit), createdAt: oldMsg.content.createdAt, updatedAt: now @@ -296,11 +293,10 @@ module.exports = ({ cooler }) => { if (q) { list = list.filter((b) => { const url = String(b.url || "").toLowerCase(); - const cat = String(b.category || "").toLowerCase(); const desc = String(b.description || "").toLowerCase(); const tags = safeArr(b.tags).join(" ").toLowerCase(); const author = String(b.author || "").toLowerCase(); - return url.includes(q) || cat.includes(q) || desc.includes(q) || tags.includes(q) || author.includes(q); + return url.includes(q) || desc.includes(q) || tags.includes(q) || author.includes(q); }); } diff --git a/src/models/calendars_model.js b/src/models/calendars_model.js index cccc854..cb9089a 100644 --- a/src/models/calendars_model.js +++ b/src/models/calendars_model.js @@ -14,25 +14,26 @@ const normalizeTags = (raw) => { return String(raw).split(",").map(t => t.trim()).filter(Boolean) } const hasAnyInterval = (w, m, y) => !!(w || m || y) -const expandRecurrence = (firstDate, deadline, weekly, monthly, yearly) => { - const start = new Date(firstDate) - const out = [start] - if (!deadline || !hasAnyInterval(weekly, monthly, yearly)) return out - const end = new Date(deadline).getTime() - const seen = new Set([start.getTime()]) - const walk = (mutate) => { - const n = new Date(start) - mutate(n) - while (n.getTime() <= end) { - const t = n.getTime() - if (!seen.has(t)) { seen.add(t); out.push(new Date(n)) } - mutate(n) - } - } - if (weekly) walk((d) => d.setDate(d.getDate() + 7)) - if (monthly) walk((d) => d.setMonth(d.getMonth() + 1)) - if (yearly) walk((d) => d.setFullYear(d.getFullYear() + 1)) - return out.sort((a, b) => a.getTime() - b.getTime()) +const { expandRecurrence } = require('./recurrence') + +const ts = (v) => { + const t = new Date(v).getTime() + return Number.isFinite(t) ? t : null +} + +const assertCalendarDates = ({ deadline, date, until }) => { + const now = Date.now() + const dl = deadline ? ts(deadline) : null + const dt = date ? ts(date) : null + const un = until ? ts(until) : null + if (deadline && dl === null) throw new Error("Deadline is not a valid date") + if (date && dt === null) throw new Error("Date is not a valid date") + if (until && un === null) throw new Error("The recurrence end is not a valid date") + if (dl !== null && dl <= now) throw new Error("Deadline must be in the future") + if (dt !== null && dt <= now) throw new Error("Date must be in the future") + if (dt !== null && dl !== null && dt > dl) throw new Error("Date cannot be later than the deadline") + if (un !== null && dt !== null && un < dt) throw new Error("The recurrence cannot end before it starts") + if (un !== null && dl !== null && un > dl) throw new Error("The recurrence cannot end after the deadline") } module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) => { @@ -108,6 +109,12 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) return tribeCrypto.encryptContent(content, [key], true) } + const decryptScoped = async (content, rootId) => { + if (!content) return content + if (content.tribeId) return await decryptIfTribe(content) + return decryptCalendarRoot(content, rootId) + } + const decryptCalendarRoot = (content, rootId) => { if (!content || !content.encryptedPayload) return content if (!tribeCrypto) return content @@ -259,6 +266,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: c.status || "OPEN", deadline: undec ? "" : (c.deadline || ""), tags: Array.isArray(c.tags) ? c.tags : [], + mapUrl: typeof c.mapUrl === "string" ? c.mapUrl : "", author: c.author || node.author, participants: Array.isArray(participants) ? participants : (Array.isArray(c.participants) ? c.participants : []), invites: Array.isArray(c.invites) ? c.invites : [], @@ -339,14 +347,18 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) return tip }, - async createCalendar({ title, status, deadline, tags, firstDate, firstDateLabel, firstNote, intervalWeekly, intervalMonthly, intervalYearly, tribeId }) { + async createCalendar({ title, status, deadline, tags, firstDate, firstDateLabel, firstNote, intervalWeekly, intervalMonthly, intervalYearly, intervalDeadline, mapUrl, tribeId }) { const ssbClient = await openSsb() const userId = ssbClient.id const now = new Date().toISOString() const validStatus = ["OPEN", "CLOSED"].includes(String(status).toUpperCase()) ? String(status).toUpperCase() : "OPEN" - if (deadline && new Date(deadline).getTime() <= Date.now()) throw new Error("Deadline must be in the future") - if (!firstDate || new Date(firstDate).getTime() <= Date.now()) throw new Error("First date must be in the future") + if (!firstDate) throw new Error("First date must be in the future") + assertCalendarDates({ + deadline, + date: firstDate, + until: hasAnyInterval(intervalWeekly, intervalMonthly, intervalYearly) ? intervalDeadline : "" + }) let plainContent = { type: "calendar", @@ -354,6 +366,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: validStatus, deadline: deadline || "", tags: normalizeTags(tags), + mapUrl: safeText(mapUrl), author: userId, participants: [userId], invites: [], @@ -400,6 +413,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: validStatus, deadline: dec.deadline || "", tags: Array.isArray(dec.tags) ? dec.tags : [], + mapUrl: dec.mapUrl || "", author: userId, participants: [userId], invites: [{ code: pubCode, ek, salt: inviteSalt, gen: 1, public: true }], @@ -424,7 +438,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) ...(intervalWeekly ? { intervalWeekly: true } : {}), ...(intervalMonthly ? { intervalMonthly: true } : {}), ...(intervalYearly ? { intervalYearly: true } : {}), - ...(deadline && hasAnyInterval(intervalWeekly, intervalMonthly, intervalYearly) ? { intervalDeadline: deadline } : {}), + ...(hasAnyInterval(intervalWeekly, intervalMonthly, intervalYearly) && (intervalDeadline || deadline) ? { intervalDeadline: intervalDeadline || deadline } : {}), ...(tribeId ? { tribeId } : {}) } if (tribeId) dateContent = await encryptIfTribe(dateContent) @@ -467,12 +481,15 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) : decryptCalendarRoot(item.content, rootId) assertReadable(oldDec, "Calendar") if ((oldDec.author || item.content.author) !== userId) throw new Error("Not the author") + const nextDeadline = data.deadline !== undefined ? data.deadline : (oldDec.deadline || "") + if (nextDeadline !== (oldDec.deadline || "")) assertCalendarDates({ deadline: nextDeadline }) let updated = { type: "calendar", title: data.title !== undefined ? safeText(data.title) : (oldDec.title || ""), status: data.status !== undefined ? (["OPEN","CLOSED"].includes(String(data.status).toUpperCase()) ? String(data.status).toUpperCase() : oldDec.status) : (oldDec.status || "OPEN"), - deadline: data.deadline !== undefined ? data.deadline : (oldDec.deadline || ""), + deadline: nextDeadline, tags: data.tags !== undefined ? normalizeTags(data.tags) : (Array.isArray(oldDec.tags) ? oldDec.tags : []), + mapUrl: data.mapUrl !== undefined ? safeText(data.mapUrl) : (oldDec.mapUrl || ""), author: oldDec.author || userId, participants: oldDec.participants || [userId], invites: Array.isArray(oldDec.invites) ? oldDec.invites : [], @@ -495,7 +512,8 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) const userId = ssbClient.id const item = await new Promise((resolve, reject) => ssbClient.get(tipId, (e, it) => e ? reject(e) : resolve(it))) if (!item || !item.content) throw new Error("Calendar not found") - const dec = await decryptIfTribe(item.content) + const rootId = await this.resolveRootId(id) + const dec = await decryptScoped(item.content, rootId) assertReadable(dec, "Calendar") const contentAuthor = (dec && dec.author) || (typeof item.content === 'object' && item.content.author) if (contentAuthor !== userId) throw new Error("Not the author") @@ -588,9 +606,14 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) const cal = await this.getCalendarById(rootId) if (!cal) throw new Error("Calendar not found") if (cal.status === "CLOSED" && userId !== cal.author) throw new Error("Only the author can add dates to a CLOSED calendar") - if (!date || new Date(date).getTime() <= Date.now()) throw new Error("Date must be in the future") - + if (!date) throw new Error("Date must be in the future") const hasInterval = hasAnyInterval(intervalWeekly, intervalMonthly, intervalYearly) + assertCalendarDates({ + deadline: cal.deadline || "", + date, + until: hasInterval ? intervalDeadline : "" + }) + const ruleDeadline = hasInterval ? (intervalDeadline || cal.deadline || "") : "" let dateContent = { type: "calendarDate", @@ -748,8 +771,9 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) const userId = ssbClient.id const item = await new Promise((resolve, reject) => ssbClient.get(noteId, (e, it) => e ? reject(e) : resolve(it))) if (!item || !item.content) throw new Error("Note not found") - const dec = await decryptIfTribe(item.content) - if ((dec.author || item.content.author) !== userId) throw new Error("Not the author") + const noteRoot = item.content.calendarId || null + const dec = await decryptScoped(item.content, noteRoot) + if (((dec && dec.author) || item.content.author) !== userId) throw new Error("Not the author") return new Promise((resolve, reject) => { ssbClient.publish({ type: "tombstone", target: noteId, deletedAt: new Date().toISOString(), author: userId }, (e, msg) => e ? reject(e) : resolve(msg)) }) @@ -777,8 +801,8 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) if (tombstoned.has(m.key)) continue if (c.calendarId !== rootId || c.dateId !== dateId) continue let dec = c - if (c.encryptedPayload && tribeCrypto && tribesModel) { - const r = await tribeCrypto.decryptFromTribe(c, tribesModel) + if (c.encryptedPayload) { + const r = await decryptScoped(c, rootId) if (r && !r._undecryptable) dec = r else continue } @@ -929,6 +953,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: dec.status || "OPEN", deadline: dec.deadline || "", tags: Array.isArray(dec.tags) ? dec.tags : [], + mapUrl: dec.mapUrl || "", author: dec.author, participants: Array.isArray(dec.participants) ? dec.participants : [userId], invites, @@ -975,6 +1000,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: dec.status || "OPEN", deadline: dec.deadline || "", tags: Array.isArray(dec.tags) ? dec.tags : [], + mapUrl: dec.mapUrl || "", author: dec.author, participants: Array.isArray(dec.participants) ? dec.participants : [userId], invites, @@ -1009,7 +1035,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) let calKey = null if (tribeCrypto && typeof matchedInvite === "object") { if (matchedInvite.ekChain) { - const chain = tribeCrypto.decryptChainFromInvite(matchedInvite.ekChain, code, matchedInvite.salt) + const chain = tribeCrypto.decryptChainFromInvite(matchedInvite.ekChain, code, matchedInvite.salt, 3) if (Array.isArray(chain) && chain.length) { for (const entry of chain) { if (Array.isArray(entry.keys) && entry.keys.length) { @@ -1043,6 +1069,7 @@ module.exports = ({ cooler, pmModel, tribeCrypto, calendarCrypto, tribesModel }) status: dec.status || "OPEN", deadline: dec.deadline || "", tags: Array.isArray(dec.tags) ? dec.tags : [], + mapUrl: dec.mapUrl || "", author: dec.author, participants: [...(Array.isArray(dec.participants) ? dec.participants : []), userId], invites, diff --git a/src/models/crypto.js b/src/models/crypto.js index bdd9321..13ebaca 100644 --- a/src/models/crypto.js +++ b/src/models/crypto.js @@ -223,14 +223,27 @@ module.exports = (configPath, namespace = 'tribes') => { return decryptWithKey(encryptedKey, derived.toString('hex'), inviteAad(inviteCode, salt)); }; + const INVITE_ENCRYPT_ATTEMPTS = 3; + const encryptChainForInvite = (ancestryRootIds, code, salt) => { const chain = ancestryRootIds.map(rid => ({ rootId: rid, keys: getKeys(rid), gen: getGen(rid) })); if (chain.some(e => !Array.isArray(e.keys) || !e.keys.length)) return null; - const k = deriveInviteKey(code, salt); - return encryptWithKey(JSON.stringify(chain), k.toString('hex'), inviteAad(code, salt)); + const plain = JSON.stringify(chain); + const aad = inviteAad(code, salt); + for (let attempt = 0; attempt < INVITE_ENCRYPT_ATTEMPTS; attempt++) { + const k = deriveInviteKey(code, salt); + const payload = encryptWithKey(plain, k.toString('hex'), aad); + if (!payload) continue; + const readBack = decryptChainFromInvite(payload, code, salt); + if (readBack && JSON.stringify(readBack.map(e => ({ rootId: e.rootId, keys: e.keys, gen: e.gen }))) + === JSON.stringify(chain.map(e => ({ rootId: e.rootId, keys: e.keys, gen: e.gen })))) { + return payload; + } + } + throw new Error('Could not produce a verifiable invite on this machine'); }; - const decryptChainFromInvite = (encryptedPayload, code, salt) => { + const decryptChainOnce = (encryptedPayload, code, salt) => { const k = deriveInviteKey(code, salt); try { const json = decryptWithKey(encryptedPayload, k.toString('hex'), inviteAad(code, salt)); @@ -247,6 +260,15 @@ module.exports = (configPath, namespace = 'tribes') => { return null; }; + const decryptChainFromInvite = (encryptedPayload, code, salt, attempts = 1) => { + const tries = Math.max(1, Number(attempts) || 1); + for (let i = 0; i < tries; i++) { + const chain = decryptChainOnce(encryptedPayload, code, salt); + if (chain) return chain; + } + return null; + }; + const inviteMatchesCode = (inv, code) => { if (!inv || typeof inv !== 'object' || !inv.codeHash) return false; return inv.codeHash === hashInviteCode(code, inv.salt); diff --git a/src/models/cv_model.js b/src/models/cv_model.js index 8e66e54..fabbc6c 100644 --- a/src/models/cv_model.js +++ b/src/models/cv_model.js @@ -47,6 +47,8 @@ module.exports = ({ cooler }) => { status: data.status || 'LOOKING FOR WORK', preferences: data.preferences || 'REMOTE WORKING', visibility: String(data.visibility || 'PUBLIC').toUpperCase() === 'HIDDEN' ? 'HIDDEN' : 'PUBLIC', + aiManaged: data.aiManaged === undefined ? true : (data.aiManaged === true || data.aiManaged === '1' || data.aiManaged === 'true'), + matchThreshold: Math.min(100, Math.max(0, parseInt(data.matchThreshold, 10) || 80)), createdAt: new Date().toISOString() }; return new Promise((resolve, reject) => { @@ -85,7 +87,7 @@ module.exports = ({ cooler }) => { author: userId, name: data.name, description: data.description, - photo: extractBlobId(photoBlobId) || null, + photo: extractBlobId(photoBlobId) || old.content.photo || null, contact: userId, personalSkills: parseCSV(data.personalSkills), personalExperiences: data.personalExperiences || '', @@ -102,6 +104,12 @@ module.exports = ({ cooler }) => { visibility: data.visibility !== undefined ? (String(data.visibility).toUpperCase() === 'HIDDEN' ? 'HIDDEN' : 'PUBLIC') : (old.content.visibility || 'PUBLIC'), + aiManaged: data.aiManaged !== undefined + ? (data.aiManaged === true || data.aiManaged === '1' || data.aiManaged === 'true') + : (old.content.aiManaged !== false), + matchThreshold: data.matchThreshold !== undefined + ? Math.min(100, Math.max(0, parseInt(data.matchThreshold, 10) || 80)) + : (Number(old.content.matchThreshold) || 80), createdAt: old.content.createdAt, updatedAt: new Date().toISOString() }; diff --git a/src/models/dev_model.js b/src/models/dev_model.js index bdfe054..8b18406 100644 --- a/src/models/dev_model.js +++ b/src/models/dev_model.js @@ -109,12 +109,9 @@ const MODULE_ALIASES = { ai: { model: 'src/AI/ai_service.mjs', view: 'src/views/AI_view.js' }, aiNav: { model: 'src/AI/routes_index.js', view: 'src/views/AI_view.js', paths: ['/ai/ask'] }, docs: { paths: ['/documents'] }, - latest: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/latest'] }, - popular: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/popular'] }, - topics: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/latest/topics'] }, - summaries: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/latest/summaries'] }, - threads: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/latest/threads'] }, - multiverse: { model: 'src/models/main_models.js', view: 'src/views/main_views.js', paths: ['/public/latest/extended'] }, + blogs: { model: 'src/models/blog_model.js', view: 'src/views/blog_view.js', paths: ['/blogs'] }, + polls: { model: 'src/models/polls_model.js', view: 'src/views/polls_view.js', paths: ['/polls'] }, + data: { model: 'src/models/data_model.js', view: 'src/views/data_view.js', paths: ['/data'] }, invites: { model: 'src/models/main_models.js', view: 'src/views/invites_view.js' }, graphos: { model: 'src/models/main_models.js', view: 'src/views/graphos_view.js' } }; diff --git a/src/models/documents_model.js b/src/models/documents_model.js index ada7c64..b6affb1 100644 --- a/src/models/documents_model.js +++ b/src/models/documents_model.js @@ -3,7 +3,7 @@ const { getConfig } = require("../configs/config-manager.js"); const categories = require("../backend/opinion_categories"); const { buildValidatedTombstoneSet } = require('./tombstone_validator'); const { dedupeBy, norm } = require('../backend/dedupe'); -const mediaFavorites = require("../backend/media-favorites"); +const contentFavorites = require("../backend/content_favorites"); const logLimit = getConfig().ssbLogStream?.limit || 1000; @@ -154,7 +154,7 @@ module.exports = ({ cooler }) => { const favoritesSetForDocuments = async () => { try { - return await mediaFavorites.getFavoriteSet("documents"); + return await contentFavorites.getFavoriteSet("documents"); } catch { return new Set(); } diff --git a/src/models/events_model.js b/src/models/events_model.js index fb6513d..9f5fd96 100644 --- a/src/models/events_model.js +++ b/src/models/events_model.js @@ -1,5 +1,7 @@ const pull = require('../server/node_modules/pull-stream'); const moment = require('../server/node_modules/moment'); +const { normalizeImages, normalizeVideo } = require('./media_gallery'); +const { truthy, hasAnyInterval, nextOccurrence, upcomingOccurrences } = require('./recurrence'); const crypto = require('crypto'); const { buildValidatedTombstoneSet } = require('./tombstone_validator'); const { getConfig } = require('../configs/config-manager.js'); @@ -72,8 +74,22 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { return m.toISOString(); }; + const recurrenceOf = (c) => ({ + weekly: truthy(c.intervalWeekly), + monthly: truthy(c.intervalMonthly), + yearly: truthy(c.intervalYearly), + until: c.recurrenceUntil || '' + }); + + const effectiveDate = (c) => { + const r = recurrenceOf(c); + if (!hasAnyInterval(r.weekly, r.monthly, r.yearly) || !r.until) return c.date; + const next = nextOccurrence(c.date, r.until, r.weekly, r.monthly, r.yearly); + return next ? next.toISOString() : c.date; + }; + const deriveStatus = (c) => { - const dateM = moment(c.date); + const dateM = moment(effectiveDate(c)); let status = String(c.status || 'OPEN').toUpperCase(); if (dateM.isValid() && dateM.isBefore(moment())) status = 'CLOSED'; if (status !== 'OPEN' && status !== 'CLOSED') status = 'OPEN'; @@ -171,7 +187,7 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { return idx.rootOf(id); }, - async createEvent(title, description, date, location, price = 0, url = "", attendees = [], tagsRaw = [], isPublic, mapUrl = "", clearnetPublic = false) { + async createEvent(title, description, date, location, price = 0, url = "", attendees = [], tagsRaw = [], isPublic, mapUrl = "", clearnetPublic = false, media = {}, recurrence = {}) { const ssbClient = await openSsb(); const userId = await me(); @@ -203,6 +219,12 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { isPublic: visibility, mapUrl: String(mapUrl || "").trim(), clearnetPublic: clearnetPublic === true || clearnetPublic === 'true' || clearnetPublic === 'on', + images: normalizeImages(media && media.images), + video: normalizeVideo(media && media.video), + intervalWeekly: truthy(recurrence && recurrence.weekly), + intervalMonthly: truthy(recurrence && recurrence.monthly), + intervalYearly: truthy(recurrence && recurrence.yearly), + recurrenceUntil: String((recurrence && recurrence.until) || '').trim(), opinions: {}, opinions_inhabitants: [] }; @@ -461,6 +483,15 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { status, isPublic: normalizePrivacy(c.isPublic), mapUrl: c.mapUrl || "", + images: normalizeImages(c.images), + video: normalizeVideo(c.video), + intervalWeekly: truthy(c.intervalWeekly), + intervalMonthly: truthy(c.intervalMonthly), + intervalYearly: truthy(c.intervalYearly), + recurrenceUntil: c.recurrenceUntil || '', + recurring: hasAnyInterval(truthy(c.intervalWeekly), truthy(c.intervalMonthly), truthy(c.intervalYearly)) && !!c.recurrenceUntil, + nextDate: effectiveDate(c), + occurrences: upcomingOccurrences(c.date, c.recurrenceUntil, truthy(c.intervalWeekly), truthy(c.intervalMonthly), truthy(c.intervalYearly)).map(d => d.toISOString()), clearnetPublic: !!c.clearnetPublic, encrypted: normalizePrivacy(c.isPublic) === 'private', opinions: agg.opinions, @@ -503,6 +534,12 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { isPublic: updatedData.isPublic !== undefined ? normalizePrivacy(updatedData.isPublic) : normalizePrivacy(c.isPublic), clearnetPublic: updatedData.clearnetPublic !== undefined ? (updatedData.clearnetPublic === true || updatedData.clearnetPublic === 'true' || updatedData.clearnetPublic === 'on') : !!c.clearnetPublic, attendees: uniq(Array.isArray(c.attendees) ? c.attendees : []), + images: normalizeImages(updatedData.images !== undefined ? updatedData.images : c.images), + video: updatedData.video !== undefined ? normalizeVideo(updatedData.video) : normalizeVideo(c.video), + intervalWeekly: updatedData.intervalWeekly !== undefined ? truthy(updatedData.intervalWeekly) : truthy(c.intervalWeekly), + intervalMonthly: updatedData.intervalMonthly !== undefined ? truthy(updatedData.intervalMonthly) : truthy(c.intervalMonthly), + intervalYearly: updatedData.intervalYearly !== undefined ? truthy(updatedData.intervalYearly) : truthy(c.intervalYearly), + recurrenceUntil: updatedData.recurrenceUntil !== undefined ? String(updatedData.recurrenceUntil || '').trim() : (c.recurrenceUntil || ''), updatedAt: new Date().toISOString(), replaces: eventId }; @@ -610,6 +647,14 @@ module.exports = ({ cooler, tribeCrypto, eventCrypto, tribesModel }) => { status, isPublic: normalizePrivacy(c.isPublic), mapUrl: c.mapUrl || "", + images: normalizeImages(c.images), + video: normalizeVideo(c.video), + intervalWeekly: truthy(c.intervalWeekly), + intervalMonthly: truthy(c.intervalMonthly), + intervalYearly: truthy(c.intervalYearly), + recurrenceUntil: c.recurrenceUntil || '', + recurring: hasAnyInterval(truthy(c.intervalWeekly), truthy(c.intervalMonthly), truthy(c.intervalYearly)) && !!c.recurrenceUntil, + nextDate: effectiveDate(c), encrypted: normalizePrivacy(c.isPublic) === 'private', opinions: agg.opinions, opinions_inhabitants: agg.opinions_inhabitants diff --git a/src/models/favorites_model.js b/src/models/favorites_model.js index d0fd3f5..1eb5524 100644 --- a/src/models/favorites_model.js +++ b/src/models/favorites_model.js @@ -1,4 +1,4 @@ -const mediaFavorites = require("../backend/media-favorites"); +const contentFavorites = require("../backend/content_favorites"); const safeArr = (v) => (Array.isArray(v) ? v : []); const safeText = (v) => String(v || "").trim(); @@ -15,7 +15,7 @@ const toTs = (d) => { return Number.isFinite(t) ? t : 0; }; -module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, videosModel, mapsModel, padsModel, chatsModel, calendarsModel, torrentsModel, marketModel, shopsModel }) => { +module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, videosModel, mapsModel, padsModel, chatsModel, calendarsModel, torrentsModel, marketModel, shopsModel, eventsModel, tasksModel, reportsModel, votesModel, jobsModel, housingModel, projectsModel, transfersModel, forumModel, blogsModel, pollsModel }) => { const kindConfig = { audios: { base: "/audios/", @@ -64,10 +64,58 @@ module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, vi shopProducts: { base: "/shops/product/", getById: getFn(shopsModel, ["getProductById"]) + }, + events: { + base: "/events/", + getById: getFn(eventsModel, ["getEventById", "getById"]) + }, + tasks: { + base: "/tasks/", + getById: getFn(tasksModel, ["getTaskById", "getById"]) + }, + reports: { + base: "/reports/", + getById: getFn(reportsModel, ["getReportById", "getById"]) + }, + votes: { + base: "/votes/", + getById: getFn(votesModel, ["getVoteById", "getById"]) + }, + jobs: { + base: "/jobs/", + getById: getFn(jobsModel, ["getJobById", "getById"]) + }, + housing: { + base: "/housing/", + getById: getFn(housingModel, ["getHousingById", "getById"]) + }, + projects: { + base: "/projects/", + getById: getFn(projectsModel, ["getProjectById", "getById"]) + }, + transfers: { + base: "/transfers/", + getById: getFn(transfersModel, ["getTransferById", "getById"]) + }, + forum: { + base: "/forum/", + getById: getFn(forumModel, ["getForumById", "getById"]) + }, + blogs: { + base: "/blogs/", + getById: getFn(blogsModel, ["getBlogById", "getById"]) + }, + polls: { + base: "/polls/", + getById: getFn(pollsModel, ["getPollById", "getById"]) + }, + shops: { + base: "/shops/", + getById: getFn(shopsModel, ["getShopById", "getById"]) } }; - const kindOrder = ["audios", "bookmarks", "calendars", "chats", "documents", "images", "maps", "pads", "torrents", "videos", "market", "shopProducts"]; + const kindOrder = ["audios", "blogs", "bookmarks", "calendars", "chats", "documents", "events", "forum", "housing", "images", "jobs", "maps", "market", "pads", "polls", "projects", "reports", "shopProducts", "shops", "tasks", "torrents", "transfers", "videos", "votes"]; const hydrateKind = async (kind, ids) => { const cfg = kindConfig[kind]; @@ -79,9 +127,11 @@ module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, vi if (!id) return null; try { const obj = await cfg.getById(id); + if (!obj || typeof obj !== "object") return null; const viewId = safeText(obj?.key || obj?.id || id); return { + content: obj, kind, favId: id, viewHref: `${cfg.base}${encodeURIComponent(viewId)}`, @@ -104,7 +154,7 @@ module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, vi }; const loadAll = async () => { - const sets = await Promise.all(kindOrder.map((k) => mediaFavorites.getFavoriteSet(k))); + const sets = await Promise.all(kindOrder.map((k) => contentFavorites.getFavoriteSet(k))); const idsByKind = {}; kindOrder.forEach((k, i) => { idsByKind[k] = Array.from(sets[i] || []); @@ -118,21 +168,8 @@ module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, vi const flat = kindOrder.flatMap((k) => byKind[k]); - const counts = { - audios: byKind.audios.length, - bookmarks: byKind.bookmarks.length, - calendars: byKind.calendars.length, - chats: byKind.chats.length, - documents: byKind.documents.length, - images: byKind.images.length, - maps: byKind.maps.length, - pads: byKind.pads.length, - torrents: byKind.torrents.length, - videos: byKind.videos.length, - market: byKind.market.length, - shopProducts: byKind.shopProducts.length, - all: flat.length - }; + const counts = { all: flat.length }; + for (const k of kindOrder) counts[k] = (byKind[k] || []).length; const recentFlat = flat .slice() @@ -167,11 +204,13 @@ module.exports = ({ audiosModel, bookmarksModel, documentsModel, imagesModel, vi return { items: grouped, counts }; }, + kinds: kindOrder.slice(), + async removeFavorite(kind, id) { const k = safeText(kind); const favId = safeText(id); if (!k || !favId) return; - await mediaFavorites.removeFavorite(k, favId); + await contentFavorites.removeFavorite(k, favId); } }; }; diff --git a/src/models/images_model.js b/src/models/images_model.js index 50c90e3..494bd88 100644 --- a/src/models/images_model.js +++ b/src/models/images_model.js @@ -142,7 +142,6 @@ module.exports = ({ cooler }) => { title: c.title || "", description: c.description || "", mapUrl: c.mapUrl || "", - meme: !!c.meme, opinions: agg ? agg.opinions : (c.opinions || {}), opinions_inhabitants: voters, hasVoted: viewerId ? voters.includes(viewerId) : false, @@ -177,7 +176,7 @@ module.exports = ({ cooler }) => { return root; }, - async createImage(blobMarkdown, tagsRaw, title, description, memeBool, mapUrl) { + async createImage(blobMarkdown, tagsRaw, title, description, mapUrl) { const ssbClient = await openSsb(); const blobId = parseBlobId(blobMarkdown); const tags = normalizeTags(tagsRaw) || []; @@ -193,7 +192,6 @@ module.exports = ({ cooler }) => { title: title || "", description: description || "", mapUrl: mapUrl || "", - meme: !!memeBool, opinions: {}, opinions_inhabitants: [] }; @@ -203,7 +201,7 @@ module.exports = ({ cooler }) => { }); }, - async updateImageById(id, blobMarkdown, tagsRaw, title, description, memeBool, mapUrl) { + async updateImageById(id, blobMarkdown, tagsRaw, title, description, mapUrl) { const ssbClient = await openSsb(); const userId = ssbClient.id; const tipId = await this.resolveCurrentId(id); @@ -226,7 +224,6 @@ module.exports = ({ cooler }) => { title: title !== undefined ? title || "" : oldMsg.content.title || "", description: description !== undefined ? description || "" : oldMsg.content.description || "", mapUrl: mapUrl !== undefined ? mapUrl || "" : oldMsg.content.mapUrl || "", - meme: typeof memeBool === "boolean" ? memeBool : !!oldMsg.content.meme, createdAt: oldMsg.content.createdAt, updatedAt: now }; @@ -280,7 +277,6 @@ module.exports = ({ cooler }) => { if (filter === "mine") list = list.filter((im) => String(im.author) === String(viewerId)); else if (filter === "recent") list = list.filter((im) => new Date(im.createdAt).getTime() >= now - 86400000); - else if (filter === "meme") list = list.filter((im) => im.meme === true); else if (filter === "top") { list = list .slice() diff --git a/src/models/logs_model.js b/src/models/logs_model.js index 031fc91..7816900 100644 --- a/src/models/logs_model.js +++ b/src/models/logs_model.js @@ -6,6 +6,7 @@ const { buildValidatedTombstoneSet } = require('./tombstone_validator'); const logLimit = getConfig().ssbLogStream?.limit || 1000; + const DAY_MS = 24 * 60 * 60 * 1000; const WEEK_MS = 7 * DAY_MS; const MONTH_MS = 30 * DAY_MS; @@ -311,7 +312,16 @@ module.exports = ({ cooler }) => { ref: c.ref || null }); } + const parentOf = new Map(); + for (const i of items) if (i.replaces) parentOf.set(i.key, i.replaces); + const rootOf = (key) => { + let cur = key; + const seen = new Set(); + while (parentOf.has(cur) && !seen.has(cur)) { seen.add(cur); cur = parentOf.get(cur); } + return cur; + }; const survivors = items.filter(i => !tombstoned.has(i.key) && !replaced.has(i.key)); + for (const i of survivors) i.rootId = rootOf(i.key); survivors.sort((a, b) => b.ts - a.ts); return survivors; } @@ -332,11 +342,14 @@ module.exports = ({ cooler }) => { async function updateLog(id, { text, label, mode }) { const current = await getLogById(id); if (!current) return { status: 'not_found' }; - await republishLog({ - replaces: current.key, + const next = { text: text !== undefined ? text : current.text, label: label !== undefined ? label : current.label, - mode: mode || current.mode, + mode: mode || current.mode + }; + await republishLog({ + replaces: current.key, + ...next, createdAt: current.createdAt }); return { status: 'ok' }; diff --git a/src/models/main_models.js b/src/models/main_models.js index d53de86..1456649 100644 --- a/src/models/main_models.js +++ b/src/models/main_models.js @@ -501,6 +501,31 @@ async function checkLocalBlob(blobId) { } models.blob = { + getCached: async ({ blobId }) => { + const local = await checkLocalBlob(blobId); + if (local) return local; + const ssb = await cooler.open(); + const has = await new Promise((resolve) => ssb.blobs.has(blobId, (err, v) => resolve(!err && !!v))); + if (!has) { + try { ssb.blobs.want(blobId, () => {}); } catch (_) {} + return null; + } + return new Promise((resolve) => { + pull( + ssb.blobs.get(blobId), + pull.collect(async (err, bufs) => { + if (err || !bufs || !bufs.length) return resolve(null); + const buffer = Buffer.concat(bufs); + try { + const filePath = blobIdToHexPath(blobId); + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await fs.writeFile(filePath, buffer); + } catch (e) { /* ignore */ } + resolve(buffer); + }) + ); + }); + }, getResolved: async ({ blobId, timeout = 30000 }) => { let buf = await checkLocalBlob(blobId); if (buf) return buf; diff --git a/src/models/maps_model.js b/src/models/maps_model.js index 5f9faf2..628507f 100644 --- a/src/models/maps_model.js +++ b/src/models/maps_model.js @@ -864,7 +864,7 @@ module.exports = ({ cooler, tribeCrypto, mapCrypto, tribesModel }) => { let mapKey = null; if (tribeCrypto && typeof matchedInvite === "object") { if (matchedInvite.ekChain) { - const chain = tribeCrypto.decryptChainFromInvite(matchedInvite.ekChain, code, matchedInvite.salt); + const chain = tribeCrypto.decryptChainFromInvite(matchedInvite.ekChain, code, matchedInvite.salt, 3); if (Array.isArray(chain) && chain.length) { for (const entry of chain) { if (Array.isArray(entry.keys) && entry.keys.length) { diff --git a/src/models/media_gallery.js b/src/models/media_gallery.js new file mode 100644 index 0000000..3d8c7b4 --- /dev/null +++ b/src/models/media_gallery.js @@ -0,0 +1,42 @@ +const MAX_IMAGES = 8 + +const MEDIA_MARKDOWN = /\[(image|video|audio):[^\]]*\]\(/ + +const blobOf = (value) => { + let blobId = value || null + if (blobId && /\(([^)]+)\)/.test(String(blobId))) blobId = String(blobId).match(/\(([^)]+)\)/)[1] + return blobId || null +} + +const keepMarkdown = (value, id) => + MEDIA_MARKDOWN.test(value) || value.startsWith("![") ? value : id + +const normalizeImages = (raw, max = MAX_IMAGES) => { + const list = Array.isArray(raw) ? raw : (raw ? [raw] : []) + const out = [] + const seen = new Set() + for (const entry of list) { + const value = String(entry || "").trim() + const id = blobOf(value) + if (!id || seen.has(id)) continue + seen.add(id) + out.push(keepMarkdown(value, id)) + if (out.length >= max) break + } + return out +} + +const normalizeVideo = (raw) => { + const value = String(Array.isArray(raw) ? raw[0] || "" : raw || "").trim() + const id = blobOf(value) + if (!id) return "" + return keepMarkdown(value, id) +} + +const mergeGallery = (current, uploaded, removeIndex = -1, max = MAX_IMAGES) => { + let list = normalizeImages(current, max) + if (removeIndex >= 0) list = list.filter((_, i) => i !== removeIndex) + return normalizeImages([...list, ...normalizeImages(uploaded, max)], max) +} + +module.exports = { MAX_IMAGES, blobOf, normalizeImages, normalizeVideo, mergeGallery } diff --git a/src/models/onboarding_model.js b/src/models/onboarding_model.js index 3f8eb50..8520a69 100644 --- a/src/models/onboarding_model.js +++ b/src/models/onboarding_model.js @@ -2,7 +2,7 @@ const fs = require('fs'); const path = require('path'); const pull = require('../server/node_modules/pull-stream'); -const STEPS = ['language', 'profile', 'federation', 'larp', 'greeting', 'backup']; +const STEPS = ['language', 'ux', 'profile', 'federation', 'larp', 'greeting', 'backup']; const FLAG = 'oasis-first-contact'; const PENDING = 'welcome=pending'; const DISMISSED = 'welcome=dismissed'; @@ -122,7 +122,7 @@ module.exports = ({ cooler, ssbPath } = {}) => { markStep(step) { if (!STEPS.includes(step)) return false; - if (step !== 'language' && step !== 'backup') return true; + if (step !== 'language' && step !== 'backup' && step !== 'ux') return true; if (!isPending(dir())) return true; return appendMarker(dir(), `step=${step}`); }, @@ -147,6 +147,7 @@ module.exports = ({ cooler, ssbPath } = {}) => { profile: hasProfile(mine, messages), federation: hasFederated(mine, messages), larp: hasJoinedLarp(messages), + ux: flag.markers.has('step=ux'), backup: flag.markers.has('step=backup'), greeting: hasGreeted(messages) }; diff --git a/src/models/parliament_model.js b/src/models/parliament_model.js index be9f392..18e78f7 100644 --- a/src/models/parliament_model.js +++ b/src/models/parliament_model.js @@ -12,6 +12,20 @@ const QUORUM_RATIO = 0.25; const VOTE_METHODS = new Set(['DEMOCRACY', 'ANARCHY', 'MAJORITY', 'MINORITY']); const METHODS = ['DEMOCRACY', 'MAJORITY', 'MINORITY', 'DICTATORSHIP', 'KARMATOCRACY']; const FEED_ID_RE = /^@.+\.ed25519$/; +const TERM_EPOCH = Date.UTC(2020, 0, 1); +const TERM_SPAN_MS = TERM_DAYS * 86400000; + +const termWindowFor = (at = Date.now()) => { + const ms = at instanceof Date ? at.getTime() : Number(at); + const base = Number.isFinite(ms) ? ms : Date.now(); + const index = Math.floor((base - TERM_EPOCH) / TERM_SPAN_MS); + const startMs = TERM_EPOCH + index * TERM_SPAN_MS; + return { + cycle: index, + startAt: new Date(startMs).toISOString(), + endAt: new Date(startMs + TERM_SPAN_MS).toISOString() + }; +}; module.exports = ({ cooler, services = {} }) => { let ssb; @@ -251,7 +265,13 @@ if (c.type === type) { async function listCandidaturesOpenRaw() { const all = await listByType('parliamentCandidature'); - const filtered = all.filter(c => (c.status || 'OPEN') === 'OPEN'); + const window = termWindowFor(Date.now()); + const from = new Date(window.startAt).getTime(); + const filtered = all.filter(c => { + if ((c.status || 'OPEN') !== 'OPEN') return false; + const created = new Date(c.createdAt).getTime(); + return Number.isFinite(created) ? created >= from : true; + }); return filtered.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); } @@ -345,6 +365,28 @@ if (c.type === type) { return isExpiredTerm(t) ? null : t; } + function virtualAnarchyTerm(window = termWindowFor(Date.now())) { + return { + id: `anarchy:${window.cycle}`, + virtual: true, + type: 'parliamentTerm', + cycle: window.cycle, + method: 'ANARCHY', + powerType: 'none', + powerId: null, + powerTitle: 'ANARCHY', + winnerTribeId: null, + winnerInhabitantId: null, + winnerVotes: 0, + totalVotes: 0, + population: 0, + startAt: window.startAt, + endAt: window.endAt, + createdBy: null, + createdAt: window.startAt + }; + } + function currentCycleStart(term) { return term ? term.startAt : moment().subtract(TERM_DAYS, 'days').toISOString(); } @@ -352,6 +394,7 @@ if (c.type === type) { async function archiveAllCandidatures() { const all = await listCandidaturesOpenRaw(); for (const c of all) { + if (String(c.proposer || '') !== String(userId)) continue; const updated = { ...stripId(c), replaces: c.id, status: 'DISCARDED', updatedAt: nowISO() }; await publishMsg(updated); } @@ -713,10 +756,7 @@ if (c.type === type) { async function createProposal({ title, description }) { let term = await getCurrentTermBase(); - if (!term) { - await resolveElection(); - term = await getCurrentTermBase(); - } + if (!term) term = await resolveElection(); if (!term) throw new Error('No active government'); const allowed = await canPropose(); if (!allowed) throw new Error('You are not in the goverment, yet.'); @@ -833,6 +873,11 @@ if (c.type === type) { } async function getCurrentTerm() { + const published = await getCurrentTermBase(); + return published || virtualAnarchyTerm(); + } + + async function getPublishedTerm() { return await getCurrentTermBase(); } @@ -1135,44 +1180,20 @@ if (c.type === type) { } } - const startAt = now.toISOString(); - const endAt = moment(startAt).add(TERM_DAYS, 'days').toISOString(); + const window = termWindowFor(now.valueOf()); + const startAt = window.startAt; + const endAt = window.endAt; + const population = await inhabitantsCount(); if (!chosen) { - const termAnarchy = { - type: 'parliamentTerm', - method: 'ANARCHY', - powerType: 'none', - powerId: null, - powerTitle: 'ANARCHY', - winnerTribeId: null, - winnerInhabitantId: null, - winnerVotes: 0, - totalVotes: 0, - startAt, - endAt, - createdBy: userId, - createdAt: nowISO() - }; - - const resAnarchy = await publishMsg(termAnarchy); - try { - await sleep(250); - const canonical = await getCurrentTermBase(); - const myId = resAnarchy.key || resAnarchy.id; - if (canonical && canonical.id && myId && canonical.id !== myId) { - const tomb = { type: 'tombstone', target: myId, deletedAt: nowISO(), author: userId }; - await publishMsg(tomb); - await archiveAllCandidatures(); - return canonical; - } - } catch {} await archiveAllCandidatures(); - return resAnarchy; + return virtualAnarchyTerm(window); } const term = { type: 'parliamentTerm', + cycle: window.cycle, + population, method: chosen.method, powerType: chosen.targetType, powerId: chosen.targetId, @@ -1223,21 +1244,16 @@ if (c.type === type) { const term = await getLatestTermAny(); if (!term) return null; const card = await computeGovernmentCard({ ...term, id: term.id || term.startAt }); - const now = moment(); - let start = moment(term.startAt); - let end = term.endAt ? moment(term.endAt) : start.clone().add(TERM_DAYS, 'days'); - let rolled = false; - while (start.isValid() && end.isValid() && end.isSameOrBefore(now)) { - start = end.clone(); - end = end.clone().add(TERM_DAYS, 'days'); - rolled = true; - } + const current = termWindowFor(Date.now()); + const termEnd = term.endAt ? new Date(term.endAt).getTime() : NaN; + const rolled = Number.isFinite(termEnd) && termEnd <= Date.now(); if (rolled) { return { ...card, id: term.id || term.startAt, - since: start.toISOString(), - end: end.toISOString(), + cycle: current.cycle, + since: current.startAt, + end: current.endAt, method: 'ANARCHY', powerType: 'none', powerId: null, @@ -1513,6 +1529,7 @@ if (c.type === type) { listCandidatures, listTerms, getCurrentTerm, + getPublishedTerm, getLatestTerm, getLatestGovernmentCard, listLeaders, @@ -1543,6 +1560,29 @@ if (c.type === type) { function sleep(ms) { return new Promise(r => setTimeout(r, ms)); } +function compareTermsForWindow(a, b) { + const num = (t, field) => Number(t && t[field]) || 0; + const anarchy = (t) => (String(t && t.method || '').toUpperCase() === 'ANARCHY' ? 1 : 0); + + const populationA = num(a, 'population'); + const populationB = num(b, 'population'); + if (populationA !== populationB) return populationB - populationA; + + const turnoutA = num(a, 'totalVotes'); + const turnoutB = num(b, 'totalVotes'); + if (turnoutA !== turnoutB) return turnoutB - turnoutA; + + const votesA = num(a, 'winnerVotes'); + const votesB = num(b, 'winnerVotes'); + if (votesA !== votesB) return votesB - votesA; + + const anarchyA = anarchy(a); + const anarchyB = anarchy(b); + if (anarchyA !== anarchyB) return anarchyA - anarchyB; + + return String(a && a.id || '').localeCompare(String(b && b.id || '')); +} + function collapseOverlappingTerms(terms = []) { if (!terms.length) return []; const sorted = [...terms].sort((a, b) => new Date(a.startAt) - new Date(b.startAt)); @@ -1563,20 +1603,13 @@ function collapseOverlappingTerms(terms = []) { if (!placed) groups.push({ items: [t], minStart: tStart, maxEnd: tEnd }); } const winners = groups.map(g => { - g.items.sort((a, b) => { - const aAn = String(a.method || '').toUpperCase() === 'ANARCHY' ? 1 : 0; - const bAn = String(b.method || '').toUpperCase() === 'ANARCHY' ? 1 : 0; - if (aAn !== bAn) return aAn - bAn; - const aC = new Date(a.createdAt || a.startAt).getTime(); - const bC = new Date(b.createdAt || b.startAt).getTime(); - if (aC !== bC) return aC - bC; - const aS = new Date(a.startAt).getTime(); - const bS = new Date(b.startAt).getTime(); - if (aS !== bS) return aS - bS; - return String(a.id || '').localeCompare(String(b.id || '')); - }); + g.items.sort(compareTermsForWindow); return g.items[0]; }); return winners.sort((a, b) => new Date(b.startAt) - new Date(a.startAt)); } +module.exports.termWindowFor = termWindowFor; +module.exports.compareTermsForWindow = compareTermsForWindow; +module.exports.collapseOverlappingTerms = collapseOverlappingTerms; +module.exports.TERM_DAYS = TERM_DAYS; diff --git a/src/models/polls_model.js b/src/models/polls_model.js new file mode 100644 index 0000000..31db862 --- /dev/null +++ b/src/models/polls_model.js @@ -0,0 +1,443 @@ +const pull = require('../server/node_modules/pull-stream'); +const { getConfig } = require('../configs/config-manager.js'); +const { buildValidatedTombstoneSet } = require('./tombstone_validator'); + +const logLimit = getConfig().ssbLogStream?.limit || 1000; + +const POLL_TYPE = 'poll'; +const VOTE_TYPE = 'pollVote'; +const OPINION_TYPE = 'pollOpinion'; + +const { MAX_OPTIONS, MIN_OPTIONS, MAX_OPTION_LENGTH } = require('./polls_model_limits'); + +const clean = (v) => String(v == null ? '' : v).trim(); + +const normalizeOptions = (raw) => { + const list = Array.isArray(raw) ? raw : String(raw || '').split('\n'); + const out = []; + const seen = new Set(); + for (const entry of list) { + const value = clean(entry).slice(0, MAX_OPTION_LENGTH); + if (!value) continue; + const key = value.toLowerCase(); + if (seen.has(key)) continue; + seen.add(key); + out.push(value); + if (out.length >= MAX_OPTIONS) break; + } + return out; +}; + +const normalizeTags = (raw) => { + const list = Array.isArray(raw) ? raw : String(raw || '').split(','); + return list.map(t => clean(t)).filter(Boolean).slice(0, 20); +}; + +module.exports = ({ cooler, isPublic = false, tribeCrypto = null, chatsModel = null }) => { + let ssb; + const openSsb = async () => { if (!ssb) ssb = await cooler.open(); return ssb; }; + + const getAllMessages = async (ssbClient) => + new Promise((resolve, reject) => { + pull( + ssbClient.createLogStream({ limit: logLimit }), + pull.collect((err, msgs) => (err ? reject(err) : resolve(msgs))) + ); + }); + + const decryptField = (value, keys) => { + if (!tribeCrypto || typeof value !== 'string' || !value) return null; + for (const k of keys) { + try { + const out = tribeCrypto.decryptWithKey(value, k); + if (typeof out === 'string' && out) return out; + } catch (_) {} + } + return null; + }; + + const scopeKey = async (scope) => { + if (!scope || !chatsModel) return null; + if (!scope.chatId && !scope.tribeId) return null; + try { return await chatsModel.encryptionKeyFor(scope.chatId || null, scope.tribeId || null); } catch (_) { return null; } + }; + + const buildIndex = (messages) => { + const tomb = buildValidatedTombstoneSet(messages); + const nodes = new Map(); + const replaced = new Map(); + const votesByRoot = new Map(); + const opinionsByRoot = new Map(); + const closedRoots = new Set(); + const commentsByRoot = new Map(); + const authorByKey = new Map(); + + for (const m of messages) { + const v = m && m.value; + const c = v && v.content; + if (!c || typeof c !== 'object') continue; + authorByKey.set(m.key, v.author); + + if (c.type === POLL_TYPE) { + nodes.set(m.key, { key: m.key, author: v.author, ts: v.timestamp || m.timestamp || 0, c }); + if (typeof c.replaces === 'string') replaced.set(c.replaces, m.key); + continue; + } + if (c.type === VOTE_TYPE && typeof c.target === 'string') { + const entry = votesByRoot.get(c.target) || new Map(); + const prev = entry.get(v.author); + const ts = v.timestamp || m.timestamp || 0; + if (!prev || ts >= prev.ts) { + entry.set(v.author, { + ts, + choices: Array.isArray(c.choices) ? c.choices : [], + encryptedChoices: typeof c.encryptedChoices === 'string' ? c.encryptedChoices : null + }); + } + votesByRoot.set(c.target, entry); + continue; + } + if (c.type === OPINION_TYPE && typeof c.target === 'string') { + const entry = opinionsByRoot.get(c.target) || { counts: {}, voters: [] }; + if (!entry.voters.includes(v.author)) { + entry.voters.push(v.author); + entry.counts[c.category] = (entry.counts[c.category] || 0) + 1; + } + opinionsByRoot.set(c.target, entry); + continue; + } + if (c.type === 'pollClose' && typeof c.target === 'string') { + closedRoots.add(`${v.author}|${c.target}`); + continue; + } + if (c.type === 'post' && typeof c.root === 'string') { + commentsByRoot.set(c.root, (commentsByRoot.get(c.root) || 0) + 1); + } + } + + const rootOf = (key) => { + let cur = key; + const seen = new Set(); + while (nodes.has(cur) && nodes.get(cur).c.replaces && !seen.has(cur)) { + seen.add(cur); + const next = nodes.get(cur).c.replaces; + if (!nodes.has(next)) break; + cur = next; + } + return cur; + }; + + const tipOf = (root) => { + let cur = root; + const seen = new Set(); + while (replaced.has(cur) && !seen.has(cur)) { + seen.add(cur); + const next = replaced.get(cur); + const node = nodes.get(next); + if (!node || node.author !== nodes.get(cur).author) break; + cur = next; + } + return cur; + }; + + return { tomb, nodes, replaced, votesByRoot, opinionsByRoot, closedRoots, commentsByRoot, rootOf, tipOf }; + }; + + const isExpired = (c) => { + if (!c.deadline) return false; + const t = Date.parse(c.deadline); + return Number.isFinite(t) && t <= Date.now(); + }; + + const buildPoll = (idx, rootId, viewerId, keys = []) => { + const tipId = idx.tipOf(rootId); + const node = idx.nodes.get(tipId); + if (!node) return null; + const c = node.c || {}; + let question = clean(c.question); + let rawOptions = c.options; + let undecryptable = false; + if (c.encryptedQuestion) { + const q = decryptField(c.encryptedQuestion, keys); + const o = decryptField(c.encryptedOptions, keys); + if (q === null) undecryptable = true; + question = q || ''; + try { rawOptions = o ? JSON.parse(o) : []; } catch (_) { rawOptions = []; } + } + const options = normalizeOptions(rawOptions); + const voteMap = idx.votesByRoot.get(rootId) || new Map(); + + const counts = {}; + for (const o of options) counts[o] = 0; + let totalVoters = 0; + const voters = []; + let myChoices = []; + for (const [author, entry] of voteMap.entries()) { + let choices = Array.isArray(entry.choices) ? entry.choices : []; + if (entry.encryptedChoices) { + const plain = decryptField(entry.encryptedChoices, keys); + try { choices = plain ? JSON.parse(plain) : []; } catch (_) { choices = []; } + } + const picked = (Array.isArray(choices) ? choices : []).filter(o => options.includes(o)); + if (!picked.length) continue; + totalVoters += 1; + voters.push(author); + for (const o of picked) counts[o] += 1; + if (viewerId && author === viewerId) myChoices = picked; + } + + const closed = idx.closedRoots.has(`${node.author}|${rootId}`) || isExpired(c); + const op = idx.opinionsByRoot.get(rootId) || { counts: {}, voters: [] }; + + return { + id: rootId, + rootId, + tipId, + author: node.author, + question, + options, + encrypted: !!c.encryptedQuestion, + undecryptable, + chatId: c.chatId || null, + anonymous: c.anonymous === true, + multiple: c.multiple === true, + deadline: c.deadline || '', + tags: normalizeTags(c.tags), + tribeId: c.tribeId || null, + houseKey: c.houseKey || null, + createdAt: c.createdAt || new Date(node.ts).toISOString(), + updatedAt: c.updatedAt || null, + status: closed ? 'CLOSED' : 'OPEN', + counts, + totalVoters, + voters: c.anonymous === true ? [] : voters, + votersHidden: c.anonymous === true, + myChoices, + hasVoted: myChoices.length > 0, + commentCount: idx.commentsByRoot.get(rootId) || 0, + opinions: op.counts, + opinions_inhabitants: op.voters + }; + }; + + const collect = async (viewerId) => { + const ssbClient = await openSsb(); + const messages = await getAllMessages(ssbClient); + const idx = buildIndex(messages); + const roots = new Set(); + for (const key of idx.nodes.keys()) roots.add(idx.rootOf(key)); + + const keyCache = new Map(); + const keysFor = async (c) => { + if (!c || (!c.chatId && !c.tribeId)) return []; + const cacheKey = `${c.chatId || ''}|${c.tribeId || ''}`; + if (keyCache.has(cacheKey)) return keyCache.get(cacheKey); + const k = await scopeKey({ chatId: c.chatId || null, tribeId: c.tribeId || null }); + const keys = k ? [k] : []; + keyCache.set(cacheKey, keys); + return keys; + }; + + const list = []; + for (const rootId of roots) { + const tipId = idx.tipOf(rootId); + if (idx.tomb.has(tipId) || idx.tomb.has(rootId)) continue; + const node = idx.nodes.get(tipId); + const keys = await keysFor(node && node.c); + const poll = buildPoll(idx, rootId, viewerId || ssbClient.id, keys); + if (!poll) continue; + if (poll.undecryptable) { list.push(poll); continue; } + if (!poll.question || poll.options.length < MIN_OPTIONS) continue; + list.push(poll); + } + return { list, idx, viewerId: viewerId || ssbClient.id }; + }; + + return { + POLL_TYPE, + VOTE_TYPE, + MAX_OPTIONS, + MIN_OPTIONS, + + async listAll(filter = 'ALL', opts = {}) { + const { list, viewerId } = await collect(); + const f = String(filter || 'ALL').toUpperCase(); + const scopeChat = opts.chatId || null; + const scopeTribe = opts.tribeId || null; + const scopeHouse = opts.houseKey || null; + let out = list.filter(p => + scopeChat ? p.chatId === scopeChat + : scopeTribe ? (p.tribeId === scopeTribe && !p.chatId) + : scopeHouse ? p.houseKey === scopeHouse + : (!p.tribeId && !p.chatId && !p.houseKey)); + + if (f === 'MINE') out = out.filter(p => String(p.author) === String(viewerId)); + else if (f === 'OPEN') out = out.filter(p => p.status === 'OPEN'); + else if (f === 'CLOSED') out = out.filter(p => p.status === 'CLOSED'); + else if (f === 'VOTED') out = out.filter(p => p.hasVoted); + else if (f === 'FAVORITES') { + const fav = new Set((opts.favorites || []).map(String)); + out = out.filter(p => fav.has(String(p.id))); + } + + const q = clean(opts.q).toLowerCase(); + if (q) out = out.filter(p => + p.question.toLowerCase().includes(q) || + p.options.some(o => o.toLowerCase().includes(q)) || + p.tags.some(t => t.toLowerCase().includes(q))); + + if (f === 'TOP') out.sort((a, b) => b.totalVoters - a.totalVoters || new Date(b.createdAt) - new Date(a.createdAt)); + else out.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); + + return out; + }, + + async getPollById(id, viewerId = null) { + const { list, idx } = await collect(viewerId); + const rootId = idx.rootOf(id); + const poll = list.find(p => p.id === rootId || p.id === id || p.tipId === id); + if (!poll) throw new Error('Poll not found'); + return poll; + }, + + async resolveRootId(id) { + const { idx } = await collect(); + return idx.rootOf(id); + }, + + async createPoll(data = {}) { + if (isPublic) throw new Error('Not available in public mode'); + const question = clean(data.question); + if (!question) throw new Error('Question is required'); + const options = normalizeOptions(data.options); + if (options.length < MIN_OPTIONS) throw new Error(`A poll needs at least ${MIN_OPTIONS} options`); + const deadline = clean(data.deadline); + if (deadline) { + const t = Date.parse(deadline); + if (!Number.isFinite(t)) throw new Error('Invalid deadline'); + if (t <= Date.now()) throw new Error('Deadline must be in the future'); + } + const ssbClient = await openSsb(); + const content = { + type: POLL_TYPE, + anonymous: data.anonymous === true || data.anonymous === 'true' || data.anonymous === '1', + multiple: data.multiple === true || data.multiple === 'true' || data.multiple === '1', + deadline, + tags: normalizeTags(data.tags), + createdAt: new Date().toISOString(), + ...(data.tribeId ? { tribeId: String(data.tribeId) } : {}), + ...(data.chatId ? { chatId: String(data.chatId) } : {}), + ...(data.houseKey ? { houseKey: String(data.houseKey) } : {}) + }; + const key = await scopeKey({ chatId: data.chatId, tribeId: data.tribeId }); + if (key && tribeCrypto) { + content.encryptedQuestion = tribeCrypto.encryptWithKey(question, key); + content.encryptedOptions = tribeCrypto.encryptWithKey(JSON.stringify(options), key); + } else { + content.question = question; + content.options = options; + } + return new Promise((res, rej) => ssbClient.publish(content, (err, msg) => err ? rej(err) : res(msg))); + }, + + async updatePoll(id, data = {}) { + const ssbClient = await openSsb(); + const userId = ssbClient.id; + const poll = await this.getPollById(id, userId); + if (poll.author !== userId) throw new Error('Not the author'); + if (poll.status === 'CLOSED') throw new Error('Cannot edit a closed poll'); + if (poll.totalVoters > 0) throw new Error('Cannot edit a poll that already has votes'); + + const options = data.options !== undefined ? normalizeOptions(data.options) : poll.options; + if (options.length < MIN_OPTIONS) throw new Error(`A poll needs at least ${MIN_OPTIONS} options`); + const deadline = data.deadline !== undefined ? clean(data.deadline) : poll.deadline; + if (deadline) { + const t = Date.parse(deadline); + if (!Number.isFinite(t)) throw new Error('Invalid deadline'); + } + const question = data.question !== undefined ? clean(data.question) : poll.question; + const content = { + type: POLL_TYPE, + replaces: poll.tipId, + anonymous: data.anonymous !== undefined + ? (data.anonymous === true || data.anonymous === 'true' || data.anonymous === '1') + : poll.anonymous, + multiple: data.multiple !== undefined + ? (data.multiple === true || data.multiple === 'true' || data.multiple === '1') + : poll.multiple, + deadline, + tags: data.tags !== undefined ? normalizeTags(data.tags) : poll.tags, + createdAt: poll.createdAt, + updatedAt: new Date().toISOString(), + ...(poll.tribeId ? { tribeId: poll.tribeId } : {}), + ...(poll.chatId ? { chatId: poll.chatId } : {}), + ...(poll.houseKey ? { houseKey: poll.houseKey } : {}) + }; + const key = await scopeKey({ chatId: poll.chatId, tribeId: poll.tribeId }); + if (key && tribeCrypto) { + content.encryptedQuestion = tribeCrypto.encryptWithKey(question, key); + content.encryptedOptions = tribeCrypto.encryptWithKey(JSON.stringify(options), key); + } else { + content.question = question; + content.options = options; + } + return new Promise((res, rej) => ssbClient.publish(content, (err, msg) => err ? rej(err) : res(msg))); + }, + + async vote(id, choicesRaw) { + const ssbClient = await openSsb(); + const userId = ssbClient.id; + const poll = await this.getPollById(id, userId); + if (poll.status === 'CLOSED') throw new Error('This poll is closed'); + + const wanted = (Array.isArray(choicesRaw) ? choicesRaw : [choicesRaw]) + .map(c => clean(c)) + .filter(c => poll.options.includes(c)); + const unique = [...new Set(wanted)]; + if (!unique.length) throw new Error('Pick at least one option'); + if (!poll.multiple && unique.length > 1) throw new Error('This poll only accepts one option'); + + const content = { + type: VOTE_TYPE, + target: poll.rootId, + createdAt: new Date().toISOString(), + ...(poll.chatId ? { chatId: poll.chatId } : {}) + }; + const key = await scopeKey({ chatId: poll.chatId, tribeId: poll.tribeId }); + if (key && tribeCrypto) content.encryptedChoices = tribeCrypto.encryptWithKey(JSON.stringify(unique), key); + else content.choices = unique; + return new Promise((res, rej) => ssbClient.publish(content, (err, msg) => err ? rej(err) : res(msg))); + }, + + async closePoll(id) { + const ssbClient = await openSsb(); + const userId = ssbClient.id; + const poll = await this.getPollById(id, userId); + if (poll.author !== userId) throw new Error('Not the author'); + if (poll.status === 'CLOSED') return { status: 'already_closed' }; + const content = { type: 'pollClose', target: poll.rootId, createdAt: new Date().toISOString() }; + await new Promise((res, rej) => ssbClient.publish(content, (err, msg) => err ? rej(err) : res(msg))); + return { status: 'ok' }; + }, + + async deletePoll(id) { + const ssbClient = await openSsb(); + const userId = ssbClient.id; + const poll = await this.getPollById(id, userId); + if (poll.author !== userId) throw new Error('Not the author'); + const content = { type: 'tombstone', target: poll.tipId, deletedAt: new Date().toISOString(), author: userId }; + return new Promise((res, rej) => ssbClient.publish(content, (err, msg) => err ? rej(err) : res(msg))); + }, + + async createOpinion(id, category) { + const categories = require('../backend/opinion_categories'); + if (!categories.includes(category)) throw new Error('Invalid opinion category'); + const ssbClient = await openSsb(); + const userId = ssbClient.id; + const poll = await this.getPollById(id, userId); + if (poll.opinions_inhabitants.includes(userId)) throw new Error('Already opined'); + const content = { type: OPINION_TYPE, target: poll.rootId, category, createdAt: new Date().toISOString() }; + return new Promise((res, rej) => ssbClient.publish(content, (err, result) => err ? rej(err) : res(result))); + } + }; +}; diff --git a/src/models/polls_model_limits.js b/src/models/polls_model_limits.js new file mode 100644 index 0000000..ba1e774 --- /dev/null +++ b/src/models/polls_model_limits.js @@ -0,0 +1,5 @@ +const MAX_OPTIONS = 10; +const MIN_OPTIONS = 2; +const MAX_OPTION_LENGTH = 120; + +module.exports = { MAX_OPTIONS, MIN_OPTIONS, MAX_OPTION_LENGTH }; diff --git a/src/models/recurrence.js b/src/models/recurrence.js new file mode 100644 index 0000000..0c696aa --- /dev/null +++ b/src/models/recurrence.js @@ -0,0 +1,40 @@ +const truthy = (v) => v === true || v === 1 || v === '1' || v === 'on' || v === 'true'; + +const hasAnyInterval = (weekly, monthly, yearly) => truthy(weekly) || truthy(monthly) || truthy(yearly); + +const expandRecurrence = (firstDate, until, weekly, monthly, yearly) => { + const start = new Date(firstDate); + if (isNaN(start.getTime())) return []; + const out = [start]; + if (!until || !hasAnyInterval(weekly, monthly, yearly)) return out; + const end = new Date(until).getTime(); + if (!Number.isFinite(end)) return out; + const seen = new Set([start.getTime()]); + const walk = (mutate) => { + const n = new Date(start); + mutate(n); + let guard = 0; + while (n.getTime() <= end && guard++ < 5000) { + const t = n.getTime(); + if (!seen.has(t)) { seen.add(t); out.push(new Date(n)); } + mutate(n); + } + }; + if (truthy(weekly)) walk((d) => d.setUTCDate(d.getUTCDate() + 7)); + if (truthy(monthly)) walk((d) => d.setUTCMonth(d.getUTCMonth() + 1)); + if (truthy(yearly)) walk((d) => d.setUTCFullYear(d.getUTCFullYear() + 1)); + return out.sort((a, b) => a.getTime() - b.getTime()); +}; + +const nextOccurrence = (firstDate, until, weekly, monthly, yearly, from = Date.now()) => { + const list = expandRecurrence(firstDate, until, weekly, monthly, yearly); + for (const d of list) if (d.getTime() >= from) return d; + return list.length ? list[list.length - 1] : null; +}; + +const upcomingOccurrences = (firstDate, until, weekly, monthly, yearly, limit = 12, from = Date.now()) => + expandRecurrence(firstDate, until, weekly, monthly, yearly) + .filter(d => d.getTime() >= from) + .slice(0, limit); + +module.exports = { truthy, hasAnyInterval, expandRecurrence, nextOccurrence, upcomingOccurrences }; diff --git a/src/models/reports_model.js b/src/models/reports_model.js index 8bb1b29..09d6ea9 100644 --- a/src/models/reports_model.js +++ b/src/models/reports_model.js @@ -1,4 +1,5 @@ const pull = require('../server/node_modules/pull-stream'); +const { normalizeImages, normalizeVideo } = require('./media_gallery'); const { getConfig } = require('../configs/config-manager.js'); const { buildValidatedTombstoneSet } = require('./tombstone_validator'); const { dedupeBy, norm } = require('../backend/dedupe'); @@ -39,7 +40,7 @@ const normalizeTemplate = (category, tpl) => { } if (cat === 'CONTENT') { - return pick(['contentLocation', 'whyInappropriate', 'requestedAction', 'evidenceLinks']); + return pick(['contentLocation', 'whyInappropriate', 'evidenceLinks']); } return {}; @@ -164,6 +165,8 @@ module.exports = ({ cooler }) => { ...c, category: cat, status: normalizeStatus(c.status || 'OPEN'), + images: normalizeImages(c.images && c.images.length ? c.images : c.image), + video: normalizeVideo(c.video), severity: normalizeSeverity(c.severity) || 'low', confirmations, tags: ensureArray(c.tags), @@ -174,14 +177,13 @@ module.exports = ({ cooler }) => { }; return { - async createReport(title, description, category, image, tagsRaw = [], severity = 'low', template = {}) { + async createReport(title, description, category, image, tagsRaw = [], severity = 'low', template = {}, media = {}) { const ssb = await openSsb(); const userId = ssb.id; - let blobId = null; - if (image) { - blobId = String(image).trim() || null; - } + const images = normalizeImages((media && media.images && media.images.length) ? media.images : image); + const blobId = images[0] || null; + const clip = normalizeVideo(media && media.video); const tags = Array.isArray(tagsRaw) ? tagsRaw.filter(Boolean) @@ -196,6 +198,8 @@ module.exports = ({ cooler }) => { createdAt: new Date().toISOString(), author: userId, image: blobId, + images, + video: clip, tags, confirmations: [], severity: normalizeSeverity(severity) || 'low', @@ -227,10 +231,15 @@ module.exports = ({ cooler }) => { ? String(updatedContent.tags || '').split(',').map(t => t.trim()).filter(Boolean) : ensureArray(report.content.tags); - let blobId = report.content.image || null; - if (updatedContent.image) { - blobId = String(updatedContent.image).trim() || null; - } + const nextImages = normalizeImages( + Object.prototype.hasOwnProperty.call(updatedContent, 'images') + ? updatedContent.images + : (report.content.images && report.content.images.length ? report.content.images : (updatedContent.image || report.content.image)) + ); + const blobId = nextImages[0] || null; + const nextVideo = Object.prototype.hasOwnProperty.call(updatedContent, 'video') + ? normalizeVideo(updatedContent.video) + : normalizeVideo(report.content.video); const nextStatus = Object.prototype.hasOwnProperty.call(updatedContent, 'status') ? normalizeStatus(updatedContent.status) @@ -258,6 +267,8 @@ module.exports = ({ cooler }) => { type: 'report', replaces: tipId, image: blobId, + images: nextImages, + video: nextVideo, tags, confirmations, opinions: agg.opinions, diff --git a/src/models/tasks_model.js b/src/models/tasks_model.js index a750a3b..1fd0e29 100644 --- a/src/models/tasks_model.js +++ b/src/models/tasks_model.js @@ -1,5 +1,6 @@ const pull = require('../server/node_modules/pull-stream'); const moment = require('../server/node_modules/moment'); +const { normalizeImages, normalizeVideo } = require('./media_gallery'); const { getConfig } = require('../configs/config-manager.js'); const { buildValidatedTombstoneSet } = require('./tombstone_validator'); const { dedupeBy, norm } = require('../backend/dedupe'); @@ -131,6 +132,8 @@ module.exports = ({ cooler, pmModel }) => { id: node.key, rootId, ...c, + images: normalizeImages(c.images), + video: normalizeVideo(c.video), assignees, opinions, opinions_inhabitants: voters, @@ -139,7 +142,7 @@ module.exports = ({ cooler, pmModel }) => { }; return { - async createTask(title, description, startTime, endTime, priority, location = '', tagsRaw = [], isPublic) { + async createTask(title, description, startTime, endTime, priority, location = '', tagsRaw = [], isPublic, media = {}) { const ssb = await openSsb(); const userId = ssb.id; @@ -166,6 +169,8 @@ module.exports = ({ cooler, pmModel }) => { location, tags, isPublic: visibility, + images: normalizeImages(media && media.images), + video: normalizeVideo(media && media.video), assignees: [userId], createdAt: new Date().toISOString(), status: 'OPEN', @@ -253,6 +258,8 @@ module.exports = ({ cooler, pmModel }) => { tags: newTags, isPublic: newVisibility, status: newStatus, + images: normalizeImages(updatedData.images !== undefined ? updatedData.images : c.images), + video: updatedData.video !== undefined ? normalizeVideo(updatedData.video) : normalizeVideo(c.video), assignees: nextAssignees, updatedAt: new Date().toISOString(), replaces: taskId diff --git a/src/models/tribes_model.js b/src/models/tribes_model.js index 64e657c..f94e6e1 100644 --- a/src/models/tribes_model.js +++ b/src/models/tribes_model.js @@ -671,7 +671,7 @@ module.exports = ({ cooler, tribeCrypto }) => { if (typeof c.ch !== 'string' || typeof c.s !== 'string' || typeof c.ek !== 'string') continue; if (inviteTombstoned.has(m.key)) continue; if (tribeCrypto.hashInviteCode(code, c.s) !== c.ch) continue; - const chain = tribeCrypto.decryptChainFromInvite(c.ek, code, c.s); + const chain = tribeCrypto.decryptChainFromInvite(c.ek, code, c.s, 3); if (Array.isArray(chain) && chain.length) { matched = { msgKey: m.key, codeHash: c.ch, chain, multi: c.multi === 1 || c.multi === true }; break; diff --git a/src/server/package.json b/src/server/package.json index 1afcba7..7e26715 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -1,6 +1,6 @@ { "name": "@krakenslab/oasis", - "version": "0.9.1", + "version": "0.9.5", "description": "Oasis - Social Networking Utopia", "repository": { "type": "git", diff --git a/src/server/ssb_config.js b/src/server/ssb_config.js index 6e9e36b..f3e4be6 100644 --- a/src/server/ssb_config.js +++ b/src/server/ssb_config.js @@ -23,4 +23,9 @@ const megabyte = Math.pow(2, 20); config.blobs = config.blobs || {}; config.blobs.max = 50 * megabyte; +config.statePath = (name) => { + if (process.env.OASIS_STATE_DIR) return path.join(process.env.OASIS_STATE_DIR, name); + return config.path ? path.join(config.path, name) : null; +}; + module.exports = config; diff --git a/src/views/AI_view.js b/src/views/AI_view.js index e7a0d14..1529237 100644 --- a/src/views/AI_view.js +++ b/src/views/AI_view.js @@ -9,74 +9,34 @@ exports.aiView = (history = [], userPrompt = '') => { div({ class: "tags-header" }, h2(i18n.aiTitle), p(i18n.aiDescription), - userPrompt ? div({ class: 'user-prompt', style: 'margin-bottom: 2em; font-size: 0.95em; color: #888;' }, + userPrompt ? div({ class: 'user-prompt' }, `${i18n.aiPromptUsed || 'System Prompt'}: `, - span({ style: 'font-style: italic;' }, `"${userPrompt}"`) + span({ class: 'user-prompt-text' }, `"${userPrompt}"`) ) : null, - form({ method: 'POST', action: '/ai', style: "margin-bottom: 0;" }, + form({ method: 'POST', action: '/ai', class: 'ai-prompt-form' }, textarea({ name: 'input', rows: 4, placeholder: i18n.aiInputPlaceholder, required: true }), br(), - div({ style: "display: flex; gap: 1.5em; justify-content: flex-end; align-items: center; margin-top: 0.7em;" }, + div({ class: 'ai-submit-row' }, button({ type: 'submit' }, i18n.aiSubmitButton) ) ), - div({ style: "display: flex; justify-content: flex-end; margin-bottom: 2em;" }, - form({ method: 'POST', action: '/ai/clear', style: "display: inline;" }, - button({ - type: 'submit', - style: ` - background: #b80c09; - color: #fff; - border: none; - padding: 0.4em 1.2em; - border-radius: 6px; - cursor: pointer; - font-size: 1em; - margin-left: 1em; - ` - }, i18n.aiClearHistory) + div({ class: 'ai-clear-row' }, + form({ method: 'POST', action: '/ai/clear', class: 'ai-clear-form' }, + button({ type: 'submit', class: 'ai-clear-btn' }, i18n.aiClearHistory) ) ), br(), ...history.map(entry => - div({ - class: 'chat-entry', - style: ` - margin-bottom: 2em; - position: relative; - background: #191919; - border-radius: 10px; - box-shadow: 0 0 8px #0004; - padding-top: 1.8em; - ` - }, - entry.timestamp ? span({ - style: ` - position: absolute; - top: 0.5em; - right: 1.3em; - font-size: 0.92em; - color: #888; - ` - }, new Date(entry.timestamp).toLocaleString()) : null, + div({ class: 'chat-entry' }, + entry.timestamp + ? span({ class: 'chat-entry-timestamp' }, new Date(entry.timestamp).toLocaleString()) + : null, br(), br(), - div({ class: 'user-question', style: 'margin-bottom: 0.75em;' }, + div({ class: 'user-question' }, h2(`${i18n.aiUserQuestion}:`), p(...renderUrl(entry.question)) ), - div({ - class: 'ai-response', - style: ` - max-width: 800px; - margin: auto; - background: #111; - padding: 1.25em; - border-radius: 6px; - font-family: sans-serif; - line-height: 1.6; - color: #ffcc00; - ` - }, + div({ class: 'ai-response' }, h2(`${i18n.aiResponseTitle}:`), ...String(entry.answer || '') .split('\n\n') @@ -84,31 +44,19 @@ exports.aiView = (history = [], userPrompt = '') => { paragraph .split('\n') .map(line => - p({ style: "margin-bottom: 1.2em;" }, ...renderUrl(line.trim())) + p(...renderUrl(line.trim())) ) ) ), - div({ - class: 'ai-train-bar', - style: ` - display:flex; - align-items:center; - gap:12px; - margin: 12px auto 8px auto; - max-width: 800px; - padding: 8px 0; - border-top: 1px solid #2a2a2a; - flex-wrap: wrap; - ` - }, + div({ class: 'ai-train-bar' }, Array.isArray(entry.snippets) && entry.snippets.length - ? span({ style: 'color:#9aa; font-size:0.95em;' }, `${i18n.aiSnippetsUsed}: ${entry.snippets.length}`) + ? span({ class: 'ai-snippets-used' }, `${i18n.aiSnippetsUsed}: ${entry.snippets.length}`) : null, h2(`${i18n.statsAITraining}:`), entry.trainStatus === 'approved' - ? span({ style: 'color:#5ad25a; font-weight:600;' }, i18n.aiTrainApproved) + ? span({ class: 'ai-train-approved' }, i18n.aiTrainApproved) : entry.trainStatus === 'rejected' - ? span({ style: 'color:#ff6b6b; font-weight:600;' }, i18n.aiTrainRejected) + ? span({ class: 'ai-train-rejected' }, i18n.aiTrainRejected) : null, entry.trainStatus === 'approved' || entry.trainStatus === 'rejected' ? null diff --git a/src/views/banking_views.js b/src/views/banking_views.js index 4a1e976..69f9ffc 100644 --- a/src/views/banking_views.js +++ b/src/views/banking_views.js @@ -297,7 +297,8 @@ const renderTaxes = (data, lookup) => { ); }; -const renderOverviewSummaryTable = (s, rules, userEcoinTax) => { +const renderOverviewSummaryTable = (s, rules, userEcoinTax, isPub = false) => { + const ubiWired = !!s.pubId || isPub; const score = Number(s.userEngagementScore || 0); const pool = Number(s.pool || 0); const W = Math.max(1, Number(s.weightsSum || 1)); @@ -315,16 +316,16 @@ const renderOverviewSummaryTable = (s, rules, userEcoinTax) => { tbody( kvRow(i18n.bankUserBalance, `${Number(s.userBalance || 0).toFixed(6)} ECO`), kvRow(i18n.bankIndustryBalance || 'Industry Production (estimated)', a({ href: '/industry' }, `${Number(s.industryNetworkTotal || 0).toFixed(6)} ECO`)), - kvRow(i18n.bankUbiAvailability, span({ class: availClass }, availLabel)), + ubiWired ? kvRow(i18n.bankUbiAvailability, span({ class: availClass }, availLabel)) : null, s.pubId ? kvRow(i18n.pubIdLabel, userLink(s.pubId)) : null, kvRow(i18n.bankEpoch, String(s.epochId || "-")), kvRow(i18n.bankPool, `${pool.toFixed(6)} ECO`), kvRow(i18n.bankWeightsSum, String(W.toFixed(6))), kvRow(i18n.bankingUserEngagementScore, String(score)), - kvRow(i18n.bankYourUbiMonth || 'Your UBI (this month)', `${future.toFixed(6)} ECO`), + ubiWired ? kvRow(i18n.bankYourUbiMonth || 'Your UBI (this month)', `${future.toFixed(6)} ECO`) : null, kvRow(i18n.bankYourIndustryBalance || 'Your Industry Share', a({ href: '/industry?filter=MEMBER' }, `${Number(s.industryBalance || 0).toFixed(6)} ECO`)), kvRow(i18n.bankOverviewYourTaxes || 'Your taxes', a({ href: '/banking?filter=taxes' }, `${tax.toFixed(6)} ECO`)), - kvRow(i18n.bankYourFundsMonth || 'Your Funds (this month)', `${(future + Number(s.industryBalance || 0) - tax).toFixed(6)} ECO`) + kvRow(i18n.bankYourFundsMonth || 'Your Funds (this month)', `${((ubiWired ? future : 0) + Number(s.industryBalance || 0) - tax).toFixed(6)} ECO`) ) ) ); @@ -621,7 +622,7 @@ const renderBankingView = (data, filter, userId, isPub) => generateFilterButtons(["overview","exchange","taxes","mine","pending","closed","claimed","expired","epochs","rules","addresses"], filter, "/banking"), filter === "overview" ? div( - renderOverviewSummaryTable(data.summary || {}, data.rules, data.userTotalTax || data.userEcoinTax), + renderOverviewSummaryTable(data.summary || {}, data.rules, data.userTotalTax || data.userEcoinTax, isPub), renderClaimUBIBlock(data.pendingUBI || null, isPub, data.alreadyClaimed, (data.summary || {}).pubId, (data.summary || {}).hasValidWallet, (data.summary || {}).ubiAvailability), allocationsTable((data.allocations || []).sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)), userId) ) diff --git a/src/views/clearnet_view.js b/src/views/clearnet_view.js index a863462..2ba743a 100644 --- a/src/views/clearnet_view.js +++ b/src/views/clearnet_view.js @@ -71,7 +71,7 @@ const renderFediverseReach = (prefs, i18nObj = {}) => { a({ href: url, target: '_blank', rel: 'noopener noreferrer', class: 'pm-exposition-chip-link' }, span({ class: 'pm-exposition-chip pm-exposition-fediverse' }, span({ class: 'pm-exposition-icon' }, '🐘'), - span({ class: 'pm-exposition-text' }, i18nObj.fediverse || 'Fediverse') + span({ class: 'pm-exposition-text' }, i18nObj.fediverse || 'Multiverse') ) ), a({ href: url, target: '_blank', rel: 'noopener noreferrer', class: 'fediverse-reach-url' }, handle) diff --git a/src/views/comments_view.js b/src/views/comments_view.js new file mode 100644 index 0000000..85489fc --- /dev/null +++ b/src/views/comments_view.js @@ -0,0 +1,77 @@ +const { div, p, h2, span, a, form, input, textarea, button, label, br, details, summary } = require("../server/node_modules/hyperaxe"); +const moment = require("../server/node_modules/moment"); +const { i18n, userLink } = require("./main_views"); +const { renderUrl } = require("../backend/renderUrl"); + +const COMMENT_ICON = "✑"; + +const visibleComments = (comments) => (Array.isArray(comments) ? comments : []).filter(c => { + const t = c && c.value && c.value.content && c.value.content.text; + return t && String(t).trim(); +}); + +const renderCommentCard = (c) => { + const author = (c && c.value && c.value.author) || ""; + const ts = (c && c.value && c.value.timestamp) || (c && c.timestamp); + const absDate = ts ? moment(ts).format("YYYY/MM/DD HH:mm") : ""; + const relDate = ts ? moment(ts).fromNow() : ""; + const content = (c && c.value && c.value.content) || {}; + const rootId = content.fork || content.root || null; + const text = content.text || ""; + + return div({ class: "votations-comment-card", id: c && c.key ? c.key : undefined }, + span({ class: "created-at" }, + span(i18n.createdBy), + author ? userLink(author) : span("(unknown)"), + absDate ? span(" | ") : "", + absDate ? span({ class: "votations-comment-date" }, absDate) : "", + relDate ? span({ class: "votations-comment-date" }, " | ", i18n.sendTime) : "", + relDate && rootId ? a({ href: `/thread/${encodeURIComponent(rootId)}#${encodeURIComponent(c.key)}` }, relDate) : "" + ), + p({ class: "votations-comment-text" }, ...renderUrl(String(text))) + ); +}; + +const renderCommentsSection = ({ action, comments = [], returnTo = null, closedNote = null, extraClass = "" } = {}) => { + const list = visibleComments(comments); + return details({ class: "comments-collapse" + (extraClass ? ` ${extraClass}` : "") }, + summary({ class: list.length > 0 ? "comments-summary engage-on" : "comments-summary" }, + span({ class: "comments-summary-icon" }, COMMENT_ICON), + span({ class: "comments-summary-count" }, `(${list.length})`) + ), + div({ class: "vote-comments-section" }, + closedNote + ? p({ class: "muted" }, closedNote) + : div({ class: "comment-form-wrapper" }, + h2({ class: "comment-form-title" }, i18n.voteNewCommentLabel), + form({ method: "POST", action, class: "comment-form", enctype: "multipart/form-data" }, + returnTo ? input({ type: "hidden", name: "returnTo", value: returnTo }) : null, + textarea({ name: "text", rows: 4, class: "comment-textarea", placeholder: i18n.voteNewCommentPlaceholder }), + div({ class: "comment-file-upload" }, label(i18n.uploadMedia), input({ type: "file", name: "blob" })), + br(), + button({ type: "submit", class: "comment-submit-btn" }, i18n.voteNewCommentButton) + ) + ), + list.length + ? div({ class: "comments-list" }, ...list.map(renderCommentCard)) + : (closedNote ? null : p({ class: "votations-no-comments" }, i18n.voteNoCommentsYet)) + ) + ); +}; + +const renderCommentsLink = ({ href, count = 0 } = {}) => { + if (!href) return null; + const total = Number(count) || 0; + return a({ href, class: total > 0 ? "comments-summary engage-on comments-link" : "comments-summary comments-link" }, + span({ class: "comments-summary-icon" }, COMMENT_ICON), + span({ class: "comments-summary-count" }, `(${total})`) + ); +}; + +module.exports = { + COMMENT_ICON, + renderCommentsLink, + visibleComments, + renderCommentCard, + renderCommentsSection +}; diff --git a/src/views/dev_view.js b/src/views/dev_view.js index 5699a74..90d705f 100644 --- a/src/views/dev_view.js +++ b/src/views/dev_view.js @@ -188,13 +188,13 @@ exports.devFileView = async (file) => { form({ method: "GET", action: "/reports" }, input({ type: "hidden", name: "filter", value: "create" }), input({ type: "hidden", name: "category", value: "BUGS" }), - input({ type: "hidden", name: "title", value: reportTitle }), + input({ type: "hidden", name: "title", maxlength: "100", value: reportTitle }), input({ type: "hidden", name: "description", value: reportDescription }), button({ type: "submit", class: "filter-btn" }, i18n.devReportBug || "Report Bug") ), form({ method: "GET", action: "/tasks" }, input({ type: "hidden", name: "filter", value: "create" }), - input({ type: "hidden", name: "title", value: taskTitle }), + input({ type: "hidden", name: "title", maxlength: "100", value: taskTitle }), input({ type: "hidden", name: "description", value: reportDescription }), button({ type: "submit", class: "filter-btn" }, i18n.devCreateTask || "Create Task") ), diff --git a/src/views/favorites_view.js b/src/views/favorites_view.js index a5e3106..0260a3c 100644 --- a/src/views/favorites_view.js +++ b/src/views/favorites_view.js @@ -10,6 +10,30 @@ const userId = config.keys.id; const safeArr = (v) => (Array.isArray(v) ? v : []); const safeText = (v) => String(v || "").trim(); +const FILTER_KINDS = [ + { value: "audios", label: () => i18n.favoritesFilterAudios }, + { value: "bookmarks", label: () => i18n.favoritesFilterBookmarks }, + { value: "calendars", label: () => i18n.favoritesFilterCalendars }, + { value: "chats", label: () => i18n.favoritesFilterChats }, + { value: "documents", label: () => i18n.favoritesFilterDocuments }, + { value: "events", label: () => i18n.favoritesFilterEvents }, + { value: "forum", label: () => i18n.favoritesFilterForum }, + { value: "housing", label: () => i18n.favoritesFilterHousing }, + { value: "images", label: () => i18n.favoritesFilterImages }, + { value: "jobs", label: () => i18n.favoritesFilterJobs }, + { value: "maps", label: () => i18n.favoritesFilterMaps }, + { value: "market", label: () => i18n.favoritesFilterMarket }, + { value: "pads", label: () => i18n.favoritesFilterPads }, + { value: "projects", label: () => i18n.favoritesFilterProjects }, + { value: "reports", label: () => i18n.favoritesFilterReports }, + { value: "shopProducts", label: () => i18n.favoritesFilterShopProducts }, + { value: "tasks", label: () => i18n.favoritesFilterTasks }, + { value: "torrents", label: () => i18n.favoritesFilterTorrents }, + { value: "transfers", label: () => i18n.favoritesFilterTransfers }, + { value: "videos", label: () => i18n.favoritesFilterVideos }, + { value: "votes", label: () => i18n.favoritesFilterVotes } +]; + const buildReturnTo = (filter) => { const f = safeText(filter || "all"); return `/favorites?filter=${encodeURIComponent(f)}`; @@ -25,6 +49,47 @@ const renderTags = (tags) => { : null; }; +const DETAIL_KEYS = [ + "status", "category", "severity", "priority", "location", "place", + "date", "deadline", "startTime", "endTime", "price", "salary", "amount", + "concept", "question", "housing_type", "property_type", "item_type", "sector" +]; + +const fieldLabel = (key) => { + const camel = key.replace(/_(.)/g, (_, c) => c.toUpperCase()); + return i18n[camel + "Label"] || i18n["search" + camel.charAt(0).toUpperCase() + camel.slice(1)] || camel.toUpperCase(); +}; + +const fieldValue = (v) => { + if (v === null || v === undefined) return ""; + if (Array.isArray(v)) return v.filter(Boolean).join(", "); + if (typeof v === "object") return ""; + return String(v).trim(); +}; + +const renderDetailFields = (item) => { + const content = item && item.content; + if (!content || typeof content !== "object") return null; + const rows = DETAIL_KEYS + .map((k) => [k, fieldValue(content[k])]) + .filter(([, v]) => v) + .map(([k, v]) => + div({ class: "card-field" }, + span({ class: "card-label" }, `${fieldLabel(k)}: `), + span({ class: "card-value" }, v) + ) + ); + const members = ["members", "participants", "attendees", "assignees", "confirmedBy"] + .map((k) => [k, Array.isArray(content[k]) ? content[k].length : null]) + .find(([, n]) => typeof n === "number" && n > 0); + if (members) { + rows.push(div({ class: "tribe-card-members" }, + span({ class: "tribe-members-count" }, `${fieldLabel(members[0])}: ${members[1]}`) + )); + } + return rows.length ? div({ class: "cv-card-fields" }, ...rows) : null; +}; + const renderBookmarkUrl = (item) => { if (item.kind !== "bookmarks") return null; if (!item.url) return null; @@ -60,7 +125,7 @@ const renderFavoriteCard = (item, filter) => { const title = safeText(item.title) || safeText(item.name) || safeText(item.category) || safeText(item.url) || ""; const ts = item.updatedAt || item.createdAt; - const absDate = ts ? moment(ts).format("YYYY/MM/DD HH:mm:ss") : ""; + const absDate = ts ? moment(ts).format("YYYY/MM/DD HH:mm") : ""; const isOwn = item.author && String(item.author) === String(userId); return div( @@ -95,6 +160,7 @@ const renderFavoriteCard = (item, filter) => { renderImagePreview(item), renderBookmarkUrl(item), safeText(item.description) ? p(...renderUrl(item.description)) : null, + renderDetailFields(item), renderTags(item.tags), p( { class: "card-footer" }, @@ -105,7 +171,7 @@ const renderFavoriteCard = (item, filter) => { ); }; -exports.favoritesView = async (items, filter = "all", counts = {}) => { +exports.favoritesView = async (items, filter = "all", counts = {}, q = "") => { const c = counts || {}; const total = typeof c.all === "number" ? c.all : safeArr(items).length; @@ -125,53 +191,22 @@ exports.favoritesView = async (items, filter = "all", counts = {}) => { { type: "submit", name: "filter", value: "recent", class: filter === "recent" ? "filter-btn active" : "filter-btn" }, `${i18n.favoritesFilterRecent} (${total})` ), - button( - { type: "submit", name: "filter", value: "audios", class: filter === "audios" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterAudios} (${c.audios || 0})` - ), - button( - { type: "submit", name: "filter", value: "bookmarks", class: filter === "bookmarks" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterBookmarks} (${c.bookmarks || 0})` - ), - button( - { type: "submit", name: "filter", value: "documents", class: filter === "documents" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterDocuments} (${c.documents || 0})` - ), - button( - { type: "submit", name: "filter", value: "images", class: filter === "images" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterImages} (${c.images || 0})` - ), - button( - { type: "submit", name: "filter", value: "maps", class: filter === "maps" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterMaps} (${c.maps || 0})` - ), - button( - { type: "submit", name: "filter", value: "pads", class: filter === "pads" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterPads || "PADS"} (${c.pads || 0})` - ), - button( - { type: "submit", name: "filter", value: "chats", class: filter === "chats" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterChats || "CHATS"} (${c.chats || 0})` - ), - button( - { type: "submit", name: "filter", value: "calendars", class: filter === "calendars" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterCalendars || "CALENDARS"} (${c.calendars || 0})` - ), - button( - { type: "submit", name: "filter", value: "videos", class: filter === "videos" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterVideos} (${c.videos || 0})` - ), - button( - { type: "submit", name: "filter", value: "torrents", class: filter === "torrents" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterTorrents || "TORRENTS"} (${c.torrents || 0})` - ), - button( - { type: "submit", name: "filter", value: "market", class: filter === "market" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterMarket || "MARKET"} (${c.market || 0})` - ), - button( - { type: "submit", name: "filter", value: "shopProducts", class: filter === "shopProducts" ? "filter-btn active" : "filter-btn" }, - `${i18n.favoritesFilterShopProducts || "SHOP ITEMS"} (${c.shopProducts || 0})` + ...FILTER_KINDS.map((k) => + button( + { type: "submit", name: "filter", value: k.value, class: filter === k.value ? "filter-btn active" : "filter-btn" }, + `${k.label()} (${c[k.value] || 0})` + ) + ) + ) + ), + div( + { class: "filters" }, + form( + { method: "GET", action: "/favorites", class: "filter-box" }, + input({ type: "hidden", name: "filter", value: filter }), + input({ type: "text", name: "q", value: q, placeholder: i18n.favoritesSearchPlaceholder, class: "filter-box__input" }), + div({ class: "filter-box__controls" }, + button({ type: "submit", class: "filter-box__button" }, i18n.searchButton) ) ) ), diff --git a/src/views/fediverse_view.js b/src/views/fediverse_view.js index c651941..dcbd33d 100644 --- a/src/views/fediverse_view.js +++ b/src/views/fediverse_view.js @@ -6,7 +6,7 @@ const moment = require("../server/node_modules/moment"); const fmtDate = (ts) => { if (!ts) return ""; const m = moment(ts); - return m.isValid() ? m.format("YYYY-MM-DD HH:mm") : ""; + return m.isValid() ? m.format("YYYY/MM/DD HH:mm") : ""; }; const renderMedia = (m) => { @@ -111,7 +111,7 @@ const mastodonBox = (account, stats, actions, showLabel) => { const disconnectedBlock = () => { const text = String(i18n.fediverseDisconnected || ""); - const settingsLink = a({ href: "/settings#fediverse" }, i18n.fediverseEmptyLink || "settings"); + const settingsLink = a({ href: "/settings#multiverse" }, i18n.fediverseEmptyLink || "settings"); const parts = text.split("%LINK%"); const para = parts.length > 1 ? p(parts[0], settingsLink, parts.slice(1).join("%LINK%")) diff --git a/src/views/feed_view.js b/src/views/feed_view.js index 8e1cf97..359f9f2 100644 --- a/src/views/feed_view.js +++ b/src/views/feed_view.js @@ -1,5 +1,6 @@ const { div, h2, p, section, button, form, a, span, textarea, br, input, h1, label } = require("../server/node_modules/hyperaxe"); -const { template, i18n, renderOpinionsVoting, userLink, renderContentActions } = require("./main_views"); +const { renderCommentsSection: renderSharedCommentsSection, renderCommentsLink } = require("./comments_view"); +const { template, i18n, renderOpinionsVoting, userLink, renderContentActions, renderEngagement } = require("./main_views"); const { config } = require("../server/SSB_server.js"); const { renderTextWithStyles } = require("../backend/renderTextWithStyles"); const moment = require("../server/node_modules/moment"); @@ -56,7 +57,7 @@ const generateFilterButtons = (filters, currentFilter, action, extra = {}) => { { method: "GET", action }, input({ type: "hidden", name: "filter", value: mode }), ...hiddenInputs(extra), - button({ type: "submit", class: cur === mode ? "filter-btn active" : "filter-btn" }, i18n[mode + "Button"] || mode) + button({ type: "submit", class: cur === mode ? "filter-btn active" : "filter-btn" }, String(i18n[mode + "Button"] || mode).toUpperCase()) ) ); }; @@ -79,65 +80,11 @@ const renderCardField = (labelText, value) => ); const renderFeedCommentsSection = (feedKey, comments = []) => { - const list = Array.isArray(comments) ? comments : []; - const commentsCount = list.length; - - return div( - { class: "vote-comments-section" }, - div( - { class: "comments-count" }, - span({ class: "card-label" }, i18n.voteCommentsLabel + ": "), - span({ class: "card-value" }, String(commentsCount)) - ), - div( - { class: "comment-form-wrapper" }, - h2({ class: "comment-form-title" }, i18n.voteNewCommentLabel || i18n.feedPostComment || "Post a comment"), - form( - { method: "POST", action: `/feed/${encodeURIComponent(feedKey)}/comments`, class: "comment-form", enctype: "multipart/form-data" }, - textarea({ - id: "comment-text", - name: "text", - rows: 4, - class: "comment-textarea", - placeholder: i18n.voteNewCommentPlaceholder || "" - }), - div({ class: "comment-file-upload" }, label(i18n.uploadMedia || "Upload media"), input({ type: "file", name: "blob" })), - br(), - button({ type: "submit", class: "comment-submit-btn" }, i18n.voteNewCommentButton || i18n.feedPostComment || "Send") - ) - ), - list.length - ? div( - { class: "comments-list" }, - list.map((c) => { - const author = c?.value?.author || ""; - const ts = c?.value?.timestamp || c?.timestamp; - const absDate = ts ? moment(ts).format("YYYY/MM/DD HH:mm:ss") : ""; - const relDate = ts ? moment(ts).fromNow() : ""; - - const content = c?.value?.content || {}; - const text = content.text || c?.value?.text || ""; - const threadRoot = content.fork || content.root || null; - - return div( - { class: "votations-comment-card" }, - span( - { class: "created-at" }, - span(i18n.createdBy), - author ? userLink(author) : span("(unknown)"), - absDate ? span(" | ") : "", - absDate ? span({ class: "votations-comment-date" }, absDate) : "", - relDate ? span({ class: "votations-comment-date" }, " | ", i18n.sendTime) : "", - relDate && threadRoot - ? a({ href: `/thread/${encodeURIComponent(threadRoot)}#${encodeURIComponent(c.key)}` }, relDate) - : "" - ), - p({ class: "votations-comment-text" }, ...renderUrl(text)) - ); - }) - ) - : p({ class: "votations-no-comments" }, i18n.voteNoCommentsYet || i18n.noComments || "") - ); + return renderSharedCommentsSection({ + action: `/feed/${encodeURIComponent(feedKey)}/comments`, + comments: comments, + returnTo: null + }); }; const renderFeedCard = (feed) => { @@ -163,7 +110,7 @@ const renderFeedCard = (feed) => { div( { class: "card-header activity-card-header" }, span(), - renderContentActions(feed.key, `/feed/${encodeURIComponent(feed.key)}`) + renderContentActions(feed.key, `/feed/${encodeURIComponent(feed.key)}`, { author: authorId, reportTitle: safeText }) ), div( { class: "card-section feed-card-body" }, @@ -189,8 +136,8 @@ const renderFeedCard = (feed) => { const maxVal = Math.max(...entries.map(([, v]) => Number(v))); const dominant = entries.filter(([, v]) => Number(v) === maxVal).map(([k]) => i18n['vote' + k.charAt(0).toUpperCase() + k.slice(1)] || k); return [ - span({ style: 'margin:0 8px;opacity:0.5;' }, '|'), - span({ style: 'font-weight:700;' }, `${i18n.moreVoted || 'More Voted'}: ${dominant.join(' + ')}`) + span({ class: 'feed-vote-sep' }, '|'), + span({ class: 'feed-vote-dominant' }, `${i18n.moreVoted || 'More Voted'}: ${dominant.join(' + ')}`) ]; })() ), @@ -202,25 +149,9 @@ const renderFeedCard = (feed) => { ) ) ), - div( - { class: "card-comments-summary" }, - span({ class: "card-label" }, `${i18n.voteCommentsLabel || "Comments"}:`), - span({ class: "card-value" }, String(commentCount)), - br(), - br(), - form( - { method: "GET", action: `/feed/${encodeURIComponent(feed.key)}` }, - button({ type: "submit", class: "filter-btn" }, i18n.voteCommentsForumButton || i18n.feedOpenDiscussion || "Open Discussion") - ) - ), - div( - { class: "card-comments-summary feed-opinions-section" }, - div( - { class: "comments-count" }, - span({ class: "card-label" }, (i18n.opinionsTitle || "Opinions") + ": "), - span({ class: "card-value" }, String(totalCount)) - ), - renderOpinionsVoting('/feed/opinions', feed.key, content.opinions, null, content.opinions_inhabitants) + renderEngagement(feed.key, + renderOpinionsVoting('/feed/opinions', feed.key, content.opinions, null, content.opinions_inhabitants), + renderCommentsLink({ href: `/feed/${encodeURIComponent(feed.key)}`, count: commentCount }) ) ) ); @@ -264,11 +195,13 @@ exports.feedView = (feeds, opts = "ALL") => { div( { class: "feed-tools-row" }, form( - { method: "GET", action: "/feed", class: "feed-search-form" }, + { method: "GET", action: "/feed", class: "filter-box" }, input({ type: "hidden", name: "filter", value: filter }), tag ? input({ type: "hidden", name: "tag", value: tag }) : null, - input({ type: "text", name: "q", value: q, placeholder: i18n.searchPlaceholder || "Search", class: "feed-search-input" }), - button({ type: "submit", class: "filter-btn feed-search-btn" }, i18n.searchButton || "Search") + input({ type: "text", name: "q", value: q, placeholder: i18n.searchPlaceholder || "Search", class: "filter-box__input" }), + div({ class: "filter-box__controls" }, + button({ type: "submit", class: "filter-box__button" }, i18n.searchButton || "Search") + ) ) ), section( @@ -321,7 +254,7 @@ exports.feedCreateView = (opts = {}) => { ); }; -exports.singleFeedView = (feed, comments = []) => { +exports.singleFeedView = (feed, comments = [], params = {}) => { const content = feed.value?.content || {}; const rawText = typeof content.text === "string" ? content.text : ""; const safeText = rawText.trim(); @@ -335,6 +268,7 @@ exports.singleFeedView = (feed, comments = []) => { return template( i18n.feedDetailTitle || "Feed", + section(div({ class: "tags-header" }, h2(i18n.feedTitle), p(i18n.FeedshareYourOpinions))), section( div( { class: "filters" }, @@ -349,6 +283,10 @@ exports.singleFeedView = (feed, comments = []) => { ), div( { class: "bookmark-item card feed-detail-card" }, + div({ class: "card-header activity-card-header" }, + span(), + renderContentActions(feed.key, null, { spread: params.spreads || null, author: authorId, reportTitle: safeText }) + ), br, div( { class: "feed-row" }, @@ -380,15 +318,9 @@ exports.singleFeedView = (feed, comments = []) => { ) ) ), - renderFeedCommentsSection(feed.key, comments), - div( - { class: "card-comments-summary feed-opinions-section" }, - div( - { class: "comments-count" }, - span({ class: "card-label" }, (i18n.opinionsTitle || "Opinions") + ": "), - span({ class: "card-value" }, String(Object.values(content.opinions || {}).reduce((s, n) => s + (Number(n) || 0), 0))) - ), - renderOpinionsVoting('/feed/opinions', feed.key, content.opinions, null, content.opinions_inhabitants) + renderEngagement(feed.key, + renderOpinionsVoting('/feed/opinions', feed.key, content.opinions, null, content.opinions_inhabitants), + renderFeedCommentsSection(feed.key, comments) ) ) ); diff --git a/src/views/gallery_view.js b/src/views/gallery_view.js new file mode 100644 index 0000000..3f9663e --- /dev/null +++ b/src/views/gallery_view.js @@ -0,0 +1,118 @@ +const { div, a, span, img, video, input, button, label, br } = require("../server/node_modules/hyperaxe") +const { i18n } = require("./main_views") +const { MAX_IMAGES } = require("../models/media_gallery") + +const safeArr = (v) => (Array.isArray(v) ? v : []) +const safeText = (v) => String(v == null ? "" : v).trim() + +const blobIdOf = (entry) => { + const value = safeText(entry) + const m = value.match(/\(([^)\s]+)\)/) + return m ? m[1] : value +} + +const blobUrl = (id, size) => size + ? `/image/${size}/${encodeURIComponent(id)}` + : `/blob/${encodeURIComponent(id)}` + +const isVideoEntry = (entry) => /\[video:[^\]]*\]\(/.test(String(entry || "")) + +const imagesOf = (item) => { + const list = safeArr(item && item.images).filter(Boolean) + if (list.length) return list + return item && item.image ? [item.image] : [] +} + +const videoOf = (item) => safeText(item && item.video) + +const renderMediaThumb = (entry, alt = "") => isVideoEntry(entry) + ? video({ controls: true, class: "gallery-image", src: blobUrl(blobIdOf(entry)) }) + : img({ src: blobUrl(blobIdOf(entry), 256), class: "gallery-image", alt }) + +const lightboxId = (scope, itemId, index) => `${scope}-photo-${encodeURIComponent(itemId)}-${index}` + +let zoomSeq = 0 +const renderZoomableImage = (src, { alt = "", imgClass = "" } = {}) => { + if (!src) return null + zoomSeq = (zoomSeq + 1) % 1000000 + const id = `zoom-${zoomSeq}-${String(src).replace(/[^a-zA-Z0-9]/g, "").slice(-10)}` + return [ + a({ href: `#${id}`, class: "zoom-link" }, img({ src, class: imgClass, alt })), + div({ id, class: "lightbox" }, + a({ href: "#", class: "lightbox-close" }, "×"), + img({ src, class: "lightbox-image", alt }) + ) + ] +} + +const renderPhotoGallery = (item, scope = "media") => { + const list = imagesOf(item) + const clip = videoOf(item) + if (!list.length && !clip) return null + const id = (item && (item.id || item.key || item.rootId)) || "" + return div({ class: "media-gallery" }, + list.length + ? div({ class: "gallery" }, + list.map((entry, i) => + isVideoEntry(entry) + ? span({ class: "gallery-item" }, renderMediaThumb(entry)) + : a({ href: `#${lightboxId(scope, id, i)}`, class: "gallery-item" }, renderMediaThumb(entry)) + ) + ) + : null, + list.filter(entry => !isVideoEntry(entry)).map((entry) => + div({ id: lightboxId(scope, id, list.indexOf(entry)), class: "lightbox" }, + a({ href: "#", class: "lightbox-close" }, "×"), + img({ src: blobUrl(blobIdOf(entry)), class: "lightbox-image", alt: "" }) + ) + ), + clip + ? div({ class: "media-video media-video-centered" }, + video({ controls: true, class: "media-video-player", src: blobUrl(blobIdOf(clip)) }) + ) + : null + ) +} + +const renderGalleryFields = (item = {}, isEdit = false, maxImages = MAX_IMAGES) => { + const list = imagesOf(item) + return [ + label(i18n.galleryImages), + br(), + ...list.map(entry => input({ type: "hidden", name: "keepImages", value: entry })), + list.length < maxImages + ? div({ class: "media-file-row" }, + input({ type: "file", name: "images", accept: "image/*", multiple: true }), + button({ type: "submit", name: "action", value: "addPhoto", attrs: { formnovalidate: "formnovalidate" }, class: "filter-btn media-add-btn" }, i18n.galleryAddPhoto) + ) + : null, + br(), + list.length + ? [ + div({ class: "gallery media-form-gallery" }, + list.map((entry, i) => + span({ class: "gallery-item" }, + renderMediaThumb(entry), + button({ type: "submit", name: "removePhoto", value: String(i), attrs: { formnovalidate: "formnovalidate" }, class: "media-remove-btn" }, i18n.galleryRemovePhoto) + ) + ) + ), + br() + ] + : null, + br() + ] +} + +module.exports = { + MAX_IMAGES, + blobIdOf, + blobUrl, + isVideoEntry, + imagesOf, + videoOf, + renderMediaThumb, + renderPhotoGallery, + renderGalleryFields, + renderZoomableImage +} diff --git a/src/views/games_view.js b/src/views/games_view.js index 5619f82..e4c6135 100644 --- a/src/views/games_view.js +++ b/src/views/games_view.js @@ -99,13 +99,13 @@ exports.gamesView = (filter = 'all', hall = null) => { form({ method: 'GET', action: '/games' }, input({ type: 'hidden', name: 'filter', value: 'all' }), button({ type: 'submit', class: filter === 'all' ? 'filter-btn active' : 'filter-btn' }, - i18n.gamesFilterAll + String(i18n.gamesFilterAll).toUpperCase() ) ), form({ method: 'GET', action: '/games' }, input({ type: 'hidden', name: 'filter', value: 'scoring' }), button({ type: 'submit', class: filter === 'scoring' ? 'filter-btn active' : 'filter-btn' }, - i18n.gamesFilterScoring + String(i18n.gamesFilterScoring).toUpperCase() ) ) ); diff --git a/src/views/graphos_view.js b/src/views/graphos_view.js index ea2332e..0a3ba2b 100644 --- a/src/views/graphos_view.js +++ b/src/views/graphos_view.js @@ -88,9 +88,9 @@ const buildGraphSvg = (me, peers) => { + ``; }; -const kpi = (label, value) => div({ class: 'stats-kpi' }, - div({ class: 'stats-kpi-label' }, label), - div({ class: 'stats-kpi-value' }, String(value)) +const kpi = (label, value) => div({ class: 'stats-kpi stats-kpi-inline' }, + span({ class: 'stats-kpi-label' }, `${String(label).toUpperCase()}: `), + span({ class: 'stats-kpi-value' }, String(value)) ); const legendItem = (kind, label) => @@ -126,27 +126,27 @@ exports.graphosView = ({ filter, me, peers, kpis, focus = null, focusId = null, modes.map(m => form({ method: 'GET', action: '/graphos' }, input({ type: 'hidden', name: 'filter', value: m }), - button({ type: 'submit', class: filter === m ? 'filter-btn active' : 'filter-btn' }, i18n[m + 'Button']) + button({ type: 'submit', class: filter === m ? 'filter-btn active' : 'filter-btn' }, String(i18n[m + 'Button']).toUpperCase()) ) ) ), capped ? p({ class: 'graphos-cap-note' }, `${i18n.graphosShowing || 'Showing'} ${shown} / ${total}`) : null, - div({ class: 'graphos-legend' }, - legendItem('me', i18n.graphosYou || 'You'), - legendItem('online', i18n.online || 'Online'), - filter !== 'MINE' ? legendItem('discovered', i18n.discovered || 'Discovered') : null, - filter !== 'MINE' ? legendItem('unknown', i18n.unknown || 'Unknown') : null - ), - div({ class: 'graphos-canvas', innerHTML: buildGraphSvg(me, peers) }), - div({ class: 'stats-block' }, + div({ class: 'stats-block graphos-stats' }, div({ class: 'stats-grid' }, kpi(i18n.graphosTotalNodes || 'Total nodes', kpis.total), kpi(i18n.online || 'Online', kpis.online), filter !== 'MINE' ? kpi(i18n.discovered || 'Discovered', kpis.discovered) : null, filter !== 'MINE' ? kpi(i18n.unknown || 'Unknown', kpis.unknown) : null ) + ), + div({ class: 'graphos-canvas', innerHTML: buildGraphSvg(me, peers) }), + div({ class: 'graphos-legend' }, + legendItem('me', i18n.graphosYou || 'You'), + legendItem('online', i18n.online || 'Online'), + filter !== 'MINE' ? legendItem('discovered', i18n.discovered || 'Discovered') : null, + filter !== 'MINE' ? legendItem('unknown', i18n.unknown || 'Unknown') : null ) ) ); diff --git a/src/views/inhabitants_view.js b/src/views/inhabitants_view.js index 58f0ba0..fa7b2c9 100644 --- a/src/views/inhabitants_view.js +++ b/src/views/inhabitants_view.js @@ -1,5 +1,6 @@ -const { div, h2, p, section, button, form, img, a, textarea, input, br, span, strong } = require("../server/node_modules/hyperaxe"); -const { template, i18n, userLink, renderUserSensors, renderContentActions } = require('./main_views'); +const { div, h2, p, section, button, form, img, a, textarea, input, span, strong } = require("../server/node_modules/hyperaxe"); +const { template, i18n, userLink, renderUserSensors, renderContentActions, renderRelationshipBlock } = require('./main_views'); +const { renderZoomableImage } = require('./gallery_view'); const { renderContentStats } = require('./clearnet_view'); const { renderUrl } = require('../backend/renderUrl'); const { getConfig } = require('../configs/config-manager'); @@ -48,20 +49,40 @@ function resolvePhoto(photoField, size = 256) { if (photoField.startsWith('/blob/')) return photoField; if (photoField.startsWith('/image/')) { if (isDefaultImageId(photoField)) return '/assets/images/default-avatar.png'; - return photoField.replace('/image/256/','/image/'+size+'/').replace('/image/512/','/image/'+size+'/'); + return photoField.replace('/image/256/','/image/'+size+'/').replace('/image/512/','/image/'+size+'/') + '?fallback=avatar'; } } - return toImageUrl(photoField, size); + return toImageUrl(photoField, size) + '?fallback=avatar'; } -const generateFilterButtons = (filters, currentFilter) => +const filterLabel = (mode) => + String(i18n[mode + 'Button'] || i18n[mode + 'SectionTitle'] || mode).toUpperCase(); + +const generateFilterButtons = (filters, currentFilter, labelOf = filterLabel) => filters.map(mode => form({ method: 'GET', action: '/inhabitants' }, input({ type: 'hidden', name: 'filter', value: mode }), button({ type: 'submit', class: currentFilter === mode ? 'filter-btn active' : 'filter-btn' - }, i18n[mode + 'Button'] || i18n[mode + 'SectionTitle'] || mode) + }, labelOf(mode)) + ) + ); + +const MAIN_FILTERS = ['all', 'TOP', 'contacts', 'blocked', 'CVs', 'SUGGESTED', 'GALLERY']; + +const renderMainFilters = (filter, isTop) => + div({ class: 'inhabitant-action' }, + ...MAIN_FILTERS.map(mode => + form({ method: 'GET', action: '/inhabitants' }, + input({ type: 'hidden', name: 'filter', value: mode === 'TOP' ? 'TOP ACTIVITY' : mode }), + button({ + type: 'submit', + class: (mode === 'TOP' ? isTop : filter === mode) ? 'filter-btn active' : 'filter-btn' + }, mode === 'TOP' + ? String(i18n.topSectionTitle || 'TOP').toUpperCase() + : filterLabel(mode)) + ) ) ); @@ -89,6 +110,27 @@ function lastActivityBadge(user, isMe) { const lightboxId = (id) => 'inhabitant_' + String(id || 'unknown').replace(/[^a-zA-Z0-9_-]/g, '_'); +const cvField = (labelText, value) => value + ? div({ class: 'card-field' }, + span({ class: 'card-label' }, `${labelText}: `), + span({ class: 'card-value' }, value) + ) + : null; + +const renderCvFields = (user) => { + const languages = Array.isArray(user.languages) ? user.languages.filter(Boolean) : []; + const skills = Array.isArray(user.skills) ? user.skills.filter(Boolean) : []; + const fields = [ + cvField(i18n.locationLabel, user.location), + cvField(i18n.languagesLabel, languages.length ? languages.join(', ').toUpperCase() : ''), + cvField(i18n.skillsLabel, skills.length ? skills.join(', ') : ''), + cvField(i18n.statusLabel || 'Status', user.status), + cvField(i18n.preferencesLabel || 'Preferences', user.preferences), + cvField(i18n.createdAtLabel || 'Created at', user.createdAt ? new Date(user.createdAt).toLocaleString() : '') + ].filter(Boolean); + return fields.length ? div({ class: 'cv-card-fields' }, ...fields) : null; +}; + const renderInhabitantCard = (user, filter, currentUserId, fediverseConfigured) => { const isMe = user.id === currentUserId; const raw = user.visibilityPrefs || {}; @@ -102,7 +144,7 @@ const renderInhabitantCard = (user, filter, currentUserId, fediverseConfigured) wallet: raw.wallet === true, ecoTax: raw.ecoTax !== false, larpSign: raw.larpSign === true, - gpg: raw.gpg !== false, + gpg: raw.gpg === true, clearnet: hasClearnet, fediverse: raw.fediverse === true, fediverseHandle: typeof raw.fediverseHandle === 'string' ? raw.fediverseHandle : '' @@ -111,7 +153,7 @@ const renderInhabitantCard = (user, filter, currentUserId, fediverseConfigured) div( { class: 'card-header activity-card-header' }, span(), - renderContentActions(user.id, `/inhabitant/${encodeURIComponent(user.id)}`) + renderContentActions(user.id, `/inhabitant/${encodeURIComponent(user.id)}`, { author: user.id }) ), div({ class: 'card-section inhabitants-card-body' }, div({ class: 'inhabitant-card' }, @@ -128,26 +170,30 @@ const renderInhabitantCard = (user, filter, currentUserId, fediverseConfigured) estimatedUBI: user.estimatedUBI, lastClaimedDate: user.lastClaimedDate, totalClaimed: user.totalClaimed, larpHouse: user.larpHouse, stats: user.stats }, { relationshipNode: isMe ? span({ class: 'status you' }, i18n.relationshipYou) : null, excludeContent: true }), + filter === 'CVs' + ? div( + { class: 'cv-actions doc-export-actions' }, + form( + { method: 'GET', action: `/cv/pdf/${encodeURIComponent(user.id)}` }, + button({ type: 'submit', class: 'filter-btn' }, i18n.generatePdf) + ), + form( + { method: 'POST', action: `/cv/share/${encodeURIComponent(user.id)}` }, + button({ type: 'submit', class: 'filter-btn' }, i18n.sharePm) + ) + ) + : null, !isMe ? div( - { class: 'cv-actions' }, - form( - { method: 'GET', action: '/pm' }, - input({ type: 'hidden', name: 'recipients', value: user.id }), - button({ type: 'submit', class: 'btn' }, i18n.pmCreateButton) - ) + { class: 'inhabitant-user-actions' }, + div({ class: 'inhabitant-relationship' }, renderRelationshipBlock(user.relationship || {}, user.id)) ) : null ), div({ class: 'inhabitant-details' }, h2(user.name || 'Anonymous'), user.description ? p(...renderUrl(user.description)) : null, - filter === 'MATCHSKILLS' && user.commonSkills?.length - ? div({ class: 'matchskills' }, - p(`${i18n.commonSkills}: ${user.commonSkills.join(', ')}`), - p(`${i18n.matchScore}: ${Math.round((user.matchScore || 0) * 100)}%`) - ) - : null, + filter === 'CVs' ? renderCvFields(user) : null, filter === 'SUGGESTED' && (user.followsYou || user.commonSkills?.length || user.mutualCount) ? div({ class: 'suggested-meta' }, user.followsYou ? span({ class: 'suggested-badge' }, i18n.suggestedFollowsYou || 'Follows you') : null, @@ -160,31 +206,6 @@ const renderInhabitantCard = (user, filter, currentUserId, fediverseConfigured) filter === 'blocked' && user.isBlocked ? p(i18n.blockedLabel) : null, p(userLink(user.id)), - !isMe ? (() => { - const rel = user.relationship || {} - const blockedBoth = rel.blocking && rel.blockedBy - const mutual = rel.following && rel.followsMe - const supportAction = rel.following ? 'unfollow' : (rel.blocking ? 'unblock' : 'follow') - return div({ class: 'relationship-status inhabitant-relationship' }, - blockedBoth - ? span({ class: 'status blocked' }, i18n.relationshipMutualBlock) - : [ - rel.blocking ? span({ class: 'status blocked' }, i18n.relationshipBlocking) : null, - rel.blockedBy ? span({ class: 'status blocked-by' }, i18n.relationshipBlockedBy) : null, - mutual - ? span({ class: 'status mutual' }, i18n.relationshipMutuals) - : [ - span({ class: 'status supporting' }, rel.following ? i18n.relationshipFollowing : i18n.relationshipNone), - span({ class: 'status supported-by' }, rel.followsMe ? i18n.relationshipTheyFollow : i18n.relationshipNotFollowing) - ] - ], - div({ class: 'relationship-actions' }, - form({ method: 'POST', action: `/${supportAction}/${encodeURIComponent(user.id)}` }, - button({ type: 'submit', class: 'btn' }, i18n[supportAction]) - ) - ) - ) - })() : null, renderContentStats(user.stats, i18n) ) ) @@ -229,19 +250,11 @@ function msgIdOf(m) { } exports.inhabitantsView = (inhabitants, filter, query, currentUserId, fediverseConfigured) => { - const title = filter === 'contacts' ? i18n.yourContacts - : filter === 'CVs' ? i18n.allCVs - : filter === 'MATCHSKILLS' ? i18n.matchSkills - : filter === 'SUGGESTED' ? i18n.suggestedSectionTitle - : filter === 'blocked' ? i18n.blockedSectionTitle - : filter === 'GALLERY' ? i18n.gallerySectionTitle - : filter === 'TOP KARMA' ? i18n.topkarmaSectionTitle - : filter === 'TOP ECO' ? (i18n.topecoSectionTitle || 'Top Eco') - : filter === 'TOP ACTIVITY' ? i18n.topactivitySectionTitle - : i18n.allInhabitants; + const title = i18n.allInhabitants; - const showCVFilters = filter === 'CVs' || filter === 'MATCHSKILLS'; - const filters = ['all', 'TOP ACTIVITY', 'TOP KARMA', 'TOP ECO', 'contacts', 'SUGGESTED', 'blocked', 'CVs', 'MATCHSKILLS', 'GALLERY']; + const showCVFilters = filter === 'CVs'; + const TOP_FILTERS = ['TOP ACTIVITY', 'TOP INACTIVITY', 'TOP KARMA', 'TOP ECO']; + const isTop = TOP_FILTERS.includes(filter); return template( title, @@ -251,28 +264,33 @@ exports.inhabitantsView = (inhabitants, filter, query, currentUserId, fediverseC p(i18n.discoverPeople) ), div({ class: 'filters' }, - form({ method: 'GET', action: '/inhabitants' }, + form({ method: 'GET', action: '/inhabitants', class: 'filter-box' }, input({ type: 'hidden', name: 'filter', value: filter }), input({ type: 'text', name: 'search', placeholder: i18n.searchInhabitantsPlaceholder, - value: (query && query.search) || '' + value: (query && query.search) || '', + class: 'filter-box__input' }), - showCVFilters - ? [ - input({ type: 'text', name: 'location', placeholder: i18n.filterLocation, value: (query && query.location) || '' }), - input({ type: 'text', name: 'language', placeholder: i18n.filterLanguage, value: (query && query.language) || '' }), - input({ type: 'text', name: 'skills', placeholder: i18n.filterSkills, value: (query && query.skills) || '' }) - ] - : null, - br(), - button({ type: 'submit' }, i18n.applyFilters) + div({ class: 'filter-box__controls' }, + showCVFilters + ? [ + input({ type: 'text', name: 'location', placeholder: i18n.filterLocation, value: (query && query.location) || '', class: 'filter-box__number' }), + input({ type: 'text', name: 'language', placeholder: i18n.filterLanguage, value: (query && query.language) || '', class: 'filter-box__number' }), + input({ type: 'text', name: 'skills', placeholder: i18n.filterSkills, value: (query && query.skills) || '', class: 'filter-box__number' }) + ] + : null, + button({ type: 'submit', class: 'filter-box__button' }, i18n.searchButton) + ) ) ), - div({ class: 'inhabitant-action' }, - ...generateFilterButtons(filters, filter) - ), + renderMainFilters(filter, isTop), + isTop + ? div({ class: 'inhabitant-action inhabitant-subfilters' }, + ...generateFilterButtons(TOP_FILTERS, filter, (mode) => filterLabel(mode).replace(/^TOP\s+/, '')) + ) + : null, filter === 'GALLERY' ? renderGalleryInhabitants(inhabitants) : div({ class: 'inhabitants-list' }, @@ -338,7 +356,7 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = wallet: rawPrefs.wallet === true, ecoTax: rawPrefs.ecoTax !== false, larpSign: rawPrefs.larpSign === true, - gpg: rawPrefs.gpg !== false, + gpg: rawPrefs.gpg === true, clearnet: rawPrefs.clearnet === true || clearnetSubKeys.some(k => rawPrefs[k] === true), fediverse: rawPrefs.fediverse === true, fediverseHandle: typeof rawPrefs.fediverseHandle === 'string' ? rawPrefs.fediverseHandle : '' @@ -350,14 +368,18 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = const providedBucket = typeof safe.lastActivityBucket === 'string' ? safe.lastActivityBucket : null; const dotClass = providedBucket === 'green' ? 'green' : providedBucket === 'orange' ? 'orange' : 'red'; + const fieldNodes = [ + cvField(i18n.locationLabel, location), + cvField(i18n.languagesLabel, languages.length ? languages.join(', ').toUpperCase() : ''), + cvField(i18n.skillsLabel, skills.length ? skills.join(', ') : ''), + cvField(i18n.statusLabel || 'Status', status), + cvField(i18n.preferencesLabel || 'Preferences', preferences), + cvField(i18n.createdAtLabel || 'Created at', createdAt) + ].filter(Boolean); + const detailNodes = [ description ? p(...renderUrl(description)) : null, - location ? p(`${i18n.locationLabel}: ${location}`) : null, - languages.length ? p(`${i18n.languagesLabel}: ${languages.join(', ').toUpperCase()}`) : null, - skills.length ? p(`${i18n.skillsLabel}: ${skills.join(', ')}`) : null, - status ? p(`${i18n.statusLabel || 'Status'}: ${status}`) : null, - preferences ? p(`${i18n.preferencesLabel || 'Preferences'}: ${preferences}`) : null, - createdAt ? p(`${i18n.createdAtLabel || 'Created at'}: ${createdAt}`) : null + fieldNodes.length ? div({ class: 'cv-card-fields' }, ...fieldNodes) : null ].filter(Boolean); return template( @@ -367,9 +389,7 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = h2(title), p(i18n.discoverPeople) ), - div({ class: 'mode-buttons' }, - ...generateFilterButtons(['all', 'TOP ACTIVITY', 'TOP KARMA', 'TOP ECO', 'contacts', 'SUGGESTED', 'blocked', 'CVs', 'MATCHSKILLS', 'GALLERY'], 'all') - ), + renderMainFilters('all', false), div({ class: 'inhabitant-card' }, div({ class: 'inhabitant-left' }, img({ class: 'inhabitant-photo-details', src: image, alt: name || 'Anonymous' }), @@ -382,11 +402,16 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = larpHouse, stats: safe.stats }, { excludeContent: true }), (!isMe && (id || viewedId)) - ? form( - { method: 'GET', action: '/pm' }, - input({ type: 'hidden', name: 'recipients', value: id || viewedId }), - button({ type: 'submit', class: 'btn' }, i18n.pmCreateButton) + ? div({ class: 'cv-actions doc-export-actions' }, + form( + { method: 'GET', action: '/pm' }, + input({ type: 'hidden', name: 'recipients', value: id || viewedId }), + button({ type: 'submit', class: 'filter-btn' }, i18n.pmCreateButton) + ) ) + : null, + (!isMe && (id || viewedId) && safe.relationship) + ? div({ class: 'inhabitant-relationship' }, renderRelationshipBlock(safe.relationship, id || viewedId)) : null ), (() => { @@ -405,7 +430,7 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = return div({ class: 'post' }, visitBtn, parts.clean && parts.clean.trim() ? p(...renderUrl(parts.clean)) : null, - ...(parts.imgs || []).map(src => img({ src, class: 'post-image', alt: 'image' })) + ...(parts.imgs || []).map(src => renderZoomableImage(src, { imgClass: 'post-image', alt: 'image' })) ); }) ) ] @@ -420,3 +445,4 @@ exports.inhabitantsProfileView = (payload, currentUserId, fediverseConfigured) = }; exports.lastActivityBadge = lastActivityBadge; +exports.resolvePhoto = resolvePhoto; diff --git a/src/views/invites_view.js b/src/views/invites_view.js index f58703a..15a2dcf 100644 --- a/src/views/invites_view.js +++ b/src/views/invites_view.js @@ -107,6 +107,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'pubs-section' }, h2(i18n.invitesPubsTitle), + p(i18n.invitesPubsHint), form( { action: '/settings/invite/accept', method: 'post' }, input({ name: 'invite', type: 'text', placeholder: i18n.invitesPubInviteCodePlaceholder, autofocus: true, required: true }), @@ -129,6 +130,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'federations-section' }, h2(i18n.invitesFederationsTitle || 'Federations'), + p(i18n.invitesFederationsHint), div({ class: 'conn-actions invites-pubs-actions' }, form({ action: '/invites/refresh-pubs', method: 'post' }, button({ type: 'submit' }, i18n.invitesPubsRefresh || 'Refresh')), form({ action: '/invites/clear-unreachable', method: 'post' }, button({ type: 'submit' }, i18n.invitesPubsClearUnreachable || 'Remove unreachable')), @@ -180,6 +182,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-houses', id: 'invites-houses' }, h2(i18n.invitesHousesTitle || 'Houses'), + p(i18n.invitesHousesHint), form( { action: '/larp/invite/redeem', method: 'post' }, input({ type: 'hidden', name: 'returnTo', value: '/invites' }), @@ -192,6 +195,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-tribes', id: 'invites-tribes' }, h2(i18n.invitesTribesTitle), + p(i18n.invitesTribesHint), form( { action: '/tribes/join-code', method: 'post' }, input({ name: 'inviteCode', type: 'text', placeholder: i18n.invitesTribeInviteCodePlaceholder, required: true }), @@ -203,6 +207,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-chats', id: 'invites-chats' }, h2(i18n.invitesChatsTitle || 'Chats'), + p(i18n.invitesChatsHint), form( { action: '/chats/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesChatInviteCodePlaceholder || 'Enter chat invite code', required: true }), @@ -214,6 +219,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-pads', id: 'invites-pads' }, h2(i18n.invitesPadsTitle || 'Pads'), + p(i18n.invitesPadsHint), form( { action: '/pads/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesPadInviteCodePlaceholder || 'Enter pad invite code', required: true }), @@ -225,6 +231,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-calendars', id: 'invites-calendars' }, h2(i18n.invitesCalendarsTitle || 'Calendars'), + p(i18n.invitesCalendarsHint), form( { action: '/calendars/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesCalendarInviteCodePlaceholder || 'Enter calendar invite code', required: true }), @@ -236,6 +243,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-events', id: 'invites-events' }, h2(i18n.invitesEventsTitle || 'Events'), + p(i18n.invitesEventsHint), form( { action: '/events/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesEventInviteCodePlaceholder || 'Enter event invite code', required: true }), @@ -247,6 +255,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-forums', id: 'invites-forums' }, h2(i18n.invitesForumsTitle || 'Forums'), + p(i18n.invitesForumsHint), form( { action: '/forum/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesForumInviteCodePlaceholder || 'Enter forum invite code', required: true }), @@ -258,6 +267,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-maps', id: 'invites-maps' }, h2(i18n.invitesMapsTitle || 'Maps'), + p(i18n.invitesMapsHint), form( { action: '/maps/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesMapInviteCodePlaceholder || 'Enter map invite code', required: true }), @@ -269,6 +279,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-shops', id: 'invites-shops' }, h2(i18n.invitesShopsTitle || 'Shops'), + p(i18n.invitesShopsHint), form( { action: '/shops/join-code', method: 'post' }, input({ name: 'code', type: 'text', placeholder: i18n.invitesShopInviteCodePlaceholder || 'Enter shop invite code', required: true }), @@ -280,6 +291,7 @@ const invitesView = ({ invitesEnabled, flash }) => { section( div({ class: 'invites-inhabitants', id: 'invites-inhabitants' }, h2(i18n.invitesInhabitantsTitle || 'Inhabitants'), + p(i18n.invitesInhabitantsHint), form( { action: '/invites/inhabitant/follow', method: 'post' }, input({ name: 'feedId', id: 'inh_oasis_id', type: 'text', placeholder: '@...=.ed25519', pattern: '@[A-Za-z0-9+/_\\-]{43}=\\.ed25519', required: true, maxlength: 56 }), diff --git a/src/views/larp_view.js b/src/views/larp_view.js index b9de0b5..970ae31 100644 --- a/src/views/larp_view.js +++ b/src/views/larp_view.js @@ -1,5 +1,8 @@ -const { div, h1, h2, h3, p, section, button, form, input, span, img, a, br, table, tr, td, textarea, label, strong } = require("../server/node_modules/hyperaxe"); +const { div, h1, h2, h3, p, section, button, form, input, span, img, a, br, table, tr, td, textarea, label, strong, details, summary } = require("../server/node_modules/hyperaxe"); const { template, i18n, userLink } = require("./main_views"); +const { config } = require("../server/SSB_server.js"); + +const userId = config.keys.id; const moment = require("../server/node_modules/moment"); const fmtCycle = (c) => c && c.formatted ? c.formatted : ''; @@ -11,16 +14,24 @@ const renderCycleBanner = (cycle) => div({ class: 'larp-cycle-banner' }, span({ class: 'larp-cycle-value' }, fmtCycle(cycle)) ); -const renderHouseBadges = ({ myHouse, governingHouse }) => div({ class: 'larp-house-badges' }, - myHouse ? div({ class: 'larp-my-house' }, - span({ class: 'larp-my-house-label' }, i18n.larpMyHouse || 'My House'), - a({ href: `/larp/${myHouse.key}`, class: 'larp-my-house-link' }, myHouse.name) - ) : null, - governingHouse ? div({ class: 'larp-my-house' }, - span({ class: 'larp-my-house-label' }, i18n.larpGoverning || 'Governing'), - a({ href: `/larp/${governingHouse.key}`, class: 'larp-my-house-link' }, governingHouse.name) - ) : null -); +const renderHouseBadges = ({ myHouse, governingHouse, houses }) => { + const academia = Array.isArray(houses) ? houses.find(h => h.key === 'academia') : null; + const isNewcomer = !myHouse; + return div({ class: 'larp-house-badges' }, + myHouse ? div({ class: 'larp-my-house' }, + span({ class: 'larp-my-house-label' }, i18n.larpMyHouse || 'My House'), + a({ href: `/larp/${myHouse.key}`, class: 'larp-my-house-link' }, myHouse.name) + ) : null, + governingHouse ? div({ class: 'larp-my-house' }, + span({ class: 'larp-my-house-label' }, i18n.larpGoverning || 'Ruling:'), + a({ href: `/larp/${governingHouse.key}`, class: 'larp-my-house-link' }, governingHouse.name) + ) : null, + isNewcomer && academia ? div({ class: 'larp-my-house larp-academia-hint' }, + span({ class: 'larp-my-house-label' }, i18n.larpStartHere), + a({ href: `/larp/${academia.key}`, class: 'larp-my-house-link' }, academia.name) + ) : null + ); +}; const renderHouseNav = (houses, currentKey) => div({ class: 'larp-house-nav' }, span({ class: 'larp-house-nav-label' }, i18n.larpAllHouses || 'Houses:'), @@ -31,7 +42,7 @@ const renderHouseNav = (houses, currentKey) => div({ class: 'larp-house-nav' }, }, h.name)) ); -const renderHousePanel = (house, members, posts, { canPost, viewerHouseKey, cyclesUntilRuling }) => { +const renderHousePanel = (house, members, posts, { canPost, viewerHouseKey, cyclesUntilRuling, canTakeTest = false }) => { const { renderEncryptedChip } = require('./clearnet_view'); const isInHouse = viewerHouseKey === house.key; const isInLarp = viewerHouseKey !== null && viewerHouseKey !== undefined; @@ -66,6 +77,9 @@ const renderHousePanel = (house, members, posts, { canPost, viewerHouseKey, cycl ), p({ class: 'larp-detail-description' }, house.description), div({ class: 'larp-actions' }, + isAcademia && isInHouse && canTakeTest + ? a({ href: '/larp/test', class: 'filter-btn larp-start-journey' }, i18n.larpStartJourney) + : null, isInHouse ? a({ href: `/larp/tribe/${encodeURIComponent(house.key)}`, class: 'filter-btn' }, i18n.larpVisitTribe || 'Visit Tribe') : null, @@ -162,54 +176,63 @@ const renderAcademiaJoinPanel = (allHouses, testStatus, housesById, questions, m div({ class: 'larp-academia-grid' }, ordered.map(h => a({ href: `/larp/${h.key}`, class: h.key === myKey ? 'larp-academia-thumb larp-academia-thumb-mine' : 'larp-academia-thumb' }, img({ src: houseImageSrc(h), alt: h.name, class: 'larp-academia-thumb-image' }), - span({ class: 'larp-academia-thumb-name' }, h.name) + span({ class: 'larp-academia-thumb-name' }, h.name), + table({ class: 'larp-info-table larp-academia-thumb-table' }, + tr(td({ class: 'card-label' }, i18n.larpRolesLabel || 'Roles'), td({ class: 'card-value' }, h.roles)), + tr(td({ class: 'card-label' }, i18n.larpFunctionLabel || 'Function'), td({ class: 'card-value' }, h.function)), + tr(td({ class: 'card-label' }, i18n.larpMembersCount || 'Members'), td({ class: 'card-value' }, String(h.memberCount || 0))) + ) )) ), - canTake && qs.length - ? [ - h2(i18n.larpWillTestTitle || 'WILL test'), - p({ class: 'larp-will-test-hint' }, i18n.larpWillTestHint || 'Once completed, you will be assigned the house that best matches your answers. Your individual answers are processed locally and never stored — only the resulting house assignment is published to your feed.'), - form({ method: 'POST', action: '/larp/test', class: 'larp-test-form larp-test-form-compact' }, - qs.map((q, idx) => div({ class: 'larp-test-question' }, - p({ class: 'larp-test-q-text' }, strong(`${idx + 1}. `), i18n[q.key] || q.question), - div({ class: 'larp-test-options' }, - q.options.map((opt, oi) => label({ class: 'larp-test-option' }, - input({ type: 'radio', name: `q${idx}`, value: String(oi), required: 'required' }), - ' ', i18n[opt.key] || opt.text - )) - ) - )), - div({ class: 'larp-actions' }, - button({ type: 'submit', class: 'filter-btn' }, i18n.larpTestSubmit || 'Join House') - ) - ) - ] - : null ); }; -const renderPostsBlock = (posts, house, canPost) => div({ class: 'larp-posts-block' }, - h2(i18n.larpPostsTitle || 'Wall'), - canPost - ? form({ method: 'POST', action: '/larp/post', class: 'larp-post-form' }, - input({ type: 'hidden', name: 'house', value: house.key }), - textarea({ id: 'larp_post_text', name: 'text', rows: '3', maxlength: '4000', placeholder: i18n.larpPostPlaceholder || 'What does this house need to say?' }), - button({ type: 'submit', class: 'filter-btn larp-post-submit' }, i18n.larpPostSubmit || 'Publish') - ) - : null, - posts.length === 0 - ? p({ class: 'empty' }, i18n.larpPostsEmpty || 'No posts yet.') - : div({ class: 'larp-posts-list' }, - posts.map(post => div({ class: 'larp-post' }, - div({ class: 'larp-post-head' }, - userLink(post.author), - span({ class: 'larp-post-time' }, moment(post.createdAt).format('YYYY-MM-DD HH:mm')) - ), - p({ class: 'larp-post-text' }, post.text) - )) - ) + +const renderPostsBlock = (posts, house, canPost) => { + const stream = (Array.isArray(posts) ? posts : []) + .map(post => ({ ts: Date.parse(post.createdAt) || post.ts || 0, post })) + .sort((a, b) => b.ts - a.ts); + + return div({ class: 'larp-posts-block' }, + h2(i18n.larpPostsTitle || 'Wall'), + canPost + ? form({ method: 'POST', action: '/larp/post', class: 'larp-post-form' }, + input({ type: 'hidden', name: 'house', value: house.key }), + textarea({ id: 'larp_post_text', name: 'text', rows: '3', maxlength: '4000', placeholder: i18n.larpPostPlaceholder || 'What does this house need to say?' }), + button({ type: 'submit', class: 'filter-btn larp-post-submit' }, i18n.larpPostSubmit || 'Publish') + ) + : null, + stream.length === 0 + ? p({ class: 'empty' }, i18n.larpPostsEmpty || 'No posts yet.') + : div({ class: 'larp-posts-list' }, + stream.map(entry => div({ class: 'larp-post' }, + div({ class: 'larp-post-head' }, + userLink(entry.post.author), + span({ class: 'larp-post-time' }, moment(entry.post.createdAt).format('YYYY/MM/DD HH:mm')) + ), + p({ class: 'larp-post-text' }, entry.post.text) + )) + ) + ); +}; + +const renderHouseSearch = (q) => div({ class: 'filters' }, + form({ method: 'GET', action: '/larp', class: 'filter-box' }, + input({ type: 'hidden', name: 'filter', value: 'houses' }), + input({ type: 'text', name: 'q', value: q || '', placeholder: i18n.larpSearchPlaceholder, class: 'filter-box__input' }), + div({ class: 'filter-box__controls' }, + button({ type: 'submit', class: 'filter-box__button' }, i18n.searchButton) + ) + ) ); +const matchesHouse = (house, q) => { + const needle = String(q || '').trim().toLowerCase(); + if (!needle) return true; + return ['name', 'motto', 'roles', 'function', 'description'] + .some(f => String(house[f] || '').toLowerCase().includes(needle)); +}; + const renderModeButtons = (filter) => div({ class: 'mode-buttons stats-mode-row' }, ['ruling', 'houses', 'rules'].map(m => form({ method: 'GET', action: '/larp' }, @@ -226,33 +249,29 @@ const renderModeButtons = (filter) => div({ class: 'mode-buttons stats-mode-row' ) ); -const renderRules = () => div({ class: 'larp-rules' }, - h2(i18n.larpRulesTitle || 'F.A.Q.'), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesEntryTitle || 'Starting house'), - p(i18n.larpRulesEntryText || 'Every inhabitant begins in ACADEMIA by default.') - ), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesOneHouseTitle || 'One house at a time'), - p(i18n.larpRulesOneHouseText || 'You can belong to at most one house at any given moment. If you belong to none, you are in ACADEMIA. Every non-ACADEMIA house page shows a "Leave House" button to its members that resets membership back to ACADEMIA. Leaving does NOT waive the test cooldown.') - ), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesTestEntry || 'WILL test'), - p(i18n.larpRulesTestEntryText || 'Each option weights one or more houses; when you submit, the system tallies the scores and auto-admits you into the highest-scoring house.') - ), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesInviteEntry || 'Invitation code'), - p(i18n.larpRulesInviteEntryText || 'House members can generate invitation codes that grant direct access to the house.') - ), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesGovernanceTitle || 'Governance Wall'), - p(i18n.larpRulesGovernanceText || 'During its cycle, the governing house wears the "Ruling" badge and is the only one whose Wall is surfaced publicly under the RULING tab.') - ), - div({ class: 'larp-rules-section' }, - h3(i18n.larpRulesSignTitle || 'L.A.R.P. Emblem'), - p(i18n.larpRulesSignText || 'Inhabitants can choose whether to add a sensor on their avatar with the emblem of their current house.') - ) -); +const renderRules = () => { + const points = [ + i18n.larpRulesEntryText, + i18n.larpRulesOneHouseText, + i18n.larpRulesTestEntryText, + i18n.larpRulesInviteEntryText, + i18n.larpRulesGovernanceText, + i18n.larpRulesWallText, + i18n.larpRulesSignText + ]; + return div( + { class: 'card' }, + h2(i18n.larpRulesTitle || 'F.A.Q.'), + div({ class: 'rules-points' }, + points.filter(Boolean).map((text, i) => + div({ class: 'rules-point' }, + span({ class: 'rules-point-num' }, String(i + 1)), + span({ class: 'rules-point-text' }, text) + ) + ) + ) + ); +}; const renderHousesGrid = (houses, myHouseKey, governingKey) => { const inLarp = !!myHouseKey; @@ -277,7 +296,9 @@ const renderHousesGrid = (houses, myHouseKey, governingKey) => { ), p({ class: 'larp-card-motto' }, '“' + h.motto + '”'), p({ class: 'larp-card-roles' }, h.roles), - p({ class: 'larp-card-count' }, `${i18n.larpMembersCount || 'Members'}: ${h.memberCount || 0}`), + div({ class: 'tribe-card-members' }, + span({ class: 'tribe-members-count' }, `${i18n.larpMembersCount || 'Members'}: ${h.memberCount || 0}`) + ), h.openInviteCode ? p({ class: 'larp-card-count' }, i18n.tribeInviteCodeText, span({ class: 'tribe-open-invite-code' }, h.openInviteCode)) : null ) ); @@ -285,11 +306,13 @@ const renderHousesGrid = (houses, myHouseKey, governingKey) => { ); }; -exports.larpListView = ({ filter, houses, myHouseKey, cycle, governingKey, governingHouse, governingMembers, governingPosts, canPost }) => { +exports.larpListView = ({ filter, houses, myHouseKey, cycle, governingKey, governingHouse, governingMembers, governingPosts, canPost, q }) => { const title = i18n.larpTitle || 'L.A.R.P.'; const description = i18n.larpDescription || 'A live action role-playing layer for collaborative experimentation.'; const myHouse = houses.find(h => h.key === myHouseKey) || null; - const mode = filter === 'houses' ? 'houses' : filter === 'rules' ? 'rules' : 'ruling'; + const search = String(q || '').trim(); + const mode = search ? 'houses' : filter === 'houses' ? 'houses' : filter === 'rules' ? 'rules' : 'ruling'; + const matched = search ? houses.filter(h => matchesHouse(h, search)) : houses; return template( title, @@ -299,10 +322,13 @@ exports.larpListView = ({ filter, houses, myHouseKey, cycle, governingKey, gover p(description) ), renderCycleBanner(cycle), - renderHouseBadges({ myHouse, governingHouse }), + renderHouseBadges({ myHouse, governingHouse, houses }), renderModeButtons(mode), + renderHouseSearch(search), mode === 'houses' - ? renderHousesGrid(houses, myHouseKey, governingKey) + ? (matched.length + ? renderHousesGrid(matched, myHouseKey, governingKey) + : p({ class: 'no-content' }, i18n.larpNoHousesMatch)) : mode === 'rules' ? renderRules() : [ @@ -330,7 +356,8 @@ exports.larpHouseView = ({ house, members, myHouseKey, cycle, governingKey, hous const isAcademia = house.key === 'academia'; const viewerInAcademia = myHouseKey === 'academia'; const viewerIsMember = myHouseKey === house.key && house.key !== 'academia'; - const showWall = viewerIsMember || house.key === governingKey; + const canWriteWall = myHouseKey === house.key; + const showWall = viewerIsMember || house.key === governingKey || house.key === 'academia'; const cycles = computeCyclesUntilRuling(house, governingKey); const housesById = Object.fromEntries(houses.map(h => [h.key, h])); @@ -342,9 +369,14 @@ exports.larpHouseView = ({ house, members, myHouseKey, cycle, governingKey, hous p({ class: 'larp-detail-motto' }, '“' + house.motto + '”') ), renderCycleBanner(cycle), - renderHouseBadges({ myHouse, governingHouse }), + renderHouseBadges({ myHouse, governingHouse, houses }), renderHouseNav(houses, house.key), - renderHousePanel(house, members, posts, { canPost, viewerHouseKey: myHouseKey, cyclesUntilRuling: cycles }), + renderHousePanel(house, members, posts, { + canPost, + viewerHouseKey: myHouseKey, + cyclesUntilRuling: cycles, + canTakeTest: isAcademia && viewerInAcademia && !!(testStatus && testStatus.allowed) + }), inviteCode ? div({ class: 'larp-invite-banner' }, p({ class: 'larp-invite-banner-title' }, strong(i18n.larpInviteBannerTitle || 'New invitation code')), @@ -352,10 +384,10 @@ exports.larpHouseView = ({ house, members, myHouseKey, cycle, governingKey, hous p({ class: 'larp-invite-banner-code' }, inviteCode) ) : null, + isAcademia && viewerInAcademia ? renderAcademiaJoinPanel(houses, testStatus, housesById, questions, myHouseKey) : null, showWall - ? renderPostsBlock(posts, house, viewerIsMember) - : null, - isAcademia && viewerInAcademia ? renderAcademiaJoinPanel(houses, testStatus, housesById, questions, myHouseKey) : null + ? renderPostsBlock(posts, house, canWriteWall) + : null ) ); }; @@ -363,17 +395,19 @@ exports.larpHouseView = ({ house, members, myHouseKey, cycle, governingKey, hous exports.larpTestView = ({ questions, cycle, houses, myHouseKey, governingKey, testStatus }) => { const myHouse = houses.find(h => h.key === myHouseKey) || null; const governingHouse = houses.find(h => h.key === governingKey) || null; - const titleText = i18n.larpTestTitle || 'Profile test'; + const title = i18n.larpTitle || 'L.A.R.P.'; + const description = i18n.larpDescription || 'A live action role-playing layer for collaborative experimentation.'; return template( - titleText, + title, section( div({ class: 'tags-header' }, - h1(titleText), - p(i18n.larpTestIntro || 'Answer the psychological questions. The system will pick the house that best fits your answers. You can attempt one test every 30 cycles.') + h1(title), + p(description) ), renderCycleBanner(cycle), - renderHouseBadges({ myHouse, governingHouse }), + renderHouseBadges({ myHouse, governingHouse, houses }), + renderModeButtons(''), testStatus && !testStatus.allowed ? div({ class: 'larp-test-cooldown' }, p((i18n.larpTestCooldownActive || 'Next test available in') + ' ' + formatCooldown(testStatus.nextAt - Date.now()) + ' ' + (i18n.larpTestCooldownDays || 'cycles')), @@ -409,7 +443,7 @@ exports.larpTestResultView = ({ house, result, cycle, houses, myHouseKey, govern section( div({ class: 'tags-header' }, h1(titleText)), renderCycleBanner(cycle), - renderHouseBadges({ myHouse, governingHouse }), + renderHouseBadges({ myHouse, governingHouse, houses }), div({ class: 'larp-test-result' }, ranking.length ? div({ class: 'larp-test-ranking' }, diff --git a/src/views/logs_view.js b/src/views/logs_view.js index 60d0149..8aa7653 100644 --- a/src/views/logs_view.js +++ b/src/views/logs_view.js @@ -1,8 +1,11 @@ -const { div, h2, p, section, button, form, span, table, thead, tbody, tr, th, td, input, textarea, br, option, select } = require("../server/node_modules/hyperaxe"); +const { div, h2, p, section, button, form, span, table, thead, tbody, tr, th, td, input, textarea, br, option, select, a, label } = require("../server/node_modules/hyperaxe"); const { template, i18n } = require("./main_views"); const moment = require("../server/node_modules/moment"); +const { config } = require("../server/SSB_server.js"); const { renderUrl } = require("../backend/renderUrl"); +const userId = config.keys.id; + const safeArr = v => Array.isArray(v) ? v : []; const FILTERS = ["today", "week", "month", "year", "always"]; @@ -18,22 +21,22 @@ const filterLabel = (f) => { return map[f] || f.toUpperCase(); }; -const renderFilterBar = (current, hasItems = false) => - div({ class: "logs-toolbar" }, - form({ method: "GET", action: "/logs", class: "logs-toolbar-inline" }, +const renderFilterBar = (current, hasItems = true) => + div({ class: "activity-sub-filter" }, + form({ method: "GET", action: "/logs", class: "sub-filter-form" }, FILTERS.map(f => button({ type: "submit", name: "filter", value: f, class: current === f ? "filter-btn active" : "filter-btn" - }, filterLabel(f)) + }, String(filterLabel(f)).toUpperCase()) ) ), - form({ method: "GET", action: "/logs", class: "logs-toolbar-inline" }, + form({ method: "GET", action: "/logs", class: "sub-filter-form" }, input({ type: "hidden", name: "view", value: "create" }), button({ type: "submit", class: "create-button" }, i18n.logsCreate || 'Create Log') ), hasItems - ? form({ method: "GET", action: "/logs/export", class: "logs-toolbar-inline" }, + ? form({ method: "GET", action: "/logs/export", class: "sub-filter-form" }, button({ type: "submit", class: "create-button" }, i18n.logsExport || 'Export Logs') ) : null @@ -71,12 +74,9 @@ const renderToolbar = (current, search, hasItems) => renderSearchBox(current, search) ); -const MAX_PREVIEW = 140; - -const truncate = (str) => { - const s = String(str || ''); - if (s.length <= MAX_PREVIEW) return s; - return s.slice(0, MAX_PREVIEW).replace(/\s+\S*$/, '') + '…'; +const truncate = (value, max = 160) => { + const text = String(value == null ? '' : value).trim(); + return text.length > max ? `${text.slice(0, max)}\u2026` : text; }; const renderLogPreview = (item) => { @@ -91,9 +91,8 @@ const renderTable = (items) => { tr( th(i18n.logsColumnDate || 'Date'), th(i18n.logsColumnType || 'Type'), - th(i18n.logsColumnLog || 'Log'), - th(''), - th('') + th({ class: "logs-col-log" }, i18n.logsColumnLog || 'Log'), + th({ class: "logs-col-actions" }, '') ) ), tbody( @@ -114,13 +113,13 @@ const renderTable = (items) => { renderLogPreview(item) ), td({ class: "logs-col-actions" }, - form({ method: "GET", action: `/logs/view/${encodeURIComponent(item.key)}` }, - button({ type: "submit", class: "filter-btn" }, i18n.logsViewDetails || 'View Details') - ) - ), - td({ class: "logs-col-actions" }, - form({ method: "GET", action: `/logs/export/${encodeURIComponent(item.key)}` }, - button({ type: "submit", class: "filter-btn" }, i18n.logsExportOne || 'Export') + div({ class: "logs-row-actions" }, + form({ method: "GET", action: `/logs/view/${encodeURIComponent(item.key)}` }, + button({ type: "submit", class: "filter-btn" }, i18n.logsViewDetails || 'View Details') + ), + form({ method: "GET", action: `/logs/export/${encodeURIComponent(item.key)}` }, + button({ type: "submit", class: "filter-btn" }, i18n.logsExportOne || 'Export') + ) ) ) ) @@ -161,7 +160,6 @@ const renderCreateForm = (mode, aiModOn) => { : div({ class: "div-center audio-form" }, form({ method: "POST", action: "/logs/create" }, input({ type: "hidden", name: "mode", value: "manual" }), - span(i18n.logsManualPrompt || 'Write your log'), br(), textarea({ name: "text", rows: "8", required: true, placeholder: i18n.logsTextPlaceholder || 'Describe your experiences...' }), br(), br(), button({ type: "submit", class: "create-button" }, i18n.logsWriteButton || 'Write') @@ -172,9 +170,8 @@ const renderCreateForm = (mode, aiModOn) => { const renderEditForm = (entry) => { return div({ class: "div-center audio-form" }, - h2(i18n.logsEditTitle || 'Edit Log'), - form({ method: "POST", action: `/logs/edit/${encodeURIComponent(entry.key)}` }, - span(i18n.logsManualPrompt || 'Write your log...'), br(), + h2(i18n.logsEditTitle || 'Update Log'), + form({ method: "POST", action: `/logs/update/${encodeURIComponent(entry.key)}` }, textarea({ name: "text", rows: "8", required: true }, entry.text || ''), input({ type: "hidden", name: "label", value: entry.label || '' }), br(), br(), @@ -189,25 +186,24 @@ const renderDetail = (entry) => { h2(headerLine), entry.label ? div({ class: "logs-entry-label" }, entry.label) : null, div({ class: "logs-detail-text" }, ...renderUrl(String(entry.text || ''))), - div({ class: "logs-detail-actions" }, + div({ class: "tribe-side-actions logs-detail-actions" }, form({ method: "GET", action: "/logs" }, - button({ type: "submit", class: "filter-btn" }, i18n.walletBack || 'Back') + button({ type: "submit", class: "tribe-action-btn" }, i18n.walletBack || 'Back') ), form({ method: "GET", action: `/logs/export/${encodeURIComponent(entry.key)}` }, - button({ type: "submit", class: "filter-btn" }, i18n.logsExportOne || 'Export') + button({ type: "submit", class: "tribe-action-btn" }, i18n.generatePdf) ), - form({ method: "GET", action: "/logs" }, - input({ type: "hidden", name: "view", value: "edit" }), - input({ type: "hidden", name: "id", value: entry.key }), - button({ type: "submit", class: "filter-btn" }, i18n.logsEdit || 'Edit') + form({ method: "GET", action: `/logs/edit/${encodeURIComponent(entry.key)}` }, + button({ type: "submit", class: "tribe-action-btn" }, i18n.logsEdit || 'Update') ), form({ method: "POST", action: `/logs/delete/${encodeURIComponent(entry.key)}` }, - button({ type: "submit", class: "filter-btn danger-btn" }, i18n.logsDelete || 'Delete') + button({ type: "submit", class: "tribe-action-btn danger-btn" }, i18n.logsDelete || 'Delete') ) ) ); }; + exports.logsView = (items, filter, mode, opts = {}) => { const listTitle = i18n.logsTitle || 'Logs'; const description = i18n.logsDescription || 'Record your experience in the network.'; @@ -215,30 +211,23 @@ exports.logsView = (items, filter, mode, opts = {}) => { const aiModOn = !!opts.aiModOn; const hasItems = Array.isArray(items) && items.length > 0; + const screen = (...blocks) => template( + listTitle, + section( + div({ class: "tags-header" }, h2(listTitle), p(description)), + renderFilterBar(filter), + ...blocks + ) + ); + if (view === 'create') { - const h = i18n.logsCreateTitle || 'Create Log'; - const body = section( - div({ class: "tags-header" }, h2(h), p(description)), - renderFilterBar(filter, hasItems), - renderCreateForm(mode, aiModOn) - ); - return template(h, body); + return screen(renderCreateForm(mode, aiModOn)); } if (view === 'edit' && opts.entry) { - const h = i18n.logsEditTitle || 'Edit Log'; - const body = section( - div({ class: "tags-header" }, h2(h), p(description)), - renderEditForm(opts.entry) - ); - return template(h, body); + return screen(renderEditForm(opts.entry)); } if (view === 'detail' && opts.entry) { - const h = i18n.logsViewTitle || 'Log'; - const body = section( - div({ class: "tags-header" }, h2(h), p(description)), - renderDetail(opts.entry) - ); - return template(h, body); + return screen(renderDetail(opts.entry)); } const body = section( div({ class: "tags-header" }, h2(listTitle), p(description)), diff --git a/src/views/melody_view.js b/src/views/melody_view.js index 8129272..5d7677a 100644 --- a/src/views/melody_view.js +++ b/src/views/melody_view.js @@ -104,7 +104,7 @@ const renderBcsList = (bcsAudios) => { span({ class: "card-label" }, `${i18n.melodyByLabel || "By"}: `), userLink(a.author), span({ class: "melody-meta-sep" }, " · "), - span({ class: "card-value" }, moment(a.createdAt).format("YYYY/MM/DD HH:mm:ss")) + span({ class: "card-value" }, moment(a.createdAt).format("YYYY/MM/DD HH:mm")) ) ), a.url diff --git a/src/views/pads_view.js b/src/views/pads_view.js index 25c9ec6..c38c2f1 100644 --- a/src/views/pads_view.js +++ b/src/views/pads_view.js @@ -1,5 +1,5 @@ const { div, h2, h3, h4, p, section, button, form, a, span, br, textarea, input, label, select, option, table, tr, td } = require("../server/node_modules/hyperaxe") -const { template, i18n, userLink, renderStateChip, renderLifespanChip, renderSpreadButton } = require("./main_views") +const { template, i18n, userLink, renderStateChip, renderLifespanChip, renderSpreadButton , renderContentActions } = require("./main_views") const { renderEncryptedChip } = require("./clearnet_view") const moment = require("../server/node_modules/moment") const { config } = require("../server/SSB_server.js") @@ -105,6 +105,10 @@ const renderPadCard = (pad, filter, spreadInfo) => { renderLifespanChip(pad.lifetime, i18n) ].filter(Boolean) return div({ class: "tribe-card" }, + div({ class: "card-header activity-card-header" }, + span(), + renderContentActions(pad.rootId || pad.key, `/pads/${encodeURIComponent(pad.rootId)}`, { spread: spreadInfo || null, author: pad.author, favKind: 'pads', isFavorite: pad.isFavorite, reportTitle: pad.title }) + ), div({ class: "tribe-card-body" }, div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, @@ -113,17 +117,10 @@ const renderPadCard = (pad, filter, spreadInfo) => { ), chips.length ? div({ class: "card-chips-row" }, ...chips) : null, pad.deadline - ? p({ class: "job-meta-line" }, `${i18n.padDeadlineLabel || "Deadline"}: ${moment(pad.deadline).format("YYYY-MM-DD HH:mm")}`) + ? p({ class: "job-meta-line" }, `${i18n.padDeadlineLabel || "Deadline"}: ${moment(pad.deadline).format("YYYY/MM/DD HH:mm")}`) : null, div({ class: "tribe-card-members" }, span({ class: "tribe-members-count" }, `${i18n.padMembersLabel || "Members"}: ${pad.members.length}`) - ), - (() => { - const btn = renderSpreadButton(pad.rootId, spreadInfo); - return btn ? div({ class: "card-spread-left" }, btn) : null; - })(), - div({ class: "visit-btn-centered" }, - a({ href: `/pads/${encodeURIComponent(pad.rootId)}`, class: "filter-btn" }, i18n.padVisitPad || "Visit Pad") ) ) ) @@ -139,7 +136,7 @@ const renderCreateForm = (padToEdit, params) => { }, tribeId ? input({ type: "hidden", name: "tribeId", value: tribeId }) : null, span(i18n.padTitleLabel || "Title"), require("../server/node_modules/hyperaxe").br(), - input({ type: "text", name: "title", value: padToEdit ? padToEdit.title : "", placeholder: i18n.padTitlePlaceholder || "Enter pad title...", required: true }), + input({ type: "text", name: "title", maxlength: "100", value: padToEdit ? padToEdit.title : "", placeholder: i18n.padTitlePlaceholder || "Enter pad title...", required: true }), require("../server/node_modules/hyperaxe").br(), require("../server/node_modules/hyperaxe").br(), span(i18n.padStatusLabel || "Status"), require("../server/node_modules/hyperaxe").br(), select({ name: "status" }, @@ -178,14 +175,7 @@ exports.renderPadInvitePage = (code) => { exports.padsView = async (pads, filter, padToEdit, params) => { const q = String((params && params.q) || "").trim() const isForm = filter === "create" || filter === "edit" - const headerMap = { - all: i18n.padAllSectionTitle || "Pads", - mine: i18n.padMineSectionTitle || "Your Pads", - recent: i18n.padRecentSectionTitle || "Recent Pads", - open: i18n.padOpenSectionTitle || "Open Pads", - closed: i18n.padClosedSectionTitle || "Closed Pads" - } - const headerText = headerMap[filter] || headerMap.all + const headerText = i18n.padsTitle const filteredPads = q ? pads.filter(pd => String(pd.title || "").toLowerCase().includes(q.toLowerCase())) @@ -199,12 +189,12 @@ exports.padsView = async (pads, filter, padToEdit, params) => { renderModeButtons(filter), !isForm ? div({ class: "filters" }, - form({ method: "GET", action: "/pads" }, + form({ method: "GET", action: "/pads", class: "filter-box" }, input({ type: "hidden", name: "filter", value: filter }), - input({ type: "text", name: "q", placeholder: i18n.padSearchPlaceholder || "Search pads...", value: q }), - br(), - button({ type: "submit" }, i18n.search), - br() + input({ type: "text", name: "q", placeholder: i18n.padSearchPlaceholder || "Search pads...", value: q, class: "filter-box__input" }), + div({ class: "filter-box__controls" }, + button({ type: "submit", class: "filter-box__button" }, i18n.searchButton) + ) ) ) : null, @@ -213,7 +203,7 @@ exports.padsView = async (pads, filter, padToEdit, params) => { : div( filteredPads.length === 0 ? p({ class: "no-content" }, i18n.padsNoItems || "No pads found.") - : div({ class: "tribe-grid" }, ...filteredPads.map(pd => renderPadCard(pd, filter, params && params.spreadMap && params.spreadMap.get(pd.rootId)))) + : div({ class: "tribe-grid pads-grid" }, ...filteredPads.map(pd => renderPadCard(pd, filter, params && params.spreadMap && params.spreadMap.get(pd.rootId)))) ) ) @@ -225,7 +215,6 @@ exports.singlePadView = async (pad, entries, params) => { const isMember = pad.members.includes(userId) || (!!pad.tribeId && !!pad.isTribeMember) const padClosed = pad.isClosed const returnTo = `/pads/${encodeURIComponent(pad.rootId)}` - const shareUrl = `/pads/${encodeURIComponent(pad.rootId)}` const isRestrictedInviteOnly = !isMember && !isAuthor && pad.status === "INVITE-ONLY" const tags = !isRestrictedInviteOnly && Array.isArray(pad.tags) && pad.tags.length > 0 @@ -237,76 +226,65 @@ exports.singlePadView = async (pad, entries, params) => { renderEncryptedChip(i18n), renderLifespanChip(pad.lifetime, i18n) ].filter(Boolean) + const inviteActions = [ + isAuthor && pad.status === "INVITE-ONLY" + ? form({ method: "POST", action: `/pads/generate-invite/${encodeURIComponent(pad.rootId)}` }, + button({ type: "submit", class: "tribe-action-btn" }, i18n.tribeGenerateInvite) + ) + : null, + (() => { + if (!(isAuthor && pad.status === "INVITE-ONLY")) return null + const invs = Array.isArray(pad.invites) ? pad.invites : [] + const openInvite = invs.find(inv => typeof inv === "object" && inv && inv.public === true && inv.code) + if (openInvite) return [ + div({ class: "tribe-open-invite" }, + span({ class: "card-label" }, i18n.tribeInviteCodeText), + span({ class: "tribe-open-invite-code" }, openInvite.code) + ), + form({ method: "POST", action: `/pads/open-invite/remove/${encodeURIComponent(pad.rootId)}` }, + button({ type: "submit", class: "tribe-action-btn danger-btn" }, i18n.tribeRemoveInvitation) + ) + ] + return form({ method: "POST", action: `/pads/open-invite/create/${encodeURIComponent(pad.rootId)}` }, + button({ type: "submit", class: "tribe-action-btn" }, i18n.tribeOpenInvitation) + ) + })() + ].filter(Boolean) + const padSide = div({ class: "tribe-side" }, + div({ class: "card-header activity-card-header" }, + renderContentActions(pad.rootId, null, { + author: pad.author, + favKind: 'pads', + isFavorite: pad.isFavorite, + spread: (params && params.spreads) || null, + returnTo, + reportTitle: pad.title + }) + ), div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, pad.title || "\u2014") ), detailChips.length ? div({ class: "card-chips-row" }, ...detailChips) : null, - div({ class: "shop-share" }, - span({ class: "tribe-info-label" }, i18n.padShareUrl || "Share URL"), - input({ type: "text", readonly: true, value: shareUrl, class: "shop-share-input" }) + table({ class: "tribe-info-table jobs-info-table" }, + tr(td({ class: "tribe-info-label" }, i18n.padCreated || "Created"), td({ class: "tribe-info-value", colspan: "3" }, moment(pad.createdAt).format("YYYY/MM/DD HH:mm"))), + (isRestrictedInviteOnly || !pad.deadline) ? null : tr(td({ class: "tribe-info-label" }, i18n.padDeadlineLabel || "Deadline"), td({ class: "tribe-info-value", colspan: "3" }, moment(pad.deadline).format("YYYY/MM/DD HH:mm"))), + isRestrictedInviteOnly ? null : tr(td({ class: "tribe-info-value pad-author-cell", colspan: "4" }, userLink(pad.author))) ), - (() => { - const btn = renderSpreadButton(pad.rootId); - return btn ? div({ class: "card-spread-centered" }, btn) : null; - })(), + tags, div({ class: "tribe-card-members" }, span({ class: "tribe-members-count" }, `${i18n.padMembersLabel || "Members"}: ${pad.members.length}`) ), - table({ class: "tribe-info-table" }, - tr(td({ class: "tribe-info-label" }, i18n.padCreated || "Created"), td({ class: "tribe-info-value", colspan: "3" }, moment(pad.createdAt).format("YYYY-MM-DD"))), - isRestrictedInviteOnly ? null : tr(td({ class: "tribe-info-value pad-author-cell", colspan: "4" }, userLink(pad.author))), - isRestrictedInviteOnly ? null : tr(td({ class: "tribe-info-label" }, i18n.padDeadlineLabel || "Deadline"), td({ class: "tribe-info-value", colspan: "3" }, pad.deadline ? moment(pad.deadline).format("YYYY-MM-DD HH:mm") : "\u2014")) - ), - isRestrictedInviteOnly ? null : div({ class: "tribe-side-actions" }, - isAuthor && pad.status === "INVITE-ONLY" - ? form({ method: "POST", action: `/pads/generate-invite/${encodeURIComponent(pad.rootId)}` }, - button({ type: "submit", class: "tribe-action-btn" }, i18n.tribeGenerateInvite) - ) - : null, - (() => { - if (!(isAuthor && pad.status === "INVITE-ONLY")) return null - const invs = Array.isArray(pad.invites) ? pad.invites : [] - const openInvite = invs.find(inv => typeof inv === "object" && inv && inv.public === true && inv.code) - if (openInvite) return [ - div({ class: "tribe-open-invite" }, - span({ class: "card-label" }, i18n.tribeInviteCodeText), - span({ class: "tribe-open-invite-code" }, openInvite.code) - ), - form({ method: "POST", action: `/pads/open-invite/remove/${encodeURIComponent(pad.rootId)}` }, - button({ type: "submit", class: "tribe-action-btn danger-btn" }, i18n.tribeRemoveInvitation) - ) - ] - return form({ method: "POST", action: `/pads/open-invite/create/${encodeURIComponent(pad.rootId)}` }, - button({ type: "submit", class: "tribe-action-btn" }, i18n.tribeOpenInvitation) - ) - })(), - form( - { method: "POST", action: pad.isFavorite ? `/pads/favorites/remove/${encodeURIComponent(pad.key)}` : `/pads/favorites/add/${encodeURIComponent(pad.key)}` }, - returnTo ? input({ type: "hidden", name: "returnTo", value: returnTo }) : null, - button({ type: "submit", class: "tribe-action-btn" }, pad.isFavorite ? (i18n.padRemoveFavorite || "Remove Favorite") : (i18n.padAddFavorite || "Add Favorite")) - ), - !isAuthor - ? a({ href: `/pm?to=${encodeURIComponent(pad.author)}`, class: "tribe-action-btn" }, "PM") - : null, - isAuthor - ? form({ method: "GET", action: "/pads" }, - input({ type: "hidden", name: "filter", value: "edit" }), - input({ type: "hidden", name: "id", value: pad.rootId }), - button({ type: "submit", class: "tribe-action-btn" }, i18n.padUpdate || "Update") - ) - : null, + isRestrictedInviteOnly ? null : div({ class: "tribe-side-actions housing-status-row" }, + span({ class: "card-label" }, `${i18n.padStatusLabel || "Status"}: `), + renderPadStatusChip(pad.status, padClosed), isAuthor && pad.status !== "CLOSED" && !padClosed ? form({ method: "POST", action: `/pads/close/${encodeURIComponent(pad.rootId)}` }, - button({ type: "submit", class: "tribe-action-btn" }, i18n.padClose || "Close Pad") - ) - : null, - isAuthor - ? form({ method: "POST", action: `/pads/delete/${encodeURIComponent(pad.rootId)}` }, - button({ type: "submit", class: "tribe-action-btn danger-btn" }, i18n.padDelete || "Delete") + button({ type: "submit", class: "status-btn project-control-btn" }, i18n.padClose || "Close") ) : null ), + (isRestrictedInviteOnly || !inviteActions.length) ? null : div({ class: "tribe-side-actions" }, ...inviteActions), !isAuthor && pad.status === "INVITE-ONLY" && !isMember ? div({ class: "pad-invite-section" }, a({ class: "tribe-action-btn", href: "/invites#invites-pads" }, i18n.tribeEnterInvite) @@ -317,7 +295,16 @@ exports.singlePadView = async (pad, entries, params) => { button({ type: "submit", class: "create-button" }, i18n.padStartEditing || "START EDITING!") ) : null, - tags + isRestrictedInviteOnly || !isAuthor ? null : div({ class: "tribe-side-actions" }, + form({ method: "GET", action: "/pads" }, + input({ type: "hidden", name: "filter", value: "edit" }), + input({ type: "hidden", name: "id", value: pad.rootId }), + button({ type: "submit", class: "tribe-action-btn" }, i18n.padUpdate || "Update") + ), + form({ method: "POST", action: `/pads/delete/${encodeURIComponent(pad.rootId)}` }, + button({ type: "submit", class: "tribe-action-btn danger-btn" }, i18n.padDelete || "Delete") + ) + ) ) let canonicalEntries = entries @@ -343,7 +330,7 @@ exports.singlePadView = async (pad, entries, params) => { h4(i18n.padVersionHistory || "Version History"), ...visibleEntries.slice().reverse().map((e, idx) => div({ class: "pad-version-item" }, - span({ class: "pad-version-date" }, moment(e.createdAt).format("YYYY-MM-DD HH:mm")), + span({ class: "pad-version-date" }, moment(e.createdAt).format("YYYY/MM/DD HH:mm")), span({ class: "pad-version-author" }, span({ class: "pad-author-swatch " + memberColorClass(pad.members, e.author) }), userLink(e.author) diff --git a/src/views/pixelia_view.js b/src/views/pixelia_view.js index 8cc81ae..f2f5c85 100644 --- a/src/views/pixelia_view.js +++ b/src/views/pixelia_view.js @@ -47,22 +47,22 @@ exports.pixeliaView = (pixelArt, errorMessage) => { input({ type: "number", id: "y", name: "y", min: 1, max: gridHeight, required: true }), label({ for: "color" }, i18n.colorLabel), select({ id: "color", name: "color", required: true }, - option({ value: "#000000", style: "background-color:#000000;" }, "Black"), - option({ value: "#ffffff", style: "background-color:#ffffff;" }, "White"), - option({ value: "#17f018", style: "background-color:#17f018;" }, "Green"), - option({ value: "#ffbb00", style: "background-color:#ffbb00;" }, "Yellow"), - option({ value: "#ff0000", style: "background-color:#ff0000;" }, "Red"), - option({ value: "#0000ff", style: "background-color:#0000ff;" }, "Blue"), - option({ value: "#ffff00", style: "background-color:#ffff00;" }, "Lime"), - option({ value: "#00ff00", style: "background-color:#00ff00;" }, "Spring Green"), - option({ value: "#00ffff", style: "background-color:#00ffff;" }, "Aqua"), - option({ value: "#ff00ff", style: "background-color:#ff00ff;" }, "Fuchsia"), - option({ value: "#a52a2a", style: "background-color:#a52a2a;" }, "Brown"), - option({ value: "#800080", style: "background-color:#800080;" }, "Purple"), - option({ value: "#808000", style: "background-color:#808000;" }, "Olive"), - option({ value: "#00bfff", style: "background-color:#00bfff;" }, "Deep Sky Blue"), - option({ value: "#d3d3d3", style: "background-color:#d3d3d3;" }, "Light Grey"), - option({ value: "#ff6347", style: "background-color:#ff6347;" }, "Tomato") + option({ value: "#000000", class: "pixelia-swatch pixelia-swatch-000000" }, "Black"), + option({ value: "#ffffff", class: "pixelia-swatch pixelia-swatch-ffffff" }, "White"), + option({ value: "#17f018", class: "pixelia-swatch pixelia-swatch-17f018" }, "Green"), + option({ value: "#ffbb00", class: "pixelia-swatch pixelia-swatch-ffbb00" }, "Yellow"), + option({ value: "#ff0000", class: "pixelia-swatch pixelia-swatch-ff0000" }, "Red"), + option({ value: "#0000ff", class: "pixelia-swatch pixelia-swatch-0000ff" }, "Blue"), + option({ value: "#ffff00", class: "pixelia-swatch pixelia-swatch-ffff00" }, "Lime"), + option({ value: "#00ff00", class: "pixelia-swatch pixelia-swatch-00ff00" }, "Spring Green"), + option({ value: "#00ffff", class: "pixelia-swatch pixelia-swatch-00ffff" }, "Aqua"), + option({ value: "#ff00ff", class: "pixelia-swatch pixelia-swatch-ff00ff" }, "Fuchsia"), + option({ value: "#a52a2a", class: "pixelia-swatch pixelia-swatch-a52a2a" }, "Brown"), + option({ value: "#800080", class: "pixelia-swatch pixelia-swatch-800080" }, "Purple"), + option({ value: "#808000", class: "pixelia-swatch pixelia-swatch-808000" }, "Olive"), + option({ value: "#00bfff", class: "pixelia-swatch pixelia-swatch-00bfff" }, "Deep Sky Blue"), + option({ value: "#d3d3d3", class: "pixelia-swatch pixelia-swatch-d3d3d3" }, "Light Grey"), + option({ value: "#ff6347", class: "pixelia-swatch pixelia-swatch-ff6347" }, "Tomato") ), button({ type: "submit" }, i18n.paintButton) ) diff --git a/src/views/pm_view.js b/src/views/pm_view.js index 8f37aef..69300ad 100644 --- a/src/views/pm_view.js +++ b/src/views/pm_view.js @@ -156,7 +156,13 @@ exports.pmView = async (initialRecipients = '', initialSubject = '', initialText span({ class: "pm-fileshare-meta" }, `${fileSharePreview.sizeLabel || ''} · ${String(fileSharePreview.mime || 'application/octet-stream')}`) ), form({ method: "POST", action: "/pm/file", class: "pm-fileshare-send-form" }, - input({ type: "hidden", name: "recipient", value: fileSharePreview.recipient }), + fileSharePreview.recipient + ? input({ type: "hidden", name: "recipient", value: fileSharePreview.recipient }) + : div({ class: "pm-fileshare-recipient" }, + label({ for: "fs-preview-recipient" }, i18n.pmRecipients), + br(), + input({ id: "fs-preview-recipient", type: "text", name: "recipient", placeholder: i18n.fileShareRecipientPlaceholder || 'Enter Oasis ID (@....ed25519)', required: true, maxlength: "120" }) + ), input({ type: "hidden", name: "subject", value: fileSharePreview.subject || '' }), input({ type: "hidden", name: "manifestBlobId", value: fileSharePreview.manifestBlobId }), input({ type: "hidden", name: "keyHex", value: fileSharePreview.keyHex }), diff --git a/src/views/polls_view.js b/src/views/polls_view.js new file mode 100644 index 0000000..b2cf414 --- /dev/null +++ b/src/views/polls_view.js @@ -0,0 +1,323 @@ +const { div, h2, p, section, button, form, a, input, label, span, textarea, br, table, tr, td } = require("../server/node_modules/hyperaxe"); +const { renderCommentsSection: renderSharedCommentsSection } = require("./comments_view"); +const { template, i18n, userLink, renderOpinionsVoting, renderEngagement, renderSpreadButton, renderContentActions, renderStateChip, renderLifespanChip, renderSpreadEditWarning } = require("./main_views"); +const moment = require("../server/node_modules/moment"); +const { config } = require("../server/SSB_server.js"); +const { renderUrl } = require("../backend/renderUrl"); +const { MAX_OPTIONS, MIN_OPTIONS, MAX_OPTION_LENGTH } = require("../models/polls_model_limits"); + +const userId = config.keys.id; + +const FILTERS = [ + { key: "ALL", i18n: "pollFilterAll" }, + { key: "MINE", i18n: "pollFilterMine" }, + { key: "RECENT", i18n: "pollFilterRecent" }, + { key: "TOP", i18n: "pollFilterTop" }, + { key: "VOTED", i18n: "pollFilterVoted" }, + { key: "OPEN", i18n: "pollFilterOpen" }, + { key: "CLOSED", i18n: "pollFilterClosed" } +]; + +const safeArr = (v) => (Array.isArray(v) ? v : []); + +const pct = (n, total) => (total > 0 ? Math.round((Number(n) || 0) / total * 100) : 0); +const letterOf = (i) => { + let n = Number(i) || 0; + let out = ""; + do { + out = String.fromCharCode(65 + (n % 26)) + out; + n = Math.floor(n / 26) - 1; + } while (n >= 0); + return out; +}; +const pctStep = (n, total) => Math.round(pct(n, total) / 5) * 5; + +const outcomeOf = (poll) => { + if (!poll.totalVoters) return i18n.pollNoVotesYet; + const max = Math.max(...poll.options.map(o => poll.counts[o] || 0)); + if (!max) return i18n.pollNoVotesYet; + const winners = poll.options + .map((o, i) => ({ o, letter: letterOf(i) })) + .filter(({ o }) => (poll.counts[o] || 0) === max); + if (winners.length > 1) return `${i18n.pollTie}: ${winners.map(w => `${w.letter})`).join(", ")}`; + return `${winners[0].letter}) ${pct(max, poll.totalVoters)}%`; +}; + +const renderStatusChip = (poll) => + renderStateChip(poll.status === "OPEN" ? "whole" : "mutuals", "◆", + poll.status === "OPEN" ? i18n.pollStatusOpen : i18n.pollStatusClosed); + +const renderModeChips = (poll) => [ + poll.anonymous ? renderStateChip("mutuals", "◈", i18n.pollAnonymous) : null, + poll.multiple ? renderStateChip("whole", "☰", i18n.pollMultiple) : null +].filter(Boolean); + +const renderResults = (poll) => + table({ class: "poll-results" }, + ...poll.options.map((opt, i) => + tr({ class: poll.myChoices.includes(opt) ? "poll-result-row poll-result-mine" : "poll-result-row" }, + td({ class: "poll-result-option" }, `${letterOf(i)})`), + td({ class: "poll-result-bar" }, + div({ class: "poll-bar" }, + div({ class: `poll-bar-fill poll-bar-fill-${pctStep(poll.counts[opt], poll.totalVoters)} poll-hue-${i % 8}` }) + ) + ), + td({ class: "poll-result-count" }, + `${poll.counts[opt] || 0} (${pct(poll.counts[opt], poll.totalVoters)}%)`) + ) + ) + ); + +const renderBallot = (poll, returnTo, basePath) => { + if (poll.status === "CLOSED" || poll.hasVoted) return null; + const inputType = poll.multiple ? "checkbox" : "radio"; + return form({ method: "POST", action: `${basePath}/vote/${encodeURIComponent(poll.id)}`, class: "poll-ballot" }, + input({ type: "hidden", name: "returnTo", value: returnTo }), + ...poll.options.map((opt, i) => + div({ class: "poll-option-row" }, + label({ for: `opt-${i}-${poll.id}` }, + input({ + type: inputType, name: "choices", value: opt, id: `opt-${i}-${poll.id}`, + ...(poll.myChoices.includes(opt) ? { checked: true } : {}) + }), + " ", + `${letterOf(i)}) ${opt}` + ) + ) + ), + button({ type: "submit", class: "filter-btn" }, i18n.pollVoteButton) + ); +}; + +const renderPollCard = (poll, filter, spreadInfo, basePath = "/polls") => { + const href = `${basePath}/${encodeURIComponent(poll.id)}`; + const isOwn = String(poll.author) === String(userId); + const chips = [ + renderStatusChip(poll), + ...renderModeChips(poll), + poll.deadline + ? renderStateChip(poll.status === "OPEN" ? "whole" : "mutuals", "◷", `${i18n.pollDeadline}: ${moment(poll.deadline).format("YYYY/MM/DD HH:mm")}`) + : null, + renderLifespanChip(poll.lifetime, i18n) + ].filter(Boolean); + return div({ class: "tribe-card poll-card" + (isOwn ? " own-content" : "") }, + div({ class: "card-header activity-card-header" }, + span(), + renderContentActions(poll.id, href, { spread: spreadInfo || null, author: poll.author, favKind: 'polls', isFavorite: poll.isFavorite, reportTitle: poll.question }) + ), + div({ class: "tribe-card-body" }, + div({ class: "shop-title-row" }, + h2({ class: "tribe-card-title" }, a({ href }, poll.question)) + ), + chips.length ? div({ class: "card-chips-row" }, ...chips) : null, + div({ class: "tribe-card-members" }, + span({ class: "tribe-members-count" }, `${i18n.pollVoters}: ${poll.totalVoters}`) + ) + ) + ); +}; + +const renderCreateForm = (poll = null, params = {}) => { + const isEdit = !!poll; + const action = isEdit ? `/polls/update/${encodeURIComponent(poll.id)}` : "/polls/create"; + return section( + params.spreadWarning || null, + div({ class: "div-center audio-form" }, + h2(isEdit ? i18n.pollEditTitle : i18n.pollCreateTitle), + form({ method: "POST", action }, + label(i18n.pollQuestion), + br(), + input({ type: "text", name: "question", required: true, maxlength: "300", value: isEdit ? poll.question : "", placeholder: i18n.pollQuestionPlaceholder }), + br(), br(), + label(i18n.pollOptions), + br(), + textarea({ + name: "options", + rows: String(MAX_OPTIONS), + required: true, + maxlength: String(MAX_OPTIONS * (MAX_OPTION_LENGTH + 1)) + }, isEdit ? poll.options.join("\n") : ""), + br(), + div({ class: "poll-switch" }, + input({ type: "hidden", name: "anonymous", value: "0" }), + label( + input({ type: "checkbox", name: "anonymous", value: "1", ...(isEdit && poll.anonymous ? { checked: true } : {}) }), + " ", i18n.pollAnonymousLabel + ) + ), + div({ class: "poll-switch" }, + input({ type: "hidden", name: "multiple", value: "0" }), + label( + input({ type: "checkbox", name: "multiple", value: "1", ...(isEdit && poll.multiple ? { checked: true } : {}) }), + " ", i18n.pollMultipleLabel + ) + ), + br(), + label(i18n.pollDeadline), + br(), + input({ + type: "datetime-local", name: "deadline", + min: moment().format("YYYY-MM-DDTHH:mm"), + value: isEdit && poll.deadline ? moment(poll.deadline).format("YYYY-MM-DDTHH:mm") : "" + }), + br(), br(), + label(i18n.pollTags), + br(), + input({ type: "text", name: "tags", value: isEdit ? poll.tags.join(", ") : "" }), + br(), br(), + button({ type: "submit", class: "create-button" }, isEdit ? i18n.pollUpdateButton : i18n.pollPublishButton) + ) + ) + ); +}; + +const renderComments = (poll, comments, basePath) => { + const href = `${basePath}/${encodeURIComponent(poll.id)}`; + return renderSharedCommentsSection({ + action: `${href}/comments`, + comments: comments, + returnTo: href + }); +}; + +const renderFilterBar = (filter, q, showSearch = true) => + section( + div({ class: "filters" }, + form({ method: "GET", action: "/polls", class: "ui-toolbar ui-toolbar--filters" }, + ...FILTERS.map(f => + button({ type: "submit", name: "filter", value: f.key, class: filter === f.key ? "filter-btn active" : "filter-btn" }, String(i18n[f.i18n]).toUpperCase()) + ), + button({ type: "submit", name: "filter", value: "CREATE", class: "create-button" }, i18n.pollCreateButton) + ) + ), + showSearch ? div({ class: "filters" }, + form({ method: "GET", action: "/polls", class: "filter-box" }, + input({ type: "hidden", name: "filter", value: filter }), + input({ type: "text", name: "q", value: q || "", placeholder: i18n.pollSearchPlaceholder, class: "filter-box__input" }), + div({ class: "filter-box__controls" }, + button({ type: "submit", class: "filter-box__button" }, i18n.searchButton) + ) + ) + ) : null + ); + +exports.pollsView = async (polls = [], filter = "ALL", params = {}) => { + const mode = String(filter).toUpperCase(); + const spreadMap = params.spreadMap instanceof Map ? params.spreadMap : new Map(); + if (mode === "CREATE" || mode === "EDIT") { + const editing = params.poll || null; + if (editing) params = { ...params, spreadWarning: await renderSpreadEditWarning(editing.id) }; + return template( + i18n.pollsTitle, + section(div({ class: "tags-header" }, h2(i18n.pollsTitle), p(i18n.pollsDescription))), + renderFilterBar(mode, params.q, false), + renderCreateForm(editing, params) + ); + } + return template( + i18n.pollsTitle, + section(div({ class: "tags-header" }, h2(i18n.pollsTitle), p(i18n.pollsDescription))), + renderFilterBar(mode, params.q), + section( + polls.length + ? div({ class: "jobs-grid" }, ...polls.map(pl => renderPollCard(pl, mode, spreadMap.get(pl.id)))) + : p({ class: "no-content" }, i18n.pollsNoItems) + ) + ); +}; + +exports.singlePollView = async (poll, comments = [], params = {}) => { + const basePath = "/polls"; + const href = `${basePath}/${encodeURIComponent(poll.id)}`; + const isOwn = String(poll.author) === String(userId); + const chips = [renderStatusChip(poll), ...renderModeChips(poll), renderLifespanChip(poll.lifetime, i18n)].filter(Boolean); + + const infoRows = []; + const pushRow = (labelText, valueNode) => + infoRows.push(tr( + td({ class: "tribe-info-label" }, labelText), + td({ class: "tribe-info-value" }, valueNode) + )); + if (poll.deadline) pushRow(i18n.pollDeadline, moment(poll.deadline).format("YYYY/MM/DD HH:mm")); + pushRow(i18n.pollOutcome, outcomeOf(poll)); + + const tagsNode = poll.tags.length + ? div({ class: "card-tags" }, poll.tags.map(tag => + a({ href: `/search?query=%23${encodeURIComponent(tag)}`, class: "tag-link" }, `#${tag}`))) + : null; + + const ownerActions = isOwn + ? div({ class: "tribe-side-actions" }, + poll.totalVoters === 0 && poll.status === "OPEN" + ? form({ method: "GET", action: "/polls" }, + input({ type: "hidden", name: "filter", value: "EDIT" }), + input({ type: "hidden", name: "id", value: poll.id }), + button({ type: "submit", class: "update-btn" }, i18n.pollUpdateButton) + ) + : null, + form({ method: "POST", action: `/polls/delete/${encodeURIComponent(poll.id)}` }, + button({ type: "submit", class: "delete-btn" }, i18n.pollDeleteButton) + ) + ) + : null; + + const pollSide = div({ class: "tribe-side" }, + div({ class: "card-header activity-card-header" }, + renderContentActions(poll.id, null, { spread: params.spreads || null, author: poll.author, favKind: 'polls', isFavorite: poll.isFavorite, returnTo: href, reportTitle: poll.question }) + ), + div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, poll.question)), + chips.length ? div({ class: "card-chips-row" }, ...chips) : null, + table({ class: "tribe-info-table jobs-info-table" }, ...infoRows), + tagsNode, + div({ class: "tribe-card-members" }, + span({ class: "tribe-members-count" }, `${i18n.pollVoters}: ${poll.totalVoters}`) + ), + isOwn + ? div({ class: "tribe-side-actions housing-status-row" }, + span({ class: "card-label" }, `${i18n.pollStatusLabel}: `), + renderStatusChip(poll), + poll.status === "OPEN" + ? form({ method: "POST", action: `/polls/close/${encodeURIComponent(poll.id)}` }, + button({ type: "submit", class: "status-btn project-control-btn" }, i18n.pollCloseButton) + ) + : null + ) + : null, + ownerActions + ); + + const pollMain = div({ class: "tribe-main" }, + div({ class: "job-section" }, + h2({ class: "job-section-title" }, i18n.pollOutcome), + renderBallot(poll, href, basePath), + renderResults(poll) + ), + poll.votersHidden + ? null + : (poll.voters.length + ? div({ class: "card-assigned-list" }, ...poll.voters.map(v => userLink(v))) + : null), + p({ class: "card-footer" }, + span({ class: "date-link" }, moment(poll.createdAt).format("YYYY/MM/DD HH:mm")), + span(" · "), + userLink(poll.author) + ), + renderEngagement(poll.id, + renderOpinionsVoting('/polls/opinions', poll.id, poll.opinions, href, poll.opinions_inhabitants), + renderComments(poll, comments, basePath) + ) + ); + + return template( + poll.question, + section(div({ class: "tags-header" }, h2(i18n.pollsTitle), p(i18n.pollsDescription))), + renderFilterBar(String(params.filter || "ALL").toUpperCase(), params.q, false), + section(div({ class: "tribe-details" }, pollSide, pollMain)) + ); +}; + +exports.renderPollCard = renderPollCard; +exports.renderResults = renderResults; +exports.renderBallot = renderBallot; +exports.outcomeOf = outcomeOf; +exports.letterOf = letterOf; diff --git a/src/views/stats_view.js b/src/views/stats_view.js index 972388d..2cccdee 100644 --- a/src/views/stats_view.js +++ b/src/views/stats_view.js @@ -177,19 +177,19 @@ exports.statsView = (stats, filter) => { const pct = networkCO2 > 0 ? Math.min(100, (userCO2 / networkCO2) * 100) : 0; return div({ class: 'carbon-chart' }, div({ class: 'carbon-bar-label' }, - span(i18n.statsCarbonUser || 'Your footprint'), - span(`${userCO2} g CO₂`) - ), - div({ class: 'carbon-bar-track' }, - div({ class: `carbon-bar-fill carbon-bar-mine ${wClass(pct)}` }) - ), - div({ class: 'carbon-bar-label' }, - span(i18n.statsCarbonNetwork || 'Network total'), + span(`HcT — ${i18n.statsCarbonNetwork || 'Network total'}`), span(`${networkCO2} g CO₂`) ), div({ class: 'carbon-bar-track' }, div({ class: 'carbon-bar-fill carbon-bar-network stats-w-100' }) ), + div({ class: 'carbon-bar-label' }, + span(`HcH — ${i18n.statsCarbonUser || 'Your footprint'}`), + span(`${userCO2} g CO₂`) + ), + div({ class: 'carbon-bar-track' }, + div({ class: `carbon-bar-fill carbon-bar-mine ${wClass(pct)}` }) + ), p({ class: 'carbon-bar-note' }, strong(`${pct.toFixed(1)}%`), ` ${i18n.statsCarbonOfNetwork || 'of network total'}`), p({ class: 'carbon-bar-formula' }, 'Based on local data storage weight ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) ); @@ -201,13 +201,6 @@ exports.statsView = (stats, filter) => { const tombCO2 = parseFloat((tombMB * kWhPerMB * gCO2PerKWh).toFixed(4)); const tombPct = networkCO2 > 0 ? Math.min(100, (tombCO2 / networkCO2) * 100) : 0; return div({ class: 'carbon-chart' }, - div({ class: 'carbon-bar-label' }, - span(i18n.statsCarbonTombstone || 'Tombstoning footprint'), - span(`${tombCO2} g CO₂`) - ), - div({ class: 'carbon-bar-track' }, - div({ class: `carbon-bar-fill carbon-bar-mine ${wClass(tombPct)}` }) - ), div({ class: 'carbon-bar-label' }, span(i18n.statsCarbonNetwork || 'Network total'), span(`${networkCO2} g CO₂`) @@ -215,62 +208,59 @@ exports.statsView = (stats, filter) => { div({ class: 'carbon-bar-track' }, div({ class: 'carbon-bar-fill carbon-bar-network stats-w-100' }) ), + div({ class: 'carbon-bar-label' }, + span(i18n.statsCarbonTombstone || 'Tombstoning footprint'), + span(`${tombCO2} g CO₂`) + ), + div({ class: 'carbon-bar-track' }, + div({ class: `carbon-bar-fill carbon-bar-mine ${wClass(tombPct)}` }) + ), p({ class: 'carbon-bar-note' }, strong(`${tombPct.toFixed(1)}%`), ` ${i18n.statsCarbonOfNetwork || 'of network total'} (${tombCount} tombstones × ~${avgTombBytes} bytes)`), p({ class: 'carbon-bar-formula' }, 'Based on estimated tombstone message size ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) ); } const pct = Math.min(100, (networkCO2 / maxAnnualCO2) * 100); + const now = new Date(); + const yearStart = new Date(now.getFullYear(), 0, 1).getTime(); + const yearEnd = new Date(now.getFullYear() + 1, 0, 1).getTime(); + const yearPct = Math.min(100, ((now.getTime() - yearStart) / (yearEnd - yearStart)) * 100); return div({ class: 'carbon-chart' }, - div({ class: 'carbon-bar-label' }, - span(i18n.statsCarbonNetwork || 'Network footprint'), - span(`${networkCO2} g CO₂`) - ), - div({ class: 'carbon-bar-track' }, - div({ class: `carbon-bar-fill carbon-bar-network ${wClass(pct)}` }) - ), div({ class: 'carbon-bar-label' }, span(i18n.statsCarbonMaxAnnual || 'Annual max estimate'), span(`${maxAnnualCO2} g CO₂`) ), div({ class: 'carbon-bar-track' }, - div({ class: 'carbon-bar-fill carbon-bar-max stats-w-100' }) + div({ class: `carbon-bar-fill carbon-bar-max ${wClass(yearPct)}` }) ), - p({ class: 'carbon-bar-note' }, strong(`${pct.toFixed(1)}%`), ` ${i18n.statsCarbonOfEstMax || 'of estimated max capacity'}`), + div({ class: 'carbon-bar-label' }, + span(`HcT — ${i18n.statsCarbonNetwork || 'Network footprint'}`), + span(`${networkCO2} g CO₂`) + ), + div({ class: 'carbon-bar-track' }, + div({ class: `carbon-bar-fill carbon-bar-network ${wClass(pct)}` }) + ), + p({ class: 'carbon-bar-note' }, strong(`${pct.toFixed(1)}%`), ` ${i18n.statsCarbonOfEstMax || 'of estimated max capacity'} · `, strong(`${yearPct.toFixed(1)}%`), ` ${i18n.statsCarbonYearProgress || 'of the year elapsed'}`), p({ class: 'carbon-bar-formula' }, 'Based on local data storage weight ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) ); })(); - const headerCard = div({ class: 'stats-card' }, + const storageCard = div({ class: 'stats-card' }, + h3({ class: 'stats-section-h' }, i18n.statsStorageTitle || 'Storage'), table({ class: 'block-info-table' }, - tr(td({ class: 'card-label' }, i18n.statsCreatedAt), td({ class: 'card-value' }, stats.createdAt)), - tr(td({ class: 'card-label' }, 'ID'), td({ class: 'card-value' }, userLink(stats.id))), tr(td({ class: 'card-label' }, i18n.statsBlobsSize), td({ class: 'card-value' }, stats.statsBlobsSize)), tr(td({ class: 'card-label' }, i18n.statsBlockchainSize), td({ class: 'card-value' }, stats.statsBlockchainSize)), tr(td({ class: 'card-label' }, i18n.statsSize), td({ class: 'card-value' }, stats.folderSize)) ) ); - const totalInhabitants = stats.usersKPIs?.totalInhabitants || stats.inhabitants || 0; - const networkKPIs = stats.networkKPIs || {}; - - const topStrip = div({ class: 'stats-block' }, - kpiGrid( - kpi(i18n.bankingUserEngagementScore, C(stats, 'karmaScore')), - kpi(i18n.statsUsersTitle, totalInhabitants), - kpi(i18n.statsTotalMsgs || 'Total messages', networkKPIs.totalMsgs || 0), - kpi(i18n.statsLogsTitle || 'Logs', stats?.logsCount || 0), - kpi(i18n.statsAITraining, C(stats, 'aiExchange') || 0), - kpi(i18n.statsPUBs, stats.pubsCount || 0) - ) - ); - - const carbonCard = div({ class: 'stats-card' }, - h3({ class: 'stats-section-h' }, i18n.statsCarbonFootprintTitle || 'Carbon Footprint'), - carbonChart - ); - - const bankingCard = div({ class: 'stats-card' }, + const accountCard = div({ class: 'stats-card' }, + h3({ class: 'stats-section-h' }, i18n.statsAccountTitle || 'Account'), table({ class: 'block-info-table' }, + tr(td({ class: 'card-label' }, 'ID'), td({ class: 'card-value' }, userLink(stats.id))), + tr(td({ class: 'card-label' }, i18n.statsCreatedAt), td({ class: 'card-value' }, stats.createdAt)), + C(stats, 'karmaScore') > 0 + ? tr(td({ class: 'card-label' }, i18n.bankingUserEngagementScore), td({ class: 'card-value' }, String(C(stats, 'karmaScore')))) + : null, tr(td({ class: 'card-label' }, i18n.statsEcoWalletLabel), td({ class: 'card-value' }, a({ href: '/wallet', class: 'stats-link-break' }, stats?.banking?.myAddress || i18n.statsEcoWalletNotConfigured))), tr(td({ class: 'card-label' }, i18n.profileGpgChip || 'GPG'), td({ class: 'card-value' }, stats?.gpgFingerprint @@ -280,7 +270,27 @@ exports.statsView = (stats, filter) => { ) ); + const totalInhabitants = stats.usersKPIs?.totalInhabitants || stats.inhabitants || 0; + const networkKPIs = stats.networkKPIs || {}; + + const networkStrip = div({ class: 'stats-block' }, + h3({ class: 'stats-section-h' }, i18n.statsNetworkTitle || 'Network'), + kpiGrid( + kpi(i18n.statsUsersTitle, totalInhabitants), + kpi(i18n.statsTotalMsgs || 'Total messages', networkKPIs.totalMsgs || 0), + kpi(i18n.statsLogsTitle || 'Logs', stats?.logsCount || 0), + kpi(i18n.statsAITraining, C(stats, 'aiExchange') || 0), + kpi(i18n.statsPUBs, stats.pubsCount || 0) + ) + ); + + const carbonCard = div({ id: 'carbon', class: 'stats-card' }, + h3({ class: 'stats-section-h' }, i18n.statsCarbonFootprintTitle || 'Carbon Footprint'), + carbonChart + ); + const networkBlock = div({ class: 'stats-block' }, + h3({ class: 'stats-section-h' }, i18n.statsAveragesTitle || 'Averages'), kpiGrid( filter === 'MINE' ? kpi(i18n.statsMyShare || 'Your share of the network', `${fmtNum(networkKPIs.myShare || 0)}%`) @@ -454,6 +464,7 @@ exports.statsView = (stats, filter) => { } return div({ class: 'stats-container' }, [ div({ class: 'stats-block' }, + h3({ class: 'stats-section-h' }, i18n.TOMBSTONEButton), kpiGrid( kpi(i18n.TOMBSTONEButton, userTomb), kpi(i18n.statsTombstoneRatio, `${(stats.tombstoneKPIs?.ratio || 0).toFixed(2)}%`) @@ -466,6 +477,7 @@ exports.statsView = (stats, filter) => { const ets = stats.ecoTaxStats || null; const userTax = Number(stats.userEcoinTax || 0); const ecoTaxBlock = ets ? div({ class: 'stats-card' }, + h3({ class: 'stats-section-h' }, i18n.statsEcoTaxTitle || 'ECO Tax'), table({ class: 'block-info-table' }, filter === 'MINE' ? tr(td({ class: 'card-label' }, i18n.bankTaxesUserAmount || 'Your ECO tax'), td({ class: 'card-value' }, `${userTax.toFixed(6)} ECO`)) @@ -489,18 +501,19 @@ exports.statsView = (stats, filter) => { modes.map(m => form({ method: 'GET', action: '/stats' }, input({ type: 'hidden', name: 'filter', value: m }), - button({ type: 'submit', class: filter === m ? 'filter-btn active' : 'filter-btn' }, i18n[m + 'Button']) + button({ type: 'submit', class: filter === m ? 'filter-btn active' : 'filter-btn' }, String(i18n[m + 'Button']).toUpperCase()) ) ) ), section( - topStrip, - headerCard, + filter === 'ALL' ? networkStrip : null, + filter === 'MINE' ? accountCard : null, + filter === 'ALL' ? storageCard : null, + tombMode, + carbonCard, filter !== 'TOMBSTONE' ? ecoTaxBlock : null, - bankingCard, allMode, - mineMode, - tombMode + mineMode ) ) ); diff --git a/src/views/transfer_view.js b/src/views/transfer_view.js index e3c3de5..9b1d02e 100644 --- a/src/views/transfer_view.js +++ b/src/views/transfer_view.js @@ -1,5 +1,6 @@ const { div, h2, p, section, button, form, a, input, br, span, label, select, option, progress, table, tr, td } = require("../server/node_modules/hyperaxe") -const { template, i18n, renderOpinionsVoting, userLink, renderStateChip, renderLifespanChip, renderEcoTax, renderSpreadButton, renderContentActions } = require("./main_views") +const { template, i18n, renderOpinionsVoting, renderEngagement, userLink, renderStateChip, renderLifespanChip, renderEcoTax, renderSpreadButton, renderContentActions } = require("./main_views") +const { renderCommentsSection: renderSharedCommentsSection } = require("./comments_view") const moment = require("../server/node_modules/moment") const { config } = require("../server/SSB_server.js") @@ -130,7 +131,7 @@ const renderUpdatedLabel = (createdAt, updatedAt) => { const updatedTs = updatedAt ? new Date(updatedAt).getTime() : NaN const showUpdated = Number.isFinite(updatedTs) && (!Number.isFinite(createdTs) || updatedTs !== createdTs) return showUpdated - ? span({ class: "votations-comment-date" }, ` | ${i18n.transfersUpdatedAt}: ${moment(updatedAt).format("YYYY-MM-DD HH:mm")}`) + ? span({ class: "votations-comment-date" }, ` | ${i18n.transfersUpdatedAt}: ${moment(updatedAt).format("YYYY/MM/DD HH:mm")}`) : null } @@ -174,7 +175,7 @@ const generateTransferCard = (transfer, filter, params = {}) => { div( { class: "card-header activity-card-header" }, span(), - renderContentActions(transfer.id, `/transfers/${encodeURIComponent(transfer.id)}`) + renderContentActions(transfer.id, `/transfers/${encodeURIComponent(transfer.id)}`, { spread: params.spreadMap && params.spreadMap.get(transfer.id) || null, author: transfer.from, favKind: 'transfers', isFavorite: transfer.isFavorite, reportTitle: transfer.concept }) ), div({ class: "card-section transfer-card-body" }, div({ class: "shop-title-row" }, @@ -184,24 +185,14 @@ const generateTransferCard = (transfer, filter, params = {}) => { ), chips.length ? div({ class: "card-chips-row" }, ...chips) : null, !isUbi && dl && dl.isValid() - ? p({ class: "card-date-highlight" }, dl.format("YYYY-MM-DD HH:mm")) + ? p({ class: "card-date-highlight" }, dl.format("YYYY/MM/DD HH:mm")) : null, cat !== "TRUST" - ? div({ class: "job-price-line card-salary" }, fmtAmountWithUnit(transfer)) + ? div({ class: "job-price-line card-salary transfer-amount-centered" }, fmtAmountWithUnit(transfer)) : null, div({ class: "tribe-card-members" }, span({ class: "tribe-members-count" }, `${i18n.transfersConfirmations}: ${confirmedCount}/${required}`) - ), - div( - { class: "card-comments-summary feed-opinions-section" }, - div( - { class: "comments-count" }, - span({ class: "card-label" }, (i18n.opinionsTitle || "Opinions") + ": "), - span({ class: "card-value" }, String(Object.values(transfer.opinions || {}).reduce((s, n) => s + (Number(n) || 0), 0))) - ), - renderOpinionsVoting('/transfers/opinions', transfer.id, transfer.opinions, returnTo, transfer.opinions_inhabitants) - ), - div({ class: "card-spread-centered" }, renderSpreadButton(transfer.id, params.spreadMap && params.spreadMap.get(transfer.id))) + ) ) ) } @@ -209,20 +200,7 @@ const generateTransferCard = (transfer, filter, params = {}) => { exports.transferView = async (transfers, filter, transferId, params = {}) => { const normalizedFilter = filter === "favs" ? "all" : (filter || "all") - const title = - normalizedFilter === "mine" ? i18n.transfersMineSectionTitle : - normalizedFilter === "ubi" ? i18n.transfersUBISectionTitle : - normalizedFilter === "pending" ? i18n.transfersPendingSectionTitle : - normalizedFilter === "top" ? i18n.transfersTopSectionTitle : - normalizedFilter === "unconfirmed" ? i18n.transfersUnconfirmedSectionTitle : - normalizedFilter === "closed" ? i18n.transfersClosedSectionTitle : - normalizedFilter === "discarded" ? i18n.transfersDiscardedSectionTitle : - normalizedFilter === "create" ? i18n.transfersCreateSectionTitle : - normalizedFilter === "edit" ? i18n.transfersUpdateSectionTitle : - normalizedFilter === "economic" ? (i18n.transfersEconomicSectionTitle || (i18n.transfersCategoryEconomic + " " + i18n.transfersTitle)) : - normalizedFilter === "time" ? (i18n.transfersTimeSectionTitle || (i18n.transfersCategoryTime + " " + i18n.transfersTitle)) : - normalizedFilter === "trust" ? (i18n.transfersTrustSectionTitle || (i18n.transfersCategoryTrust + " " + i18n.transfersTitle)) : - i18n.transfersAllSectionTitle + const title = i18n.transfersTitle const q = safeText(params.q || "") const minAmountRaw = params.minAmount ?? "" @@ -295,18 +273,18 @@ exports.transferView = async (transfers, filter, transferId, params = {}) => { input({ type: "hidden", name: "minAmount", value: String(minAmountRaw ?? "") }), input({ type: "hidden", name: "maxAmount", value: String(maxAmountRaw ?? "") }), input({ type: "hidden", name: "sort", value: sort }), - button({ type: "submit", name: "filter", value: "all", class: normalizedFilter === "all" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterAll), - button({ type: "submit", name: "filter", value: "mine", class: normalizedFilter === "mine" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterMine), - button({ type: "submit", name: "filter", value: "ubi", class: normalizedFilter === "ubi" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterUBI), + button({ type: "submit", name: "filter", value: "all", class: normalizedFilter === "all" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterAll).toUpperCase()), + button({ type: "submit", name: "filter", value: "mine", class: normalizedFilter === "mine" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterMine).toUpperCase()), + button({ type: "submit", name: "filter", value: "ubi", class: normalizedFilter === "ubi" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterUBI).toUpperCase()), button({ type: "submit", name: "filter", value: "economic", class: normalizedFilter === "economic" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterEconomic || (i18n.transfersCategoryEconomic || "ECONOMIC")), button({ type: "submit", name: "filter", value: "time", class: normalizedFilter === "time" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTime || (i18n.transfersCategoryTime || "TIME")), button({ type: "submit", name: "filter", value: "trust", class: normalizedFilter === "trust" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTrust || (i18n.transfersCategoryTrust || "TRUST")), - button({ type: "submit", name: "filter", value: "market", class: normalizedFilter === "market" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterMarket), - button({ type: "submit", name: "filter", value: "pending", class: normalizedFilter === "pending" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterPending), - button({ type: "submit", name: "filter", value: "unconfirmed", class: normalizedFilter === "unconfirmed" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterUnconfirmed), - button({ type: "submit", name: "filter", value: "closed", class: normalizedFilter === "closed" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterClosed), - button({ type: "submit", name: "filter", value: "discarded", class: normalizedFilter === "discarded" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterDiscarded), - button({ type: "submit", name: "filter", value: "top", class: normalizedFilter === "top" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTop), + button({ type: "submit", name: "filter", value: "market", class: normalizedFilter === "market" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterMarket).toUpperCase()), + button({ type: "submit", name: "filter", value: "pending", class: normalizedFilter === "pending" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterPending).toUpperCase()), + button({ type: "submit", name: "filter", value: "unconfirmed", class: normalizedFilter === "unconfirmed" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterUnconfirmed).toUpperCase()), + button({ type: "submit", name: "filter", value: "closed", class: normalizedFilter === "closed" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterClosed).toUpperCase()), + button({ type: "submit", name: "filter", value: "discarded", class: normalizedFilter === "discarded" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterDiscarded).toUpperCase()), + button({ type: "submit", name: "filter", value: "top", class: normalizedFilter === "top" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterTop).toUpperCase()), button({ type: "submit", name: "filter", value: "create", class: "create-button" }, i18n.transfersCreateButton) ) ) @@ -463,9 +441,14 @@ exports.singleTransferView = async (transfer, filter, params = {}) => { button({ type: "submit", class: "delete-btn" }, i18n.transfersDeleteButton) )) } - sideActions.push(form({ method: "GET", action: `/transfers/contract/${encodeURIComponent(transfer.id)}`, class: "transfer-contract-form" }, - button({ type: "submit", class: "filter-btn" }, i18n.transfersExportContract || 'Create Contract') - )) + const exportActions = div({ class: "doc-export-actions" }, + form({ method: "GET", action: `/transfers/contract/${encodeURIComponent(transfer.id)}`, class: "transfer-contract-form" }, + button({ type: "submit", class: "filter-btn" }, i18n.transfersExportContract) + ), + form({ method: "POST", action: `/transfers/${encodeURIComponent(transfer.id)}/share` }, + button({ type: "submit", class: "filter-btn" }, i18n.sharePm) + ) + ) const infoRows = [] const pushRow = (labelText, valueNode) => @@ -477,15 +460,24 @@ exports.singleTransferView = async (transfer, filter, params = {}) => { pushRow(i18n.transfersTo, userLink(transfer.to)) if (cat !== "TRUST") pushRow(i18n.transfersAmount, fmtAmountWithUnit(transfer)) pushRow(i18n.transfersCategory || "Category", categoryLabel(cat)) - if (!isUbi) pushRow(i18n.transfersDeadline, dl && dl.isValid() ? dl.format("YYYY-MM-DD HH:mm") : "") + if (!isUbi) pushRow(i18n.transfersDeadline, dl && dl.isValid() ? dl.format("YYYY/MM/DD HH:mm") : "") pushRow(i18n.transfersStatus, i18n[statusKey(transfer.status)] || String(transfer.status || "")) const transferSide = div({ class: "tribe-side" }, + div({ class: "card-header activity-card-header" }, + renderContentActions(transfer.id, null, { + spread: params.spreads || null, + author: transfer.from, + favKind: 'transfers', + isFavorite: transfer.isFavorite, + returnTo, + reportTitle: transfer.concept + }) + ), div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, transfer.concept || i18n.transfersTitle) ), chips.length ? div({ class: "card-chips-row" }, ...chips) : null, - div({ class: "card-spread-centered" }, renderSpreadButton(transfer.id, params.spreads)), tagsNode, div({ class: "tribe-card-members" }, span({ class: "tribe-members-count" }, `${i18n.transfersConfirmations}: ${confirmedCount}/${required}`) @@ -496,50 +488,42 @@ exports.singleTransferView = async (transfer, filter, params = {}) => { span({ class: "card-value" }, a({ class: "user-link", href: `/blockexplorer/block/${encodeURIComponent(params.block.id)}` }, params.block.id)) ) : null, - sideActions.length ? div({ class: "tribe-side-actions" }, ...sideActions) : null + sideActions.length ? div({ class: "tribe-side-actions" }, ...sideActions) : null, + exportActions ) + const confirmedList = Array.isArray(transfer.confirmedBy) ? transfer.confirmedBy.filter(Boolean) : [] + const transferMain = div({ class: "tribe-main" }, div({ class: "job-section" }, - div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersFrom}: `), - span({ class: "card-value" }, userLink(transfer.from)) - ), - div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersTo}: `), - span({ class: "card-value" }, userLink(transfer.to)) - ), - cat !== "TRUST" ? div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersAmount}: `), - span({ class: "card-value card-salary" }, fmtAmountWithUnit(transfer)) - ) : null, - div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersCategory || "Category"}: `), - span({ class: "card-value" }, categoryLabel(cat)) - ), - div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersConcept}: `), - span({ class: "card-value" }, transfer.concept || "") - ), - !isUbi && dl && dl.isValid() ? div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersDeadline}: `), - span({ class: "card-value" }, dl.format("YYYY-MM-DD HH:mm")) - ) : null, - div({ class: "card-field" }, - span({ class: "card-label" }, `${i18n.transfersStatus}: `), - span({ class: "card-value" }, i18n[statusKey(transfer.status)] || String(transfer.status || "")) - ) + h2({ class: "job-section-title" }, i18n.transfersConcept), + p({ class: "tribe-side-description" }, transfer.concept || "") + ), + div({ class: "job-section" }, + h2({ class: "job-section-title" }, i18n.transfersConfirmations), + p({ class: "tribe-side-description" }, `${confirmedCount}/${required}`), + confirmedList.length + ? div({ class: "card-assigned-list" }, ...confirmedList.map(id => userLink(id))) + : null ), p({ class: "card-footer" }, - span({ class: "date-link" }, `${moment(transfer.createdAt).format("YYYY-MM-DD HH:mm")} ${i18n.performed} `), + span({ class: "date-link" }, `${moment(transfer.createdAt).format("YYYY/MM/DD HH:mm")} ${i18n.performed} `), userLink(transfer.from), renderUpdatedLabel(transfer.createdAt, transfer.updatedAt) ), - renderOpinionsVoting('/transfers/opinions', transfer.id, transfer.opinions, returnTo, transfer.opinions_inhabitants) + renderEngagement(transfer.id, + renderOpinionsVoting('/transfers/opinions', transfer.id, transfer.opinions, returnTo, transfer.opinions_inhabitants), + renderSharedCommentsSection({ + action: `/transfers/${encodeURIComponent(transfer.id)}/comments`, + comments: params.comments || [], + returnTo + }) + ) ) return template( transfer.concept, + section(div({ class: "tags-header" }, h2(i18n.transfersTitle), p(i18n.transfersDescription))), section( div( { class: "filters" }, @@ -549,18 +533,18 @@ exports.singleTransferView = async (transfer, filter, params = {}) => { input({ type: "hidden", name: "minAmount", value: String(params.minAmount ?? "") }), input({ type: "hidden", name: "maxAmount", value: String(params.maxAmount ?? "") }), input({ type: "hidden", name: "sort", value: sort }), - button({ type: "submit", name: "filter", value: "all", class: normalizedFilter === "all" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterAll), - button({ type: "submit", name: "filter", value: "mine", class: normalizedFilter === "mine" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterMine), - button({ type: "submit", name: "filter", value: "ubi", class: normalizedFilter === "ubi" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterUBI), + button({ type: "submit", name: "filter", value: "all", class: normalizedFilter === "all" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterAll).toUpperCase()), + button({ type: "submit", name: "filter", value: "mine", class: normalizedFilter === "mine" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterMine).toUpperCase()), + button({ type: "submit", name: "filter", value: "ubi", class: normalizedFilter === "ubi" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterUBI).toUpperCase()), button({ type: "submit", name: "filter", value: "economic", class: normalizedFilter === "economic" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterEconomic || (i18n.transfersCategoryEconomic || "ECONOMIC")), button({ type: "submit", name: "filter", value: "time", class: normalizedFilter === "time" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTime || (i18n.transfersCategoryTime || "TIME")), button({ type: "submit", name: "filter", value: "trust", class: normalizedFilter === "trust" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTrust || (i18n.transfersCategoryTrust || "TRUST")), - button({ type: "submit", name: "filter", value: "market", class: normalizedFilter === "market" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterMarket), - button({ type: "submit", name: "filter", value: "pending", class: normalizedFilter === "pending" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterPending), - button({ type: "submit", name: "filter", value: "unconfirmed", class: normalizedFilter === "unconfirmed" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterUnconfirmed), - button({ type: "submit", name: "filter", value: "closed", class: normalizedFilter === "closed" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterClosed), - button({ type: "submit", name: "filter", value: "discarded", class: normalizedFilter === "discarded" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterDiscarded), - button({ type: "submit", name: "filter", value: "top", class: normalizedFilter === "top" ? "filter-btn active" : "filter-btn" }, i18n.transfersFilterTop), + button({ type: "submit", name: "filter", value: "market", class: normalizedFilter === "market" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterMarket).toUpperCase()), + button({ type: "submit", name: "filter", value: "pending", class: normalizedFilter === "pending" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterPending).toUpperCase()), + button({ type: "submit", name: "filter", value: "unconfirmed", class: normalizedFilter === "unconfirmed" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterUnconfirmed).toUpperCase()), + button({ type: "submit", name: "filter", value: "closed", class: normalizedFilter === "closed" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterClosed).toUpperCase()), + button({ type: "submit", name: "filter", value: "discarded", class: normalizedFilter === "discarded" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterDiscarded).toUpperCase()), + button({ type: "submit", name: "filter", value: "top", class: normalizedFilter === "top" ? "filter-btn active" : "filter-btn" }, String(i18n.transfersFilterTop).toUpperCase()), button({ type: "submit", name: "filter", value: "create", class: "create-button" }, i18n.transfersCreateButton) ) ), diff --git a/src/views/tribes_view.js b/src/views/tribes_view.js index 9203217..bfb197b 100644 --- a/src/views/tribes_view.js +++ b/src/views/tribes_view.js @@ -2,6 +2,7 @@ const { div, h2, h3, p, section, button, form, a, input, img, label, select, opt const moment = require("../server/node_modules/moment"); const { template, i18n, userLink, renderStateChip, renderPrivacyChip, renderLifespanChip, renderModeChip, renderInviteQrCard, renderContentActions } = require('./main_views'); const { renderEncryptedChip: renderTribeEncryptedChip } = require('./clearnet_view'); +const { renderResults: renderPollResults, renderBallot: renderPollBallot } = require('./polls_view'); const { config } = require('../server/SSB_server.js'); const { renderUrl } = require('../backend/renderUrl'); const { renderMapLocationUrl, renderMapLocationGrid, renderMapLocationVisitLabel } = require("./maps_view"); @@ -166,25 +167,17 @@ exports.tribesView = async (tribes, filter, tribeId, query = {}, allTribes = nul return cb - ca; }); - const title = - filter === 'recent' ? i18n.tribeRecentSectionTitle : - filter === 'mine' ? i18n.tribeMineSectionTitle : - filter === 'create' ? i18n.tribeCreateSectionTitle : - filter === 'edit' ? i18n.tribeUpdateSectionTitle : - filter === 'gallery' ? i18n.tribeGallerySectionTitle : - filter === 'top' ? i18n.tribeTopSectionTitle : - filter === 'subtribes' ? (i18n.tribeSubTribes || 'SUB-TRIBES') : - i18n.tribeAllSectionTitle; + const title = i18n.tribesTitle; const header = div({ class: 'tags-header' }, h2(title), p(i18n.tribeDescription)); const filters = div({ class: 'filters' }, - form({ method: 'GET', action: '/tribes' }, + form({ method: 'GET', action: '/tribes', class: 'filter-box' }, input({ type: 'hidden', name: 'filter', value: filter }), - input({ type: 'text', name: 'search', placeholder: i18n.searchTribesPlaceholder, value: query.search || '' }), - br(), - button({ type: 'submit' }, i18n.applyFilters), - br() + input({ type: 'text', name: 'search', placeholder: i18n.searchTribesPlaceholder, value: query.search || '', class: 'filter-box__input' }), + div({ class: 'filter-box__controls' }, + button({ type: 'submit', class: 'filter-box__button' }, i18n.searchButton) + ) ) ); @@ -214,7 +207,7 @@ exports.tribesView = async (tribes, filter, tribeId, query = {}, allTribes = nul }, label({ for: 'title' }, i18n.tribeTitleLabel), br, - input({ type: 'text', name: 'title', id: 'title', required: true, placeholder: i18n.tribeTitlePlaceholder, value: tribeToEdit.title || '' }), + input({ type: 'text', name: 'title', maxlength: '100', id: 'title', required: true, placeholder: i18n.tribeTitlePlaceholder, value: tribeToEdit.title || '' }), br(), label({ for: 'description' }, i18n.tribeDescriptionLabel), br, @@ -265,7 +258,7 @@ exports.tribesView = async (tribes, filter, tribeId, query = {}, allTribes = nul return div({ class: 'trending-card tribes-card' + (isOwn ? ' own-content' : '') }, div({ class: 'card-header activity-card-header' }, span(), - renderContentActions(t.id, `/tribe/${encodeURIComponent(t.id)}`) + renderContentActions(t.id, `/tribe/${encodeURIComponent(t.id)}`, { author: t.author, reportTitle: t.title }) ), div({ class: 'card-section tribes-card-body' }, div({ class: 'tribe-card-image-wrapper' }, @@ -358,7 +351,7 @@ const renderFeedTribeView = async (feedItems, tribe, query = {}, filter) => { form({ method: 'GET', action: `/tribe/${encodeURIComponent(tribe.id)}` }, input({ type: 'hidden', name: 'section', value: 'feed' }), input({ type: 'hidden', name: 'feedFilter', value: f }), - button({ type: 'submit', class: feedFilter === f ? 'filter-btn active' : 'filter-btn' }, i18n[`tribeFeedFilter${f}`]) + button({ type: 'submit', class: feedFilter === f ? 'filter-btn active' : 'filter-btn' }, String(i18n[`tribeFeedFilter${f}`]).toUpperCase()) ) ) ), @@ -399,7 +392,7 @@ const renderSectionNav = (tribe, section) => { if (!tribe.parentTribeId) firstGroup.push({ key: 'governance', label: i18n.tribeSectionGovernance || 'GOVERNANCE' }); const sections = [ { items: firstGroup }, - { items: [{ key: 'votations', label: i18n.tribeSectionVotations }, { key: 'events', label: i18n.tribeSectionEvents }, { key: 'tasks', label: i18n.tribeSectionTasks }] }, + { items: [{ key: 'votations', label: i18n.tribeSectionVotations }, { key: 'polls', label: i18n.pollsTitle }, { key: 'events', label: i18n.tribeSectionEvents }, { key: 'tasks', label: i18n.tribeSectionTasks }] }, { items: [{ key: 'feed', label: i18n.tribeSectionFeed }, { key: 'forum', label: i18n.tribeSectionForum }, { key: 'maps', label: i18n.tribeSectionMaps || 'MAPS' }, { key: 'torrents', label: i18n.tribeSectionTorrents || 'TORRENTS' }, { key: 'pads', label: i18n.tribeSectionPads || 'PADS' }, { key: 'chats', label: i18n.tribeSectionChats || 'CHATS' }, { key: 'calendars', label: i18n.tribeSectionCalendars || 'CALENDARS' }] }, { items: [{ key: 'images', label: i18n.tribeSectionImages || 'IMAGES' }, { key: 'audios', label: i18n.tribeSectionAudios || 'AUDIOS' }, { key: 'videos', label: i18n.tribeSectionVideos || 'VIDEOS' }, { key: 'documents', label: i18n.tribeSectionDocuments || 'DOCUMENTS' }, { key: 'bookmarks', label: i18n.tribeSectionBookmarks || 'BOOKMARKS' }] }, { items: [{ key: 'tags', label: i18n.tribeSectionTags || 'TAGS' }, { key: 'search', label: i18n.tribeSectionSearch }] }, @@ -476,12 +469,12 @@ const contentTypeVerb = (ct) => { }; const contentTypeName = (ct) => { - const map = { event: i18n.tribeSectionEvents, task: i18n.tribeSectionTasks, votation: i18n.tribeSectionVotations, forum: i18n.tribeSectionForum, 'forum-reply': i18n.tribeSectionForum, media: i18n.tribeSectionMedia, feed: i18n.tribeSectionFeed, pad: i18n.tribeSectionPads || 'PADS', chat: i18n.tribeSectionChats || 'CHATS', calendar: i18n.tribeSectionCalendars || 'CALENDARS', map: i18n.tribeSectionMaps || 'MAPS' }; + const map = { event: i18n.tribeSectionEvents, task: i18n.tribeSectionTasks, votation: i18n.tribeSectionVotations, poll: i18n.pollsTitle, forum: i18n.tribeSectionForum, 'forum-reply': i18n.tribeSectionForum, media: i18n.tribeSectionMedia, feed: i18n.tribeSectionFeed, pad: i18n.tribeSectionPads || 'PADS', chat: i18n.tribeSectionChats || 'CHATS', calendar: i18n.tribeSectionCalendars || 'CALENDARS', map: i18n.tribeSectionMaps || 'MAPS' }; return map[ct] || ct; }; const activitySectionMap = { - event: 'events', task: 'tasks', votation: 'votations', + event: 'events', task: 'tasks', votation: 'votations', poll: 'polls', forum: 'forum', 'forum-reply': 'forum', feed: 'feed', pad: 'pads', chat: 'chats', calendar: 'calendars', map: 'maps', torrent: 'torrents' @@ -522,7 +515,7 @@ const renderTribeActivitySection = (tribe, sectionData) => { item.title ? div({ class: 'card-field' }, span({ class: 'card-value' }, item.title)) : null, item.description ? p(String(item.description).substring(0, 200)) : null, replies.map(r => div({ class: 'thread-reply-item' }, - r.text ? p({ class: 'post-text', style: 'white-space:pre-wrap;' }, String(r.text)) : null, + r.text ? p({ class: 'post-text post-text-pre' }, String(r.text)) : null, div({ class: 'card-footer thread-reply-footer' }, span({ class: 'date-link' }, r.createdAt ? new Date(r.createdAt).toLocaleString() : ''), userLink(r.author, '') @@ -910,6 +903,72 @@ const renderTasksSection = (tribe, items, query) => { ); }; +const renderTribePollsSection = (tribe, items, query) => { + const polls = Array.isArray(items) ? items : []; + const tribeUrl = `/tribe/${encodeURIComponent(tribe.id)}`; + if (query.action === 'create') { + return div({ class: 'create-tribe-form' }, + form({ method: 'POST', action: `${tribeUrl}/polls/create` }, + label(i18n.pollQuestion), br, + input({ type: 'text', name: 'question', required: true, maxlength: '300', placeholder: i18n.pollQuestionPlaceholder }), br(), + label(i18n.pollOptions), br, + textarea({ name: 'options', rows: 5, required: true, placeholder: i18n.pollOptionsPlaceholder }, ''), br(), + div({ class: 'poll-switch' }, + input({ type: 'hidden', name: 'anonymous', value: '0' }), + label(input({ type: 'checkbox', name: 'anonymous', value: '1' }), ' ', i18n.pollAnonymousLabel) + ), + div({ class: 'poll-switch' }, + input({ type: 'hidden', name: 'multiple', value: '0' }), + label(input({ type: 'checkbox', name: 'multiple', value: '1' }), ' ', i18n.pollMultipleLabel) + ), + button({ type: 'submit', class: 'create-button' }, i18n.pollPublishButton) + ) + ); + } + const returnTo = `${tribeUrl}?section=polls`; + return div({ class: 'tribe-content-list' }, + div({ class: 'tribe-content-header' }, + h2(i18n.pollsTitle), + form({ method: 'GET', action: tribeUrl }, + input({ type: 'hidden', name: 'section', value: 'polls' }), + input({ type: 'hidden', name: 'action', value: 'create' }), + button({ type: 'submit', class: 'create-button' }, i18n.pollCreateButton) + ) + ), + polls.length === 0 ? p(i18n.pollsNoItems) : + polls.map(poll => div({ class: 'tribe-content-card poll-card' }, + h2(poll.undecryptable ? i18n.contentAccessDenied : poll.question), + poll.undecryptable ? null : div({ class: 'card-chips-row' }, + statusBadge(poll.status), + poll.anonymous ? span({ class: 'chat-poll-tag' }, i18n.pollAnonymous) : null, + poll.multiple ? span({ class: 'chat-poll-tag' }, i18n.pollMultiple) : null + ), + poll.undecryptable ? null : (poll.hasVoted || poll.status === 'CLOSED' ? renderPollResults(poll) : null), + poll.undecryptable ? null : renderPollBallot(poll, returnTo, '/polls'), + poll.undecryptable ? null : div({ class: 'card-field' }, + span({ class: 'card-label' }, `${i18n.pollVoters}: `), + span({ class: 'card-value' }, String(poll.totalVoters)) + ), + div({ class: 'card-field' }, + span({ class: 'card-label' }, i18n.createdBy + ': '), + userLink(poll.author) + ), + poll.author === userId && poll.status === 'OPEN' + ? form({ method: 'POST', action: `/polls/close/${encodeURIComponent(poll.id)}` }, + input({ type: 'hidden', name: 'returnTo', value: returnTo }), + button({ type: 'submit', class: 'filter-btn' }, i18n.pollCloseButton) + ) + : null, + poll.author === userId + ? form({ method: 'POST', action: `/polls/delete/${encodeURIComponent(poll.id)}` }, + input({ type: 'hidden', name: 'returnTo', value: returnTo }), + button({ type: 'submit', class: 'filter-btn danger-btn' }, i18n.pollDeleteButton) + ) + : null + )) + ); +}; + const renderVotationsSection = (tribe, items, query) => { const votations = Array.isArray(items) ? items : []; const action = query.action; @@ -918,7 +977,7 @@ const renderVotationsSection = (tribe, items, query) => { return div({ class: 'create-tribe-form' }, form({ method: 'POST', action: `/tribe/${encodeURIComponent(tribe.id)}/votations/create` }, label({ for: 'title' }, i18n.tribeVotationTitle), br, - input({ type: 'text', name: 'title', id: 'title', required: true, placeholder: i18n.tribeVotationTitle }), br(), + input({ type: 'text', name: 'title', maxlength: '100', id: 'title', required: true, placeholder: i18n.tribeVotationTitle }), br(), label({ for: 'description' }, i18n.tribeVotationDescription), br, textarea({ name: 'description', id: 'description', rows: 3, placeholder: i18n.tribeVotationDescription }, ''), br(), label({ for: 'deadline' }, i18n.tribeVotationDeadline), br, @@ -1128,12 +1187,7 @@ const renderForumSection = (tribe, items, query) => { t.description ? div({ class: 'forum-body' }, ...renderUrl((t.description || '').substring(0, 200))) : null, div({ class: 'forum-meta' }, span({ class: 'forum-positive-votes' }, `▲: ${t.refeeds || 0}`), - span({ class: 'forum-messages' }, `${(i18n.forumMessages || i18n.tribeForumReplies || 'MESSAGES').toUpperCase()}: ${replyCount}`), - form({ method: 'GET', action: tribeUrl, class: 'visit-forum-form' }, - input({ type: 'hidden', name: 'section', value: 'forum' }), - input({ type: 'hidden', name: 'thread', value: t.id }), - button({ type: 'submit', class: 'filter-btn' }, i18n.forumVisitButton || 'VISIT') - ) + span({ class: 'forum-messages' }, `${(i18n.forumMessages || i18n.tribeForumReplies || 'MESSAGES').toUpperCase()}: ${replyCount}`) ), div({ class: 'forum-footer' }, span({ class: 'date-link' }, `${new Date(t.createdAt).toLocaleString()} ${i18n.performed || ''}`), @@ -1182,7 +1236,7 @@ const renderTribeMediaTypeSection = (tribe, items, query, mediaType) => { input({ type: 'hidden', name: 'mediaType', value: 'bookmark' }), input({ type: 'hidden', name: 'returnSection', value: sectionKey }), label({ for: 'title' }, i18n.tribeMediaTitle), br, - input({ type: 'text', name: 'title', id: 'title', required: true, placeholder: i18n.tribeMediaTitle }), br(), + input({ type: 'text', name: 'title', maxlength: '100', id: 'title', required: true, placeholder: i18n.tribeMediaTitle }), br(), label({ for: 'url' }, i18n.bookmarkUrlLabel || 'URL'), br, input({ type: 'url', name: 'url', id: 'url', required: true, placeholder: 'https://' }), br(),br(), label({ for: 'description' }, i18n.tribeMediaDescription), br, @@ -1196,7 +1250,7 @@ const renderTribeMediaTypeSection = (tribe, items, query, mediaType) => { input({ type: 'hidden', name: 'mediaType', value: mediaType }), input({ type: 'hidden', name: 'returnSection', value: sectionKey }), label({ for: 'title' }, i18n.tribeMediaTitle), br, - input({ type: 'text', name: 'title', id: 'title', required: true, placeholder: i18n.tribeMediaTitle }), br(), + input({ type: 'text', name: 'title', maxlength: '100', id: 'title', required: true, placeholder: i18n.tribeMediaTitle }), br(), label({ for: 'description' }, i18n.tribeMediaDescription), br, textarea({ name: 'description', id: 'description', rows: 3, placeholder: i18n.tribeMediaDescription }, ''), br(), label({ for: 'media' }, i18n.tribeMediaUpload), br, @@ -1542,6 +1596,7 @@ exports.tribeView = async (tribe, userIdParam, query, section, sectionData) => { case 'events': sectionContent = renderEventsSection(tribe, sectionData, query); break; case 'tasks': sectionContent = renderTasksSection(tribe, sectionData, query); break; case 'votations': sectionContent = renderVotationsSection(tribe, sectionData, query); break; + case 'polls': sectionContent = renderTribePollsSection(tribe, sectionData, query); break; case 'forum': sectionContent = renderForumSection(tribe, sectionData, query); break; case 'subtribes': sectionContent = renderSubTribesSection(tribe, sectionData, query); break; case 'search': sectionContent = renderTribeSearchSection(tribe, sectionData, query); break; @@ -1636,6 +1691,15 @@ exports.tribeView = async (tribe, userIdParam, query, section, sectionData) => { ? a({ class: 'tribe-action-btn', href: inviteHref }, i18n.tribeEnterInvite) : null ) : null, + (isLarpHouse && larpHouseKey === 'academia' && isOutsider) + ? div({ class: 'tribe-side-actions' }, + form({ method: 'POST', action: '/larp/join' }, + input({ type: 'hidden', name: 'house', value: 'academia' }), + input({ type: 'hidden', name: 'returnTo', value: `/tribe/${encodeURIComponent(tribe.id)}` }), + button({ type: 'submit', class: 'tribe-action-btn' }, i18n.larpInviteRedeem || 'Join House') + ) + ) + : null, (hasOpenInvite && canManageOpenInvite) ? div({ class: 'tribe-open-invite-panel' }, div({ class: 'tribe-open-invite' }, span({ class: 'tribe-members-count' }, i18n.tribeInviteCodeText), @@ -1868,7 +1932,7 @@ const rulesBlock = (tribe, rules, isCreator) => div({}, h3(i18n.tribeGovernanceAddRule || 'Add rule'), form({ method: 'POST', action: `/tribe/${encodeURIComponent(tribe.id)}/governance/rule/add` }, label({}, i18n.tribeGovRuleTitle || 'Title'), br(), - input({ type: 'text', name: 'title', required: true }), br(), br(), + input({ type: 'text', name: 'title', maxlength: '100', required: true }), br(), br(), label({}, i18n.tribeGovRuleBody || 'Body'), br(), textarea({ name: 'body', rows: 4 }), br(), br(), button({ type: 'submit', class: 'create-button' }, i18n.save || 'Save') diff --git a/src/views/welcome_view.js b/src/views/welcome_view.js index 618e357..8b573cd 100644 --- a/src/views/welcome_view.js +++ b/src/views/welcome_view.js @@ -93,6 +93,32 @@ const stepContent = (key, lang, profile) => { ) ) } + if (key === "ux") { + let cfg = {} + try { cfg = require("../configs/config-manager.js").getConfig() || {} } catch (_) {} + const cur = cfg.ux?.current === "ainav" ? "ainav" : cfg.ux?.current === "chats" ? "chats" : "blocks" + const chatsOn = cfg.modules?.chatsMod === "on" + const aiOn = cfg.modules?.aiNavMod === "on" + const uxCard = (value, title, image) => label({ class: "welcome-ux-option" }, + input({ type: "radio", name: "ux", value, ...(value === "blocks" ? { checked: true } : {}) }), + img({ src: image, class: "welcome-ux-shot", alt: title }), + span({ class: "welcome-ux-label" }, title) + ) + return { + title: i18n.welcomeStepUxTitle || "Choose your interface", + text: i18n.welcomeStepUxText || "Pick how Oasis should look. You can change it later in Settings.", + action: form({ method: "POST", action: "/welcome/ux", class: "welcome-ux-form" }, + div({ class: "welcome-ux-grid" }, + uxCard("blocks", i18n.uxModeMenus || "Blocks", "/assets/images/ux-blocks.png"), + chatsOn ? uxCard("chats", i18n.chatsTitle || "Chats", "/assets/images/ux-chats.png") : null, + aiOn ? uxCard("ainav", i18n.uxModeAINav || "AI", "/assets/images/ux-ainav.png") : null + ), + div({ class: "welcome-action" }, + button({ type: "submit", class: "filter-btn" }, i18n.welcomeStepUxAction || "Use this view") + ) + ) + } + } if (key === "backup") return { title: i18n.welcomeStepBackupTitle || "Backup your ID", text: i18n.welcomeStepBackupText || "Your identity is a key file on this device.",